Merge "MediaPlayer: add notifyAt for TimeProvider"
diff --git a/Android.bp b/Android.bp
index 33acffa..43fb48a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -40,8 +40,10 @@
// needed by the device.
srcs: [
"core/proto/android/os/kernelwake.proto",
+ "core/proto/android/os/pagetypeinfo.proto",
"core/proto/android/os/procrank.proto",
"core/proto/android/service/graphicsstats.proto",
+ "libs/incident/proto/android/privacy.proto",
],
shared: {
enabled: false,
diff --git a/Android.mk b/Android.mk
index 46fa0d6..0e24399 100644
--- a/Android.mk
+++ b/Android.mk
@@ -305,6 +305,7 @@
core/java/android/service/notification/IStatusBarNotificationHolder.aidl \
core/java/android/service/notification/IConditionListener.aidl \
core/java/android/service/notification/IConditionProvider.aidl \
+ core/java/android/service/settings/suggestions/ISuggestionService.aidl \
core/java/android/service/vr/IPersistentVrStateCallbacks.aidl \
core/java/android/service/vr/IVrListener.aidl \
core/java/android/service/vr/IVrManager.aidl \
@@ -503,9 +504,9 @@
telecomm/java/com/android/internal/telecom/IInCallService.aidl \
telecomm/java/com/android/internal/telecom/ITelecomService.aidl \
telecomm/java/com/android/internal/telecom/RemoteServiceCallback.aidl \
- telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl \
- telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl \
- telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl \
+ telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl \
+ telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl \
+ telephony/java/android/telephony/mbms/IDownloadStateCallback.aidl \
telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl \
telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl \
telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl \
@@ -566,6 +567,8 @@
LOCAL_SRC_FILES += \
../../system/netd/server/binder/android/net/INetd.aidl \
+ ../../system/vold/binder/android/os/IVold.aidl \
+ ../../system/vold/binder/android/os/IVoldListener.aidl \
../native/cmds/installd/binder/android/os/IInstalld.aidl \
LOCAL_AIDL_INCLUDES += system/update_engine/binder_bindings
@@ -590,6 +593,7 @@
frameworks/av/media/libaudioclient/aidl \
frameworks/native/aidl/gui \
system/netd/server/binder \
+ system/vold/binder \
system/bt/binder
LOCAL_INTERMEDIATE_SOURCES := \
@@ -1582,6 +1586,20 @@
$(call all-proto-files-under, libs/incident/proto)
include $(BUILD_HOST_JAVA_LIBRARY)
+# ==== java proto device library (for test only) ==============================
+include $(CLEAR_VARS)
+LOCAL_MODULE := platformprotosnano
+LOCAL_MODULE_TAGS := tests optional
+LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+LOCAL_PROTOC_FLAGS := \
+ -Iexternal/protobuf/src
+LOCAL_PROTO_JAVA_OUTPUT_PARAMS := \
+ store_unknown_fields = true
+LOCAL_JAVA_LIBRARIES := core-oj core-libart
+LOCAL_SRC_FILES := \
+ $(call all-proto-files-under, core/proto)
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
# Include subdirectory makefiles
# ============================================================
diff --git a/api/current.txt b/api/current.txt
index 4c88231..d7e1a7a 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -37193,6 +37193,7 @@
public final class SaveRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.List<java.lang.String> getDatasetIds();
method public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
@@ -39523,6 +39524,7 @@
method public boolean isInManagedCall();
method public boolean isIncomingCallPermitted(android.telecom.PhoneAccountHandle);
method public boolean isOutgoingCallPermitted(android.telecom.PhoneAccountHandle);
+ method public boolean isTtySupported();
method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String);
method public void placeCall(android.net.Uri, android.os.Bundle);
method public void registerPhoneAccount(android.telecom.PhoneAccount);
@@ -39927,13 +39929,42 @@
field public static final int STATUS_UNKNOWN_ERROR = 4; // 0x4
}
- public class MbmsStreamingManager {
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback, int, android.os.Handler) throws android.telephony.mbms.MbmsException;
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback, android.os.Handler) throws android.telephony.mbms.MbmsException;
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback) throws android.telephony.mbms.MbmsException;
- method public void dispose();
- method public void getStreamingServices(java.util.List<java.lang.String>) throws android.telephony.mbms.MbmsException;
- method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler) throws android.telephony.mbms.MbmsException;
+ public class MbmsDownloadSession implements java.lang.AutoCloseable {
+ method public void cancelDownload(android.telephony.mbms.DownloadRequest);
+ method public void close();
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, android.os.Handler);
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, int, android.os.Handler);
+ method public void download(android.telephony.mbms.DownloadRequest);
+ method public int getDownloadStatus(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo);
+ method public java.io.File getTempFileRootDirectory();
+ method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads();
+ method public void registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback, android.os.Handler);
+ method public void requestUpdateFileServices(java.util.List<java.lang.String>);
+ method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest);
+ method public void setTempFileRootDirectory(java.io.File);
+ method public void unregisterStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback);
+ field public static final java.lang.String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
+ field public static final java.lang.String EXTRA_MBMS_COMPLETED_FILE_URI = "android.telephony.extra.MBMS_COMPLETED_FILE_URI";
+ field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_REQUEST = "android.telephony.extra.MBMS_DOWNLOAD_REQUEST";
+ field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_RESULT = "android.telephony.extra.MBMS_DOWNLOAD_RESULT";
+ field public static final java.lang.String EXTRA_MBMS_FILE_INFO = "android.telephony.extra.MBMS_FILE_INFO";
+ field public static final int RESULT_CANCELLED = 2; // 0x2
+ field public static final int RESULT_EXPIRED = 3; // 0x3
+ field public static final int RESULT_IO_ERROR = 4; // 0x4
+ field public static final int RESULT_SUCCESSFUL = 1; // 0x1
+ field public static final int STATUS_ACTIVELY_DOWNLOADING = 1; // 0x1
+ field public static final int STATUS_PENDING_DOWNLOAD = 2; // 0x2
+ field public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4; // 0x4
+ field public static final int STATUS_PENDING_REPAIR = 3; // 0x3
+ field public static final int STATUS_UNKNOWN = 0; // 0x0
+ }
+
+ public class MbmsStreamingSession implements java.lang.AutoCloseable {
+ method public void close();
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, int, android.os.Handler);
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, android.os.Handler);
+ method public void requestUpdateStreamingServices(java.util.List<java.lang.String>);
+ method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler);
}
public class NeighboringCellInfo implements android.os.Parcelable {
@@ -40288,6 +40319,7 @@
method public int getPhoneCount();
method public int getPhoneType();
method public android.telephony.ServiceState getServiceState();
+ method public android.telephony.SignalStrength getSignalStrength();
method public java.lang.String getSimCountryIso();
method public java.lang.String getSimOperator();
method public java.lang.String getSimOperatorName();
@@ -40313,7 +40345,7 @@
method public boolean isHearingAidCompatibilitySupported();
method public boolean isNetworkRoaming();
method public boolean isSmsCapable();
- method public boolean isTtyModeSupported();
+ method public deprecated boolean isTtyModeSupported();
method public boolean isVoiceCapable();
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
method public boolean isWorldPhone();
@@ -40567,15 +40599,73 @@
package android.telephony.mbms {
- public class MbmsException extends java.lang.Exception {
- method public int getErrorCode();
+ public final class DownloadRequest implements android.os.Parcelable {
+ method public static android.telephony.mbms.DownloadRequest copy(android.telephony.mbms.DownloadRequest);
+ method public int describeContents();
+ method public java.lang.String getFileServiceId();
+ method public static int getMaxAppIntentSize();
+ method public static int getMaxDestinationUriSize();
+ method public android.net.Uri getSourceUri();
+ method public int getSubscriptionId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.DownloadRequest> CREATOR;
+ }
+
+ public static class DownloadRequest.Builder {
+ ctor public DownloadRequest.Builder();
+ method public android.telephony.mbms.DownloadRequest build();
+ method public android.telephony.mbms.DownloadRequest.Builder setAppIntent(android.content.Intent);
+ method public android.telephony.mbms.DownloadRequest.Builder setServiceInfo(android.telephony.mbms.FileServiceInfo);
+ method public android.telephony.mbms.DownloadRequest.Builder setSource(android.net.Uri);
+ method public android.telephony.mbms.DownloadRequest.Builder setSubscriptionId(int);
+ }
+
+ public class DownloadStateCallback {
+ ctor public DownloadStateCallback();
+ method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int);
+ method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int);
+ }
+
+ public final class FileInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.lang.String getMimeType();
+ method public android.net.Uri getUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.FileInfo> CREATOR;
+ }
+
+ public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.util.List<android.telephony.mbms.FileInfo> getFiles();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.FileServiceInfo> CREATOR;
+ }
+
+ public class MbmsDownloadReceiver extends android.content.BroadcastReceiver {
+ ctor public MbmsDownloadReceiver();
+ method public void onReceive(android.content.Context, android.content.Intent);
+ }
+
+ public class MbmsDownloadSessionCallback {
+ ctor public MbmsDownloadSessionCallback();
+ method public void onError(int, java.lang.String);
+ method public void onFileServicesUpdated(java.util.List<android.telephony.mbms.FileServiceInfo>);
+ method public void onMiddlewareReady();
+ }
+
+ public class MbmsErrors {
field public static final int ERROR_MIDDLEWARE_LOST = 3; // 0x3
field public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2; // 0x2
field public static final int ERROR_NO_UNIQUE_MIDDLEWARE = 1; // 0x1
field public static final int SUCCESS = 0; // 0x0
}
- public static class MbmsException.GeneralErrors {
+ public static class MbmsErrors.DownloadErrors {
+ field public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 401; // 0x191
+ field public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402; // 0x192
+ }
+
+ public static class MbmsErrors.GeneralErrors {
field public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 207; // 0xcf
field public static final int ERROR_IN_E911 = 204; // 0xcc
field public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 201; // 0xc9
@@ -40585,39 +40675,38 @@
field public static final int ERROR_UNABLE_TO_READ_SIM = 206; // 0xce
}
- public static class MbmsException.InitializationErrors {
+ public static class MbmsErrors.InitializationErrors {
field public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 102; // 0x66
field public static final int ERROR_DUPLICATE_INITIALIZE = 101; // 0x65
field public static final int ERROR_UNABLE_TO_INITIALIZE = 103; // 0x67
}
- public static class MbmsException.StreamingErrors {
+ public static class MbmsErrors.StreamingErrors {
field public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 301; // 0x12d
field public static final int ERROR_DUPLICATE_START_STREAM = 303; // 0x12f
field public static final int ERROR_UNABLE_TO_START_SERVICE = 302; // 0x12e
}
- public class MbmsStreamingManagerCallback {
- ctor public MbmsStreamingManagerCallback();
+ public class MbmsStreamingSessionCallback {
+ ctor public MbmsStreamingSessionCallback();
method public void onError(int, java.lang.String);
method public void onMiddlewareReady();
method public void onStreamingServicesUpdated(java.util.List<android.telephony.mbms.StreamingServiceInfo>);
}
public class ServiceInfo {
- method public java.lang.String getClassName();
method public java.util.List<java.util.Locale> getLocales();
- method public java.util.Map<java.util.Locale, java.lang.String> getNames();
+ method public java.lang.CharSequence getNameForLocale(java.util.Locale);
+ method public java.lang.String getServiceClassName();
method public java.lang.String getServiceId();
method public java.util.Date getSessionEndTime();
method public java.util.Date getSessionStartTime();
}
public class StreamingService {
- method public void dispose() throws android.telephony.mbms.MbmsException;
method public android.telephony.mbms.StreamingServiceInfo getInfo();
- method public android.net.Uri getPlaybackUri() throws android.telephony.mbms.MbmsException;
- method public void stopStreaming() throws android.telephony.mbms.MbmsException;
+ method public android.net.Uri getPlaybackUri();
+ method public void stopStreaming();
field public static final int BROADCAST_METHOD = 1; // 0x1
field public static final int REASON_BY_USER_REQUEST = 1; // 0x1
field public static final int REASON_END_OF_SESSION = 2; // 0x2
@@ -48275,6 +48364,7 @@
field public static final int FLAG_SELECTING = 2; // 0x2
field public static final int FLAG_SINGLE_LINE = 1; // 0x1
field public int flags;
+ field public java.lang.CharSequence hint;
field public int partialEndOffset;
field public int partialStartOffset;
field public int selectionEnd;
@@ -51073,10 +51163,11 @@
public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable {
ctor public RemoteViews(java.lang.String, int);
ctor public RemoteViews(android.widget.RemoteViews, android.widget.RemoteViews);
+ ctor public RemoteViews(android.widget.RemoteViews);
ctor public RemoteViews(android.os.Parcel);
method public void addView(int, android.widget.RemoteViews);
method public android.view.View apply(android.content.Context, android.view.ViewGroup);
- method public android.widget.RemoteViews clone();
+ method public deprecated android.widget.RemoteViews clone();
method public int describeContents();
method public int getLayoutId();
method public java.lang.String getPackage();
diff --git a/api/system-current.txt b/api/system-current.txt
index 9437dfe..4f4b9db 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -57,6 +57,7 @@
field public static final java.lang.String BIND_RESOLVER_RANKER_SERVICE = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
field public static final java.lang.String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE";
field public static final java.lang.String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE";
+ field public static final java.lang.String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE";
field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE";
field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE";
field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT";
@@ -11611,6 +11612,7 @@
field public static final int PROTECTION_FLAG_DEVELOPMENT = 32; // 0x20
field public static final int PROTECTION_FLAG_INSTALLER = 256; // 0x100
field public static final int PROTECTION_FLAG_INSTANT = 4096; // 0x1000
+ field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
field public static final int PROTECTION_FLAG_PRE23 = 128; // 0x80
field public static final int PROTECTION_FLAG_PREINSTALLED = 1024; // 0x400
field public static final int PROTECTION_FLAG_PRIVILEGED = 16; // 0x10
@@ -40284,6 +40286,7 @@
public final class SaveRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.List<java.lang.String> getDatasetIds();
method public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
@@ -40818,6 +40821,35 @@
}
+package android.service.settings.suggestions {
+
+ public final class Suggestion implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.lang.String getId();
+ method public android.app.PendingIntent getPendingIntent();
+ method public java.lang.CharSequence getSummary();
+ method public java.lang.CharSequence getTitle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.settings.suggestions.Suggestion> CREATOR;
+ }
+
+ public static class Suggestion.Builder {
+ ctor public Suggestion.Builder(java.lang.String);
+ method public android.service.settings.suggestions.Suggestion build();
+ method public android.service.settings.suggestions.Suggestion.Builder setPendingIntent(android.app.PendingIntent);
+ method public android.service.settings.suggestions.Suggestion.Builder setSummary(java.lang.CharSequence);
+ method public android.service.settings.suggestions.Suggestion.Builder setTitle(java.lang.CharSequence);
+ }
+
+ public abstract class SuggestionService extends android.app.Service {
+ ctor public SuggestionService();
+ method public android.os.IBinder onBind(android.content.Intent);
+ method public abstract java.util.List<android.service.settings.suggestions.Suggestion> onGetSuggestions();
+ method public abstract void onSuggestionDismissed(android.service.settings.suggestions.Suggestion);
+ }
+
+}
+
package android.service.textservice {
public abstract class SpellCheckerService extends android.app.Service {
@@ -43370,13 +43402,43 @@
field public static final int STATUS_UNKNOWN_ERROR = 4; // 0x4
}
- public class MbmsStreamingManager {
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback, int, android.os.Handler) throws android.telephony.mbms.MbmsException;
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback, android.os.Handler) throws android.telephony.mbms.MbmsException;
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback) throws android.telephony.mbms.MbmsException;
- method public void dispose();
- method public void getStreamingServices(java.util.List<java.lang.String>) throws android.telephony.mbms.MbmsException;
- method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler) throws android.telephony.mbms.MbmsException;
+ public class MbmsDownloadSession implements java.lang.AutoCloseable {
+ method public void cancelDownload(android.telephony.mbms.DownloadRequest);
+ method public void close();
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, android.os.Handler);
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, int, android.os.Handler);
+ method public void download(android.telephony.mbms.DownloadRequest);
+ method public int getDownloadStatus(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo);
+ method public java.io.File getTempFileRootDirectory();
+ method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads();
+ method public void registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback, android.os.Handler);
+ method public void requestUpdateFileServices(java.util.List<java.lang.String>);
+ method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest);
+ method public void setTempFileRootDirectory(java.io.File);
+ method public void unregisterStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback);
+ field public static final java.lang.String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
+ field public static final java.lang.String EXTRA_MBMS_COMPLETED_FILE_URI = "android.telephony.extra.MBMS_COMPLETED_FILE_URI";
+ field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_REQUEST = "android.telephony.extra.MBMS_DOWNLOAD_REQUEST";
+ field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_RESULT = "android.telephony.extra.MBMS_DOWNLOAD_RESULT";
+ field public static final java.lang.String EXTRA_MBMS_FILE_INFO = "android.telephony.extra.MBMS_FILE_INFO";
+ field public static final java.lang.String MBMS_DOWNLOAD_SERVICE_ACTION = "android.telephony.action.EmbmsDownload";
+ field public static final int RESULT_CANCELLED = 2; // 0x2
+ field public static final int RESULT_EXPIRED = 3; // 0x3
+ field public static final int RESULT_IO_ERROR = 4; // 0x4
+ field public static final int RESULT_SUCCESSFUL = 1; // 0x1
+ field public static final int STATUS_ACTIVELY_DOWNLOADING = 1; // 0x1
+ field public static final int STATUS_PENDING_DOWNLOAD = 2; // 0x2
+ field public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4; // 0x4
+ field public static final int STATUS_PENDING_REPAIR = 3; // 0x3
+ field public static final int STATUS_UNKNOWN = 0; // 0x0
+ }
+
+ public class MbmsStreamingSession implements java.lang.AutoCloseable {
+ method public void close();
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, int, android.os.Handler);
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, android.os.Handler);
+ method public void requestUpdateStreamingServices(java.util.List<java.lang.String>);
+ method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler);
field public static final java.lang.String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
}
@@ -43756,8 +43818,8 @@
}
public class TelephonyManager {
- method public void answerRingingCall();
- method public void call(java.lang.String, java.lang.String);
+ method public deprecated void answerRingingCall();
+ method public deprecated void call(java.lang.String, java.lang.String);
method public boolean canChangeDtmfToneLength();
method public int checkCarrierPrivilegesForPackage(java.lang.String);
method public int checkCarrierPrivilegesForPackageAnyPhone(java.lang.String);
@@ -43767,7 +43829,7 @@
method public boolean disableDataConnectivity();
method public boolean enableDataConnectivity();
method public void enableVideoCalling(boolean);
- method public boolean endCall();
+ method public deprecated boolean endCall();
method public java.util.List<android.telephony.CellInfo> getAllCellInfo();
method public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
method public int getCallState();
@@ -43808,6 +43870,7 @@
method public int getPhoneCount();
method public int getPhoneType();
method public android.telephony.ServiceState getServiceState();
+ method public android.telephony.SignalStrength getSignalStrength();
method public java.lang.String getSimCountryIso();
method public java.lang.String getSimOperator();
method public java.lang.String getSimOperatorName();
@@ -43842,7 +43905,7 @@
method public boolean isRadioOn();
method public boolean isRinging();
method public boolean isSmsCapable();
- method public boolean isTtyModeSupported();
+ method public deprecated boolean isTtyModeSupported();
method public boolean isVideoCallingEnabled();
method public deprecated boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle);
method public boolean isVoiceCapable();
@@ -43867,7 +43930,7 @@
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 deprecated void silenceRinger();
method public boolean supplyPin(java.lang.String);
method public int[] supplyPinReportResult(java.lang.String);
method public boolean supplyPuk(java.lang.String, java.lang.String);
@@ -44128,15 +44191,85 @@
package android.telephony.mbms {
- public class MbmsException extends java.lang.Exception {
- method public int getErrorCode();
+ public final class DownloadRequest implements android.os.Parcelable {
+ method public static android.telephony.mbms.DownloadRequest copy(android.telephony.mbms.DownloadRequest);
+ method public int describeContents();
+ method public java.lang.String getFileServiceId();
+ method public static int getMaxAppIntentSize();
+ method public static int getMaxDestinationUriSize();
+ method public byte[] getOpaqueData();
+ method public android.net.Uri getSourceUri();
+ method public int getSubscriptionId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.DownloadRequest> CREATOR;
+ }
+
+ public static class DownloadRequest.Builder {
+ ctor public DownloadRequest.Builder();
+ method public android.telephony.mbms.DownloadRequest build();
+ method public android.telephony.mbms.DownloadRequest.Builder setAppIntent(android.content.Intent);
+ method public android.telephony.mbms.DownloadRequest.Builder setOpaqueData(byte[]);
+ method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String);
+ method public android.telephony.mbms.DownloadRequest.Builder setServiceInfo(android.telephony.mbms.FileServiceInfo);
+ method public android.telephony.mbms.DownloadRequest.Builder setSource(android.net.Uri);
+ method public android.telephony.mbms.DownloadRequest.Builder setSubscriptionId(int);
+ }
+
+ public class DownloadStateCallback {
+ ctor public DownloadStateCallback();
+ method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int);
+ method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int);
+ }
+
+ public final class FileInfo implements android.os.Parcelable {
+ ctor public FileInfo(android.net.Uri, java.lang.String);
+ method public int describeContents();
+ method public java.lang.String getMimeType();
+ method public android.net.Uri getUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.FileInfo> CREATOR;
+ }
+
+ public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
+ ctor public FileServiceInfo(java.util.Map<java.util.Locale, java.lang.String>, java.lang.String, java.util.List<java.util.Locale>, java.lang.String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>);
+ method public int describeContents();
+ method public java.util.List<android.telephony.mbms.FileInfo> getFiles();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.FileServiceInfo> CREATOR;
+ }
+
+ public class MbmsDownloadReceiver extends android.content.BroadcastReceiver {
+ ctor public MbmsDownloadReceiver();
+ method public void onReceive(android.content.Context, android.content.Intent);
+ field public static final int RESULT_APP_NOTIFICATION_ERROR = 6; // 0x6
+ field public static final int RESULT_BAD_TEMP_FILE_ROOT = 3; // 0x3
+ field public static final int RESULT_DOWNLOAD_FINALIZATION_ERROR = 4; // 0x4
+ field public static final int RESULT_INVALID_ACTION = 1; // 0x1
+ field public static final int RESULT_MALFORMED_INTENT = 2; // 0x2
+ field public static final int RESULT_OK = 0; // 0x0
+ field public static final int RESULT_TEMP_FILE_GENERATION_ERROR = 5; // 0x5
+ }
+
+ public class MbmsDownloadSessionCallback {
+ ctor public MbmsDownloadSessionCallback();
+ method public void onError(int, java.lang.String);
+ method public void onFileServicesUpdated(java.util.List<android.telephony.mbms.FileServiceInfo>);
+ method public void onMiddlewareReady();
+ }
+
+ public class MbmsErrors {
field public static final int ERROR_MIDDLEWARE_LOST = 3; // 0x3
field public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2; // 0x2
field public static final int ERROR_NO_UNIQUE_MIDDLEWARE = 1; // 0x1
field public static final int SUCCESS = 0; // 0x0
}
- public static class MbmsException.GeneralErrors {
+ public static class MbmsErrors.DownloadErrors {
+ field public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 401; // 0x191
+ field public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402; // 0x192
+ }
+
+ public static class MbmsErrors.GeneralErrors {
field public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 207; // 0xcf
field public static final int ERROR_IN_E911 = 204; // 0xcc
field public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 201; // 0xc9
@@ -44146,39 +44279,38 @@
field public static final int ERROR_UNABLE_TO_READ_SIM = 206; // 0xce
}
- public static class MbmsException.InitializationErrors {
+ public static class MbmsErrors.InitializationErrors {
field public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 102; // 0x66
field public static final int ERROR_DUPLICATE_INITIALIZE = 101; // 0x65
field public static final int ERROR_UNABLE_TO_INITIALIZE = 103; // 0x67
}
- public static class MbmsException.StreamingErrors {
+ public static class MbmsErrors.StreamingErrors {
field public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 301; // 0x12d
field public static final int ERROR_DUPLICATE_START_STREAM = 303; // 0x12f
field public static final int ERROR_UNABLE_TO_START_SERVICE = 302; // 0x12e
}
- public class MbmsStreamingManagerCallback {
- ctor public MbmsStreamingManagerCallback();
+ public class MbmsStreamingSessionCallback {
+ ctor public MbmsStreamingSessionCallback();
method public void onError(int, java.lang.String);
method public void onMiddlewareReady();
method public void onStreamingServicesUpdated(java.util.List<android.telephony.mbms.StreamingServiceInfo>);
}
public class ServiceInfo {
- method public java.lang.String getClassName();
method public java.util.List<java.util.Locale> getLocales();
- method public java.util.Map<java.util.Locale, java.lang.String> getNames();
+ method public java.lang.CharSequence getNameForLocale(java.util.Locale);
+ method public java.lang.String getServiceClassName();
method public java.lang.String getServiceId();
method public java.util.Date getSessionEndTime();
method public java.util.Date getSessionStartTime();
}
public class StreamingService {
- method public void dispose() throws android.telephony.mbms.MbmsException;
method public android.telephony.mbms.StreamingServiceInfo getInfo();
- method public android.net.Uri getPlaybackUri() throws android.telephony.mbms.MbmsException;
- method public void stopStreaming() throws android.telephony.mbms.MbmsException;
+ method public android.net.Uri getPlaybackUri();
+ method public void stopStreaming();
field public static final int BROADCAST_METHOD = 1; // 0x1
field public static final int REASON_BY_USER_REQUEST = 1; // 0x1
field public static final int REASON_END_OF_SESSION = 2; // 0x2
@@ -44210,22 +44342,62 @@
field public static final android.os.Parcelable.Creator<android.telephony.mbms.StreamingServiceInfo> CREATOR;
}
+ public final class UriPathPair implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.net.Uri getContentUri();
+ method public android.net.Uri getFilePathUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.UriPathPair> CREATOR;
+ }
+
}
package android.telephony.mbms.vendor {
+ public class MbmsDownloadServiceBase extends android.os.Binder {
+ ctor public MbmsDownloadServiceBase();
+ method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
+ method public void dispose(int) throws android.os.RemoteException;
+ method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
+ method public int getDownloadStatus(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException;
+ method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException;
+ method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException;
+ method public void onAppCallbackDied(int, int);
+ method public int registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback) throws android.os.RemoteException;
+ method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
+ method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
+ method public int setTempFileRootDirectory(int, java.lang.String) throws android.os.RemoteException;
+ method public int unregisterStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback) throws android.os.RemoteException;
+ }
+
public class MbmsStreamingServiceBase extends android.os.Binder {
ctor public MbmsStreamingServiceBase();
method public void dispose(int) throws android.os.RemoteException;
- method public void disposeStream(int, java.lang.String) throws android.os.RemoteException;
method public android.net.Uri getPlaybackUri(int, java.lang.String) throws android.os.RemoteException;
- method public int getStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
- method public int initialize(android.telephony.mbms.MbmsStreamingManagerCallback, int) throws android.os.RemoteException;
+ method public int initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) throws android.os.RemoteException;
method public void onAppCallbackDied(int, int);
+ method public int requestUpdateStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
method public int startStreaming(int, java.lang.String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException;
method public void stopStreaming(int, java.lang.String) throws android.os.RemoteException;
}
+ public class VendorUtils {
+ ctor public VendorUtils();
+ method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, java.lang.String);
+ field public static final java.lang.String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP";
+ field public static final java.lang.String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL";
+ field public static final java.lang.String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST";
+ field public static final java.lang.String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT";
+ field public static final java.lang.String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
+ field public static final java.lang.String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST";
+ field public static final java.lang.String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST";
+ field public static final java.lang.String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST";
+ field public static final java.lang.String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID";
+ field public static final java.lang.String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE";
+ field public static final java.lang.String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT";
+ field public static final java.lang.String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST";
+ }
+
}
package android.test {
@@ -51886,6 +52058,7 @@
field public static final int FLAG_SELECTING = 2; // 0x2
field public static final int FLAG_SINGLE_LINE = 1; // 0x1
field public int flags;
+ field public java.lang.CharSequence hint;
field public int partialEndOffset;
field public int partialStartOffset;
field public int selectionEnd;
@@ -55051,10 +55224,11 @@
public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable {
ctor public RemoteViews(java.lang.String, int);
ctor public RemoteViews(android.widget.RemoteViews, android.widget.RemoteViews);
+ ctor public RemoteViews(android.widget.RemoteViews);
ctor public RemoteViews(android.os.Parcel);
method public void addView(int, android.widget.RemoteViews);
method public android.view.View apply(android.content.Context, android.view.ViewGroup);
- method public android.widget.RemoteViews clone();
+ method public deprecated android.widget.RemoteViews clone();
method public int describeContents();
method public int getLayoutId();
method public java.lang.String getPackage();
diff --git a/api/test-current.txt b/api/test-current.txt
index 20a15f8..0902fc6 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -4013,6 +4013,17 @@
field public android.content.ComponentName topActivity;
}
+ public static class ActivityManager.StackId {
+ field public static final int ASSISTANT_STACK_ID = 6; // 0x6
+ field public static final int DOCKED_STACK_ID = 3; // 0x3
+ field public static final int FREEFORM_WORKSPACE_STACK_ID = 2; // 0x2
+ field public static final int FULLSCREEN_WORKSPACE_STACK_ID = 1; // 0x1
+ field public static final int HOME_STACK_ID = 0; // 0x0
+ field public static final int INVALID_STACK_ID = -1; // 0xffffffff
+ field public static final int PINNED_STACK_ID = 4; // 0x4
+ field public static final int RECENTS_STACK_ID = 5; // 0x5
+ }
+
public static class ActivityManager.TaskDescription implements android.os.Parcelable {
ctor public ActivityManager.TaskDescription(java.lang.String, android.graphics.Bitmap, int);
ctor public ActivityManager.TaskDescription(java.lang.String, android.graphics.Bitmap);
@@ -6214,6 +6225,14 @@
method public abstract void onColorsChanged(android.app.WallpaperColors, int);
}
+ public class WindowConfiguration implements java.lang.Comparable android.os.Parcelable {
+ method public int compareTo(android.app.WindowConfiguration);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int ACTIVITY_TYPE_HOME = 2; // 0x2
+ field public static final int ACTIVITY_TYPE_RECENTS = 3; // 0x3
+ }
+
}
package android.app.admin {
@@ -12105,6 +12124,18 @@
ctor public SQLiteFullException(java.lang.String);
}
+ public final class SQLiteGlobal {
+ method public static java.lang.String getDefaultJournalMode();
+ method public static int getDefaultPageSize();
+ method public static java.lang.String getDefaultSyncMode();
+ method public static int getIdleConnectionTimeout();
+ method public static int getJournalSizeLimit();
+ method public static int getWALAutoCheckpoint();
+ method public static int getWALConnectionPoolSize();
+ method public static java.lang.String getWALSyncMode();
+ method public static int releaseMemory();
+ }
+
public class SQLiteMisuseException extends android.database.sqlite.SQLiteException {
ctor public SQLiteMisuseException();
ctor public SQLiteMisuseException(java.lang.String);
@@ -37395,6 +37426,7 @@
public final class SaveRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.List<java.lang.String> getDatasetIds();
method public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
@@ -39783,6 +39815,7 @@
method public boolean isInManagedCall();
method public boolean isIncomingCallPermitted(android.telecom.PhoneAccountHandle);
method public boolean isOutgoingCallPermitted(android.telecom.PhoneAccountHandle);
+ method public boolean isTtySupported();
method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String);
method public void placeCall(android.net.Uri, android.os.Bundle);
method public void registerPhoneAccount(android.telecom.PhoneAccount);
@@ -40187,13 +40220,42 @@
field public static final int STATUS_UNKNOWN_ERROR = 4; // 0x4
}
- public class MbmsStreamingManager {
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback, int, android.os.Handler) throws android.telephony.mbms.MbmsException;
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback, android.os.Handler) throws android.telephony.mbms.MbmsException;
- method public static android.telephony.MbmsStreamingManager create(android.content.Context, android.telephony.mbms.MbmsStreamingManagerCallback) throws android.telephony.mbms.MbmsException;
- method public void dispose();
- method public void getStreamingServices(java.util.List<java.lang.String>) throws android.telephony.mbms.MbmsException;
- method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler) throws android.telephony.mbms.MbmsException;
+ public class MbmsDownloadSession implements java.lang.AutoCloseable {
+ method public void cancelDownload(android.telephony.mbms.DownloadRequest);
+ method public void close();
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, android.os.Handler);
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, int, android.os.Handler);
+ method public void download(android.telephony.mbms.DownloadRequest);
+ method public int getDownloadStatus(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo);
+ method public java.io.File getTempFileRootDirectory();
+ method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads();
+ method public void registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback, android.os.Handler);
+ method public void requestUpdateFileServices(java.util.List<java.lang.String>);
+ method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest);
+ method public void setTempFileRootDirectory(java.io.File);
+ method public void unregisterStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback);
+ field public static final java.lang.String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
+ field public static final java.lang.String EXTRA_MBMS_COMPLETED_FILE_URI = "android.telephony.extra.MBMS_COMPLETED_FILE_URI";
+ field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_REQUEST = "android.telephony.extra.MBMS_DOWNLOAD_REQUEST";
+ field public static final java.lang.String EXTRA_MBMS_DOWNLOAD_RESULT = "android.telephony.extra.MBMS_DOWNLOAD_RESULT";
+ field public static final java.lang.String EXTRA_MBMS_FILE_INFO = "android.telephony.extra.MBMS_FILE_INFO";
+ field public static final int RESULT_CANCELLED = 2; // 0x2
+ field public static final int RESULT_EXPIRED = 3; // 0x3
+ field public static final int RESULT_IO_ERROR = 4; // 0x4
+ field public static final int RESULT_SUCCESSFUL = 1; // 0x1
+ field public static final int STATUS_ACTIVELY_DOWNLOADING = 1; // 0x1
+ field public static final int STATUS_PENDING_DOWNLOAD = 2; // 0x2
+ field public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4; // 0x4
+ field public static final int STATUS_PENDING_REPAIR = 3; // 0x3
+ field public static final int STATUS_UNKNOWN = 0; // 0x0
+ }
+
+ public class MbmsStreamingSession implements java.lang.AutoCloseable {
+ method public void close();
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, int, android.os.Handler);
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, android.os.Handler);
+ method public void requestUpdateStreamingServices(java.util.List<java.lang.String>);
+ method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler);
}
public class NeighboringCellInfo implements android.os.Parcelable {
@@ -40548,6 +40610,7 @@
method public int getPhoneCount();
method public int getPhoneType();
method public android.telephony.ServiceState getServiceState();
+ method public android.telephony.SignalStrength getSignalStrength();
method public java.lang.String getSimCountryIso();
method public java.lang.String getSimOperator();
method public java.lang.String getSimOperatorName();
@@ -40573,7 +40636,7 @@
method public boolean isHearingAidCompatibilitySupported();
method public boolean isNetworkRoaming();
method public boolean isSmsCapable();
- method public boolean isTtyModeSupported();
+ method public deprecated boolean isTtyModeSupported();
method public boolean isVoiceCapable();
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
method public boolean isWorldPhone();
@@ -40827,15 +40890,73 @@
package android.telephony.mbms {
- public class MbmsException extends java.lang.Exception {
- method public int getErrorCode();
+ public final class DownloadRequest implements android.os.Parcelable {
+ method public static android.telephony.mbms.DownloadRequest copy(android.telephony.mbms.DownloadRequest);
+ method public int describeContents();
+ method public java.lang.String getFileServiceId();
+ method public static int getMaxAppIntentSize();
+ method public static int getMaxDestinationUriSize();
+ method public android.net.Uri getSourceUri();
+ method public int getSubscriptionId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.DownloadRequest> CREATOR;
+ }
+
+ public static class DownloadRequest.Builder {
+ ctor public DownloadRequest.Builder();
+ method public android.telephony.mbms.DownloadRequest build();
+ method public android.telephony.mbms.DownloadRequest.Builder setAppIntent(android.content.Intent);
+ method public android.telephony.mbms.DownloadRequest.Builder setServiceInfo(android.telephony.mbms.FileServiceInfo);
+ method public android.telephony.mbms.DownloadRequest.Builder setSource(android.net.Uri);
+ method public android.telephony.mbms.DownloadRequest.Builder setSubscriptionId(int);
+ }
+
+ public class DownloadStateCallback {
+ ctor public DownloadStateCallback();
+ method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int);
+ method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int);
+ }
+
+ public final class FileInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.lang.String getMimeType();
+ method public android.net.Uri getUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.FileInfo> CREATOR;
+ }
+
+ public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.util.List<android.telephony.mbms.FileInfo> getFiles();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.mbms.FileServiceInfo> CREATOR;
+ }
+
+ public class MbmsDownloadReceiver extends android.content.BroadcastReceiver {
+ ctor public MbmsDownloadReceiver();
+ method public void onReceive(android.content.Context, android.content.Intent);
+ }
+
+ public class MbmsDownloadSessionCallback {
+ ctor public MbmsDownloadSessionCallback();
+ method public void onError(int, java.lang.String);
+ method public void onFileServicesUpdated(java.util.List<android.telephony.mbms.FileServiceInfo>);
+ method public void onMiddlewareReady();
+ }
+
+ public class MbmsErrors {
field public static final int ERROR_MIDDLEWARE_LOST = 3; // 0x3
field public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2; // 0x2
field public static final int ERROR_NO_UNIQUE_MIDDLEWARE = 1; // 0x1
field public static final int SUCCESS = 0; // 0x0
}
- public static class MbmsException.GeneralErrors {
+ public static class MbmsErrors.DownloadErrors {
+ field public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 401; // 0x191
+ field public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402; // 0x192
+ }
+
+ public static class MbmsErrors.GeneralErrors {
field public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 207; // 0xcf
field public static final int ERROR_IN_E911 = 204; // 0xcc
field public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 201; // 0xc9
@@ -40845,39 +40966,38 @@
field public static final int ERROR_UNABLE_TO_READ_SIM = 206; // 0xce
}
- public static class MbmsException.InitializationErrors {
+ public static class MbmsErrors.InitializationErrors {
field public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 102; // 0x66
field public static final int ERROR_DUPLICATE_INITIALIZE = 101; // 0x65
field public static final int ERROR_UNABLE_TO_INITIALIZE = 103; // 0x67
}
- public static class MbmsException.StreamingErrors {
+ public static class MbmsErrors.StreamingErrors {
field public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 301; // 0x12d
field public static final int ERROR_DUPLICATE_START_STREAM = 303; // 0x12f
field public static final int ERROR_UNABLE_TO_START_SERVICE = 302; // 0x12e
}
- public class MbmsStreamingManagerCallback {
- ctor public MbmsStreamingManagerCallback();
+ public class MbmsStreamingSessionCallback {
+ ctor public MbmsStreamingSessionCallback();
method public void onError(int, java.lang.String);
method public void onMiddlewareReady();
method public void onStreamingServicesUpdated(java.util.List<android.telephony.mbms.StreamingServiceInfo>);
}
public class ServiceInfo {
- method public java.lang.String getClassName();
method public java.util.List<java.util.Locale> getLocales();
- method public java.util.Map<java.util.Locale, java.lang.String> getNames();
+ method public java.lang.CharSequence getNameForLocale(java.util.Locale);
+ method public java.lang.String getServiceClassName();
method public java.lang.String getServiceId();
method public java.util.Date getSessionEndTime();
method public java.util.Date getSessionStartTime();
}
public class StreamingService {
- method public void dispose() throws android.telephony.mbms.MbmsException;
method public android.telephony.mbms.StreamingServiceInfo getInfo();
- method public android.net.Uri getPlaybackUri() throws android.telephony.mbms.MbmsException;
- method public void stopStreaming() throws android.telephony.mbms.MbmsException;
+ method public android.net.Uri getPlaybackUri();
+ method public void stopStreaming();
field public static final int BROADCAST_METHOD = 1; // 0x1
field public static final int REASON_BY_USER_REQUEST = 1; // 0x1
field public static final int REASON_END_OF_SESSION = 2; // 0x2
@@ -48741,6 +48861,7 @@
field public static final int FLAG_SELECTING = 2; // 0x2
field public static final int FLAG_SINGLE_LINE = 1; // 0x1
field public int flags;
+ field public java.lang.CharSequence hint;
field public int partialEndOffset;
field public int partialStartOffset;
field public int selectionEnd;
@@ -51545,10 +51666,11 @@
public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable {
ctor public RemoteViews(java.lang.String, int);
ctor public RemoteViews(android.widget.RemoteViews, android.widget.RemoteViews);
+ ctor public RemoteViews(android.widget.RemoteViews);
ctor public RemoteViews(android.os.Parcel);
method public void addView(int, android.widget.RemoteViews);
method public android.view.View apply(android.content.Context, android.view.ViewGroup);
- method public android.widget.RemoteViews clone();
+ method public deprecated android.widget.RemoteViews clone();
method public int describeContents();
method public int getLayoutId();
method public java.lang.String getPackage();
diff --git a/cmds/am/Android.bp b/cmds/am/Android.bp
new file mode 100644
index 0000000..7eb4edf
--- /dev/null
+++ b/cmds/am/Android.bp
@@ -0,0 +1,11 @@
+// Copyright 2008 The Android Open Source Project
+//
+
+cc_library_host_static {
+ name: "libinstrumentation",
+ srcs: ["**/*.proto"],
+ proto: {
+ type: "full",
+ export_proto_headers: true,
+ },
+}
diff --git a/cmds/am/Android.mk b/cmds/am/Android.mk
index 5586dd4..9411c32 100644
--- a/cmds/am/Android.mk
+++ b/cmds/am/Android.mk
@@ -16,14 +16,3 @@
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)
-
-
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := \
- $(call all-proto-files-under, proto)
-LOCAL_MODULE := libinstrumentation
-LOCAL_PROTOC_OPTIMIZE_TYPE := full
-LOCAL_EXPORT_C_INCLUDE_DIRS := \
- $(call intermediates-dir-for,STATIC_LIBRARIES,libinstrumentation,HOST,,,)/proto/$(LOCAL_PATH)/proto
-include $(BUILD_HOST_STATIC_LIBRARY)
-
diff --git a/cmds/bu/src/com/android/commands/bu/Backup.java b/cmds/bu/src/com/android/commands/bu/Backup.java
index 345895b..834658d 100644
--- a/cmds/bu/src/com/android/commands/bu/Backup.java
+++ b/cmds/bu/src/com/android/commands/bu/Backup.java
@@ -136,7 +136,9 @@
if (fd != null) {
try {
fd.close();
- } catch (IOException e) {}
+ } catch (IOException e) {
+ Log.e(TAG, "IO error closing output for backup: " + e.getMessage());
+ }
}
}
}
diff --git a/cmds/hid/Android.bp b/cmds/hid/Android.bp
new file mode 100644
index 0000000..2b7963a
--- /dev/null
+++ b/cmds/hid/Android.bp
@@ -0,0 +1 @@
+subdirs = ["jni"]
diff --git a/cmds/hid/jni/Android.bp b/cmds/hid/jni/Android.bp
new file mode 100644
index 0000000..095cfc6
--- /dev/null
+++ b/cmds/hid/jni/Android.bp
@@ -0,0 +1,17 @@
+cc_library_shared {
+ name: "libhidcommand_jni",
+
+ srcs: ["com_android_commands_hid_Device.cpp"],
+
+ shared_libs: [
+ "libandroid",
+ "liblog",
+ "libnativehelper",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Werror",
+ ],
+}
diff --git a/cmds/hid/jni/Android.mk b/cmds/hid/jni/Android.mk
deleted file mode 100644
index 86f4e01..0000000
--- a/cmds/hid/jni/Android.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- com_android_commands_hid_Device.cpp
-
-LOCAL_C_INCLUDES := \
- $(JNI_H_INCLUDE)
-
-LOCAL_LDLIBS += -landroid -llog -lnativehelper
-
-LOCAL_MODULE := libhidcommand_jni
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS += -Wall -Wextra -Werror
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/cmds/idmap/create.cpp b/cmds/idmap/create.cpp
index 524db14..f415f8f 100644
--- a/cmds/idmap/create.cpp
+++ b/cmds/idmap/create.cpp
@@ -104,13 +104,17 @@
}
}
- uint32_t cached_target_crc, cached_overlay_crc;
+ uint32_t version, cached_target_crc, cached_overlay_crc;
String8 cached_target_path, cached_overlay_path;
- if (!ResTable::getIdmapInfo(buf, N, NULL, &cached_target_crc, &cached_overlay_crc,
+ if (!ResTable::getIdmapInfo(buf, N, &version, &cached_target_crc, &cached_overlay_crc,
&cached_target_path, &cached_overlay_path)) {
return true;
}
+ if (version != ResTable::IDMAP_CURRENT_VERSION) {
+ return true;
+ }
+
if (cached_target_path != target_apk_path) {
return true;
}
diff --git a/cmds/idmap/inspect.cpp b/cmds/idmap/inspect.cpp
index 154cb25..20005e2 100644
--- a/cmds/idmap/inspect.cpp
+++ b/cmds/idmap/inspect.cpp
@@ -284,7 +284,9 @@
if (err != NO_ERROR) {
return err;
}
- print("", "entry", data32, "%s/%s", type.string(), name.string());
+ if (data32 != ResTable_type::NO_ENTRY) {
+ print("", "entry", data32, "%s/%s", type.string(), name.string());
+ }
}
}
diff --git a/cmds/incident/main.cpp b/cmds/incident/main.cpp
index 47f1db8..519852d 100644
--- a/cmds/incident/main.cpp
+++ b/cmds/incident/main.cpp
@@ -25,6 +25,7 @@
#include <binder/IServiceManager.h>
#include <utils/Looper.h>
+#include <cstring>
#include <fcntl.h>
#include <getopt.h>
#include <stdio.h>
@@ -144,6 +145,16 @@
}
// ================================================================================
+static int
+get_dest(const char* arg)
+{
+ if (strcmp(arg, "LOCAL") == 0) return 0;
+ if (strcmp(arg, "EXPLICIT") == 0) return 1;
+ if (strcmp(arg, "AUTOMATIC") == 0) return 2;
+ return -1; // return the default value
+}
+
+// ================================================================================
static void
usage(FILE* out)
{
@@ -155,6 +166,7 @@
fprintf(out, " -b (default) print the report to stdout (in proto format)\n");
fprintf(out, " -d send the report into dropbox\n");
fprintf(out, " -l list available sections\n");
+ fprintf(out, " -p privacy spec, LOCAL, EXPLICIT or AUTOMATIC\n");
fprintf(out, "\n");
fprintf(out, " SECTION the field numbers of the incident report fields to include\n");
fprintf(out, "\n");
@@ -166,10 +178,11 @@
Status status;
IncidentReportArgs args;
enum { DEST_DROPBOX, DEST_STDOUT } destination = DEST_STDOUT;
+ int dest = -1; // default
// Parse the args
int opt;
- while ((opt = getopt(argc, argv, "bhdl")) != -1) {
+ while ((opt = getopt(argc, argv, "bhdlp:")) != -1) {
switch (opt) {
case 'h':
usage(stdout);
@@ -183,6 +196,9 @@
case 'd':
destination = DEST_DROPBOX;
break;
+ case 'p':
+ dest = get_dest(optarg);
+ break;
default:
usage(stderr);
return 1;
@@ -210,8 +226,7 @@
}
}
}
-
-
+ args.setDest(dest);
// Start the thread pool.
sp<ProcessState> ps(ProcessState::self());
diff --git a/cmds/incident_helper/IncidentHelper.cpp b/cmds/incident_helper/IncidentHelper.cpp
index fba5e66..7b06d42 100644
--- a/cmds/incident_helper/IncidentHelper.cpp
+++ b/cmds/incident_helper/IncidentHelper.cpp
@@ -20,6 +20,7 @@
#include "ih_util.h"
#include "frameworks/base/core/proto/android/os/kernelwake.pb.h"
+#include "frameworks/base/core/proto/android/os/pagetypeinfo.pb.h"
#include "frameworks/base/core/proto/android/os/procrank.pb.h"
#include <android-base/file.h>
@@ -32,6 +33,22 @@
using namespace google::protobuf;
using namespace std;
+
+static const string TAB_DELIMITER = "\t";
+static const string COMMA_DELIMITER = ",";
+
+static inline int toInt(const string& s) {
+ return atoi(s.c_str());
+}
+
+static inline long toLong(const string& s) {
+ return atol(s.c_str());
+}
+
+/**
+ * Sets the given protobuf message when the field name matches one of the
+ * fields. It is useful to set values to proto from table-like plain texts.
+ */
static bool
SetTableField(::google::protobuf::Message* message, string field_name, string field_value) {
const Descriptor* descriptor = message->GetDescriptor();
@@ -43,16 +60,16 @@
reflection->SetString(message, field, field_value);
return true;
case FieldDescriptor::TYPE_INT64:
- reflection->SetInt64(message, field, atol(field_value.c_str()));
+ reflection->SetInt64(message, field, toLong(field_value));
return true;
case FieldDescriptor::TYPE_UINT64:
- reflection->SetUInt64(message, field, atol(field_value.c_str()));
+ reflection->SetUInt64(message, field, toLong(field_value));
return true;
case FieldDescriptor::TYPE_INT32:
- reflection->SetInt32(message, field, atoi(field_value.c_str()));
+ reflection->SetInt32(message, field, toInt(field_value));
return true;
case FieldDescriptor::TYPE_UINT32:
- reflection->SetUInt32(message, field, atoi(field_value.c_str()));
+ reflection->SetUInt32(message, field, toInt(field_value));
return true;
default:
// Add new scalar types
@@ -61,6 +78,21 @@
}
// ================================================================================
+status_t NoopParser::Parse(const int in, const int out) const
+{
+ string content;
+ if (!ReadFdToString(in, &content)) {
+ fprintf(stderr, "[%s]Failed to read data from incidentd\n", this->name.string());
+ return -1;
+ }
+ if (!WriteStringToFd(content, out)) {
+ fprintf(stderr, "[%s]Failed to write data to incidentd\n", this->name.string());
+ return -1;
+ }
+ return NO_ERROR;
+}
+
+// ================================================================================
status_t ReverseParser::Parse(const int in, const int out) const
{
string content;
@@ -78,8 +110,6 @@
}
// ================================================================================
-static const string KERNEL_WAKEUP_LINE_DELIMITER = "\t";
-
status_t KernelWakesParser::Parse(const int in, const int out) const {
Reader reader(in);
string line;
@@ -90,16 +120,16 @@
KernelWakeSources proto;
// parse line by line
- while (reader.readLine(line)) {
+ while (reader.readLine(&line)) {
if (line.empty()) continue;
// parse head line
if (nline++ == 0) {
- header = parseHeader(line, KERNEL_WAKEUP_LINE_DELIMITER);
+ header = parseHeader(line, TAB_DELIMITER);
continue;
}
// parse for each record, the line delimiter is \t only!
- record = parseRecord(line, KERNEL_WAKEUP_LINE_DELIMITER);
+ record = parseRecord(line, TAB_DELIMITER);
if (record.size() != header.size()) {
// TODO: log this to incident report!
@@ -116,7 +146,7 @@
}
}
- if (!reader.ok(line)) {
+ if (!reader.ok(&line)) {
fprintf(stderr, "Bad read from fd %d: %s\n", in, line.c_str());
return -1;
}
@@ -132,7 +162,7 @@
// ================================================================================
status_t ProcrankParser::Parse(const int in, const int out) const {
Reader reader(in);
- string line, content;
+ string line;
header_t header; // the header of /d/wakeup_sources
record_t record; // retain each record
int nline = 0;
@@ -140,7 +170,7 @@
Procrank proto;
// parse line by line
- while (reader.readLine(line)) {
+ while (reader.readLine(&line)) {
if (line.empty()) continue;
// parse head line
@@ -149,6 +179,15 @@
continue;
}
+ if (hasPrefix(&line, "ZRAM:")) {
+ proto.mutable_summary()->mutable_zram()->set_raw_text(line);
+ continue;
+ }
+ if (hasPrefix(&line, "RAM:")) {
+ proto.mutable_summary()->mutable_ram()->set_raw_text(line);
+ continue;
+ }
+
record = parseRecord(line);
if (record.size() != header.size()) {
if (record[record.size() - 1] == "TOTAL") { // TOTAL record
@@ -156,12 +195,6 @@
for (int i=1; i<=(int)record.size(); i++) {
SetTableField(total, header[header.size() - i], record[record.size() - i]);
}
- } else if (record[0] == "ZRAM:") {
- record = parseRecord(line, ":");
- proto.mutable_summary()->mutable_zram()->set_raw_text(record[1]);
- } else if (record[0] == "RAM:") {
- record = parseRecord(line, ":");
- proto.mutable_summary()->mutable_ram()->set_raw_text(record[1]);
} else {
fprintf(stderr, "[%s]Line %d has missing fields\n%s\n", this->name.string(), nline,
line.c_str());
@@ -178,7 +211,7 @@
}
}
- if (!reader.ok(line)) {
+ if (!reader.ok(&line)) {
fprintf(stderr, "Bad read from fd %d: %s\n", in, line.c_str());
return -1;
}
@@ -189,4 +222,106 @@
}
fprintf(stderr, "[%s]Proto size: %d bytes\n", this->name.string(), proto.ByteSize());
return NO_ERROR;
-}
\ No newline at end of file
+}
+
+// ================================================================================
+status_t PageTypeInfoParser::Parse(const int in, const int out) const {
+ Reader reader(in);
+ string line;
+ bool migrateTypeSession = false;
+ int pageBlockOrder;
+ header_t blockHeader;
+
+ PageTypeInfo pageTypeInfo;
+
+ while (reader.readLine(&line)) {
+ if (line.empty()) {
+ migrateTypeSession = false;
+ blockHeader.clear();
+ continue;
+ }
+
+ if (hasPrefix(&line, "Page block order:")) {
+ pageBlockOrder = toInt(line);
+ pageTypeInfo.set_page_block_order(pageBlockOrder);
+ continue;
+ }
+ if (hasPrefix(&line, "Pages per block:")) {
+ pageTypeInfo.set_pages_per_block(toInt(line));
+ continue;
+ }
+ if (hasPrefix(&line, "Free pages count per migrate type at order")) {
+ migrateTypeSession = true;
+ continue;
+ }
+ if (hasPrefix(&line, "Number of blocks type")) {
+ blockHeader = parseHeader(line);
+ continue;
+ }
+
+ record_t record = parseRecord(line, COMMA_DELIMITER);
+ if (migrateTypeSession && record.size() == 3) {
+ MigrateTypeProto* migrateType = pageTypeInfo.add_migrate_types();
+ // expect part 0 starts with "Node"
+ if (hasPrefix(&record[0], "Node")) {
+ migrateType->set_node(toInt(record[0]));
+ } else goto ERROR;
+ // expect part 1 starts with "zone"
+ if (hasPrefix(&record[1], "zone")) {
+ migrateType->set_zone(record[1]);
+ } else goto ERROR;
+ // expect part 2 starts with "type"
+ if (hasPrefix(&record[2], "type")) {
+ // expect the rest of part 2 has number of (pageBlockOrder + 2) parts
+ // An example looks like:
+ // header line: type 0 1 2 3 4 5 6 7 8 9 10
+ // record line: Unmovable 426 279 226 1 1 1 0 0 2 2 0
+ // The pageBlockOrder = 10 and it's zero-indexed. so total parts
+ // are 10 + 1(zero-indexed) + 1(the type part) = 12.
+ record_t pageCounts = parseRecord(record[2]);
+ int pageCountsSize = pageBlockOrder + 2;
+ if ((int)pageCounts.size() != pageCountsSize) goto ERROR;
+
+ migrateType->set_type(pageCounts[0]);
+ for (auto i=1; i<pageCountsSize; i++) {
+ migrateType->add_free_pages_count(toInt(pageCounts[i]));
+ }
+ } else goto ERROR;
+ continue;
+ }
+
+ if (!blockHeader.empty() && record.size() == 2) {
+ BlockProto* block = pageTypeInfo.add_blocks();
+
+ if (hasPrefix(&record[0], "Node")) {
+ block->set_node(toInt(record[0]));
+ } else goto ERROR;
+
+ if (hasPrefix(&record[1], "zone")) {
+ record_t blockCounts = parseRecord(record[1]);
+ block->set_zone(blockCounts[0]);
+ for (size_t i=0; i<blockHeader.size(); i++) {
+ if (!SetTableField(block, blockHeader[i], blockCounts[i+1])) goto ERROR;
+ }
+ } else goto ERROR;
+
+ continue;
+ }
+
+ERROR: // print out error for this single line and continue parsing
+ fprintf(stderr, "[%s]Bad line: %s\n", this->name.string(), line.c_str());
+ }
+
+ if (!reader.ok(&line)) {
+ fprintf(stderr, "Bad read from fd %d: %s\n", in, line.c_str());
+ return -1;
+ }
+
+ if (!pageTypeInfo.SerializeToFileDescriptor(out)) {
+ fprintf(stderr, "[%s]Error writing proto back\n", this->name.string());
+ return -1;
+ }
+
+ fprintf(stderr, "[%s]Proto size: %d bytes\n", this->name.string(), pageTypeInfo.ByteSize());
+ return NO_ERROR;
+}
diff --git a/cmds/incident_helper/IncidentHelper.h b/cmds/incident_helper/IncidentHelper.h
index f319c41..d24d717 100644
--- a/cmds/incident_helper/IncidentHelper.h
+++ b/cmds/incident_helper/IncidentHelper.h
@@ -36,6 +36,17 @@
};
/**
+ * No op parser returns what it reads
+ */
+class NoopParser : public TextParserBase {
+public:
+ NoopParser() : TextParserBase(String8("NoopParser")) {};
+ ~NoopParser() {};
+
+ virtual status_t Parse(const int in, const int out) const;
+};
+
+/**
* This parser is used for testing only, results in timeout.
*/
class TimeoutParser : public TextParserBase {
@@ -69,6 +80,17 @@
};
/**
+ * PageTypeInfo parser, parses text to protobuf in /proc/pageinfotype
+ */
+class PageTypeInfoParser : public TextParserBase {
+public:
+ PageTypeInfoParser() : TextParserBase(String8("PageTypeInfo")) {};
+ ~PageTypeInfoParser() {};
+
+ virtual status_t Parse(const int in, const int out) const;
+};
+
+/**
* Procrank parser, parses text produced by command procrank
*/
class ProcrankParser : public TextParserBase {
diff --git a/cmds/incident_helper/ih_util.cpp b/cmds/incident_helper/ih_util.cpp
index b2fda23..2ab4b54 100644
--- a/cmds/incident_helper/ih_util.cpp
+++ b/cmds/incident_helper/ih_util.cpp
@@ -18,6 +18,7 @@
#include "ih_util.h"
+#include <algorithm>
#include <sstream>
#include <unistd.h>
@@ -72,6 +73,20 @@
return record;
}
+bool hasPrefix(std::string* line, const char* key) {
+ const auto head = line->find_first_not_of(DEFAULT_WHITESPACE);
+ if (head == std::string::npos) return false;
+ auto i = 0;
+ auto j = head;
+ while (key[i] != '\0') {
+ if (j >= line->size() || key[i++] != line->at(j++)) {
+ return false;
+ }
+ }
+ line->assign(trim(line->substr(j)));
+ return true;
+}
+
Reader::Reader(const int fd) : Reader(fd, BUFFER_SIZE) {};
Reader::Reader(const int fd, const size_t capacity)
@@ -86,8 +101,9 @@
free(mBuf);
}
-bool Reader::readLine(std::string& line, const char newline) {
+bool Reader::readLine(std::string* line, const char newline) {
if (!ok(line)) return false; // bad status
+ line->clear();
std::stringstream ss;
while (!EOR()) {
// read if available
@@ -124,14 +140,14 @@
if (mFlushed >= (int) mMaxSize) mFlushed = 0;
if (EOR() || meetsNewLine) {
- line.assign(ss.str());
+ line->assign(ss.str());
return true;
}
}
return false;
}
-bool Reader::ok(std::string& error) {
- error.assign(mStatus);
+bool Reader::ok(std::string* error) {
+ error->assign(mStatus);
return mStatus.empty();
}
diff --git a/cmds/incident_helper/ih_util.h b/cmds/incident_helper/ih_util.h
index 5598eed..ce5baee 100644
--- a/cmds/incident_helper/ih_util.h
+++ b/cmds/incident_helper/ih_util.h
@@ -28,10 +28,30 @@
const char DEFAULT_NEWLINE = '\n';
const std::string DEFAULT_WHITESPACE = " \t";
+/**
+ * When a text has a table format like this
+ * line 1: HeadA HeadB HeadC
+ * line 2: v1 v2 v3
+ * line 3: v11 v12 v13
+ *
+ * We want to parse the line in structure given the delimiter.
+ * parseHeader is used to parse the firse line of the table and returns a list of strings in lower case
+ * parseRecord is used to parse other lines and returns a list of strings
+ * empty strings are skipped
+ */
header_t parseHeader(const std::string& line, const std::string& delimiters = DEFAULT_WHITESPACE);
record_t parseRecord(const std::string& line, const std::string& delimiters = DEFAULT_WHITESPACE);
/**
+ * When the line starts with the given key, the function returns true
+ * as well as the line argument is changed to the rest part of the original.
+ * e.g. "ZRAM: 6828K physical used for 31076K in swap (524284K total swap)" becomes
+ * "6828K physical used for 31076K in swap (524284K total swap)" when given key "ZRAM:",
+ * otherwise the line is not changed.
+ */
+bool hasPrefix(std::string* line, const char* key);
+
+/**
* Reader class reads data from given fd in streaming fashion.
* The buffer size is controlled by capacity parameter.
*/
@@ -42,8 +62,8 @@
Reader(const int fd, const size_t capacity);
~Reader();
- bool readLine(std::string& line, const char newline = DEFAULT_NEWLINE);
- bool ok(std::string& error);
+ bool readLine(std::string* line, const char newline = DEFAULT_NEWLINE);
+ bool ok(std::string* error);
private:
int mFd; // set mFd to -1 when read EOF()
diff --git a/cmds/incident_helper/main.cpp b/cmds/incident_helper/main.cpp
index 333344b..52ff777 100644
--- a/cmds/incident_helper/main.cpp
+++ b/cmds/incident_helper/main.cpp
@@ -41,11 +41,15 @@
case -1:
return new TimeoutParser();
case 0:
+ return new NoopParser();
+ case 1: // 1 is reserved for incident header so it won't be section id
return new ReverseParser();
/* ========================================================================= */
- // IDs larger than 0 are reserved in incident.proto
+ // IDs larger than 1 are section ids reserved in incident.proto
case 2000:
return new ProcrankParser();
+ case 2001:
+ return new PageTypeInfoParser();
case 2002:
return new KernelWakesParser();
default:
diff --git a/cmds/incident_helper/testdata/pagetypeinfo.txt b/cmds/incident_helper/testdata/pagetypeinfo.txt
new file mode 100644
index 0000000..d45ddc4
--- /dev/null
+++ b/cmds/incident_helper/testdata/pagetypeinfo.txt
@@ -0,0 +1,10 @@
+Page block order: 10
+Pages per block: 1024
+
+Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10
+Node 0, zone DMA, type Unmovable 426 279 226 1 1 1 0 0 2 2 0
+Node 0, zone Normal, type Reclaimable 953 773 437 154 92 26 15 14 12 7 0
+
+Number of blocks type Unmovable Reclaimable Movable CMA Reserve Isolate
+Node 0, zone DMA 74 9 337 41 1 0
+Node 0, zone Normal 70 12 423 0 1 0
diff --git a/cmds/incident_helper/tests/IncidentHelper_test.cpp b/cmds/incident_helper/tests/IncidentHelper_test.cpp
index 04dd8de..c44a163 100644
--- a/cmds/incident_helper/tests/IncidentHelper_test.cpp
+++ b/cmds/incident_helper/tests/IncidentHelper_test.cpp
@@ -17,6 +17,7 @@
#include "IncidentHelper.h"
#include "frameworks/base/core/proto/android/os/kernelwake.pb.h"
+#include "frameworks/base/core/proto/android/os/pagetypeinfo.pb.h"
#include "frameworks/base/core/proto/android/os/procrank.pb.h"
#include <android-base/file.h>
@@ -29,6 +30,7 @@
using namespace android::base;
using namespace android::os;
+using namespace std;
using ::testing::StrEq;
using ::testing::Test;
using ::testing::internal::CaptureStderr;
@@ -42,8 +44,8 @@
ASSERT_TRUE(tf.fd != -1);
}
- std::string getSerializedString(::google::protobuf::Message& message) {
- std::string expectedStr;
+ string getSerializedString(::google::protobuf::Message& message) {
+ string expectedStr;
message.SerializeToFileDescriptor(tf.fd);
ReadFileToString(tf.path, &expectedStr);
return expectedStr;
@@ -52,8 +54,8 @@
protected:
TemporaryFile tf;
- const std::string kTestPath = GetExecutableDirectory();
- const std::string kTestDataPath = kTestPath + "/testdata/";
+ const string kTestPath = GetExecutableDirectory();
+ const string kTestDataPath = kTestPath + "/testdata/";
};
TEST_F(IncidentHelperTest, ReverseParser) {
@@ -69,7 +71,7 @@
}
TEST_F(IncidentHelperTest, KernelWakesParser) {
- const std::string testFile = kTestDataPath + "kernel_wakeups.txt";
+ const string testFile = kTestDataPath + "kernel_wakeups.txt";
KernelWakesParser parser;
KernelWakeSources expected;
@@ -107,7 +109,7 @@
}
TEST_F(IncidentHelperTest, ProcrankParser) {
- const std::string testFile = kTestDataPath + "procrank.txt";
+ const string testFile = kTestDataPath + "procrank.txt";
ProcrankParser parser;
Procrank expected;
@@ -159,7 +161,7 @@
}
TEST_F(IncidentHelperTest, ProcrankParserShortHeader) {
- const std::string testFile = kTestDataPath + "procrank_short.txt";
+ const string testFile = kTestDataPath + "procrank_short.txt";
ProcrankParser parser;
Procrank expected;
@@ -195,3 +197,59 @@
EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
close(fd);
}
+
+TEST_F(IncidentHelperTest, PageTypeInfoParser) {
+ const string testFile = kTestDataPath + "pagetypeinfo.txt";
+ PageTypeInfoParser parser;
+ PageTypeInfo expected;
+
+ expected.set_page_block_order(10);
+ expected.set_pages_per_block(1024);
+
+ MigrateTypeProto* mt1 = expected.add_migrate_types();
+ mt1->set_node(0);
+ mt1->set_zone("DMA");
+ mt1->set_type("Unmovable");
+ int arr1[] = { 426, 279, 226, 1, 1, 1, 0, 0, 2, 2, 0};
+ for (auto i=0; i<11; i++) {
+ mt1->add_free_pages_count(arr1[i]);
+ }
+
+ MigrateTypeProto* mt2 = expected.add_migrate_types();
+ mt2->set_node(0);
+ mt2->set_zone("Normal");
+ mt2->set_type("Reclaimable");
+ int arr2[] = { 953, 773, 437, 154, 92, 26, 15, 14, 12, 7, 0};
+ for (auto i=0; i<11; i++) {
+ mt2->add_free_pages_count(arr2[i]);
+ }
+
+ BlockProto* block1 = expected.add_blocks();
+ block1->set_node(0);
+ block1->set_zone("DMA");
+ block1->set_unmovable(74);
+ block1->set_reclaimable(9);
+ block1->set_movable(337);
+ block1->set_cma(41);
+ block1->set_reserve(1);
+ block1->set_isolate(0);
+
+
+ BlockProto* block2 = expected.add_blocks();
+ block2->set_node(0);
+ block2->set_zone("Normal");
+ block2->set_unmovable(70);
+ block2->set_reclaimable(12);
+ block2->set_movable(423);
+ block2->set_cma(0);
+ block2->set_reserve(1);
+ block2->set_isolate(0);
+
+ int fd = open(testFile.c_str(), O_RDONLY);
+ ASSERT_TRUE(fd != -1);
+
+ CaptureStdout();
+ ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
+ EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+ close(fd);
+}
\ No newline at end of file
diff --git a/cmds/incident_helper/tests/ih_util_test.cpp b/cmds/incident_helper/tests/ih_util_test.cpp
index 3b9ed40..da88ee3 100644
--- a/cmds/incident_helper/tests/ih_util_test.cpp
+++ b/cmds/incident_helper/tests/ih_util_test.cpp
@@ -69,14 +69,14 @@
Reader r(tf.fd);
string line;
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("test string"));
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("second"));
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("ooo"));
- ASSERT_FALSE(r.readLine(line));
- ASSERT_TRUE(r.ok(line));
+ ASSERT_FALSE(r.readLine(&line));
+ ASSERT_TRUE(r.ok(&line));
}
TEST(IhUtilTest, ReaderSmallBufSize) {
@@ -86,14 +86,14 @@
Reader r(tf.fd, 5);
string line;
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("test string"));
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("second"));
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("ooiecccojreo"));
- ASSERT_FALSE(r.readLine(line));
- ASSERT_TRUE(r.ok(line));
+ ASSERT_FALSE(r.readLine(&line));
+ ASSERT_TRUE(r.ok(&line));
}
TEST(IhUtilTest, ReaderEmpty) {
@@ -103,10 +103,10 @@
Reader r(tf.fd);
string line;
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
- ASSERT_FALSE(r.readLine(line));
- ASSERT_TRUE(r.ok(line));
+ ASSERT_FALSE(r.readLine(&line));
+ ASSERT_TRUE(r.ok(&line));
}
TEST(IhUtilTest, ReaderMultipleEmptyLines) {
@@ -116,35 +116,35 @@
Reader r(tf.fd);
string line;
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
- ASSERT_TRUE(r.readLine(line));
+ ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
- ASSERT_FALSE(r.readLine(line));
+ ASSERT_FALSE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
- ASSERT_TRUE(r.ok(line));
+ ASSERT_TRUE(r.ok(&line));
}
TEST(IhUtilTest, ReaderFailedNegativeFd) {
Reader r(-123);
string line;
- EXPECT_FALSE(r.readLine(line));
- EXPECT_FALSE(r.ok(line));
+ EXPECT_FALSE(r.readLine(&line));
+ EXPECT_FALSE(r.ok(&line));
EXPECT_THAT(line, StrEq("Negative fd"));
}
TEST(IhUtilTest, ReaderFailedZeroBufferSize) {
Reader r(23, 0);
string line;
- EXPECT_FALSE(r.readLine(line));
- EXPECT_FALSE(r.ok(line));
+ EXPECT_FALSE(r.readLine(&line));
+ EXPECT_FALSE(r.ok(&line));
EXPECT_THAT(line, StrEq("Zero buffer capacity"));
}
TEST(IhUtilTest, ReaderFailedBadFd) {
Reader r(1231432);
string line;
- EXPECT_FALSE(r.readLine(line));
- EXPECT_FALSE(r.ok(line));
+ EXPECT_FALSE(r.readLine(&line));
+ EXPECT_FALSE(r.ok(&line));
EXPECT_THAT(line, StrEq("Fail to read from fd"));
}
diff --git a/cmds/incidentd/Android.mk b/cmds/incidentd/Android.mk
index 835a7b9..830bf9e 100644
--- a/cmds/incidentd/Android.mk
+++ b/cmds/incidentd/Android.mk
@@ -23,10 +23,13 @@
LOCAL_MODULE := incidentd
LOCAL_SRC_FILES := \
+ src/EncodedBuffer.cpp \
src/FdBuffer.cpp \
src/IncidentService.cpp \
+ src/Privacy.cpp \
src/Reporter.cpp \
src/Section.cpp \
+ src/io_util.cpp \
src/main.cpp \
src/protobuf.cpp \
src/report_directory.cpp
@@ -69,7 +72,9 @@
gen_src_dir:=
GEN:=
+ifeq ($(BUILD_WITH_INCIDENTD_RC), true)
LOCAL_INIT_RC := incidentd.rc
+endif
include $(BUILD_EXECUTABLE)
@@ -88,12 +93,16 @@
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
LOCAL_SRC_FILES := \
+ src/EncodedBuffer.cpp \
src/FdBuffer.cpp \
+ src/Privacy.cpp \
src/Reporter.cpp \
src/Section.cpp \
+ src/io_util.cpp \
src/protobuf.cpp \
src/report_directory.cpp \
tests/section_list.cpp \
+ tests/EncodedBuffer_test.cpp \
tests/FdBuffer_test.cpp \
tests/Reporter_test.cpp \
tests/Section_test.cpp \
diff --git a/cmds/incidentd/incidentd.rc b/cmds/incidentd/incidentd.rc
index c1eed7f..fe38a71 100644
--- a/cmds/incidentd/incidentd.rc
+++ b/cmds/incidentd/incidentd.rc
@@ -14,3 +14,7 @@
service incidentd /system/bin/incidentd
class main
+
+on post-fs-data
+ # Create directory for incidentd
+ mkdir /data/misc/incidents 0770 root root
diff --git a/cmds/incidentd/src/EncodedBuffer.cpp b/cmds/incidentd/src/EncodedBuffer.cpp
new file mode 100644
index 0000000..e8f2c11
--- /dev/null
+++ b/cmds/incidentd/src/EncodedBuffer.cpp
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 "EncodedBuffer.h"
+#include "io_util.h"
+#include "protobuf.h"
+
+#include <deque>
+
+const size_t BUFFER_SIZE = 4 * 1024; // 4 KB
+
+/**
+ * Read varint from iterator, the iterator will point to next available byte.
+ * Return the number of bytes of the varint.
+ */
+static uint32_t
+read_raw_varint(FdBuffer::iterator* it)
+{
+ uint32_t val = 0;
+ int i = 0;
+ bool hasNext = true;
+ while (hasNext) {
+ hasNext = ((**it & 0x80) != 0);
+ val += (**it & 0x7F) << (7*i);
+ (*it)++;
+ i++;
+ }
+ return val;
+}
+
+/**
+ * Write the field to buf based on the wire type, iterator will point to next field.
+ * If skip is set to true, no data will be written to buf. Return number of bytes written.
+ */
+static size_t
+write_field_or_skip(FdBuffer::iterator* iter, vector<uint8_t>* buf, uint8_t wireType, bool skip)
+{
+ FdBuffer::iterator snapshot = iter->snapshot();
+ size_t bytesToWrite = 0;
+ uint32_t varint = 0;
+ switch (wireType) {
+ case WIRE_TYPE_VARINT:
+ varint = read_raw_varint(iter);
+ if(!skip) return write_raw_varint(buf, varint);
+ break;
+ case WIRE_TYPE_FIXED64:
+ bytesToWrite = 8;
+ break;
+ case WIRE_TYPE_LENGTH_DELIMITED:
+ bytesToWrite = read_raw_varint(iter);
+ if(!skip) write_raw_varint(buf, bytesToWrite);
+ break;
+ case WIRE_TYPE_FIXED32:
+ bytesToWrite = 4;
+ break;
+ }
+ if (skip) {
+ *iter += bytesToWrite;
+ } else {
+ for (size_t i=0; i<bytesToWrite; i++) {
+ buf->push_back(**iter);
+ (*iter)++;
+ }
+ }
+ return skip ? 0 : *iter - snapshot;
+}
+
+/**
+ * Strip next field based on its private policy and request spec, then stores data in buf.
+ * Return NO_ERROR if succeeds, otherwise BAD_VALUE is returned to indicate bad data in FdBuffer.
+ *
+ * The iterator must point to the head of a protobuf formatted field for successful operation.
+ * After exit with NO_ERROR, iterator points to the next protobuf field's head.
+ */
+static status_t
+stripField(FdBuffer::iterator* iter, vector<uint8_t>* buf, const Privacy* parentPolicy, const PrivacySpec& spec)
+{
+ if (iter->outOfBound() || parentPolicy == NULL) return BAD_VALUE;
+
+ uint32_t varint = read_raw_varint(iter);
+ uint8_t wireType = read_wire_type(varint);
+ uint32_t fieldId = read_field_id(varint);
+ const Privacy* policy = parentPolicy->lookup(fieldId);
+
+ if (policy == NULL || !policy->IsMessageType() || !policy->HasChildren()) {
+ bool skip = !spec.CheckPremission(policy);
+ size_t amt = buf->size();
+ if (!skip) amt += write_header(buf, fieldId, wireType);
+ amt += write_field_or_skip(iter, buf, wireType, skip); // point to head of next field
+ return buf->size() != amt ? BAD_VALUE : NO_ERROR;
+ }
+ // current field is message type and its sub-fields have extra privacy policies
+ deque<vector<uint8_t>> q;
+ uint32_t msgSize = read_raw_varint(iter);
+ size_t finalSize = 0;
+ FdBuffer::iterator start = iter->snapshot();
+ while ((*iter - start) != (int)msgSize) {
+ vector<uint8_t> v;
+ status_t err = stripField(iter, &v, policy, spec);
+ if (err != NO_ERROR) return err;
+ if (v.empty()) continue;
+ q.push_back(v);
+ finalSize += v.size();
+ }
+
+ write_header(buf, fieldId, wireType);
+ write_raw_varint(buf, finalSize);
+ buf->reserve(finalSize); // reserve the size of the field
+ while (!q.empty()) {
+ vector<uint8_t> subField = q.front();
+ for (vector<uint8_t>::iterator it = subField.begin(); it != subField.end(); it++) {
+ buf->push_back(*it);
+ }
+ q.pop_front();
+ }
+ return NO_ERROR;
+}
+
+// ================================================================================
+EncodedBuffer::EncodedBuffer(const FdBuffer& buffer, const Privacy* policy)
+ : mFdBuffer(buffer),
+ mPolicy(policy),
+ mBuffers(),
+ mSize(0)
+{
+}
+
+EncodedBuffer::~EncodedBuffer()
+{
+}
+
+status_t
+EncodedBuffer::strip(const PrivacySpec& spec)
+{
+ // optimization when no strip happens
+ if (mPolicy == NULL || !mPolicy->HasChildren() || spec.RequireAll()) {
+ if (spec.CheckPremission(mPolicy)) mSize = mFdBuffer.size();
+ return NO_ERROR;
+ }
+
+ FdBuffer::iterator it = mFdBuffer.begin();
+ vector<uint8_t> field;
+ field.reserve(BUFFER_SIZE);
+
+ while (it != mFdBuffer.end()) {
+ status_t err = stripField(&it, &field, mPolicy, spec);
+ if (err != NO_ERROR) return err;
+ if (field.size() > BUFFER_SIZE) { // rotate to another chunk if buffer size exceeds
+ mBuffers.push_back(field);
+ mSize += field.size();
+ field.clear();
+ }
+ }
+ if (!field.empty()) {
+ mBuffers.push_back(field);
+ mSize += field.size();
+ }
+ return NO_ERROR;
+}
+
+void
+EncodedBuffer::clear()
+{
+ mSize = 0;
+ mBuffers.clear();
+}
+
+size_t
+EncodedBuffer::size() const { return mSize; }
+
+status_t
+EncodedBuffer::flush(int fd)
+{
+ if (size() == mFdBuffer.size()) return mFdBuffer.flush(fd);
+
+ for (vector<vector<uint8_t>>::iterator it = mBuffers.begin(); it != mBuffers.end(); it++) {
+ status_t err = write_all(fd, it->data(), it->size());
+ if (err != NO_ERROR) return err;
+ }
+ return NO_ERROR;
+}
+
diff --git a/cmds/incidentd/src/EncodedBuffer.h b/cmds/incidentd/src/EncodedBuffer.h
new file mode 100644
index 0000000..ea8603a
--- /dev/null
+++ b/cmds/incidentd/src/EncodedBuffer.h
@@ -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.
+ */
+
+#ifndef ENCODED_BUFFER_H
+#define ENCODED_BUFFER_H
+
+#include "FdBuffer.h"
+#include "Privacy.h"
+
+#include <stdint.h>
+#include <vector>
+
+/**
+ * EncodedBuffer is constructed from FdBuffer which holds original protobuf formatted data and
+ * its privacy policy in its tagged proto message. The class strips PII-sensitive fields
+ * based on the request and holds stripped data in its buffer for output.
+ */
+class EncodedBuffer
+{
+public:
+ EncodedBuffer(const FdBuffer& buffer, const Privacy* policy);
+ ~EncodedBuffer();
+
+ /**
+ * Strip based on the request and hold data in its own buffer. Return NO_ERROR if strip succeeds.
+ */
+ status_t strip(const PrivacySpec& spec);
+
+ /**
+ * Clear encoded buffer so it can be reused by another request.
+ */
+ void clear();
+
+ /**
+ * Return the size of the stripped data.
+ */
+ size_t size() const;
+
+ /**
+ * Flush buffer to the given fd. NO_ERROR is returned if the flush succeeds.
+ */
+ status_t flush(int fd);
+
+private:
+ const FdBuffer& mFdBuffer;
+ const Privacy* mPolicy;
+ vector<vector<uint8_t>> mBuffers;
+ size_t mSize;
+};
+
+#endif // ENCODED_BUFFER_H
\ No newline at end of file
diff --git a/cmds/incidentd/src/FdBuffer.cpp b/cmds/incidentd/src/FdBuffer.cpp
index 4d6a36c..bb399b5 100644
--- a/cmds/incidentd/src/FdBuffer.cpp
+++ b/cmds/incidentd/src/FdBuffer.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "incidentd"
#include "FdBuffer.h"
+#include "io_util.h"
#include <cutils/log.h>
#include <utils/SystemClock.h>
@@ -239,25 +240,32 @@
}
size_t
-FdBuffer::size()
+FdBuffer::size() const
{
if (mBuffers.empty()) return 0;
return ((mBuffers.size() - 1) * BUFFER_SIZE) + mCurrentWritten;
}
status_t
-FdBuffer::write(ReportRequestSet* reporter)
+FdBuffer::flush(int fd) const
{
- const int N = mBuffers.size() - 1;
- for (int i=0; i<N; i++) {
- reporter->write(mBuffers[i], BUFFER_SIZE);
+ size_t i=0;
+ status_t err = NO_ERROR;
+ for (i=0; i<mBuffers.size()-1; i++) {
+ err = write_all(fd, mBuffers[i], BUFFER_SIZE);
+ if (err != NO_ERROR) return err;
}
- reporter->write(mBuffers[N], mCurrentWritten);
- return NO_ERROR;
+ return write_all(fd, mBuffers[i], mCurrentWritten);
}
FdBuffer::iterator
-FdBuffer::end()
+FdBuffer::begin() const
+{
+ return iterator(*this, 0, 0);
+}
+
+FdBuffer::iterator
+FdBuffer::end() const
{
if (mBuffers.empty() || mCurrentWritten < 0) return begin();
if (mCurrentWritten == BUFFER_SIZE)
@@ -266,6 +274,17 @@
return FdBuffer::iterator(*this, mBuffers.size() - 1, mCurrentWritten);
}
+// ===============================================================================
+FdBuffer::iterator::iterator(const FdBuffer& buffer, ssize_t index, ssize_t offset)
+ : mFdBuffer(buffer),
+ mIndex(index),
+ mOffset(offset)
+{
+}
+
+FdBuffer::iterator&
+FdBuffer::iterator::operator=(iterator& other) const { return other; }
+
FdBuffer::iterator&
FdBuffer::iterator::operator+(size_t offset)
{
@@ -278,8 +297,50 @@
return *this;
}
+FdBuffer::iterator&
+FdBuffer::iterator::operator+=(size_t offset) { return *this + offset; }
+
+FdBuffer::iterator&
+FdBuffer::iterator::operator++() { return *this + 1; }
+
+FdBuffer::iterator
+FdBuffer::iterator::operator++(int) { return *this + 1; }
+
+bool
+FdBuffer::iterator::operator==(iterator other) const
+{
+ return mIndex == other.mIndex && mOffset == other.mOffset;
+}
+
+bool
+FdBuffer::iterator::operator!=(iterator other) const { return !(*this == other); }
+
+int
+FdBuffer::iterator::operator-(iterator other) const
+{
+ return (int)bytesRead() - (int)other.bytesRead();
+}
+
+FdBuffer::iterator::reference
+FdBuffer::iterator::operator*() const
+{
+ return mFdBuffer.mBuffers[mIndex][mOffset];
+}
+
+FdBuffer::iterator
+FdBuffer::iterator::snapshot() const
+{
+ return FdBuffer::iterator(mFdBuffer, mIndex, mOffset);
+}
+
size_t
-FdBuffer::iterator::bytesRead()
+FdBuffer::iterator::bytesRead() const
{
return mIndex * BUFFER_SIZE + mOffset;
}
+
+bool
+FdBuffer::iterator::outOfBound() const
+{
+ return bytesRead() > mFdBuffer.size();
+}
diff --git a/cmds/incidentd/src/FdBuffer.h b/cmds/incidentd/src/FdBuffer.h
index e9a53ff..dfe39c6 100644
--- a/cmds/incidentd/src/FdBuffer.h
+++ b/cmds/incidentd/src/FdBuffer.h
@@ -17,8 +17,6 @@
#ifndef FD_BUFFER_H
#define FD_BUFFER_H
-#include "Reporter.h"
-
#include <utils/Errors.h>
#include <vector>
@@ -55,7 +53,7 @@
/**
* Whether we timed out.
*/
- bool timedOut() { return mTimedOut; }
+ bool timedOut() const { return mTimedOut; }
/**
* If more than 4 MB is read, we truncate the data and return success.
@@ -65,23 +63,22 @@
* happens, truncated() will return true so it can be marked. If the data is
* exactly 4 MB, truncated is still set. Sorry.
*/
- bool truncated() { return mTruncated; }
+ bool truncated() const { return mTruncated; }
/**
* How much data was read.
*/
- size_t size();
+ size_t size() const;
/**
- * [Deprecated] Write the data that we recorded to the fd given.
- * TODO: remove it once the iterator api is working
+ * Flush all the data to given file descriptor;
*/
- status_t write(ReportRequestSet* requests);
+ status_t flush(int fd) const;
/**
* How long the read took in milliseconds.
*/
- int64_t durationMs() { return mFinishTime - mStartTime; }
+ int64_t durationMs() const { return mFinishTime - mStartTime; }
/**
* Read data stored in FdBuffer
@@ -89,30 +86,31 @@
class iterator;
friend class iterator;
class iterator : public std::iterator<std::random_access_iterator_tag, uint8_t> {
+ public:
+ iterator(const FdBuffer& buffer, ssize_t index, ssize_t offset);
+ iterator& operator=(iterator& other) const;
+ iterator& operator+(size_t offset);
+ iterator& operator+=(size_t offset);
+ iterator& operator++();
+ iterator operator++(int);
+ bool operator==(iterator other) const;
+ bool operator!=(iterator other) const;
+ int operator-(iterator other) const;
+ reference operator*() const;
+
+ // return the snapshot of the current iterator
+ iterator snapshot() const;
+ // how many bytes are read
+ size_t bytesRead() const;
+ // random access could make the iterator out of bound
+ bool outOfBound() const;
private:
- FdBuffer& mFdBuffer;
+ const FdBuffer& mFdBuffer;
size_t mIndex;
size_t mOffset;
- public:
- explicit iterator(FdBuffer& buffer, ssize_t index, ssize_t offset)
- : mFdBuffer(buffer), mIndex(index), mOffset(offset) {}
- iterator& operator=(iterator& other) { return other; }
- iterator& operator+(size_t offset); // this is implemented in .cpp
- iterator& operator+=(size_t offset) { return *this + offset; }
- iterator& operator++() { return *this + 1; }
- iterator operator++(int) { return *this + 1; }
- bool operator==(iterator other) const {
- return mIndex == other.mIndex && mOffset == other.mOffset;
- }
- bool operator!=(iterator other) const { return !(*this == other); }
- reference operator*() const { return mFdBuffer.mBuffers[mIndex][mOffset]; }
-
- // random access could make the iterator out of bound
- size_t bytesRead();
- bool outOfBound() { return bytesRead() > mFdBuffer.size(); };
};
- iterator begin() { return iterator(*this, 0, 0); }
- iterator end();
+ iterator begin() const;
+ iterator end() const;
private:
vector<uint8_t*> mBuffers;
@@ -123,19 +121,4 @@
bool mTruncated;
};
-class Fpipe {
-public:
- Fpipe() {}
- bool close() { return !(::close(mFds[0]) || ::close(mFds[1])); }
- ~Fpipe() { close(); }
-
- inline bool init() { return pipe(mFds) != -1; }
- inline int readFd() const { return mFds[0]; }
- inline int writeFd() const { return mFds[1]; }
-
-private:
- int mFds[2];
-};
-
-
#endif // FD_BUFFER_H
diff --git a/cmds/incidentd/src/Privacy.cpp b/cmds/incidentd/src/Privacy.cpp
new file mode 100644
index 0000000..e7969e7
--- /dev/null
+++ b/cmds/incidentd/src/Privacy.cpp
@@ -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.
+ */
+
+#include "Privacy.h"
+
+#include <stdlib.h>
+
+// DESTINATION enum value
+const uint8_t DEST_LOCAL = 0;
+const uint8_t DEST_EXPLICIT = 1;
+const uint8_t DEST_AUTOMATIC = 2;
+
+// type of the field, identitical to protobuf definition
+const uint8_t TYPE_STRING = 9;
+const uint8_t TYPE_MESSAGE = 11;
+
+bool
+Privacy::IsMessageType() const { return type == TYPE_MESSAGE; }
+
+bool
+Privacy::IsStringType() const { return type == TYPE_STRING; }
+
+bool
+Privacy::HasChildren() const { return children != NULL && children[0] != NULL; }
+
+const Privacy*
+Privacy::lookup(uint32_t fieldId) const
+{
+ if (children == NULL) return NULL;
+ for (int i=0; children[i] != NULL; i++) {
+ if (children[i]->field_id == fieldId) return children[i];
+ // This assumes the list's field id is in ascending order and must be true.
+ if (children[i]->field_id > fieldId) return NULL;
+ }
+ return NULL;
+}
+
+static bool allowDest(const uint8_t dest, const uint8_t policy)
+{
+ switch (policy) {
+ case DEST_LOCAL:
+ return dest == DEST_LOCAL;
+ case DEST_EXPLICIT:
+ return dest == DEST_LOCAL || dest == DEST_EXPLICIT;
+ case DEST_AUTOMATIC:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool
+PrivacySpec::operator<(const PrivacySpec& other) const
+{
+ return dest < other.dest;
+}
+
+bool
+PrivacySpec::CheckPremission(const Privacy* privacy) const
+{
+ uint8_t policy = privacy == NULL ? DEST_DEFAULT_VALUE : privacy->dest;
+ return allowDest(dest, policy);
+}
+
+bool
+PrivacySpec::RequireAll() const { return dest == DEST_LOCAL; }
+
+PrivacySpec new_spec_from_args(int dest) {
+ if (dest < 0) return PrivacySpec();
+ return PrivacySpec(dest);
+}
+
+PrivacySpec get_default_dropbox_spec() { return PrivacySpec(DEST_AUTOMATIC); }
\ No newline at end of file
diff --git a/cmds/incidentd/src/Privacy.h b/cmds/incidentd/src/Privacy.h
new file mode 100644
index 0000000..7f1977e
--- /dev/null
+++ b/cmds/incidentd/src/Privacy.h
@@ -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.
+ */
+
+#ifndef PRIVACY_H
+#define PRIVACY_H
+
+#include <stdint.h>
+
+// This is the default value of DEST enum
+const uint8_t DEST_DEFAULT_VALUE = 1;
+
+/*
+ * In order not to depend on libprotobuf-cpp-full nor libplatformprotos in incidentd,
+ * privacy options's data structure are explicitly redefined in this file.
+ */
+struct Privacy {
+ uint32_t field_id;
+ uint8_t type;
+ // ignore parent's privacy flags if children are set, NULL-terminated
+ Privacy** children;
+
+ // the following fields are identitical to
+ // frameworks/base/libs/incident/proto/android/privacy.proto
+ uint8_t dest;
+ const char** patterns; // only set when type is string
+
+ bool IsMessageType() const;
+ bool IsStringType() const;
+ bool HasChildren() const;
+ const Privacy* lookup(uint32_t fieldId) const;
+};
+
+/**
+ * PrivacySpec defines the request has what level of privacy authorization.
+ * For example, a device without user consent should only be able to upload AUTOMATIC fields.
+ */
+class PrivacySpec {
+public:
+ const uint8_t dest;
+
+ PrivacySpec() : dest(DEST_DEFAULT_VALUE) {}
+ PrivacySpec(uint8_t dest) : dest(dest) {}
+
+ bool operator<(const PrivacySpec& other) const;
+
+ bool CheckPremission(const Privacy* privacy) const;
+ bool RequireAll() const;
+};
+
+PrivacySpec new_spec_from_args(int dest);
+PrivacySpec get_default_dropbox_spec();
+
+#endif // PRIVACY_H
diff --git a/cmds/incidentd/src/Reporter.cpp b/cmds/incidentd/src/Reporter.cpp
index 4ffc119..11347e2 100644
--- a/cmds/incidentd/src/Reporter.cpp
+++ b/cmds/incidentd/src/Reporter.cpp
@@ -17,7 +17,6 @@
#define LOG_TAG "incidentd"
#include "Reporter.h"
-#include "protobuf.h"
#include "report_directory.h"
#include "section_list.h"
@@ -38,20 +37,6 @@
static const char* INCIDENT_DIRECTORY = "/data/misc/incidents/";
// ================================================================================
-static status_t write_all(int fd, uint8_t const* buf, size_t size)
-{
- while (size > 0) {
- ssize_t amt = ::write(fd, buf, size);
- if (amt < 0) {
- return -errno;
- }
- size -= amt;
- buf += amt;
- }
- return NO_ERROR;
-}
-
-// ================================================================================
ReportRequest::ReportRequest(const IncidentReportArgs& a,
const sp<IIncidentReportStatusListener> &l, int f)
:args(a),
@@ -65,11 +50,16 @@
{
}
+bool
+ReportRequest::ok()
+{
+ return fd >= 0 && err == NO_ERROR;
+}
+
// ================================================================================
ReportRequestSet::ReportRequestSet()
:mRequests(),
mSections(),
- mWritableCount(0),
mMainFd(-1)
{
}
@@ -84,45 +74,12 @@
{
mRequests.push_back(request);
mSections.merge(request->args);
- mWritableCount++;
}
void
ReportRequestSet::setMainFd(int fd)
{
mMainFd = fd;
- mWritableCount++;
-}
-
-status_t
-ReportRequestSet::write(uint8_t const* buf, size_t size)
-{
- status_t err = EBADF;
-
- // The streaming ones
- int const N = mRequests.size();
- for (int i=N-1; i>=0; i--) {
- sp<ReportRequest> request = mRequests[i];
- if (request->fd >= 0 && request->err == NO_ERROR) {
- err = write_all(request->fd, buf, size);
- if (err != NO_ERROR) {
- request->err = err;
- mWritableCount--;
- }
- }
- }
-
- // The dropbox file
- if (mMainFd >= 0) {
- err = write_all(mMainFd, buf, size);
- if (err != NO_ERROR) {
- mMainFd = -1;
- mWritableCount--;
- }
- }
-
- // Return an error only when there are no FDs to write.
- return mWritableCount > 0 ? NO_ERROR : err;
}
bool
@@ -164,6 +121,7 @@
status_t err = NO_ERROR;
bool needMainFd = false;
int mainFd = -1;
+ HeaderSection headers;
// See if we need the main file
for (ReportRequestSet::iterator it=batch.begin(); it!=batch.end(); it++) {
@@ -176,7 +134,7 @@
// Create the directory
if (!isTest) err = create_directory(mIncidentDirectory);
if (err != NO_ERROR) {
- goto done;
+ goto DONE;
}
// If there are too many files in the directory (for whatever reason),
@@ -187,7 +145,7 @@
// Open the file.
err = create_file(&mainFd);
if (err != NO_ERROR) {
- goto done;
+ goto DONE;
}
// Add to the set
@@ -202,24 +160,7 @@
}
// Write the incident headers
- for (ReportRequestSet::iterator it=batch.begin(); it!=batch.end(); it++) {
- const sp<ReportRequest> request = (*it);
- const vector<vector<int8_t>>& headers = request->args.headers();
-
- for (vector<vector<int8_t>>::const_iterator buf=headers.begin(); buf!=headers.end();
- buf++) {
- int fd = request->fd >= 0 ? request->fd : mainFd;
-
- uint8_t buffer[20];
- uint8_t* p = write_length_delimited_tag_header(buffer, FIELD_ID_INCIDENT_HEADER,
- buf->size());
- write_all(fd, buffer, p-buffer);
-
- write_all(fd, (uint8_t const*)buf->data(), buf->size());
- // If there was an error now, there will be an error later and we will remove
- // it from the list then.
- }
- }
+ headers.Execute(&batch);
// For each of the report fields, see if we need it, and if so, execute the command
// and report to those that care that we're doing it.
@@ -240,7 +181,7 @@
if (err != NO_ERROR) {
ALOGW("Incident section %s (%d) failed. Stopping report.",
(*section)->name.string(), id);
- goto done;
+ goto DONE;
}
// Notify listener of starting
@@ -254,7 +195,7 @@
}
}
-done:
+DONE:
// Close the file.
if (mainFd >= 0) {
close(mainFd);
diff --git a/cmds/incidentd/src/Reporter.h b/cmds/incidentd/src/Reporter.h
index 509611c..2615c62 100644
--- a/cmds/incidentd/src/Reporter.h
+++ b/cmds/incidentd/src/Reporter.h
@@ -40,6 +40,8 @@
ReportRequest(const IncidentReportArgs& args,
const sp<IIncidentReportStatusListener> &listener, int fd);
virtual ~ReportRequest();
+
+ bool ok(); // returns true if the request is ok for write.
};
// ================================================================================
@@ -52,21 +54,16 @@
void add(const sp<ReportRequest>& request);
void setMainFd(int fd);
- // Write to all of the fds for the requests. If a write fails, it stops
- // writing to that fd and returns NO_ERROR. When we are out of fds to write
- // to it returns an error.
- status_t write(uint8_t const* buf, size_t size);
-
typedef vector<sp<ReportRequest>>::iterator iterator;
iterator begin() { return mRequests.begin(); }
iterator end() { return mRequests.end(); }
+ int mainFd() { return mMainFd; }
bool containsSection(int id);
private:
vector<sp<ReportRequest>> mRequests;
IncidentReportArgs mSections;
- int mWritableCount;
int mMainFd;
};
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index ac87fe3..166fef0 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -16,11 +16,18 @@
#define LOG_TAG "incidentd"
+#include "EncodedBuffer.h"
+#include "FdBuffer.h"
+#include "Privacy.h"
#include "Section.h"
+
+#include "io_util.h"
#include "protobuf.h"
+#include "section_list.h"
#include <private/android_filesystem_config.h>
#include <binder/IServiceManager.h>
+#include <map>
#include <mutex>
#include <wait.h>
#include <unistd.h>
@@ -32,7 +39,7 @@
const char* INCIDENT_HELPER = "/system/bin/incident_helper";
static pid_t
-forkAndExecuteIncidentHelper(const int id, const char* name, Fpipe& p2cPipe, Fpipe& c2pPipe)
+fork_execute_incident_helper(const int id, const char* name, Fpipe& p2cPipe, Fpipe& c2pPipe)
{
const char* ihArgs[] { INCIDENT_HELPER, "-s", String8::format("%d", id).string(), NULL };
@@ -66,14 +73,15 @@
return pid;
}
-static status_t killChild(pid_t pid) {
+// ================================================================================
+static status_t kill_child(pid_t pid) {
int status;
kill(pid, SIGKILL);
if (waitpid(pid, &status, 0) == -1) return -1;
return WIFEXITED(status) == 0 ? NO_ERROR : -WEXITSTATUS(status);
}
-static status_t waitForChild(pid_t pid) {
+static status_t wait_child(pid_t pid) {
int status;
bool died = false;
// wait for child to report status up to 1 seconds
@@ -82,13 +90,98 @@
// sleep for 0.2 second
nanosleep(&WAIT_INTERVAL_NS, NULL);
}
- if (!died) return killChild(pid);
+ if (!died) return kill_child(pid);
return WIFEXITED(status) == 0 ? NO_ERROR : -WEXITSTATUS(status);
}
+// ================================================================================
+static const Privacy*
+get_privacy_of_section(int id)
+{
+ int l = 0;
+ int r = PRIVACY_POLICY_COUNT - 1;
+ while (l <= r) {
+ int mid = (l + r) >> 1;
+ const Privacy* p = PRIVACY_POLICY_LIST[mid];
+
+ if (p->field_id < (uint32_t)id) {
+ l = mid + 1;
+ } else if (p->field_id > (uint32_t)id) {
+ r = mid - 1;
+ } else {
+ return p;
+ }
+ }
+ return NULL;
+}
+
+// ================================================================================
+static status_t
+write_section_header(int fd, int sectionId, size_t size)
+{
+ uint8_t buf[20];
+ uint8_t *p = write_length_delimited_tag_header(buf, sectionId, size);
+ return write_all(fd, buf, p-buf);
+}
+
+static status_t
+write_report_requests(const int id, const FdBuffer& buffer, ReportRequestSet* requests)
+{
+ status_t err = -EBADF;
+ EncodedBuffer encodedBuffer(buffer, get_privacy_of_section(id));
+ int writeable = 0;
+
+ // The streaming ones, group requests by spec in order to save unnecessary strip operations
+ map<PrivacySpec, vector<sp<ReportRequest>>> requestsBySpec;
+ for (ReportRequestSet::iterator it = requests->begin(); it != requests->end(); it++) {
+ sp<ReportRequest> request = *it;
+ if (!request->ok() || !request->args.containsSection(id)) {
+ continue; // skip invalid request
+ }
+ PrivacySpec spec = new_spec_from_args(request->args.dest());
+ requestsBySpec[spec].push_back(request);
+ }
+
+ for (map<PrivacySpec, vector<sp<ReportRequest>>>::iterator mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) {
+ PrivacySpec spec = mit->first;
+ err = encodedBuffer.strip(spec);
+ if (err != NO_ERROR) return err; // it means the encodedBuffer data is corrupted.
+ if (encodedBuffer.size() == 0) continue;
+
+ for (vector<sp<ReportRequest>>::iterator it = mit->second.begin(); it != mit->second.end(); it++) {
+ sp<ReportRequest> request = *it;
+ err = write_section_header(request->fd, id, encodedBuffer.size());
+ if (err != NO_ERROR) { request->err = err; continue; }
+ err = encodedBuffer.flush(request->fd);
+ if (err != NO_ERROR) { request->err = err; continue; }
+ writeable++;
+ ALOGD("Section %d flushed %zu bytes to fd %d with spec %d", id, encodedBuffer.size(), request->fd, spec.dest);
+ }
+ encodedBuffer.clear();
+ }
+
+ // The dropbox file
+ if (requests->mainFd() >= 0) {
+ err = encodedBuffer.strip(get_default_dropbox_spec());
+ if (err != NO_ERROR) return err; // the buffer data is corrupted.
+ if (encodedBuffer.size() == 0) goto DONE;
+
+ err = write_section_header(requests->mainFd(), id, encodedBuffer.size());
+ if (err != NO_ERROR) { requests->setMainFd(-1); goto DONE; }
+ err = encodedBuffer.flush(requests->mainFd());
+ if (err != NO_ERROR) { requests->setMainFd(-1); goto DONE; }
+ writeable++;
+ ALOGD("Section %d flushed %zu bytes to dropbox %d", id, encodedBuffer.size(), requests->mainFd());
+ }
+
+DONE:
+ // only returns error if there is no fd to write to.
+ return writeable > 0 ? NO_ERROR : err;
+}
// ================================================================================
Section::Section(int i, const int64_t timeoutMs)
- :id(i), timeoutMs(timeoutMs)
+ :id(i),
+ timeoutMs(timeoutMs)
{
}
@@ -96,24 +189,50 @@
{
}
-status_t
-Section::WriteHeader(ReportRequestSet* requests, size_t size) const
+// ================================================================================
+HeaderSection::HeaderSection()
+ :Section(FIELD_ID_INCIDENT_HEADER, 0)
{
- ssize_t amt;
- uint8_t buf[20];
- uint8_t* p = write_length_delimited_tag_header(buf, this->id, size);
- return requests->write(buf, p-buf);
+}
+
+HeaderSection::~HeaderSection()
+{
+}
+
+status_t
+HeaderSection::Execute(ReportRequestSet* requests) const
+{
+ for (ReportRequestSet::iterator it=requests->begin(); it!=requests->end(); it++) {
+ const sp<ReportRequest> request = *it;
+ const vector<vector<int8_t>>& headers = request->args.headers();
+
+ for (vector<vector<int8_t>>::const_iterator buf=headers.begin(); buf!=headers.end(); buf++) {
+ if (buf->empty()) continue;
+
+ // So the idea is only requests with negative fd are written to dropbox file.
+ int fd = request->fd >= 0 ? request->fd : requests->mainFd();
+ write_section_header(fd, FIELD_ID_INCIDENT_HEADER, buf->size());
+ write_all(fd, (uint8_t const*)buf->data(), buf->size());
+ // If there was an error now, there will be an error later and we will remove
+ // it from the list then.
+ }
+ }
+ return NO_ERROR;
}
// ================================================================================
FileSection::FileSection(int id, const char* filename, const int64_t timeoutMs)
- : Section(id, timeoutMs), mFilename(filename) {
+ :Section(id, timeoutMs),
+ mFilename(filename)
+{
name = filename;
}
FileSection::~FileSection() {}
-status_t FileSection::Execute(ReportRequestSet* requests) const {
+status_t
+FileSection::Execute(ReportRequestSet* requests) const
+{
// read from mFilename first, make sure the file is available
// add O_CLOEXEC to make sure it is closed when exec incident helper
int fd = open(mFilename, O_RDONLY | O_CLOEXEC);
@@ -131,7 +250,7 @@
return -errno;
}
- pid_t pid = forkAndExecuteIncidentHelper(this->id, this->name.string(), p2cPipe, c2pPipe);
+ pid_t pid = fork_execute_incident_helper(this->id, this->name.string(), p2cPipe, c2pPipe);
if (pid == -1) {
ALOGW("FileSection '%s' failed to fork", this->name.string());
return -errno;
@@ -143,11 +262,11 @@
if (readStatus != NO_ERROR || buffer.timedOut()) {
ALOGW("FileSection '%s' failed to read data from incident helper: %s, timedout: %s, kill: %s",
this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false",
- strerror(-killChild(pid)));
+ strerror(-kill_child(pid)));
return readStatus;
}
- status_t ihStatus = waitForChild(pid);
+ status_t ihStatus = wait_child(pid);
if (ihStatus != NO_ERROR) {
ALOGW("FileSection '%s' abnormal child process: %s", this->name.string(), strerror(-ihStatus));
return ihStatus;
@@ -155,8 +274,7 @@
ALOGD("FileSection '%s' wrote %zd bytes in %d ms", this->name.string(), buffer.size(),
(int)buffer.durationMs());
- WriteHeader(requests, buffer.size());
- status_t err = buffer.write(requests);
+ status_t err = write_report_requests(this->id, buffer, requests);
if (err != NO_ERROR) {
ALOGW("FileSection '%s' failed writing: %s", this->name.string(), strerror(-err));
return err;
@@ -313,8 +431,7 @@
// Write the data that was collected
ALOGD("WorkerThreadSection '%s' wrote %zd bytes in %d ms", name.string(), buffer.size(),
(int)buffer.durationMs());
- WriteHeader(requests, buffer.size());
- err = buffer.write(requests);
+ err = write_report_requests(this->id, buffer, requests);
if (err != NO_ERROR) {
ALOGW("WorkerThreadSection '%s' failed writing: '%s'", this->name.string(), strerror(-err));
return err;
@@ -324,7 +441,8 @@
}
// ================================================================================
-void CommandSection::init(const char* command, va_list args)
+void
+CommandSection::init(const char* command, va_list args)
{
va_list copied_args;
int numOfArgs = 0;
@@ -350,7 +468,7 @@
}
CommandSection::CommandSection(int id, const int64_t timeoutMs, const char* command, ...)
- : Section(id, timeoutMs)
+ :Section(id, timeoutMs)
{
va_list args;
va_start(args, command);
@@ -359,7 +477,7 @@
}
CommandSection::CommandSection(int id, const char* command, ...)
- : Section(id)
+ :Section(id)
{
va_list args;
va_start(args, command);
@@ -401,7 +519,7 @@
ALOGW("CommandSection '%s' failed in executing command: %s", this->name.string(), strerror(errno));
_exit(err); // exit with command error code
}
- pid_t ihPid = forkAndExecuteIncidentHelper(this->id, this->name.string(), cmdPipe, ihPipe);
+ pid_t ihPid = fork_execute_incident_helper(this->id, this->name.string(), cmdPipe, ihPipe);
if (ihPid == -1) {
ALOGW("CommandSection '%s' failed to fork", this->name.string());
return -errno;
@@ -413,14 +531,14 @@
ALOGW("CommandSection '%s' failed to read data from incident helper: %s, "
"timedout: %s, kill command: %s, kill incident helper: %s",
this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false",
- strerror(-killChild(cmdPid)), strerror(-killChild(ihPid)));
+ strerror(-kill_child(cmdPid)), strerror(-kill_child(ihPid)));
return readStatus;
}
// TODO: wait for command here has one trade-off: the failed status of command won't be detected until
// buffer timeout, but it has advatage on starting the data stream earlier.
- status_t cmdStatus = waitForChild(cmdPid);
- status_t ihStatus = waitForChild(ihPid);
+ status_t cmdStatus = wait_child(cmdPid);
+ status_t ihStatus = wait_child(ihPid);
if (cmdStatus != NO_ERROR || ihStatus != NO_ERROR) {
ALOGW("CommandSection '%s' abnormal child processes, return status: command: %s, incident helper: %s",
this->name.string(), strerror(-cmdStatus), strerror(-ihStatus));
@@ -429,8 +547,7 @@
ALOGD("CommandSection '%s' wrote %zd bytes in %d ms", this->name.string(), buffer.size(),
(int)buffer.durationMs());
- WriteHeader(requests, buffer.size());
- status_t err = buffer.write(requests);
+ status_t err = write_report_requests(this->id, buffer, requests);
if (err != NO_ERROR) {
ALOGW("CommandSection '%s' failed writing: %s", this->name.string(), strerror(-err));
return err;
diff --git a/cmds/incidentd/src/Section.h b/cmds/incidentd/src/Section.h
index 93b4848..0a1e03e 100644
--- a/cmds/incidentd/src/Section.h
+++ b/cmds/incidentd/src/Section.h
@@ -17,7 +17,7 @@
#ifndef SECTIONS_H
#define SECTIONS_H
-#include "FdBuffer.h"
+#include "Reporter.h"
#include <stdarg.h>
#include <utils/String8.h>
@@ -42,8 +42,18 @@
virtual ~Section();
virtual status_t Execute(ReportRequestSet* requests) const = 0;
+};
- status_t WriteHeader(ReportRequestSet* requests, size_t size) const;
+/**
+ * Section that generates incident headers.
+ */
+class HeaderSection : public Section
+{
+public:
+ HeaderSection();
+ virtual ~HeaderSection();
+
+ virtual status_t Execute(ReportRequestSet* requests) const;
};
/**
diff --git a/cmds/incidentd/src/io_util.cpp b/cmds/incidentd/src/io_util.cpp
new file mode 100644
index 0000000..f043d36
--- /dev/null
+++ b/cmds/incidentd/src/io_util.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 "io_util.h"
+
+#include <unistd.h>
+
+status_t write_all(int fd, uint8_t const* buf, size_t size)
+{
+ while (size > 0) {
+ ssize_t amt = ::write(fd, buf, size);
+ if (amt < 0) {
+ return -errno;
+ }
+ size -= amt;
+ buf += amt;
+ }
+ return NO_ERROR;
+}
+
+Fpipe::Fpipe() {}
+
+Fpipe::~Fpipe() { close(); }
+
+bool Fpipe::close() { return !(::close(mFds[0]) || ::close(mFds[1])); }
+
+bool Fpipe::init() { return pipe(mFds) != -1; }
+
+int Fpipe::readFd() const { return mFds[0]; }
+
+int Fpipe::writeFd() const { return mFds[1]; }
diff --git a/cmds/incidentd/src/io_util.h b/cmds/incidentd/src/io_util.h
new file mode 100644
index 0000000..320dd6c
--- /dev/null
+++ b/cmds/incidentd/src/io_util.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 IO_UTIL_H
+#define IO_UTIL_H
+
+#include <stdint.h>
+#include <utils/Errors.h>
+
+using namespace android;
+
+status_t write_all(int fd, uint8_t const* buf, size_t size);
+
+class Fpipe {
+public:
+ Fpipe();
+ ~Fpipe();
+
+ bool init();
+ bool close();
+ int readFd() const;
+ int writeFd() const;
+
+private:
+ int mFds[2];
+};
+
+#endif // IO_UTIL_H
\ No newline at end of file
diff --git a/cmds/incidentd/src/protobuf.cpp b/cmds/incidentd/src/protobuf.cpp
index b865339..4fffec1 100644
--- a/cmds/incidentd/src/protobuf.cpp
+++ b/cmds/incidentd/src/protobuf.cpp
@@ -16,8 +16,17 @@
#include "protobuf.h"
+uint8_t read_wire_type(uint32_t varint)
+{
+ return (uint8_t) (varint & 0x07);
+}
-uint8_t*
+uint32_t read_field_id(uint32_t varint)
+{
+ return varint >> 3;
+}
+
+uint8_t*
write_raw_varint(uint8_t* buf, uint32_t val)
{
uint8_t* p = buf;
@@ -32,7 +41,7 @@
}
}
-uint8_t*
+uint8_t*
write_length_delimited_tag_header(uint8_t* buf, uint32_t fieldId, size_t size)
{
buf = write_raw_varint(buf, (fieldId << 3) | 2);
@@ -40,3 +49,24 @@
return buf;
}
+size_t
+write_raw_varint(vector<uint8_t>* buf, uint32_t val)
+{
+ size_t size = 0;
+ while (true) {
+ size++;
+ if ((val & ~0x7F) == 0) {
+ buf->push_back((uint8_t) val);
+ return size;
+ } else {
+ buf->push_back((uint8_t)((val & 0x7F) | 0x80));
+ val >>= 7;
+ }
+ }
+}
+
+size_t
+write_header(vector<uint8_t>* buf, uint32_t fieldId, uint8_t wireType)
+{
+ return write_raw_varint(buf, (fieldId << 3) | wireType);
+}
\ No newline at end of file
diff --git a/cmds/incidentd/src/protobuf.h b/cmds/incidentd/src/protobuf.h
index f196ddc..263c864 100644
--- a/cmds/incidentd/src/protobuf.h
+++ b/cmds/incidentd/src/protobuf.h
@@ -18,6 +18,24 @@
#define PROTOBUF_H
#include <stdint.h>
+#include <vector>
+
+using namespace std;
+
+const uint8_t WIRE_TYPE_VARINT = 0;
+const uint8_t WIRE_TYPE_FIXED64 = 1;
+const uint8_t WIRE_TYPE_LENGTH_DELIMITED = 2;
+const uint8_t WIRE_TYPE_FIXED32 = 5;
+
+/**
+ * Read the wire type from varint, it is the smallest 3 bits.
+ */
+uint8_t read_wire_type(uint32_t varint);
+
+/**
+ * read field id from varint, it is varint >> 3;
+ */
+uint32_t read_field_id(uint32_t varint);
/**
* Write a varint into the buffer. Return the next position to write at.
@@ -32,6 +50,16 @@
*/
uint8_t* write_length_delimited_tag_header(uint8_t* buf, uint32_t fieldId, size_t size);
+/**
+ * Write a varint into a vector. Return the size of the varint.
+ */
+size_t write_raw_varint(vector<uint8_t>* buf, uint32_t val);
+
+/**
+ * Write a protobuf header. Return the size of the header.
+ */
+size_t write_header(vector<uint8_t>* buf, uint32_t fieldId, uint8_t wireType);
+
enum {
// IncidentProto.header
FIELD_ID_INCIDENT_HEADER = 1
diff --git a/cmds/incidentd/src/section_list.h b/cmds/incidentd/src/section_list.h
index 1abdb52..da82b00 100644
--- a/cmds/incidentd/src/section_list.h
+++ b/cmds/incidentd/src/section_list.h
@@ -17,50 +17,22 @@
#ifndef SECTION_LIST_H
#define SECTION_LIST_H
+#include "Privacy.h"
#include "Section.h"
/**
* This is the mapping of section IDs to the commands that are run to get those commands.
- * The section IDs are guaranteed in ascending order
+ * The section IDs are guaranteed in ascending order, NULL-terminated.
*/
extern const Section* SECTION_LIST[];
-/*
- * In order not to use libprotobuf-cpp-full nor libplatformprotos in incidentd
- * privacy options's data structure are explicityly redefined in this file.
- */
-
-// DESTINATION enum
-extern const uint8_t DEST_LOCAL;
-extern const uint8_t DEST_EXPLICIT;
-extern const uint8_t DEST_AUTOMATIC;
-
-// This is the default value of DEST enum
-// field with this value doesn't generate Privacy to save too much generated code
-extern const uint8_t DEST_DEFAULT_VALUE;
-
-// type of the field, identitical to protobuf definition
-extern const uint8_t TYPE_STRING;
-extern const uint8_t TYPE_MESSAGE;
-
-struct Privacy {
- int field_id;
- uint8_t type;
-
- // the following two fields are identitical to
- // frameworks/base/libs/incident/proto/android/privacy.proto
- uint8_t dest;
- const char** patterns;
-
- // ignore parent's privacy flags if children are set, NULL-terminated
- const Privacy** children;
-};
-
/**
* This is the mapping of section IDs to each section's privacy policy.
- * The section IDs are guaranteed in ascending order
+ * The section IDs are guaranteed in ascending order, not NULL-terminated since size is provided.
*/
extern const Privacy* PRIVACY_POLICY_LIST[];
+extern const int PRIVACY_POLICY_COUNT;
+
#endif // SECTION_LIST_H
diff --git a/cmds/incidentd/tests/EncodedBuffer_test.cpp b/cmds/incidentd/tests/EncodedBuffer_test.cpp
new file mode 100644
index 0000000..98c39bd
--- /dev/null
+++ b/cmds/incidentd/tests/EncodedBuffer_test.cpp
@@ -0,0 +1,239 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT 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 "EncodedBuffer.h"
+
+#include <android-base/file.h>
+#include <android-base/test_utils.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <string.h>
+
+using namespace android;
+using namespace android::base;
+using namespace std;
+using ::testing::StrEq;
+using ::testing::Test;
+using ::testing::internal::CaptureStdout;
+using ::testing::internal::GetCapturedStdout;
+
+const uint8_t LOCAL = 0;
+const uint8_t EXPLICIT = 1;
+const uint8_t AUTOMATIC = 2;
+
+const uint8_t OTHER_TYPE = 1;
+const uint8_t STRING_TYPE = 9;
+const uint8_t MESSAGE_TYPE = 11;
+const string STRING_FIELD_0 = "\x02\viamtestdata";
+const string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
+const string STRING_FIELD_2 = "\x12\vwhatthefuck";
+const string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
+const string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff"; // -1
+const string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2;
+
+static Privacy* create_privacy(uint32_t field_id, uint8_t type, uint8_t dest) {
+ struct Privacy* p = (struct Privacy*)malloc(sizeof(struct Privacy));
+ p->field_id = field_id;
+ p->type = type;
+ p->children = NULL;
+ p->dest = dest;
+ p->patterns = NULL;
+ return p;
+}
+
+static Privacy* create_message_privacy(uint32_t field_id, Privacy** children)
+{
+ struct Privacy* p = (struct Privacy*)malloc(sizeof(struct Privacy));
+ p->field_id = field_id;
+ p->type = MESSAGE_TYPE;
+ p->children = children;
+ p->dest = EXPLICIT;
+ p->patterns = NULL;
+ return p;
+}
+
+static Privacy* create_string_privacy(uint32_t field_id, uint8_t dest, const char** patterns)
+{
+ struct Privacy* p = (struct Privacy*)malloc(sizeof(struct Privacy));
+ p->field_id = field_id;
+ p->type = STRING_TYPE;
+ p->children = NULL;
+ p->dest = dest;
+ p->patterns = patterns;
+ return p;
+}
+
+class EncodedBufferTest : public Test {
+public:
+ virtual void SetUp() override {
+ ASSERT_NE(tf.fd, -1);
+ }
+
+ void writeToFdBuffer(string str) {
+ ASSERT_TRUE(WriteStringToFile(str, tf.path, false));
+ ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000));
+ }
+
+ void assertBuffer(EncodedBuffer& buf, string expected) {
+ ASSERT_EQ(buf.size(), expected.size());
+ CaptureStdout();
+ ASSERT_EQ(buf.flush(STDOUT_FILENO), NO_ERROR);
+ ASSERT_THAT(GetCapturedStdout(), StrEq(expected));
+ }
+
+ void assertStrip(uint8_t dest, string expected, Privacy* policy) {
+ PrivacySpec spec(dest);
+ EncodedBuffer encodedBuf(buffer, policy);
+ ASSERT_EQ(encodedBuf.strip(spec), NO_ERROR);
+ assertBuffer(encodedBuf, expected);
+ }
+
+ void assertStripByFields(uint8_t dest, string expected, int size, Privacy* privacy, ...) {
+ Privacy* list[size+1];
+ list[0] = privacy;
+ va_list args;
+ va_start(args, privacy);
+ for (int i=1; i<size; i++) {
+ Privacy* p = va_arg(args, Privacy*);
+ list[i] = p;
+ }
+ va_end(args);
+ list[size] = NULL;
+ assertStrip(dest, expected, create_message_privacy(300, list));
+ }
+
+ FdBuffer buffer;
+private:
+ TemporaryFile tf;
+};
+
+TEST_F(EncodedBufferTest, NullFieldPolicy) {
+ writeToFdBuffer(STRING_FIELD_0);
+ assertStrip(EXPLICIT, STRING_FIELD_0, create_string_privacy(300, AUTOMATIC, NULL));
+}
+
+TEST_F(EncodedBufferTest, StripSpecNotAllowed) {
+ writeToFdBuffer(STRING_FIELD_0);
+ assertStripByFields(AUTOMATIC, "", 1, create_privacy(0, STRING_TYPE, EXPLICIT));
+}
+
+TEST_F(EncodedBufferTest, StripVarintField) {
+ writeToFdBuffer(VARINT_FIELD_1);
+ assertStripByFields(EXPLICIT, "", 1, create_privacy(1, OTHER_TYPE, LOCAL));
+}
+
+TEST_F(EncodedBufferTest, StripLengthDelimitedField_String) {
+ writeToFdBuffer(STRING_FIELD_2);
+ assertStripByFields(EXPLICIT, "", 1, create_privacy(2, STRING_TYPE, LOCAL));
+}
+
+TEST_F(EncodedBufferTest, StripFixed64Field) {
+ writeToFdBuffer(FIX64_FIELD_3);
+ assertStripByFields(EXPLICIT, "", 1, create_privacy(3, OTHER_TYPE, LOCAL));
+}
+
+TEST_F(EncodedBufferTest, StripFixed32Field) {
+ writeToFdBuffer(FIX32_FIELD_4);
+ assertStripByFields(EXPLICIT, "", 1, create_privacy(4, OTHER_TYPE, LOCAL));
+}
+
+TEST_F(EncodedBufferTest, StripLengthDelimitedField_Message) {
+ writeToFdBuffer(MESSAGE_FIELD_5);
+ assertStripByFields(EXPLICIT, "", 1, create_privacy(5, MESSAGE_TYPE, LOCAL));
+}
+
+TEST_F(EncodedBufferTest, NoStripVarintField) {
+ writeToFdBuffer(VARINT_FIELD_1);
+ assertStripByFields(EXPLICIT, VARINT_FIELD_1, 1, create_privacy(1, OTHER_TYPE, AUTOMATIC));
+}
+
+TEST_F(EncodedBufferTest, NoStripLengthDelimitedField_String) {
+ writeToFdBuffer(STRING_FIELD_2);
+ assertStripByFields(EXPLICIT, STRING_FIELD_2, 1, create_privacy(2, STRING_TYPE, AUTOMATIC));
+}
+
+TEST_F(EncodedBufferTest, NoStripFixed64Field) {
+ writeToFdBuffer(FIX64_FIELD_3);
+ assertStripByFields(EXPLICIT, FIX64_FIELD_3, 1, create_privacy(3, OTHER_TYPE, AUTOMATIC));
+}
+
+TEST_F(EncodedBufferTest, NoStripFixed32Field) {
+ writeToFdBuffer(FIX32_FIELD_4);
+ assertStripByFields(EXPLICIT, FIX32_FIELD_4, 1, create_privacy(4, OTHER_TYPE, AUTOMATIC));
+}
+
+TEST_F(EncodedBufferTest, NoStripLengthDelimitedField_Message) {
+ writeToFdBuffer(MESSAGE_FIELD_5);
+ assertStripByFields(EXPLICIT, MESSAGE_FIELD_5, 1, create_privacy(5, MESSAGE_TYPE, AUTOMATIC));
+}
+
+TEST_F(EncodedBufferTest, StripVarintAndString) {
+ writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2
+ + FIX64_FIELD_3 + FIX32_FIELD_4);
+ string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4;
+ assertStripByFields(EXPLICIT, expected, 2,
+ create_privacy(1, OTHER_TYPE, LOCAL), create_privacy(2, STRING_TYPE, LOCAL));
+}
+
+TEST_F(EncodedBufferTest, StripVarintAndFixed64) {
+ writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2
+ + FIX64_FIELD_3 + FIX32_FIELD_4);
+ string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4;
+ assertStripByFields(EXPLICIT, expected, 2,
+ create_privacy(1, OTHER_TYPE, LOCAL), create_privacy(3, OTHER_TYPE, LOCAL));
+}
+
+TEST_F(EncodedBufferTest, StripVarintInNestedMessage) {
+ writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5);
+ Privacy* list[] = { create_privacy(1, OTHER_TYPE, LOCAL), NULL };
+ string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+ assertStripByFields(EXPLICIT, expected, 1, create_message_privacy(5, list));
+}
+
+TEST_F(EncodedBufferTest, StripFix64AndVarintInNestedMessage) {
+ writeToFdBuffer(STRING_FIELD_0 + FIX64_FIELD_3 + MESSAGE_FIELD_5);
+ Privacy* list[] = { create_privacy(1, OTHER_TYPE, LOCAL), NULL };
+ string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+ assertStripByFields(EXPLICIT, expected, 2, create_privacy(3, OTHER_TYPE, LOCAL), create_message_privacy(5, list));
+}
+
+TEST_F(EncodedBufferTest, ClearAndStrip) {
+ string data = STRING_FIELD_0 + VARINT_FIELD_1;
+ writeToFdBuffer(data);
+ Privacy* list[] = { create_privacy(1, OTHER_TYPE, LOCAL), NULL };
+ EncodedBuffer encodedBuf(buffer, create_message_privacy(300, list));
+ PrivacySpec spec1(EXPLICIT), spec2(LOCAL);
+
+ ASSERT_EQ(encodedBuf.strip(spec1), NO_ERROR);
+ assertBuffer(encodedBuf, STRING_FIELD_0);
+ ASSERT_EQ(encodedBuf.strip(spec2), NO_ERROR);
+ assertBuffer(encodedBuf, data);
+}
+
+TEST_F(EncodedBufferTest, BadDataInFdBuffer) {
+ writeToFdBuffer("iambaddata");
+ Privacy* list[] = { create_privacy(4, OTHER_TYPE, AUTOMATIC), NULL };
+ EncodedBuffer encodedBuf(buffer, create_message_privacy(300, list));
+ PrivacySpec spec;
+ ASSERT_EQ(encodedBuf.strip(spec), BAD_VALUE);
+}
+
+TEST_F(EncodedBufferTest, BadDataInNestedMessage) {
+ writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5 + "aoeoe");
+ Privacy* list[] = { create_privacy(1, OTHER_TYPE, LOCAL), NULL };
+ Privacy* field5[] = { create_message_privacy(5, list), NULL };
+ EncodedBuffer encodedBuf(buffer, create_message_privacy(300, field5));
+ PrivacySpec spec;
+ ASSERT_EQ(encodedBuf.strip(spec), BAD_VALUE);
+}
diff --git a/cmds/incidentd/tests/FdBuffer_test.cpp b/cmds/incidentd/tests/FdBuffer_test.cpp
index 403a2ab..d1436b2 100644
--- a/cmds/incidentd/tests/FdBuffer_test.cpp
+++ b/cmds/incidentd/tests/FdBuffer_test.cpp
@@ -15,10 +15,11 @@
#define LOG_TAG "incidentd"
#include "FdBuffer.h"
+#include "io_util.h"
#include <android-base/file.h>
#include <android-base/test_utils.h>
-#include <gmock/gmock.h>
+#include <fcntl.h>
#include <gtest/gtest.h>
#include <signal.h>
#include <string.h>
@@ -30,10 +31,7 @@
using namespace android;
using namespace android::base;
-using ::testing::StrEq;
using ::testing::Test;
-using ::testing::internal::CaptureStdout;
-using ::testing::internal::GetCapturedStdout;
class FdBufferTest : public Test {
public:
@@ -50,12 +48,13 @@
}
void AssertBufferContent(const char* expected) {
- ReportRequestSet requests;
- requests.setMainFd(STDOUT_FILENO);
-
- CaptureStdout();
- ASSERT_EQ(NO_ERROR, buffer.write(&requests));
- EXPECT_THAT(GetCapturedStdout(), StrEq(expected));
+ int i=0;
+ FdBuffer::iterator it = buffer.begin();
+ while (expected[i] != '\0') {
+ ASSERT_EQ(*it, expected[i++]);
+ it++;
+ }
+ ASSERT_EQ(it, buffer.end());
}
bool DoDataStream(int rFd, int wFd) {
@@ -99,6 +98,16 @@
EXPECT_TRUE(it.outOfBound());
}
+TEST_F(FdBufferTest, IteratorSnapshot) {
+ FdBuffer::iterator it = buffer.begin();
+ it += 4;
+ FdBuffer::iterator snapshot = it.snapshot();
+ it += 5;
+ EXPECT_TRUE(snapshot != it);
+ EXPECT_EQ(it - snapshot, 5);
+ EXPECT_EQ(snapshot - it, -5);
+}
+
TEST_F(FdBufferTest, ReadAndIterate) {
std::string testdata = "FdBuffer test string";
ASSERT_TRUE(WriteStringToFile(testdata, tf.path, false));
@@ -227,7 +236,7 @@
TEST_F(FdBufferTest, ReadInStreamMoreThan4MB) {
const std::string testFile = kTestDataPath + "morethan4MB.txt";
size_t fourMB = (size_t) 4 * 1024 * 1024;
- int fd = open(testFile.c_str(), O_RDONLY);
+ int fd = open(testFile.c_str(), O_RDONLY | O_CLOEXEC);
ASSERT_NE(fd, -1);
int pid = fork();
ASSERT_TRUE(pid != -1);
diff --git a/cmds/incidentd/tests/Reporter_test.cpp b/cmds/incidentd/tests/Reporter_test.cpp
index a774741..5d074bc 100644
--- a/cmds/incidentd/tests/Reporter_test.cpp
+++ b/cmds/incidentd/tests/Reporter_test.cpp
@@ -76,8 +76,7 @@
};
protected:
- IBinder* onAsBinder() override { return nullptr; };
-
+ virtual IBinder* onAsBinder() override { return nullptr; };
};
class ReporterTest : public Test {
@@ -127,29 +126,7 @@
TEST_F(ReporterTest, ReportRequestSetEmpty) {
requests.setMainFd(STDOUT_FILENO);
-
- CaptureStdout();
- requests.write((uint8_t *) "abcdef", 6);
- EXPECT_THAT(GetCapturedStdout(), StrEq("abcdef"));
-}
-
-TEST_F(ReporterTest, WriteToStreamFdAndMainFd) {
- TemporaryFile tf;
- IncidentReportArgs args;
- sp<ReportRequest> r = new ReportRequest(args, l, tf.fd);
-
- requests.add(r);
- requests.setMainFd(STDOUT_FILENO);
-
- const char* data = "abcdef";
-
- CaptureStdout();
- requests.write((uint8_t *) data, 6);
- EXPECT_THAT(GetCapturedStdout(), StrEq(data));
-
- string content;
- ASSERT_TRUE(ReadFileToString(tf.path, &content));
- EXPECT_THAT(content, StrEq(data));
+ ASSERT_EQ(requests.mainFd(), STDOUT_FILENO);
}
TEST_F(ReporterTest, RunReportEmpty) {
diff --git a/cmds/incidentd/tests/Section_test.cpp b/cmds/incidentd/tests/Section_test.cpp
index 93771ff..25b05b2 100644
--- a/cmds/incidentd/tests/Section_test.cpp
+++ b/cmds/incidentd/tests/Section_test.cpp
@@ -22,31 +22,80 @@
#include <gtest/gtest.h>
#include <string.h>
+const int TIMEOUT_PARSER = -1;
+const int NOOP_PARSER = 0;
+const int REVERSE_PARSER = 1;
+
const int QUICK_TIMEOUT_MS = 100;
+const string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
+const string STRING_FIELD_2 = "\x12\vwhatthefuck";
+const string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
+
using namespace android::base;
+using namespace android::binder;
using namespace std;
using ::testing::StrEq;
using ::testing::internal::CaptureStdout;
using ::testing::internal::GetCapturedStdout;
// NOTICE: this test requires /system/bin/incident_helper is installed.
-TEST(SectionTest, WriteHeader) {
- int id = 13; // expect output is 13 << 3 & 2 = 106 --> \x6a in ASCII
- FileSection s(id, ""); // ignore the path, just used to test the header
+
+class SimpleListener : public IIncidentReportStatusListener
+{
+public:
+ SimpleListener() {};
+ virtual ~SimpleListener() {};
+
+ virtual Status onReportStarted() { return Status::ok(); };
+ virtual Status onReportSectionStatus(int /*section*/, int /*status*/) { return Status::ok(); };
+ virtual Status onReportFinished() { return Status::ok(); };
+ virtual Status onReportFailed() { return Status::ok(); };
+
+protected:
+ virtual IBinder* onAsBinder() override { return nullptr; };
+};
+
+TEST(SectionTest, HeaderSection) {
+ TemporaryFile output2;
+ HeaderSection hs;
ReportRequestSet requests;
+ IncidentReportArgs args1, args2;
+ args1.addSection(1);
+ args1.addSection(2);
+ args2.setAll(true);
+
+ vector<int8_t> head1;
+ head1.push_back('a');
+ head1.push_back('x');
+ head1.push_back('e');
+
+ vector<int8_t> head2;
+ head2.push_back('p');
+ head2.push_back('u');
+ head2.push_back('p');
+
+ args1.addHeader(head1);
+ args1.addHeader(head2);
+ args2.addHeader(head2);
+
+ requests.add(new ReportRequest(args1, new SimpleListener(), -1));
+ requests.add(new ReportRequest(args2, new SimpleListener(), output2.fd));
requests.setMainFd(STDOUT_FILENO);
+ string content;
CaptureStdout();
- ASSERT_EQ(NO_ERROR, s.WriteHeader(&requests, 300));
- // According to protobuf encoding, 300 is "1010 1100 0000 0010" -> \xac \x02
- EXPECT_THAT(GetCapturedStdout(), StrEq("\x6a\xac\x02"));
+ ASSERT_EQ(NO_ERROR, hs.Execute(&requests));
+ EXPECT_THAT(GetCapturedStdout(), StrEq("\n\x3" "axe\n\x03pup"));
+
+ EXPECT_TRUE(ReadFileToString(output2.path, &content));
+ EXPECT_THAT(content, StrEq("\n\x03pup"));
}
TEST(SectionTest, FileSection) {
TemporaryFile tf;
- FileSection fs(0, tf.path);
+ FileSection fs(REVERSE_PARSER, tf.path);
ReportRequestSet requests;
ASSERT_TRUE(tf.fd != -1);
@@ -58,13 +107,13 @@
ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
// The input string is reversed in incident helper
// The length is 11, in 128Varint it is "0000 1011" -> \v
- EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\vatadtsetmai"));
+ EXPECT_THAT(GetCapturedStdout(), StrEq("\xa\vatadtsetmai"));
}
TEST(SectionTest, FileSectionTimeout) {
TemporaryFile tf;
// id -1 is timeout parser
- FileSection fs(-1, tf.path, QUICK_TIMEOUT_MS);
+ FileSection fs(TIMEOUT_PARSER, tf.path, QUICK_TIMEOUT_MS);
ReportRequestSet requests;
ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
}
@@ -84,36 +133,165 @@
}
TEST(SectionTest, CommandSectionEcho) {
- CommandSection cs(0, "/system/bin/echo", "about", NULL);
+ CommandSection cs(REVERSE_PARSER, "/system/bin/echo", "about", NULL);
ReportRequestSet requests;
requests.setMainFd(STDOUT_FILENO);
CaptureStdout();
ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
- EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\x06\ntuoba"));
+ EXPECT_THAT(GetCapturedStdout(), StrEq("\xa\x06\ntuoba"));
}
TEST(SectionTest, CommandSectionCommandTimeout) {
- CommandSection cs(0, QUICK_TIMEOUT_MS, "/system/bin/yes", NULL);
+ CommandSection cs(NOOP_PARSER, QUICK_TIMEOUT_MS, "/system/bin/yes", NULL);
ReportRequestSet requests;
ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
}
TEST(SectionTest, CommandSectionIncidentHelperTimeout) {
- CommandSection cs(-1, QUICK_TIMEOUT_MS, "/system/bin/echo", "about", NULL);
+ CommandSection cs(TIMEOUT_PARSER, QUICK_TIMEOUT_MS, "/system/bin/echo", "about", NULL);
ReportRequestSet requests;
requests.setMainFd(STDOUT_FILENO);
ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
}
TEST(SectionTest, CommandSectionBadCommand) {
- CommandSection cs(0, "echo", "about", NULL);
+ CommandSection cs(NOOP_PARSER, "echo", "about", NULL);
ReportRequestSet requests;
ASSERT_EQ(NAME_NOT_FOUND, cs.Execute(&requests));
}
TEST(SectionTest, CommandSectionBadCommandAndTimeout) {
- CommandSection cs(-1, QUICK_TIMEOUT_MS, "nonexistcommand", "-opt", NULL);
+ CommandSection cs(TIMEOUT_PARSER, QUICK_TIMEOUT_MS, "nonexistcommand", "-opt", NULL);
ReportRequestSet requests;
// timeout will return first
ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
+}
+
+TEST(SectionTest, TestFilterPiiTaggedFields) {
+ TemporaryFile tf;
+ FileSection fs(NOOP_PARSER, tf.path);
+ ReportRequestSet requests;
+
+ ASSERT_TRUE(tf.fd != -1);
+ ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, tf.path, false));
+
+ requests.setMainFd(STDOUT_FILENO);
+
+ CaptureStdout();
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
+}
+
+TEST(SectionTest, TestBadFdRequest) {
+ TemporaryFile input;
+ FileSection fs(NOOP_PARSER, input.path);
+ ReportRequestSet requests;
+ ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, input.path, false));
+
+ IncidentReportArgs args;
+ args.setAll(true);
+ args.setDest(0);
+ sp<ReportRequest> badFdRequest = new ReportRequest(args, new SimpleListener(), 1234567);
+ requests.add(badFdRequest);
+ requests.setMainFd(STDOUT_FILENO);
+
+ CaptureStdout();
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
+ EXPECT_EQ(badFdRequest->err, -EBADF);
+}
+
+TEST(SectionTest, TestBadRequests) {
+ TemporaryFile input;
+ FileSection fs(NOOP_PARSER, input.path);
+ ReportRequestSet requests;
+ ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, input.path, false));
+
+ IncidentReportArgs args;
+ args.setAll(true);
+ args.setDest(0);
+ requests.add(new ReportRequest(args, new SimpleListener(), -1));
+ EXPECT_EQ(fs.Execute(&requests), -EBADF);
+}
+
+TEST(SectionTest, TestMultipleRequests) {
+ TemporaryFile input, output1, output2, output3;
+ FileSection fs(NOOP_PARSER, input.path);
+ ReportRequestSet requests;
+
+ ASSERT_TRUE(input.fd != -1);
+ ASSERT_TRUE(output1.fd != -1);
+ ASSERT_TRUE(output2.fd != -1);
+ ASSERT_TRUE(output3.fd != -1);
+ ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, input.path, false));
+
+ IncidentReportArgs args1, args2, args3;
+ args1.setAll(true);
+ args1.setDest(0); // LOCAL
+ args2.setAll(true); // default to explicit
+ sp<SimpleListener> l = new SimpleListener();
+ requests.add(new ReportRequest(args1, l, output1.fd));
+ requests.add(new ReportRequest(args2, l, output2.fd));
+ requests.add(new ReportRequest(args3, l, output3.fd));
+ requests.setMainFd(STDOUT_FILENO);
+
+ CaptureStdout();
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
+
+ string content, expect;
+ expect = VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3;
+ char c = (char) expect.size();
+ EXPECT_TRUE(ReadFileToString(output1.path, &content));
+ EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
+
+ expect = STRING_FIELD_2 + FIX64_FIELD_3;
+ c = (char) expect.size();
+ EXPECT_TRUE(ReadFileToString(output2.path, &content));
+ EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
+
+ // because args3 doesn't set section, so it should receive nothing
+ EXPECT_TRUE(ReadFileToString(output3.path, &content));
+ EXPECT_THAT(content, StrEq(""));
+}
+
+TEST(SectionTest, TestMultipleRequestsBySpec) {
+ TemporaryFile input, output1, output2, output3;
+ FileSection fs(NOOP_PARSER, input.path);
+ ReportRequestSet requests;
+
+ ASSERT_TRUE(input.fd != -1);
+ ASSERT_TRUE(output1.fd != -1);
+ ASSERT_TRUE(output2.fd != -1);
+ ASSERT_TRUE(output3.fd != -1);
+
+ ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, input.path, false));
+
+ IncidentReportArgs args1, args2, args3, args4;
+ args1.setAll(true);
+ args2.setAll(true);
+ args4.setAll(true);
+ sp<SimpleListener> l = new SimpleListener();
+ requests.add(new ReportRequest(args1, l, output1.fd));
+ requests.add(new ReportRequest(args2, l, output2.fd));
+ requests.add(new ReportRequest(args3, l, output3.fd));
+ requests.setMainFd(STDOUT_FILENO);
+
+ CaptureStdout();
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
+
+ string content, expect;
+ expect = STRING_FIELD_2 + FIX64_FIELD_3;
+ char c = (char) expect.size();
+
+ // output1 and output2 are the same
+ EXPECT_TRUE(ReadFileToString(output1.path, &content));
+ EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
+ EXPECT_TRUE(ReadFileToString(output2.path, &content));
+ EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
+
+ // because args3 doesn't set section, so it should receive nothing
+ EXPECT_TRUE(ReadFileToString(output3.path, &content));
+ EXPECT_THAT(content, StrEq(""));
}
\ No newline at end of file
diff --git a/cmds/incidentd/tests/section_list.cpp b/cmds/incidentd/tests/section_list.cpp
index f005335..e47b61cf 100644
--- a/cmds/incidentd/tests/section_list.cpp
+++ b/cmds/incidentd/tests/section_list.cpp
@@ -4,3 +4,25 @@
const Section* SECTION_LIST[] = {
NULL
};
+
+const uint8_t LOCAL = 0;
+const uint8_t EXPLICIT = 1;
+const uint8_t AUTOMATIC = 2;
+
+Privacy sub_field_1 { 1, 1, NULL, LOCAL, NULL };
+Privacy sub_field_2 { 2, 9, NULL, AUTOMATIC, NULL };
+
+Privacy* list[] = {
+ &sub_field_1,
+ &sub_field_2,
+ NULL };
+
+Privacy field_0 { 0, 11, list, EXPLICIT, NULL };
+Privacy field_1 { 1, 9, NULL, AUTOMATIC, NULL };
+
+const Privacy* PRIVACY_POLICY_LIST[] = {
+ &field_0,
+ &field_1
+};
+
+const int PRIVACY_POLICY_COUNT = 2;
\ No newline at end of file
diff --git a/cmds/interrupter/Android.bp b/cmds/interrupter/Android.bp
new file mode 100644
index 0000000..d68e7fe
--- /dev/null
+++ b/cmds/interrupter/Android.bp
@@ -0,0 +1,11 @@
+cc_library_shared {
+ name: "interrupter",
+ host_supported: true,
+ srcs: ["interrupter.c"],
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/cmds/interrupter/Android.mk b/cmds/interrupter/Android.mk
deleted file mode 100644
index 97a96bf..0000000
--- a/cmds/interrupter/Android.mk
+++ /dev/null
@@ -1,23 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- interrupter.c
-LOCAL_MODULE := interrupter
-LOCAL_MODULE_TAGS := eng tests
-LOCAL_LDFLAGS := -ldl
-LOCAL_CFLAGS := -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- interrupter.c
-LOCAL_MODULE := interrupter
-LOCAL_MODULE_TAGS := eng tests
-LOCAL_LDFLAGS := -ldl
-LOCAL_CFLAGS := -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_HOST_SHARED_LIBRARY)
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index db8c89d..4c097f0 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -14,6 +14,23 @@
LOCAL_PATH:= $(call my-dir)
+# ================
+# proto static lib
+# ================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := statsd_proto
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-proto-files-under, src)
+
+LOCAL_PROTOC_FLAGS :=
+LOCAL_PROTOC_OPTIMIZE_TYPE := lite
+
+include $(BUILD_STATIC_LIBRARY)
+
+STATSD_PROTO_INCLUDES := $(local-generated-sources-dir)/src/$(LOCAL_PATH)
+
# =========
# statsd
# =========
@@ -27,7 +44,14 @@
src/StatsService.cpp \
src/LogEntryPrinter.cpp \
src/LogReader.cpp \
- src/main.cpp
+ src/main.cpp \
+ src/DropboxWriter.cpp \
+ src/StatsLogProcessor.cpp \
+ src/stats_log.proto \
+ src/statsd_config.proto \
+ src/stats_constants.proto \
+ src/DropboxReader.cpp \
+
LOCAL_CFLAGS += \
-Wall \
@@ -47,7 +71,10 @@
endif
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/../../core/java
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src \
+ STATSD_PROTO_INCLUDES
+
+LOCAL_STATIC_LIBRARIES := statsd_proto
LOCAL_SHARED_LIBRARIES := \
libbase \
@@ -56,7 +83,9 @@
libincident \
liblog \
libselinux \
- libutils
+ libutils \
+ libservices \
+ libandroidfw \
LOCAL_MODULE_CLASS := EXECUTABLES
@@ -82,7 +111,8 @@
-Wno-unused-function \
-Wno-unused-parameter
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/src \
+ STATSD_PROTO_INCLUDES
LOCAL_SRC_FILES := \
../../core/java/android/os/IStatsManager.aidl \
@@ -93,6 +123,7 @@
LOCAL_STATIC_LIBRARIES := \
libgmock \
+ statsd_proto
LOCAL_SHARED_LIBRARIES := \
libbase \
@@ -103,4 +134,3 @@
libutils
include $(BUILD_NATIVE_TEST)
-
diff --git a/cmds/statsd/src/DropboxReader.cpp b/cmds/statsd/src/DropboxReader.cpp
new file mode 100644
index 0000000..187f4ad
--- /dev/null
+++ b/cmds/statsd/src/DropboxReader.cpp
@@ -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.
+ */
+#include <android/os/DropBoxManager.h>
+#include <android-base/file.h>
+#include <cutils/log.h>
+#include <androidfw/ZipUtils.h>
+#include <stdio.h>
+
+#include "DropboxReader.h"
+
+using android::sp;
+using android::String16;
+using android::binder::Status;
+using android::base::unique_fd;
+using android::os::DropBoxManager;
+using android::os::statsd::StatsLogEntry;
+using android::ZipUtils;
+using std::vector;
+
+status_t DropboxReader::readStatsLogs(FILE* out, const string& tag, long msec) {
+ sp<DropBoxManager> dropbox = new DropBoxManager();
+ StatsLogList logList;
+
+ long timestamp = msec;
+ // instead of while(true), put a hard limit 1000. Dropbox won't have more than 1000 files.
+ for(int i = 0; i < 1000; i++ ) {
+ DropBoxManager::Entry entry;
+ Status status = dropbox->getNextEntry(String16(tag.c_str()),
+ timestamp, &entry);
+ if (!status.isOk()) {
+ ALOGD("No more entries, or failed to read. We can't tell unfortunately.");
+ return android::OK;
+ }
+
+ const unique_fd& fd = entry.getFd();
+
+ // use this timestamp for next query.
+ timestamp = entry.getTimestamp();
+
+ if (entry.getFlags() & DropBoxManager::IS_GZIPPED) {
+ if (!parseFromGzipFile(fd, logList)) {
+ // Failed to parse from the file. Continue to fetch the next entry.
+ continue;
+ }
+ } else {
+ if (!parseFromFile(fd, logList)) {
+ // Failed to parse from the file. Continue to fetch the next entry.
+ continue;
+ }
+ }
+
+ printLog(out, logList);
+ }
+ return android::OK;
+}
+
+bool DropboxReader::parseFromGzipFile(const unique_fd& fd, StatsLogList& list) {
+ FILE *file = fdopen(fd, "r");
+ bool result = false;
+ bool scanResult;
+ int method;
+ long compressedLen;
+ long uncompressedLen;
+ unsigned long crc32;
+ scanResult = ZipUtils::examineGzip(file, &method, &uncompressedLen,
+ &compressedLen, &crc32);
+ if (scanResult && method == kCompressDeflated) {
+ vector<uint8_t> buf(uncompressedLen);
+ if (ZipUtils::inflateToBuffer(file, &buf[0], uncompressedLen, compressedLen)) {
+ if (list.ParseFromArray(&buf[0], uncompressedLen)) {
+ result = true;
+ }
+ }
+ } else {
+ ALOGE("This isn't a valid deflated gzip file");
+ }
+ fclose(file);
+ return result;
+}
+
+// parse a non zipped file.
+bool DropboxReader::parseFromFile(const unique_fd& fd, StatsLogList& list) {
+ string content;
+ if (!android::base::ReadFdToString(fd, &content)) {
+ ALOGE("Failed to read file");
+ return false;
+ }
+ if (!list.ParseFromString(content)) {
+ ALOGE("failed to parse log entry from data");
+ return false;
+ }
+ return true;
+}
+
+void DropboxReader::printLog(FILE* out, const StatsLogList& list) {
+ for (int i = 0; i < list.stats_log_entry_size(); i++) {
+ const StatsLogEntry entry = list.stats_log_entry(i);
+ // TODO: print pretty
+ fprintf(out, "time_msec=%lld, type=%d, aggregate_type=%d, uid=%d, pid=%d ",
+ entry.start_report_millis(), entry.type(), entry.aggregate_type(),
+ entry.uid(), entry.pid());
+ for (int j = 0; j < entry.pairs_size(); j++) {
+ fprintf(out, "msg=%s ", entry.pairs(j).value_str().c_str());
+ }
+ fprintf(out, "\n");
+ }
+}
diff --git a/cmds/statsd/src/DropboxReader.h b/cmds/statsd/src/DropboxReader.h
new file mode 100644
index 0000000..a62ffde
--- /dev/null
+++ b/cmds/statsd/src/DropboxReader.h
@@ -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.
+ */
+
+#ifndef DROPBOX_READER_H
+#define DROPBOX_READER_H
+
+#include <frameworks/base/cmds/statsd/src/stats_log.pb.h>
+
+#include <stdint.h>
+#include <stdio.h>
+
+using android::base::unique_fd;
+using android::os::statsd::StatsLogList;
+using android::status_t;
+using std::string;
+
+class DropboxReader {
+public:
+ // msec is the start timestamp.
+ static status_t readStatsLogs(FILE* out, const string& tag, long msec);
+
+private:
+ static bool parseFromFile(const unique_fd& fd, StatsLogList& list);
+ static bool parseFromGzipFile(const unique_fd& fd, StatsLogList& list);
+ static void printLog(FILE* out, const StatsLogList& list);
+ enum {
+ kCompressStored = 0, // no compression
+ kCompressDeflated = 8, // standard deflate
+ };
+};
+
+#endif //DROPBOX_READER_H
\ No newline at end of file
diff --git a/cmds/statsd/src/DropboxWriter.cpp b/cmds/statsd/src/DropboxWriter.cpp
new file mode 100644
index 0000000..a251056
--- /dev/null
+++ b/cmds/statsd/src/DropboxWriter.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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/os/DropBoxManager.h>
+#include <cutils/log.h>
+
+#include "DropboxWriter.h"
+
+using android::os::DropBoxManager;
+using android::binder::Status;
+using android::sp;
+using android::String16;
+using std::vector;
+
+DropboxWriter::DropboxWriter(const string& tag)
+ : mTag(tag), mLogList(), mBufferSize(0) {
+}
+
+void DropboxWriter::addEntry(const StatsLogEntry& entry) {
+ flushIfNecessary(entry);
+ StatsLogEntry* newEntry = mLogList.add_stats_log_entry();
+ newEntry->CopyFrom(entry);
+ mBufferSize += entry.ByteSize();
+}
+
+void DropboxWriter::flushIfNecessary(const StatsLogEntry& entry) {
+ // The serialized size of the StatsLogList is approximately the sum of the serialized size of
+ // every StatsLogEntry inside it.
+ if (entry.ByteSize() + mBufferSize > kMaxSerializedBytes) {
+ flush();
+ }
+}
+
+void DropboxWriter::flush() {
+ // now we get an exact byte size of the output
+ const int numBytes = mLogList.ByteSize();
+ vector<uint8_t> buffer(numBytes);
+ sp<DropBoxManager> dropbox = new DropBoxManager();
+ mLogList.SerializeToArray(&buffer[0], numBytes);
+ Status status = dropbox->addData(String16(mTag.c_str()), &buffer[0],
+ numBytes, 0 /* no flag */);
+ if (!status.isOk()) {
+ ALOGE("failed to write to dropbox");
+ //TODO: What to do if flush fails??
+ }
+ mLogList.Clear();
+ mBufferSize = 0;
+}
diff --git a/cmds/statsd/src/DropboxWriter.h b/cmds/statsd/src/DropboxWriter.h
new file mode 100644
index 0000000..176ac8b
--- /dev/null
+++ b/cmds/statsd/src/DropboxWriter.h
@@ -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.
+ */
+
+#ifndef DROPBOX_WRITER_H
+#define DROPBOX_WRITER_H
+
+#include <frameworks/base/cmds/statsd/src/stats_log.pb.h>
+
+using std::string;
+using android::os::statsd::StatsLogEntry;
+using android::os::statsd::StatsLogList;
+
+class DropboxWriter {
+public:
+ /* tag will be part of the file name, and used as the key to build the file index inside
+ DropBoxManagerService.
+ */
+ DropboxWriter(const string& tag);
+
+ void addEntry(const StatsLogEntry& entry);
+
+ /* Request a flush to dropbox. */
+ void flush();
+
+private:
+ /* Max *serialized* size of the logs kept in memory before flushing to dropbox.
+ Proto lite does not implement the SpaceUsed() function which gives the in memory byte size.
+ So we cap memory usage by limiting the serialized size. Note that protobuf's in memory size
+ is higher than its serialized size. DropboxManager will compress the file when the data is
+ larger than 4KB. So the final file size is less than this number.
+ */
+ static const size_t kMaxSerializedBytes = 16 * 1024;
+
+ const string mTag;
+
+ /* StatsLogList is a wrapper for storing a list of StatsLogEntry */
+ StatsLogList mLogList;
+
+ /* Current *serialized* size of the logs kept in memory.
+ To save computation, we will not calculate the size of the StatsLogList every time when a new
+ entry is added, which would recursively call ByteSize() on every log entry. Instead, we keep
+ the sum of all individual stats log entry sizes. The size of a proto is approximately the sum
+ of the size of all member protos.
+ */
+ size_t mBufferSize = 0;
+
+ /* Check if the buffer size exceeds the max buffer size when the new entry is added, and flush
+ the logs to dropbox if true. */
+ void flushIfNecessary(const StatsLogEntry& entry);
+
+};
+
+#endif //DROPBOX_WRITER_H
diff --git a/cmds/statsd/src/LogReader.cpp b/cmds/statsd/src/LogReader.cpp
index e0ed646..2a9e500 100644
--- a/cmds/statsd/src/LogReader.cpp
+++ b/cmds/statsd/src/LogReader.cpp
@@ -110,7 +110,7 @@
/* no pid restriction */ 0);
// Open the buffer(s)
- eventLogger = android_logger_open(loggers, LOG_ID_EVENTS);
+ eventLogger = android_logger_open(loggers, LOG_ID_STATS);
// Read forever
if (eventLogger) {
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
new file mode 100644
index 0000000..f49dfde
--- /dev/null
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 <StatsLogProcessor.h>
+
+#include <log/event_tag_map.h>
+#include <log/logprint.h>
+#include <utils/Errors.h>
+
+#include <frameworks/base/cmds/statsd/src/stats_log.pb.h>
+
+using namespace android;
+using android::os::statsd::StatsLogEntry;
+
+StatsLogProcessor::StatsLogProcessor() : m_dropbox_writer("all-logs")
+{
+ // Initialize the EventTagMap, which is how we know the names of the numeric event tags.
+ // If this fails, we can't print well, but something will print.
+ m_tags = android_openEventTagMap(NULL);
+
+ // Printing format
+ m_format = android_log_format_new();
+ android_log_setPrintFormat(m_format, FORMAT_THREADTIME);
+}
+
+StatsLogProcessor::~StatsLogProcessor()
+{
+ if (m_tags != NULL) {
+ android_closeEventTagMap(m_tags);
+ }
+ android_log_format_free(m_format);
+}
+
+void
+StatsLogProcessor::OnLogEvent(const log_msg& msg)
+{
+ status_t err;
+ AndroidLogEntry entry;
+ char buf[1024];
+
+ err = android_log_processBinaryLogBuffer(&(const_cast<log_msg*>(&msg)->entry_v1),
+ &entry, m_tags, buf, sizeof(buf));
+
+ // dump all statsd logs to dropbox for now.
+ // TODO: Add filtering, aggregation, etc.
+ if (err == NO_ERROR) {
+ StatsLogEntry logEntry;
+ logEntry.set_uid(entry.uid);
+ logEntry.set_pid(entry.pid);
+ logEntry.set_start_report_millis(entry.tv_sec / 1000 + entry.tv_nsec / 1000 / 1000);
+ logEntry.add_pairs()->set_value_str(entry.message, entry.messageLen);
+ m_dropbox_writer.addEntry(logEntry);
+ }
+}
+
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
new file mode 100644
index 0000000..23066ab9
--- /dev/null
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef STATS_LOG_PROCESSOR_H
+#define STATS_LOG_PROCESSOR_H
+
+#include "LogReader.h"
+#include "DropboxWriter.h"
+
+#include <log/logprint.h>
+#include <stdio.h>
+
+class StatsLogProcessor : public LogListener
+{
+public:
+ StatsLogProcessor();
+ virtual ~StatsLogProcessor();
+
+ virtual void OnLogEvent(const log_msg& msg);
+
+private:
+ /**
+ * Numeric to string tag name mapping.
+ */
+ EventTagMap* m_tags;
+
+ /**
+ * Pretty printing format.
+ */
+ AndroidLogFormat* m_format;
+
+ DropboxWriter m_dropbox_writer;
+};
+#endif //STATS_LOG_PROCESSOR_H
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 5ee07b4..030c760 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "statsd"
#include "StatsService.h"
+#include "DropboxReader.h"
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
@@ -27,6 +28,7 @@
#include <unistd.h>
#include <stdio.h>
+#include <stdlib.h>
using namespace android;
@@ -118,15 +120,13 @@
status_t
StatsService::command(FILE* in, FILE* out, FILE* err, Vector<String8>& args)
{
- fprintf(out, "StatsService::command:");
- ALOGD("StatsService::command:");
- const int N = args.size();
- for (int i=0; i<N; i++) {
- fprintf(out, " %s", String8(args[i]).string());
- ALOGD(" %s", String8(args[i]).string());
+ if (args.size() > 0) {
+ if (!args[0].compare(String8("print-stats-log")) && args.size() > 1) {
+ return doPrintStatsLog(out, args);
+ }
}
- fprintf(out, "\n");
+ printCmdHelp(out);
return NO_ERROR;
}
@@ -144,3 +144,18 @@
return Status::ok();
}
+status_t
+StatsService::doPrintStatsLog(FILE* out, const Vector<String8>& args) {
+ long msec = 0;
+
+ if (args.size() > 2) {
+ msec = strtol(args[2].string(), NULL, 10);
+ }
+ return DropboxReader::readStatsLogs(out, args[1].string(), msec);
+}
+
+void
+StatsService::printCmdHelp(FILE* out) {
+ fprintf(out, "Usage:\n");
+ fprintf(out, "\t print-stats-log [tag_required] [timestamp_nsec_optional]\n");
+}
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index 5dd9299..556b07b 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -45,6 +45,10 @@
virtual status_t command(FILE* in, FILE* out, FILE* err, Vector<String8>& args);
virtual Status systemRunning();
+
+private:
+ status_t doPrintStatsLog(FILE* out, const Vector<String8>& args);
+ void printCmdHelp(FILE* out);
};
#endif // STATS_SERVICE_H
diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp
index 93405cb..2c721c7 100644
--- a/cmds/statsd/src/main.cpp
+++ b/cmds/statsd/src/main.cpp
@@ -19,6 +19,7 @@
#include "LogEntryPrinter.h"
#include "LogReader.h"
#include "StatsService.h"
+#include "StatsLogProcessor.h"
#include <binder/IInterface.h>
#include <binder/IPCThreadState.h>
@@ -55,9 +56,8 @@
sp<LogReader> reader = new LogReader();
// Put the printer one first, so it will print before the real ones.
- if (true) {
- reader->AddListener(new LogEntryPrinter(STDOUT_FILENO));
- }
+ reader->AddListener(new LogEntryPrinter(STDOUT_FILENO));
+ reader->AddListener(new StatsLogProcessor());
// TODO: Construct and add real LogListners here.
diff --git a/cmds/statsd/src/stats_constants.proto b/cmds/statsd/src/stats_constants.proto
new file mode 100644
index 0000000..1787ae3
--- /dev/null
+++ b/cmds/statsd/src/stats_constants.proto
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+syntax = "proto2";
+
+package android.os.statsd;
+
+option optimize_for = LITE_RUNTIME;
+
+option java_package = "com.android.internal.logging";
+option java_outer_classname = "StatsConstantsProto";
+
+message StatsConstants {
+ // Event type.
+ enum Type {
+ WAKELOCK = 1;
+ SCREEN= 2;
+ }
+}
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
new file mode 100644
index 0000000..ec92023
--- /dev/null
+++ b/cmds/statsd/src/stats_log.proto
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+syntax = "proto2";
+
+package android.os.statsd;
+
+option optimize_for = LITE_RUNTIME;
+
+option java_package = "com.android.os";
+option java_outer_classname = "StatsLog";
+
+import "frameworks/base/cmds/statsd/src/statsd_config.proto";
+import "frameworks/base/cmds/statsd/src/stats_constants.proto";
+
+// StatsLogEntry is a generic proto holding a single metrics data.
+message StatsLogEntry {
+ // Type of stats.
+ optional android.os.statsd.StatsConstants.Type type = 1;
+
+ // Aggregation type of the data.
+ optional android.os.statsd.TrackedAggregateType aggregate_type = 2;
+
+ // Start timestamp of the interval. Timestamp for event-type data will have
+ // equal value for start_report_millis and end_report_millis.
+ optional int64 start_report_millis = 3;
+
+ // End timestamp of the interval.
+ optional int64 end_report_millis = 4;
+
+ // Package information for application-level data.
+ optional string package_name = 5;
+ optional int32 package_version = 6;
+ optional string package_version_string = 7;
+
+ // UID associated with the data.
+ optional int32 uid = 8;
+
+ // PID associated with the data.
+ optional int32 pid = 9;
+
+ // Payload contains key value pairs of the data from statsd.
+ message KeyValuePair {
+ // Integer representation of data type.
+ optional int32 key = 1;
+
+ oneof value {
+ string value_str = 2;
+ int64 value_int = 3;
+ bool value_bool = 4;
+ }
+ }
+ repeated KeyValuePair pairs = 10;
+
+ // Next tag: 11
+}
+
+// Data captured for a given metric during a given period of time.
+message StatsLogList {
+ // Unique ID for this metric.
+ optional int32 metric_id = 1;
+
+ // List of stats log entry.
+ repeated StatsLogEntry stats_log_entry = 2;
+}
diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto
new file mode 100644
index 0000000..2d034e5
--- /dev/null
+++ b/cmds/statsd/src/statsd_config.proto
@@ -0,0 +1,449 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+// Version 1.
+// Important: Update the version line above before copy-pasting this file
+// from/to Google3 and Android repository.
+// This proto needs to be manually synced between Google3 and Android versions.
+
+/*
+ * Note about semantics of the buckets:
+ * In this current proto scheme, the buckets are updated only when an event
+ * occurs. In the case of durations, this means that we update at the end of a
+ * duration.
+ *
+ * For example, suppose we have buckets at every 10 min:
+ * 0, 10, 20, 30, 40, etc.
+ * And then suppose a wakelock is first held starting at min 5 and lasts for 21
+ * mins. Then the buckets for 0-10 and 10-20 don't contain anything and inside
+ * the bucket for 20-30, we add the value of 21 minutes.
+ *
+ * Also note that buckets are only aligned to wall-clock (no custom time-bases).
+ */
+
+syntax = "proto2";
+package android.os.statsd;
+
+option optimize_for = LITE_RUNTIME;
+
+option java_package = "com.android.internal.os";
+option java_outer_classname = "StatsdConfigProto";
+
+// KeyMatcher specifies how to match the key.
+message KeyMatcher {
+ oneof contents {
+ int32 key = 1; // ID of the key to match.
+
+ // Special matcher for package name. This will match either the package name
+ // or the UID (statsD will map the UID of the source event to a package
+ // name). Specify the package name to match in eq_string.
+ bool use_package = 2;
+ }
+}
+
+// FieldMatcher allows us to match specific fields/keys in an event.
+message FieldMatcher {
+ optional KeyMatcher key_matcher = 1;
+
+ oneof value_matcher {
+ // Equality matchers
+ bool eq_bool = 2;
+ string eq_string = 3;
+ int32 eq_int32 = 4;
+ int64 eq_int64 = 5;
+
+ // Numeric comparisons;
+ int32 lt_int32 = 6;
+ int32 gt_int32 = 7;
+ int64 lt_int64 = 8;
+ int64 gt_int64 = 9;
+ float lt_float = 10;
+ float gt_float = 11;
+ }
+}
+
+enum OperationType {
+ AND = 1;
+ OR = 2;
+ NOT = 3; // Must have only a single operand when using NOT operator.
+ NAND = 4; // NAND and NOR as conveniences to avoid NOT+(AND/OR)-layers.
+ NOR = 5;
+}
+
+enum TrackedAggregateType {
+ // IS_RUNNING; // whether it is currently running
+ VALUE_COUNT = 1; // count number of events
+ VALUE_SUM = 2;
+ VALUE_MAX = 3;
+ VALUE_MIN = 4;
+ DURATION_SUM = 5; // cumulative total time
+ DURATION_MAX = 6; // longest continuously-on time
+ DURATION_MIN = 7; // shortest continuously-on time
+ //DURATION_CURRENT = 6; // current continuously-on time (not bucketed)
+}
+
+// Assume the events come in with a tag and an array of (key, value) tuples
+// where the key must be an int32 and value can be any type.
+message LineMatcher {
+ // For now, we assume that we don't flatten the tags (ie, one tag corresponds
+ // to screen-on and screen-off events and key 1 represents ON or OFF).
+ repeated int32 tag = 1; // Must match at least one of the tags.
+
+ message Nested {
+ optional OperationType operation = 1;
+ repeated LineMatcher matcher = 2;
+ }
+ oneof contents {
+ FieldMatcher requirement = 2;
+ Nested nested = 3;
+ }
+}
+
+// Defines when an AggregateCounter or EventMatcher applies.
+message Condition {
+ message Nested {
+ optional OperationType operation = 1;
+ repeated Condition nested_conditions = 2; // operands that are themselves
+ // conditions (recursively)
+ }
+
+ // Leaf node of condition.
+ message RangeMatcher {
+ optional LineMatcher start = 1;
+ optional LineMatcher stop = 2;
+ optional bool count_nesting = 3
+ [default = true]; // true if "start start stop" is still
+ // considered running
+
+ // Configure which fields define the slices. These fields must be present in
+ // both the start and stop lines. Note that this can be a subset of all the
+ // slices defined in the AggregateCounter.
+ // For example, if the counter slices on both app name and wake lock name,
+ // we can define that this range only slices on app name.
+ repeated KeyMatcher slice = 4;
+ }
+
+ oneof contents {
+ RangeMatcher range = 1; // Represents a leaf node.
+ Nested nested = 2; // Represents a non-leaf node.
+ }
+}
+
+// Emits matching events to statsd event buffer.
+message EventMatcher {
+ // Tracks what configuration led to uploading of this event.
+ optional int32 metric_id = 1;
+
+ // LineMatcher for the event to emit.
+ optional LineMatcher what = 2;
+
+ optional Condition condition = 3;
+
+ // TODO: Have a clear use-case for this in P or-else drop this for P.
+ message Filter {
+ }
+ optional Filter filter = 4;
+}
+
+// Hard-code the possible metrics that we can pull.
+// For example, NETSTATS_BY_UID would provide network usage per uid.
+// We should treat the results like a batch of individual log events, and we
+// should process them one-by-one to re-use our LineMatcher logic.
+enum PulledMetricSource {
+ NETSTATS = 1;
+}
+
+message AggregateCounter { // previously called Timer
+ // Specifies which fields in the message act as dimensions.
+ // For both pushed and pulled metrics, we assume every record has all the
+ // dimensions set.
+ message Slicer {
+ repeated KeyMatcher keys = 1;
+ }
+ optional Slicer slicer = 1;
+
+ message ValueSource {
+ message PushedMetric {
+ // LineMatcher for the event to apply.
+ // Slicing (which keys act as dimensions) should not be specified here.
+ optional LineMatcher what = 1;
+
+ // Only needed if one key should be treated as the value.
+ optional int32 value_key = 2;
+ }
+
+ // The values for pulled metrics are computed and aggregated at the end of
+ // the condition.
+ message PulledMetric {
+ optional bool compute_diff =
+ 1; // If we want the diff (if this
+ // metric is pulled when condition opens/closes).
+ optional PulledMetricSource metric = 2;
+
+ // We treat the pulled metrics as a batch of log-records that look like
+ // they came from LogD.
+ optional LineMatcher what = 3;
+ optional int32 value_field = 4;
+ }
+
+ oneof value {
+ PushedMetric pushed_metric = 1;
+
+ // Pulled metrics are computed when the duration closes (and are also
+ // fetched at the open if we need to compute a diff).
+ // Pulled metrics require a condition being defined.
+ // These metrics are not pulled at the end of every bucket.
+ PulledMetric pulled_metric = 2;
+
+ // Polled Metrics are pulled at the end of every bucket.
+ // Since the buckets are only planned to be on wall-clock for Android P,
+ // condition is NOT supported for polled metrics.
+ PulledMetric polled_metric = 3;
+ }
+ }
+ optional ValueSource value = 2;
+
+ message TrackedAggregate {
+ // Must be an integer that is uniquely chosen so we can identify the metric
+ // on server. We will provide a tool on server to help generate this.
+ optional int32 metric_id = 1;
+
+ optional TrackedAggregateType type = 2;
+
+ // Alert if the value, when summed over the Counter's number_of_buckets
+ // most-recent bins, exceeds min_threshold or is below max_threshold. For
+ // Anomaly Detection.
+ message Alert {
+ message IncidentdDetails {
+ optional string
+ alert_name = 1; // for humans and incidentd to identify this issue
+ repeated int32 incidentd_sections = 2; // tells incidentd what to do if
+ // alert triggers
+ }
+ optional IncidentdDetails incidentd_details = 1;
+ optional int32 number_of_buckets = 2;
+ // NOTE: that we assume the aggregate is only int.
+ optional int64 trigger_if_gt = 3; // min threshold
+ optional int64 trigger_if_lt = 4; // max_threshold;
+ optional int32 refractory_period_secs = 5; // alarm cannot fire a second
+ // time until elapsed
+ }
+ repeated Alert alerts = 3; // Support diff alert params for same aggregate.
+ } // end TrackedAggregate
+ repeated TrackedAggregate tracked_aggregates = 3;
+
+ optional Condition condition = 4;
+
+ message Bucket {
+ // TODO: Consider switching to second granularity.
+ // In practice, this must be chosen from a pre-defined list. So that we have
+ // flexiblity, we don't hard-code this as an enum today.
+ optional int64 bucket_size_msec = 1;
+ optional int32 max_number_of_bits = 2; // Max bits per bucket.
+ }
+ optional Bucket bucket = 5;
+
+ message MiscellaneousEffect {
+ optional LineMatcher matcher = 1; // When to trigger the effect
+
+ enum Effect {
+ STOP_ALL = 1; // Needed for stop-all events, where nested start value is
+ // forced to 0.
+ }
+ repeated Effect effects = 2;
+ } // end MiscellaneousEffect
+ repeated MiscellaneousEffect misc_effects = 6;
+} // end Counter
+
+// Alarm configs not tied to a particular Counter.
+message GlobalAlertParameters {
+ // No alarm can fire after any other alarm fired until this many seconds has
+ // elapsed.
+ optional int32 global_refractory_period_seconds = 1;
+}
+
+// The config defining all metrics to be captured.
+message StatsdConfig {
+ // Event matchers.
+ repeated EventMatcher event_matchers = 1;
+
+ // Aggregate counters.
+ repeated AggregateCounter aggregate_counters = 2;
+}
+
+/* Sample configurations start here:
+----Screen on time----
+AggregateCounter <
+ condition <
+ range <
+ start <
+ tag: SCREEN_ON
+ requirement <
+ key_matcher<
+ key: SCREEN_ON_VALUE
+ eq_bool: true
+ stop <
+ tag: SCREEN_ON
+ requirement <
+ key_matcher<
+ key: SCREEN_ON_VALUE
+ eq_bool: false
+ metric_id: # set on server
+ tracked_aggregates <
+ DURATION_SUM
+ (For brevity, omit the bucket options but they can also be set)
+
+----Screen off time----
+Should be like aboe but reversing start and stop
+
+----Log the screen change events----
+EventMatcher <
+ metric_id: # set on server
+ what <
+ tag: SCREEN_ON
+
+----Number of crashes (across system)----
+AggregateCounter <
+ metric_id: # set on server
+ tracked_aggregates <
+ VALUE_COUNT
+ value <
+ pushed_metric <
+ what <
+ tag: CRASH_TAG
+
+----Network Usage in bytes Per App While in Background----
+AggregateCounter <
+ metric_id: # set on server
+ slicer <
+ keys <
+ use_package_name: true
+ tracked_aggregates <
+ VALUE_SUM
+ value <
+ pulled_metric <
+ compute_diff: true
+ metric: Enum corresponding to network usage in bytes
+ condition <
+ range <
+ sliced: true
+ start <
+ tag: APP_FOREGROUND_TRANSITION (assume false means move to background)
+ requirement <
+ key_matcher<
+ key: APP_FOREGROUND_STATE
+ eq_bool: false
+ stop <
+ tag: APP_FOREGROUND_TRANSITION (assume false means move to background)
+ requirement <
+ key_matcher<
+ key: APP_FOREGROUND_STATE
+ eq_bool: true
+
+----Wakelock Acquire time per app and wakelock
+ while unplugged and screen off and in background process state----
+AggregateCounter <
+ metric_id: # set on server
+ slicer <
+ keys <
+ use_package_name: true
+ keys <
+ key: Key corresponding to wake_lock ID
+ tracked_aggregates <
+ DURATION_SUM
+ condition <
+ nested <
+ operation: AND
+ nested_conditions <
+ range <
+ start <
+ tag: PLUGGED_IN (assume false means uncharged)
+ requirement <
+ key_matcher<
+ key: PLUGGED_IN_STATE
+ eq_bool: false
+ stop <
+ tag: PLUGGED_IN (assume false means uncharged)
+ requirement <
+ key_matcher<
+ key: PLUGGED_IN_STATE
+ eq_bool: true
+ nested_conditions <
+ range <
+ start <
+ tag: SCREEN_ON
+ requirement <
+ key_matcher<
+ key: SCREEN_ON_STATE
+ eq_bool: false
+ stop <
+ tag: SCREEN_ON
+ requirement <
+ key_matcher<
+ key: SCREEN_ON_STATE
+ eq_bool: true
+ nested_conditions <
+ range <
+ start <
+ tag: PROCESS_CHANGE
+ requirement <
+ key_matcher<
+ key: PROCESS_STATE_VALUE
+ eq_int32: BACKGROUND_PROCESS
+ stop <
+ tag: PROCESS_CHANGE
+ nested <
+ operation: NOT
+ matcher< (This is an example of using the NOT to define stop)
+ requirement < (Note this requirement should match the start.)
+ key_matcher<
+ key: PROCESS_STATE_VALUE
+ eq_int32: BACKGROUND_PROCESS
+ slice<
+ use_package_name: true
+
+
+----Number of crashes (per app) ----
+AggregateCounter <
+ metric_id: # set on server
+ slicer <
+ keys<
+ use_package_name: true
+ tracked_aggregates <
+ VALUE_COUNT
+ value <
+ pushed_metric <
+ what <
+ tag: CRASH_TAG
+
+---- Number of transitions to background (per app) ----
+AggregateCounter <
+ metric_id: # set on server
+ slicer <
+ keys<
+ use_package_name: true
+ tracked_aggregates <
+ VALUE_COUNT
+ value <
+ pushed_metric <
+ what <
+ tag: APP_FOREGROUND_TRANSITION
+ requirement<
+ key: APP_FOREGROUND_TRANSITION_STATE
+ eq_bool: false
+
+*/
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 21f6739..40b266f 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -54831,3 +54831,2111 @@
Lsun/util/logging/PlatformLogger$1;
Lsun/util/logging/PlatformLogger$Level;
Lsun/util/logging/PlatformLogger;
+HPLandroid/accounts/IAccountAuthenticator;->addAccount(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticator;->addAccountFromCredentials(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticator;->confirmCredentials(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticator;->editProperties(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;)V
+HPLandroid/accounts/IAccountAuthenticator;->finishSession(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticator;->getAccountCredentialsForCloning(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;)V
+HPLandroid/accounts/IAccountAuthenticator;->getAccountRemovalAllowed(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;)V
+HPLandroid/accounts/IAccountAuthenticator;->getAuthToken(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticator;->getAuthTokenLabel(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;)V
+HPLandroid/accounts/IAccountAuthenticator;->hasFeatures(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)V
+HPLandroid/accounts/IAccountAuthenticator;->isCredentialsUpdateSuggested(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;)V
+HPLandroid/accounts/IAccountAuthenticator;->startAddAccountSession(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticator;->startUpdateCredentialsSession(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticator;->updateCredentials(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
+HPLandroid/accounts/IAccountAuthenticatorResponse;->onError(ILjava/lang/String;)V
+HPLandroid/accounts/IAccountAuthenticatorResponse;->onRequestContinued()V
+HPLandroid/app/IInstantAppResolver;->getInstantAppIntentFilterList([ILjava/lang/String;Ljava/lang/String;Landroid/os/IRemoteCallback;)V
+HPLandroid/app/IInstantAppResolver;->getInstantAppResolveInfoList([ILjava/lang/String;ILandroid/os/IRemoteCallback;)V
+HPLandroid/app/IProcessObserver;->onForegroundActivitiesChanged(IIZ)V
+HPLandroid/app/IProcessObserver;->onProcessDied(II)V
+HPLandroid/app/Notification;->getNotificationStyleClass(Ljava/lang/String;)Ljava/lang/Class;
+HPLandroid/app/WindowConfiguration;->hasWindowShadow()Z
+HPLandroid/app/backup/BackupHelper;->performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
+HPLandroid/app/backup/BackupHelper;->restoreEntity(Landroid/app/backup/BackupDataInputStream;)V
+HPLandroid/app/backup/BackupHelper;->writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V
+HPLandroid/app/backup/ISelectBackupTransportCallback;->onFailure(I)V
+HPLandroid/app/backup/ISelectBackupTransportCallback;->onSuccess(Ljava/lang/String;)V
+HPLandroid/app/usage/ICacheQuotaService;->computeCacheQuotaHints(Landroid/os/RemoteCallback;Ljava/util/List;)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onPackageAdded(Landroid/os/UserHandle;Ljava/lang/String;)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onPackageChanged(Landroid/os/UserHandle;Ljava/lang/String;)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onPackageRemoved(Landroid/os/UserHandle;Ljava/lang/String;)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onPackagesAvailable(Landroid/os/UserHandle;[Ljava/lang/String;Z)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onPackagesSuspended(Landroid/os/UserHandle;[Ljava/lang/String;)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onPackagesUnavailable(Landroid/os/UserHandle;[Ljava/lang/String;Z)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onPackagesUnsuspended(Landroid/os/UserHandle;[Ljava/lang/String;)V
+HPLandroid/content/pm/IOnAppsChangedListener;->onShortcutChanged(Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+HPLandroid/content/pm/IPackageInstallerCallback;->onSessionActiveChanged(IZ)V
+HPLandroid/content/pm/IPackageInstallerCallback;->onSessionBadgingChanged(I)V
+HPLandroid/content/pm/IPackageInstallerCallback;->onSessionCreated(I)V
+HPLandroid/content/pm/IPackageInstallerCallback;->onSessionFinished(IZ)V
+HPLandroid/content/pm/IPackageInstallerCallback;->onSessionProgressChanged(IF)V
+HPLandroid/content/pm/IPackageInstallerSession;->abandon()V
+HPLandroid/content/pm/IPackageInstallerSession;->addClientProgress(F)V
+HPLandroid/content/pm/IPackageInstallerSession;->close()V
+HPLandroid/content/pm/IPackageInstallerSession;->commit(Landroid/content/IntentSender;Z)V
+HPLandroid/content/pm/IPackageInstallerSession;->getNames()[Ljava/lang/String;
+HPLandroid/content/pm/IPackageInstallerSession;->openRead(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;
+HPLandroid/content/pm/IPackageInstallerSession;->openWrite(Ljava/lang/String;JJ)Landroid/os/ParcelFileDescriptor;
+HPLandroid/content/pm/IPackageInstallerSession;->removeSplit(Ljava/lang/String;)V
+HPLandroid/content/pm/IPackageInstallerSession;->setClientProgress(F)V
+HPLandroid/content/pm/IPackageInstallerSession;->transfer(Ljava/lang/String;)V
+HPLandroid/content/pm/PackageParser;->loadCertificates(Landroid/util/jar/StrictJarFile;Ljava/util/zip/ZipEntry;)[[Ljava/security/cert/Certificate;
+HPLandroid/content/pm/PackageParser;->readFullyIgnoringContents(Ljava/io/InputStream;)J
+HPLandroid/content/pm/split/SplitAssetLoader;->getBaseAssetManager()Landroid/content/res/AssetManager;
+HPLandroid/content/pm/split/SplitAssetLoader;->getSplitAssetManager(I)Landroid/content/res/AssetManager;
+HPLandroid/graphics/LeakyTypefaceStorage;->writeTypefaceToParcel(Landroid/graphics/Typeface;Landroid/os/Parcel;)V
+HPLandroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
+HPLandroid/hardware/location/IContextHubCallback;->onMessageReceipt(IILandroid/hardware/location/ContextHubMessage;)V
+HPLandroid/hardware/location/IGeofenceHardwareMonitorCallback;->onMonitoringSystemChange(Landroid/hardware/location/GeofenceHardwareMonitorEvent;)V
+HPLandroid/location/IGeofenceProvider;->setGeofenceHardware(Landroid/hardware/location/IGeofenceHardware;)V
+HPLandroid/net/INetworkRecommendationProvider;->requestScores([Landroid/net/NetworkKey;)V
+HPLandroid/os/FileUtils$1;->compare(Ljava/io/File;Ljava/io/File;)I
+HPLandroid/os/FileUtils$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLandroid/os/ShellCommand;->onCommand(Ljava/lang/String;)I
+HPLandroid/os/ShellCommand;->onHelp()V
+HPLandroid/print/IPrintSpooler;->clearCustomPrinterIconCache(Landroid/print/IPrintSpoolerCallbacks;I)V
+HPLandroid/print/IPrintSpooler;->createPrintJob(Landroid/print/PrintJobInfo;)V
+HPLandroid/print/IPrintSpooler;->getCustomPrinterIcon(Landroid/print/PrinterId;Landroid/print/IPrintSpoolerCallbacks;I)V
+HPLandroid/print/IPrintSpooler;->getPrintJobInfo(Landroid/print/PrintJobId;Landroid/print/IPrintSpoolerCallbacks;II)V
+HPLandroid/print/IPrintSpooler;->getPrintJobInfos(Landroid/print/IPrintSpoolerCallbacks;Landroid/content/ComponentName;III)V
+HPLandroid/print/IPrintSpooler;->onCustomPrinterIconLoaded(Landroid/print/PrinterId;Landroid/graphics/drawable/Icon;Landroid/print/IPrintSpoolerCallbacks;I)V
+HPLandroid/print/IPrintSpooler;->pruneApprovedPrintServices(Ljava/util/List;)V
+HPLandroid/print/IPrintSpooler;->removeObsoletePrintJobs()V
+HPLandroid/print/IPrintSpooler;->setClient(Landroid/print/IPrintSpoolerClient;)V
+HPLandroid/print/IPrintSpooler;->setPrintJobCancelling(Landroid/print/PrintJobId;Z)V
+HPLandroid/print/IPrintSpooler;->setPrintJobState(Landroid/print/PrintJobId;ILjava/lang/String;Landroid/print/IPrintSpoolerCallbacks;I)V
+HPLandroid/print/IPrintSpooler;->setPrintJobTag(Landroid/print/PrintJobId;Ljava/lang/String;Landroid/print/IPrintSpoolerCallbacks;I)V
+HPLandroid/print/IPrintSpooler;->setProgress(Landroid/print/PrintJobId;F)V
+HPLandroid/print/IPrintSpooler;->setStatus(Landroid/print/PrintJobId;Ljava/lang/CharSequence;)V
+HPLandroid/print/IPrintSpooler;->setStatusRes(Landroid/print/PrintJobId;ILjava/lang/CharSequence;)V
+HPLandroid/print/IPrintSpooler;->writePrintJobData(Landroid/os/ParcelFileDescriptor;Landroid/print/PrintJobId;)V
+HPLandroid/print/IPrintSpoolerCallbacks;->onCancelPrintJobResult(ZI)V
+HPLandroid/print/IPrintSpoolerClient;->onAllPrintJobsForServiceHandled(Landroid/content/ComponentName;)V
+HPLandroid/print/IPrintSpoolerClient;->onAllPrintJobsHandled()V
+HPLandroid/print/IPrintSpoolerClient;->onPrintJobQueued(Landroid/print/PrintJobInfo;)V
+HPLandroid/print/IPrintSpoolerClient;->onPrintJobStateChanged(Landroid/print/PrintJobInfo;)V
+HPLandroid/printservice/IPrintServiceClient;->getPrintJobInfo(Landroid/print/PrintJobId;)Landroid/print/PrintJobInfo;
+HPLandroid/printservice/IPrintServiceClient;->getPrintJobInfos()Ljava/util/List;
+HPLandroid/printservice/IPrintServiceClient;->onCustomPrinterIconLoaded(Landroid/print/PrinterId;Landroid/graphics/drawable/Icon;)V
+HPLandroid/printservice/IPrintServiceClient;->onPrintersAdded(Landroid/content/pm/ParceledListSlice;)V
+HPLandroid/printservice/IPrintServiceClient;->onPrintersRemoved(Landroid/content/pm/ParceledListSlice;)V
+HPLandroid/printservice/IPrintServiceClient;->setPrintJobState(Landroid/print/PrintJobId;ILjava/lang/String;)Z
+HPLandroid/printservice/IPrintServiceClient;->setPrintJobTag(Landroid/print/PrintJobId;Ljava/lang/String;)Z
+HPLandroid/printservice/IPrintServiceClient;->setProgress(Landroid/print/PrintJobId;F)V
+HPLandroid/printservice/IPrintServiceClient;->setStatus(Landroid/print/PrintJobId;Ljava/lang/CharSequence;)V
+HPLandroid/printservice/IPrintServiceClient;->setStatusRes(Landroid/print/PrintJobId;ILjava/lang/CharSequence;)V
+HPLandroid/printservice/IPrintServiceClient;->writePrintJobData(Landroid/os/ParcelFileDescriptor;Landroid/print/PrintJobId;)V
+HPLandroid/security/IKeyChainService;->containsCaAlias(Ljava/lang/String;)Z
+HPLandroid/security/IKeyChainService;->deleteCaCertificate(Ljava/lang/String;)Z
+HPLandroid/security/IKeyChainService;->getCaCertificateChainAliases(Ljava/lang/String;Z)Ljava/util/List;
+HPLandroid/security/IKeyChainService;->getCaCertificates(Ljava/lang/String;)[B
+HPLandroid/security/IKeyChainService;->getCertificate(Ljava/lang/String;)[B
+HPLandroid/security/IKeyChainService;->getEncodedCaCertificate(Ljava/lang/String;Z)[B
+HPLandroid/security/IKeyChainService;->getSystemCaAliases()Landroid/content/pm/StringParceledListSlice;
+HPLandroid/security/IKeyChainService;->getUserCaAliases()Landroid/content/pm/StringParceledListSlice;
+HPLandroid/security/IKeyChainService;->hasGrant(ILjava/lang/String;)Z
+HPLandroid/security/IKeyChainService;->installCaCertificate([B)Ljava/lang/String;
+HPLandroid/security/IKeyChainService;->installKeyPair([B[B[BLjava/lang/String;)Z
+HPLandroid/security/IKeyChainService;->removeKeyPair(Ljava/lang/String;)Z
+HPLandroid/security/IKeyChainService;->requestPrivateKey(Ljava/lang/String;)Ljava/lang/String;
+HPLandroid/security/IKeyChainService;->reset()Z
+HPLandroid/security/IKeyChainService;->setGrant(ILjava/lang/String;Z)V
+HPLandroid/service/voice/IVoiceInteractionService;->launchVoiceAssistFromKeyguard()V
+HPLandroid/service/voice/IVoiceInteractionService;->ready()V
+HPLandroid/service/voice/IVoiceInteractionService;->shutdown()V
+HPLandroid/service/voice/IVoiceInteractionService;->soundModelsChanged()V
+HPLandroid/system/Os;->lseek(Ljava/io/FileDescriptor;JI)J
+HPLandroid/text/style/TextAppearanceSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
+HPLandroid/util/jar/StrictJarFile$EntryIterator;->hasNext()Z
+HPLandroid/util/jar/StrictJarFile$EntryIterator;->next()Ljava/lang/Object;
+HPLandroid/util/jar/StrictJarFile$EntryIterator;->next()Ljava/util/zip/ZipEntry;
+HPLandroid/util/jar/StrictJarFile$FDStream;-><init>(Ljava/io/FileDescriptor;JJ)V
+HPLandroid/util/jar/StrictJarFile$FDStream;->read([BII)I
+HPLandroid/util/jar/StrictJarFile$JarFileInputStream;-><init>(Ljava/io/InputStream;JLandroid/util/jar/StrictJarVerifier$VerifierEntry;)V
+HPLandroid/util/jar/StrictJarFile$JarFileInputStream;->read([BII)I
+HPLandroid/util/jar/StrictJarFile$ZipInflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;ILjava/util/zip/ZipEntry;)V
+HPLandroid/util/jar/StrictJarFile$ZipInflaterInputStream;->read([BII)I
+HPLandroid/util/jar/StrictJarFile;->access$100(J)Ljava/util/zip/ZipEntry;
+HPLandroid/util/jar/StrictJarFile;->getCertificateChains(Ljava/util/zip/ZipEntry;)[[Ljava/security/cert/Certificate;
+HPLandroid/util/jar/StrictJarFile;->getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;
+HPLandroid/util/jar/StrictJarFile;->getZipInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;
+HPLandroid/util/jar/StrictJarManifest$Chunk;-><init>(II)V
+HPLandroid/util/jar/StrictJarManifest;->getAttributes(Ljava/lang/String;)Ljava/util/jar/Attributes;
+HPLandroid/util/jar/StrictJarManifest;->getEntries()Ljava/util/Map;
+HPLandroid/util/jar/StrictJarManifestReader;->readEntries(Ljava/util/Map;Ljava/util/Map;)V
+HPLandroid/util/jar/StrictJarManifestReader;->readHeader()Z
+HPLandroid/util/jar/StrictJarManifestReader;->readName()V
+HPLandroid/util/jar/StrictJarManifestReader;->readValue()V
+HPLandroid/util/jar/StrictJarVerifier$VerifierEntry;-><init>(Ljava/lang/String;Ljava/security/MessageDigest;[B[[Ljava/security/cert/Certificate;Ljava/util/Hashtable;)V
+HPLandroid/util/jar/StrictJarVerifier$VerifierEntry;->verify()V
+HPLandroid/util/jar/StrictJarVerifier$VerifierEntry;->write([BII)V
+HPLandroid/util/jar/StrictJarVerifier;->access$000([B[B)Z
+HPLandroid/util/jar/StrictJarVerifier;->getCertificateChains(Ljava/lang/String;)[[Ljava/security/cert/Certificate;
+HPLandroid/util/jar/StrictJarVerifier;->initEntry(Ljava/lang/String;)Landroid/util/jar/StrictJarVerifier$VerifierEntry;
+HPLandroid/util/jar/StrictJarVerifier;->verifyMessageDigest([B[B)Z
+HPLandroid/view/WindowManagerPolicy$StartingSurface;->remove()V
+HPLcom/android/internal/app/IMediaContainerService;->calculateInstalledSize(Ljava/lang/String;ZLjava/lang/String;)J
+HPLcom/android/internal/app/IMediaContainerService;->clearDirectory(Ljava/lang/String;)V
+HPLcom/android/internal/app/IMediaContainerService;->copyPackage(Ljava/lang/String;Lcom/android/internal/os/IParcelFileDescriptorFactory;)I
+HPLcom/android/internal/app/IMediaContainerService;->copyPackageToContainer(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZLjava/lang/String;)Ljava/lang/String;
+HPLcom/android/internal/app/IMediaContainerService;->getMinimalPackageInfo(Ljava/lang/String;ILjava/lang/String;)Landroid/content/pm/PackageInfoLite;
+HPLcom/android/internal/app/IMediaContainerService;->getObbInfo(Ljava/lang/String;)Landroid/content/res/ObbInfo;
+HPLcom/android/internal/app/procstats/DumpUtils;->collapseString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/internal/app/procstats/DumpUtils;->printAdjTag(Ljava/io/PrintWriter;I)V
+HPLcom/android/internal/app/procstats/DumpUtils;->printAdjTagAndValue(Ljava/io/PrintWriter;IJ)V
+HPLcom/android/internal/app/procstats/DumpUtils;->printArrayEntry(Ljava/io/PrintWriter;[Ljava/lang/String;II)I
+HPLcom/android/internal/app/procstats/DumpUtils;->printProcStateTag(Ljava/io/PrintWriter;I)V
+HPLcom/android/internal/app/procstats/DumpUtils;->printProcStateTagAndValue(Ljava/io/PrintWriter;IJ)V
+HPLcom/android/internal/app/procstats/ProcessState$PssAggr;-><init>()V
+HPLcom/android/internal/app/procstats/ProcessState;->aggregatePss(Lcom/android/internal/app/procstats/ProcessStats$TotalMemoryUseCollection;J)V
+HPLcom/android/internal/app/procstats/ProcessState;->dumpAllPssCheckin(Ljava/io/PrintWriter;)V
+HPLcom/android/internal/app/procstats/ProcessState;->dumpAllStateCheckin(Ljava/io/PrintWriter;J)V
+HPLcom/android/internal/app/procstats/ProcessState;->dumpPackageProcCheckin(Ljava/io/PrintWriter;Ljava/lang/String;IILjava/lang/String;J)V
+HPLcom/android/internal/app/procstats/ProcessState;->dumpProcCheckin(Ljava/io/PrintWriter;Ljava/lang/String;IJ)V
+HPLcom/android/internal/app/procstats/ProcessState;->getPssSampleCount(I)J
+HPLcom/android/internal/app/procstats/ProcessState;->readFromParcel(Landroid/os/Parcel;Z)Z
+HPLcom/android/internal/app/procstats/ProcessStats;->computeTotalMemoryUse(Lcom/android/internal/app/procstats/ProcessStats$TotalMemoryUseCollection;J)V
+HPLcom/android/internal/app/procstats/ProcessStats;->dumpCheckinLocked(Ljava/io/PrintWriter;Ljava/lang/String;)V
+HPLcom/android/internal/app/procstats/ProcessStats;->readCommonString(Landroid/os/Parcel;I)Ljava/lang/String;
+HPLcom/android/internal/app/procstats/ProcessStats;->readFromParcel(Landroid/os/Parcel;)V
+HPLcom/android/internal/app/procstats/ServiceState;->dumpTimeCheckin(Ljava/io/PrintWriter;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IIIJJ)V
+HPLcom/android/internal/app/procstats/ServiceState;->readFromParcel(Landroid/os/Parcel;)Z
+HPLcom/android/internal/app/procstats/SparseMappingTable$Table;->getValueForId(BI)J
+HPLcom/android/internal/app/procstats/SparseMappingTable$Table;->readFromParcel(Landroid/os/Parcel;)Z
+HPLcom/android/internal/app/procstats/SparseMappingTable$Table;->validateKeys(Z)Z
+HPLcom/android/internal/app/procstats/SparseMappingTable;->access$100(Lcom/android/internal/app/procstats/SparseMappingTable;)Ljava/util/ArrayList;
+HPLcom/android/internal/app/procstats/SparseMappingTable;->readCompactedLongArray(Landroid/os/Parcel;[JI)V
+HPLcom/android/internal/appwidget/IAppWidgetHost;->providerChanged(ILandroid/appwidget/AppWidgetProviderInfo;)V
+HPLcom/android/internal/appwidget/IAppWidgetHost;->providersChanged()V
+HPLcom/android/internal/appwidget/IAppWidgetHost;->updateAppWidget(ILandroid/widget/RemoteViews;)V
+HPLcom/android/internal/appwidget/IAppWidgetHost;->viewDataChanged(II)V
+HPLcom/android/internal/backup/IBackupTransport;->abortFullRestore()I
+HPLcom/android/internal/backup/IBackupTransport;->cancelFullBackup()V
+HPLcom/android/internal/backup/IBackupTransport;->checkFullBackupSize(J)I
+HPLcom/android/internal/backup/IBackupTransport;->clearBackupData(Landroid/content/pm/PackageInfo;)I
+HPLcom/android/internal/backup/IBackupTransport;->configurationIntent()Landroid/content/Intent;
+HPLcom/android/internal/backup/IBackupTransport;->currentDestinationString()Ljava/lang/String;
+HPLcom/android/internal/backup/IBackupTransport;->dataManagementIntent()Landroid/content/Intent;
+HPLcom/android/internal/backup/IBackupTransport;->dataManagementLabel()Ljava/lang/String;
+HPLcom/android/internal/backup/IBackupTransport;->finishBackup()I
+HPLcom/android/internal/backup/IBackupTransport;->finishRestore()V
+HPLcom/android/internal/backup/IBackupTransport;->getAvailableRestoreSets()[Landroid/app/backup/RestoreSet;
+HPLcom/android/internal/backup/IBackupTransport;->getBackupQuota(Ljava/lang/String;Z)J
+HPLcom/android/internal/backup/IBackupTransport;->getCurrentRestoreSet()J
+HPLcom/android/internal/backup/IBackupTransport;->getNextFullRestoreDataChunk(Landroid/os/ParcelFileDescriptor;)I
+HPLcom/android/internal/backup/IBackupTransport;->getRestoreData(Landroid/os/ParcelFileDescriptor;)I
+HPLcom/android/internal/backup/IBackupTransport;->initializeDevice()I
+HPLcom/android/internal/backup/IBackupTransport;->isAppEligibleForBackup(Landroid/content/pm/PackageInfo;Z)Z
+HPLcom/android/internal/backup/IBackupTransport;->name()Ljava/lang/String;
+HPLcom/android/internal/backup/IBackupTransport;->nextRestorePackage()Landroid/app/backup/RestoreDescription;
+HPLcom/android/internal/backup/IBackupTransport;->performBackup(Landroid/content/pm/PackageInfo;Landroid/os/ParcelFileDescriptor;I)I
+HPLcom/android/internal/backup/IBackupTransport;->performFullBackup(Landroid/content/pm/PackageInfo;Landroid/os/ParcelFileDescriptor;I)I
+HPLcom/android/internal/backup/IBackupTransport;->requestBackupTime()J
+HPLcom/android/internal/backup/IBackupTransport;->requestFullBackupTime()J
+HPLcom/android/internal/backup/IBackupTransport;->sendBackupData(I)I
+HPLcom/android/internal/backup/IBackupTransport;->startRestore(J[Landroid/content/pm/PackageInfo;)I
+HPLcom/android/internal/backup/IBackupTransport;->transportDirName()Ljava/lang/String;
+HPLcom/android/internal/content/PackageHelper$TestableInterface;->getAllow3rdPartyOnInternalConfig(Landroid/content/Context;)Z
+HPLcom/android/internal/content/PackageHelper$TestableInterface;->getDataDirectory()Ljava/io/File;
+HPLcom/android/internal/content/PackageHelper$TestableInterface;->getExistingAppInfo(Landroid/content/Context;Ljava/lang/String;)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/internal/content/PackageHelper$TestableInterface;->getForceAllowOnExternalSetting(Landroid/content/Context;)Z
+HPLcom/android/internal/content/PackageHelper$TestableInterface;->getStorageManager(Landroid/content/Context;)Landroid/os/storage/StorageManager;
+HPLcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiBatchedScanTime(IJI)J
+HPLcom/android/internal/os/IShellCallback;->openOutputFile(Ljava/lang/String;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;
+HPLcom/android/internal/os/WifiPowerEstimator;->calculateApp(Lcom/android/internal/os/BatterySipper;Landroid/os/BatteryStats$Uid;JJI)V
+HPLcom/android/server/BootReceiver;->addFileWithFootersToDropBox(Landroid/os/DropBoxManager;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V
+HPLjava/util/Base64$Encoder;->encode0([BII[B)I
+HPLjava/util/Base64;->getDecoder()Ljava/util/Base64$Decoder;
+HPLjava/util/HashMap;->comparableClassFor(Ljava/lang/Object;)Ljava/lang/Class;
+HPLjava/util/Hashtable$HashtableEntry;->getValue()Ljava/lang/Object;
+HPLjava/util/concurrent/CompletableFuture$Completion;->isLive()Z
+HPLjava/util/concurrent/CompletableFuture$Completion;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
+HPLjava/util/concurrent/ForkJoinPool$ManagedBlocker;->block()Z
+HPLjava/util/concurrent/ForkJoinPool$ManagedBlocker;->isReleasable()Z
+HPLjava/util/jar/Attributes;->getValue(Ljava/lang/String;)Ljava/lang/String;
+HPLjava/util/zip/ZipEntry;->getCompressedSize()J
+HPLjava/util/zip/ZipEntry;->getDataOffset()J
+HPLlibcore/io/Streams;->readFullyNoClose(Ljava/io/InputStream;)[B
+HPLlibcore/net/http/Dns;->lookup(Ljava/lang/String;)Ljava/util/List;
+HSLandroid/os/IRemoteCallback;->sendResult(Landroid/os/Bundle;)V
+HSLandroid/os/TokenWatcher;->acquired()V
+HSLandroid/os/TokenWatcher;->released()V
+HSLcom/android/internal/os/ProcessCpuTracker$FilterStats;->needed(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
+HSLjava/util/stream/AbstractSpinedBuffer;->clear()V
+HSLjava/util/stream/Node$Builder$OfInt;->build()Ljava/util/stream/Node$OfInt;
+HSLjava/util/stream/Node$Builder;->build()Ljava/util/stream/Node;
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->disableSelf()V
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->findAccessibilityNodeInfoByAccessibilityId(IJILandroid/view/accessibility/IAccessibilityInteractionConnectionCallback;IJLandroid/os/Bundle;)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->findAccessibilityNodeInfosByText(IJLjava/lang/String;ILandroid/view/accessibility/IAccessibilityInteractionConnectionCallback;J)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->findAccessibilityNodeInfosByViewId(IJLjava/lang/String;ILandroid/view/accessibility/IAccessibilityInteractionConnectionCallback;J)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->findFocus(IJIILandroid/view/accessibility/IAccessibilityInteractionConnectionCallback;J)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->focusSearch(IJIILandroid/view/accessibility/IAccessibilityInteractionConnectionCallback;J)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->getMagnificationCenterX()F
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->getMagnificationCenterY()F
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->getMagnificationRegion()Landroid/graphics/Region;
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->getMagnificationScale()F
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->getWindow(I)Landroid/view/accessibility/AccessibilityWindowInfo;
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->getWindows()Ljava/util/List;
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->isAccessibilityButtonAvailable()Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->isFingerprintGestureDetectionAvailable()Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->performAccessibilityAction(IJILandroid/os/Bundle;ILandroid/view/accessibility/IAccessibilityInteractionConnectionCallback;J)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->performGlobalAction(I)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->resetMagnification(Z)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->sendGesture(ILandroid/content/pm/ParceledListSlice;)V
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->setMagnificationCallbackEnabled(Z)V
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->setMagnificationScaleAndCenter(FFFZ)Z
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->setOnKeyEventResult(ZI)V
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->setServiceInfo(Landroid/accessibilityservice/AccessibilityServiceInfo;)V
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->setSoftKeyboardCallbackEnabled(Z)V
+HSPLandroid/accessibilityservice/IAccessibilityServiceConnection;->setSoftKeyboardShowMode(I)Z
+HSPLandroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;->onAppPermissionChanged(Landroid/accounts/Account;I)V
+HSPLandroid/accounts/AccountManagerInternal;->addOnAppPermissionChangeListener(Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;)V
+HSPLandroid/accounts/AccountManagerInternal;->backupAccountAccessPermissions(I)[B
+HSPLandroid/accounts/AccountManagerInternal;->hasAccountAccess(Landroid/accounts/Account;I)Z
+HSPLandroid/accounts/AccountManagerInternal;->requestAccountAccess(Landroid/accounts/Account;Ljava/lang/String;ILandroid/os/RemoteCallback;)V
+HSPLandroid/accounts/AccountManagerInternal;->restoreAccountAccessPermissions([BI)V
+HSPLandroid/app/ActivityManager$OnUidImportanceListener;->onUidImportance(II)V
+HSPLandroid/app/ActivityManagerInternal$SleepToken;->release()V
+HSPLandroid/app/ActivityManagerInternal;->acquireSleepToken(Ljava/lang/String;I)Landroid/app/ActivityManagerInternal$SleepToken;
+HSPLandroid/app/ActivityManagerInternal;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
+HSPLandroid/app/ActivityManagerInternal;->clearSavedANRState()V
+HSPLandroid/app/ActivityManagerInternal;->getHomeActivityForUser(I)Landroid/content/ComponentName;
+HSPLandroid/app/ActivityManagerInternal;->getTopVisibleActivities()Ljava/util/List;
+HSPLandroid/app/ActivityManagerInternal;->getUidProcessState(I)I
+HSPLandroid/app/ActivityManagerInternal;->grantUriPermissionFromIntent(ILjava/lang/String;Landroid/content/Intent;I)V
+HSPLandroid/app/ActivityManagerInternal;->isSystemReady()Z
+HSPLandroid/app/ActivityManagerInternal;->killForegroundAppsForUser(I)V
+HSPLandroid/app/ActivityManagerInternal;->notifyAppTransitionCancelled()V
+HSPLandroid/app/ActivityManagerInternal;->notifyAppTransitionFinished()V
+HSPLandroid/app/ActivityManagerInternal;->notifyAppTransitionStarting(Landroid/util/SparseIntArray;J)V
+HSPLandroid/app/ActivityManagerInternal;->notifyDockedStackMinimizedChanged(Z)V
+HSPLandroid/app/ActivityManagerInternal;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;)V
+HSPLandroid/app/ActivityManagerInternal;->notifyKeyguardTrustedChanged()V
+HSPLandroid/app/ActivityManagerInternal;->notifyNetworkPolicyRulesUpdated(IJ)V
+HSPLandroid/app/ActivityManagerInternal;->onLocalVoiceInteractionStarted(Landroid/os/IBinder;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)V
+HSPLandroid/app/ActivityManagerInternal;->onUserRemoved(I)V
+HSPLandroid/app/ActivityManagerInternal;->onWakefulnessChanged(I)V
+HSPLandroid/app/ActivityManagerInternal;->saveANRState(Ljava/lang/String;)V
+HSPLandroid/app/ActivityManagerInternal;->setDeviceIdleWhitelist([I)V
+HSPLandroid/app/ActivityManagerInternal;->setFocusedActivity(Landroid/os/IBinder;)V
+HSPLandroid/app/ActivityManagerInternal;->setHasOverlayUi(IZ)V
+HSPLandroid/app/ActivityManagerInternal;->setPendingIntentWhitelistDuration(Landroid/content/IIntentSender;Landroid/os/IBinder;J)V
+HSPLandroid/app/ActivityManagerInternal;->setVr2dDisplayId(I)V
+HSPLandroid/app/ActivityManagerInternal;->startActivitiesAsPackage(Ljava/lang/String;I[Landroid/content/Intent;Landroid/os/Bundle;)I
+HSPLandroid/app/ActivityManagerInternal;->startIsolatedProcess(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Runnable;)I
+HSPLandroid/app/ActivityManagerInternal;->updateDeviceIdleTempWhitelist([IIZ)V
+HSPLandroid/app/ActivityManagerInternal;->updatePersistentConfigurationForUser(Landroid/content/res/Configuration;I)V
+HSPLandroid/app/ActivityThread;->access$2300(Landroid/app/ActivityThread;Landroid/app/ActivityThread$CreateServiceData;)V
+HSPLandroid/app/ActivityThread;->access$2400(Landroid/app/ActivityThread;Landroid/app/ActivityThread$BindServiceData;)V
+HSPLandroid/app/ActivityThread;->access$2600(Landroid/app/ActivityThread;Landroid/app/ActivityThread$ServiceArgsData;)V
+HSPLandroid/app/ActivityThread;->access$3400(Landroid/app/ActivityThread;Landroid/os/Bundle;)V
+HSPLandroid/app/IActivityManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HSPLandroid/app/IAlarmCompleteListener;->alarmComplete(Landroid/os/IBinder;)V
+HSPLandroid/app/IApplicationThread$Stub$Proxy;->runIsolatedEntryPoint(Ljava/lang/String;[Ljava/lang/String;)V
+HSPLandroid/app/ISearchManager;->getGlobalSearchActivities()Ljava/util/List;
+HSPLandroid/app/ISearchManager;->getGlobalSearchActivity()Landroid/content/ComponentName;
+HSPLandroid/app/ISearchManager;->getSearchableInfo(Landroid/content/ComponentName;)Landroid/app/SearchableInfo;
+HSPLandroid/app/ISearchManager;->getSearchablesInGlobalSearch()Ljava/util/List;
+HSPLandroid/app/ISearchManager;->getWebSearchActivity()Landroid/content/ComponentName;
+HSPLandroid/app/ISearchManager;->launchAssist(Landroid/os/Bundle;)V
+HSPLandroid/app/ISearchManager;->launchLegacyAssist(Ljava/lang/String;ILandroid/os/Bundle;)Z
+HSPLandroid/app/ITaskStackListener;->onActivityDismissingDockedStack()V
+HSPLandroid/app/ITaskStackListener;->onActivityForcedResizable(Ljava/lang/String;II)V
+HSPLandroid/app/ITaskStackListener;->onActivityLaunchOnSecondaryDisplayFailed()V
+HSPLandroid/app/ITaskStackListener;->onActivityPinned(Ljava/lang/String;I)V
+HSPLandroid/app/ITaskStackListener;->onActivityRequestedOrientationChanged(II)V
+HSPLandroid/app/ITaskStackListener;->onActivityUnpinned()V
+HSPLandroid/app/ITaskStackListener;->onPinnedActivityRestartAttempt(Z)V
+HSPLandroid/app/ITaskStackListener;->onPinnedStackAnimationEnded()V
+HSPLandroid/app/ITaskStackListener;->onPinnedStackAnimationStarted()V
+HSPLandroid/app/ITaskStackListener;->onTaskCreated(ILandroid/content/ComponentName;)V
+HSPLandroid/app/ITaskStackListener;->onTaskDescriptionChanged(ILandroid/app/ActivityManager$TaskDescription;)V
+HSPLandroid/app/ITaskStackListener;->onTaskMovedToFront(I)V
+HSPLandroid/app/ITaskStackListener;->onTaskProfileLocked(II)V
+HSPLandroid/app/ITaskStackListener;->onTaskRemovalStarted(I)V
+HSPLandroid/app/ITaskStackListener;->onTaskRemoved(I)V
+HSPLandroid/app/ITaskStackListener;->onTaskSnapshotChanged(ILandroid/app/ActivityManager$TaskSnapshot;)V
+HSPLandroid/app/ITaskStackListener;->onTaskStackChanged()V
+HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args$$Lambda$0;->run()V
+HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args;->lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args()V
+HSPLandroid/app/Notification$$Lambda$0;->onMarshaled(Landroid/app/PendingIntent;Landroid/os/Parcel;I)V
+HSPLandroid/app/Notification$Extender;->extend(Landroid/app/Notification$Builder;)Landroid/app/Notification$Builder;
+HSPLandroid/app/Notification;->lambda$writeToParcel$0$Notification(Landroid/os/Parcel;Landroid/app/PendingIntent;Landroid/os/Parcel;I)V
+HSPLandroid/app/NotificationChannelGroup;->populateFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLandroid/app/NotificationChannelGroup;->safeBool(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Z)Z
+HSPLandroid/app/NotificationChannelGroup;->setBlocked(Z)V
+HSPLandroid/app/NotificationChannelGroup;->setDescription(Ljava/lang/String;)V
+HSPLandroid/app/SynchronousUserSwitchObserver;->onUserSwitching(I)V
+HSPLandroid/app/WindowConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/WindowConfiguration;
+HSPLandroid/app/WindowConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HSPLandroid/app/WindowConfiguration;-><init>(Landroid/os/Parcel;)V
+HSPLandroid/app/WindowConfiguration;-><init>(Landroid/os/Parcel;Landroid/app/WindowConfiguration$1;)V
+HSPLandroid/app/WindowConfiguration;->activityTypeToString(I)Ljava/lang/String;
+HSPLandroid/app/WindowConfiguration;->canReceiveKeys()Z
+HSPLandroid/app/WindowConfiguration;->compareTo(Landroid/app/WindowConfiguration;)I
+HSPLandroid/app/WindowConfiguration;->diff(Landroid/app/WindowConfiguration;Z)J
+HSPLandroid/app/WindowConfiguration;->equals(Ljava/lang/Object;)Z
+HSPLandroid/app/WindowConfiguration;->getActivityType()I
+HSPLandroid/app/WindowConfiguration;->getAppBounds()Landroid/graphics/Rect;
+HSPLandroid/app/WindowConfiguration;->getWindowingMode()I
+HSPLandroid/app/WindowConfiguration;->isAlwaysOnTop()Z
+HSPLandroid/app/WindowConfiguration;->readFromParcel(Landroid/os/Parcel;)V
+HSPLandroid/app/WindowConfiguration;->setActivityType(I)V
+HSPLandroid/app/WindowConfiguration;->setAppBounds(IIII)V
+HSPLandroid/app/WindowConfiguration;->setAppBounds(Landroid/graphics/Rect;)V
+HSPLandroid/app/WindowConfiguration;->setTo(Landroid/app/WindowConfiguration;)V
+HSPLandroid/app/WindowConfiguration;->setToDefaults()V
+HSPLandroid/app/WindowConfiguration;->setWindowingMode(I)V
+HSPLandroid/app/WindowConfiguration;->tasksAreFloating()Z
+HSPLandroid/app/WindowConfiguration;->toString()Ljava/lang/String;
+HSPLandroid/app/WindowConfiguration;->updateFrom(Landroid/app/WindowConfiguration;)I
+HSPLandroid/app/WindowConfiguration;->useWindowFrameForBackdrop()Z
+HSPLandroid/app/WindowConfiguration;->windowingModeToString(I)Ljava/lang/String;
+HSPLandroid/app/WindowConfiguration;->windowsAreScaleable()Z
+HSPLandroid/app/WindowConfiguration;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;->onCrossProfileWidgetProvidersChanged(ILjava/util/List;)V
+HSPLandroid/app/admin/DevicePolicyManagerInternal;->addOnCrossProfileWidgetProvidersChangeListener(Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;)V
+HSPLandroid/app/admin/DevicePolicyManagerInternal;->createShowAdminSupportIntent(IZ)Landroid/content/Intent;
+HSPLandroid/app/admin/DevicePolicyManagerInternal;->createUserRestrictionSupportIntent(ILjava/lang/String;)Landroid/content/Intent;
+HSPLandroid/app/admin/DevicePolicyManagerInternal;->getCrossProfileWidgetProviders(I)Ljava/util/List;
+HSPLandroid/app/admin/DevicePolicyManagerInternal;->isActiveAdminWithPolicy(II)Z
+HSPLandroid/app/admin/IDevicePolicyManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HSPLandroid/app/timezone/IRulesManager;->getRulesState()Landroid/app/timezone/RulesState;
+HSPLandroid/app/timezone/IRulesManager;->requestInstall(Landroid/os/ParcelFileDescriptor;[BLandroid/app/timezone/ICallback;)I
+HSPLandroid/app/timezone/IRulesManager;->requestNothing([BZ)V
+HSPLandroid/app/timezone/IRulesManager;->requestUninstall([BLandroid/app/timezone/ICallback;)I
+HSPLandroid/app/trust/IStrongAuthTracker;->onStrongAuthRequiredChanged(II)V
+HSPLandroid/app/trust/ITrustListener;->onTrustChanged(ZII)V
+HSPLandroid/app/trust/ITrustListener;->onTrustManagedChanged(ZI)V
+HSPLandroid/app/usage/IUsageStatsManager;->isAppInactive(Ljava/lang/String;I)Z
+HSPLandroid/app/usage/IUsageStatsManager;->onCarrierPrivilegedAppsChanged()V
+HSPLandroid/app/usage/IUsageStatsManager;->queryConfigurationStats(IJJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+HSPLandroid/app/usage/IUsageStatsManager;->queryEvents(JJLjava/lang/String;)Landroid/app/usage/UsageEvents;
+HSPLandroid/app/usage/IUsageStatsManager;->queryUsageStats(IJJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+HSPLandroid/app/usage/IUsageStatsManager;->reportChooserSelection(Ljava/lang/String;ILjava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/app/usage/IUsageStatsManager;->setAppInactive(Ljava/lang/String;ZI)V
+HSPLandroid/app/usage/IUsageStatsManager;->whitelistAppTemporarily(Ljava/lang/String;JI)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->addAppIdleStateChangeListener(Landroid/app/usage/UsageStatsManagerInternal$AppIdleStateChangeListener;)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->applyRestoredPayload(ILjava/lang/String;[B)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->getBackupPayload(ILjava/lang/String;)[B
+HSPLandroid/app/usage/UsageStatsManagerInternal;->getIdleUidsForUser(I)[I
+HSPLandroid/app/usage/UsageStatsManagerInternal;->isAppIdle(Ljava/lang/String;II)Z
+HSPLandroid/app/usage/UsageStatsManagerInternal;->isAppIdleParoleOn()Z
+HSPLandroid/app/usage/UsageStatsManagerInternal;->prepareShutdown()V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->queryUsageStatsForUser(IIJJZ)Ljava/util/List;
+HSPLandroid/app/usage/UsageStatsManagerInternal;->removeAppIdleStateChangeListener(Landroid/app/usage/UsageStatsManagerInternal$AppIdleStateChangeListener;)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->reportConfigurationChange(Landroid/content/res/Configuration;I)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->reportEvent(Landroid/content/ComponentName;II)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->reportEvent(Ljava/lang/String;II)V
+HSPLandroid/app/usage/UsageStatsManagerInternal;->reportShortcutUsage(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/bluetooth/IBluetoothCallback;->onBluetoothStateChange(II)V
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->answerCall()Z
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->cdmaSetSecondCallState(Z)V
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->cdmaSwapSecondCallState()V
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->getNetworkOperator()Ljava/lang/String;
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->getSubscriberNumber()Ljava/lang/String;
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->hangupCall()Z
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->listCurrentCalls()Z
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->processChld(I)Z
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->queryPhoneState()Z
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->sendDtmf(I)Z
+HSPLandroid/bluetooth/IBluetoothHeadsetPhone;->updateBtHandsfreeAfterRadioTechnologyChange()V
+HSPLandroid/companion/ICompanionDeviceManager;->associate(Landroid/companion/AssociationRequest;Landroid/companion/IFindDeviceCallback;Ljava/lang/String;)V
+HSPLandroid/companion/ICompanionDeviceManager;->disassociate(Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/companion/ICompanionDeviceManager;->getAssociations(Ljava/lang/String;I)Ljava/util/List;
+HSPLandroid/companion/ICompanionDeviceManager;->hasNotificationAccess(Landroid/content/ComponentName;)Z
+HSPLandroid/companion/ICompanionDeviceManager;->requestNotificationAccess(Landroid/content/ComponentName;)Landroid/app/PendingIntent;
+HSPLandroid/companion/ICompanionDeviceManager;->stopScan(Landroid/companion/AssociationRequest;Landroid/companion/IFindDeviceCallback;Ljava/lang/String;)V
+HSPLandroid/content/Intent;->toInsecureString()Ljava/lang/String;
+HSPLandroid/content/ServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+HSPLandroid/content/ServiceConnection;->onServiceDisconnected(Landroid/content/ComponentName;)V
+HSPLandroid/content/om/IOverlayManager;->getAllOverlays(I)Ljava/util/Map;
+HSPLandroid/content/om/IOverlayManager;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
+HSPLandroid/content/om/IOverlayManager;->getOverlayInfosForTarget(Ljava/lang/String;I)Ljava/util/List;
+HSPLandroid/content/om/IOverlayManager;->setEnabled(Ljava/lang/String;ZI)Z
+HSPLandroid/content/om/IOverlayManager;->setEnabledExclusive(Ljava/lang/String;ZI)Z
+HSPLandroid/content/om/IOverlayManager;->setHighestPriority(Ljava/lang/String;I)Z
+HSPLandroid/content/om/IOverlayManager;->setLowestPriority(Ljava/lang/String;I)Z
+HSPLandroid/content/om/IOverlayManager;->setPriority(Ljava/lang/String;Ljava/lang/String;I)Z
+HSPLandroid/content/pm/ActivityInfo;->resizeModeToString(I)Ljava/lang/String;
+HSPLandroid/content/pm/ILauncherApps;->addOnAppsChangedListener(Ljava/lang/String;Landroid/content/pm/IOnAppsChangedListener;)V
+HSPLandroid/content/pm/ILauncherApps;->getApplicationInfo(Ljava/lang/String;Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;
+HSPLandroid/content/pm/ILauncherApps;->getLauncherActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+HSPLandroid/content/pm/ILauncherApps;->getShortcutConfigActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+HSPLandroid/content/pm/ILauncherApps;->getShortcutConfigActivityIntent(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Landroid/content/IntentSender;
+HSPLandroid/content/pm/ILauncherApps;->getShortcutIconFd(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/os/ParcelFileDescriptor;
+HSPLandroid/content/pm/ILauncherApps;->getShortcutIconResId(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I
+HSPLandroid/content/pm/ILauncherApps;->getShortcuts(Ljava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;ILandroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+HSPLandroid/content/pm/ILauncherApps;->hasShortcutHostPermission(Ljava/lang/String;)Z
+HSPLandroid/content/pm/ILauncherApps;->isActivityEnabled(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Z
+HSPLandroid/content/pm/ILauncherApps;->isPackageEnabled(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Z
+HSPLandroid/content/pm/ILauncherApps;->pinShortcuts(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Landroid/os/UserHandle;)V
+HSPLandroid/content/pm/ILauncherApps;->removeOnAppsChangedListener(Landroid/content/pm/IOnAppsChangedListener;)V
+HSPLandroid/content/pm/ILauncherApps;->resolveActivity(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Landroid/content/pm/ActivityInfo;
+HSPLandroid/content/pm/ILauncherApps;->showAppDetailsAsUser(Ljava/lang/String;Landroid/content/ComponentName;Landroid/graphics/Rect;Landroid/os/Bundle;Landroid/os/UserHandle;)V
+HSPLandroid/content/pm/ILauncherApps;->startActivityAsUser(Ljava/lang/String;Landroid/content/ComponentName;Landroid/graphics/Rect;Landroid/os/Bundle;Landroid/os/UserHandle;)V
+HSPLandroid/content/pm/ILauncherApps;->startShortcut(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;I)Z
+HSPLandroid/content/pm/IOnPermissionsChangeListener;->onPermissionsChanged(I)V
+HSPLandroid/content/pm/IOtaDexopt;->cleanup()V
+HSPLandroid/content/pm/IOtaDexopt;->dexoptNextPackage()V
+HSPLandroid/content/pm/IOtaDexopt;->getProgress()F
+HSPLandroid/content/pm/IOtaDexopt;->isDone()Z
+HSPLandroid/content/pm/IOtaDexopt;->nextDexoptCommand()Ljava/lang/String;
+HSPLandroid/content/pm/IOtaDexopt;->prepare()V
+HSPLandroid/content/pm/IPackageManagerNative;->getNamesForUids([I)[Ljava/lang/String;
+HSPLandroid/content/pm/IPackageMoveObserver;->onCreated(ILandroid/os/Bundle;)V
+HSPLandroid/content/pm/IPackageMoveObserver;->onStatusChanged(IIJ)V
+HSPLandroid/content/pm/PackageManagerInternal$ExternalSourcesPolicy;->getPackageTrustedToInstallApps(Ljava/lang/String;I)I
+HSPLandroid/content/pm/PackageManagerInternal$SyncAdapterPackagesProvider;->getPackages(Ljava/lang/String;I)[Ljava/lang/String;
+HSPLandroid/content/pm/PackageManagerInternal;->addIsolatedUid(II)V
+HSPLandroid/content/pm/PackageManagerInternal;->canAccessInstantApps(II)Z
+HSPLandroid/content/pm/PackageManagerInternal;->getActivityInfo(Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
+HSPLandroid/content/pm/PackageManagerInternal;->getApplicationInfo(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+HSPLandroid/content/pm/PackageManagerInternal;->getHomeActivitiesAsUser(Ljava/util/List;I)Landroid/content/ComponentName;
+HSPLandroid/content/pm/PackageManagerInternal;->getNameForUid(I)Ljava/lang/String;
+HSPLandroid/content/pm/PackageManagerInternal;->getOverlayPackages(I)Ljava/util/List;
+HSPLandroid/content/pm/PackageManagerInternal;->getPackageInfo(Ljava/lang/String;III)Landroid/content/pm/PackageInfo;
+HSPLandroid/content/pm/PackageManagerInternal;->getSetupWizardPackageName()Ljava/lang/String;
+HSPLandroid/content/pm/PackageManagerInternal;->getTargetPackageNames(I)Ljava/util/List;
+HSPLandroid/content/pm/PackageManagerInternal;->getUidTargetSdkVersion(I)I
+HSPLandroid/content/pm/PackageManagerInternal;->grantDefaultPermissionsToDefaultDialerApp(Ljava/lang/String;I)V
+HSPLandroid/content/pm/PackageManagerInternal;->grantDefaultPermissionsToDefaultSimCallManager(Ljava/lang/String;I)V
+HSPLandroid/content/pm/PackageManagerInternal;->grantDefaultPermissionsToDefaultSmsApp(Ljava/lang/String;I)V
+HSPLandroid/content/pm/PackageManagerInternal;->grantEphemeralAccess(ILandroid/content/Intent;II)V
+HSPLandroid/content/pm/PackageManagerInternal;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;IZ)V
+HSPLandroid/content/pm/PackageManagerInternal;->hasInstantApplicationMetadata(Ljava/lang/String;I)Z
+HSPLandroid/content/pm/PackageManagerInternal;->isInstantAppInstallerComponent(Landroid/content/ComponentName;)Z
+HSPLandroid/content/pm/PackageManagerInternal;->isPackageDataProtected(ILjava/lang/String;)Z
+HSPLandroid/content/pm/PackageManagerInternal;->isPackageEphemeral(ILjava/lang/String;)Z
+HSPLandroid/content/pm/PackageManagerInternal;->isPackagePersistent(Ljava/lang/String;)Z
+HSPLandroid/content/pm/PackageManagerInternal;->isPermissionsReviewRequired(Ljava/lang/String;I)Z
+HSPLandroid/content/pm/PackageManagerInternal;->notifyPackageUse(Ljava/lang/String;I)V
+HSPLandroid/content/pm/PackageManagerInternal;->pruneInstantApps()V
+HSPLandroid/content/pm/PackageManagerInternal;->queryIntentActivities(Landroid/content/Intent;III)Ljava/util/List;
+HSPLandroid/content/pm/PackageManagerInternal;->removeIsolatedUid(I)V
+HSPLandroid/content/pm/PackageManagerInternal;->requestInstantAppResolutionPhaseTwo(Landroid/content/pm/AuxiliaryResolveInfo;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;I)V
+HSPLandroid/content/pm/PackageManagerInternal;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+HSPLandroid/content/pm/PackageManagerInternal;->resolveService(Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+HSPLandroid/content/pm/PackageManagerInternal;->revokeRuntimePermission(Ljava/lang/String;Ljava/lang/String;IZ)V
+HSPLandroid/content/pm/PackageManagerInternal;->setDeviceAndProfileOwnerPackages(ILjava/lang/String;Landroid/util/SparseArray;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setDialerAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setEnabledOverlayPackages(ILjava/lang/String;Ljava/util/List;)Z
+HSPLandroid/content/pm/PackageManagerInternal;->setExternalSourcesPolicy(Landroid/content/pm/PackageManagerInternal$ExternalSourcesPolicy;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setKeepUninstalledPackages(Ljava/util/List;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setLocationPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setSimCallManagerPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setSmsAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setSyncAdapterPackagesprovider(Landroid/content/pm/PackageManagerInternal$SyncAdapterPackagesProvider;)V
+HSPLandroid/content/pm/PackageManagerInternal;->setVoiceInteractionPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+HSPLandroid/content/pm/PackageManagerInternal;->wasPackageEverLaunched(Ljava/lang/String;I)Z
+HSPLandroid/content/pm/PackageParser$Callback;->getOverlayApks(Ljava/lang/String;)[Ljava/lang/String;
+HSPLandroid/content/pm/PackageParser$Callback;->getOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+HSPLandroid/content/pm/PackageParser$Callback;->hasFeature(Ljava/lang/String;)Z
+HSPLandroid/content/pm/PackageParser$SplitNameComparator;-><init>(Landroid/content/pm/PackageParser$1;)V
+HSPLandroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener;->onShortcutChanged(Ljava/lang/String;I)V
+HSPLandroid/content/pm/ShortcutServiceInternal;->addListener(Landroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener;)V
+HSPLandroid/content/pm/ShortcutServiceInternal;->createShortcutIntents(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)[Landroid/content/Intent;
+HSPLandroid/content/pm/ShortcutServiceInternal;->getShortcutIconFd(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/os/ParcelFileDescriptor;
+HSPLandroid/content/pm/ShortcutServiceInternal;->getShortcutIconResId(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I
+HSPLandroid/content/pm/ShortcutServiceInternal;->getShortcuts(ILjava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;II)Ljava/util/List;
+HSPLandroid/content/pm/ShortcutServiceInternal;->hasShortcutHostPermission(ILjava/lang/String;)Z
+HSPLandroid/content/pm/ShortcutServiceInternal;->isPinnedByCaller(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Z
+HSPLandroid/content/pm/ShortcutServiceInternal;->isRequestPinItemSupported(II)Z
+HSPLandroid/content/pm/ShortcutServiceInternal;->pinShortcuts(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;I)V
+HSPLandroid/content/pm/ShortcutServiceInternal;->requestPinAppWidget(Ljava/lang/String;Landroid/appwidget/AppWidgetProviderInfo;Landroid/os/Bundle;Landroid/content/IntentSender;I)Z
+HSPLandroid/database/sqlite/SQLiteDatabase$$Lambda$0;->get()Ljava/lang/Object;
+HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;->setIdleConnectionTimeout(J)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
+HSPLandroid/database/sqlite/SQLiteOpenHelper;->setIdleConnectionTimeout(J)V
+HSPLandroid/hardware/ICameraServiceProxy;->notifyCameraState(Ljava/lang/String;IILjava/lang/String;)V
+HSPLandroid/hardware/ICameraServiceProxy;->pingForUserUpdate()V
+HSPLandroid/hardware/IConsumerIrService;->getCarrierFrequencies()[I
+HSPLandroid/hardware/IConsumerIrService;->hasIrEmitter()Z
+HSPLandroid/hardware/IConsumerIrService;->transmit(Ljava/lang/String;I[I)V
+HSPLandroid/hardware/ISerialManager;->getSerialPorts()[Ljava/lang/String;
+HSPLandroid/hardware/ISerialManager;->openSerialPort(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;
+HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;->acquireSuspendBlocker()V
+HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;->onDisplayStateChange(I)V
+HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;->onProximityNegative()V
+HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;->onProximityPositive()V
+HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;->onStateChanged()V
+HSPLandroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;->releaseSuspendBlocker()V
+HSPLandroid/hardware/display/DisplayManagerInternal;->getDisplayInfo(I)Landroid/view/DisplayInfo;
+HSPLandroid/hardware/display/DisplayManagerInternal;->getNonOverrideDisplayInfo(ILandroid/view/DisplayInfo;)V
+HSPLandroid/hardware/display/DisplayManagerInternal;->initPowerManagement(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Landroid/os/Handler;Landroid/hardware/SensorManager;)V
+HSPLandroid/hardware/display/DisplayManagerInternal;->isProximitySensorAvailable()Z
+HSPLandroid/hardware/display/DisplayManagerInternal;->isUidPresentOnDisplay(II)Z
+HSPLandroid/hardware/display/DisplayManagerInternal;->performTraversalInTransactionFromWindowManager()V
+HSPLandroid/hardware/display/DisplayManagerInternal;->registerDisplayTransactionListener(Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+HSPLandroid/hardware/display/DisplayManagerInternal;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z
+HSPLandroid/hardware/display/DisplayManagerInternal;->setDisplayAccessUIDs(Landroid/util/SparseArray;)V
+HSPLandroid/hardware/display/DisplayManagerInternal;->setDisplayInfoOverrideFromWindowManager(ILandroid/view/DisplayInfo;)V
+HSPLandroid/hardware/display/DisplayManagerInternal;->setDisplayOffsets(III)V
+HSPLandroid/hardware/display/DisplayManagerInternal;->setDisplayProperties(IZFIZ)V
+HSPLandroid/hardware/display/DisplayManagerInternal;->unregisterDisplayTransactionListener(Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+HSPLandroid/hardware/hdmi/HdmiPlaybackClient$DisplayStatusCallback;->onComplete(I)V
+HSPLandroid/hardware/input/InputManagerInternal;->injectInputEvent(Landroid/view/InputEvent;II)Z
+HSPLandroid/hardware/input/InputManagerInternal;->onInputMethodSubtypeChanged(ILandroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodSubtype;)V
+HSPLandroid/hardware/input/InputManagerInternal;->setDisplayViewports(Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;Ljava/util/List;)V
+HSPLandroid/hardware/input/InputManagerInternal;->setInteractive(Z)V
+HSPLandroid/hardware/input/InputManagerInternal;->setPulseGestureEnabled(Z)V
+HSPLandroid/hardware/input/InputManagerInternal;->toggleCapsLock(I)V
+HSPLandroid/hardware/location/IContextHubService;->findNanoAppOnHub(ILandroid/hardware/location/NanoAppFilter;)[I
+HSPLandroid/hardware/location/IContextHubService;->getContextHubHandles()[I
+HSPLandroid/hardware/location/IContextHubService;->getContextHubInfo(I)Landroid/hardware/location/ContextHubInfo;
+HSPLandroid/hardware/location/IContextHubService;->getNanoAppInstanceInfo(I)Landroid/hardware/location/NanoAppInstanceInfo;
+HSPLandroid/hardware/location/IContextHubService;->loadNanoApp(ILandroid/hardware/location/NanoApp;)I
+HSPLandroid/hardware/location/IContextHubService;->registerCallback(Landroid/hardware/location/IContextHubCallback;)I
+HSPLandroid/hardware/location/IContextHubService;->sendMessage(IILandroid/hardware/location/ContextHubMessage;)I
+HSPLandroid/hardware/location/IContextHubService;->unloadNanoApp(I)I
+HSPLandroid/hardware/location/IGeofenceHardware;->addCircularFence(ILandroid/hardware/location/GeofenceHardwareRequestParcelable;Landroid/hardware/location/IGeofenceHardwareCallback;)Z
+HSPLandroid/hardware/location/IGeofenceHardware;->getMonitoringTypes()[I
+HSPLandroid/hardware/location/IGeofenceHardware;->getStatusOfMonitoringType(I)I
+HSPLandroid/hardware/location/IGeofenceHardware;->pauseGeofence(II)Z
+HSPLandroid/hardware/location/IGeofenceHardware;->registerForMonitorStateChangeCallback(ILandroid/hardware/location/IGeofenceHardwareMonitorCallback;)Z
+HSPLandroid/hardware/location/IGeofenceHardware;->removeGeofence(II)Z
+HSPLandroid/hardware/location/IGeofenceHardware;->resumeGeofence(III)Z
+HSPLandroid/hardware/location/IGeofenceHardware;->setFusedGeofenceHardware(Landroid/location/IFusedGeofenceHardware;)V
+HSPLandroid/hardware/location/IGeofenceHardware;->setGpsGeofenceHardware(Landroid/location/IGpsGeofenceHardware;)V
+HSPLandroid/hardware/location/IGeofenceHardware;->unregisterForMonitorStateChangeCallback(ILandroid/hardware/location/IGeofenceHardwareMonitorCallback;)Z
+HSPLandroid/hardware/radio/ITuner;->cancel()V
+HSPLandroid/hardware/radio/ITuner;->cancelAnnouncement()V
+HSPLandroid/hardware/radio/ITuner;->close()V
+HSPLandroid/hardware/radio/ITuner;->getConfiguration()Landroid/hardware/radio/RadioManager$BandConfig;
+HSPLandroid/hardware/radio/ITuner;->getImage(I)Landroid/graphics/Bitmap;
+HSPLandroid/hardware/radio/ITuner;->getProgramInformation()Landroid/hardware/radio/RadioManager$ProgramInfo;
+HSPLandroid/hardware/radio/ITuner;->getProgramList(Ljava/util/Map;)Ljava/util/List;
+HSPLandroid/hardware/radio/ITuner;->isAnalogForced()Z
+HSPLandroid/hardware/radio/ITuner;->isAntennaConnected()Z
+HSPLandroid/hardware/radio/ITuner;->isClosed()Z
+HSPLandroid/hardware/radio/ITuner;->isMuted()Z
+HSPLandroid/hardware/radio/ITuner;->scan(ZZ)V
+HSPLandroid/hardware/radio/ITuner;->setAnalogForced(Z)V
+HSPLandroid/hardware/radio/ITuner;->setConfiguration(Landroid/hardware/radio/RadioManager$BandConfig;)V
+HSPLandroid/hardware/radio/ITuner;->setMuted(Z)V
+HSPLandroid/hardware/radio/ITuner;->startBackgroundScan()Z
+HSPLandroid/hardware/radio/ITuner;->step(ZZ)V
+HSPLandroid/hardware/radio/ITuner;->tune(Landroid/hardware/radio/ProgramSelector;)V
+HSPLandroid/hardware/radio/ITunerCallback;->onAntennaState(Z)V
+HSPLandroid/hardware/radio/ITunerCallback;->onBackgroundScanAvailabilityChange(Z)V
+HSPLandroid/hardware/radio/ITunerCallback;->onBackgroundScanComplete()V
+HSPLandroid/hardware/radio/ITunerCallback;->onConfigurationChanged(Landroid/hardware/radio/RadioManager$BandConfig;)V
+HSPLandroid/hardware/radio/ITunerCallback;->onCurrentProgramInfoChanged(Landroid/hardware/radio/RadioManager$ProgramInfo;)V
+HSPLandroid/hardware/radio/ITunerCallback;->onEmergencyAnnouncement(Z)V
+HSPLandroid/hardware/radio/ITunerCallback;->onError(I)V
+HSPLandroid/hardware/radio/ITunerCallback;->onProgramListChanged()V
+HSPLandroid/hardware/radio/ITunerCallback;->onTrafficAnnouncement(Z)V
+HSPLandroid/hardware/soundtrigger/SoundTrigger$StatusListener;->onRecognition(Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;)V
+HSPLandroid/hardware/soundtrigger/SoundTrigger$StatusListener;->onServiceDied()V
+HSPLandroid/hardware/soundtrigger/SoundTrigger$StatusListener;->onServiceStateChange(I)V
+HSPLandroid/hardware/soundtrigger/SoundTrigger$StatusListener;->onSoundModelUpdate(Landroid/hardware/soundtrigger/SoundTrigger$SoundModelEvent;)V
+HSPLandroid/hardware/usb/IUsbManager;->allowUsbDebugging(ZLjava/lang/String;)V
+HSPLandroid/hardware/usb/IUsbManager;->clearDefaults(Ljava/lang/String;I)V
+HSPLandroid/hardware/usb/IUsbManager;->clearUsbDebuggingKeys()V
+HSPLandroid/hardware/usb/IUsbManager;->denyUsbDebugging()V
+HSPLandroid/hardware/usb/IUsbManager;->getCurrentAccessory()Landroid/hardware/usb/UsbAccessory;
+HSPLandroid/hardware/usb/IUsbManager;->getDeviceList(Landroid/os/Bundle;)V
+HSPLandroid/hardware/usb/IUsbManager;->getPortStatus(Ljava/lang/String;)Landroid/hardware/usb/UsbPortStatus;
+HSPLandroid/hardware/usb/IUsbManager;->getPorts()[Landroid/hardware/usb/UsbPort;
+HSPLandroid/hardware/usb/IUsbManager;->grantAccessoryPermission(Landroid/hardware/usb/UsbAccessory;I)V
+HSPLandroid/hardware/usb/IUsbManager;->grantDevicePermission(Landroid/hardware/usb/UsbDevice;I)V
+HSPLandroid/hardware/usb/IUsbManager;->hasAccessoryPermission(Landroid/hardware/usb/UsbAccessory;)Z
+HSPLandroid/hardware/usb/IUsbManager;->hasDefaults(Ljava/lang/String;I)Z
+HSPLandroid/hardware/usb/IUsbManager;->hasDevicePermission(Landroid/hardware/usb/UsbDevice;)Z
+HSPLandroid/hardware/usb/IUsbManager;->isFunctionEnabled(Ljava/lang/String;)Z
+HSPLandroid/hardware/usb/IUsbManager;->openAccessory(Landroid/hardware/usb/UsbAccessory;)Landroid/os/ParcelFileDescriptor;
+HSPLandroid/hardware/usb/IUsbManager;->openDevice(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;
+HSPLandroid/hardware/usb/IUsbManager;->requestAccessoryPermission(Landroid/hardware/usb/UsbAccessory;Ljava/lang/String;Landroid/app/PendingIntent;)V
+HSPLandroid/hardware/usb/IUsbManager;->requestDevicePermission(Landroid/hardware/usb/UsbDevice;Ljava/lang/String;Landroid/app/PendingIntent;)V
+HSPLandroid/hardware/usb/IUsbManager;->setAccessoryPackage(Landroid/hardware/usb/UsbAccessory;Ljava/lang/String;I)V
+HSPLandroid/hardware/usb/IUsbManager;->setCurrentFunction(Ljava/lang/String;Z)V
+HSPLandroid/hardware/usb/IUsbManager;->setDevicePackage(Landroid/hardware/usb/UsbDevice;Ljava/lang/String;I)V
+HSPLandroid/hardware/usb/IUsbManager;->setPortRoles(Ljava/lang/String;II)V
+HSPLandroid/hardware/usb/IUsbManager;->setUsbDeviceConnectionHandler(Landroid/content/ComponentName;)V
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->add(Ljava/lang/String;Landroid/hidl/base/V1_0/IBase;)Z
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->asBinder()Landroid/os/IHwBinder;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->debugDump()Ljava/util/ArrayList;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->get(Ljava/lang/String;Ljava/lang/String;)Landroid/hidl/base/V1_0/IBase;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->getHashChain()Ljava/util/ArrayList;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->getTransport(Ljava/lang/String;Ljava/lang/String;)B
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->interfaceChain()Ljava/util/ArrayList;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->interfaceDescriptor()Ljava/lang/String;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->list()Ljava/util/ArrayList;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->listByInterface(Ljava/lang/String;)Ljava/util/ArrayList;
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->notifySyspropsChanged()V
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->ping()V
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->registerForNotifications(Ljava/lang/String;Ljava/lang/String;Landroid/hidl/manager/V1_0/IServiceNotification;)Z
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->registerPassthroughClient(Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->setHALInstrumentation()V
+HSPLandroid/hidl/manager/V1_0/IServiceManager;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->asBinder()Landroid/os/IHwBinder;
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->getHashChain()Ljava/util/ArrayList;
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->interfaceChain()Ljava/util/ArrayList;
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->interfaceDescriptor()Ljava/lang/String;
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->notifySyspropsChanged()V
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->ping()V
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->setHALInstrumentation()V
+HSPLandroid/hidl/manager/V1_0/IServiceNotification;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HSPLandroid/icu/impl/LocaleDisplayNamesImpl$Cache;-><init>(Landroid/icu/impl/LocaleDisplayNamesImpl$1;)V
+HSPLandroid/icu/impl/LocaleDisplayNamesImpl$DataTableType;-><init>(Ljava/lang/String;I)V
+HSPLandroid/icu/impl/LocaleDisplayNamesImpl$DataTableType;->values()[Landroid/icu/impl/LocaleDisplayNamesImpl$DataTableType;
+HSPLandroid/icu/impl/TimeZoneNamesImpl$MZ2TZsCache;-><init>(Landroid/icu/impl/TimeZoneNamesImpl$1;)V
+HSPLandroid/icu/impl/TimeZoneNamesImpl$TZ2MZsCache;-><init>(Landroid/icu/impl/TimeZoneNamesImpl$1;)V
+HSPLandroid/icu/impl/ZoneMeta$CustomTimeZoneCache;-><init>(Landroid/icu/impl/ZoneMeta$1;)V
+HSPLandroid/icu/impl/ZoneMeta$SystemTimeZoneCache;-><init>(Landroid/icu/impl/ZoneMeta$1;)V
+HSPLandroid/icu/impl/number/AffixPatternUtils;->hasCurrencySymbols(Ljava/lang/CharSequence;)Z
+HSPLandroid/icu/impl/number/AffixPatternUtils;->unescape(Ljava/lang/CharSequence;Landroid/icu/text/DecimalFormatSymbols;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/number/NumberStringBuilder;)V
+HSPLandroid/icu/impl/number/Endpoint$3;->initialValue()Ljava/lang/Object;
+HSPLandroid/icu/impl/number/Endpoint$3;->initialValue()Ljava/util/Map;
+HSPLandroid/icu/impl/number/Endpoint$IProperties;->getPluralRules()Landroid/icu/text/PluralRules;
+HSPLandroid/icu/impl/number/Endpoint$IProperties;->setPluralRules(Landroid/icu/text/PluralRules;)Landroid/icu/impl/number/Endpoint$IProperties;
+HSPLandroid/icu/impl/number/Endpoint;->fromBTA(Landroid/icu/impl/number/Properties;Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/impl/number/Format$SingularFormat;
+HSPLandroid/icu/impl/number/Endpoint;->getPluralRules(Landroid/icu/util/ULocale;Landroid/icu/impl/number/Properties;)Landroid/icu/text/PluralRules;
+HSPLandroid/icu/impl/number/Format$1;->initialValue()Landroid/icu/impl/number/NumberStringBuilder;
+HSPLandroid/icu/impl/number/Format$1;->initialValue()Ljava/lang/Object;
+HSPLandroid/icu/impl/number/Format$2;->initialValue()Landroid/icu/impl/number/ModifierHolder;
+HSPLandroid/icu/impl/number/Format$2;->initialValue()Ljava/lang/Object;
+HSPLandroid/icu/impl/number/Format$AfterFormat;->after(Landroid/icu/impl/number/ModifierHolder;Landroid/icu/impl/number/NumberStringBuilder;II)I
+HSPLandroid/icu/impl/number/Format$BeforeFormat;-><init>()V
+HSPLandroid/icu/impl/number/Format$BeforeTargetAfterFormat;-><init>(Landroid/icu/text/PluralRules;)V
+HSPLandroid/icu/impl/number/Format$BeforeTargetAfterFormat;->addBeforeFormat(Landroid/icu/impl/number/Format$BeforeFormat;)V
+HSPLandroid/icu/impl/number/Format$BeforeTargetAfterFormat;->setTargetFormat(Landroid/icu/impl/number/Format$TargetFormat;)V
+HSPLandroid/icu/impl/number/Format$PositiveNegativeRounderTargetFormat;-><init>(Landroid/icu/impl/number/Modifier$PositiveNegativeModifier;Landroid/icu/impl/number/Rounder;Landroid/icu/impl/number/Format$TargetFormat;)V
+HSPLandroid/icu/impl/number/Format$PositiveNegativeRounderTargetFormat;->export(Landroid/icu/impl/number/Properties;)V
+HSPLandroid/icu/impl/number/Format$PositiveNegativeRounderTargetFormat;->process(Landroid/icu/impl/number/FormatQuantity;Landroid/icu/impl/number/ModifierHolder;Landroid/icu/impl/number/NumberStringBuilder;I)I
+HSPLandroid/icu/impl/number/Format$SingularFormat;-><init>()V
+HSPLandroid/icu/impl/number/Format$SingularFormat;->format(Landroid/icu/impl/number/FormatQuantity;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)V
+HSPLandroid/icu/impl/number/Format$SingularFormat;->formatToStringBuilder(Landroid/icu/impl/number/FormatQuantity;)Landroid/icu/impl/number/NumberStringBuilder;
+HSPLandroid/icu/impl/number/Format$TargetFormat;->target(Landroid/icu/impl/number/FormatQuantity;Landroid/icu/impl/number/NumberStringBuilder;I)I
+HSPLandroid/icu/impl/number/Format;-><init>()V
+HSPLandroid/icu/impl/number/Format;->process(Ljava/util/Deque;Landroid/icu/impl/number/ModifierHolder;Landroid/icu/impl/number/NumberStringBuilder;I)I
+HSPLandroid/icu/impl/number/FormatQuantity4;->compact()V
+HSPLandroid/icu/impl/number/FormatQuantity4;->getDigitPos(I)B
+HSPLandroid/icu/impl/number/FormatQuantity4;->readIntToBcd(I)V
+HSPLandroid/icu/impl/number/FormatQuantity4;->setBcdToZero()V
+HSPLandroid/icu/impl/number/FormatQuantity;->adjustMagnitude(I)V
+HSPLandroid/icu/impl/number/FormatQuantity;->copyFrom(Landroid/icu/impl/number/FormatQuantity;)V
+HSPLandroid/icu/impl/number/FormatQuantity;->createCopy()Landroid/icu/impl/number/FormatQuantity;
+HSPLandroid/icu/impl/number/FormatQuantity;->getDigit(I)B
+HSPLandroid/icu/impl/number/FormatQuantity;->getLowerDisplayMagnitude()I
+HSPLandroid/icu/impl/number/FormatQuantity;->getMagnitude()I
+HSPLandroid/icu/impl/number/FormatQuantity;->getPositionFingerprint()J
+HSPLandroid/icu/impl/number/FormatQuantity;->getStandardPlural(Landroid/icu/text/PluralRules;)Landroid/icu/impl/StandardPlural;
+HSPLandroid/icu/impl/number/FormatQuantity;->getUpperDisplayMagnitude()I
+HSPLandroid/icu/impl/number/FormatQuantity;->isInfinite()Z
+HSPLandroid/icu/impl/number/FormatQuantity;->isNaN()Z
+HSPLandroid/icu/impl/number/FormatQuantity;->isNegative()Z
+HSPLandroid/icu/impl/number/FormatQuantity;->isZero()Z
+HSPLandroid/icu/impl/number/FormatQuantity;->maxRepresentableDigits()I
+HSPLandroid/icu/impl/number/FormatQuantity;->multiplyBy(Ljava/math/BigDecimal;)V
+HSPLandroid/icu/impl/number/FormatQuantity;->roundToIncrement(Ljava/math/BigDecimal;Ljava/math/MathContext;)V
+HSPLandroid/icu/impl/number/FormatQuantity;->roundToInfinity()V
+HSPLandroid/icu/impl/number/FormatQuantity;->roundToMagnitude(ILjava/math/MathContext;)V
+HSPLandroid/icu/impl/number/FormatQuantity;->setIntegerFractionLength(IIII)V
+HSPLandroid/icu/impl/number/FormatQuantity;->toBigDecimal()Ljava/math/BigDecimal;
+HSPLandroid/icu/impl/number/FormatQuantity;->toDouble()D
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->_setToLong(J)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->bcdToBigDecimal()Ljava/math/BigDecimal;
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->compact()V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->copyBcdFrom(Landroid/icu/impl/number/FormatQuantity;)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->getDigit(I)B
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->getDigitPos(I)B
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->getLowerDisplayMagnitude()I
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->getUpperDisplayMagnitude()I
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->isInfinite()Z
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->isNaN()Z
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->isNegative()Z
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->readBigIntegerToBcd(Ljava/math/BigInteger;)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->readIntToBcd(I)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->readLongToBcd(J)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->roundToMagnitude(ILjava/math/MathContext;)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->safeSubtract(II)I
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->setBcdToZero()V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->setDigitPos(IB)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->setIntegerFractionLength(IIII)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->shiftLeft(I)V
+HSPLandroid/icu/impl/number/FormatQuantityBCD;->shiftRight(I)V
+HSPLandroid/icu/impl/number/Modifier$BaseModifier;-><init>()V
+HSPLandroid/icu/impl/number/ModifierHolder;-><init>()V
+HSPLandroid/icu/impl/number/ModifierHolder;->applyAll(Landroid/icu/impl/number/NumberStringBuilder;II)I
+HSPLandroid/icu/impl/number/ModifierHolder;->clear()Landroid/icu/impl/number/ModifierHolder;
+HSPLandroid/icu/impl/number/NumberStringBuilder;-><init>()V
+HSPLandroid/icu/impl/number/NumberStringBuilder;-><init>(I)V
+HSPLandroid/icu/impl/number/NumberStringBuilder;->charAt(I)C
+HSPLandroid/icu/impl/number/NumberStringBuilder;->clear()Landroid/icu/impl/number/NumberStringBuilder;
+HSPLandroid/icu/impl/number/NumberStringBuilder;->contentEquals([C[Landroid/icu/text/NumberFormat$Field;)Z
+HSPLandroid/icu/impl/number/NumberStringBuilder;->insert(ILjava/lang/CharSequence;Landroid/icu/text/NumberFormat$Field;)I
+HSPLandroid/icu/impl/number/NumberStringBuilder;->insertCodePoint(IILandroid/icu/text/NumberFormat$Field;)I
+HSPLandroid/icu/impl/number/NumberStringBuilder;->length()I
+HSPLandroid/icu/impl/number/NumberStringBuilder;->populateFieldPosition(Ljava/text/FieldPosition;I)V
+HSPLandroid/icu/impl/number/NumberStringBuilder;->prepareForInsert(II)I
+HSPLandroid/icu/impl/number/NumberStringBuilder;->toCharArray()[C
+HSPLandroid/icu/impl/number/NumberStringBuilder;->toFieldArray()[Landroid/icu/text/NumberFormat$Field;
+HSPLandroid/icu/impl/number/PNAffixGenerator$1;->initialValue()Landroid/icu/impl/number/PNAffixGenerator;
+HSPLandroid/icu/impl/number/PNAffixGenerator$1;->initialValue()Ljava/lang/Object;
+HSPLandroid/icu/impl/number/PNAffixGenerator$Result;-><init>()V
+HSPLandroid/icu/impl/number/PNAffixGenerator;-><init>()V
+HSPLandroid/icu/impl/number/PNAffixGenerator;->getModifiers(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;)Landroid/icu/impl/number/PNAffixGenerator$Result;
+HSPLandroid/icu/impl/number/PNAffixGenerator;->getModifiers(Landroid/icu/text/DecimalFormatSymbols;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;)Landroid/icu/impl/number/PNAffixGenerator$Result;
+HSPLandroid/icu/impl/number/PNAffixGenerator;->getThreadLocalInstance()Landroid/icu/impl/number/PNAffixGenerator;
+HSPLandroid/icu/impl/number/PNAffixGenerator;->setNegativeResult(Landroid/icu/impl/number/NumberStringBuilder;Landroid/icu/impl/number/NumberStringBuilder;Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;)V
+HSPLandroid/icu/impl/number/PNAffixGenerator;->setPositiveResult(Landroid/icu/impl/number/NumberStringBuilder;Landroid/icu/impl/number/NumberStringBuilder;Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;)V
+HSPLandroid/icu/impl/number/Parse$IProperties;->getDecimalPatternMatchRequired()Z
+HSPLandroid/icu/impl/number/Parse$IProperties;->getParseCaseSensitive()Z
+HSPLandroid/icu/impl/number/Parse$IProperties;->getParseGroupingMode()Landroid/icu/impl/number/Parse$GroupingMode;
+HSPLandroid/icu/impl/number/Parse$IProperties;->getParseIntegerOnly()Z
+HSPLandroid/icu/impl/number/Parse$IProperties;->getParseMode()Landroid/icu/impl/number/Parse$ParseMode;
+HSPLandroid/icu/impl/number/Parse$IProperties;->getParseNoExponent()Z
+HSPLandroid/icu/impl/number/Parse$IProperties;->getParseToBigDecimal()Z
+HSPLandroid/icu/impl/number/Parse$IProperties;->setDecimalPatternMatchRequired(Z)Landroid/icu/impl/number/Parse$IProperties;
+HSPLandroid/icu/impl/number/Parse$IProperties;->setParseCaseSensitive(Z)Landroid/icu/impl/number/Parse$IProperties;
+HSPLandroid/icu/impl/number/Parse$IProperties;->setParseGroupingMode(Landroid/icu/impl/number/Parse$GroupingMode;)Landroid/icu/impl/number/Parse$IProperties;
+HSPLandroid/icu/impl/number/Parse$IProperties;->setParseIntegerOnly(Z)Landroid/icu/impl/number/Parse$IProperties;
+HSPLandroid/icu/impl/number/Parse$IProperties;->setParseMode(Landroid/icu/impl/number/Parse$ParseMode;)Landroid/icu/impl/number/Parse$IProperties;
+HSPLandroid/icu/impl/number/Parse$IProperties;->setParseNoExponent(Z)Landroid/icu/impl/number/Parse$IProperties;
+HSPLandroid/icu/impl/number/Parse$IProperties;->setParseToBigDecimal(Z)Landroid/icu/impl/number/Parse$IProperties;
+HSPLandroid/icu/impl/number/Properties;->_clear()Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->clear()Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->clone()Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->getCompactStyle()Landroid/icu/text/CompactDecimalFormat$CompactStyle;
+HSPLandroid/icu/impl/number/Properties;->getCurrency()Landroid/icu/util/Currency;
+HSPLandroid/icu/impl/number/Properties;->getCurrencyPluralInfo()Landroid/icu/text/CurrencyPluralInfo;
+HSPLandroid/icu/impl/number/Properties;->getCurrencyUsage()Landroid/icu/util/Currency$CurrencyUsage;
+HSPLandroid/icu/impl/number/Properties;->getDecimalSeparatorAlwaysShown()Z
+HSPLandroid/icu/impl/number/Properties;->getFormatWidth()I
+HSPLandroid/icu/impl/number/Properties;->getGroupingSize()I
+HSPLandroid/icu/impl/number/Properties;->getMagnitudeMultiplier()I
+HSPLandroid/icu/impl/number/Properties;->getMathContext()Ljava/math/MathContext;
+HSPLandroid/icu/impl/number/Properties;->getMaximumFractionDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMaximumIntegerDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMaximumSignificantDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMeasureUnit()Landroid/icu/util/MeasureUnit;
+HSPLandroid/icu/impl/number/Properties;->getMinimumExponentDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMinimumFractionDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMinimumGroupingDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMinimumIntegerDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMinimumSignificantDigits()I
+HSPLandroid/icu/impl/number/Properties;->getMultiplier()Ljava/math/BigDecimal;
+HSPLandroid/icu/impl/number/Properties;->getNegativePrefix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getNegativePrefixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getNegativeSuffix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getNegativeSuffixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getPluralRules()Landroid/icu/text/PluralRules;
+HSPLandroid/icu/impl/number/Properties;->getPositivePrefix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getPositivePrefixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getPositiveSuffix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getPositiveSuffixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/Properties;->getRoundingIncrement()Ljava/math/BigDecimal;
+HSPLandroid/icu/impl/number/Properties;->getRoundingMode()Ljava/math/RoundingMode;
+HSPLandroid/icu/impl/number/Properties;->getSecondaryGroupingSize()I
+HSPLandroid/icu/impl/number/Properties;->getSignAlwaysShown()Z
+HSPLandroid/icu/impl/number/Properties;->getSignificantDigitsMode()Landroid/icu/text/DecimalFormat$SignificantDigitsMode;
+HSPLandroid/icu/impl/number/Properties;->setDecimalSeparatorAlwaysShown(Z)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setGroupingSize(I)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setMathContext(Ljava/math/MathContext;)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setMaximumFractionDigits(I)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setMaximumIntegerDigits(I)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setMinimumFractionDigits(I)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setMinimumGroupingDigits(I)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setMinimumIntegerDigits(I)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setNegativePrefix(Ljava/lang/String;)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setNegativeSuffix(Ljava/lang/String;)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setPositivePrefix(Ljava/lang/String;)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setPositiveSuffix(Ljava/lang/String;)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setRoundingMode(Ljava/math/RoundingMode;)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Properties;->setSecondaryGroupingSize(I)Landroid/icu/impl/number/Properties;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->getMathContext()Ljava/math/MathContext;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->getMaximumFractionDigits()I
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->getMaximumIntegerDigits()I
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->getMinimumFractionDigits()I
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->getMinimumIntegerDigits()I
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->getRoundingMode()Ljava/math/RoundingMode;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->setMathContext(Ljava/math/MathContext;)Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->setMaximumFractionDigits(I)Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->setMaximumIntegerDigits(I)Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->setMinimumFractionDigits(I)Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->setMinimumIntegerDigits(I)Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;
+HSPLandroid/icu/impl/number/Rounder$IBasicRoundingProperties;->setRoundingMode(Ljava/math/RoundingMode;)Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;
+HSPLandroid/icu/impl/number/Rounder$MultiplierGenerator;->getMultiplier(I)I
+HSPLandroid/icu/impl/number/Rounder;-><init>(Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;)V
+HSPLandroid/icu/impl/number/Rounder;->applyDefaults(Landroid/icu/impl/number/FormatQuantity;)V
+HSPLandroid/icu/impl/number/Rounder;->export(Landroid/icu/impl/number/Properties;)V
+HSPLandroid/icu/impl/number/RoundingUtils;->getMathContextOrUnlimited(Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;)Ljava/math/MathContext;
+HSPLandroid/icu/impl/number/formatters/BigDecimalMultiplier$IProperties;->getMultiplier()Ljava/math/BigDecimal;
+HSPLandroid/icu/impl/number/formatters/BigDecimalMultiplier$IProperties;->setMultiplier(Ljava/math/BigDecimal;)Landroid/icu/impl/number/formatters/BigDecimalMultiplier$IProperties;
+HSPLandroid/icu/impl/number/formatters/BigDecimalMultiplier;->useMultiplier(Landroid/icu/impl/number/formatters/BigDecimalMultiplier$IProperties;)Z
+HSPLandroid/icu/impl/number/formatters/CompactDecimalFormat$IProperties;->getCompactCustomData()Ljava/util/Map;
+HSPLandroid/icu/impl/number/formatters/CompactDecimalFormat$IProperties;->getCompactStyle()Landroid/icu/text/CompactDecimalFormat$CompactStyle;
+HSPLandroid/icu/impl/number/formatters/CompactDecimalFormat$IProperties;->setCompactCustomData(Ljava/util/Map;)Landroid/icu/impl/number/formatters/CompactDecimalFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/CompactDecimalFormat$IProperties;->setCompactStyle(Landroid/icu/text/CompactDecimalFormat$CompactStyle;)Landroid/icu/impl/number/formatters/CompactDecimalFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/CompactDecimalFormat;->useCompactDecimalFormat(Landroid/icu/impl/number/formatters/CompactDecimalFormat$IProperties;)Z
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->getCurrency()Landroid/icu/util/Currency;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->getCurrencyPluralInfo()Landroid/icu/text/CurrencyPluralInfo;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->getCurrencyStyle()Landroid/icu/impl/number/formatters/CurrencyFormat$CurrencyStyle;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->getCurrencyUsage()Landroid/icu/util/Currency$CurrencyUsage;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->setCurrency(Landroid/icu/util/Currency;)Landroid/icu/impl/number/formatters/CurrencyFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->setCurrencyPluralInfo(Landroid/icu/text/CurrencyPluralInfo;)Landroid/icu/impl/number/formatters/CurrencyFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->setCurrencyStyle(Landroid/icu/impl/number/formatters/CurrencyFormat$CurrencyStyle;)Landroid/icu/impl/number/formatters/CurrencyFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat$ICurrencyProperties;->setCurrencyUsage(Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/impl/number/formatters/CurrencyFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/CurrencyFormat;->useCurrency(Landroid/icu/impl/number/formatters/CurrencyFormat$IProperties;)Z
+HSPLandroid/icu/impl/number/formatters/MagnitudeMultiplier$IProperties;->getMagnitudeMultiplier()I
+HSPLandroid/icu/impl/number/formatters/MagnitudeMultiplier$IProperties;->setMagnitudeMultiplier(I)Landroid/icu/impl/number/formatters/MagnitudeMultiplier$IProperties;
+HSPLandroid/icu/impl/number/formatters/MagnitudeMultiplier;->useMagnitudeMultiplier(Landroid/icu/impl/number/formatters/MagnitudeMultiplier$IProperties;)Z
+HSPLandroid/icu/impl/number/formatters/MeasureFormat$IProperties;->getMeasureFormatWidth()Landroid/icu/text/MeasureFormat$FormatWidth;
+HSPLandroid/icu/impl/number/formatters/MeasureFormat$IProperties;->getMeasureUnit()Landroid/icu/util/MeasureUnit;
+HSPLandroid/icu/impl/number/formatters/MeasureFormat$IProperties;->setMeasureFormatWidth(Landroid/icu/text/MeasureFormat$FormatWidth;)Landroid/icu/impl/number/formatters/MeasureFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/MeasureFormat$IProperties;->setMeasureUnit(Landroid/icu/util/MeasureUnit;)Landroid/icu/impl/number/formatters/MeasureFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/MeasureFormat;->useMeasureFormat(Landroid/icu/impl/number/formatters/MeasureFormat$IProperties;)Z
+HSPLandroid/icu/impl/number/formatters/PaddingFormat$IProperties;->getFormatWidth()I
+HSPLandroid/icu/impl/number/formatters/PaddingFormat$IProperties;->getPadPosition()Landroid/icu/impl/number/formatters/PaddingFormat$PadPosition;
+HSPLandroid/icu/impl/number/formatters/PaddingFormat$IProperties;->getPadString()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PaddingFormat$IProperties;->setFormatWidth(I)Landroid/icu/impl/number/formatters/PaddingFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PaddingFormat$IProperties;->setPadPosition(Landroid/icu/impl/number/formatters/PaddingFormat$PadPosition;)Landroid/icu/impl/number/formatters/PaddingFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PaddingFormat$IProperties;->setPadString(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PaddingFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PaddingFormat;->usePadding(Landroid/icu/impl/number/formatters/PaddingFormat$IProperties;)Z
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->getDecimalSeparatorAlwaysShown()Z
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->getGroupingSize()I
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->getMinimumGroupingDigits()I
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->getSecondaryGroupingSize()I
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->setDecimalSeparatorAlwaysShown(Z)Landroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->setGroupingSize(I)Landroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->setMinimumGroupingDigits(I)Landroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;->setSecondaryGroupingSize(I)Landroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat;-><init>(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/formatters/PositiveDecimalFormat$IProperties;)V
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat;->addDigit(BLandroid/icu/impl/number/NumberStringBuilder;ILandroid/icu/text/NumberFormat$Field;)I
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat;->addFractionDigits(Landroid/icu/impl/number/FormatQuantity;Landroid/icu/impl/number/NumberStringBuilder;I)I
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat;->addIntegerDigits(Landroid/icu/impl/number/FormatQuantity;Landroid/icu/impl/number/NumberStringBuilder;I)I
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat;->export(Landroid/icu/impl/number/Properties;)V
+HSPLandroid/icu/impl/number/formatters/PositiveDecimalFormat;->target(Landroid/icu/impl/number/FormatQuantity;Landroid/icu/impl/number/NumberStringBuilder;I)I
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getNegativePrefix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getNegativePrefixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getNegativeSuffix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getNegativeSuffixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getPositivePrefix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getPositivePrefixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getPositiveSuffix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getPositiveSuffixPattern()Ljava/lang/String;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->getSignAlwaysShown()Z
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setNegativePrefix(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setNegativePrefixPattern(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setNegativeSuffix(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setNegativeSuffixPattern(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setPositivePrefix(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setPositivePrefixPattern(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setPositiveSuffix(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setPositiveSuffixPattern(Ljava/lang/String;)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;->setSignAlwaysShown(Z)Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/PositiveNegativeAffixFormat;->getInstance(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;)Landroid/icu/impl/number/modifiers/PositiveNegativeAffixModifier;
+HSPLandroid/icu/impl/number/formatters/RoundingFormat;->getDefaultOrNoRounder(Landroid/icu/impl/number/formatters/RoundingFormat$IProperties;)Landroid/icu/impl/number/Rounder;
+HSPLandroid/icu/impl/number/formatters/RoundingFormat;->getDefaultOrNull(Landroid/icu/impl/number/formatters/RoundingFormat$IProperties;)Landroid/icu/impl/number/Rounder;
+HSPLandroid/icu/impl/number/formatters/ScientificFormat$IProperties;->getExponentSignAlwaysShown()Z
+HSPLandroid/icu/impl/number/formatters/ScientificFormat$IProperties;->getMinimumExponentDigits()I
+HSPLandroid/icu/impl/number/formatters/ScientificFormat$IProperties;->setExponentSignAlwaysShown(Z)Landroid/icu/impl/number/formatters/ScientificFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/ScientificFormat$IProperties;->setMinimumExponentDigits(I)Landroid/icu/impl/number/formatters/ScientificFormat$IProperties;
+HSPLandroid/icu/impl/number/formatters/ScientificFormat;->useScientificNotation(Landroid/icu/impl/number/formatters/ScientificFormat$IProperties;)Z
+HSPLandroid/icu/impl/number/modifiers/ConstantAffixModifier;->apply(Landroid/icu/impl/number/NumberStringBuilder;II)I
+HSPLandroid/icu/impl/number/modifiers/ConstantAffixModifier;->getPrefix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/modifiers/ConstantAffixModifier;->getSuffix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/modifiers/ConstantMultiFieldModifier;-><init>(Landroid/icu/impl/number/NumberStringBuilder;Landroid/icu/impl/number/NumberStringBuilder;Z)V
+HSPLandroid/icu/impl/number/modifiers/ConstantMultiFieldModifier;->contentEquals(Landroid/icu/impl/number/NumberStringBuilder;Landroid/icu/impl/number/NumberStringBuilder;)Z
+HSPLandroid/icu/impl/number/modifiers/ConstantMultiFieldModifier;->getPrefix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/modifiers/ConstantMultiFieldModifier;->getSuffix()Ljava/lang/String;
+HSPLandroid/icu/impl/number/modifiers/PositiveNegativeAffixModifier;-><init>(Landroid/icu/impl/number/Modifier$AffixModifier;Landroid/icu/impl/number/Modifier$AffixModifier;)V
+HSPLandroid/icu/impl/number/modifiers/PositiveNegativeAffixModifier;->export(Landroid/icu/impl/number/Properties;)V
+HSPLandroid/icu/impl/number/modifiers/PositiveNegativeAffixModifier;->exportPositiveNegative(Landroid/icu/impl/number/Properties;Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;)V
+HSPLandroid/icu/impl/number/modifiers/PositiveNegativeAffixModifier;->getModifier(Z)Landroid/icu/impl/number/Modifier;
+HSPLandroid/icu/impl/number/rounders/IncrementRounder$IProperties;->getRoundingIncrement()Ljava/math/BigDecimal;
+HSPLandroid/icu/impl/number/rounders/IncrementRounder$IProperties;->setRoundingIncrement(Ljava/math/BigDecimal;)Landroid/icu/impl/number/rounders/IncrementRounder$IProperties;
+HSPLandroid/icu/impl/number/rounders/IncrementRounder;->useRoundingIncrement(Landroid/icu/impl/number/rounders/IncrementRounder$IProperties;)Z
+HSPLandroid/icu/impl/number/rounders/MagnitudeRounder;-><init>(Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;)V
+HSPLandroid/icu/impl/number/rounders/MagnitudeRounder;->apply(Landroid/icu/impl/number/FormatQuantity;)V
+HSPLandroid/icu/impl/number/rounders/MagnitudeRounder;->getInstance(Landroid/icu/impl/number/Rounder$IBasicRoundingProperties;)Landroid/icu/impl/number/rounders/MagnitudeRounder;
+HSPLandroid/icu/impl/number/rounders/MagnitudeRounder;->useFractionFormat(Landroid/icu/impl/number/rounders/MagnitudeRounder$IProperties;)Z
+HSPLandroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;->getMaximumSignificantDigits()I
+HSPLandroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;->getMinimumSignificantDigits()I
+HSPLandroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;->getSignificantDigitsMode()Landroid/icu/text/DecimalFormat$SignificantDigitsMode;
+HSPLandroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;->setMaximumSignificantDigits(I)Landroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;
+HSPLandroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;->setMinimumSignificantDigits(I)Landroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;
+HSPLandroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;->setSignificantDigitsMode(Landroid/icu/text/DecimalFormat$SignificantDigitsMode;)Landroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;
+HSPLandroid/icu/impl/number/rounders/SignificantDigitsRounder;->useSignificantDigits(Landroid/icu/impl/number/rounders/SignificantDigitsRounder$IProperties;)Z
+HSPLandroid/icu/text/DecimalFormat;->refreshFormatter()V
+HSPLandroid/icu/text/LocaleDisplayNames;->getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;
+HSPLandroid/icu/text/LocaleDisplayNames;->getDialectHandling()Landroid/icu/text/LocaleDisplayNames$DialectHandling;
+HSPLandroid/icu/text/LocaleDisplayNames;->getLocale()Landroid/icu/util/ULocale;
+HSPLandroid/icu/text/LocaleDisplayNames;->getUiListCompareWholeItems(Ljava/util/Set;Ljava/util/Comparator;)Ljava/util/List;
+HSPLandroid/icu/text/LocaleDisplayNames;->keyDisplayName(Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->keyValueDisplayName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->languageDisplayName(Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->localeDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->localeDisplayName(Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->localeDisplayName(Ljava/util/Locale;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->regionDisplayName(Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->scriptDisplayName(I)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->scriptDisplayName(Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/LocaleDisplayNames;->variantDisplayName(Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/TimeZoneNames$Cache;-><init>(Landroid/icu/text/TimeZoneNames$1;)V
+HSPLandroid/icu/text/TimeZoneNames;->getAvailableMetaZoneIDs()Ljava/util/Set;
+HSPLandroid/icu/text/TimeZoneNames;->getAvailableMetaZoneIDs(Ljava/lang/String;)Ljava/util/Set;
+HSPLandroid/icu/text/TimeZoneNames;->getMetaZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;
+HSPLandroid/icu/text/TimeZoneNames;->getMetaZoneID(Ljava/lang/String;J)Ljava/lang/String;
+HSPLandroid/icu/text/TimeZoneNames;->getReferenceZoneID(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/icu/text/TimeZoneNames;->getTimeZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;
+HSPLandroid/location/IGnssStatusProvider;->registerGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+HSPLandroid/location/IGnssStatusProvider;->unregisterGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+HSPLandroid/location/IGpsGeofenceHardware;->addCircularHardwareGeofence(IDDDIIII)Z
+HSPLandroid/location/IGpsGeofenceHardware;->isHardwareGeofenceSupported()Z
+HSPLandroid/location/IGpsGeofenceHardware;->pauseHardwareGeofence(I)Z
+HSPLandroid/location/IGpsGeofenceHardware;->removeHardwareGeofence(I)Z
+HSPLandroid/location/IGpsGeofenceHardware;->resumeHardwareGeofence(II)Z
+HSPLandroid/location/INetInitiatedListener;->sendNiResponse(II)Z
+HSPLandroid/media/AudioManager$OnAudioPortUpdateListener;->onAudioPatchListUpdate([Landroid/media/AudioPatch;)V
+HSPLandroid/media/AudioManager$OnAudioPortUpdateListener;->onAudioPortListUpdate([Landroid/media/AudioPort;)V
+HSPLandroid/media/AudioManager$OnAudioPortUpdateListener;->onServiceDied()V
+HSPLandroid/media/AudioManagerInternal$RingerModeDelegate;->canVolumeDownEnterSilent()Z
+HSPLandroid/media/AudioManagerInternal$RingerModeDelegate;->getRingerModeAffectedStreams(I)I
+HSPLandroid/media/AudioManagerInternal$RingerModeDelegate;->onSetRingerModeExternal(IILjava/lang/String;ILandroid/media/VolumePolicy;)I
+HSPLandroid/media/AudioManagerInternal$RingerModeDelegate;->onSetRingerModeInternal(IILjava/lang/String;ILandroid/media/VolumePolicy;)I
+HSPLandroid/media/AudioManagerInternal;->adjustStreamVolumeForUid(IIILjava/lang/String;I)V
+HSPLandroid/media/AudioManagerInternal;->adjustSuggestedStreamVolumeForUid(IIILjava/lang/String;I)V
+HSPLandroid/media/AudioManagerInternal;->getRingerModeInternal()I
+HSPLandroid/media/AudioManagerInternal;->setAccessibilityServiceUids(Landroid/util/IntArray;)V
+HSPLandroid/media/AudioManagerInternal;->setRingerModeDelegate(Landroid/media/AudioManagerInternal$RingerModeDelegate;)V
+HSPLandroid/media/AudioManagerInternal;->setRingerModeInternal(ILjava/lang/String;)V
+HSPLandroid/media/AudioManagerInternal;->setStreamVolumeForUid(IIILjava/lang/String;I)V
+HSPLandroid/media/AudioManagerInternal;->updateRingerModeAffectedStreamsInternal()V
+HSPLandroid/media/AudioPlaybackConfiguration$PlayerDeathMonitor;->playerDeath(I)V
+HSPLandroid/media/AudioSystem$AudioRecordingCallback;->onRecordingConfigurationChanged(IIII[ILjava/lang/String;)V
+HSPLandroid/media/AudioSystem$DynamicPolicyCallback;->onDynamicPolicyMixStateUpdate(Ljava/lang/String;I)V
+HSPLandroid/media/AudioSystem$ErrorCallback;->onError(I)V
+HSPLandroid/media/IMediaResourceMonitor;->notifyResourceGranted(II)V
+HSPLandroid/media/IRemoteVolumeController;->remoteVolumeChanged(Landroid/media/session/ISessionController;I)V
+HSPLandroid/media/IRemoteVolumeController;->updateRemoteController(Landroid/media/session/ISessionController;)V
+HSPLandroid/media/IVolumeController;->dismiss()V
+HSPLandroid/media/IVolumeController;->displaySafeVolumeWarning(I)V
+HSPLandroid/media/IVolumeController;->masterMuteChanged(I)V
+HSPLandroid/media/IVolumeController;->setA11yMode(I)V
+HSPLandroid/media/IVolumeController;->setLayoutDirection(I)V
+HSPLandroid/media/IVolumeController;->volumeChanged(II)V
+HSPLandroid/media/SoundPool$OnLoadCompleteListener;->onLoadComplete(Landroid/media/SoundPool;II)V
+HSPLandroid/media/midi/IMidiManager;->closeDevice(Landroid/os/IBinder;Landroid/os/IBinder;)V
+HSPLandroid/media/midi/IMidiManager;->getDeviceStatus(Landroid/media/midi/MidiDeviceInfo;)Landroid/media/midi/MidiDeviceStatus;
+HSPLandroid/media/midi/IMidiManager;->getDevices()[Landroid/media/midi/MidiDeviceInfo;
+HSPLandroid/media/midi/IMidiManager;->getServiceDeviceInfo(Ljava/lang/String;Ljava/lang/String;)Landroid/media/midi/MidiDeviceInfo;
+HSPLandroid/media/midi/IMidiManager;->openBluetoothDevice(Landroid/os/IBinder;Landroid/bluetooth/BluetoothDevice;Landroid/media/midi/IMidiDeviceOpenCallback;)V
+HSPLandroid/media/midi/IMidiManager;->openDevice(Landroid/os/IBinder;Landroid/media/midi/MidiDeviceInfo;Landroid/media/midi/IMidiDeviceOpenCallback;)V
+HSPLandroid/media/midi/IMidiManager;->registerDeviceServer(Landroid/media/midi/IMidiDeviceServer;II[Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;I)Landroid/media/midi/MidiDeviceInfo;
+HSPLandroid/media/midi/IMidiManager;->registerListener(Landroid/os/IBinder;Landroid/media/midi/IMidiDeviceListener;)V
+HSPLandroid/media/midi/IMidiManager;->setDeviceStatus(Landroid/media/midi/IMidiDeviceServer;Landroid/media/midi/MidiDeviceStatus;)V
+HSPLandroid/media/midi/IMidiManager;->unregisterDeviceServer(Landroid/media/midi/IMidiDeviceServer;)V
+HSPLandroid/media/midi/IMidiManager;->unregisterListener(Landroid/os/IBinder;Landroid/media/midi/IMidiDeviceListener;)V
+HSPLandroid/media/projection/IMediaProjectionManager;->addCallback(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+HSPLandroid/media/projection/IMediaProjectionManager;->createProjection(ILjava/lang/String;IZ)Landroid/media/projection/IMediaProjection;
+HSPLandroid/media/projection/IMediaProjectionManager;->getActiveProjectionInfo()Landroid/media/projection/MediaProjectionInfo;
+HSPLandroid/media/projection/IMediaProjectionManager;->hasProjectionPermission(ILjava/lang/String;)Z
+HSPLandroid/media/projection/IMediaProjectionManager;->isValidMediaProjection(Landroid/media/projection/IMediaProjection;)Z
+HSPLandroid/media/projection/IMediaProjectionManager;->removeCallback(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+HSPLandroid/media/projection/IMediaProjectionManager;->stopActiveProjection()V
+HSPLandroid/media/projection/IMediaProjectionWatcherCallback;->onStart(Landroid/media/projection/MediaProjectionInfo;)V
+HSPLandroid/media/projection/IMediaProjectionWatcherCallback;->onStop(Landroid/media/projection/MediaProjectionInfo;)V
+HSPLandroid/media/session/ICallback;->onAddressedPlayerChangedToMediaButtonReceiver(Landroid/content/ComponentName;)V
+HSPLandroid/media/session/ICallback;->onAddressedPlayerChangedToMediaSession(Landroid/media/session/MediaSession$Token;)V
+HSPLandroid/media/session/ICallback;->onMediaKeyEventDispatchedToMediaButtonReceiver(Landroid/view/KeyEvent;Landroid/content/ComponentName;)V
+HSPLandroid/media/session/ICallback;->onMediaKeyEventDispatchedToMediaSession(Landroid/view/KeyEvent;Landroid/media/session/MediaSession$Token;)V
+HSPLandroid/net/ConnectivityManager$OnNetworkActiveListener;->onNetworkActive()V
+HSPLandroid/net/ConnectivityThread;->access$000()Landroid/net/ConnectivityThread;
+HSPLandroid/net/IEthernetManager;->addListener(Landroid/net/IEthernetServiceListener;)V
+HSPLandroid/net/IEthernetManager;->getConfiguration()Landroid/net/IpConfiguration;
+HSPLandroid/net/IEthernetManager;->isAvailable()Z
+HSPLandroid/net/IEthernetManager;->removeListener(Landroid/net/IEthernetServiceListener;)V
+HSPLandroid/net/IEthernetManager;->setConfiguration(Landroid/net/IpConfiguration;)V
+HSPLandroid/net/IEthernetServiceListener;->onAvailabilityChanged(Z)V
+HSPLandroid/net/IIpConnectivityMetrics;->logEvent(Landroid/net/ConnectivityMetricsEvent;)I
+HSPLandroid/net/IIpConnectivityMetrics;->registerNetdEventCallback(Landroid/net/INetdEventCallback;)Z
+HSPLandroid/net/IIpConnectivityMetrics;->unregisterNetdEventCallback()Z
+HSPLandroid/net/INetd$Stub$Proxy;->tetherGetStats()Landroid/os/PersistableBundle;
+HSPLandroid/net/INetd;->addPrivateDnsServer(Ljava/lang/String;ILjava/lang/String;[Ljava/lang/String;)V
+HSPLandroid/net/INetd;->bandwidthEnableDataSaver(Z)Z
+HSPLandroid/net/INetd;->firewallReplaceUidChain(Ljava/lang/String;Z[I)Z
+HSPLandroid/net/INetd;->getMetricsReportingLevel()I
+HSPLandroid/net/INetd;->getResolverInfo(I[Ljava/lang/String;[Ljava/lang/String;[I[I)V
+HSPLandroid/net/INetd;->interfaceAddAddress(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/net/INetd;->interfaceDelAddress(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/net/INetd;->ipSecAddSecurityAssociation(IIILjava/lang/String;Ljava/lang/String;JILjava/lang/String;[BILjava/lang/String;[BIIII)V
+HSPLandroid/net/INetd;->ipSecAllocateSpi(IILjava/lang/String;Ljava/lang/String;I)I
+HSPLandroid/net/INetd;->ipSecApplyTransportModeTransform(Ljava/io/FileDescriptor;IILjava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/net/INetd;->ipSecDeleteSecurityAssociation(IILjava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/net/INetd;->ipSecRemoveTransportModeTransform(Ljava/io/FileDescriptor;)V
+HSPLandroid/net/INetd;->isAlive()Z
+HSPLandroid/net/INetd;->networkRejectNonSecureVpn(Z[Landroid/net/UidRange;)V
+HSPLandroid/net/INetd;->removePrivateDnsServer(Ljava/lang/String;)V
+HSPLandroid/net/INetd;->setIPv6AddrGenMode(Ljava/lang/String;I)V
+HSPLandroid/net/INetd;->setMetricsReportingLevel(I)V
+HSPLandroid/net/INetd;->setProcSysNet(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/net/INetd;->setResolverConfiguration(I[Ljava/lang/String;[Ljava/lang/String;[I)V
+HSPLandroid/net/INetd;->socketDestroy([Landroid/net/UidRange;[I)V
+HSPLandroid/net/INetd;->tetherApplyDnsInterfaces()Z
+HSPLandroid/net/INetd;->tetherGetStats()Landroid/os/PersistableBundle;
+HSPLandroid/net/INetd;->wakeupAddInterface(Ljava/lang/String;Ljava/lang/String;II)V
+HSPLandroid/net/INetd;->wakeupDelInterface(Ljava/lang/String;Ljava/lang/String;II)V
+HSPLandroid/net/INetworkScoreCache;->clearScores()V
+HSPLandroid/net/INetworkScoreCache;->updateScores(Ljava/util/List;)V
+HSPLandroid/net/NetworkStats$NonMonotonicObserver;->foundNonMonotonic(Landroid/net/NetworkStats;ILandroid/net/NetworkStats;ILjava/lang/Object;)V
+HSPLandroid/net/nsd/INsdManager;->getMessenger()Landroid/os/Messenger;
+HSPLandroid/net/nsd/INsdManager;->setEnabled(Z)V
+HSPLandroid/net/wifi/IRttManager;->getMessenger(Landroid/os/IBinder;[I)Landroid/os/Messenger;
+HSPLandroid/net/wifi/IRttManager;->getRttCapabilities()Landroid/net/wifi/RttManager$RttCapabilities;
+HSPLandroid/net/wifi/IWifiScanner;->getAvailableChannels(I)Landroid/os/Bundle;
+HSPLandroid/net/wifi/IWifiScanner;->getMessenger()Landroid/os/Messenger;
+HSPLandroid/net/wifi/WifiScanner$PnoScanListener;->onPnoNetworkFound([Landroid/net/wifi/ScanResult;)V
+HSPLandroid/net/wifi/p2p/IWifiP2pManager;->checkConfigureWifiDisplayPermission()V
+HSPLandroid/net/wifi/p2p/IWifiP2pManager;->close(Landroid/os/IBinder;)V
+HSPLandroid/net/wifi/p2p/IWifiP2pManager;->getMessenger(Landroid/os/IBinder;)Landroid/os/Messenger;
+HSPLandroid/net/wifi/p2p/IWifiP2pManager;->getP2pStateMachineMessenger()Landroid/os/Messenger;
+HSPLandroid/net/wifi/p2p/IWifiP2pManager;->setMiracastMode(I)V
+HSPLandroid/net/wifi/p2p/WifiP2pGroupList$2;-><init>()V
+HSPLandroid/net/wifi/p2p/WifiP2pGroupList$GroupDeleteListener;->onDeleteGroup(I)V
+HSPLandroid/os/BatteryManagerInternal;->getBatteryLevel()I
+HSPLandroid/os/BatteryManagerInternal;->getBatteryLevelLow()Z
+HSPLandroid/os/BatteryManagerInternal;->getInvalidCharger()I
+HSPLandroid/os/BatteryManagerInternal;->getPlugType()I
+HSPLandroid/os/BatteryManagerInternal;->isPowered(I)Z
+HSPLandroid/os/BatteryStats$$Lambda$0;-><init>()V
+HSPLandroid/os/BatteryStats$$Lambda$1;-><init>()V
+HSPLandroid/os/BatteryStats$DailyItem;-><init>()V
+HSPLandroid/os/BatteryStats$LevelStepTracker;->decodeEntryAt(ILjava/lang/String;)V
+HSPLandroid/os/BatteryStats;->commitCurrentHistoryBatchLocked()V
+HSPLandroid/os/BatteryStats;->computeBatteryRealtime(JI)J
+HSPLandroid/os/BatteryStats;->computeBatteryScreenOffRealtime(JI)J
+HSPLandroid/os/BatteryStats;->computeBatteryScreenOffUptime(JI)J
+HSPLandroid/os/BatteryStats;->computeBatteryTimeRemaining(J)J
+HSPLandroid/os/BatteryStats;->computeBatteryUptime(JI)J
+HSPLandroid/os/BatteryStats;->computeChargeTimeRemaining(J)J
+HSPLandroid/os/BatteryStats;->computeRealtime(JI)J
+HSPLandroid/os/BatteryStats;->computeUptime(JI)J
+HSPLandroid/os/BatteryStats;->finishIteratingHistoryLocked()V
+HSPLandroid/os/BatteryStats;->finishIteratingOldHistoryLocked()V
+HSPLandroid/os/BatteryStats;->getBatteryRealtime(J)J
+HSPLandroid/os/BatteryStats;->getBatteryUptime(J)J
+HSPLandroid/os/BatteryStats;->getBluetoothControllerActivity()Landroid/os/BatteryStats$ControllerActivityCounter;
+HSPLandroid/os/BatteryStats;->getBluetoothScanTime(JI)J
+HSPLandroid/os/BatteryStats;->getCameraOnTime(JI)J
+HSPLandroid/os/BatteryStats;->getChargeLevelStepTracker()Landroid/os/BatteryStats$LevelStepTracker;
+HSPLandroid/os/BatteryStats;->getCpuFreqs()[J
+HSPLandroid/os/BatteryStats;->getCurrentDailyStartTime()J
+HSPLandroid/os/BatteryStats;->getDailyChargeLevelStepTracker()Landroid/os/BatteryStats$LevelStepTracker;
+HSPLandroid/os/BatteryStats;->getDailyDischargeLevelStepTracker()Landroid/os/BatteryStats$LevelStepTracker;
+HSPLandroid/os/BatteryStats;->getDailyItemLocked(I)Landroid/os/BatteryStats$DailyItem;
+HSPLandroid/os/BatteryStats;->getDailyPackageChanges()Ljava/util/ArrayList;
+HSPLandroid/os/BatteryStats;->getDeviceIdleModeCount(II)I
+HSPLandroid/os/BatteryStats;->getDeviceIdleModeTime(IJI)J
+HSPLandroid/os/BatteryStats;->getDeviceIdlingCount(II)I
+HSPLandroid/os/BatteryStats;->getDeviceIdlingTime(IJI)J
+HSPLandroid/os/BatteryStats;->getDischargeAmount(I)I
+HSPLandroid/os/BatteryStats;->getDischargeAmountScreenOff()I
+HSPLandroid/os/BatteryStats;->getDischargeAmountScreenOffSinceCharge()I
+HSPLandroid/os/BatteryStats;->getDischargeAmountScreenOn()I
+HSPLandroid/os/BatteryStats;->getDischargeAmountScreenOnSinceCharge()I
+HSPLandroid/os/BatteryStats;->getDischargeCoulombCounter()Landroid/os/BatteryStats$LongCounter;
+HSPLandroid/os/BatteryStats;->getDischargeCurrentLevel()I
+HSPLandroid/os/BatteryStats;->getDischargeLevelStepTracker()Landroid/os/BatteryStats$LevelStepTracker;
+HSPLandroid/os/BatteryStats;->getDischargeScreenOffCoulombCounter()Landroid/os/BatteryStats$LongCounter;
+HSPLandroid/os/BatteryStats;->getDischargeStartLevel()I
+HSPLandroid/os/BatteryStats;->getEndPlatformVersion()Ljava/lang/String;
+HSPLandroid/os/BatteryStats;->getEstimatedBatteryCapacity()I
+HSPLandroid/os/BatteryStats;->getFlashlightOnCount(I)J
+HSPLandroid/os/BatteryStats;->getFlashlightOnTime(JI)J
+HSPLandroid/os/BatteryStats;->getGlobalWifiRunningTime(JI)J
+HSPLandroid/os/BatteryStats;->getHighDischargeAmountSinceCharge()I
+HSPLandroid/os/BatteryStats;->getHistoryBaseTime()J
+HSPLandroid/os/BatteryStats;->getHistoryStringPoolBytes()I
+HSPLandroid/os/BatteryStats;->getHistoryStringPoolSize()I
+HSPLandroid/os/BatteryStats;->getHistoryTagPoolString(I)Ljava/lang/String;
+HSPLandroid/os/BatteryStats;->getHistoryTagPoolUid(I)I
+HSPLandroid/os/BatteryStats;->getHistoryTotalSize()I
+HSPLandroid/os/BatteryStats;->getHistoryUsedSize()I
+HSPLandroid/os/BatteryStats;->getInteractiveTime(JI)J
+HSPLandroid/os/BatteryStats;->getIsOnBattery()Z
+HSPLandroid/os/BatteryStats;->getKernelMemoryStats()Landroid/util/LongSparseArray;
+HSPLandroid/os/BatteryStats;->getKernelWakelockStats()Ljava/util/Map;
+HSPLandroid/os/BatteryStats;->getLongestDeviceIdleModeTime(I)J
+HSPLandroid/os/BatteryStats;->getLowDischargeAmountSinceCharge()I
+HSPLandroid/os/BatteryStats;->getMaxLearnedBatteryCapacity()I
+HSPLandroid/os/BatteryStats;->getMinLearnedBatteryCapacity()I
+HSPLandroid/os/BatteryStats;->getMobileRadioActiveAdjustedTime(I)J
+HSPLandroid/os/BatteryStats;->getMobileRadioActiveCount(I)I
+HSPLandroid/os/BatteryStats;->getMobileRadioActiveTime(JI)J
+HSPLandroid/os/BatteryStats;->getMobileRadioActiveUnknownCount(I)I
+HSPLandroid/os/BatteryStats;->getMobileRadioActiveUnknownTime(I)J
+HSPLandroid/os/BatteryStats;->getModemControllerActivity()Landroid/os/BatteryStats$ControllerActivityCounter;
+HSPLandroid/os/BatteryStats;->getNetworkActivityBytes(II)J
+HSPLandroid/os/BatteryStats;->getNetworkActivityPackets(II)J
+HSPLandroid/os/BatteryStats;->getNextHistoryLocked(Landroid/os/BatteryStats$HistoryItem;)Z
+HSPLandroid/os/BatteryStats;->getNextMaxDailyDeadline()J
+HSPLandroid/os/BatteryStats;->getNextMinDailyDeadline()J
+HSPLandroid/os/BatteryStats;->getNextOldHistoryLocked(Landroid/os/BatteryStats$HistoryItem;)Z
+HSPLandroid/os/BatteryStats;->getNumConnectivityChange(I)I
+HSPLandroid/os/BatteryStats;->getParcelVersion()I
+HSPLandroid/os/BatteryStats;->getPhoneDataConnectionCount(II)I
+HSPLandroid/os/BatteryStats;->getPhoneDataConnectionTime(IJI)J
+HSPLandroid/os/BatteryStats;->getPhoneOnCount(I)I
+HSPLandroid/os/BatteryStats;->getPhoneOnTime(JI)J
+HSPLandroid/os/BatteryStats;->getPhoneSignalScanningTime(JI)J
+HSPLandroid/os/BatteryStats;->getPhoneSignalStrengthCount(II)I
+HSPLandroid/os/BatteryStats;->getPhoneSignalStrengthTime(IJI)J
+HSPLandroid/os/BatteryStats;->getPowerSaveModeEnabledCount(I)I
+HSPLandroid/os/BatteryStats;->getPowerSaveModeEnabledTime(JI)J
+HSPLandroid/os/BatteryStats;->getScreenBrightnessTime(IJI)J
+HSPLandroid/os/BatteryStats;->getScreenOnCount(I)I
+HSPLandroid/os/BatteryStats;->getScreenOnTime(JI)J
+HSPLandroid/os/BatteryStats;->getStartClockTime()J
+HSPLandroid/os/BatteryStats;->getStartCount()I
+HSPLandroid/os/BatteryStats;->getStartPlatformVersion()Ljava/lang/String;
+HSPLandroid/os/BatteryStats;->getUidStats()Landroid/util/SparseArray;
+HSPLandroid/os/BatteryStats;->getWakeupReasonStats()Ljava/util/Map;
+HSPLandroid/os/BatteryStats;->getWifiControllerActivity()Landroid/os/BatteryStats$ControllerActivityCounter;
+HSPLandroid/os/BatteryStats;->getWifiOnTime(JI)J
+HSPLandroid/os/BatteryStats;->getWifiSignalStrengthCount(II)I
+HSPLandroid/os/BatteryStats;->getWifiSignalStrengthTime(IJI)J
+HSPLandroid/os/BatteryStats;->getWifiStateCount(II)I
+HSPLandroid/os/BatteryStats;->getWifiStateTime(IJI)J
+HSPLandroid/os/BatteryStats;->getWifiSupplStateCount(II)I
+HSPLandroid/os/BatteryStats;->getWifiSupplStateTime(IJI)J
+HSPLandroid/os/BatteryStats;->hasBluetoothActivityReporting()Z
+HSPLandroid/os/BatteryStats;->hasModemActivityReporting()Z
+HSPLandroid/os/BatteryStats;->hasWifiActivityReporting()Z
+HSPLandroid/os/BatteryStats;->startIteratingHistoryLocked()Z
+HSPLandroid/os/BatteryStats;->startIteratingOldHistoryLocked()Z
+HSPLandroid/os/BatteryStats;->writeToParcelWithoutUids(Landroid/os/Parcel;I)V
+HSPLandroid/os/CommonTimeConfig$OnServerDiedListener;->onServerDied()V
+HSPLandroid/os/Handler;->hasMessagesOrCallbacks()Z
+HSPLandroid/os/IBatteryPropertiesListener;->batteryPropertiesChanged(Landroid/os/BatteryProperties;)V
+HSPLandroid/os/IBinder$DeathRecipient;->binderDied()V
+HSPLandroid/os/IDeviceIdentifiersPolicyService;->getSerial()Ljava/lang/String;
+HSPLandroid/os/IIncidentManager$Stub$Proxy;->systemRunning()V
+HSPLandroid/os/IIncidentManager;->reportIncident(Landroid/os/IncidentReportArgs;)V
+HSPLandroid/os/IIncidentManager;->reportIncidentToStream(Landroid/os/IncidentReportArgs;Landroid/os/IIncidentReportStatusListener;Ljava/io/FileDescriptor;)V
+HSPLandroid/os/IIncidentManager;->systemRunning()V
+HSPLandroid/os/IInstalld;->clearAppData(Ljava/lang/String;Ljava/lang/String;IIJ)V
+HSPLandroid/os/IInstalld;->clearAppProfiles(Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->copySystemProfile(Ljava/lang/String;ILjava/lang/String;)Z
+HSPLandroid/os/IInstalld;->createAppData(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)J
+HSPLandroid/os/IInstalld;->createOatDir(Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->createUserData(Ljava/lang/String;III)V
+HSPLandroid/os/IInstalld;->deleteOdex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->destroyAppData(Ljava/lang/String;Ljava/lang/String;IIJ)V
+HSPLandroid/os/IInstalld;->destroyAppProfiles(Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->destroyUserData(Ljava/lang/String;II)V
+HSPLandroid/os/IInstalld;->dexopt(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
+HSPLandroid/os/IInstalld;->dumpProfiles(ILjava/lang/String;Ljava/lang/String;)Z
+HSPLandroid/os/IInstalld;->fixupAppData(Ljava/lang/String;I)V
+HSPLandroid/os/IInstalld;->freeCache(Ljava/lang/String;JJI)V
+HSPLandroid/os/IInstalld;->getAppSize(Ljava/lang/String;[Ljava/lang/String;III[J[Ljava/lang/String;)[J
+HSPLandroid/os/IInstalld;->getExternalSize(Ljava/lang/String;II[I)[J
+HSPLandroid/os/IInstalld;->getUserSize(Ljava/lang/String;II[I)[J
+HSPLandroid/os/IInstalld;->idmap(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/os/IInstalld;->invalidateMounts()V
+HSPLandroid/os/IInstalld;->isQuotaSupported(Ljava/lang/String;)Z
+HSPLandroid/os/IInstalld;->linkFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->linkNativeLibraryDirectory(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
+HSPLandroid/os/IInstalld;->markBootComplete(Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->mergeProfiles(ILjava/lang/String;)Z
+HSPLandroid/os/IInstalld;->migrateAppData(Ljava/lang/String;Ljava/lang/String;II)V
+HSPLandroid/os/IInstalld;->moveAb(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->moveCompleteApp(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;I)V
+HSPLandroid/os/IInstalld;->reconcileSecondaryDexFile(Ljava/lang/String;Ljava/lang/String;I[Ljava/lang/String;Ljava/lang/String;I)Z
+HSPLandroid/os/IInstalld;->removeIdmap(Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->restoreconAppData(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)V
+HSPLandroid/os/IInstalld;->rmPackageDir(Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->rmdex(Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/os/IInstalld;->setAppQuota(Ljava/lang/String;IIJ)V
+HSPLandroid/os/IPermissionController;->checkPermission(Ljava/lang/String;II)Z
+HSPLandroid/os/IPermissionController;->getPackagesForUid(I)[Ljava/lang/String;
+HSPLandroid/os/IPermissionController;->isRuntimePermission(Ljava/lang/String;)Z
+HSPLandroid/os/IProcessInfoService;->getProcessStatesAndOomScoresFromPids([I[I[I)V
+HSPLandroid/os/IProcessInfoService;->getProcessStatesFromPids([I[I)V
+HSPLandroid/os/IRecoverySystem;->clearBcb()Z
+HSPLandroid/os/IRecoverySystem;->rebootRecoveryWithCommand(Ljava/lang/String;)V
+HSPLandroid/os/IRecoverySystem;->setupBcb(Ljava/lang/String;)Z
+HSPLandroid/os/IRecoverySystem;->uncrypt(Ljava/lang/String;Landroid/os/IRecoverySystemProgressListener;)Z
+HSPLandroid/os/ISchedulingPolicyService;->requestPriority(IIIZ)I
+HSPLandroid/os/IUpdateLock;->acquireUpdateLock(Landroid/os/IBinder;Ljava/lang/String;)V
+HSPLandroid/os/IUpdateLock;->releaseUpdateLock(Landroid/os/IBinder;)V
+HSPLandroid/os/MessageQueue;->hasMessages(Landroid/os/Handler;)Z
+HSPLandroid/os/Parcelable;->describeContents()I
+HSPLandroid/os/Parcelable;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/os/PowerManagerInternal;->finishUidChanges()V
+HSPLandroid/os/PowerManagerInternal;->getLowPowerState(I)Landroid/os/PowerSaveState;
+HSPLandroid/os/PowerManagerInternal;->powerHint(II)V
+HSPLandroid/os/PowerManagerInternal;->registerLowPowerModeObserver(Landroid/os/PowerManagerInternal$LowPowerModeListener;)V
+HSPLandroid/os/PowerManagerInternal;->setDeviceIdleMode(Z)Z
+HSPLandroid/os/PowerManagerInternal;->setDeviceIdleTempWhitelist([I)V
+HSPLandroid/os/PowerManagerInternal;->setDeviceIdleWhitelist([I)V
+HSPLandroid/os/PowerManagerInternal;->setDozeOverrideFromDreamManager(II)V
+HSPLandroid/os/PowerManagerInternal;->setLightDeviceIdleMode(Z)Z
+HSPLandroid/os/PowerManagerInternal;->setMaximumScreenOffTimeoutFromDeviceAdmin(I)V
+HSPLandroid/os/PowerManagerInternal;->setScreenBrightnessOverrideFromWindowManager(I)V
+HSPLandroid/os/PowerManagerInternal;->setUserActivityTimeoutOverrideFromWindowManager(J)V
+HSPLandroid/os/PowerManagerInternal;->setUserInactiveOverrideFromWindowManager()V
+HSPLandroid/os/PowerManagerInternal;->startUidChanges()V
+HSPLandroid/os/PowerManagerInternal;->uidActive(I)V
+HSPLandroid/os/PowerManagerInternal;->uidGone(I)V
+HSPLandroid/os/PowerManagerInternal;->uidIdle(I)V
+HSPLandroid/os/PowerManagerInternal;->updateUidProcState(II)V
+HSPLandroid/os/PowerManagerInternal;->wakefulnessToString(I)Ljava/lang/String;
+HSPLandroid/os/RemoteCallback$OnResultListener;->onResult(Landroid/os/Bundle;)V
+HSPLandroid/os/StrictMode$5;->run()V
+HSPLandroid/os/StrictMode$8;->initialValue()Landroid/os/StrictMode$ThreadSpanState;
+HSPLandroid/os/StrictMode$8;->initialValue()Ljava/lang/Object;
+HSPLandroid/os/StrictMode$ThreadSpanState;-><init>(Landroid/os/StrictMode$1;)V
+HSPLandroid/os/StrictMode;->access$1600()Ljava/util/concurrent/atomic/AtomicInteger;
+HSPLandroid/os/StrictMode;->access$900()Z
+HSPLandroid/os/UserManagerInternal;->addUserRestrictionsListener(Landroid/os/UserManagerInternal$UserRestrictionsListener;)V
+HSPLandroid/os/UserManagerInternal;->createUserEvenWhenDisallowed(Ljava/lang/String;I)Landroid/content/pm/UserInfo;
+HSPLandroid/os/UserManagerInternal;->getBaseUserRestrictions(I)Landroid/os/Bundle;
+HSPLandroid/os/UserManagerInternal;->getUserIds()[I
+HSPLandroid/os/UserManagerInternal;->getUserRestriction(ILjava/lang/String;)Z
+HSPLandroid/os/UserManagerInternal;->isUserRunning(I)Z
+HSPLandroid/os/UserManagerInternal;->isUserUnlocked(I)Z
+HSPLandroid/os/UserManagerInternal;->isUserUnlockingOrUnlocked(I)Z
+HSPLandroid/os/UserManagerInternal;->onEphemeralUserStop(I)V
+HSPLandroid/os/UserManagerInternal;->removeAllUsers()V
+HSPLandroid/os/UserManagerInternal;->removeUserEvenWhenDisallowed(I)Z
+HSPLandroid/os/UserManagerInternal;->removeUserRestrictionsListener(Landroid/os/UserManagerInternal$UserRestrictionsListener;)V
+HSPLandroid/os/UserManagerInternal;->removeUserState(I)V
+HSPLandroid/os/UserManagerInternal;->setBaseUserRestrictionsByDpmsForMigration(ILandroid/os/Bundle;)V
+HSPLandroid/os/UserManagerInternal;->setDeviceManaged(Z)V
+HSPLandroid/os/UserManagerInternal;->setDevicePolicyUserRestrictions(ILandroid/os/Bundle;ZI)V
+HSPLandroid/os/UserManagerInternal;->setForceEphemeralUsers(Z)V
+HSPLandroid/os/UserManagerInternal;->setUserIcon(ILandroid/graphics/Bitmap;)V
+HSPLandroid/os/UserManagerInternal;->setUserManaged(IZ)V
+HSPLandroid/os/UserManagerInternal;->setUserState(II)V
+HSPLandroid/os/VibrationEffect;->validate()V
+HSPLandroid/os/storage/IStorageEventListener;->onDiskDestroyed(Landroid/os/storage/DiskInfo;)V
+HSPLandroid/os/storage/IStorageEventListener;->onDiskScanned(Landroid/os/storage/DiskInfo;I)V
+HSPLandroid/os/storage/IStorageEventListener;->onStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroid/os/storage/IStorageEventListener;->onUsbMassStorageConnectionChanged(Z)V
+HSPLandroid/os/storage/IStorageEventListener;->onVolumeForgotten(Ljava/lang/String;)V
+HSPLandroid/os/storage/IStorageEventListener;->onVolumeRecordChanged(Landroid/os/storage/VolumeRecord;)V
+HSPLandroid/os/storage/IStorageEventListener;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+HSPLandroid/os/storage/StorageManagerInternal;->addExternalStoragePolicy(Landroid/os/storage/StorageManagerInternal$ExternalStorageMountPolicy;)V
+HSPLandroid/os/storage/StorageManagerInternal;->getExternalStorageMountMode(ILjava/lang/String;)I
+HSPLandroid/os/storage/StorageManagerInternal;->onExternalStoragePolicyChanged(ILjava/lang/String;)V
+HSPLandroid/print/IPrintManager;->addPrintJobStateChangeListener(Landroid/print/IPrintJobStateChangeListener;II)V
+HSPLandroid/print/IPrintManager;->addPrintServiceRecommendationsChangeListener(Landroid/printservice/recommendation/IRecommendationsChangeListener;I)V
+HSPLandroid/print/IPrintManager;->addPrintServicesChangeListener(Landroid/print/IPrintServicesChangeListener;I)V
+HSPLandroid/print/IPrintManager;->cancelPrintJob(Landroid/print/PrintJobId;II)V
+HSPLandroid/print/IPrintManager;->createPrinterDiscoverySession(Landroid/print/IPrinterDiscoveryObserver;I)V
+HSPLandroid/print/IPrintManager;->destroyPrinterDiscoverySession(Landroid/print/IPrinterDiscoveryObserver;I)V
+HSPLandroid/print/IPrintManager;->getCustomPrinterIcon(Landroid/print/PrinterId;I)Landroid/graphics/drawable/Icon;
+HSPLandroid/print/IPrintManager;->getPrintJobInfo(Landroid/print/PrintJobId;II)Landroid/print/PrintJobInfo;
+HSPLandroid/print/IPrintManager;->getPrintJobInfos(II)Ljava/util/List;
+HSPLandroid/print/IPrintManager;->getPrintServiceRecommendations(I)Ljava/util/List;
+HSPLandroid/print/IPrintManager;->getPrintServices(II)Ljava/util/List;
+HSPLandroid/print/IPrintManager;->print(Ljava/lang/String;Landroid/print/IPrintDocumentAdapter;Landroid/print/PrintAttributes;Ljava/lang/String;II)Landroid/os/Bundle;
+HSPLandroid/print/IPrintManager;->removePrintJobStateChangeListener(Landroid/print/IPrintJobStateChangeListener;I)V
+HSPLandroid/print/IPrintManager;->removePrintServiceRecommendationsChangeListener(Landroid/printservice/recommendation/IRecommendationsChangeListener;I)V
+HSPLandroid/print/IPrintManager;->removePrintServicesChangeListener(Landroid/print/IPrintServicesChangeListener;I)V
+HSPLandroid/print/IPrintManager;->restartPrintJob(Landroid/print/PrintJobId;II)V
+HSPLandroid/print/IPrintManager;->setPrintServiceEnabled(Landroid/content/ComponentName;ZI)V
+HSPLandroid/print/IPrintManager;->startPrinterDiscovery(Landroid/print/IPrinterDiscoveryObserver;Ljava/util/List;I)V
+HSPLandroid/print/IPrintManager;->startPrinterStateTracking(Landroid/print/PrinterId;I)V
+HSPLandroid/print/IPrintManager;->stopPrinterDiscovery(Landroid/print/IPrinterDiscoveryObserver;I)V
+HSPLandroid/print/IPrintManager;->stopPrinterStateTracking(Landroid/print/PrinterId;I)V
+HSPLandroid/print/IPrintManager;->validatePrinters(Ljava/util/List;I)V
+HSPLandroid/security/keymaster/IKeyAttestationApplicationIdProvider;->getKeyAttestationApplicationId(I)Landroid/security/keymaster/KeyAttestationApplicationId;
+HSPLandroid/security/keystore/AndroidKeyStoreBCWorkaroundProvider;-><init>()V
+HSPLandroid/service/dreams/DreamManagerInternal;->isDreaming()Z
+HSPLandroid/service/dreams/DreamManagerInternal;->startDream(Z)V
+HSPLandroid/service/dreams/DreamManagerInternal;->stopDream(Z)V
+HSPLandroid/service/dreams/IDreamManager;->awaken()V
+HSPLandroid/service/dreams/IDreamManager;->dream()V
+HSPLandroid/service/dreams/IDreamManager;->finishSelf(Landroid/os/IBinder;Z)V
+HSPLandroid/service/dreams/IDreamManager;->getDefaultDreamComponent()Landroid/content/ComponentName;
+HSPLandroid/service/dreams/IDreamManager;->getDreamComponents()[Landroid/content/ComponentName;
+HSPLandroid/service/dreams/IDreamManager;->isDreaming()Z
+HSPLandroid/service/dreams/IDreamManager;->setDreamComponents([Landroid/content/ComponentName;)V
+HSPLandroid/service/dreams/IDreamManager;->startDozing(Landroid/os/IBinder;II)V
+HSPLandroid/service/dreams/IDreamManager;->stopDozing(Landroid/os/IBinder;)V
+HSPLandroid/service/dreams/IDreamManager;->testDream(Landroid/content/ComponentName;)V
+HSPLandroid/service/gatekeeper/IGateKeeperService;->clearSecureUserId(I)V
+HSPLandroid/service/gatekeeper/IGateKeeperService;->enroll(I[B[B[B)Landroid/service/gatekeeper/GateKeeperResponse;
+HSPLandroid/service/gatekeeper/IGateKeeperService;->getSecureUserId(I)J
+HSPLandroid/service/gatekeeper/IGateKeeperService;->reportDeviceSetupComplete()V
+HSPLandroid/service/gatekeeper/IGateKeeperService;->verify(I[B[B)Landroid/service/gatekeeper/GateKeeperResponse;
+HSPLandroid/service/gatekeeper/IGateKeeperService;->verifyChallenge(IJ[B[B)Landroid/service/gatekeeper/GateKeeperResponse;
+HSPLandroid/service/notification/IConditionProvider;->onConnected()V
+HSPLandroid/service/notification/IConditionProvider;->onSubscribe(Landroid/net/Uri;)V
+HSPLandroid/service/notification/IConditionProvider;->onUnsubscribe(Landroid/net/Uri;)V
+HSPLandroid/service/oemlock/IOemLockService;->canUserAllowOemUnlock()Z
+HSPLandroid/service/oemlock/IOemLockService;->isDeviceOemUnlocked()Z
+HSPLandroid/service/oemlock/IOemLockService;->isOemUnlockAllowed()Z
+HSPLandroid/service/oemlock/IOemLockService;->isOemUnlockAllowedByCarrier()Z
+HSPLandroid/service/oemlock/IOemLockService;->isOemUnlockAllowedByUser()Z
+HSPLandroid/service/oemlock/IOemLockService;->setOemUnlockAllowedByCarrier(Z[B)V
+HSPLandroid/service/oemlock/IOemLockService;->setOemUnlockAllowedByUser(Z)V
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->getDataBlockSize()I
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->getFlashLockState()I
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->getMaximumDataBlockSize()J
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->getOemUnlockEnabled()Z
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->hasFrpCredentialHandle()Z
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->read()[B
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->setOemUnlockEnabled(Z)V
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->wipe()V
+HSPLandroid/service/persistentdata/IPersistentDataBlockService;->write([B)I
+HSPLandroid/service/voice/VoiceInteractionManagerInternal;->startLocalVoiceInteraction(Landroid/os/IBinder;Landroid/os/Bundle;)V
+HSPLandroid/service/voice/VoiceInteractionManagerInternal;->stopLocalVoiceInteraction(Landroid/os/IBinder;)V
+HSPLandroid/service/voice/VoiceInteractionManagerInternal;->supportsLocalVoiceInteraction()Z
+HSPLandroid/service/wallpaper/IWallpaperConnection;->attachEngine(Landroid/service/wallpaper/IWallpaperEngine;)V
+HSPLandroid/service/wallpaper/IWallpaperConnection;->engineShown(Landroid/service/wallpaper/IWallpaperEngine;)V
+HSPLandroid/service/wallpaper/IWallpaperConnection;->onWallpaperColorsChanged(Landroid/app/WallpaperColors;)V
+HSPLandroid/service/wallpaper/IWallpaperConnection;->setWallpaper(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;
+HSPLandroid/service/wallpaper/IWallpaperEngine;->destroy()V
+HSPLandroid/service/wallpaper/IWallpaperEngine;->dispatchPointer(Landroid/view/MotionEvent;)V
+HSPLandroid/service/wallpaper/IWallpaperEngine;->dispatchWallpaperCommand(Ljava/lang/String;IIILandroid/os/Bundle;)V
+HSPLandroid/service/wallpaper/IWallpaperEngine;->requestWallpaperColors()V
+HSPLandroid/service/wallpaper/IWallpaperEngine;->setDesiredSize(II)V
+HSPLandroid/service/wallpaper/IWallpaperEngine;->setDisplayPadding(Landroid/graphics/Rect;)V
+HSPLandroid/service/wallpaper/IWallpaperEngine;->setVisibility(Z)V
+HSPLandroid/service/wallpaper/IWallpaperService;->attach(Landroid/service/wallpaper/IWallpaperConnection;Landroid/os/IBinder;IZIILandroid/graphics/Rect;)V
+HSPLandroid/telecom/DefaultDialerManager;->filterByIntent(Landroid/content/Context;Ljava/util/List;Landroid/content/Intent;I)Ljava/util/List;
+HSPLandroid/telecom/Log$$Lambda$0;-><init>()V
+HSPLandroid/telecom/Log$$Lambda$0;->getSessionId()Ljava/lang/String;
+HSPLandroid/telecom/Logging/EventManager$EventListener;->eventRecordAdded(Landroid/telecom/Logging/EventManager$EventRecord;)V
+HSPLandroid/telecom/Logging/SessionManager$$Lambda$1;-><init>()V
+HSPLandroid/telecom/Logging/SessionManager$$Lambda$1;->get()I
+HSPLandroid/telecom/Logging/SessionManager$$Lambda$2;->get()J
+HSPLandroid/telecom/Logging/SessionManager$ICurrentThreadId;->get()I
+HSPLandroid/telecom/Logging/SessionManager$ISessionCleanupTimeoutMs;->get()J
+HSPLandroid/telecom/Logging/SessionManager$ISessionIdQueryHandler;->getSessionId()Ljava/lang/String;
+HSPLandroid/telecom/Logging/SessionManager$ISessionListener;->sessionComplete(Ljava/lang/String;J)V
+HSPLandroid/telecom/Logging/SessionManager;->lambda$new$1$SessionManager()J
+HSPLandroid/telephony/CellLocation;->fillInNotifierBundle(Landroid/os/Bundle;)V
+HSPLandroid/telephony/CellLocation;->isEmpty()Z
+HSPLandroid/telephony/CellLocation;->setStateInvalid()V
+HSPLandroid/util/Log;->access$000()I
+HSPLandroid/util/Log;->wtf(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
+HSPLandroid/util/Spline;->interpolate(F)F
+HSPLandroid/util/TimeUtils;->formatDuration(JJLjava/io/PrintWriter;)V
+HSPLandroid/util/TimeUtils;->formatUptime(J)Ljava/lang/String;
+HSPLandroid/util/TrustedTime;->currentTimeMillis()J
+HSPLandroid/util/TrustedTime;->forceRefresh()Z
+HSPLandroid/util/TrustedTime;->getCacheAge()J
+HSPLandroid/util/TrustedTime;->getCacheCertainty()J
+HSPLandroid/util/TrustedTime;->hasCache()Z
+HSPLandroid/view/IApplicationToken;->getName()Ljava/lang/String;
+HSPLandroid/view/IDockedStackListener;->onAdjustedForImeChanged(ZJ)V
+HSPLandroid/view/IDockedStackListener;->onDividerVisibilityChanged(Z)V
+HSPLandroid/view/IDockedStackListener;->onDockSideChanged(I)V
+HSPLandroid/view/IDockedStackListener;->onDockedStackExistsChanged(Z)V
+HSPLandroid/view/IDockedStackListener;->onDockedStackMinimizedChanged(ZJZ)V
+HSPLandroid/view/IPinnedStackController;->getDisplayRotation()I
+HSPLandroid/view/IPinnedStackController;->setIsMinimized(Z)V
+HSPLandroid/view/IPinnedStackController;->setMinEdgeSize(I)V
+HSPLandroid/view/IPinnedStackListener;->onActionsChanged(Landroid/content/pm/ParceledListSlice;)V
+HSPLandroid/view/IPinnedStackListener;->onImeVisibilityChanged(ZI)V
+HSPLandroid/view/IPinnedStackListener;->onListenerRegistered(Landroid/view/IPinnedStackController;)V
+HSPLandroid/view/IPinnedStackListener;->onMinimizedStateChanged(Z)V
+HSPLandroid/view/IPinnedStackListener;->onMovementBoundsChanged(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZI)V
+HSPLandroid/view/IWallpaperVisibilityListener;->onWallpaperVisibilityChanged(ZI)V
+HSPLandroid/view/IWindowId;->isFocused()Z
+HSPLandroid/view/IWindowId;->registerFocusObserver(Landroid/view/IWindowFocusObserver;)V
+HSPLandroid/view/IWindowId;->unregisterFocusObserver(Landroid/view/IWindowFocusObserver;)V
+HSPLandroid/view/WindowManagerInternal$OnHardKeyboardStatusChangeListener;->onHardKeyboardStatusChange(Z)V
+HSPLandroid/view/WindowManagerInternal;->addWindowToken(Landroid/os/IBinder;II)V
+HSPLandroid/view/WindowManagerInternal;->clearLastInputMethodWindowForTransition()V
+HSPLandroid/view/WindowManagerInternal;->computeWindowsForAccessibility()V
+HSPLandroid/view/WindowManagerInternal;->getCompatibleMagnificationSpecForWindow(Landroid/os/IBinder;)Landroid/view/MagnificationSpec;
+HSPLandroid/view/WindowManagerInternal;->getFocusedWindowToken()Landroid/os/IBinder;
+HSPLandroid/view/WindowManagerInternal;->getInputMethodWindowVisibleHeight()I
+HSPLandroid/view/WindowManagerInternal;->getMagnificationRegion(Landroid/graphics/Region;)V
+HSPLandroid/view/WindowManagerInternal;->getWindowFrame(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+HSPLandroid/view/WindowManagerInternal;->isDockedDividerResizing()Z
+HSPLandroid/view/WindowManagerInternal;->isHardKeyboardAvailable()Z
+HSPLandroid/view/WindowManagerInternal;->isKeyguardGoingAway()Z
+HSPLandroid/view/WindowManagerInternal;->isKeyguardLocked()Z
+HSPLandroid/view/WindowManagerInternal;->isKeyguardShowingAndNotOccluded()Z
+HSPLandroid/view/WindowManagerInternal;->isStackVisible(I)Z
+HSPLandroid/view/WindowManagerInternal;->registerAppTransitionListener(Landroid/view/WindowManagerInternal$AppTransitionListener;)V
+HSPLandroid/view/WindowManagerInternal;->removeWindowToken(Landroid/os/IBinder;ZI)V
+HSPLandroid/view/WindowManagerInternal;->requestTraversalFromDisplayManager()V
+HSPLandroid/view/WindowManagerInternal;->saveLastInputMethodWindowForTransition()V
+HSPLandroid/view/WindowManagerInternal;->setForceShowMagnifiableBounds(Z)V
+HSPLandroid/view/WindowManagerInternal;->setInputFilter(Landroid/view/IInputFilter;)V
+HSPLandroid/view/WindowManagerInternal;->setMagnificationCallbacks(Landroid/view/WindowManagerInternal$MagnificationCallbacks;)V
+HSPLandroid/view/WindowManagerInternal;->setMagnificationSpec(Landroid/view/MagnificationSpec;)V
+HSPLandroid/view/WindowManagerInternal;->setOnHardKeyboardStatusChangeListener(Landroid/view/WindowManagerInternal$OnHardKeyboardStatusChangeListener;)V
+HSPLandroid/view/WindowManagerInternal;->setVr2dDisplayId(I)V
+HSPLandroid/view/WindowManagerInternal;->setWindowsForAccessibilityCallback(Landroid/view/WindowManagerInternal$WindowsForAccessibilityCallback;)V
+HSPLandroid/view/WindowManagerInternal;->showGlobalActions()V
+HSPLandroid/view/WindowManagerInternal;->updateInputMethodWindowStatus(Landroid/os/IBinder;ZZLandroid/os/IBinder;)V
+HSPLandroid/view/WindowManagerInternal;->waitForAllWindowsDrawn(Ljava/lang/Runnable;J)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->createInputConsumer(Landroid/os/Looper;Ljava/lang/String;Landroid/view/InputEventReceiver$Factory;)Landroid/view/WindowManagerPolicy$InputConsumer;
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->getCameraLensCoverState()I
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->getDockedDividerInsetsLw()I
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->getInputMethodWindowLw()Landroid/view/WindowManagerPolicy$WindowState;
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->getLidState()I
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->getStackBounds(ILandroid/graphics/Rect;)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->getWindowManagerLock()Ljava/lang/Object;
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->lockDeviceNow()V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->notifyKeyguardTrustedChanged()V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->notifyShowingDreamChanged()V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->reboot(Z)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->rebootSafeMode(Z)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->reevaluateStatusBarVisibility()V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->registerPointerEventListener(Landroid/view/WindowManagerPolicy$PointerEventListener;)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->screenTurningOff(Landroid/view/WindowManagerPolicy$ScreenOffListener;)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->shutdown(Z)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->switchInputMethod(Z)V
+HSPLandroid/view/WindowManagerPolicy$WindowManagerFuncs;->unregisterPointerEventListener(Landroid/view/WindowManagerPolicy$PointerEventListener;)V
+HSPLandroid/view/WindowManagerPolicy$WindowState;->canAcquireSleepToken()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->canAffectSystemUiFlags()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->computeFrameLw(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getAppToken()Landroid/view/IApplicationToken;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getBaseType()I
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getContentFrameLw()Landroid/graphics/Rect;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getDisplayFrameLw()Landroid/graphics/Rect;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getDisplayId()I
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getFrameLw()Landroid/graphics/Rect;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getGivenContentInsetsLw()Landroid/graphics/Rect;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getGivenInsetsPendingLw()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getGivenVisibleInsetsLw()Landroid/graphics/Rect;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getNeedsMenuLw(Landroid/view/WindowManagerPolicy$WindowState;)Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getOverscanFrameLw()Landroid/graphics/Rect;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getOwningPackage()Ljava/lang/String;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getOwningUid()I
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getRotationAnimationHint()I
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getShownPositionLw()Landroid/graphics/Point;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getStackId()I
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getSurfaceLayer()I
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getSystemUiVisibility()I
+HSPLandroid/view/WindowManagerPolicy$WindowState;->getVisibleFrameLw()Landroid/graphics/Rect;
+HSPLandroid/view/WindowManagerPolicy$WindowState;->hasAppShownWindows()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->hasDrawnLw()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->hideLw(Z)Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isAlive()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isAnimatingLw()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isDefaultDisplay()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isDimming()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isDisplayedLw()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isDrawnLw()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isGoneForLayoutLw()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isInMultiWindowMode()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isInputMethodWindow()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isVisibleLw()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->isVoiceInteraction()Z
+HSPLandroid/view/WindowManagerPolicy$WindowState;->showLw(Z)Z
+HSPLandroid/view/WindowManagerPolicy;->addSplashScreen(Landroid/os/IBinder;Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/content/res/Configuration;I)Landroid/view/WindowManagerPolicy$StartingSurface;
+HSPLandroid/view/WindowManagerPolicy;->adjustConfigurationLw(Landroid/content/res/Configuration;II)V
+HSPLandroid/view/WindowManagerPolicy;->adjustSystemUiVisibilityLw(I)I
+HSPLandroid/view/WindowManagerPolicy;->adjustWindowParamsLw(Landroid/view/WindowManager$LayoutParams;)V
+HSPLandroid/view/WindowManagerPolicy;->allowAppAnimationsLw()Z
+HSPLandroid/view/WindowManagerPolicy;->applyPostLayoutPolicyLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)V
+HSPLandroid/view/WindowManagerPolicy;->beginLayoutLw(ZIIII)V
+HSPLandroid/view/WindowManagerPolicy;->beginPostLayoutPolicyLw(II)V
+HSPLandroid/view/WindowManagerPolicy;->canBeHiddenByKeyguardLw(Landroid/view/WindowManagerPolicy$WindowState;)Z
+HSPLandroid/view/WindowManagerPolicy;->canDismissBootAnimation()Z
+HSPLandroid/view/WindowManagerPolicy;->canMagnifyWindow(I)Z
+HSPLandroid/view/WindowManagerPolicy;->checkAddPermission(Landroid/view/WindowManager$LayoutParams;[I)I
+HSPLandroid/view/WindowManagerPolicy;->checkShowToOwnerOnly(Landroid/view/WindowManager$LayoutParams;)Z
+HSPLandroid/view/WindowManagerPolicy;->createHiddenByKeyguardExit(ZZ)Landroid/view/animation/Animation;
+HSPLandroid/view/WindowManagerPolicy;->createKeyguardWallpaperExit(Z)Landroid/view/animation/Animation;
+HSPLandroid/view/WindowManagerPolicy;->dismissKeyguardLw(Lcom/android/internal/policy/IKeyguardDismissCallback;)V
+HSPLandroid/view/WindowManagerPolicy;->dispatchUnhandledKey(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+HSPLandroid/view/WindowManagerPolicy;->dump(Ljava/lang/String;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HSPLandroid/view/WindowManagerPolicy;->enableKeyguard(Z)V
+HSPLandroid/view/WindowManagerPolicy;->enableScreenAfterBoot()V
+HSPLandroid/view/WindowManagerPolicy;->exitKeyguardSecurely(Landroid/view/WindowManagerPolicy$OnKeyguardExitResult;)V
+HSPLandroid/view/WindowManagerPolicy;->finishLayoutLw()V
+HSPLandroid/view/WindowManagerPolicy;->finishPostLayoutPolicyLw()I
+HSPLandroid/view/WindowManagerPolicy;->finishedGoingToSleep(I)V
+HSPLandroid/view/WindowManagerPolicy;->finishedWakingUp()V
+HSPLandroid/view/WindowManagerPolicy;->focusChangedLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)I
+HSPLandroid/view/WindowManagerPolicy;->getConfigDisplayHeight(IIIII)I
+HSPLandroid/view/WindowManagerPolicy;->getConfigDisplayWidth(IIIII)I
+HSPLandroid/view/WindowManagerPolicy;->getContentRectLw(Landroid/graphics/Rect;)V
+HSPLandroid/view/WindowManagerPolicy;->getInputMethodWindowVisibleHeightLw()I
+HSPLandroid/view/WindowManagerPolicy;->getInsetHintLw(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;IIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+HSPLandroid/view/WindowManagerPolicy;->getMaxWallpaperLayer()I
+HSPLandroid/view/WindowManagerPolicy;->getNavBarPosition()I
+HSPLandroid/view/WindowManagerPolicy;->getNonDecorDisplayHeight(IIIII)I
+HSPLandroid/view/WindowManagerPolicy;->getNonDecorDisplayWidth(IIIII)I
+HSPLandroid/view/WindowManagerPolicy;->getNonDecorInsetsLw(IIILandroid/graphics/Rect;)V
+HSPLandroid/view/WindowManagerPolicy;->getStableInsetsLw(IIILandroid/graphics/Rect;)V
+HSPLandroid/view/WindowManagerPolicy;->getSystemDecorLayerLw()I
+HSPLandroid/view/WindowManagerPolicy;->getUserRotationMode()I
+HSPLandroid/view/WindowManagerPolicy;->hasNavigationBar()Z
+HSPLandroid/view/WindowManagerPolicy;->hideBootMessages()V
+HSPLandroid/view/WindowManagerPolicy;->inKeyguardRestrictedKeyInputMode()Z
+HSPLandroid/view/WindowManagerPolicy;->init(Landroid/content/Context;Landroid/view/IWindowManager;Landroid/view/WindowManagerPolicy$WindowManagerFuncs;)V
+HSPLandroid/view/WindowManagerPolicy;->interceptKeyBeforeDispatching(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/KeyEvent;I)J
+HSPLandroid/view/WindowManagerPolicy;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+HSPLandroid/view/WindowManagerPolicy;->interceptMotionBeforeQueueingNonInteractive(JI)I
+HSPLandroid/view/WindowManagerPolicy;->isDefaultOrientationForced()Z
+HSPLandroid/view/WindowManagerPolicy;->isDockSideAllowed(I)Z
+HSPLandroid/view/WindowManagerPolicy;->isKeyguardDrawnLw()Z
+HSPLandroid/view/WindowManagerPolicy;->isKeyguardHostWindow(Landroid/view/WindowManager$LayoutParams;)Z
+HSPLandroid/view/WindowManagerPolicy;->isKeyguardLocked()Z
+HSPLandroid/view/WindowManagerPolicy;->isKeyguardOccluded()Z
+HSPLandroid/view/WindowManagerPolicy;->isKeyguardSecure(I)Z
+HSPLandroid/view/WindowManagerPolicy;->isKeyguardShowingAndNotOccluded()Z
+HSPLandroid/view/WindowManagerPolicy;->isKeyguardTrustedLw()Z
+HSPLandroid/view/WindowManagerPolicy;->isNavBarForcedShownLw(Landroid/view/WindowManagerPolicy$WindowState;)Z
+HSPLandroid/view/WindowManagerPolicy;->isScreenOn()Z
+HSPLandroid/view/WindowManagerPolicy;->isShowingDreamLw()Z
+HSPLandroid/view/WindowManagerPolicy;->isTopLevelWindow(I)Z
+HSPLandroid/view/WindowManagerPolicy;->keepScreenOnStartedLw()V
+HSPLandroid/view/WindowManagerPolicy;->keepScreenOnStoppedLw()V
+HSPLandroid/view/WindowManagerPolicy;->layoutWindowLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)V
+HSPLandroid/view/WindowManagerPolicy;->lockNow(Landroid/os/Bundle;)V
+HSPLandroid/view/WindowManagerPolicy;->notifyCameraLensCoverSwitchChanged(JZ)V
+HSPLandroid/view/WindowManagerPolicy;->notifyLidSwitchChanged(JZ)V
+HSPLandroid/view/WindowManagerPolicy;->okToAnimate()Z
+HSPLandroid/view/WindowManagerPolicy;->onConfigurationChanged()V
+HSPLandroid/view/WindowManagerPolicy;->onKeyguardOccludedChangedLw(Z)V
+HSPLandroid/view/WindowManagerPolicy;->onSystemUiStarted()V
+HSPLandroid/view/WindowManagerPolicy;->performHapticFeedbackLw(Landroid/view/WindowManagerPolicy$WindowState;IZ)Z
+HSPLandroid/view/WindowManagerPolicy;->prepareAddWindowLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;)I
+HSPLandroid/view/WindowManagerPolicy;->registerShortcutKey(JLcom/android/internal/policy/IShortcutService;)V
+HSPLandroid/view/WindowManagerPolicy;->removeWindowLw(Landroid/view/WindowManagerPolicy$WindowState;)V
+HSPLandroid/view/WindowManagerPolicy;->rotationForOrientationLw(II)I
+HSPLandroid/view/WindowManagerPolicy;->rotationHasCompatibleMetricsLw(II)Z
+HSPLandroid/view/WindowManagerPolicy;->screenTurnedOff()V
+HSPLandroid/view/WindowManagerPolicy;->screenTurnedOn()V
+HSPLandroid/view/WindowManagerPolicy;->screenTurningOff(Landroid/view/WindowManagerPolicy$ScreenOffListener;)V
+HSPLandroid/view/WindowManagerPolicy;->screenTurningOn(Landroid/view/WindowManagerPolicy$ScreenOnListener;)V
+HSPLandroid/view/WindowManagerPolicy;->selectAnimationLw(Landroid/view/WindowManagerPolicy$WindowState;I)I
+HSPLandroid/view/WindowManagerPolicy;->selectRotationAnimationLw([I)V
+HSPLandroid/view/WindowManagerPolicy;->setCurrentOrientationLw(I)V
+HSPLandroid/view/WindowManagerPolicy;->setCurrentUserLw(I)V
+HSPLandroid/view/WindowManagerPolicy;->setDisplayOverscan(Landroid/view/Display;IIII)V
+HSPLandroid/view/WindowManagerPolicy;->setInitialDisplaySize(Landroid/view/Display;III)V
+HSPLandroid/view/WindowManagerPolicy;->setLastInputMethodWindowLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)V
+HSPLandroid/view/WindowManagerPolicy;->setPipVisibilityLw(Z)V
+HSPLandroid/view/WindowManagerPolicy;->setRecentsVisibilityLw(Z)V
+HSPLandroid/view/WindowManagerPolicy;->setRotationLw(I)V
+HSPLandroid/view/WindowManagerPolicy;->setSafeMode(Z)V
+HSPLandroid/view/WindowManagerPolicy;->setSwitchingUser(Z)V
+HSPLandroid/view/WindowManagerPolicy;->setUserRotationMode(II)V
+HSPLandroid/view/WindowManagerPolicy;->shouldRotateSeamlessly(II)Z
+HSPLandroid/view/WindowManagerPolicy;->showBootMessage(Ljava/lang/CharSequence;Z)V
+HSPLandroid/view/WindowManagerPolicy;->showGlobalActions()V
+HSPLandroid/view/WindowManagerPolicy;->showRecentApps(Z)V
+HSPLandroid/view/WindowManagerPolicy;->startKeyguardExitAnimation(JJ)V
+HSPLandroid/view/WindowManagerPolicy;->startedGoingToSleep(I)V
+HSPLandroid/view/WindowManagerPolicy;->startedWakingUp()V
+HSPLandroid/view/WindowManagerPolicy;->systemBooted()V
+HSPLandroid/view/WindowManagerPolicy;->systemReady()V
+HSPLandroid/view/WindowManagerPolicy;->userActivity()V
+HSPLandroid/view/WindowManagerPolicy;->validateRotationAnimationLw(IIZ)Z
+HSPLandroid/view/WindowManagerPolicy;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
+HSPLandroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener;->onAccessibilityServicesStateChanged(Landroid/view/accessibility/AccessibilityManager;)V
+HSPLandroid/view/autofill/AutofillManagerInternal;->onBackKeyPressed()V
+HSPLandroid/view/inputmethod/InputMethodManagerInternal;->hideCurrentInputMethod()V
+HSPLandroid/view/inputmethod/InputMethodManagerInternal;->setInteractive(Z)V
+HSPLandroid/view/inputmethod/InputMethodManagerInternal;->switchInputMethod(Z)V
+HSPLcom/android/internal/app/ISoundTriggerService;->deleteSoundModel(Landroid/os/ParcelUuid;)V
+HSPLcom/android/internal/app/ISoundTriggerService;->getSoundModel(Landroid/os/ParcelUuid;)Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;
+HSPLcom/android/internal/app/ISoundTriggerService;->isRecognitionActive(Landroid/os/ParcelUuid;)Z
+HSPLcom/android/internal/app/ISoundTriggerService;->loadGenericSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;)I
+HSPLcom/android/internal/app/ISoundTriggerService;->loadKeyphraseSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;)I
+HSPLcom/android/internal/app/ISoundTriggerService;->startRecognition(Landroid/os/ParcelUuid;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+HSPLcom/android/internal/app/ISoundTriggerService;->startRecognitionForIntent(Landroid/os/ParcelUuid;Landroid/app/PendingIntent;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+HSPLcom/android/internal/app/ISoundTriggerService;->stopRecognition(Landroid/os/ParcelUuid;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
+HSPLcom/android/internal/app/ISoundTriggerService;->stopRecognitionForIntent(Landroid/os/ParcelUuid;)I
+HSPLcom/android/internal/app/ISoundTriggerService;->unloadSoundModel(Landroid/os/ParcelUuid;)I
+HSPLcom/android/internal/app/ISoundTriggerService;->updateSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;)V
+HSPLcom/android/internal/app/IVoiceInteractionSessionListener;->onVoiceSessionHidden()V
+HSPLcom/android/internal/app/IVoiceInteractionSessionListener;->onVoiceSessionShown()V
+HSPLcom/android/internal/app/procstats/IProcessStats;->getCurrentMemoryState()I
+HSPLcom/android/internal/app/procstats/IProcessStats;->getCurrentStats(Ljava/util/List;)[B
+HSPLcom/android/internal/app/procstats/IProcessStats;->getStatsOverTime(J)Landroid/os/ParcelFileDescriptor;
+HSPLcom/android/internal/inputmethod/LocaleUtils$LocaleExtractor;->get(Ljava/lang/Object;)Ljava/util/Locale;
+HSPLcom/android/internal/location/ILocationProvider;->disable()V
+HSPLcom/android/internal/location/ILocationProvider;->enable()V
+HSPLcom/android/internal/location/ILocationProvider;->getProperties()Lcom/android/internal/location/ProviderProperties;
+HSPLcom/android/internal/location/ILocationProvider;->getStatus(Landroid/os/Bundle;)I
+HSPLcom/android/internal/location/ILocationProvider;->getStatusUpdateTime()J
+HSPLcom/android/internal/location/ILocationProvider;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)Z
+HSPLcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$3;->run()V
+HSPLcom/android/internal/os/BatteryStatsImpl$4;-><init>()V
+HSPLcom/android/internal/os/BatteryStatsImpl$BatteryCallback;->batteryNeedsCpuUpdate()V
+HSPLcom/android/internal/os/BatteryStatsImpl$BatteryCallback;->batteryPowerChanged(Z)V
+HSPLcom/android/internal/os/BatteryStatsImpl$BatteryCallback;->batterySendBroadcast(Landroid/content/Intent;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$ExternalStatsSync;->scheduleCpuSyncDueToRemovedUid(I)Ljava/util/concurrent/Future;
+HSPLcom/android/internal/os/BatteryStatsImpl$ExternalStatsSync;->scheduleSync(Ljava/lang/String;I)Ljava/util/concurrent/Future;
+HSPLcom/android/internal/os/BatteryStatsImpl$PlatformIdleStateCallback;->getPlatformLowPowerStats()Ljava/lang/String;
+HSPLcom/android/internal/os/BatteryStatsImpl$PlatformIdleStateCallback;->getSubsystemLowPowerStats()Ljava/lang/String;
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->access$600(Lcom/android/internal/os/BatteryStatsImpl$Uid;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->access$602(Lcom/android/internal/os/BatteryStatsImpl$Uid;Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->access$700(Lcom/android/internal/os/BatteryStatsImpl$Uid;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->access$702(Lcom/android/internal/os/BatteryStatsImpl$Uid;Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+HSPLcom/android/internal/os/BatteryStatsImpl$UserInfoProvider;->getUserIds()[I
+HSPLcom/android/internal/os/BatteryStatsImpl;->markPartialTimersAsEligible()V
+HSPLcom/android/internal/os/BatteryStatsImpl;->readDailyItemTagDetailsLocked(Lorg/xmlpull/v1/XmlPullParser;Landroid/os/BatteryStats$DailyItem;ZLjava/lang/String;)V
+HSPLcom/android/internal/os/BatteryStatsImpl;->readDailyItemTagLocked(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/internal/os/BatteryStatsImpl;->readDailyItemsLocked(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/internal/os/BatteryStatsImpl;->updateCpuTimeLocked()V
+HSPLcom/android/internal/os/IDropBoxManagerService;->add(Landroid/os/DropBoxManager$Entry;)V
+HSPLcom/android/internal/os/IDropBoxManagerService;->getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;
+HSPLcom/android/internal/os/IDropBoxManagerService;->isTagEnabled(Ljava/lang/String;)Z
+HSPLcom/android/internal/os/KernelUidCpuFreqTimeReader;->extractClusterInfoFromProcFileFreqs()Landroid/util/IntArray;
+HSPLcom/android/internal/os/KernelUidCpuFreqTimeReader;->readCpuFreqs(Ljava/lang/String;Lcom/android/internal/os/PowerProfile;)[J
+HSPLcom/android/internal/os/KernelUidCpuFreqTimeReader;->readFreqs(Lcom/android/internal/os/PowerProfile;)[J
+HSPLcom/android/internal/os/KernelUidCpuFreqTimeReader;->readFreqs(Ljava/io/BufferedReader;Lcom/android/internal/os/PowerProfile;)[J
+HSPLcom/android/internal/policy/IKeyguardDrawnCallback;->onDrawn()V
+HSPLcom/android/internal/policy/IKeyguardStateCallback;->onHasLockscreenWallpaperChanged(Z)V
+HSPLcom/android/internal/policy/IKeyguardStateCallback;->onInputRestrictedStateChanged(Z)V
+HSPLcom/android/internal/policy/IKeyguardStateCallback;->onShowingStateChanged(Z)V
+HSPLcom/android/internal/policy/IKeyguardStateCallback;->onSimSecureStateChanged(Z)V
+HSPLcom/android/internal/policy/IKeyguardStateCallback;->onTrustedChanged(Z)V
+HSPLcom/android/internal/policy/IShortcutService;->notifyShortcutKeyPressed(J)V
+HSPLcom/android/internal/statusbar/IStatusBar;->addQsTile(Landroid/content/ComponentName;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->animateCollapsePanels()V
+HSPLcom/android/internal/statusbar/IStatusBar;->animateExpandNotificationsPanel()V
+HSPLcom/android/internal/statusbar/IStatusBar;->animateExpandSettingsPanel(Ljava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->appTransitionCancelled()V
+HSPLcom/android/internal/statusbar/IStatusBar;->appTransitionFinished()V
+HSPLcom/android/internal/statusbar/IStatusBar;->appTransitionPending()V
+HSPLcom/android/internal/statusbar/IStatusBar;->appTransitionStarting(JJ)V
+HSPLcom/android/internal/statusbar/IStatusBar;->cancelPreloadRecentApps()V
+HSPLcom/android/internal/statusbar/IStatusBar;->clickQsTile(Landroid/content/ComponentName;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->disable(II)V
+HSPLcom/android/internal/statusbar/IStatusBar;->dismissKeyboardShortcutsMenu()V
+HSPLcom/android/internal/statusbar/IStatusBar;->handleSystemKey(I)V
+HSPLcom/android/internal/statusbar/IStatusBar;->hideRecentApps(ZZ)V
+HSPLcom/android/internal/statusbar/IStatusBar;->onCameraLaunchGestureDetected(I)V
+HSPLcom/android/internal/statusbar/IStatusBar;->preloadRecentApps()V
+HSPLcom/android/internal/statusbar/IStatusBar;->remQsTile(Landroid/content/ComponentName;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->removeIcon(Ljava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->setIcon(Ljava/lang/String;Lcom/android/internal/statusbar/StatusBarIcon;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->setImeWindowStatus(Landroid/os/IBinder;IIZ)V
+HSPLcom/android/internal/statusbar/IStatusBar;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->setTopAppHidesStatusBar(Z)V
+HSPLcom/android/internal/statusbar/IStatusBar;->setWindowState(II)V
+HSPLcom/android/internal/statusbar/IStatusBar;->showAssistDisclosure()V
+HSPLcom/android/internal/statusbar/IStatusBar;->showGlobalActionsMenu()V
+HSPLcom/android/internal/statusbar/IStatusBar;->showPictureInPictureMenu()V
+HSPLcom/android/internal/statusbar/IStatusBar;->showRecentApps(ZZ)V
+HSPLcom/android/internal/statusbar/IStatusBar;->showScreenPinningRequest(I)V
+HSPLcom/android/internal/statusbar/IStatusBar;->showShutdownUi(ZLjava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->startAssist(Landroid/os/Bundle;)V
+HSPLcom/android/internal/statusbar/IStatusBar;->toggleKeyboardShortcutsMenu(I)V
+HSPLcom/android/internal/statusbar/IStatusBar;->togglePanel()V
+HSPLcom/android/internal/statusbar/IStatusBar;->toggleRecentApps()V
+HSPLcom/android/internal/statusbar/IStatusBar;->toggleSplitScreen()V
+HSPLcom/android/internal/statusbar/IStatusBar;->topAppWindowChanged(Z)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->addTile(Landroid/content/ComponentName;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->clearNotificationEffects()V
+HSPLcom/android/internal/statusbar/IStatusBarService;->clickTile(Landroid/content/ComponentName;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->collapsePanels()V
+HSPLcom/android/internal/statusbar/IStatusBarService;->disable(ILandroid/os/IBinder;Ljava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->disable2(ILandroid/os/IBinder;Ljava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->disable2ForUser(ILandroid/os/IBinder;Ljava/lang/String;I)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->disableForUser(ILandroid/os/IBinder;Ljava/lang/String;I)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->expandNotificationsPanel()V
+HSPLcom/android/internal/statusbar/IStatusBarService;->expandSettingsPanel(Ljava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->handleSystemKey(I)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onClearAllNotifications(I)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onGlobalActionsHidden()V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onGlobalActionsShown()V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onNotificationActionClick(Ljava/lang/String;I)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onNotificationClear(Ljava/lang/String;Ljava/lang/String;II)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onNotificationClick(Ljava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onNotificationError(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onPanelHidden()V
+HSPLcom/android/internal/statusbar/IStatusBarService;->onPanelRevealed(ZI)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->reboot(Z)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->registerStatusBar(Lcom/android/internal/statusbar/IStatusBar;Ljava/util/List;Ljava/util/List;[ILjava/util/List;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->remTile(Landroid/content/ComponentName;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->removeIcon(Ljava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->setIcon(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->setIconVisibility(Ljava/lang/String;Z)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->setImeWindowStatus(Landroid/os/IBinder;IIZ)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->setSystemUiVisibility(IILjava/lang/String;)V
+HSPLcom/android/internal/statusbar/IStatusBarService;->shutdown()V
+HSPLcom/android/internal/statusbar/IStatusBarService;->togglePanel()V
+HSPLcom/android/internal/telephony/IMms;->addMultimediaMessageDraft(Ljava/lang/String;Landroid/net/Uri;)Landroid/net/Uri;
+HSPLcom/android/internal/telephony/IMms;->addTextMessageDraft(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;
+HSPLcom/android/internal/telephony/IMms;->archiveStoredConversation(Ljava/lang/String;JZ)Z
+HSPLcom/android/internal/telephony/IMms;->deleteStoredConversation(Ljava/lang/String;J)Z
+HSPLcom/android/internal/telephony/IMms;->deleteStoredMessage(Ljava/lang/String;Landroid/net/Uri;)Z
+HSPLcom/android/internal/telephony/IMms;->downloadMessage(ILjava/lang/String;Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;Landroid/app/PendingIntent;)V
+HSPLcom/android/internal/telephony/IMms;->getAutoPersisting()Z
+HSPLcom/android/internal/telephony/IMms;->getCarrierConfigValues(I)Landroid/os/Bundle;
+HSPLcom/android/internal/telephony/IMms;->importMultimediaMessage(Ljava/lang/String;Landroid/net/Uri;Ljava/lang/String;JZZ)Landroid/net/Uri;
+HSPLcom/android/internal/telephony/IMms;->importTextMessage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;JZZ)Landroid/net/Uri;
+HSPLcom/android/internal/telephony/IMms;->sendMessage(ILjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/PendingIntent;)V
+HSPLcom/android/internal/telephony/IMms;->sendStoredMessage(ILjava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;Landroid/app/PendingIntent;)V
+HSPLcom/android/internal/telephony/IMms;->setAutoPersisting(Ljava/lang/String;Z)V
+HSPLcom/android/internal/telephony/IMms;->updateStoredMessageStatus(Ljava/lang/String;Landroid/net/Uri;Landroid/content/ContentValues;)Z
+HSPLcom/android/internal/textservice/ITextServicesManager;->finishSpellCheckerService(Lcom/android/internal/textservice/ISpellCheckerSessionListener;)V
+HSPLcom/android/internal/textservice/ITextServicesManager;->getCurrentSpellChecker(Ljava/lang/String;)Landroid/view/textservice/SpellCheckerInfo;
+HSPLcom/android/internal/textservice/ITextServicesManager;->getCurrentSpellCheckerSubtype(Ljava/lang/String;Z)Landroid/view/textservice/SpellCheckerSubtype;
+HSPLcom/android/internal/textservice/ITextServicesManager;->getEnabledSpellCheckers()[Landroid/view/textservice/SpellCheckerInfo;
+HSPLcom/android/internal/textservice/ITextServicesManager;->getSpellCheckerService(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/textservice/ITextServicesSessionListener;Lcom/android/internal/textservice/ISpellCheckerSessionListener;Landroid/os/Bundle;)V
+HSPLcom/android/internal/textservice/ITextServicesManager;->isSpellCheckerEnabled()Z
+HSPLcom/android/internal/util/DumpUtils$Dump;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
+HSPLcom/android/internal/util/FastPrintWriter;->println(C)V
+HSPLcom/android/internal/util/FileRotator$Rewriter;->reset()V
+HSPLcom/android/internal/util/FileRotator$Rewriter;->shouldWrite()Z
+HSPLcom/android/internal/util/FileRotator$Writer;->write(Ljava/io/OutputStream;)V
+HSPLcom/android/internal/util/XmlUtils$ReadMapCallback;->readThisUnknownObjectXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/Object;
+HSPLcom/android/internal/view/IInputMethod;->attachToken(Landroid/os/IBinder;)V
+HSPLcom/android/internal/view/IInputMethod;->bindInput(Landroid/view/inputmethod/InputBinding;)V
+HSPLcom/android/internal/view/IInputMethod;->changeInputMethodSubtype(Landroid/view/inputmethod/InputMethodSubtype;)V
+HSPLcom/android/internal/view/IInputMethod;->createSession(Landroid/view/InputChannel;Lcom/android/internal/view/IInputSessionCallback;)V
+HSPLcom/android/internal/view/IInputMethod;->hideSoftInput(ILandroid/os/ResultReceiver;)V
+HSPLcom/android/internal/view/IInputMethod;->revokeSession(Lcom/android/internal/view/IInputMethodSession;)V
+HSPLcom/android/internal/view/IInputMethod;->setSessionEnabled(Lcom/android/internal/view/IInputMethodSession;Z)V
+HSPLcom/android/internal/view/IInputMethod;->showSoftInput(ILandroid/os/ResultReceiver;)V
+HSPLcom/android/internal/view/IInputMethod;->startInput(Landroid/os/IBinder;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;Z)V
+HSPLcom/android/internal/view/IInputMethod;->unbindInput()V
+HSPLcom/android/internal/view/IInputSessionCallback;->sessionCreated(Lcom/android/internal/view/IInputMethodSession;)V
+HSPLcom/android/internal/widget/ILockSettings;->addEscrowToken([BI)J
+HSPLcom/android/internal/widget/ILockSettings;->checkCredential(Ljava/lang/String;IILcom/android/internal/widget/ICheckCredentialProgressCallback;)Lcom/android/internal/widget/VerifyCredentialResponse;
+HSPLcom/android/internal/widget/ILockSettings;->checkVoldPassword(I)Z
+HSPLcom/android/internal/widget/ILockSettings;->getBoolean(Ljava/lang/String;ZI)Z
+HSPLcom/android/internal/widget/ILockSettings;->getLong(Ljava/lang/String;JI)J
+HSPLcom/android/internal/widget/ILockSettings;->getSeparateProfileChallengeEnabled(I)Z
+HSPLcom/android/internal/widget/ILockSettings;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+HSPLcom/android/internal/widget/ILockSettings;->getStrongAuthForUser(I)I
+HSPLcom/android/internal/widget/ILockSettings;->havePassword(I)Z
+HSPLcom/android/internal/widget/ILockSettings;->havePattern(I)Z
+HSPLcom/android/internal/widget/ILockSettings;->isEscrowTokenActive(JI)Z
+HSPLcom/android/internal/widget/ILockSettings;->registerStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+HSPLcom/android/internal/widget/ILockSettings;->removeEscrowToken(JI)Z
+HSPLcom/android/internal/widget/ILockSettings;->requireStrongAuth(II)V
+HSPLcom/android/internal/widget/ILockSettings;->resetKeyStore(I)V
+HSPLcom/android/internal/widget/ILockSettings;->setBoolean(Ljava/lang/String;ZI)V
+HSPLcom/android/internal/widget/ILockSettings;->setLockCredential(Ljava/lang/String;ILjava/lang/String;II)V
+HSPLcom/android/internal/widget/ILockSettings;->setLockCredentialWithToken(Ljava/lang/String;IJ[BII)Z
+HSPLcom/android/internal/widget/ILockSettings;->setLong(Ljava/lang/String;JI)V
+HSPLcom/android/internal/widget/ILockSettings;->setSeparateProfileChallengeEnabled(IZLjava/lang/String;)V
+HSPLcom/android/internal/widget/ILockSettings;->setString(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLcom/android/internal/widget/ILockSettings;->systemReady()V
+HSPLcom/android/internal/widget/ILockSettings;->unlockUserWithToken(J[BI)V
+HSPLcom/android/internal/widget/ILockSettings;->unregisterStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+HSPLcom/android/internal/widget/ILockSettings;->userPresent(I)V
+HSPLcom/android/internal/widget/ILockSettings;->verifyCredential(Ljava/lang/String;IJI)Lcom/android/internal/widget/VerifyCredentialResponse;
+HSPLcom/android/internal/widget/ILockSettings;->verifyTiedProfileChallenge(Ljava/lang/String;IJI)Lcom/android/internal/widget/VerifyCredentialResponse;
+HSPLcom/android/org/bouncycastle/asn1/ASN1BitString;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
+HSPLcom/android/org/bouncycastle/asn1/ASN1Null;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
+HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
+HSPLcom/android/org/bouncycastle/asn1/ASN1String;->getString()Ljava/lang/String;
+HSPLcom/android/server/WidgetBackupProvider;->getWidgetParticipants(I)Ljava/util/List;
+HSPLcom/android/server/WidgetBackupProvider;->getWidgetState(Ljava/lang/String;I)[B
+HSPLcom/android/server/WidgetBackupProvider;->restoreFinished(I)V
+HSPLcom/android/server/WidgetBackupProvider;->restoreStarting(I)V
+HSPLcom/android/server/WidgetBackupProvider;->restoreWidgetState(Ljava/lang/String;[BI)V
+HSPLcom/android/server/net/NetlinkTracker$Callback;->update()V
+HSPLjava/lang/Character;->toChars(I[CI)I
+HSPLjava/lang/IllegalStateException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
+HSPLjava/lang/RuntimeException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
+HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;
+HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;
+HSPLjava/math/MathContext;->getPrecision()I
+HSPLjava/math/MathContext;->getRoundingMode()Ljava/math/RoundingMode;
+HSPLjava/net/ProtocolFamily;->name()Ljava/lang/String;
+HSPLjava/security/interfaces/DSAParams;->getG()Ljava/math/BigInteger;
+HSPLjava/security/interfaces/DSAParams;->getP()Ljava/math/BigInteger;
+HSPLjava/security/interfaces/DSAParams;->getQ()Ljava/math/BigInteger;
+HSPLjava/time/Clock;->getZone()Ljava/time/ZoneId;
+HSPLjava/time/Clock;->instant()Ljava/time/Instant;
+HSPLjava/time/Clock;->withZone(Ljava/time/ZoneId;)Ljava/time/Clock;
+HSPLjava/time/chrono/AbstractChronology$$Lambda$0;-><init>()V
+HSPLjava/time/chrono/AbstractChronology$$Lambda$1;-><init>()V
+HSPLjava/time/chrono/AbstractChronology$$Lambda$2;-><init>()V
+HSPLjava/time/chrono/ChronoLocalDate;->equals(Ljava/lang/Object;)Z
+HSPLjava/time/chrono/ChronoLocalDate;->getChronology()Ljava/time/chrono/Chronology;
+HSPLjava/time/chrono/ChronoLocalDate;->hashCode()I
+HSPLjava/time/chrono/ChronoLocalDate;->lengthOfMonth()I
+HSPLjava/time/chrono/ChronoLocalDate;->toString()Ljava/lang/String;
+HSPLjava/time/chrono/ChronoLocalDate;->until(Ljava/time/chrono/ChronoLocalDate;)Ljava/time/chrono/ChronoPeriod;
+HSPLjava/time/chrono/ChronoLocalDate;->until(Ljava/time/temporal/Temporal;Ljava/time/temporal/TemporalUnit;)J
+HSPLjava/time/chrono/ChronoLocalDateTime;->atZone(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;
+HSPLjava/time/chrono/ChronoLocalDateTime;->equals(Ljava/lang/Object;)Z
+HSPLjava/time/chrono/ChronoLocalDateTime;->hashCode()I
+HSPLjava/time/chrono/ChronoLocalDateTime;->isSupported(Ljava/time/temporal/TemporalField;)Z
+HSPLjava/time/chrono/ChronoLocalDateTime;->plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDateTime;
+HSPLjava/time/chrono/ChronoLocalDateTime;->toLocalDate()Ljava/time/chrono/ChronoLocalDate;
+HSPLjava/time/chrono/ChronoLocalDateTime;->toLocalTime()Ljava/time/LocalTime;
+HSPLjava/time/chrono/ChronoLocalDateTime;->toString()Ljava/lang/String;
+HSPLjava/time/chrono/ChronoLocalDateTime;->with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ChronoLocalDateTime;
+HSPLjava/time/chrono/Chronology;->compareTo(Ljava/time/chrono/Chronology;)I
+HSPLjava/time/chrono/Chronology;->date(III)Ljava/time/chrono/ChronoLocalDate;
+HSPLjava/time/chrono/Chronology;->date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDate;
+HSPLjava/time/chrono/Chronology;->dateEpochDay(J)Ljava/time/chrono/ChronoLocalDate;
+HSPLjava/time/chrono/Chronology;->dateYearDay(II)Ljava/time/chrono/ChronoLocalDate;
+HSPLjava/time/chrono/Chronology;->equals(Ljava/lang/Object;)Z
+HSPLjava/time/chrono/Chronology;->eraOf(I)Ljava/time/chrono/Era;
+HSPLjava/time/chrono/Chronology;->eras()Ljava/util/List;
+HSPLjava/time/chrono/Chronology;->getCalendarType()Ljava/lang/String;
+HSPLjava/time/chrono/Chronology;->getId()Ljava/lang/String;
+HSPLjava/time/chrono/Chronology;->hashCode()I
+HSPLjava/time/chrono/Chronology;->isLeapYear(J)Z
+HSPLjava/time/chrono/Chronology;->prolepticYear(Ljava/time/chrono/Era;I)I
+HSPLjava/time/chrono/Chronology;->range(Ljava/time/temporal/ChronoField;)Ljava/time/temporal/ValueRange;
+HSPLjava/time/chrono/Chronology;->resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
+HSPLjava/time/chrono/Chronology;->toString()Ljava/lang/String;
+HSPLjava/time/temporal/TemporalAmount;->addTo(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
+HSPLjava/time/temporal/TemporalAmount;->get(Ljava/time/temporal/TemporalUnit;)J
+HSPLjava/time/temporal/TemporalAmount;->getUnits()Ljava/util/List;
+HSPLjava/time/temporal/TemporalAmount;->subtractFrom(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
+HSPLjava/time/temporal/TemporalField;->adjustInto(Ljava/time/temporal/Temporal;J)Ljava/time/temporal/Temporal;
+HSPLjava/time/temporal/TemporalField;->getBaseUnit()Ljava/time/temporal/TemporalUnit;
+HSPLjava/time/temporal/TemporalField;->getFrom(Ljava/time/temporal/TemporalAccessor;)J
+HSPLjava/time/temporal/TemporalField;->getRangeUnit()Ljava/time/temporal/TemporalUnit;
+HSPLjava/time/temporal/TemporalField;->isDateBased()Z
+HSPLjava/time/temporal/TemporalField;->isSupportedBy(Ljava/time/temporal/TemporalAccessor;)Z
+HSPLjava/time/temporal/TemporalField;->isTimeBased()Z
+HSPLjava/time/temporal/TemporalField;->range()Ljava/time/temporal/ValueRange;
+HSPLjava/time/temporal/TemporalField;->rangeRefinedBy(Ljava/time/temporal/TemporalAccessor;)Ljava/time/temporal/ValueRange;
+HSPLjava/time/temporal/TemporalField;->toString()Ljava/lang/String;
+HSPLjava/time/temporal/TemporalUnit;->addTo(Ljava/time/temporal/Temporal;J)Ljava/time/temporal/Temporal;
+HSPLjava/time/temporal/TemporalUnit;->between(Ljava/time/temporal/Temporal;Ljava/time/temporal/Temporal;)J
+HSPLjava/time/temporal/TemporalUnit;->getDuration()Ljava/time/Duration;
+HSPLjava/time/temporal/TemporalUnit;->isDateBased()Z
+HSPLjava/time/temporal/TemporalUnit;->isDurationEstimated()Z
+HSPLjava/time/temporal/TemporalUnit;->isTimeBased()Z
+HSPLjava/time/temporal/TemporalUnit;->toString()Ljava/lang/String;
+HSPLjava/time/zone/ZoneRulesProvider;->provideRules(Ljava/lang/String;Z)Ljava/time/zone/ZoneRules;
+HSPLjava/time/zone/ZoneRulesProvider;->provideVersions(Ljava/lang/String;)Ljava/util/NavigableMap;
+HSPLjava/time/zone/ZoneRulesProvider;->provideZoneIds()Ljava/util/Set;
+HSPLjava/util/Collection;->stream()Ljava/util/stream/Stream;
+HSPLjava/util/Comparator$$Lambda$0;-><init>(Ljava/util/Comparator;Ljava/util/Comparator;)V
+HSPLjava/util/Comparator$$Lambda$0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLjava/util/Comparator;->lambda$thenComparing$36697e65$1$Comparator(Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLjava/util/Comparator;->nullsLast(Ljava/util/Comparator;)Ljava/util/Comparator;
+HSPLjava/util/Comparator;->thenComparing(Ljava/util/Comparator;)Ljava/util/Comparator;
+HSPLjava/util/Comparators$NullComparator;-><init>(ZLjava/util/Comparator;)V
+HSPLjava/util/Map;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
+HSPLjava/util/Map;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/util/concurrent/CompletionStage;->acceptEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->applyToEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->exceptionally(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->handle(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->handleAsync(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->handleAsync(Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->runAfterBoth(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->runAfterEither(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenAccept(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenAcceptAsync(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenAcceptAsync(Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenAcceptBoth(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenApply(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenApplyAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenApplyAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenCombine(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenCompose(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenComposeAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenComposeAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenRun(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenRunAsync(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->thenRunAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->toCompletableFuture()Ljava/util/concurrent/CompletableFuture;
+HSPLjava/util/concurrent/CompletionStage;->whenComplete(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->whenCompleteAsync(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CompletionStage;->whenCompleteAsync(Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;
+HSPLjava/util/concurrent/CopyOnWriteArrayList;->sort(Ljava/util/Comparator;)V
+HSPLjava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;->newThread(Ljava/util/concurrent/ForkJoinPool;)Ljava/util/concurrent/ForkJoinWorkerThread;
+HSPLjava/util/prefs/PreferencesFactory;->systemRoot()Ljava/util/prefs/Preferences;
+HSPLjava/util/prefs/PreferencesFactory;->userRoot()Ljava/util/prefs/Preferences;
+HSPLjava/util/stream/Collector;->accumulator()Ljava/util/function/BiConsumer;
+HSPLjava/util/stream/Collector;->characteristics()Ljava/util/Set;
+HSPLjava/util/stream/Collector;->combiner()Ljava/util/function/BinaryOperator;
+HSPLjava/util/stream/Collector;->finisher()Ljava/util/function/Function;
+HSPLjava/util/stream/Collector;->supplier()Ljava/util/function/Supplier;
+HSPLjava/util/stream/Collectors$$Lambda$1;-><init>()V
+HSPLjava/util/stream/Collectors$$Lambda$4;-><init>()V
+HSPLjava/util/stream/Collectors$$Lambda$4;->get()Ljava/lang/Object;
+HSPLjava/util/stream/Collectors$$Lambda$58;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLjava/util/stream/Collectors$$Lambda$5;-><init>()V
+HSPLjava/util/stream/Collectors$$Lambda$5;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLjava/util/stream/Collectors$$Lambda$6;-><init>()V
+HSPLjava/util/stream/Collectors$$Lambda$88;-><init>(Ljava/util/function/Supplier;)V
+HSPLjava/util/stream/Collectors$$Lambda$88;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/util/stream/Collectors;->lambda$groupingBy$45$Collectors(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/Map;Ljava/lang/Object;)V
+HSPLjava/util/stream/Collectors;->lambda$null$44$Collectors(Ljava/util/function/Supplier;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/util/stream/IntPipeline$$Lambda$14;-><init>()V
+HSPLjava/util/stream/IntPipeline$$Lambda$1;-><init>()V
+HSPLjava/util/stream/IntPipeline$$Lambda$1;->apply(I)Ljava/lang/Object;
+HSPLjava/util/stream/IntPipeline$$Lambda$2;-><init>()V
+HSPLjava/util/stream/IntPipeline$$Lambda$2;->applyAsInt(Ljava/lang/Object;)I
+HSPLjava/util/stream/IntPipeline;->lambda$distinct$0$IntPipeline(Ljava/lang/Integer;)I
+HSPLjava/util/stream/Nodes$EmptyNode$OfRef;-><init>(Ljava/util/stream/Nodes$1;)V
+HSPLjava/util/stream/ReduceOps$AccumulatingSink;->combine(Ljava/util/stream/ReduceOps$AccumulatingSink;)V
+HSPLjava/util/stream/ReduceOps$ReduceOp;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
+HSPLjava/util/stream/ReferencePipeline$StatefulOp;->opEvaluateParallel(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
+HSPLjava/util/stream/Sink$OfInt;->accept(I)V
+HSPLjava/util/stream/SpinedBuffer$OfPrimitive;->arrayForEach(Ljava/lang/Object;IILjava/lang/Object;)V
+HSPLjava/util/stream/SpinedBuffer$OfPrimitive;->arrayLength(Ljava/lang/Object;)I
+HSPLjava/util/stream/SpinedBuffer$OfPrimitive;->forEach(Ljava/util/function/Consumer;)V
+HSPLjava/util/stream/SpinedBuffer$OfPrimitive;->iterator()Ljava/util/Iterator;
+HSPLjava/util/stream/SpinedBuffer$OfPrimitive;->newArray(I)Ljava/lang/Object;
+HSPLjava/util/stream/SpinedBuffer$OfPrimitive;->newArrayArray(I)[Ljava/lang/Object;
+HSPLjava/util/zip/ZipFile;->access$200(Ljava/util/zip/ZipFile;)V
+HSPLsun/security/jca/ProviderList$3;->get(I)Ljava/lang/Object;
+HSPLsun/security/jca/ProviderList$3;->get(I)Ljava/security/Provider;
+HSPLsun/security/jca/ProviderList$3;->size()I
+HSPLsun/security/jca/ProviderList;->access$100(Lsun/security/jca/ProviderList;)[Lsun/security/jca/ProviderConfig;
+PLandroid/app/ActivityThread$$Lambda$0;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLandroid/app/ActivityThread$ApplicationThread;->scheduleLowMemory()V
+PLandroid/app/ActivityThread;->access$2200(Landroid/app/ActivityThread;Landroid/app/ActivityThread$ReceiverData;)V
+PLandroid/app/ActivityThread;->access$2500(Landroid/app/ActivityThread;Landroid/app/ActivityThread$BindServiceData;)V
+PLandroid/app/ActivityThread;->access$2700(Landroid/app/ActivityThread;Landroid/os/IBinder;)V
+PLandroid/app/ActivityThread;->access$500(Landroid/app/ActivityThread;ILjava/lang/Object;)V
+PLandroid/app/ActivityThread;->handleLowMemory()V
+PLandroid/app/ActivityThread;->lambda$attach$0$ActivityThread(Landroid/content/res/Configuration;)V
+PLandroid/app/Application;->onLowMemory()V
+PLandroid/app/Notification;->getGroupAlertBehavior()I
+PLandroid/app/Notification;->suppressAlertingDueToGrouping()Z
+PLandroid/app/Service;->onLowMemory()V
+PLandroid/app/WindowConfiguration;->persistTaskBounds()Z
+PLandroid/content/ContentProvider;->onLowMemory()V
+PLandroid/content/pm/PackageParser$CachedComponentArgs;-><init>(Landroid/content/pm/PackageParser$1;)V
+PLandroid/content/pm/ResolveInfo;-><init>(Landroid/content/pm/ResolveInfo;)V
+PLandroid/graphics/Canvas;->freeCaches()V
+PLandroid/media/AudioManager;->isAudioFocusExclusive()Z
+PLandroid/media/IRingtonePlayer$Stub$Proxy;->playAsync(Landroid/net/Uri;Landroid/os/UserHandle;ZLandroid/media/AudioAttributes;)V
+PLandroid/net/LinkProperties;->ensureDirectlyConnectedRoutes()V
+PLandroid/net/Network$$Lambda$0;-><init>(Landroid/net/Network;)V
+PLandroid/net/Network$$Lambda$0;->lookup(Ljava/lang/String;)Ljava/util/List;
+PLandroid/net/Network;->lambda$maybeInitUrlConnectionFactory$0$Network(Ljava/lang/String;)Ljava/util/List;
+PLandroid/net/Network;->maybeInitUrlConnectionFactory()V
+PLandroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->incrementDisableReasonCounter(I)V
+PLandroid/os/BatteryStats$LevelStepTracker;->computeTimePerLevel()J
+PLandroid/os/ParcelFileDescriptor$2;->createFromParcel(Landroid/os/Parcel;)Landroid/os/ParcelFileDescriptor;
+PLandroid/os/ParcelFileDescriptor$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+PLandroid/os/RemoteCallback$1;->sendResult(Landroid/os/Bundle;)V
+PLandroid/os/RemoteCallback$3;-><init>()V
+PLandroid/service/notification/INotificationListener$Stub$Proxy;->onNotificationRankingUpdate(Landroid/service/notification/NotificationRankingUpdate;)V
+PLandroid/telecom/Logging/SessionManager$$Lambda$0;->run()V
+PLandroid/telecom/Logging/SessionManager;->lambda$new$0$SessionManager()V
+PLandroid/text/BoringLayout;->init(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/Layout$Alignment;Landroid/text/BoringLayout$Metrics;ZZ)V
+PLandroid/text/style/TextAppearanceSpan;->getSpanTypeIdInternal()I
+PLandroid/util/Slog;->wtf(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
+PLandroid/util/jar/StrictJarFile$EntryIterator;-><init>(JLjava/lang/String;)V
+PLandroid/util/jar/StrictJarFile;->access$000(JLjava/lang/String;)J
+PLandroid/util/jar/StrictJarFile;->getMetaEntries()Ljava/util/HashMap;
+PLandroid/util/jar/StrictJarFile;->iterator()Ljava/util/Iterator;
+PLandroid/util/jar/StrictJarManifest;->getMainAttributesEnd()I
+PLandroid/util/jar/StrictJarManifestReader;-><init>([BLjava/util/jar/Attributes;)V
+PLandroid/util/jar/StrictJarVerifier;-><init>(Ljava/lang/String;Landroid/util/jar/StrictJarManifest;Ljava/util/HashMap;Z)V
+PLandroid/util/jar/StrictJarVerifier;->isSignedJar()Z
+PLandroid/util/jar/StrictJarVerifier;->readCertificates()Z
+PLandroid/util/jar/StrictJarVerifier;->verify(Ljava/util/jar/Attributes;Ljava/lang/String;[BIIZZ)Z
+PLandroid/util/jar/StrictJarVerifier;->verifyBytes([B[B)[Ljava/security/cert/Certificate;
+PLandroid/util/jar/StrictJarVerifier;->verifyCertificate(Ljava/lang/String;)V
+PLandroid/view/ViewRootImpl;->access$200(Landroid/view/ViewRootImpl;)Landroid/util/MergedConfiguration;
+PLandroid/view/ViewRootImpl;->access$500(Landroid/view/ViewRootImpl;)V
+PLandroid/view/autofill/IAutoFillManagerClient$Stub$Proxy;->setState(ZZZ)V
+PLandroid/widget/RemoteViews$2;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/RemoteViews;
+PLandroid/widget/RemoteViews$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+PLandroid/widget/TextView$TextAppearanceAttributes;-><init>()V
+PLandroid/widget/TextView$TextAppearanceAttributes;-><init>(Landroid/widget/TextView$1;)V
+PLandroid/widget/TextView;->applyTextAppearance(Landroid/widget/TextView$TextAppearanceAttributes;)V
+PLandroid/widget/TextView;->readTextAppearance(Landroid/content/Context;Landroid/content/res/TypedArray;Landroid/widget/TextView$TextAppearanceAttributes;Z)V
+PLcom/android/internal/app/ResolverActivity$ActionTitle;-><init>(Ljava/lang/String;ILjava/lang/String;III)V
+PLcom/android/internal/app/ResolverActivity$ActionTitle;->forAction(Ljava/lang/String;)Lcom/android/internal/app/ResolverActivity$ActionTitle;
+PLcom/android/internal/app/ResolverActivity$ActionTitle;->values()[Lcom/android/internal/app/ResolverActivity$ActionTitle;
+PLcom/android/internal/app/ResolverActivity;->getLabelRes(Ljava/lang/String;)I
+PLcom/android/internal/app/procstats/DumpUtils;->dumpAdjTimesCheckin(Ljava/io/PrintWriter;Ljava/lang/String;[JIJJ)V
+PLcom/android/internal/app/procstats/ProcessState$PssAggr;->add(JJ)V
+PLcom/android/internal/app/procstats/ProcessState;->getPssAverage(I)J
+PLcom/android/internal/app/procstats/ProcessStats$TotalMemoryUseCollection;-><init>([I[I)V
+PLcom/android/internal/app/procstats/ProcessStats;->read(Ljava/io/InputStream;)V
+PLcom/android/internal/app/procstats/ProcessStats;->readCheckedInt(Landroid/os/Parcel;ILjava/lang/String;)Z
+PLcom/android/internal/app/procstats/ProcessStats;->readCompactedLongArray(Landroid/os/Parcel;I[JI)V
+PLcom/android/internal/app/procstats/ProcessStats;->readFully(Ljava/io/InputStream;[I)[B
+PLcom/android/internal/app/procstats/ServiceState;->dumpTimesCheckin(Ljava/io/PrintWriter;Ljava/lang/String;IILjava/lang/String;J)V
+PLcom/android/internal/app/procstats/SparseMappingTable$Table;->getKey(B)I
+PLcom/android/internal/app/procstats/SparseMappingTable;->readFromParcel(Landroid/os/Parcel;)V
+PLcom/android/internal/app/procstats/SysMemUsageTable;->getTotalMemUsage()[J
+PLcom/android/internal/os/WifiPowerEstimator;-><init>(Lcom/android/internal/os/PowerProfile;)V
+PLcom/android/internal/os/WifiPowerEstimator;->calculateRemaining(Lcom/android/internal/os/BatterySipper;Landroid/os/BatteryStats;JJI)V
+PLcom/android/internal/os/WifiPowerEstimator;->getWifiPowerPerPacket(Lcom/android/internal/os/PowerProfile;)D
+PLcom/android/internal/os/WifiPowerEstimator;->reset()V
+PLcom/android/okhttp/ConnectionSpecs;->builder(Z)Lcom/android/okhttp/ConnectionSpec$Builder;
+PLcom/android/okhttp/OkUrlFactories;->open(Lcom/android/okhttp/OkUrlFactory;Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/HttpURLConnection;
+PLcom/android/okhttp/OkUrlFactories;->setUrlFilter(Lcom/android/okhttp/OkUrlFactory;Lcom/android/okhttp/internal/URLFilter;)V
+PLcom/android/org/conscrypt/ActiveSession;->configurePeer(Ljava/lang/String;I[Ljava/security/cert/X509Certificate;)V
+PLcom/android/org/conscrypt/ActiveSession;->onPeerCertificateAvailable(Ljava/lang/String;I)V
+PLcom/android/org/conscrypt/ActiveSession;->onPeerCertificatesReceived(Ljava/lang/String;I[Ljava/security/cert/X509Certificate;)V
+PLcom/android/org/conscrypt/ConscryptFileDescriptorSocket;->verifyCertificateChain([[BLjava/lang/String;)V
+PLcom/android/org/conscrypt/ExtendedSessionAdapter$ExtendedWrapper;->getCipherSuite()Ljava/lang/String;
+PLcom/android/org/conscrypt/ExtendedSessionAdapter$ExtendedWrapper;->getLocalCertificates()[Ljava/security/cert/Certificate;
+PLcom/android/org/conscrypt/ExtendedSessionAdapter$ExtendedWrapper;->getPeerCertificates()[Ljava/security/cert/Certificate;
+PLcom/android/org/conscrypt/ExtendedSessionAdapter;->getExtendedSslSessionClass()Ljava/lang/Class;
+PLcom/android/org/conscrypt/SSLUtils;->decodeX509Certificate(Ljava/security/cert/CertificateFactory;[B)Ljava/security/cert/X509Certificate;
+PLcom/android/org/conscrypt/SSLUtils;->decodeX509CertificateChain([[B)[Ljava/security/cert/X509Certificate;
+PLcom/android/org/conscrypt/SSLUtils;->getCertificateFactory()Ljava/security/cert/CertificateFactory;
+PLcom/android/org/conscrypt/SslWrapper;->getLocalCertificates()[Ljava/security/cert/X509Certificate;
+PLjava/io/PrintWriter;->print(D)V
+PLjava/util/Base64$Encoder;->access$200()[C
+PLjava/util/Base64$Encoder;->access$300()[C
+PLjava/util/Base64$Encoder;->encode([B)[B
+PLjava/util/Base64$Encoder;->encodeToString([B)Ljava/lang/String;
+PLjava/util/Base64$Encoder;->outLength(I)I
+PLjava/util/Base64;->getEncoder()Ljava/util/Base64$Encoder;
+PLjava/util/stream/Nodes$IntArrayNode;->asPrimitiveArray()Ljava/lang/Object;
+PLjava/util/stream/Nodes$IntArrayNode;->asPrimitiveArray()[I
+PLjava/util/stream/Nodes$IntFixedNodeBuilder;->accept(I)V
+PLjava/util/stream/Nodes$IntFixedNodeBuilder;->begin(J)V
+PLjava/util/stream/Nodes$IntFixedNodeBuilder;->build()Ljava/util/stream/Node$OfInt;
+PLjava/util/stream/Nodes$IntFixedNodeBuilder;->build()Ljava/util/stream/Node;
+PLjava/util/stream/Nodes$IntFixedNodeBuilder;->end()V
+PLlibcore/io/Streams;->readFully(Ljava/io/InputStream;)[B
+PLlibcore/net/http/HttpHandler$CleartextURLFilter;-><init>()V
+PLlibcore/net/http/HttpHandler$CleartextURLFilter;-><init>(Llibcore/net/http/HttpHandler$1;)V
+PLlibcore/net/http/HttpHandler$CleartextURLFilter;->checkURLPermitted(Ljava/net/URL;)V
+PLlibcore/net/http/HttpHandler;-><init>()V
+PLlibcore/net/http/HttpHandler;->createHttpOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
+PLlibcore/net/http/HttpURLConnectionFactory$DnsAdapter;-><init>(Llibcore/net/http/Dns;)V
+PLlibcore/net/http/HttpURLConnectionFactory$DnsAdapter;->hashCode()I
+PLlibcore/net/http/HttpURLConnectionFactory$DnsAdapter;->lookup(Ljava/lang/String;)Ljava/util/List;
+PLlibcore/net/http/HttpURLConnectionFactory;-><init>()V
+PLlibcore/net/http/HttpURLConnectionFactory;->internalOpenConnection(Ljava/net/URL;Ljavax/net/SocketFactory;Ljava/net/Proxy;)Ljava/net/URLConnection;
+PLlibcore/net/http/HttpURLConnectionFactory;->openConnection(Ljava/net/URL;Ljavax/net/SocketFactory;Ljava/net/Proxy;)Ljava/net/URLConnection;
+PLlibcore/net/http/HttpURLConnectionFactory;->setDns(Llibcore/net/http/Dns;)V
+PLlibcore/net/http/HttpURLConnectionFactory;->setNewConnectionPool(IJLjava/util/concurrent/TimeUnit;)V
+PLlibcore/net/http/HttpsHandler;-><init>()V
+PLlibcore/net/http/HttpsHandler;->createHttpsOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
+PLsun/security/util/DerInputBuffer;->getGeneralizedTime(I)Ljava/util/Date;
+PLsun/security/util/DerInputStream;->getGeneralizedTime()Ljava/util/Date;
+Landroid/icu/impl/coll/CollationRoot;
+Landroid/icu/impl/IDNA2003;
+Landroid/icu/impl/number/Parse;
+Landroid/icu/util/TimeZone;
+Landroid/media/ImageReader;
+Landroid/media/MediaCodecList;
+Landroid/media/MediaPlayer;
+Landroid/media/SoundPool;
+Landroid/text/format/Formatter;
+Landroid/text/Html$HtmlParser;
+Lcom/android/org/conscrypt/TrustedCertificateStore;
+Lorg/ccil/cowan/tagsoup/HTMLScanner;
+Lsun/security/jca/Providers;
diff --git a/config/preloaded-classes b/config/preloaded-classes
index 5da7809..cd29653 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -1159,6 +1159,7 @@
android.icu.impl.ICUService$CacheEntry
android.icu.impl.ICUService$Factory
android.icu.impl.ICUService$Key
+android.icu.impl.IDNA2003
android.icu.impl.LocaleIDParser
android.icu.impl.LocaleIDs
android.icu.impl.Norm2AllModes
@@ -1254,6 +1255,7 @@
android.icu.impl.locale.LocaleObjectCache
android.icu.impl.locale.LocaleObjectCache$CacheEntry
android.icu.impl.locale.LocaleSyntaxException
+android.icu.impl.number.Parse
android.icu.lang.UCharacter
android.icu.lang.UCharacterEnums$ECharacterCategory
android.icu.lang.UCharacterEnums$ECharacterDirection
@@ -1468,6 +1470,7 @@
android.media.IRingtonePlayer$Stub
android.media.IRingtonePlayer$Stub$Proxy
android.media.Image
+android.media.ImageReader
android.media.JetPlayer
android.media.MediaCodec$BufferInfo
android.media.MediaCodec$BufferMap
@@ -1478,9 +1481,11 @@
android.media.MediaCodecInfo$CodecProfileLevel
android.media.MediaCodecInfo$Feature
android.media.MediaCodecInfo$VideoCapabilities
+android.media.MediaCodecList
android.media.MediaFormat
android.media.MediaMetadata$1
android.media.MediaMetadata$Builder
+android.media.MediaPlayer
android.media.MediaPlayer$1
android.media.MediaPlayer$2
android.media.MediaPlayer$EventHandler
@@ -1511,6 +1516,7 @@
android.media.PlayerBase$PlayerIdCard$1
android.media.RemoteDisplay
android.media.Ringtone$MyOnCompletionListener
+android.media.SoundPool
android.media.SubtitleController$Listener
android.media.ToneGenerator
android.media.Utils
@@ -2050,6 +2056,7 @@
android.text.GetChars
android.text.GraphicsOperations
android.text.Html
+android.text.Html$HtmlParser
android.text.HtmlToSpannedConverter$Href
android.text.Hyphenator
android.text.Hyphenator$HyphenationData
@@ -2099,6 +2106,7 @@
android.text.TextUtils$StringSplitter
android.text.TextUtils$TruncateAt
android.text.TextWatcher
+android.text.format.Formatter
android.text.format.Time$TimeCalculator
android.text.method.AllCapsTransformationMethod
android.text.method.ArrowKeyMovementMethod
@@ -4426,81 +4434,21 @@
org.apache.harmony.xml.ExpatReader
org.apache.harmony.xml.parsers.SAXParserFactoryImpl
org.apache.harmony.xml.parsers.SAXParserImpl
-org.apache.http.ConnectionReuseStrategy
-org.apache.http.HeaderElement
-org.apache.http.HttpEntity
-org.apache.http.HttpException
-org.apache.http.HttpHost
-org.apache.http.HttpMessage
-org.apache.http.HttpRequest
-org.apache.http.HttpRequestInterceptor
-org.apache.http.HttpResponse
-org.apache.http.HttpResponseFactory
-org.apache.http.NameValuePair
-org.apache.http.ProtocolException
-org.apache.http.ProtocolVersion
-org.apache.http.ReasonPhraseCatalog
-org.apache.http.StatusLine
-org.apache.http.client.HttpClient
-org.apache.http.client.ResponseHandler
-org.apache.http.client.methods.AbortableHttpRequest
-org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.methods.HttpUriRequest
-org.apache.http.client.params.HttpClientParams
-org.apache.http.conn.ClientConnectionManager
-org.apache.http.conn.ClientConnectionOperator
org.apache.http.conn.ConnectTimeoutException
-org.apache.http.conn.params.ConnManagerPNames
-org.apache.http.conn.params.ConnManagerParams$1
-org.apache.http.conn.params.ConnPerRoute
org.apache.http.conn.scheme.LayeredSocketFactory
-org.apache.http.conn.scheme.Scheme
-org.apache.http.conn.scheme.SchemeRegistry
org.apache.http.conn.scheme.SocketFactory
org.apache.http.conn.ssl.AllowAllHostnameVerifier
org.apache.http.conn.ssl.BrowserCompatHostnameVerifier
org.apache.http.conn.ssl.StrictHostnameVerifier
org.apache.http.conn.ssl.X509HostnameVerifier
-org.apache.http.entity.AbstractHttpEntity
-org.apache.http.entity.BasicHttpEntity
-org.apache.http.impl.DefaultConnectionReuseStrategy
-org.apache.http.impl.DefaultHttpResponseFactory
-org.apache.http.impl.client.AbstractHttpClient
-org.apache.http.impl.client.DefaultHttpClient
-org.apache.http.impl.conn.IdleConnectionHandler
-org.apache.http.impl.conn.tsccm.AbstractConnPool
-org.apache.http.impl.conn.tsccm.ConnPoolByRoute
-org.apache.http.impl.conn.tsccm.RefQueueHandler
-org.apache.http.impl.conn.tsccm.RefQueueWorker
-org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
-org.apache.http.impl.cookie.DateParseException
-org.apache.http.impl.cookie.DateUtils$DateFormatHolder$1
-org.apache.http.message.AbstractHttpMessage
-org.apache.http.message.BasicHeader
-org.apache.http.message.BasicHeaderElement
-org.apache.http.message.BasicHttpResponse
-org.apache.http.message.BasicNameValuePair
-org.apache.http.message.BasicStatusLine
-org.apache.http.message.HeaderGroup
-org.apache.http.message.HeaderValueParser
-org.apache.http.message.ParserCursor
-org.apache.http.params.AbstractHttpParams
-org.apache.http.params.BasicHttpParams
org.apache.http.params.CoreConnectionPNames
-org.apache.http.params.CoreProtocolPNames
org.apache.http.params.HttpConnectionParams
org.apache.http.params.HttpParams
-org.apache.http.params.HttpProtocolParams
-org.apache.http.protocol.BasicHttpProcessor
-org.apache.http.protocol.HTTP
-org.apache.http.protocol.HttpContext
-org.apache.http.protocol.HttpRequestInterceptorList
-org.apache.http.protocol.HttpResponseInterceptorList
-org.apache.http.util.CharArrayBuffer
org.ccil.cowan.tagsoup.AttributesImpl
org.ccil.cowan.tagsoup.AutoDetector
org.ccil.cowan.tagsoup.Element
org.ccil.cowan.tagsoup.ElementType
+org.ccil.cowan.tagsoup.HTMLScanner
org.ccil.cowan.tagsoup.HTMLSchema
org.ccil.cowan.tagsoup.Parser$1
org.ccil.cowan.tagsoup.ScanHandler
diff --git a/config/preloaded-classes-extra b/config/preloaded-classes-extra
index 1934cbc..959fff5 100644
--- a/config/preloaded-classes-extra
+++ b/config/preloaded-classes-extra
@@ -1 +1,13 @@
android.icu.impl.coll.CollationRoot
+android.icu.impl.IDNA2003
+android.icu.impl.number.Parse
+android.icu.util.TimeZone
+android.media.ImageReader
+android.media.MediaCodecList
+android.media.MediaPlayer
+android.media.SoundPool
+android.text.format.Formatter
+android.text.Html$HtmlParser
+com.android.org.conscrypt.TrustedCertificateStore
+org.ccil.cowan.tagsoup.HTMLScanner
+sun.security.jca.Providers
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index cec5db9..a558d68 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -26,7 +26,6 @@
import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.graphics.Region;
-import android.hardware.fingerprint.FingerprintManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -52,8 +51,6 @@
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
@@ -394,7 +391,7 @@
public static final int SHOW_MODE_AUTO = 0;
public static final int SHOW_MODE_HIDDEN = 1;
- private int mConnectionId;
+ private int mConnectionId = AccessibilityInteractionClient.NO_ID;
private AccessibilityServiceInfo mInfo;
@@ -1612,7 +1609,7 @@
private final Callbacks mCallback;
- private int mConnectionId;
+ private int mConnectionId = AccessibilityInteractionClient.NO_ID;
public IAccessibilityServiceClientWrapper(Context context, Looper looper,
Callbacks callback) {
@@ -1707,7 +1704,8 @@
if (event != null) {
// Send the event to AccessibilityCache via AccessibilityInteractionClient
AccessibilityInteractionClient.getInstance().onAccessibilityEvent(event);
- if (serviceWantsEvent) {
+ if (serviceWantsEvent
+ && (mConnectionId != AccessibilityInteractionClient.NO_ID)) {
// Send the event to AccessibilityService
mCallback.onAccessibilityEvent(event);
}
@@ -1721,7 +1719,9 @@
} return;
case DO_ON_INTERRUPT: {
- mCallback.onInterrupt();
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ mCallback.onInterrupt();
+ }
} return;
case DO_INIT: {
@@ -1746,8 +1746,10 @@
} return;
case DO_ON_GESTURE: {
- final int gestureId = message.arg1;
- mCallback.onGesture(gestureId);
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ final int gestureId = message.arg1;
+ mCallback.onGesture(gestureId);
+ }
} return;
case DO_CLEAR_ACCESSIBILITY_CACHE: {
@@ -1779,37 +1781,51 @@
} return;
case DO_ON_MAGNIFICATION_CHANGED: {
- final SomeArgs args = (SomeArgs) message.obj;
- final Region region = (Region) args.arg1;
- final float scale = (float) args.arg2;
- final float centerX = (float) args.arg3;
- final float centerY = (float) args.arg4;
- mCallback.onMagnificationChanged(region, scale, centerX, centerY);
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ final SomeArgs args = (SomeArgs) message.obj;
+ final Region region = (Region) args.arg1;
+ final float scale = (float) args.arg2;
+ final float centerX = (float) args.arg3;
+ final float centerY = (float) args.arg4;
+ mCallback.onMagnificationChanged(region, scale, centerX, centerY);
+ }
} return;
case DO_ON_SOFT_KEYBOARD_SHOW_MODE_CHANGED: {
- final int showMode = (int) message.arg1;
- mCallback.onSoftKeyboardShowModeChanged(showMode);
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ final int showMode = (int) message.arg1;
+ mCallback.onSoftKeyboardShowModeChanged(showMode);
+ }
} return;
case DO_GESTURE_COMPLETE: {
- final boolean successfully = message.arg2 == 1;
- mCallback.onPerformGestureResult(message.arg1, successfully);
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ final boolean successfully = message.arg2 == 1;
+ mCallback.onPerformGestureResult(message.arg1, successfully);
+ }
} return;
case DO_ON_FINGERPRINT_ACTIVE_CHANGED: {
- mCallback.onFingerprintCapturingGesturesChanged(message.arg1 == 1);
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ mCallback.onFingerprintCapturingGesturesChanged(message.arg1 == 1);
+ }
} return;
case DO_ON_FINGERPRINT_GESTURE: {
- mCallback.onFingerprintGesture(message.arg1);
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ mCallback.onFingerprintGesture(message.arg1);
+ }
} return;
case (DO_ACCESSIBILITY_BUTTON_CLICKED): {
- mCallback.onAccessibilityButtonClicked();
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ mCallback.onAccessibilityButtonClicked();
+ }
} return;
case (DO_ACCESSIBILITY_BUTTON_AVAILABILITY_CHANGED): {
- final boolean available = (message.arg1 != 0);
- mCallback.onAccessibilityButtonAvailabilityChanged(available);
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ final boolean available = (message.arg1 != 0);
+ mCallback.onAccessibilityButtonAvailabilityChanged(available);
+ }
} return;
default :
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index e76e190..a866503 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -20,10 +20,11 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_DOCKED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import android.Manifest;
@@ -45,7 +46,6 @@
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.UserInfo;
-import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -62,7 +62,6 @@
import android.os.Handler;
import android.os.IBinder;
import android.os.Parcel;
-import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteException;
@@ -665,11 +664,17 @@
SystemProperties.getBoolean("debug.force_low_ram", false);
/** @hide */
+ @TestApi
public static class StackId {
+
+ private StackId() {
+ }
+
/** Invalid stack ID. */
public static final int INVALID_STACK_ID = -1;
- /** First static stack ID. */
+ /** First static stack ID.
+ * @hide */
public static final int FIRST_STATIC_STACK_ID = 0;
/** Home activity stack ID. */
@@ -693,25 +698,30 @@
/** ID of stack that contains activities launched by the assistant. */
public static final int ASSISTANT_STACK_ID = RECENTS_STACK_ID + 1;
- /** Last static stack stack ID. */
+ /** Last static stack stack ID.
+ * @hide */
public static final int LAST_STATIC_STACK_ID = ASSISTANT_STACK_ID;
- /** Start of ID range used by stacks that are created dynamically. */
+ /** Start of ID range used by stacks that are created dynamically.
+ * @hide */
public static final int FIRST_DYNAMIC_STACK_ID = LAST_STATIC_STACK_ID + 1;
// TODO: Figure-out a way to remove this.
+ /** @hide */
public static boolean isStaticStack(int stackId) {
return stackId >= FIRST_STATIC_STACK_ID && stackId <= LAST_STATIC_STACK_ID;
}
// TODO: It seems this mostly means a stack on a secondary display now. Need to see if
// there are other meanings. If not why not just use information from the display?
+ /** @hide */
public static boolean isDynamicStack(int stackId) {
return stackId >= FIRST_DYNAMIC_STACK_ID;
}
/**
* Returns true if dynamic stacks are allowed to be visible behind the input stack.
+ * @hide
*/
// TODO: Figure-out a way to remove.
public static boolean isDynamicStacksVisibleBehindAllowed(int stackId) {
@@ -721,6 +731,7 @@
/**
* Returns true if we try to maintain focus in the current stack when the top activity
* finishes.
+ * @hide
*/
// TODO: Figure-out a way to remove. Probably isn't needed in the new world...
public static boolean keepFocusInStackIfPossible(int stackId) {
@@ -729,27 +740,8 @@
}
/**
- * Returns true if Stack size is affected by the docked stack changing size.
- */
- // TODO: Figure-out a way to remove.
- public static boolean isResizeableByDockedStack(int stackId) {
- return isStaticStack(stackId) && stackId != DOCKED_STACK_ID
- && stackId != PINNED_STACK_ID && stackId != ASSISTANT_STACK_ID;
- }
-
- /**
- * Returns true if the size of tasks in the input stack are affected by the docked stack
- * changing size.
- */
- // TODO: What is the difference between this method and the one above??
- public static boolean isTaskResizeableByDockedStack(int stackId) {
- return isStaticStack(stackId) && stackId != FREEFORM_WORKSPACE_STACK_ID
- && stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID
- && stackId != ASSISTANT_STACK_ID;
- }
-
- /**
* Returns true if the input stack is affected by drag resizing.
+ * @hide
*/
public static boolean isStackAffectedByDragResizing(int stackId) {
return isStaticStack(stackId) && stackId != PINNED_STACK_ID
@@ -760,6 +752,7 @@
* Returns true if the windows of tasks being moved to the target stack from the source
* stack should be replaced, meaning that window manager will keep the old window around
* until the new is ready.
+ * @hide
*/
public static boolean replaceWindowsOnTaskMove(int sourceStackId, int targetStackId) {
return sourceStackId == FREEFORM_WORKSPACE_STACK_ID
@@ -769,6 +762,7 @@
/**
* Return whether a stackId is a stack that be a backdrop to a translucent activity. These
* are generally fullscreen stacks.
+ * @hide
*/
public static boolean isBackdropToTranslucentActivity(int stackId) {
return stackId == FULLSCREEN_WORKSPACE_STACK_ID
@@ -778,6 +772,7 @@
/**
* Returns true if animation specs should be constructed for app transition that moves
* the task to the specified stack.
+ * @hide
*/
public static boolean useAnimationSpecForAppTransition(int stackId) {
// TODO: INVALID_STACK_ID is also animated because we don't persist stack id's across
@@ -792,6 +787,7 @@
/**
* Returns true if activities from stasks in the given {@param stackId} are allowed to
* enter picture-in-picture.
+ * @hide
*/
public static boolean isAllowedToEnterPictureInPicture(int stackId) {
return stackId != HOME_STACK_ID && stackId != ASSISTANT_STACK_ID &&
@@ -801,6 +797,7 @@
/**
* Returns true if the top task in the task is allowed to return home when finished and
* there are other tasks in the stack.
+ * @hide
*/
public static boolean allowTopTaskToReturnHome(int stackId) {
return stackId != PINNED_STACK_ID;
@@ -809,6 +806,7 @@
/**
* Returns true if the stack should be resized to match the bounds specified by
* {@link ActivityOptions#setLaunchBounds} when launching an activity into the stack.
+ * @hide
*/
public static boolean resizeStackWithLaunchBounds(int stackId) {
return stackId == PINNED_STACK_ID;
@@ -819,6 +817,7 @@
* fullscreen, i. e. they can become the top opaque fullscreen window, meaning that it
* controls system bars, lockscreen occluded/dismissing state, screen rotation animation,
* etc.
+ * @hide
*/
// TODO: What about the other side of docked stack if we move this to WindowConfiguration?
public static boolean normallyFullscreenWindows(int stackId) {
@@ -830,6 +829,7 @@
* Returns true if the input stack id should only be present on a device that supports
* multi-window mode.
* @see android.app.ActivityManager#supportsMultiWindow
+ * @hide
*/
// TODO: What about the other side of docked stack if we move this to WindowConfiguration?
public static boolean isMultiWindowStack(int stackId) {
@@ -839,12 +839,14 @@
/**
* Returns true if the input {@param stackId} is HOME_STACK_ID or RECENTS_STACK_ID
+ * @hide
*/
public static boolean isHomeOrRecentsStack(int stackId) {
return stackId == HOME_STACK_ID || stackId == RECENTS_STACK_ID;
}
- /** Returns true if the input stack and its content can affect the device orientation. */
+ /** Returns true if the input stack and its content can affect the device orientation.
+ * @hide */
public static boolean canSpecifyOrientation(int stackId) {
return stackId == HOME_STACK_ID
|| stackId == RECENTS_STACK_ID
@@ -853,14 +855,18 @@
|| isDynamicStack(stackId);
}
- /** Returns the windowing mode that should be used for this input stack id. */
+ /** Returns the windowing mode that should be used for this input stack id.
+ * @hide */
// TODO: To be removed once we are not using stack id for stuff...
- public static int getWindowingModeForStackId(int stackId) {
+ public static int getWindowingModeForStackId(int stackId, boolean inSplitScreenMode) {
final int windowingMode;
switch (stackId) {
case FULLSCREEN_WORKSPACE_STACK_ID:
case HOME_STACK_ID:
case RECENTS_STACK_ID:
+ windowingMode = inSplitScreenMode
+ ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY : WINDOWING_MODE_FULLSCREEN;
+ break;
case ASSISTANT_STACK_ID:
windowingMode = WINDOWING_MODE_FULLSCREEN;
break;
@@ -868,7 +874,7 @@
windowingMode = WINDOWING_MODE_PINNED;
break;
case DOCKED_STACK_ID:
- windowingMode = WINDOWING_MODE_DOCKED;
+ windowingMode = WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
break;
case FREEFORM_WORKSPACE_STACK_ID:
windowingMode = WINDOWING_MODE_FREEFORM;
@@ -879,7 +885,8 @@
return windowingMode;
}
- /** Returns the activity type that should be used for this input stack id. */
+ /** Returns the activity type that should be used for this input stack id.
+ * @hide */
// TODO: To be removed once we are not using stack id for stuff...
public static int getActivityTypeForStackId(int stackId) {
final int activityType;
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java
index 7d4d70d..9b2bfc5 100644
--- a/core/java/android/app/ActivityTransitionCoordinator.java
+++ b/core/java/android/app/ActivityTransitionCoordinator.java
@@ -1006,9 +1006,12 @@
final int numElements = mTransitioningViews == null ? 0 : mTransitioningViews.size();
for (int i = 0; i < numElements; i++) {
final View view = mTransitioningViews.get(i);
- view.setTransitionVisibility(visiblity);
if (invalidate) {
- view.invalidate();
+ // Allow the view to be invalidated by the visibility change
+ view.setVisibility(visiblity);
+ } else {
+ // Don't invalidate the view with the visibility change
+ view.setTransitionVisibility(visiblity);
}
}
}
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index ba5ea21..0d5cd02 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -1380,8 +1380,13 @@
@Override
public void onAnimationEnd(Animator anim) {
container.endViewTransition(view);
- if (fragment.getAnimatingAway() != null) {
- fragment.setAnimatingAway(null);
+ Animator animator = f.getAnimatingAway();
+ f.setAnimatingAway(null);
+ // If the animation finished immediately, the fragment's
+ // view will still be there. If so, we can just pretend
+ // there was no animation and skip the moveToState()
+ if (container.indexOfChild(view) == -1
+ && animator != null) {
moveToState(fragment, fragment.getStateAfterAnimating(),
0, 0, false);
}
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index b38be66..f6d9710 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -625,17 +625,31 @@
final List<String> zipPaths = new ArrayList<>(10);
final List<String> libPaths = new ArrayList<>(10);
- final boolean isBundledApp = mApplicationInfo.isSystemApp()
+ boolean isBundledApp = mApplicationInfo.isSystemApp()
&& !mApplicationInfo.isUpdatedSystemApp();
+ // Vendor apks are treated as bundled only when /vendor/lib is in the default search
+ // paths. If not, they are treated as unbundled; access to system libs is limited.
+ // Having /vendor/lib in the default search paths means that all system processes
+ // are allowed to use any vendor library, which in turn means that system is dependent
+ // on vendor partition. In the contrary, not having /vendor/lib in the default search
+ // paths mean that the two partitions are separated and thus we can treat vendor apks
+ // as unbundled.
+ final String defaultSearchPaths = System.getProperty("java.library.path");
+ final boolean treatVendorApkAsUnbundled = !defaultSearchPaths.contains("/vendor/lib");
+ if (mApplicationInfo.getCodePath() != null
+ && mApplicationInfo.getCodePath().startsWith("/vendor/")
+ && treatVendorApkAsUnbundled) {
+ isBundledApp = false;
+ }
+
makePaths(mActivityThread, isBundledApp, mApplicationInfo, zipPaths, libPaths);
String libraryPermittedPath = mDataDir;
if (isBundledApp) {
// This is necessary to grant bundled apps access to
// libraries located in subdirectories of /system/lib
- libraryPermittedPath += File.pathSeparator +
- System.getProperty("java.library.path");
+ libraryPermittedPath += File.pathSeparator + defaultSearchPaths;
}
final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 841b961..60f4ed0 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -8522,8 +8522,15 @@
final StandardTemplateParams fillTextsFrom(Builder b) {
Bundle extras = b.mN.extras;
- title = b.processLegacyText(extras.getCharSequence(EXTRA_TITLE), ambient);
- text = b.processLegacyText(extras.getCharSequence(EXTRA_TEXT), ambient);
+ this.title = b.processLegacyText(extras.getCharSequence(EXTRA_TITLE), ambient);
+
+ // Big text notifications should contain their content when viewed in ambient mode.
+ CharSequence text = extras.getCharSequence(EXTRA_BIG_TEXT);
+ if (!ambient || TextUtils.isEmpty(text)) {
+ text = extras.getCharSequence(EXTRA_TEXT);
+ }
+ this.text = b.processLegacyText(text, ambient);
+
return this;
}
}
diff --git a/core/java/android/app/RemoteInput.java b/core/java/android/app/RemoteInput.java
index 8ab19c0..02a0124 100644
--- a/core/java/android/app/RemoteInput.java
+++ b/core/java/android/app/RemoteInput.java
@@ -33,8 +33,8 @@
* an intent inside a {@link android.app.PendingIntent} that is sent.
* Always use {@link RemoteInput.Builder} to create instances of this class.
* <p class="note"> See
- * <a href="{@docRoot}wear/notifications/remote-input.html">Receiving Voice Input from
- * a Notification</a> for more information on how to use this class.
+ * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#direct">Replying
+ * to notifications</a> for more information on how to use this class.
*
* <p>The following example adds a {@code RemoteInput} to a {@link Notification.Action},
* sets the result key as {@code quick_reply}, and sets the label as {@code Quick reply}.
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java
index 187237d..5d87e1c 100644
--- a/core/java/android/app/WindowConfiguration.java
+++ b/core/java/android/app/WindowConfiguration.java
@@ -16,8 +16,11 @@
package android.app;
+import static android.app.ActivityThread.isSystem;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.TestApi;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Parcel;
@@ -31,6 +34,7 @@
* up-to-date and ran anytime changes are made to this class.
* @hide
*/
+@TestApi
public class WindowConfiguration implements Parcelable, Comparable<WindowConfiguration> {
/**
@@ -44,22 +48,35 @@
/** The current windowing mode of the configuration. */
private @WindowingMode int mWindowingMode;
- /** Windowing mode is currently not defined. */
+ /** Windowing mode is currently not defined.
+ * @hide */
public static final int WINDOWING_MODE_UNDEFINED = 0;
- /** Occupies the full area of the screen or the parent container. */
+ /** Occupies the full area of the screen or the parent container.
+ * @hide */
public static final int WINDOWING_MODE_FULLSCREEN = 1;
- /** Always on-top (always visible). of other siblings in its parent container. */
+ /** Always on-top (always visible). of other siblings in its parent container.
+ * @hide */
public static final int WINDOWING_MODE_PINNED = 2;
- /** Occupies a dedicated region of the screen or its parent container. */
- public static final int WINDOWING_MODE_DOCKED = 3;
- /** Can be freely resized within its parent container. */
- public static final int WINDOWING_MODE_FREEFORM = 4;
+ /** The primary container driving the screen to be in split-screen mode.
+ * @hide */
+ public static final int WINDOWING_MODE_SPLIT_SCREEN_PRIMARY = 3;
+ /**
+ * The containers adjacent to the {@link #WINDOWING_MODE_SPLIT_SCREEN_PRIMARY} container in
+ * split-screen mode.
+ * @hide
+ */
+ public static final int WINDOWING_MODE_SPLIT_SCREEN_SECONDARY = 4;
+ /** Can be freely resized within its parent container.
+ * @hide */
+ public static final int WINDOWING_MODE_FREEFORM = 5;
+ /** @hide */
@IntDef({
WINDOWING_MODE_UNDEFINED,
WINDOWING_MODE_FULLSCREEN,
WINDOWING_MODE_PINNED,
- WINDOWING_MODE_DOCKED,
+ WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
+ WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
WINDOWING_MODE_FREEFORM,
})
public @interface WindowingMode {}
@@ -67,17 +84,21 @@
/** The current activity type of the configuration. */
private @ActivityType int mActivityType;
- /** Activity type is currently not defined. */
+ /** Activity type is currently not defined.
+ * @hide */
public static final int ACTIVITY_TYPE_UNDEFINED = 0;
- /** Standard activity type. Nothing special about the activity... */
+ /** Standard activity type. Nothing special about the activity...
+ * @hide */
public static final int ACTIVITY_TYPE_STANDARD = 1;
/** Home/Launcher activity type. */
public static final int ACTIVITY_TYPE_HOME = 2;
/** Recents/Overview activity type. */
public static final int ACTIVITY_TYPE_RECENTS = 3;
- /** Assistant activity type. */
+ /** Assistant activity type.
+ * @hide */
public static final int ACTIVITY_TYPE_ASSISTANT = 4;
+ /** @hide */
@IntDef({
ACTIVITY_TYPE_UNDEFINED,
ACTIVITY_TYPE_STANDARD,
@@ -87,13 +108,17 @@
})
public @interface ActivityType {}
- /** Bit that indicates that the {@link #mAppBounds} changed. */
+ /** Bit that indicates that the {@link #mAppBounds} changed.
+ * @hide */
public static final int WINDOW_CONFIG_APP_BOUNDS = 1 << 0;
- /** Bit that indicates that the {@link #mWindowingMode} changed. */
+ /** Bit that indicates that the {@link #mWindowingMode} changed.
+ * @hide */
public static final int WINDOW_CONFIG_WINDOWING_MODE = 1 << 1;
- /** Bit that indicates that the {@link #mActivityType} changed. */
+ /** Bit that indicates that the {@link #mActivityType} changed.
+ * @hide */
public static final int WINDOW_CONFIG_ACTIVITY_TYPE = 1 << 2;
+ /** @hide */
@IntDef(flag = true,
value = {
WINDOW_CONFIG_APP_BOUNDS,
@@ -102,10 +127,12 @@
})
public @interface WindowConfig {}
+ /** @hide */
public WindowConfiguration() {
unset();
}
+ /** @hide */
public WindowConfiguration(WindowConfiguration configuration) {
setTo(configuration);
}
@@ -132,6 +159,7 @@
return 0;
}
+ /** @hide */
public static final Creator<WindowConfiguration> CREATOR = new Creator<WindowConfiguration>() {
@Override
public WindowConfiguration createFromParcel(Parcel in) {
@@ -148,6 +176,7 @@
* Set {@link #mAppBounds} to the input Rect.
* @param rect The rect value to set {@link #mAppBounds} to.
* @see #getAppBounds()
+ * @hide
*/
public void setAppBounds(Rect rect) {
if (rect == null) {
@@ -161,6 +190,7 @@
/**
* @see #setAppBounds(Rect)
* @see #getAppBounds()
+ * @hide
*/
public void setAppBounds(int left, int top, int right, int bottom) {
if (mAppBounds == null) {
@@ -172,25 +202,34 @@
/**
* @see #setAppBounds(Rect)
+ * @hide
*/
public Rect getAppBounds() {
return mAppBounds;
}
+ /** @hide */
public void setWindowingMode(@WindowingMode int windowingMode) {
mWindowingMode = windowingMode;
}
+ /** @hide */
@WindowingMode
public int getWindowingMode() {
return mWindowingMode;
}
+ /** @hide */
public void setActivityType(@ActivityType int activityType) {
if (mActivityType == activityType) {
return;
}
- if (mActivityType != ACTIVITY_TYPE_UNDEFINED
+
+ // Error check within system server that we are not changing activity type which can be
+ // dangerous. It is okay for things to change in the application process as it doesn't
+ // affect how other things is the system is managed.
+ if (isSystem()
+ && mActivityType != ACTIVITY_TYPE_UNDEFINED
&& activityType != ACTIVITY_TYPE_UNDEFINED) {
throw new IllegalStateException("Can't change activity type once set: " + this
+ " activityType=" + activityTypeToString(activityType));
@@ -198,22 +237,26 @@
mActivityType = activityType;
}
+ /** @hide */
@ActivityType
public int getActivityType() {
return mActivityType;
}
+ /** @hide */
public void setTo(WindowConfiguration other) {
setAppBounds(other.mAppBounds);
setWindowingMode(other.mWindowingMode);
setActivityType(other.mActivityType);
}
- /** Set this object to completely undefined. */
+ /** Set this object to completely undefined.
+ * @hide */
public void unset() {
setToDefaults();
}
+ /** @hide */
public void setToDefaults() {
setAppBounds(null);
setWindowingMode(WINDOWING_MODE_UNDEFINED);
@@ -226,6 +269,7 @@
* are ignored and not copied in to the current Configuration.
*
* @return a bit mask of the changed fields, as per {@link #diff}
+ * @hide
*/
public @WindowConfig int updateFrom(@NonNull WindowConfiguration delta) {
int changed = 0;
@@ -255,6 +299,7 @@
* values has changed, containing any combination of {@link WindowConfig} flags.
*
* @see Configuration#diff(Configuration)
+ * @hide
*/
public @WindowConfig long diff(WindowConfiguration other, boolean compareUndefined) {
long changes = 0;
@@ -305,6 +350,7 @@
return n;
}
+ /** @hide */
@Override
public boolean equals(Object that) {
if (that == null) return false;
@@ -315,6 +361,7 @@
return this.compareTo((WindowConfiguration) that) == 0;
}
+ /** @hide */
@Override
public int hashCode() {
int result = 0;
@@ -326,6 +373,7 @@
return result;
}
+ /** @hide */
@Override
public String toString() {
return "{mAppBounds=" + mAppBounds
@@ -336,6 +384,7 @@
/**
* Returns true if the activities associated with this window configuration display a shadow
* around their border.
+ * @hide
*/
public boolean hasWindowShadow() {
return tasksAreFloating();
@@ -344,6 +393,7 @@
/**
* Returns true if the activities associated with this window configuration display a decor
* view.
+ * @hide
*/
public boolean hasWindowDecorCaption() {
return mWindowingMode == WINDOWING_MODE_FREEFORM;
@@ -352,12 +402,14 @@
/**
* Returns true if the tasks associated with this window configuration can be resized
* independently of their parent container.
+ * @hide
*/
public boolean canResizeTask() {
return mWindowingMode == WINDOWING_MODE_FREEFORM;
}
- /** Returns true if the task bounds should persist across power cycles. */
+ /** Returns true if the task bounds should persist across power cycles.
+ * @hide */
public boolean persistTaskBounds() {
return mWindowingMode == WINDOWING_MODE_FREEFORM;
}
@@ -366,6 +418,7 @@
* Returns true if the tasks associated with this window configuration are floating.
* Floating tasks are laid out differently as they are allowed to extend past the display bounds
* without overscan insets.
+ * @hide
*/
public boolean tasksAreFloating() {
return mWindowingMode == WINDOWING_MODE_FREEFORM || mWindowingMode == WINDOWING_MODE_PINNED;
@@ -373,6 +426,7 @@
/**
* Returns true if the windows associated with this window configuration can receive input keys.
+ * @hide
*/
public boolean canReceiveKeys() {
return mWindowingMode != WINDOWING_MODE_PINNED;
@@ -381,6 +435,7 @@
/**
* Returns true if the container associated with this window configuration is always-on-top of
* its siblings.
+ * @hide
*/
public boolean isAlwaysOnTop() {
return mWindowingMode == WINDOWING_MODE_PINNED;
@@ -389,6 +444,7 @@
/**
* Returns true if any visible windows belonging to apps with this window configuration should
* be kept on screen when the app is killed due to something like the low memory killer.
+ * @hide
*/
public boolean keepVisibleDeadAppWindowOnScreen() {
return mWindowingMode != WINDOWING_MODE_PINNED;
@@ -397,6 +453,7 @@
/**
* Returns true if the backdrop on the client side should match the frame of the window.
* Returns false, if the backdrop should be fullscreen.
+ * @hide
*/
public boolean useWindowFrameForBackdrop() {
return mWindowingMode == WINDOWING_MODE_FREEFORM || mWindowingMode == WINDOWING_MODE_PINNED;
@@ -405,6 +462,7 @@
/**
* Returns true if this container may be scaled without resizing, and windows within may need
* to be configured as such.
+ * @hide
*/
public boolean windowsAreScaleable() {
return mWindowingMode == WINDOWING_MODE_PINNED;
@@ -412,9 +470,23 @@
/**
* Returns true if windows in this container should be given move animations by default.
+ * @hide
*/
public boolean hasMovementAnimations() {
- return mWindowingMode == WINDOWING_MODE_PINNED;
+ return mWindowingMode != WINDOWING_MODE_PINNED;
+ }
+
+ /**
+ * Returns true if this container can be put in either
+ * {@link #WINDOWING_MODE_SPLIT_SCREEN_PRIMARY} or
+ * {@link #WINDOWING_MODE_SPLIT_SCREEN_SECONDARY} windowing modes based on its current state.
+ * @hide
+ */
+ public boolean supportSplitScreenWindowingMode() {
+ if (mActivityType == ACTIVITY_TYPE_ASSISTANT) {
+ return false;
+ }
+ return mWindowingMode != WINDOWING_MODE_FREEFORM && mWindowingMode != WINDOWING_MODE_PINNED;
}
private static String windowingModeToString(@WindowingMode int windowingMode) {
@@ -422,12 +494,14 @@
case WINDOWING_MODE_UNDEFINED: return "undefined";
case WINDOWING_MODE_FULLSCREEN: return "fullscreen";
case WINDOWING_MODE_PINNED: return "pinned";
- case WINDOWING_MODE_DOCKED: return "docked";
+ case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY: return "split-screen-primary";
+ case WINDOWING_MODE_SPLIT_SCREEN_SECONDARY: return "split-screen-secondary";
case WINDOWING_MODE_FREEFORM: return "freeform";
}
return String.valueOf(windowingMode);
}
+ /** @hide */
public static String activityTypeToString(@ActivityType int applicationType) {
switch (applicationType) {
case ACTIVITY_TYPE_UNDEFINED: return "undefined";
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 833af1b..6bccad9 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2533,7 +2533,7 @@
* @return Returns true if the password meets the current requirements, else false.
* @throws SecurityException if the calling application does not own an active administrator
* that uses {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
- * @throws InvalidStateException if the user is not unlocked.
+ * @throws IllegalStateException if the user is not unlocked.
*/
public boolean isActivePasswordSufficient() {
if (mService != null) {
diff --git a/core/java/android/app/admin/PasswordMetrics.java b/core/java/android/app/admin/PasswordMetrics.java
index ea3f560..4658a47 100644
--- a/core/java/android/app/admin/PasswordMetrics.java
+++ b/core/java/android/app/admin/PasswordMetrics.java
@@ -18,13 +18,11 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.app.admin.DevicePolicyManager;
-import android.os.Parcelable;
import android.os.Parcel;
+import android.os.Parcelable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.io.IOException;
/**
* A class that represents the metrics of a password that are used to decide whether or not a
@@ -159,6 +157,22 @@
quality, length, letters, upperCase, lowerCase, numeric, symbols, nonLetter);
}
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof PasswordMetrics)) {
+ return false;
+ }
+ PasswordMetrics o = (PasswordMetrics) other;
+ return this.quality == o.quality
+ && this.length == o.length
+ && this.letters == o.letters
+ && this.upperCase == o.upperCase
+ && this.lowerCase == o.lowerCase
+ && this.numeric == o.numeric
+ && this.symbols == o.symbols
+ && this.nonLetter == o.nonLetter;
+ }
+
/*
* Returns the maximum length of a sequential characters. A sequence is defined as
* monotonically increasing characters with a constant interval or the same character repeated.
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 1f939f9..051dccb 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -172,9 +172,6 @@
/**
* Query for events in the given time range. Events are only kept by the system for a few
* days.
- * <p />
- * <b>NOTE:</b> The last few minutes of the event log will be truncated to prevent abuse
- * by applications.
*
* @param beginTime The inclusive beginning of the range of events to include in the results.
* @param endTime The exclusive end of the range of events to include in the results.
diff --git a/core/java/android/bluetooth/BluetoothA2dpSink.java b/core/java/android/bluetooth/BluetoothA2dpSink.java
index 611531c..faab000 100755
--- a/core/java/android/bluetooth/BluetoothA2dpSink.java
+++ b/core/java/android/bluetooth/BluetoothA2dpSink.java
@@ -125,7 +125,7 @@
private Context mContext;
private ServiceListener mServiceListener;
- private IBluetoothA2dpSink mService;
+ private volatile IBluetoothA2dpSink mService;
private BluetoothAdapter mAdapter;
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
@@ -240,15 +240,16 @@
*/
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.connect(device);
+ return service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -279,15 +280,16 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -297,15 +299,16 @@
@Override
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -315,15 +318,16 @@
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -333,16 +337,16 @@
@Override
public int getConnectionState(BluetoothDevice device) {
if (VDBG) log("getState(" + device + ")");
- if (mService != null && isEnabled()
- && isValidDevice(device)) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -359,16 +363,16 @@
*/
public BluetoothAudioConfig getAudioConfig(BluetoothDevice device) {
if (VDBG) log("getAudioConfig(" + device + ")");
- if (mService != null && isEnabled()
- && isValidDevice(device)) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getAudioConfig(device);
+ return service.getAudioConfig(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return null;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return null;
}
@@ -389,20 +393,20 @@
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
- if (mService != null && isEnabled()
- && isValidDevice(device)) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -421,16 +425,16 @@
*/
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- if (mService != null && isEnabled()
- && isValidDevice(device)) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.PRIORITY_OFF;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.PRIORITY_OFF;
}
@@ -442,16 +446,16 @@
* @param device BluetoothDevice device
*/
public boolean isA2dpPlaying(BluetoothDevice device) {
- if (mService != null && isEnabled()
- && isValidDevice(device)) {
+ final IBluetoothA2dpSink service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.isA2dpPlaying(device);
+ return service.isA2dpPlaying(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -485,7 +489,6 @@
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) Log.d(TAG, "Proxy object connected");
mService = IBluetoothA2dpSink.Stub.asInterface(Binder.allowBlocking(service));
-
if (mServiceListener != null) {
mServiceListener.onServiceConnected(BluetoothProfile.A2DP_SINK,
BluetoothA2dpSink.this);
@@ -502,15 +505,11 @@
};
private boolean isEnabled() {
- if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
- return false;
+ return mAdapter.getState() == BluetoothAdapter.STATE_ON;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
private static void log(String msg) {
diff --git a/core/java/android/bluetooth/BluetoothAvrcpController.java b/core/java/android/bluetooth/BluetoothAvrcpController.java
index 7528aa9..5f0e5d9 100644
--- a/core/java/android/bluetooth/BluetoothAvrcpController.java
+++ b/core/java/android/bluetooth/BluetoothAvrcpController.java
@@ -81,7 +81,7 @@
private Context mContext;
private ServiceListener mServiceListener;
- private IBluetoothAvrcpController mService;
+ private volatile IBluetoothAvrcpController mService;
private BluetoothAdapter mAdapter;
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
@@ -179,15 +179,16 @@
@Override
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothAvrcpController service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -197,15 +198,16 @@
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothAvrcpController service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -215,16 +217,16 @@
@Override
public int getConnectionState(BluetoothDevice device) {
if (VDBG) log("getState(" + device + ")");
- if (mService != null && isEnabled()
- && isValidDevice(device)) {
+ final IBluetoothAvrcpController service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -236,9 +238,10 @@
public BluetoothAvrcpPlayerSettings getPlayerSettings(BluetoothDevice device) {
if (DBG) Log.d(TAG, "getPlayerSettings");
BluetoothAvrcpPlayerSettings settings = null;
- if (mService != null && isEnabled()) {
+ final IBluetoothAvrcpController service = mService;
+ if (service != null && isEnabled()) {
try {
- settings = mService.getPlayerSettings(device);
+ settings = service.getPlayerSettings(device);
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in getMetadata() " + e);
return null;
@@ -253,15 +256,16 @@
*/
public boolean setPlayerApplicationSetting(BluetoothAvrcpPlayerSettings plAppSetting) {
if (DBG) Log.d(TAG, "setPlayerApplicationSetting");
- if (mService != null && isEnabled()) {
+ final IBluetoothAvrcpController service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.setPlayerApplicationSetting(plAppSetting);
+ return service.setPlayerApplicationSetting(plAppSetting);
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in setPlayerApplicationSetting() " + e);
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -272,23 +276,23 @@
public void sendGroupNavigationCmd(BluetoothDevice device, int keyCode, int keyState) {
Log.d(TAG, "sendGroupNavigationCmd dev = " + device + " key " + keyCode + " State = "
+ keyState);
- if (mService != null && isEnabled()) {
+ final IBluetoothAvrcpController service = mService;
+ if (service != null && isEnabled()) {
try {
- mService.sendGroupNavigationCmd(device, keyCode, keyState);
+ service.sendGroupNavigationCmd(device, keyCode, keyState);
return;
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in sendGroupNavigationCmd()", e);
return;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
}
private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) Log.d(TAG, "Proxy object connected");
mService = IBluetoothAvrcpController.Stub.asInterface(Binder.allowBlocking(service));
-
if (mServiceListener != null) {
mServiceListener.onServiceConnected(BluetoothProfile.AVRCP_CONTROLLER,
BluetoothAvrcpController.this);
@@ -305,15 +309,11 @@
};
private boolean isEnabled() {
- if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
- return false;
+ return mAdapter.getState() == BluetoothAdapter.STATE_ON;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
private static void log(String msg) {
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 3ab2c4a..d982bb7 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -712,7 +712,7 @@
* getService() called.
* TODO: Unify implementation of sService amongst BluetoothFoo API's
*/
- private static IBluetooth sService;
+ private static volatile IBluetooth sService;
private final String mAddress;
@@ -839,12 +839,13 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public String getName() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot get Remote Device name");
return null;
}
try {
- return sService.getRemoteName(this);
+ return service.getRemoteName(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -859,12 +860,13 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public int getType() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot get Remote Device type");
return DEVICE_TYPE_UNKNOWN;
}
try {
- return sService.getRemoteType(this);
+ return service.getRemoteType(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -879,12 +881,13 @@
* @hide
*/
public String getAlias() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot get Remote Device Alias");
return null;
}
try {
- return sService.getRemoteAlias(this);
+ return service.getRemoteAlias(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -902,12 +905,13 @@
* @hide
*/
public boolean setAlias(String alias) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot set Remote Device name");
return false;
}
try {
- return sService.setRemoteAlias(this, alias);
+ return service.setRemoteAlias(this, alias);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -942,12 +946,13 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public int getBatteryLevel() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "Bluetooth disabled. Cannot get remote device battery level");
return BATTERY_LEVEL_UNKNOWN;
}
try {
- return sService.getBatteryLevel(this);
+ return service.getBatteryLevel(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -966,7 +971,8 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean createBond() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot create bond to Remote Device");
return false;
}
@@ -974,7 +980,7 @@
Log.i(TAG, "createBond() for device " + getAddress()
+ " called by pid: " + Process.myPid()
+ " tid: " + Process.myTid());
- return sService.createBond(this, TRANSPORT_AUTO);
+ return service.createBond(this, TRANSPORT_AUTO);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -998,7 +1004,8 @@
* @hide
*/
public boolean createBond(int transport) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot create bond to Remote Device");
return false;
}
@@ -1009,7 +1016,7 @@
Log.i(TAG, "createBond() for device " + getAddress()
+ " called by pid: " + Process.myPid()
+ " tid: " + Process.myTid());
- return sService.createBond(this, transport);
+ return service.createBond(this, transport);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1035,8 +1042,13 @@
* @hide
*/
public boolean createBondOutOfBand(int transport, OobData oobData) {
+ final IBluetooth service = sService;
+ if (service == null) {
+ Log.w(TAG, "BT not enabled, createBondOutOfBand failed");
+ return false;
+ }
try {
- return sService.createBondOutOfBand(this, transport, oobData);
+ return service.createBondOutOfBand(this, transport, oobData);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1045,8 +1057,13 @@
/** @hide */
public boolean isBondingInitiatedLocally() {
+ final IBluetooth service = sService;
+ if (service == null) {
+ Log.w(TAG, "BT not enabled, isBondingInitiatedLocally failed");
+ return false;
+ }
try {
- return sService.isBondingInitiatedLocally(this);
+ return service.isBondingInitiatedLocally(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1082,7 +1099,8 @@
* @hide
*/
public boolean cancelBondProcess() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot cancel Remote Device bond");
return false;
}
@@ -1090,7 +1108,7 @@
Log.i(TAG, "cancelBondProcess() for device " + getAddress()
+ " called by pid: " + Process.myPid()
+ " tid: " + Process.myTid());
- return sService.cancelBondProcess(this);
+ return service.cancelBondProcess(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1108,7 +1126,8 @@
* @hide
*/
public boolean removeBond() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot remove Remote Device bond");
return false;
}
@@ -1116,7 +1135,7 @@
Log.i(TAG, "removeBond() for device " + getAddress()
+ " called by pid: " + Process.myPid()
+ " tid: " + Process.myTid());
- return sService.removeBond(this);
+ return service.removeBond(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1134,19 +1153,15 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public int getBondState() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot get bond state");
return BOND_NONE;
}
try {
- return sService.getBondState(this);
+ return service.getBondState(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
- } catch (NullPointerException npe) {
- // Handle case where bluetooth service proxy
- // is already null.
- Log.e(TAG, "NullPointerException for getBondState() of device ("
- + getAddress() + ")", npe);
}
return BOND_NONE;
}
@@ -1160,12 +1175,13 @@
*/
@SystemApi
public boolean isConnected() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
// BT is not enabled, we cannot be connected.
return false;
}
try {
- return sService.getConnectionState(this) != CONNECTION_STATE_DISCONNECTED;
+ return service.getConnectionState(this) != CONNECTION_STATE_DISCONNECTED;
} catch (RemoteException e) {
Log.e(TAG, "", e);
return false;
@@ -1182,12 +1198,13 @@
*/
@SystemApi
public boolean isEncrypted() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
// BT is not enabled, we cannot be connected.
return false;
}
try {
- return sService.getConnectionState(this) > CONNECTION_STATE_CONNECTED;
+ return service.getConnectionState(this) > CONNECTION_STATE_CONNECTED;
} catch (RemoteException e) {
Log.e(TAG, "", e);
return false;
@@ -1201,12 +1218,13 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public BluetoothClass getBluetoothClass() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot get Bluetooth Class");
return null;
}
try {
- int classInt = sService.getRemoteClass(this);
+ int classInt = service.getRemoteClass(this);
if (classInt == BluetoothClass.ERROR) return null;
return new BluetoothClass(classInt);
} catch (RemoteException e) {
@@ -1227,12 +1245,13 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public ParcelUuid[] getUuids() {
- if (sService == null || !isBluetoothEnabled()) {
+ final IBluetooth service = sService;
+ if (service == null || !isBluetoothEnabled()) {
Log.e(TAG, "BT not enabled. Cannot get remote device Uuids");
return null;
}
try {
- return sService.getRemoteUuids(this);
+ return service.getRemoteUuids(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1254,7 +1273,7 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean fetchUuidsWithSdp() {
- IBluetooth service = sService;
+ final IBluetooth service = sService;
if (service == null || !isBluetoothEnabled()) {
Log.e(TAG, "BT not enabled. Cannot fetchUuidsWithSdp");
return false;
@@ -1289,12 +1308,13 @@
*/
/** @hide */
public boolean sdpSearch(ParcelUuid uuid) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot query remote device sdp records");
return false;
}
try {
- return sService.sdpSearch(this, uuid);
+ return service.sdpSearch(this, uuid);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1308,12 +1328,13 @@
* @return true pin has been set false for error
*/
public boolean setPin(byte[] pin) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot set Remote Device pin");
return false;
}
try {
- return sService.setPin(this, true, pin.length, pin);
+ return service.setPin(this, true, pin.length, pin);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1337,12 +1358,13 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPairingConfirmation(boolean confirm) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot set pairing confirmation");
return false;
}
try {
- return sService.setPairingConfirmation(this, confirm);
+ return service.setPairingConfirmation(this, confirm);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1361,12 +1383,13 @@
/** @hide */
public boolean cancelPairingUserInput() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
Log.e(TAG, "BT not enabled. Cannot create pairing user input");
return false;
}
try {
- return sService.cancelBondProcess(this);
+ return service.cancelBondProcess(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1400,11 +1423,12 @@
* @hide
*/
public int getPhonebookAccessPermission() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
return ACCESS_UNKNOWN;
}
try {
- return sService.getPhonebookAccessPermission(this);
+ return service.getPhonebookAccessPermission(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1421,11 +1445,12 @@
* @hide
*/
public boolean setPhonebookAccessPermission(int value) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
return false;
}
try {
- return sService.setPhonebookAccessPermission(this, value);
+ return service.setPhonebookAccessPermission(this, value);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1440,11 +1465,12 @@
* @hide
*/
public int getMessageAccessPermission() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
return ACCESS_UNKNOWN;
}
try {
- return sService.getMessageAccessPermission(this);
+ return service.getMessageAccessPermission(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1461,11 +1487,12 @@
* @hide
*/
public boolean setMessageAccessPermission(int value) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
return false;
}
try {
- return sService.setMessageAccessPermission(this, value);
+ return service.setMessageAccessPermission(this, value);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1480,11 +1507,12 @@
* @hide
*/
public int getSimAccessPermission() {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
return ACCESS_UNKNOWN;
}
try {
- return sService.getSimAccessPermission(this);
+ return service.getSimAccessPermission(this);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
@@ -1501,11 +1529,12 @@
* @hide
*/
public boolean setSimAccessPermission(int value) {
- if (sService == null) {
+ final IBluetooth service = sService;
+ if (service == null) {
return false;
}
try {
- return sService.setSimAccessPermission(this, value);
+ return service.setSimAccessPermission(this, value);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 759d772..a2af342 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -42,7 +42,7 @@
private static final boolean VDBG = false;
private IBluetoothGatt mService;
- private BluetoothGattCallback mCallback;
+ private volatile BluetoothGattCallback mCallback;
private Handler mHandler;
private int mClientIf;
private BluetoothDevice mDevice;
@@ -164,8 +164,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onConnectionStateChange(BluetoothGatt.this,
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onConnectionStateChange(BluetoothGatt.this,
GATT_FAILURE,
BluetoothProfile.STATE_DISCONNECTED);
}
@@ -203,8 +204,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status);
}
}
});
@@ -227,8 +229,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status);
}
}
});
@@ -254,8 +257,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onConnectionStateChange(BluetoothGatt.this, status,
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onConnectionStateChange(BluetoothGatt.this, status,
profileState);
}
}
@@ -307,8 +311,7 @@
for (BluetoothGattService brokenRef : includedServices) {
BluetoothGattService includedService = getService(mDevice,
- brokenRef.getUuid(), brokenRef.getInstanceId(),
- brokenRef.getType());
+ brokenRef.getUuid(), brokenRef.getInstanceId());
if (includedService != null) {
fixedService.addIncludedService(includedService);
} else {
@@ -320,8 +323,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onServicesDiscovered(BluetoothGatt.this, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onServicesDiscovered(BluetoothGatt.this, status);
}
}
});
@@ -371,13 +375,13 @@
return;
}
- if (status == 0) characteristic.setValue(value);
-
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic,
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ if (status == 0) characteristic.setValue(value);
+ callback.onCharacteristicRead(BluetoothGatt.this, characteristic,
status);
}
}
@@ -429,8 +433,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic,
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onCharacteristicWrite(BluetoothGatt.this, characteristic,
status);
}
}
@@ -454,13 +459,13 @@
handle);
if (characteristic == null) return;
- characteristic.setValue(value);
-
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onCharacteristicChanged(BluetoothGatt.this,
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ characteristic.setValue(value);
+ callback.onCharacteristicChanged(BluetoothGatt.this,
characteristic);
}
}
@@ -489,7 +494,6 @@
BluetoothGattDescriptor descriptor = getDescriptorById(mDevice, handle);
if (descriptor == null) return;
- if (status == 0) descriptor.setValue(value);
if ((status == GATT_INSUFFICIENT_AUTHENTICATION
|| status == GATT_INSUFFICIENT_ENCRYPTION)
@@ -510,8 +514,10 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ if (status == 0) descriptor.setValue(value);
+ callback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
}
}
});
@@ -559,8 +565,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onDescriptorWrite(BluetoothGatt.this, descriptor, status);
}
}
});
@@ -587,8 +594,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onReliableWriteCompleted(BluetoothGatt.this, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onReliableWriteCompleted(BluetoothGatt.this, status);
}
}
});
@@ -610,8 +618,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onReadRemoteRssi(BluetoothGatt.this, rssi, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onReadRemoteRssi(BluetoothGatt.this, rssi, status);
}
}
});
@@ -634,8 +643,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onMtuChanged(BluetoothGatt.this, mtu, status);
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onMtuChanged(BluetoothGatt.this, mtu, status);
}
}
});
@@ -660,8 +670,9 @@
runOrQueueCallback(new Runnable() {
@Override
public void run() {
- if (mCallback != null) {
- mCallback.onConnectionUpdated(BluetoothGatt.this, interval, latency,
+ final BluetoothGattCallback callback = mCallback;
+ if (callback != null) {
+ callback.onConnectionUpdated(BluetoothGatt.this, interval, latency,
timeout, status);
}
}
@@ -702,10 +713,9 @@
* @hide
*/
/*package*/ BluetoothGattService getService(BluetoothDevice device, UUID uuid,
- int instanceId, int type) {
+ int instanceId) {
for (BluetoothGattService svc : mServices) {
if (svc.getDevice().equals(device)
- && svc.getType() == type
&& svc.getInstanceId() == instanceId
&& svc.getUuid().equals(uuid)) {
return svc;
@@ -901,7 +911,7 @@
/**
* Set the preferred connection PHY for this app. Please note that this is just a
- * recommendation, whether the PHY change will happen depends on other applications peferences,
+ * recommendation, whether the PHY change will happen depends on other applications preferences,
* local and remote controller capabilities. Controller can override these settings.
* <p>
* {@link BluetoothGattCallback#onPhyUpdate} will be triggered as a result of this call, even
diff --git a/core/java/android/bluetooth/BluetoothGattServerCallback.java b/core/java/android/bluetooth/BluetoothGattServerCallback.java
index 22eba35..2c8114b 100644
--- a/core/java/android/bluetooth/BluetoothGattServerCallback.java
+++ b/core/java/android/bluetooth/BluetoothGattServerCallback.java
@@ -184,7 +184,7 @@
/**
* Callback indicating the connection parameters were updated.
*
- * @param gatt The remote device involved
+ * @param device The remote device involved
* @param interval Connection interval used on this connection, 1.25ms unit. Valid range is from
* 6 (7.5ms) to 3200 (4000ms).
* @param latency Slave latency for the connection in number of connection events. Valid range
@@ -195,7 +195,7 @@
* successfully
* @hide
*/
- public void onConnectionUpdated(BluetoothDevice gatt, int interval, int latency, int timeout,
+ public void onConnectionUpdated(BluetoothDevice device, int interval, int latency, int timeout,
int status) {
}
diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java
index be1ce63..85550c7 100644
--- a/core/java/android/bluetooth/BluetoothHeadset.java
+++ b/core/java/android/bluetooth/BluetoothHeadset.java
@@ -306,7 +306,7 @@
private Context mContext;
private ServiceListener mServiceListener;
- private IBluetoothHeadset mService;
+ private volatile IBluetoothHeadset mService;
private BluetoothAdapter mAdapter;
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
@@ -418,15 +418,16 @@
*/
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.connect(device);
+ return service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -457,15 +458,16 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -475,15 +477,16 @@
@Override
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -493,15 +496,16 @@
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -511,15 +515,16 @@
@Override
public int getConnectionState(BluetoothDevice device) {
if (VDBG) log("getConnectionState(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -540,19 +545,20 @@
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -571,15 +577,16 @@
*/
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return PRIORITY_OFF;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return PRIORITY_OFF;
}
@@ -605,14 +612,15 @@
*/
public boolean startVoiceRecognition(BluetoothDevice device) {
if (DBG) log("startVoiceRecognition()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.startVoiceRecognition(device);
+ return service.startVoiceRecognition(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -627,14 +635,15 @@
*/
public boolean stopVoiceRecognition(BluetoothDevice device) {
if (DBG) log("stopVoiceRecognition()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.stopVoiceRecognition(device);
+ return service.stopVoiceRecognition(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -648,14 +657,15 @@
*/
public boolean isAudioConnected(BluetoothDevice device) {
if (VDBG) log("isAudioConnected()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.isAudioConnected(device);
+ return service.isAudioConnected(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -674,14 +684,15 @@
*/
public int getBatteryUsageHint(BluetoothDevice device) {
if (VDBG) log("getBatteryUsageHint()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getBatteryUsageHint(device);
+ return service.getBatteryUsageHint(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return -1;
}
@@ -704,9 +715,10 @@
*/
public boolean acceptIncomingConnect(BluetoothDevice device) {
if (DBG) log("acceptIncomingConnect");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.acceptIncomingConnect(device);
+ return service.acceptIncomingConnect(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -724,9 +736,10 @@
*/
public boolean rejectIncomingConnect(BluetoothDevice device) {
if (DBG) log("rejectIncomingConnect");
- if (mService != null) {
+ final IBluetoothHeadset service = mService;
+ if (service != null) {
try {
- return mService.rejectIncomingConnect(device);
+ return service.rejectIncomingConnect(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -745,9 +758,10 @@
*/
public int getAudioState(BluetoothDevice device) {
if (VDBG) log("getAudioState");
- if (mService != null && !isDisabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && !isDisabled()) {
try {
- return mService.getAudioState(device);
+ return service.getAudioState(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -770,9 +784,10 @@
*/
public void setAudioRouteAllowed(boolean allowed) {
if (VDBG) log("setAudioRouteAllowed");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- mService.setAudioRouteAllowed(allowed);
+ service.setAudioRouteAllowed(allowed);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -790,9 +805,10 @@
*/
public boolean getAudioRouteAllowed() {
if (VDBG) log("getAudioRouteAllowed");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getAudioRouteAllowed();
+ return service.getAudioRouteAllowed();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -812,9 +828,10 @@
*/
public void setForceScoAudio(boolean forced) {
if (VDBG) log("setForceScoAudio " + String.valueOf(forced));
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- mService.setForceScoAudio(forced);
+ service.setForceScoAudio(forced);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -834,14 +851,15 @@
*/
public boolean isAudioOn() {
if (VDBG) log("isAudioOn()");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.isAudioOn();
+ return service.isAudioOn();
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -855,9 +873,10 @@
* @hide
*/
public boolean connectAudio() {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.connectAudio();
+ return service.connectAudio();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -877,9 +896,10 @@
* @hide
*/
public boolean disconnectAudio() {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.disconnectAudio();
+ return service.disconnectAudio();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -903,9 +923,10 @@
*/
public boolean startScoUsingVirtualVoiceCall(BluetoothDevice device) {
if (DBG) log("startScoUsingVirtualVoiceCall()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.startScoUsingVirtualVoiceCall(device);
+ return service.startScoUsingVirtualVoiceCall(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -926,9 +947,10 @@
*/
public boolean stopScoUsingVirtualVoiceCall(BluetoothDevice device) {
if (DBG) log("stopScoUsingVirtualVoiceCall()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.stopScoUsingVirtualVoiceCall(device);
+ return service.stopScoUsingVirtualVoiceCall(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -949,9 +971,10 @@
*/
public void phoneStateChanged(int numActive, int numHeld, int callState, String number,
int type) {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- mService.phoneStateChanged(numActive, numHeld, callState, number, type);
+ service.phoneStateChanged(numActive, numHeld, callState, number, type);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -968,9 +991,10 @@
*/
public void clccResponse(int index, int direction, int status, int mode, boolean mpty,
String number, int type) {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- mService.clccResponse(index, direction, status, mode, mpty, number, type);
+ service.clccResponse(index, direction, status, mode, mpty, number, type);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -1006,14 +1030,15 @@
if (command == null) {
throw new IllegalArgumentException("command is null");
}
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.sendVendorSpecificResultCode(device, command, arg);
+ return service.sendVendorSpecificResultCode(device, command, arg);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return false;
@@ -1027,9 +1052,10 @@
* @hide
*/
public boolean enableWBS() {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.enableWBS();
+ return service.enableWBS();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -1048,9 +1074,10 @@
* @hide
*/
public boolean disableWBS() {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.disableWBS();
+ return service.disableWBS();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -1083,9 +1110,10 @@
* @hide
*/
public void bindResponse(int indId, boolean indStatus) {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled()) {
try {
- mService.bindResponse(indId, indStatus);
+ service.bindResponse(indId, indStatus);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -1115,20 +1143,15 @@
};
private boolean isEnabled() {
- if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
- return false;
+ return mAdapter.getState() == BluetoothAdapter.STATE_ON;
}
private boolean isDisabled() {
- if (mAdapter.getState() == BluetoothAdapter.STATE_OFF) return true;
- return false;
+ return mAdapter.getState() == BluetoothAdapter.STATE_OFF;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
private static void log(String msg) {
diff --git a/core/java/android/bluetooth/BluetoothHeadsetClient.java b/core/java/android/bluetooth/BluetoothHeadsetClient.java
index 7ed2d2e..031287f 100644
--- a/core/java/android/bluetooth/BluetoothHeadsetClient.java
+++ b/core/java/android/bluetooth/BluetoothHeadsetClient.java
@@ -76,8 +76,8 @@
* Intent sent whenever audio state changes.
*
* <p>It includes two mandatory extras:
- * {@link BluetoothProfile.EXTRA_STATE},
- * {@link BluetoothProfile.EXTRA_PREVIOUS_STATE},
+ * {@link BluetoothProfile#EXTRA_STATE},
+ * {@link BluetoothProfile#EXTRA_PREVIOUS_STATE},
* with possible values:
* {@link #STATE_AUDIO_CONNECTING},
* {@link #STATE_AUDIO_CONNECTED},
@@ -367,7 +367,7 @@
private Context mContext;
private ServiceListener mServiceListener;
- private IBluetoothHeadsetClient mService;
+ private volatile IBluetoothHeadsetClient mService;
private BluetoothAdapter mAdapter;
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
@@ -478,15 +478,16 @@
*/
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.connect(device);
+ return service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -499,15 +500,16 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -519,15 +521,16 @@
@Override
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -541,15 +544,16 @@
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -562,15 +566,16 @@
@Override
public int getConnectionState(BluetoothDevice device) {
if (VDBG) log("getConnectionState(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -581,19 +586,20 @@
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -602,15 +608,16 @@
*/
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return PRIORITY_OFF;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return PRIORITY_OFF;
}
@@ -627,14 +634,15 @@
*/
public boolean startVoiceRecognition(BluetoothDevice device) {
if (DBG) log("startVoiceRecognition()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.startVoiceRecognition(device);
+ return service.startVoiceRecognition(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -651,14 +659,15 @@
*/
public boolean stopVoiceRecognition(BluetoothDevice device) {
if (DBG) log("stopVoiceRecognition()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.stopVoiceRecognition(device);
+ return service.stopVoiceRecognition(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -670,14 +679,15 @@
*/
public List<BluetoothHeadsetClientCall> getCurrentCalls(BluetoothDevice device) {
if (DBG) log("getCurrentCalls()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getCurrentCalls(device);
+ return service.getCurrentCalls(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return null;
}
@@ -689,14 +699,15 @@
*/
public Bundle getCurrentAgEvents(BluetoothDevice device) {
if (DBG) log("getCurrentCalls()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getCurrentAgEvents(device);
+ return service.getCurrentAgEvents(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return null;
}
@@ -711,14 +722,15 @@
*/
public boolean acceptCall(BluetoothDevice device, int flag) {
if (DBG) log("acceptCall()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.acceptCall(device, flag);
+ return service.acceptCall(device, flag);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -731,14 +743,15 @@
*/
public boolean holdCall(BluetoothDevice device) {
if (DBG) log("holdCall()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.holdCall(device);
+ return service.holdCall(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -755,14 +768,15 @@
*/
public boolean rejectCall(BluetoothDevice device) {
if (DBG) log("rejectCall()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.rejectCall(device);
+ return service.rejectCall(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -784,14 +798,15 @@
*/
public boolean terminateCall(BluetoothDevice device, BluetoothHeadsetClientCall call) {
if (DBG) log("terminateCall()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.terminateCall(device, call);
+ return service.terminateCall(device, call);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -811,14 +826,15 @@
*/
public boolean enterPrivateMode(BluetoothDevice device, int index) {
if (DBG) log("enterPrivateMode()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.enterPrivateMode(device, index);
+ return service.enterPrivateMode(device, index);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -837,14 +853,15 @@
*/
public boolean explicitCallTransfer(BluetoothDevice device) {
if (DBG) log("explicitCallTransfer()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.explicitCallTransfer(device);
+ return service.explicitCallTransfer(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -859,14 +876,15 @@
*/
public BluetoothHeadsetClientCall dial(BluetoothDevice device, String number) {
if (DBG) log("dial()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.dial(device, number);
+ return service.dial(device, number);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return null;
}
@@ -882,14 +900,15 @@
*/
public boolean sendDTMF(BluetoothDevice device, byte code) {
if (DBG) log("sendDTMF()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.sendDTMF(device, code);
+ return service.sendDTMF(device, code);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -907,14 +926,15 @@
*/
public boolean getLastVoiceTagNumber(BluetoothDevice device) {
if (DBG) log("getLastVoiceTagNumber()");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getLastVoiceTagNumber(device);
+ return service.getLastVoiceTagNumber(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -925,9 +945,10 @@
*/
public int getAudioState(BluetoothDevice device) {
if (VDBG) log("getAudioState");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getAudioState(device);
+ return service.getAudioState(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -947,9 +968,10 @@
*/
public void setAudioRouteAllowed(BluetoothDevice device, boolean allowed) {
if (VDBG) log("setAudioRouteAllowed");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- mService.setAudioRouteAllowed(device, allowed);
+ service.setAudioRouteAllowed(device, allowed);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -968,9 +990,10 @@
*/
public boolean getAudioRouteAllowed(BluetoothDevice device) {
if (VDBG) log("getAudioRouteAllowed");
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getAudioRouteAllowed(device);
+ return service.getAudioRouteAllowed(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -991,9 +1014,10 @@
* otherwise; upon completion HFP sends {@link #ACTION_AUDIO_STATE_CHANGED} intent;
*/
public boolean connectAudio(BluetoothDevice device) {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.connectAudio(device);
+ return service.connectAudio(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -1014,9 +1038,10 @@
* otherwise; upon completion HFP sends {@link #ACTION_AUDIO_STATE_CHANGED} intent;
*/
public boolean disconnectAudio(BluetoothDevice device) {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.disconnectAudio(device);
+ return service.disconnectAudio(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -1034,9 +1059,10 @@
* @return bundle of AG features; null if no service or AG not connected
*/
public Bundle getCurrentAgFeatures(BluetoothDevice device) {
- if (mService != null && isEnabled()) {
+ final IBluetoothHeadsetClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getCurrentAgFeatures(device);
+ return service.getCurrentAgFeatures(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -1048,7 +1074,7 @@
}
- private ServiceConnection mConnection = new ServiceConnection() {
+ private final ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) Log.d(TAG, "Proxy object connected");
@@ -1071,15 +1097,11 @@
};
private boolean isEnabled() {
- if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
- return false;
+ return mAdapter.getState() == BluetoothAdapter.STATE_ON;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
private static void log(String msg) {
diff --git a/core/java/android/bluetooth/BluetoothHealth.java b/core/java/android/bluetooth/BluetoothHealth.java
index dc5f381..57a0197 100644
--- a/core/java/android/bluetooth/BluetoothHealth.java
+++ b/core/java/android/bluetooth/BluetoothHealth.java
@@ -176,9 +176,10 @@
BluetoothHealthAppConfiguration config =
new BluetoothHealthAppConfiguration(name, dataType, role, channelType);
- if (mService != null) {
+ final IBluetoothHealth service = mService;
+ if (service != null) {
try {
- result = mService.registerAppConfiguration(config, wrapper);
+ result = service.registerAppConfiguration(config, wrapper);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -200,9 +201,10 @@
*/
public boolean unregisterAppConfiguration(BluetoothHealthAppConfiguration config) {
boolean result = false;
- if (mService != null && isEnabled() && config != null) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled() && config != null) {
try {
- result = mService.unregisterAppConfiguration(config);
+ result = service.unregisterAppConfiguration(config);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -228,9 +230,10 @@
*/
public boolean connectChannelToSource(BluetoothDevice device,
BluetoothHealthAppConfiguration config) {
- if (mService != null && isEnabled() && isValidDevice(device) && config != null) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled() && isValidDevice(device) && config != null) {
try {
- return mService.connectChannelToSource(device, config);
+ return service.connectChannelToSource(device, config);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -256,9 +259,10 @@
*/
public boolean connectChannelToSink(BluetoothDevice device,
BluetoothHealthAppConfiguration config, int channelType) {
- if (mService != null && isEnabled() && isValidDevice(device) && config != null) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled() && isValidDevice(device) && config != null) {
try {
- return mService.connectChannelToSink(device, config, channelType);
+ return service.connectChannelToSink(device, config, channelType);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -284,9 +288,10 @@
*/
public boolean disconnectChannel(BluetoothDevice device,
BluetoothHealthAppConfiguration config, int channelId) {
- if (mService != null && isEnabled() && isValidDevice(device) && config != null) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled() && isValidDevice(device) && config != null) {
try {
- return mService.disconnectChannel(device, config, channelId);
+ return service.disconnectChannel(device, config, channelId);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -312,9 +317,10 @@
*/
public ParcelFileDescriptor getMainChannelFd(BluetoothDevice device,
BluetoothHealthAppConfiguration config) {
- if (mService != null && isEnabled() && isValidDevice(device) && config != null) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled() && isValidDevice(device) && config != null) {
try {
- return mService.getMainChannelFd(device, config);
+ return service.getMainChannelFd(device, config);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -341,9 +347,10 @@
*/
@Override
public int getConnectionState(BluetoothDevice device) {
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getHealthDeviceConnectionState(device);
+ return service.getHealthDeviceConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -370,15 +377,16 @@
*/
@Override
public List<BluetoothDevice> getConnectedDevices() {
- if (mService != null && isEnabled()) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedHealthDevices();
+ return service.getConnectedHealthDevices();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -401,15 +409,16 @@
*/
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
- if (mService != null && isEnabled()) {
+ final IBluetoothHealth service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getHealthDevicesMatchingConnectionStates(states);
+ return service.getHealthDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -455,7 +464,7 @@
private Context mContext;
private ServiceListener mServiceListener;
- private IBluetoothHealth mService;
+ private volatile IBluetoothHealth mService;
BluetoothAdapter mAdapter;
/**
@@ -540,11 +549,8 @@
return false;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
private boolean checkAppParam(String name, int role, int channelType,
diff --git a/core/java/android/bluetooth/BluetoothInputDevice.java b/core/java/android/bluetooth/BluetoothInputDevice.java
index a9a9010..3261576 100644
--- a/core/java/android/bluetooth/BluetoothInputDevice.java
+++ b/core/java/android/bluetooth/BluetoothInputDevice.java
@@ -222,7 +222,7 @@
private Context mContext;
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
- private IBluetoothInputDevice mService;
+ private volatile IBluetoothInputDevice mService;
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
new IBluetoothStateChangeCallback.Stub() {
@@ -331,15 +331,16 @@
*/
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.connect(device);
+ return service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -370,15 +371,16 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -388,15 +390,16 @@
@Override
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -406,15 +409,16 @@
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -424,15 +428,16 @@
@Override
public int getConnectionState(BluetoothDevice device) {
if (VDBG) log("getState(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -453,19 +458,20 @@
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -484,15 +490,16 @@
*/
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.PRIORITY_OFF;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.PRIORITY_OFF;
}
@@ -517,18 +524,13 @@
};
private boolean isEnabled() {
- if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
- return false;
+ return mAdapter.getState() == BluetoothAdapter.STATE_ON;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
-
/**
* Initiate virtual unplug for a HID input device.
*
@@ -540,16 +542,17 @@
*/
public boolean virtualUnplug(BluetoothDevice device) {
if (DBG) log("virtualUnplug(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.virtualUnplug(device);
+ return service.virtualUnplug(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -565,15 +568,16 @@
*/
public boolean getProtocolMode(BluetoothDevice device) {
if (VDBG) log("getProtocolMode(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getProtocolMode(device);
+ return service.getProtocolMode(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -588,15 +592,16 @@
*/
public boolean setProtocolMode(BluetoothDevice device, int protocolMode) {
if (DBG) log("setProtocolMode(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.setProtocolMode(device, protocolMode);
+ return service.setProtocolMode(device, protocolMode);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -615,19 +620,19 @@
public boolean getReport(BluetoothDevice device, byte reportType, byte reportId,
int bufferSize) {
if (VDBG) {
- log(
- "getReport(" + device + "), reportType=" + reportType + " reportId=" + reportId
- + "bufferSize=" + bufferSize);
+ log("getReport(" + device + "), reportType=" + reportType + " reportId=" + reportId
+ + "bufferSize=" + bufferSize);
}
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getReport(device, reportType, reportId, bufferSize);
+ return service.getReport(device, reportType, reportId, bufferSize);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -644,15 +649,16 @@
*/
public boolean setReport(BluetoothDevice device, byte reportType, String report) {
if (VDBG) log("setReport(" + device + "), reportType=" + reportType + " report=" + report);
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.setReport(device, reportType, report);
+ return service.setReport(device, reportType, report);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -668,15 +674,16 @@
*/
public boolean sendData(BluetoothDevice device, String report) {
if (DBG) log("sendData(" + device + "), report=" + report);
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.sendData(device, report);
+ return service.sendData(device, report);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -691,15 +698,16 @@
*/
public boolean getIdleTime(BluetoothDevice device) {
if (DBG) log("getIdletime(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getIdleTime(device);
+ return service.getIdleTime(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -715,15 +723,16 @@
*/
public boolean setIdleTime(BluetoothDevice device, byte idleTime) {
if (DBG) log("setIdletime(" + device + "), idleTime=" + idleTime);
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothInputDevice service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.setIdleTime(device, idleTime);
+ return service.setIdleTime(device, idleTime);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
diff --git a/core/java/android/bluetooth/BluetoothInputHost.java b/core/java/android/bluetooth/BluetoothInputHost.java
index 15303dc..37f0427 100644
--- a/core/java/android/bluetooth/BluetoothInputHost.java
+++ b/core/java/android/bluetooth/BluetoothInputHost.java
@@ -113,7 +113,7 @@
private ServiceListener mServiceListener;
- private IBluetoothInputHost mService;
+ private volatile IBluetoothInputHost mService;
private BluetoothAdapter mAdapter;
@@ -202,24 +202,18 @@
}
};
- private ServiceConnection mConnection = new ServiceConnection() {
-
+ private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
Log.d(TAG, "onServiceConnected()");
-
mService = IBluetoothInputHost.Stub.asInterface(service);
-
if (mServiceListener != null) {
mServiceListener.onServiceConnected(BluetoothProfile.INPUT_HOST,
BluetoothInputHost.this);
}
}
-
public void onServiceDisconnected(ComponentName className) {
Log.d(TAG, "onServiceDisconnected()");
-
mService = null;
-
if (mServiceListener != null) {
mServiceListener.onServiceDisconnected(BluetoothProfile.INPUT_HOST);
}
@@ -291,9 +285,10 @@
public List<BluetoothDevice> getConnectedDevices() {
Log.v(TAG, "getConnectedDevices()");
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -311,9 +306,10 @@
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
Log.v(TAG, "getDevicesMatchingConnectionStates(): states=" + Arrays.toString(states));
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -331,9 +327,10 @@
public int getConnectionState(BluetoothDevice device) {
Log.v(TAG, "getConnectionState(): device=" + device);
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -370,13 +367,14 @@
return false;
}
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
BluetoothHidDeviceAppConfiguration config =
new BluetoothHidDeviceAppConfiguration();
BluetoothHidDeviceCallbackWrapper cbw =
new BluetoothHidDeviceCallbackWrapper(callback);
- result = mService.registerApp(config, sdp, inQos, outQos, cbw);
+ result = service.registerApp(config, sdp, inQos, outQos, cbw);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -403,9 +401,10 @@
boolean result = false;
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- result = mService.unregisterApp(config);
+ result = service.unregisterApp(config);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -427,9 +426,10 @@
public boolean sendReport(BluetoothDevice device, int id, byte[] data) {
boolean result = false;
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- result = mService.sendReport(device, id, data);
+ result = service.sendReport(device, id, data);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -454,9 +454,10 @@
boolean result = false;
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- result = mService.replyReport(device, type, id, data);
+ result = service.replyReport(device, type, id, data);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -479,9 +480,10 @@
boolean result = false;
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- result = mService.reportError(device, error);
+ result = service.reportError(device, error);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -502,9 +504,10 @@
boolean result = false;
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- result = mService.unplug(device);
+ result = service.unplug(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -526,9 +529,10 @@
boolean result = false;
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- result = mService.connect(device);
+ result = service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -549,9 +553,10 @@
boolean result = false;
- if (mService != null) {
+ final IBluetoothInputHost service = mService;
+ if (service != null) {
try {
- result = mService.disconnect(device);
+ result = service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
diff --git a/core/java/android/bluetooth/BluetoothMap.java b/core/java/android/bluetooth/BluetoothMap.java
index 26a9106..5b55b23 100644
--- a/core/java/android/bluetooth/BluetoothMap.java
+++ b/core/java/android/bluetooth/BluetoothMap.java
@@ -43,7 +43,7 @@
public static final String ACTION_CONNECTION_STATE_CHANGED =
"android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED";
- private IBluetoothMap mService;
+ private volatile IBluetoothMap mService;
private final Context mContext;
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
@@ -161,9 +161,10 @@
*/
public int getState() {
if (VDBG) log("getState()");
- if (mService != null) {
+ final IBluetoothMap service = mService;
+ if (service != null) {
try {
- return mService.getState();
+ return service.getState();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -182,9 +183,10 @@
*/
public BluetoothDevice getClient() {
if (VDBG) log("getClient()");
- if (mService != null) {
+ final IBluetoothMap service = mService;
+ if (service != null) {
try {
- return mService.getClient();
+ return service.getClient();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -202,9 +204,10 @@
*/
public boolean isConnected(BluetoothDevice device) {
if (VDBG) log("isConnected(" + device + ")");
- if (mService != null) {
+ final IBluetoothMap service = mService;
+ if (service != null) {
try {
- return mService.isConnected(device);
+ return service.isConnected(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -232,15 +235,16 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -272,15 +276,16 @@
*/
public List<BluetoothDevice> getConnectedDevices() {
if (DBG) log("getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothMap service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -291,15 +296,16 @@
*/
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (DBG) log("getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothMap service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -310,15 +316,16 @@
*/
public int getConnectionState(BluetoothDevice device) {
if (DBG) log("getConnectionState(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -335,19 +342,20 @@
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -363,15 +371,16 @@
*/
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return PRIORITY_OFF;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return PRIORITY_OFF;
}
@@ -403,13 +412,8 @@
log("Bluetooth is Not enabled");
return false;
}
-
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
-
}
diff --git a/core/java/android/bluetooth/BluetoothMapClient.java b/core/java/android/bluetooth/BluetoothMapClient.java
index 3e0c365..af3b662 100644
--- a/core/java/android/bluetooth/BluetoothMapClient.java
+++ b/core/java/android/bluetooth/BluetoothMapClient.java
@@ -59,7 +59,7 @@
public static final String EXTRA_SENDER_CONTACT_NAME =
"android.bluetooth.mapmce.profile.extra.SENDER_CONTACT_NAME";
- private IBluetoothMapClient mService;
+ private volatile IBluetoothMapClient mService;
private final Context mContext;
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
@@ -176,9 +176,10 @@
*/
public boolean isConnected(BluetoothDevice device) {
if (VDBG) Log.d(TAG, "isConnected(" + device + ")");
- if (mService != null) {
+ final IBluetoothMapClient service = mService;
+ if (service != null) {
try {
- return mService.isConnected(device);
+ return service.isConnected(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -195,9 +196,10 @@
*/
public boolean connect(BluetoothDevice device) {
if (DBG) Log.d(TAG, "connect(" + device + ")" + "for MAPS MCE");
- if (mService != null) {
+ final IBluetoothMapClient service = mService;
+ if (service != null) {
try {
- return mService.connect(device);
+ return service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -216,14 +218,15 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) Log.d(TAG, "disconnect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -235,15 +238,16 @@
@Override
public List<BluetoothDevice> getConnectedDevices() {
if (DBG) Log.d(TAG, "getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<>();
}
@@ -255,15 +259,16 @@
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (DBG) Log.d(TAG, "getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<>();
}
@@ -275,15 +280,16 @@
@Override
public int getConnectionState(BluetoothDevice device) {
if (DBG) Log.d(TAG, "getConnectionState(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -298,19 +304,20 @@
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) Log.d(TAG, "setPriority(" + device + ", " + priority + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -326,15 +333,16 @@
*/
public int getPriority(BluetoothDevice device) {
if (VDBG) Log.d(TAG, "getPriority(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return PRIORITY_OFF;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return PRIORITY_OFF;
}
@@ -353,9 +361,10 @@
public boolean sendMessage(BluetoothDevice device, Uri[] contacts, String message,
PendingIntent sentIntent, PendingIntent deliveredIntent) {
if (DBG) Log.d(TAG, "sendMessage(" + device + ", " + contacts + ", " + message);
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.sendMessage(device, contacts, message, sentIntent, deliveredIntent);
+ return service.sendMessage(device, contacts, message, sentIntent, deliveredIntent);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
@@ -372,9 +381,10 @@
*/
public boolean getUnreadMessages(BluetoothDevice device) {
if (DBG) Log.d(TAG, "getUnreadMessages(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothMapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getUnreadMessages(device);
+ return service.getUnreadMessages(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
@@ -409,12 +419,8 @@
return false;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
-
}
diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java
index 63e83d2..866b063 100644
--- a/core/java/android/bluetooth/BluetoothPan.java
+++ b/core/java/android/bluetooth/BluetoothPan.java
@@ -123,7 +123,7 @@
private Context mContext;
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
- private IBluetoothPan mPanService;
+ private volatile IBluetoothPan mPanService;
/**
* Create a BluetoothPan proxy object for interacting with the local
@@ -238,15 +238,16 @@
*/
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
- if (mPanService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothPan service = mPanService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mPanService.connect(device);
+ return service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mPanService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -277,15 +278,16 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
- if (mPanService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothPan service = mPanService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mPanService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mPanService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -295,15 +297,16 @@
@Override
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
- if (mPanService != null && isEnabled()) {
+ final IBluetoothPan service = mPanService;
+ if (service != null && isEnabled()) {
try {
- return mPanService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mPanService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -313,15 +316,16 @@
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
- if (mPanService != null && isEnabled()) {
+ final IBluetoothPan service = mPanService;
+ if (service != null && isEnabled()) {
try {
- return mPanService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mPanService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -331,25 +335,25 @@
@Override
public int getConnectionState(BluetoothDevice device) {
if (VDBG) log("getState(" + device + ")");
- if (mPanService != null && isEnabled()
- && isValidDevice(device)) {
+ final IBluetoothPan service = mPanService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mPanService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mPanService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
public void setBluetoothTethering(boolean value) {
if (DBG) log("setBluetoothTethering(" + value + ")");
-
- if (mPanService != null && isEnabled()) {
+ final IBluetoothPan service = mPanService;
+ if (service != null && isEnabled()) {
try {
- mPanService.setBluetoothTethering(value);
+ service.setBluetoothTethering(value);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
}
@@ -358,10 +362,10 @@
public boolean isTetheringOn() {
if (VDBG) log("isTetheringOn()");
-
- if (mPanService != null && isEnabled()) {
+ final IBluetoothPan service = mPanService;
+ if (service != null && isEnabled()) {
try {
- return mPanService.isTetheringOn();
+ return service.isTetheringOn();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
}
@@ -373,7 +377,6 @@
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) Log.d(TAG, "BluetoothPAN Proxy object connected");
mPanService = IBluetoothPan.Stub.asInterface(Binder.allowBlocking(service));
-
if (mServiceListener != null) {
mServiceListener.onServiceConnected(BluetoothProfile.PAN,
BluetoothPan.this);
@@ -390,15 +393,11 @@
};
private boolean isEnabled() {
- if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
- return false;
+ return mAdapter.getState() == BluetoothAdapter.STATE_ON;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) return false;
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
private static void log(String msg) {
diff --git a/core/java/android/bluetooth/BluetoothPbap.java b/core/java/android/bluetooth/BluetoothPbap.java
index 78b7c7b..19f5198 100644
--- a/core/java/android/bluetooth/BluetoothPbap.java
+++ b/core/java/android/bluetooth/BluetoothPbap.java
@@ -68,7 +68,7 @@
public static final String PBAP_STATE_CHANGED_ACTION =
"android.bluetooth.pbap.intent.action.PBAP_STATE_CHANGED";
- private IBluetoothPbap mService;
+ private volatile IBluetoothPbap mService;
private final Context mContext;
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
@@ -214,9 +214,10 @@
*/
public int getState() {
if (VDBG) log("getState()");
- if (mService != null) {
+ final IBluetoothPbap service = mService;
+ if (service != null) {
try {
- return mService.getState();
+ return service.getState();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -235,9 +236,10 @@
*/
public BluetoothDevice getClient() {
if (VDBG) log("getClient()");
- if (mService != null) {
+ final IBluetoothPbap service = mService;
+ if (service != null) {
try {
- return mService.getClient();
+ return service.getClient();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -255,9 +257,10 @@
*/
public boolean isConnected(BluetoothDevice device) {
if (VDBG) log("isConnected(" + device + ")");
- if (mService != null) {
+ final IBluetoothPbap service = mService;
+ if (service != null) {
try {
- return mService.isConnected(device);
+ return service.isConnected(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -275,9 +278,10 @@
*/
public boolean disconnect() {
if (DBG) log("disconnect()");
- if (mService != null) {
+ final IBluetoothPbap service = mService;
+ if (service != null) {
try {
- mService.disconnect();
+ service.disconnect();
return true;
} catch (RemoteException e) {
Log.e(TAG, e.toString());
diff --git a/core/java/android/bluetooth/BluetoothPbapClient.java b/core/java/android/bluetooth/BluetoothPbapClient.java
index b9b372c..00a15f3 100644
--- a/core/java/android/bluetooth/BluetoothPbapClient.java
+++ b/core/java/android/bluetooth/BluetoothPbapClient.java
@@ -42,7 +42,7 @@
public static final String ACTION_CONNECTION_STATE_CHANGED =
"android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
- private IBluetoothPbapClient mService;
+ private volatile IBluetoothPbapClient mService;
private final Context mContext;
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
@@ -173,15 +173,16 @@
if (DBG) {
log("connect(" + device + ") for PBAP Client.");
}
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothPbapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.connect(device);
+ return service.connect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return false;
@@ -197,16 +198,17 @@
if (DBG) {
log("disconnect(" + device + ")" + new Exception());
}
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothPbapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- mService.disconnect(device);
+ service.disconnect(device);
return true;
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return false;
@@ -223,15 +225,16 @@
if (DBG) {
log("getConnectedDevices()");
}
- if (mService != null && isEnabled()) {
+ final IBluetoothPbapClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return new ArrayList<BluetoothDevice>();
@@ -247,15 +250,16 @@
if (DBG) {
log("getDevicesMatchingStates()");
}
- if (mService != null && isEnabled()) {
+ final IBluetoothPbapClient service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return new ArrayList<BluetoothDevice>();
@@ -271,15 +275,16 @@
if (DBG) {
log("getConnectionState(" + device + ")");
}
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothPbapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return BluetoothProfile.STATE_DISCONNECTED;
@@ -321,14 +326,8 @@
return false;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) {
- return false;
- }
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) {
- return true;
- }
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
/**
@@ -339,26 +338,27 @@
* {@link #PRIORITY_OFF},
*
* @param device Paired bluetooth device
- * @param priority
+ * @param priority Priority of this profile
* @return true if priority is set, false on error
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) {
log("setPriority(" + device + ", " + priority + ")");
}
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothPbapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return false;
@@ -378,15 +378,16 @@
if (VDBG) {
log("getPriority(" + device + ")");
}
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothPbapClient service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return PRIORITY_OFF;
}
}
- if (mService == null) {
+ if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
return PRIORITY_OFF;
diff --git a/core/java/android/bluetooth/BluetoothSap.java b/core/java/android/bluetooth/BluetoothSap.java
index bcdf493..4848162 100644
--- a/core/java/android/bluetooth/BluetoothSap.java
+++ b/core/java/android/bluetooth/BluetoothSap.java
@@ -68,7 +68,7 @@
public static final String ACTION_CONNECTION_STATE_CHANGED =
"android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED";
- private IBluetoothSap mService;
+ private volatile IBluetoothSap mService;
private final Context mContext;
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
@@ -202,9 +202,10 @@
*/
public int getState() {
if (VDBG) log("getState()");
- if (mService != null) {
+ final IBluetoothSap service = mService;
+ if (service != null) {
try {
- return mService.getState();
+ return service.getState();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -224,9 +225,10 @@
*/
public BluetoothDevice getClient() {
if (VDBG) log("getClient()");
- if (mService != null) {
+ final IBluetoothSap service = mService;
+ if (service != null) {
try {
- return mService.getClient();
+ return service.getClient();
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -246,9 +248,10 @@
*/
public boolean isConnected(BluetoothDevice device) {
if (VDBG) log("isConnected(" + device + ")");
- if (mService != null) {
+ final IBluetoothSap service = mService;
+ if (service != null) {
try {
- return mService.isConnected(device);
+ return service.isConnected(device);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -279,15 +282,16 @@
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothSap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.disconnect(device);
+ return service.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -299,15 +303,16 @@
*/
public List<BluetoothDevice> getConnectedDevices() {
if (DBG) log("getConnectedDevices()");
- if (mService != null && isEnabled()) {
+ final IBluetoothSap service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getConnectedDevices();
+ return service.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -319,15 +324,16 @@
*/
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (DBG) log("getDevicesMatchingStates()");
- if (mService != null && isEnabled()) {
+ final IBluetoothSap service = mService;
+ if (service != null && isEnabled()) {
try {
- return mService.getDevicesMatchingConnectionStates(states);
+ return service.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
@@ -339,15 +345,16 @@
*/
public int getConnectionState(BluetoothDevice device) {
if (DBG) log("getConnectionState(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothSap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getConnectionState(device);
+ return service.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -363,19 +370,20 @@
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothSap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF
&& priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
try {
- return mService.setPriority(device, priority);
+ return service.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return false;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
@@ -388,19 +396,20 @@
*/
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- if (mService != null && isEnabled() && isValidDevice(device)) {
+ final IBluetoothSap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
try {
- return mService.getPriority(device);
+ return service.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
return PRIORITY_OFF;
}
}
- if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
return PRIORITY_OFF;
}
- private ServiceConnection mConnection = new ServiceConnection() {
+ private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) log("Proxy object connected");
mService = IBluetoothSap.Stub.asInterface(Binder.allowBlocking(service));
@@ -432,15 +441,8 @@
return false;
}
- private boolean isValidDevice(BluetoothDevice device) {
- if (device == null) {
- return false;
- }
-
- if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) {
- return true;
- }
- return false;
+ private static boolean isValidDevice(BluetoothDevice device) {
+ return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
}
}
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index c8ed7ef..a189e27 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -99,7 +99,9 @@
/**
* Start Bluetooth LE scan with default parameters and no filters. The scan results will be
- * delivered through {@code callback}.
+ * delivered through {@code callback}. For unfiltered scans, scanning is stopped on screen
+ * off to save power. Scanning is resumed when screen is turned on again. To avoid this, use
+ * {@link #startScan(List, ScanSettings, ScanCallback)} with desired {@link ScanFilter}.
* <p>
* An app must hold
* {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or
@@ -116,6 +118,9 @@
/**
* Start Bluetooth LE scan. The scan results will be delivered through {@code callback}.
+ * For unfiltered scans, scanning is stopped on screen off to save power. Scanning is
+ * resumed when screen is turned on again. To avoid this, do filetered scanning by
+ * using proper {@link ScanFilter}.
* <p>
* An app must hold
* {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or
@@ -138,6 +143,11 @@
* the PendingIntent. Use this method of scanning if your process is not always running and it
* should be started when scan results are available.
* <p>
+ * An app must hold
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission
+ * in order to get results.
+ * <p>
* When the PendingIntent is delivered, the Intent passed to the receiver or activity
* will contain one or more of the extras {@link #EXTRA_CALLBACK_TYPE},
* {@link #EXTRA_ERROR_CODE} and {@link #EXTRA_LIST_SCAN_RESULT} to indicate the result of
diff --git a/core/java/android/bluetooth/le/ScanSettings.java b/core/java/android/bluetooth/le/ScanSettings.java
index 35ed424..8fdcba8 100644
--- a/core/java/android/bluetooth/le/ScanSettings.java
+++ b/core/java/android/bluetooth/le/ScanSettings.java
@@ -35,7 +35,7 @@
/**
* Perform Bluetooth LE scan in low power mode. This is the default scan mode as it consumes the
- * least power.
+ * least power. This mode is enforced if the scanning application is not in foreground.
*/
public static final int SCAN_MODE_LOW_POWER = 0;
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index ad7a5ab..d73f852 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -586,24 +586,32 @@
*/
public static final int PRIVATE_FLAG_VIRTUAL_PRELOAD = 1 << 16;
+ /**
+ * Value for {@linl #privateFlags}: whether this app is pre-installed on the
+ * OEM partition of the system image.
+ * @hide
+ */
+ public static final int PRIVATE_FLAG_OEM = 1 << 17;
+
/** @hide */
@IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = {
- PRIVATE_FLAG_HIDDEN,
+ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE,
+ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION,
+ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE,
+ PRIVATE_FLAG_BACKUP_IN_FOREGROUND,
PRIVATE_FLAG_CANT_SAVE_STATE,
- PRIVATE_FLAG_FORWARD_LOCK,
- PRIVATE_FLAG_PRIVILEGED,
- PRIVATE_FLAG_HAS_DOMAIN_URLS,
PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE,
PRIVATE_FLAG_DIRECT_BOOT_AWARE,
+ PRIVATE_FLAG_FORWARD_LOCK,
+ PRIVATE_FLAG_HAS_DOMAIN_URLS,
+ PRIVATE_FLAG_HIDDEN,
PRIVATE_FLAG_INSTANT,
- PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE,
- PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER,
- PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE,
- PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE,
- PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION,
- PRIVATE_FLAG_BACKUP_IN_FOREGROUND,
- PRIVATE_FLAG_STATIC_SHARED_LIBRARY,
PRIVATE_FLAG_ISOLATED_SPLIT_LOADING,
+ PRIVATE_FLAG_OEM,
+ PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE,
+ PRIVATE_FLAG_PRIVILEGED,
+ PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER,
+ PRIVATE_FLAG_STATIC_SHARED_LIBRARY,
PRIVATE_FLAG_VIRTUAL_PRELOAD,
})
@Retention(RetentionPolicy.SOURCE)
@@ -718,6 +726,10 @@
* Cycles do not exist because they are illegal and screened for during installation.
*
* May be null if no splits are installed, or if no dependencies exist between them.
+ *
+ * NOTE: Any change to the way split dependencies are stored must update the logic that
+ * creates the class loader context for dexopt (DexoptUtils#getClassLoaderContexts).
+ *
* @hide
*/
public SparseArray<int[]> splitDependencies;
@@ -1553,6 +1565,13 @@
/**
* @hide
*/
+ public boolean isOem() {
+ return (privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
+ }
+
+ /**
+ * @hide
+ */
@Override protected ApplicationInfo getApplicationInfo() {
return this;
}
diff --git a/core/java/android/content/pm/PackageBackwardCompatibility.java b/core/java/android/content/pm/PackageBackwardCompatibility.java
index 4de160b..cee2599 100644
--- a/core/java/android/content/pm/PackageBackwardCompatibility.java
+++ b/core/java/android/content/pm/PackageBackwardCompatibility.java
@@ -16,8 +16,8 @@
package android.content.pm;
-import android.annotation.Nullable;
import android.content.pm.PackageParser.Package;
+import android.os.Build;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -36,6 +36,8 @@
private static final String ANDROID_TEST_RUNNER = "android.test.runner";
+ private static final String APACHE_HTTP_LEGACY = "org.apache.http.legacy";
+
/**
* Modify the shared libraries in the supplied {@link Package} to maintain backwards
* compatibility.
@@ -47,13 +49,21 @@
ArrayList<String> usesLibraries = pkg.usesLibraries;
ArrayList<String> usesOptionalLibraries = pkg.usesOptionalLibraries;
- usesLibraries = orgApacheHttpLegacy(usesLibraries);
- usesOptionalLibraries = orgApacheHttpLegacy(usesOptionalLibraries);
+ // Packages targeted at <= O_MR1 expect the classes in the org.apache.http.legacy library
+ // to be accessible so this maintains backward compatibility by adding the
+ // org.apache.http.legacy library to those packages.
+ if (apkTargetsApiLevelLessThanOrEqualToOMR1(pkg)) {
+ boolean apacheHttpLegacyPresent = isLibraryPresent(
+ usesLibraries, usesOptionalLibraries, APACHE_HTTP_LEGACY);
+ if (!apacheHttpLegacyPresent) {
+ usesLibraries = ArrayUtils.add(usesLibraries, APACHE_HTTP_LEGACY);
+ }
+ }
// android.test.runner has a dependency on android.test.mock so if android.test.runner
// is present but android.test.mock is not then add android.test.mock.
- boolean androidTestMockPresent = ArrayUtils.contains(usesLibraries, ANDROID_TEST_MOCK)
- || ArrayUtils.contains(usesOptionalLibraries, ANDROID_TEST_MOCK);
+ boolean androidTestMockPresent = isLibraryPresent(
+ usesLibraries, usesOptionalLibraries, ANDROID_TEST_MOCK);
if (ArrayUtils.contains(usesLibraries, ANDROID_TEST_RUNNER) && !androidTestMockPresent) {
usesLibraries.add(ANDROID_TEST_MOCK);
}
@@ -66,13 +76,14 @@
pkg.usesOptionalLibraries = usesOptionalLibraries;
}
- private static ArrayList<String> orgApacheHttpLegacy(@Nullable ArrayList<String> libraries) {
- // "org.apache.http.legacy" is now a part of the boot classpath so it doesn't need
- // to be an explicit dependency.
- //
- // A future change will remove this library from the boot classpath, at which point
- // all apps that target SDK 21 and earlier will have it automatically added to their
- // dependency lists.
- return ArrayUtils.remove(libraries, "org.apache.http.legacy");
+ private static boolean apkTargetsApiLevelLessThanOrEqualToOMR1(Package pkg) {
+ int targetSdkVersion = pkg.applicationInfo.targetSdkVersion;
+ return targetSdkVersion <= Build.VERSION_CODES.O_MR1;
+ }
+
+ private static boolean isLibraryPresent(ArrayList<String> usesLibraries,
+ ArrayList<String> usesOptionalLibraries, String apacheHttpLegacy) {
+ return ArrayUtils.contains(usesLibraries, apacheHttpLegacy)
+ || ArrayUtils.contains(usesOptionalLibraries, apacheHttpLegacy);
}
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 8b54b0d..6c7c8a07 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -96,8 +96,8 @@
import com.android.internal.util.XmlUtils;
import libcore.io.IoUtils;
-
import libcore.util.EmptyArray;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -815,21 +815,22 @@
}
}
- public final static int PARSE_IS_SYSTEM = 1<<0;
- public final static int PARSE_CHATTY = 1<<1;
- public final static int PARSE_MUST_BE_APK = 1<<2;
- public final static int PARSE_IGNORE_PROCESSES = 1<<3;
- public final static int PARSE_FORWARD_LOCK = 1<<4;
- public final static int PARSE_EXTERNAL_STORAGE = 1<<5;
- public final static int PARSE_IS_SYSTEM_DIR = 1<<6;
- public final static int PARSE_IS_PRIVILEGED = 1<<7;
- 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;
+ public static final int PARSE_IS_SYSTEM = 1 << 0;
+ public static final int PARSE_CHATTY = 1 << 1;
+ public static final int PARSE_MUST_BE_APK = 1 << 2;
+ public static final int PARSE_IGNORE_PROCESSES = 1 << 3;
+ public static final int PARSE_FORWARD_LOCK = 1 << 4;
+ public static final int PARSE_EXTERNAL_STORAGE = 1 << 5;
+ public static final int PARSE_IS_SYSTEM_DIR = 1 << 6;
+ public static final int PARSE_IS_PRIVILEGED = 1 << 7;
+ public static final int PARSE_COLLECT_CERTIFICATES = 1 << 8;
+ public static final int PARSE_TRUSTED_OVERLAY = 1 << 9;
+ public static final 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;
+ public static final int PARSE_IS_EPHEMERAL = 1 << 11;
+ public static final int PARSE_FORCE_SDK = 1 << 12;
+ public static final int PARSE_IS_OEM = 1 << 13;
private static final Comparator<String> sSplitNameComparator = new SplitNameComparator();
diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java
index b84c1b9..17b4f87 100644
--- a/core/java/android/content/pm/PermissionInfo.java
+++ b/core/java/android/content/pm/PermissionInfo.java
@@ -17,7 +17,6 @@
package android.content.pm;
import android.annotation.SystemApi;
-import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -135,6 +134,16 @@
public static final int PROTECTION_FLAG_RUNTIME_ONLY = 0x2000;
/**
+ * Additional flag for {@link #protectionLevel}, corresponding
+ * to the <code>oem</code> value of
+ * {@link android.R.attr#protectionLevel}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final int PROTECTION_FLAG_OEM = 0x4000;
+
+ /**
* Mask for {@link #protectionLevel}: the basic protection type.
*/
public static final int PROTECTION_MASK_BASE = 0xf;
@@ -222,7 +231,7 @@
/** @hide */
public static String protectionToString(int level) {
String protLevel = "????";
- switch (level&PROTECTION_MASK_BASE) {
+ switch (level & PROTECTION_MASK_BASE) {
case PermissionInfo.PROTECTION_DANGEROUS:
protLevel = "dangerous";
break;
@@ -236,36 +245,39 @@
protLevel = "signatureOrSystem";
break;
}
- if ((level&PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) {
protLevel += "|privileged";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) {
protLevel += "|development";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_APPOP) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_APPOP) != 0) {
protLevel += "|appop";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_PRE23) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_PRE23) != 0) {
protLevel += "|pre23";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0) {
protLevel += "|installer";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0) {
protLevel += "|verifier";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0) {
protLevel += "|preinstalled";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_SETUP) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_SETUP) != 0) {
protLevel += "|setup";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_INSTANT) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_INSTANT) != 0) {
protLevel += "|instant";
}
- if ((level&PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0) {
+ if ((level & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0) {
protLevel += "|runtime";
}
+ if ((level & PermissionInfo.PROTECTION_FLAG_OEM) != 0) {
+ protLevel += "|oem";
+ }
return protLevel;
}
diff --git a/core/java/android/database/sqlite/SQLiteGlobal.java b/core/java/android/database/sqlite/SQLiteGlobal.java
index 571656a..94d5555 100644
--- a/core/java/android/database/sqlite/SQLiteGlobal.java
+++ b/core/java/android/database/sqlite/SQLiteGlobal.java
@@ -16,6 +16,7 @@
package android.database.sqlite;
+import android.annotation.TestApi;
import android.content.res.Resources;
import android.os.StatFs;
import android.os.SystemProperties;
@@ -34,6 +35,7 @@
*
* @hide
*/
+@TestApi
public final class SQLiteGlobal {
private static final String TAG = "SQLiteGlobal";
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 0d5c5e3..bfeb14d 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -1769,7 +1769,7 @@
}
@Override
- public void onRepeatingRequestError(long lastFrameNumber) {
+ public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {
if (DEBUG) {
Log.d(TAG, "Repeating request error received. Last frame number is " +
lastFrameNumber);
@@ -1782,7 +1782,10 @@
}
checkEarlyTriggerSequenceComplete(mRepeatingRequestId, lastFrameNumber);
- mRepeatingRequestId = REQUEST_ID_NONE;
+ // Check if there is already a new repeating request
+ if (mRepeatingRequestId == repeatingRequestId) {
+ mRepeatingRequestId = REQUEST_ID_NONE;
+ }
}
}
diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceState.java b/core/java/android/hardware/camera2/legacy/CameraDeviceState.java
index 135d92b..89ecd5f 100644
--- a/core/java/android/hardware/camera2/legacy/CameraDeviceState.java
+++ b/core/java/android/hardware/camera2/legacy/CameraDeviceState.java
@@ -77,7 +77,7 @@
void onCaptureStarted(RequestHolder holder, long timestamp);
void onCaptureResult(CameraMetadataNative result, RequestHolder holder);
void onRequestQueueEmpty();
- void onRepeatingRequestError(long lastFrameNumber);
+ void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId);
}
/**
@@ -208,12 +208,14 @@
* <p>Repeating request has been stopped due to an error such as abandoned output surfaces.</p>
*
* @param lastFrameNumber Frame number of the last repeating request before it is stopped.
+ * @param repeatingRequestId The ID of the repeating request being stopped
*/
- public synchronized void setRepeatingRequestError(final long lastFrameNumber) {
+ public synchronized void setRepeatingRequestError(final long lastFrameNumber,
+ final int repeatingRequestId) {
mCurrentHandler.post(new Runnable() {
@Override
public void run() {
- mCurrentListener.onRepeatingRequestError(lastFrameNumber);
+ mCurrentListener.onRepeatingRequestError(lastFrameNumber, repeatingRequestId);
}
});
}
diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
index d8df9a0..49d4096 100644
--- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
+++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
@@ -264,10 +264,10 @@
}
@Override
- public void onRepeatingRequestError(long lastFrameNumber) {
+ public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {
+ Object[] objArray = new Object[] { lastFrameNumber, repeatingRequestId };
Message msg = getHandler().obtainMessage(REPEATING_REQUEST_ERROR,
- /*arg1*/ (int) (lastFrameNumber & 0xFFFFFFFFL),
- /*arg2*/ (int) ( (lastFrameNumber >> 32) & 0xFFFFFFFFL));
+ /*obj*/ objArray);
getHandler().sendMessage(msg);
}
@@ -329,9 +329,10 @@
break;
}
case REPEATING_REQUEST_ERROR: {
- long lastFrameNumber = msg.arg2 & 0xFFFFFFFFL;
- lastFrameNumber = (lastFrameNumber << 32) | (msg.arg1 & 0xFFFFFFFFL);
- mCallbacks.onRepeatingRequestError(lastFrameNumber);
+ Object[] objArray = (Object[]) msg.obj;
+ long lastFrameNumber = (Long) objArray[0];
+ int repeatingRequestId = (Integer) objArray[1];
+ mCallbacks.onRepeatingRequestError(lastFrameNumber, repeatingRequestId);
break;
}
case REQUEST_QUEUE_EMPTY: {
diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
index 621ea84..cb59fd1 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
@@ -263,7 +263,8 @@
}
@Override
- public void onRepeatingRequestError(final long lastFrameNumber) {
+ public void onRepeatingRequestError(final long lastFrameNumber,
+ final int repeatingRequestId) {
mResultHandler.post(new Runnable() {
@Override
public void run() {
@@ -271,7 +272,8 @@
Log.d(TAG, "doing onRepeatingRequestError callback.");
}
try {
- mDeviceCallbacks.onRepeatingRequestError(lastFrameNumber);
+ mDeviceCallbacks.onRepeatingRequestError(lastFrameNumber,
+ repeatingRequestId);
} catch (RemoteException e) {
throw new IllegalStateException(
"Received remote exception during onRepeatingRequestError " +
diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
index 565a43e..aaf07e6 100644
--- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
@@ -939,7 +939,8 @@
Log.d(TAG, "Stopped repeating request. Last frame number is " +
lastFrameNumber);
}
- mDeviceState.setRepeatingRequestError(lastFrameNumber);
+ mDeviceState.setRepeatingRequestError(lastFrameNumber,
+ burstHolder.getRequestId());
}
if (DEBUG) {
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java
index 1bb0fbb..2c9fb23 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -18,14 +18,13 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.net.ProxyInfo;
-import android.os.Parcelable;
import android.os.Parcel;
+import android.os.Parcelable;
import android.text.TextUtils;
-import java.net.InetAddress;
import java.net.Inet4Address;
import java.net.Inet6Address;
+import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
@@ -71,8 +70,23 @@
* @hide
*/
public static class CompareResult<T> {
- public List<T> removed = new ArrayList<T>();
- public List<T> added = new ArrayList<T>();
+ public final List<T> removed = new ArrayList<T>();
+ public final List<T> added = new ArrayList<T>();
+
+ public CompareResult() {}
+
+ public CompareResult(Collection<T> oldItems, Collection<T> newItems) {
+ if (oldItems != null) {
+ removed.addAll(oldItems);
+ }
+ if (newItems != null) {
+ for (T newItem : newItems) {
+ if (!removed.remove(newItem)) {
+ added.add(newItem);
+ }
+ }
+ }
+ }
@Override
public String toString() {
@@ -504,11 +518,22 @@
}
/**
+ * Make sure this LinkProperties instance contains routes that cover the local subnet
+ * of its link addresses. Add any route that is missing.
+ * @hide
+ */
+ public void ensureDirectlyConnectedRoutes() {
+ for (LinkAddress addr: mLinkAddresses) {
+ addRoute(new RouteInfo(addr, null, mIfaceName));
+ }
+ }
+
+ /**
* Returns all the routes on this link and all the links stacked above it.
* @hide
*/
public List<RouteInfo> getAllRoutes() {
- List<RouteInfo> routes = new ArrayList();
+ List<RouteInfo> routes = new ArrayList<>();
routes.addAll(mRoutes);
for (LinkProperties stacked: mStackedLinks.values()) {
routes.addAll(stacked.getAllRoutes());
@@ -990,17 +1015,8 @@
* are in target but not in mLinkAddresses are placed in the
* addedAddresses.
*/
- CompareResult<LinkAddress> result = new CompareResult<LinkAddress>();
- result.removed = new ArrayList<LinkAddress>(mLinkAddresses);
- result.added.clear();
- if (target != null) {
- for (LinkAddress newAddress : target.getLinkAddresses()) {
- if (! result.removed.remove(newAddress)) {
- result.added.add(newAddress);
- }
- }
- }
- return result;
+ return new CompareResult<>(mLinkAddresses,
+ target != null ? target.getLinkAddresses() : null);
}
/**
@@ -1019,18 +1035,7 @@
* are in target but not in mDnses are placed in the
* addedAddresses.
*/
- CompareResult<InetAddress> result = new CompareResult<InetAddress>();
-
- result.removed = new ArrayList<InetAddress>(mDnses);
- result.added.clear();
- if (target != null) {
- for (InetAddress newAddress : target.getDnsServers()) {
- if (! result.removed.remove(newAddress)) {
- result.added.add(newAddress);
- }
- }
- }
- return result;
+ return new CompareResult<>(mDnses, target != null ? target.getDnsServers() : null);
}
/**
@@ -1048,18 +1053,7 @@
* leaving the routes that are different. And route address which
* are in target but not in mRoutes are placed in added.
*/
- CompareResult<RouteInfo> result = new CompareResult<RouteInfo>();
-
- result.removed = getAllRoutes();
- result.added.clear();
- if (target != null) {
- for (RouteInfo r : target.getAllRoutes()) {
- if (! result.removed.remove(r)) {
- result.added.add(r);
- }
- }
- }
- return result;
+ return new CompareResult<>(getAllRoutes(), target != null ? target.getAllRoutes() : null);
}
/**
@@ -1077,18 +1071,8 @@
* leaving the interface names that are different. And interface names which
* are in target but not in this are placed in added.
*/
- CompareResult<String> result = new CompareResult<String>();
-
- result.removed = getAllInterfaceNames();
- result.added.clear();
- if (target != null) {
- for (String r : target.getAllInterfaceNames()) {
- if (! result.removed.remove(r)) {
- result.added.add(r);
- }
- }
- }
- return result;
+ return new CompareResult<>(getAllInterfaceNames(),
+ target != null ? target.getAllInterfaceNames() : null);
}
diff --git a/core/java/android/net/metrics/WakeupEvent.java b/core/java/android/net/metrics/WakeupEvent.java
new file mode 100644
index 0000000..cbf3fc8
--- /dev/null
+++ b/core/java/android/net/metrics/WakeupEvent.java
@@ -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.
+ */
+
+package android.net.metrics;
+
+/**
+ * An event logged when NFLOG notifies userspace of a wakeup packet for
+ * watched interfaces.
+ * {@hide}
+ */
+public class WakeupEvent {
+ public String iface;
+ public long timestampMs;
+ public int uid;
+
+ @Override
+ public String toString() {
+ return String.format("WakeupEvent(%tT.%tL, %s, uid: %d)",
+ timestampMs, timestampMs, iface, uid);
+ }
+}
diff --git a/core/java/android/net/metrics/WakeupStats.java b/core/java/android/net/metrics/WakeupStats.java
new file mode 100644
index 0000000..d520b97
--- /dev/null
+++ b/core/java/android/net/metrics/WakeupStats.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.metrics;
+
+import android.os.Process;
+import android.os.SystemClock;
+
+/**
+ * An event logged per interface and that aggregates WakeupEvents for that interface.
+ * {@hide}
+ */
+public class WakeupStats {
+
+ private static final int NO_UID = -1;
+
+ public final long creationTimeMs = SystemClock.elapsedRealtime();
+ public final String iface;
+
+ public long totalWakeups = 0;
+ public long rootWakeups = 0;
+ public long systemWakeups = 0;
+ public long nonApplicationWakeups = 0;
+ public long applicationWakeups = 0;
+ public long unroutedWakeups = 0;
+ public long durationSec = 0;
+
+ public WakeupStats(String iface) {
+ this.iface = iface;
+ }
+
+ /** Update durationSec with current time. */
+ public void updateDuration() {
+ durationSec = (SystemClock.elapsedRealtime() - creationTimeMs) / 1000;
+ }
+
+ /** Update wakeup counters for the given WakeupEvent. */
+ public void countEvent(WakeupEvent ev) {
+ totalWakeups++;
+ switch (ev.uid) {
+ case Process.ROOT_UID:
+ rootWakeups++;
+ break;
+ case Process.SYSTEM_UID:
+ systemWakeups++;
+ break;
+ case NO_UID:
+ unroutedWakeups++;
+ break;
+ default:
+ if (ev.uid >= Process.FIRST_APPLICATION_UID) {
+ applicationWakeups++;
+ } else {
+ nonApplicationWakeups++;
+ }
+ break;
+ }
+ }
+
+ @Override
+ public String toString() {
+ updateDuration();
+ return new StringBuilder()
+ .append("WakeupStats(").append(iface)
+ .append(", total: ").append(totalWakeups)
+ .append(", root: ").append(rootWakeups)
+ .append(", system: ").append(systemWakeups)
+ .append(", apps: ").append(applicationWakeups)
+ .append(", non-apps: ").append(nonApplicationWakeups)
+ .append(", unrouted: ").append(unroutedWakeups)
+ .append(", ").append(durationSec).append("s)")
+ .toString();
+ }
+}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index cea5715..66b6b47 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -53,6 +53,8 @@
private static final String TAG = "BatteryStats";
private static final boolean LOCAL_LOGV = false;
+ /** Fetching RPM stats is too slow to do each time screen changes, so disable it. */
+ protected static final boolean SCREEN_OFF_RPM_STATS_ENABLED = false;
/** @hide */
public static final String SERVICE_NAME = "batterystats";
@@ -213,8 +215,10 @@
* - Fixed bugs in background timers and BLE scan time
* New in version 25:
* - Package wakeup alarms are now on screen-off timebase
+ * New in version 26:
+ * - Resource power manager (rpm) states [but screenOffRpm is disabled from working properly]
*/
- static final String CHECKIN_VERSION = "25";
+ static final String CHECKIN_VERSION = "26";
/**
* Old version, we hit 9 and ran out of room, need to remove.
@@ -233,6 +237,10 @@
private static final String CPU_DATA = "cpu";
private static final String GLOBAL_CPU_FREQ_DATA = "gcf";
private static final String CPU_TIMES_AT_FREQ_DATA = "ctf";
+ // rpm line is:
+ // BATTERY_STATS_CHECKIN_VERSION, uid, which, "rpm", state/voter name, total time, total count,
+ // screen-off time, screen-off count
+ private static final String RESOURCE_POWER_MANAGER_DATA = "rpm";
private static final String SENSOR_DATA = "sr";
private static final String VIBRATOR_DATA = "vib";
private static final String FOREGROUND_ACTIVITY_DATA = "fg";
@@ -2648,6 +2656,16 @@
public abstract Map<String, ? extends Timer> getKernelWakelockStats();
+ /**
+ * Returns Timers tracking the total time of each Resource Power Manager state and voter.
+ */
+ public abstract Map<String, ? extends Timer> getRpmStats();
+ /**
+ * Returns Timers tracking the screen-off time of each Resource Power Manager state and voter.
+ */
+ public abstract Map<String, ? extends Timer> getScreenOffRpmStats();
+
+
public abstract LongSparseArray<? extends Timer> getKernelMemoryStats();
public abstract void writeToParcelWithoutUids(Parcel out, int flags);
@@ -3309,6 +3327,30 @@
}
}
+ final Map<String, ? extends Timer> rpmStats = getRpmStats();
+ final Map<String, ? extends Timer> screenOffRpmStats = getScreenOffRpmStats();
+ if (rpmStats.size() > 0) {
+ for (Map.Entry<String, ? extends Timer> ent : rpmStats.entrySet()) {
+ sb.setLength(0);
+ Timer totalTimer = ent.getValue();
+ long timeMs = (totalTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000;
+ int count = totalTimer.getCountLocked(which);
+ Timer screenOffTimer = screenOffRpmStats.get(ent.getKey());
+ long screenOffTimeMs = screenOffTimer != null
+ ? (screenOffTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0;
+ int screenOffCount = screenOffTimer != null
+ ? screenOffTimer.getCountLocked(which) : 0;
+ if (SCREEN_OFF_RPM_STATS_ENABLED) {
+ dumpLine(pw, 0 /* uid */, category, RESOURCE_POWER_MANAGER_DATA,
+ "\"" + ent.getKey() + "\"", timeMs, count, screenOffTimeMs,
+ screenOffCount);
+ } else {
+ dumpLine(pw, 0 /* uid */, category, RESOURCE_POWER_MANAGER_DATA,
+ "\"" + ent.getKey() + "\"", timeMs, count);
+ }
+ }
+ }
+
final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly);
helper.create(this);
helper.refreshStats(which, UserHandle.USER_ALL);
@@ -4570,24 +4612,56 @@
}
final LongSparseArray<? extends Timer> mMemoryStats = getKernelMemoryStats();
- pw.println("Memory Stats");
- for (int i = 0; i < mMemoryStats.size(); i++) {
- sb.setLength(0);
- sb.append("Bandwidth ");
- sb.append(mMemoryStats.keyAt(i));
- sb.append(" Time ");
- sb.append(mMemoryStats.valueAt(i).getTotalTimeLocked(rawRealtime, which));
- pw.println(sb.toString());
+ if (mMemoryStats.size() > 0) {
+ pw.println(" Memory Stats");
+ for (int i = 0; i < mMemoryStats.size(); i++) {
+ sb.setLength(0);
+ sb.append(" Bandwidth ");
+ sb.append(mMemoryStats.keyAt(i));
+ sb.append(" Time ");
+ sb.append(mMemoryStats.valueAt(i).getTotalTimeLocked(rawRealtime, which));
+ pw.println(sb.toString());
+ }
+ pw.println();
+ }
+
+ final Map<String, ? extends Timer> rpmStats = getRpmStats();
+ if (rpmStats.size() > 0) {
+ pw.print(prefix); pw.println(" Resource Power Manager Stats");
+ if (rpmStats.size() > 0) {
+ for (Map.Entry<String, ? extends Timer> ent : rpmStats.entrySet()) {
+ final String timerName = ent.getKey();
+ final Timer timer = ent.getValue();
+ printTimer(pw, sb, timer, rawRealtime, which, prefix, timerName);
+ }
+ }
+ pw.println();
+ }
+ if (SCREEN_OFF_RPM_STATS_ENABLED) {
+ final Map<String, ? extends Timer> screenOffRpmStats = getScreenOffRpmStats();
+ if (screenOffRpmStats.size() > 0) {
+ pw.print(prefix);
+ pw.println(" Resource Power Manager Stats for when screen was off");
+ if (screenOffRpmStats.size() > 0) {
+ for (Map.Entry<String, ? extends Timer> ent : screenOffRpmStats.entrySet()) {
+ final String timerName = ent.getKey();
+ final Timer timer = ent.getValue();
+ printTimer(pw, sb, timer, rawRealtime, which, prefix, timerName);
+ }
+ }
+ pw.println();
+ }
}
final long[] cpuFreqs = getCpuFreqs();
if (cpuFreqs != null) {
sb.setLength(0);
- sb.append("CPU freqs:");
+ sb.append(" CPU freqs:");
for (int i = 0; i < cpuFreqs.length; ++i) {
sb.append(" " + cpuFreqs[i]);
}
pw.println(sb.toString());
+ pw.println();
}
for (int iu=0; iu<NU; iu++) {
diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java
index abb3161..fd0ebcf 100644
--- a/core/java/android/os/IncidentReportArgs.java
+++ b/core/java/android/os/IncidentReportArgs.java
@@ -35,6 +35,7 @@
private final IntArray mSections = new IntArray();
private final ArrayList<byte[]> mHeaders = new ArrayList<byte[]>();
private boolean mAll;
+ private int mDest;
/**
* Construct an incident report args with no fields.
@@ -69,6 +70,8 @@
for (int i=0; i<N; i++) {
out.writeByteArray(mHeaders.get(i));
}
+
+ out.writeInt(mDest);
}
public void readFromParcel(Parcel in) {
@@ -85,6 +88,8 @@
for (int i=0; i<N; i++) {
mHeaders.add(in.createByteArray());
}
+
+ mDest = in.readInt();
}
public static final Parcelable.Creator<IncidentReportArgs> CREATOR
@@ -118,7 +123,8 @@
}
sb.append(", ");
sb.append(mHeaders.size());
- sb.append(" headers)");
+ sb.append(" headers), ");
+ sb.append("Dest enum value: ").append(mDest);
return sb.toString();
}
@@ -133,6 +139,14 @@
}
/**
+ * Set this incident report privacy policy spec.
+ * @hide
+ */
+ public void setPrivacyPolicy(int dest) {
+ mDest = dest;
+ }
+
+ /**
* Add this section to the incident report. Skip if the input is smaller than 2 since section
* id are only valid for positive integer as Protobuf field id. Here 1 is reserved for Header.
*/
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index fae9d53..031ca91 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -2555,9 +2555,6 @@
* Read into the given List items String objects that were written with
* {@link #writeStringList} at the current dataPosition().
*
- * @return A newly created ArrayList containing strings with the same data
- * as those that were previously written.
- *
* @see #writeStringList
*/
public final void readStringList(List<String> list) {
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 9351661..b5d62e5 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -19,8 +19,8 @@
import android.annotation.TestApi;
import android.system.Os;
import android.system.OsConstants;
-import android.util.Log;
import android.webkit.WebViewZygote;
+
import dalvik.system.VMRuntime;
/**
@@ -423,7 +423,7 @@
*
* When invokeWith is not null, the process will be started as a fresh app
* and not a zygote fork. Note that this is only allowed for uid 0 or when
- * debugFlags contains DEBUG_ENABLE_DEBUGGER.
+ * runtimeFlags contains DEBUG_ENABLE_DEBUGGER.
*
* @param processClass The class to use as the process's main entry
* point.
@@ -431,7 +431,7 @@
* @param uid The user-id under which the process will run.
* @param gid The group-id under which the process will run.
* @param gids Additional group-ids associated with the process.
- * @param debugFlags Additional flags.
+ * @param runtimeFlags Additional flags for the runtime.
* @param targetSdkVersion The target SDK version for the app.
* @param seInfo null-ok SELinux information for the new process.
* @param abi non-null the ABI this app should be started with.
@@ -448,7 +448,7 @@
public static final ProcessStartResult start(final String processClass,
final String niceName,
int uid, int gid, int[] gids,
- int debugFlags, int mountExternal,
+ int runtimeFlags, int mountExternal,
int targetSdkVersion,
String seInfo,
String abi,
@@ -457,7 +457,7 @@
String invokeWith,
String[] zygoteArgs) {
return zygoteProcess.start(processClass, niceName, uid, gid, gids,
- debugFlags, mountExternal, targetSdkVersion, seInfo,
+ runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
}
@@ -465,7 +465,7 @@
public static final ProcessStartResult startWebView(final String processClass,
final String niceName,
int uid, int gid, int[] gids,
- int debugFlags, int mountExternal,
+ int runtimeFlags, int mountExternal,
int targetSdkVersion,
String seInfo,
String abi,
@@ -474,7 +474,7 @@
String invokeWith,
String[] zygoteArgs) {
return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
- debugFlags, mountExternal, targetSdkVersion, seInfo,
+ runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
}
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 4703af0..f02631c 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -317,13 +317,7 @@
private static final HashMap<Class, Integer> EMPTY_CLASS_LIMIT_MAP =
new HashMap<Class, Integer>();
- /**
- * The current VmPolicy in effect.
- *
- * <p>TODO: these are redundant (mask is in VmPolicy). Should remove sVmPolicyMask.
- */
- private static volatile int sVmPolicyMask = 0;
-
+ /** The current VmPolicy in effect. */
private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;
/** {@hide} */
@@ -728,7 +722,7 @@
}
/**
- * Detect when an {@link java.io.Closeable} or other object with a explict termination
+ * Detect when an {@link java.io.Closeable} or other object with an explicit termination
* method is finalized without having been closed.
*
* <p>You always want to explicitly close such objects to avoid unnecessary resources
@@ -1168,7 +1162,12 @@
* @hide
*/
public static void enableDeathOnFileUriExposure() {
- sVmPolicyMask |= DETECT_VM_FILE_URI_EXPOSURE | PENALTY_DEATH_ON_FILE_URI_EXPOSURE;
+ sVmPolicy =
+ new VmPolicy(
+ sVmPolicy.mask
+ | DETECT_VM_FILE_URI_EXPOSURE
+ | PENALTY_DEATH_ON_FILE_URI_EXPOSURE,
+ sVmPolicy.classInstanceLimit);
}
/**
@@ -1178,7 +1177,12 @@
* @hide
*/
public static void disableDeathOnFileUriExposure() {
- sVmPolicyMask &= ~(DETECT_VM_FILE_URI_EXPOSURE | PENALTY_DEATH_ON_FILE_URI_EXPOSURE);
+ sVmPolicy =
+ new VmPolicy(
+ sVmPolicy.mask
+ & ~(DETECT_VM_FILE_URI_EXPOSURE
+ | PENALTY_DEATH_ON_FILE_URI_EXPOSURE),
+ sVmPolicy.classInstanceLimit);
}
/**
@@ -1709,14 +1713,13 @@
public static void setVmPolicy(final VmPolicy policy) {
synchronized (StrictMode.class) {
sVmPolicy = policy;
- sVmPolicyMask = policy.mask;
setCloseGuardEnabled(vmClosableObjectLeaksEnabled());
Looper looper = Looper.getMainLooper();
if (looper != null) {
MessageQueue mq = looper.mQueue;
if (policy.classInstanceLimit.size() == 0
- || (sVmPolicyMask & VM_PENALTY_MASK) == 0) {
+ || (sVmPolicy.mask & VM_PENALTY_MASK) == 0) {
mq.removeIdleHandler(sProcessIdleHandler);
sIsIdlerRegistered = false;
} else if (!sIsIdlerRegistered) {
@@ -1726,9 +1729,9 @@
}
int networkPolicy = NETWORK_POLICY_ACCEPT;
- if ((sVmPolicyMask & DETECT_VM_CLEARTEXT_NETWORK) != 0) {
- if ((sVmPolicyMask & PENALTY_DEATH) != 0
- || (sVmPolicyMask & PENALTY_DEATH_ON_CLEARTEXT_NETWORK) != 0) {
+ if ((sVmPolicy.mask & DETECT_VM_CLEARTEXT_NETWORK) != 0) {
+ if ((sVmPolicy.mask & PENALTY_DEATH) != 0
+ || (sVmPolicy.mask & PENALTY_DEATH_ON_CLEARTEXT_NETWORK) != 0) {
networkPolicy = NETWORK_POLICY_REJECT;
} else {
networkPolicy = NETWORK_POLICY_LOG;
@@ -1771,37 +1774,37 @@
/** @hide */
public static boolean vmSqliteObjectLeaksEnabled() {
- return (sVmPolicyMask & DETECT_VM_CURSOR_LEAKS) != 0;
+ return (sVmPolicy.mask & DETECT_VM_CURSOR_LEAKS) != 0;
}
/** @hide */
public static boolean vmClosableObjectLeaksEnabled() {
- return (sVmPolicyMask & DETECT_VM_CLOSABLE_LEAKS) != 0;
+ return (sVmPolicy.mask & DETECT_VM_CLOSABLE_LEAKS) != 0;
}
/** @hide */
public static boolean vmRegistrationLeaksEnabled() {
- return (sVmPolicyMask & DETECT_VM_REGISTRATION_LEAKS) != 0;
+ return (sVmPolicy.mask & DETECT_VM_REGISTRATION_LEAKS) != 0;
}
/** @hide */
public static boolean vmFileUriExposureEnabled() {
- return (sVmPolicyMask & DETECT_VM_FILE_URI_EXPOSURE) != 0;
+ return (sVmPolicy.mask & DETECT_VM_FILE_URI_EXPOSURE) != 0;
}
/** @hide */
public static boolean vmCleartextNetworkEnabled() {
- return (sVmPolicyMask & DETECT_VM_CLEARTEXT_NETWORK) != 0;
+ return (sVmPolicy.mask & DETECT_VM_CLEARTEXT_NETWORK) != 0;
}
/** @hide */
public static boolean vmContentUriWithoutPermissionEnabled() {
- return (sVmPolicyMask & DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION) != 0;
+ return (sVmPolicy.mask & DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION) != 0;
}
/** @hide */
public static boolean vmUntaggedSocketEnabled() {
- return (sVmPolicyMask & DETECT_VM_UNTAGGED_SOCKET) != 0;
+ return (sVmPolicy.mask & DETECT_VM_UNTAGGED_SOCKET) != 0;
}
/** @hide */
@@ -1827,7 +1830,7 @@
/** @hide */
public static void onFileUriExposed(Uri uri, String location) {
final String message = uri + " exposed beyond app through " + location;
- if ((sVmPolicyMask & PENALTY_DEATH_ON_FILE_URI_EXPOSURE) != 0) {
+ if ((sVmPolicy.mask & PENALTY_DEATH_ON_FILE_URI_EXPOSURE) != 0) {
throw new FileUriExposedException(message);
} else {
onVmPolicyViolation(null, new Throwable(message));
@@ -1873,7 +1876,7 @@
}
}
- final boolean forceDeath = (sVmPolicyMask & PENALTY_DEATH_ON_CLEARTEXT_NETWORK) != 0;
+ final boolean forceDeath = (sVmPolicy.mask & PENALTY_DEATH_ON_CLEARTEXT_NETWORK) != 0;
onVmPolicyViolation(
HexDump.dumpHexString(firstPacket).trim(), new Throwable(msg), forceDeath);
}
@@ -1898,10 +1901,10 @@
/** @hide */
public static void onVmPolicyViolation(
String message, Throwable originStack, boolean forceDeath) {
- final boolean penaltyDropbox = (sVmPolicyMask & PENALTY_DROPBOX) != 0;
- final boolean penaltyDeath = ((sVmPolicyMask & PENALTY_DEATH) != 0) || forceDeath;
- final boolean penaltyLog = (sVmPolicyMask & PENALTY_LOG) != 0;
- final ViolationInfo info = new ViolationInfo(message, originStack, sVmPolicyMask);
+ final boolean penaltyDropbox = (sVmPolicy.mask & PENALTY_DROPBOX) != 0;
+ final boolean penaltyDeath = ((sVmPolicy.mask & PENALTY_DEATH) != 0) || forceDeath;
+ final boolean penaltyLog = (sVmPolicy.mask & PENALTY_LOG) != 0;
+ final ViolationInfo info = new ViolationInfo(message, originStack, sVmPolicy.mask);
// Erase stuff not relevant for process-wide violations
info.numAnimationsRunning = 0;
@@ -1929,7 +1932,7 @@
Log.e(TAG, message, originStack);
}
- int violationMaskSubset = PENALTY_DROPBOX | (ALL_VM_DETECT_BITS & sVmPolicyMask);
+ int violationMaskSubset = PENALTY_DROPBOX | (ALL_VM_DETECT_BITS & sVmPolicy.mask);
if (penaltyDropbox && !penaltyDeath) {
// Common case for userdebug/eng builds. If no death and
@@ -2565,9 +2568,8 @@
// now we suppress the stack trace because it's useless and/or
// misleading.
private static class InstanceCountViolation extends Throwable {
- final Class mClass;
- final long mInstances;
- final int mLimit;
+ private final long mInstances;
+ private final int mLimit;
private static final StackTraceElement[] FAKE_STACK = {
new StackTraceElement(
@@ -2577,7 +2579,6 @@
public InstanceCountViolation(Class klass, long instances, int limit) {
super(klass.toString() + "; instances=" + instances + "; limit=" + limit);
setStackTrace(FAKE_STACK);
- mClass = klass;
mInstances = instances;
mLimit = limit;
}
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index 7a13ee8..670f794 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -20,9 +20,11 @@
import android.net.LocalSocketAddress;
import android.util.Log;
import android.util.Slog;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.Zygote;
import com.android.internal.util.Preconditions;
+
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.IOException;
@@ -173,7 +175,7 @@
*
* When invokeWith is not null, the process will be started as a fresh app
* and not a zygote fork. Note that this is only allowed for uid 0 or when
- * debugFlags contains DEBUG_ENABLE_DEBUGGER.
+ * runtimeFlags contains DEBUG_ENABLE_DEBUGGER.
*
* @param processClass The class to use as the process's main entry
* point.
@@ -181,7 +183,7 @@
* @param uid The user-id under which the process will run.
* @param gid The group-id under which the process will run.
* @param gids Additional group-ids associated with the process.
- * @param debugFlags Additional flags.
+ * @param runtimeFlags Additional flags.
* @param targetSdkVersion The target SDK version for the app.
* @param seInfo null-ok SELinux information for the new process.
* @param abi non-null the ABI this app should be started with.
@@ -196,7 +198,7 @@
public final Process.ProcessStartResult start(final String processClass,
final String niceName,
int uid, int gid, int[] gids,
- int debugFlags, int mountExternal,
+ int runtimeFlags, int mountExternal,
int targetSdkVersion,
String seInfo,
String abi,
@@ -206,7 +208,7 @@
String[] zygoteArgs) {
try {
return startViaZygote(processClass, niceName, uid, gid, gids,
- debugFlags, mountExternal, targetSdkVersion, seInfo,
+ runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
@@ -317,7 +319,7 @@
* @param gid a POSIX gid that the new process shuold setgid() to
* @param gids null-ok; a list of supplementary group IDs that the
* new process should setgroup() to.
- * @param debugFlags Additional flags.
+ * @param runtimeFlags Additional flags for the runtime.
* @param targetSdkVersion The target SDK version for the app.
* @param seInfo null-ok SELinux information for the new process.
* @param abi the ABI the process should use.
@@ -331,7 +333,7 @@
final String niceName,
final int uid, final int gid,
final int[] gids,
- int debugFlags, int mountExternal,
+ int runtimeFlags, int mountExternal,
int targetSdkVersion,
String seInfo,
String abi,
@@ -347,33 +349,7 @@
argsForZygote.add("--runtime-args");
argsForZygote.add("--setuid=" + uid);
argsForZygote.add("--setgid=" + gid);
- if ((debugFlags & Zygote.DEBUG_ENABLE_JNI_LOGGING) != 0) {
- argsForZygote.add("--enable-jni-logging");
- }
- if ((debugFlags & Zygote.DEBUG_ENABLE_SAFEMODE) != 0) {
- argsForZygote.add("--enable-safemode");
- }
- if ((debugFlags & Zygote.DEBUG_ENABLE_JDWP) != 0) {
- argsForZygote.add("--enable-jdwp");
- }
- if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) {
- argsForZygote.add("--enable-checkjni");
- }
- if ((debugFlags & Zygote.DEBUG_GENERATE_DEBUG_INFO) != 0) {
- argsForZygote.add("--generate-debug-info");
- }
- if ((debugFlags & Zygote.DEBUG_ALWAYS_JIT) != 0) {
- argsForZygote.add("--always-jit");
- }
- if ((debugFlags & Zygote.DEBUG_NATIVE_DEBUGGABLE) != 0) {
- argsForZygote.add("--native-debuggable");
- }
- if ((debugFlags & Zygote.DEBUG_JAVA_DEBUGGABLE) != 0) {
- argsForZygote.add("--java-debuggable");
- }
- if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) {
- argsForZygote.add("--enable-assert");
- }
+ argsForZygote.add("--runtime-flags=" + runtimeFlags);
if (mountExternal == Zygote.MOUNT_EXTERNAL_DEFAULT) {
argsForZygote.add("--mount-external-default");
} else if (mountExternal == Zygote.MOUNT_EXTERNAL_READ) {
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 8533c7e..7036346 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -41,6 +41,7 @@
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
+import android.os.IVold;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
@@ -219,27 +220,33 @@
public static final int FLAG_INCLUDE_INVISIBLE = 1 << 10;
/** {@hide} */
- public static final int FSTRIM_FLAG_DEEP = 1 << 0;
+ public static final int FSTRIM_FLAG_DEEP = IVold.FSTRIM_FLAG_DEEP_TRIM;
/** {@hide} */
- public static final int FSTRIM_FLAG_BENCHMARK = 1 << 1;
+ public static final int FSTRIM_FLAG_BENCHMARK = IVold.FSTRIM_FLAG_BENCHMARK_AFTER;
/** @hide The volume is not encrypted. */
- public static final int ENCRYPTION_STATE_NONE = 1;
+ public static final int ENCRYPTION_STATE_NONE =
+ IVold.ENCRYPTION_STATE_NONE;
/** @hide The volume has been encrypted succesfully. */
- public static final int ENCRYPTION_STATE_OK = 0;
+ public static final int ENCRYPTION_STATE_OK =
+ IVold.ENCRYPTION_STATE_OK;
- /** @hide The volume is in a bad state.*/
- public static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;
+ /** @hide The volume is in a bad state. */
+ public static final int ENCRYPTION_STATE_ERROR_UNKNOWN =
+ IVold.ENCRYPTION_STATE_ERROR_UNKNOWN;
/** @hide Encryption is incomplete */
- public static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;
+ public static final int ENCRYPTION_STATE_ERROR_INCOMPLETE =
+ IVold.ENCRYPTION_STATE_ERROR_INCOMPLETE;
/** @hide Encryption is incomplete and irrecoverable */
- public static final int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3;
+ public static final int ENCRYPTION_STATE_ERROR_INCONSISTENT =
+ IVold.ENCRYPTION_STATE_ERROR_INCONSISTENT;
/** @hide Underlying data is corrupt */
- public static final int ENCRYPTION_STATE_ERROR_CORRUPT = -4;
+ public static final int ENCRYPTION_STATE_ERROR_CORRUPT =
+ IVold.ENCRYPTION_STATE_ERROR_CORRUPT;
private static volatile IStorageManager sStorageManager = null;
@@ -1973,13 +1980,13 @@
/// Consts to match the password types in cryptfs.h
/** @hide */
- public static final int CRYPT_TYPE_PASSWORD = 0;
+ public static final int CRYPT_TYPE_PASSWORD = IVold.PASSWORD_TYPE_PASSWORD;
/** @hide */
- public static final int CRYPT_TYPE_DEFAULT = 1;
+ public static final int CRYPT_TYPE_DEFAULT = IVold.PASSWORD_TYPE_DEFAULT;
/** @hide */
- public static final int CRYPT_TYPE_PATTERN = 2;
+ public static final int CRYPT_TYPE_PATTERN = IVold.PASSWORD_TYPE_PATTERN;
/** @hide */
- public static final int CRYPT_TYPE_PIN = 3;
+ public static final int CRYPT_TYPE_PIN = IVold.PASSWORD_TYPE_PIN;
// Constants for the data available via StorageManagerService.getField.
/** @hide */
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java
index a21e05e..76f79f1 100644
--- a/core/java/android/os/storage/VolumeInfo.java
+++ b/core/java/android/os/storage/VolumeInfo.java
@@ -23,6 +23,7 @@
import android.content.res.Resources;
import android.net.Uri;
import android.os.Environment;
+import android.os.IVold;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
@@ -75,24 +76,24 @@
/** Real volume representing internal emulated storage */
public static final String ID_EMULATED_INTERNAL = "emulated";
- public static final int TYPE_PUBLIC = 0;
- public static final int TYPE_PRIVATE = 1;
- public static final int TYPE_EMULATED = 2;
- public static final int TYPE_ASEC = 3;
- public static final int TYPE_OBB = 4;
+ public static final int TYPE_PUBLIC = IVold.VOLUME_TYPE_PUBLIC;
+ public static final int TYPE_PRIVATE = IVold.VOLUME_TYPE_PRIVATE;
+ public static final int TYPE_EMULATED = IVold.VOLUME_TYPE_EMULATED;
+ public static final int TYPE_ASEC = IVold.VOLUME_TYPE_ASEC;
+ public static final int TYPE_OBB = IVold.VOLUME_TYPE_OBB;
- public static final int STATE_UNMOUNTED = 0;
- public static final int STATE_CHECKING = 1;
- public static final int STATE_MOUNTED = 2;
- public static final int STATE_MOUNTED_READ_ONLY = 3;
- public static final int STATE_FORMATTING = 4;
- public static final int STATE_EJECTING = 5;
- public static final int STATE_UNMOUNTABLE = 6;
- public static final int STATE_REMOVED = 7;
- public static final int STATE_BAD_REMOVAL = 8;
+ public static final int STATE_UNMOUNTED = IVold.VOLUME_STATE_UNMOUNTED;
+ public static final int STATE_CHECKING = IVold.VOLUME_STATE_CHECKING;
+ public static final int STATE_MOUNTED = IVold.VOLUME_STATE_MOUNTED;
+ public static final int STATE_MOUNTED_READ_ONLY = IVold.VOLUME_STATE_MOUNTED_READ_ONLY;
+ public static final int STATE_FORMATTING = IVold.VOLUME_STATE_FORMATTING;
+ public static final int STATE_EJECTING = IVold.VOLUME_STATE_EJECTING;
+ public static final int STATE_UNMOUNTABLE = IVold.VOLUME_STATE_UNMOUNTABLE;
+ public static final int STATE_REMOVED = IVold.VOLUME_STATE_REMOVED;
+ public static final int STATE_BAD_REMOVAL = IVold.VOLUME_STATE_BAD_REMOVAL;
- public static final int MOUNT_FLAG_PRIMARY = 1 << 0;
- public static final int MOUNT_FLAG_VISIBLE = 1 << 1;
+ public static final int MOUNT_FLAG_PRIMARY = IVold.MOUNT_FLAG_PRIMARY;
+ public static final int MOUNT_FLAG_VISIBLE = IVold.MOUNT_FLAG_VISIBLE;
private static SparseArray<String> sStateToEnvironment = new SparseArray<>();
private static ArrayMap<String, String> sEnvironmentToBroadcast = new ArrayMap<>();
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index c44b0bc..40ced6c 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5194,17 +5194,39 @@
public static final String ALLOW_MOCK_LOCATION = "mock_location";
/**
- * A 64-bit number (as a hex string) that is randomly
- * generated when the user first sets up the device and should remain
- * constant for the lifetime of the user's device. The value may
- * change if a factory reset is performed on the device.
- * <p class="note"><strong>Note:</strong> When a device has <a
- * href="{@docRoot}about/versions/android-4.2.html#MultipleUsers">multiple users</a>
- * (available on certain devices running Android 4.2 or higher), each user appears as a
- * completely separate device, so the {@code ANDROID_ID} value is unique to each
- * user.</p>
+ * On Android 8.0 (API level 26) and higher versions of the platform,
+ * a 64-bit number (expressed as a hexadecimal string), unique to
+ * each combination of app-signing key, user, and device.
+ * Values of {@code ANDROID_ID} are scoped by signing key and user.
+ * The value may change if a factory reset is performed on the
+ * device or if an APK signing key changes.
*
- * <p class="note"><strong>Note:</strong> If the caller is an Instant App the id is scoped
+ * For more information about how the platform handles {@code ANDROID_ID}
+ * in Android 8.0 (API level 26) and higher, see <a
+ * href="{@docRoot}preview/behavior-changes.html#privacy-all">
+ * Android 8.0 Behavior Changes</a>.
+ *
+ * <p class="note"><strong>Note:</strong> For apps that were installed
+ * prior to updating the device to a version of Android 8.0
+ * (API level 26) or higher, the value of {@code ANDROID_ID} changes
+ * if the app is uninstalled and then reinstalled after the OTA.
+ * To preserve values across uninstalls after an OTA to Android 8.0
+ * or higher, developers can use
+ * <a href="{@docRoot}guide/topics/data/keyvaluebackup.html">
+ * Key/Value Backup</a>.</p>
+ *
+ * <p>In versions of the platform lower than Android 8.0 (API level 26),
+ * a 64-bit number (expressed as a hexadecimal string) that is randomly
+ * generated when the user first sets up the device and should remain
+ * constant for the lifetime of the user's device.
+ *
+ * On devices that have
+ * <a href="{@docRoot}about/versions/android-4.2.html#MultipleUsers">
+ * multiple users</a>, each user appears as a
+ * completely separate device, so the {@code ANDROID_ID} value is
+ * unique to each user.</p>
+ *
+ * <p class="note"><strong>Note:</strong> If the caller is an Instant App the ID is scoped
* to the Instant App, it is generated when the Instant App is first installed and reset if
* the user clears the Instant App.
*/
@@ -7120,6 +7142,36 @@
public static final String QS_AUTO_ADDED_TILES = "qs_auto_tiles";
/**
+ * Whether the Lockdown button should be shown in the power menu.
+ * @hide
+ */
+ public static final String LOCKDOWN_IN_POWER_MENU = "lockdown_in_power_menu";
+
+ /**
+ * Backup manager behavioral parameters.
+ * This is encoded as a key=value list, separated by commas. Ex:
+ *
+ * "key_value_backup_interval_milliseconds=14400000,key_value_backup_require_charging=true"
+ *
+ * The following keys are supported:
+ *
+ * <pre>
+ * key_value_backup_interval_milliseconds (long)
+ * key_value_backup_fuzz_milliseconds (long)
+ * key_value_backup_require_charging (boolean)
+ * key_value_backup_required_network_type (int)
+ * full_backup_interval_milliseconds (long)
+ * full_backup_require_charging (boolean)
+ * full_backup_required_network_type (int)
+ * </pre>
+ *
+ * <p>
+ * Type: string
+ * @hide
+ */
+ public static final String BACKUP_MANAGER_CONSTANTS = "backup_manager_constants";
+
+ /**
* This are the settings to be backed up.
*
* NOTE: Settings are backed up and restored in the order they appear
@@ -7221,6 +7273,7 @@
SCREENSAVER_COMPONENTS,
SCREENSAVER_ACTIVATE_ON_DOCK,
SCREENSAVER_ACTIVATE_ON_SLEEP,
+ LOCKDOWN_IN_POWER_MENU,
};
/** @hide */
@@ -8556,6 +8609,16 @@
public static final String NETWORK_SCORING_UI_ENABLED = "network_scoring_ui_enabled";
/**
+ * Value to specify how long in milliseconds to retain seen score cache curves to be used
+ * when generating SSID only bases score curves.
+ *
+ * Type: long
+ * @hide
+ */
+ public static final String SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS =
+ "speed_label_cache_eviction_age_millis";
+
+ /**
* Value to specify if network recommendations from
* {@link com.android.server.NetworkScoreService} are enabled.
*
@@ -10224,6 +10287,15 @@
"euicc_factory_reset_timeout_millis";
/**
+ * Flag to set the timeout for when to refresh the storage settings cached data.
+ * Type: long
+ *
+ * @hide
+ */
+ public static final String STORAGE_SETTINGS_CLOBBER_THRESHOLD =
+ "storage_settings_clobber_threshold";
+
+ /**
* Settings to backup. This is here so that it's in the same place as the settings
* keys and easy to update.
*
@@ -10787,6 +10859,7 @@
INSTANT_APP_SETTINGS.add(ANIMATOR_DURATION_SCALE);
INSTANT_APP_SETTINGS.add(DEBUG_VIEW_ATTRIBUTES);
INSTANT_APP_SETTINGS.add(WTF_IS_FATAL);
+ INSTANT_APP_SETTINGS.add(SEND_ACTION_APP_ERROR);
}
/**
diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java
index 1dcaef4..3e08dcf 100644
--- a/core/java/android/service/autofill/AutofillService.java
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -51,6 +51,7 @@
* Settings screen).
* </ol>
*
+ * <a name="BasicUsage"></a>
* <h3>Basic usage</h3>
*
* <p>The basic autofill process is defined by the workflow below:
@@ -122,12 +123,14 @@
* each {@link #onFillRequest(FillRequest, CancellationSignal, FillCallback)} received - if it
* doesn't, the request will eventually time out and be discarded by the Android System.
*
+ * <a name="SavingUserData"></a>
* <h3>Saving user data</h3>
*
* <p>If the service is also interested on saving the data filled by the user, it must set a
* {@link SaveInfo} object in the {@link FillResponse}. See {@link SaveInfo} for more details and
* examples.
*
+ * <a name="UserAuthentication"></a>
* <h3>User authentication</h3>
*
* <p>The service can provide an extra degree of security by requiring the user to authenticate
@@ -164,6 +167,7 @@
* credentials in "vaults": the first response would contain fake datasets with the vault names,
* and the subsequent response would contain the app credentials stored in that vault.
*
+ * <a name="DataPartioning"></a>
* <h3>Data partitioning</h3>
*
* <p>The autofillable views in a screen should be grouped in logical groups called "partitions".
@@ -243,6 +247,7 @@
* <p>When the service returns multiple {@link FillResponse}, the last one overrides the previous;
* that's why the {@link SaveInfo} in the 2nd request above has the info for both partitions.
*
+ * <a name="PackageVerification"></a>
* <h3>Package verification</h3>
*
* <p>When autofilling app-specific data (like username and password), the service must verify
@@ -270,9 +275,16 @@
* }
* return hash.toString();
* }
- *
* </pre>
*
+ * <p>If the service did not store the signing certificates data the first time the data was saved
+ * — for example, because the data was created by a previous version of the app that did not
+ * use the Autofill Framework — the service should warn the user that the authenticity of the
+ * app cannot be confirmed (see an example on how to show such warning in the
+ * <a href="#WebSecurityDisclaimer">Web security</a> section below), and if the user agrees,
+ * then the service could save the data from the signing ceriticates for future use.
+ *
+ * <a name="IgnoringViews"></a>
* <h3>Ignoring views</h3>
*
* <p>If the service find views that cannot be autofilled (for example, a text field representing
@@ -281,6 +293,7 @@
* a new {@link #onFillRequest(FillRequest, CancellationSignal, FillCallback)} when these views are
* focused.
*
+ * <a name="WebSecurity"></a>
* <h3>Web security</h3>
*
* <p>When handling autofill requests that represent web pages (typically
@@ -313,6 +326,7 @@
* }
* </pre>
*
+ * <a name="WebSecurityDisclaimer"></a>
* <p>If the association between the web domain and app package cannot be verified through the steps
* above, but the service thinks that it is appropriate to fill persisted credentials that are
* stored for the web domain, the service should warn the user about the potential data
diff --git a/core/java/android/service/autofill/CharSequenceTransformation.java b/core/java/android/service/autofill/CharSequenceTransformation.java
index 8ab856e..2413e97 100644
--- a/core/java/android/service/autofill/CharSequenceTransformation.java
+++ b/core/java/android/service/autofill/CharSequenceTransformation.java
@@ -86,7 +86,7 @@
}
try {
final Matcher matcher = field.first.matcher(value);
- if (!matcher.matches()) {
+ if (!matcher.find()) {
if (sDebug) Log.d(TAG, "match for " + field.first + " failed on id " + id);
return;
}
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index 65b0efc..cb341b1 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -198,15 +198,22 @@
}
/**
- * Sets the id for the dataset so its usage history can be retrieved later.
+ * Sets the id for the dataset so its usage can be tracked.
*
- * <p>The id of the last selected dataset can be read from
- * {@link AutofillService#getFillEventHistory()}. If the id is not set it will not be clear
- * if a dataset was selected as {@link AutofillService#getFillEventHistory()} uses
- * {@code null} to indicate that no dataset was selected.
+ * <p>Dataset usage can be tracked for 2 purposes:
+ *
+ * <ul>
+ * <li>For statistical purposes, the service can call
+ * {@link AutofillService#getFillEventHistory()} when handling {@link
+ * AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback)}
+ * calls.
+ * <li>For normal autofill workflow, the service can call
+ * {@link SaveRequest#getDatasetIds()} when handling
+ * {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback)} calls.
+ * </ul>
*
* @param id id for this dataset or {@code null} to unset.
-
+ *
* @return This builder.
*/
public @NonNull Builder setId(@Nullable String id) {
diff --git a/core/java/android/service/autofill/FillEventHistory.java b/core/java/android/service/autofill/FillEventHistory.java
index 60c1c9a..3b719ac 100644
--- a/core/java/android/service/autofill/FillEventHistory.java
+++ b/core/java/android/service/autofill/FillEventHistory.java
@@ -22,8 +22,7 @@
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
-import android.view.autofill.AutofillId;
-import android.widget.RemoteViews;
+import android.view.autofill.AutofillManager;
import com.android.internal.util.Preconditions;
@@ -151,6 +150,14 @@
public static final class Event {
/**
* A dataset was selected. The dataset selected can be read from {@link #getDatasetId()}.
+ *
+ * <p><b>Note: </b>on Android {@link android.os.Build.VERSION_CODES#O}, this event was also
+ * incorrectly reported after a
+ * {@link Dataset.Builder#setAuthentication(IntentSender) dataset authentication} was
+ * selected and the service returned a dataset in the
+ * {@link AutofillManager#EXTRA_AUTHENTICATION_RESULT} of the activity launched from that
+ * {@link IntentSender}. This behavior was fixed on Android
+ * {@link android.os.Build.VERSION_CODES#O_MR1}.
*/
public static final int TYPE_DATASET_SELECTED = 0;
@@ -161,8 +168,8 @@
public static final int TYPE_DATASET_AUTHENTICATION_SELECTED = 1;
/**
- * A {@link FillResponse.Builder#setAuthentication(AutofillId[], IntentSender, RemoteViews)
- * fill response authentication} was selected.
+ * A {@link FillResponse.Builder#setAuthentication(android.view.autofill.AutofillId[],
+ * IntentSender, android.widget.RemoteViews) fill response authentication} was selected.
*/
public static final int TYPE_AUTHENTICATION_SELECTED = 2;
@@ -228,6 +235,11 @@
mDatasetId = datasetId;
mClientState = clientState;
}
+
+ @Override
+ public String toString() {
+ return "FillEvent [datasetId=" + mDatasetId + ", type=" + mEventType + "]";
+ }
}
public static final Parcelable.Creator<FillEventHistory> CREATOR =
diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java
index 1c32fe0..3a84224 100644
--- a/core/java/android/service/autofill/FillRequest.java
+++ b/core/java/android/service/autofill/FillRequest.java
@@ -20,7 +20,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Bundle;
-import android.os.CancellationSignal;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.View;
@@ -38,7 +37,7 @@
* interesting for saving and what are the possible ways to fill the inputs on
* the screen if applicable.
*
- * @see AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)
+ * @see AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback)
*/
public final class FillRequest implements Parcelable {
@@ -122,9 +121,14 @@
return mContexts;
}
+ @Override
+ public String toString() {
+ return "FillRequest: [id=" + mId + ", flags=" + mFlags + ", ctxts= " + mContexts + "]";
+ }
+
/**
* Gets the extra client state returned from the last {@link
- * AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)
+ * AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback)
* fill request}, so the service can use it for state management.
*
* <p>Once a {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback)
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 3b09c67..6d8a959 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -148,10 +148,12 @@
* {@link android.view.autofill.AutofillManager#EXTRA_ASSIST_STRUCTURE screen
* content} and your {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE
* client state}. Once you complete your authentication flow you should set the
- * {@link Activity} result to {@link android.app.Activity#RESULT_OK} and provide the fully
- * populated {@link FillResponse response} by setting it to the
- * {@link android.view.autofill.AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra.
- * For example, if you provided an empty {@link FillResponse resppnse} because the
+ * {@link Activity} result to {@link android.app.Activity#RESULT_OK} and set the
+ * {@link android.view.autofill.AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra
+ * with the fully populated {@link FillResponse response} (or {@code null} if the screen
+ * cannot be autofilled).
+ *
+ * <p>For example, if you provided an empty {@link FillResponse response} because the
* user's data was locked and marked that the response needs an authentication then
* in the response returned if authentication succeeds you need to provide all
* available data sets some of which may need to be further authenticated, for
diff --git a/core/java/android/service/autofill/SaveRequest.java b/core/java/android/service/autofill/SaveRequest.java
index 9de9315..1a6c5b0 100644
--- a/core/java/android/service/autofill/SaveRequest.java
+++ b/core/java/android/service/autofill/SaveRequest.java
@@ -22,6 +22,7 @@
import android.os.CancellationSignal;
import android.os.Parcel;
import android.os.Parcelable;
+
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
@@ -36,16 +37,18 @@
public final class SaveRequest implements Parcelable {
private final @NonNull ArrayList<FillContext> mFillContexts;
private final @Nullable Bundle mClientState;
+ private final @Nullable ArrayList<String> mDatasetIds;
/** @hide */
public SaveRequest(@NonNull ArrayList<FillContext> fillContexts,
- @Nullable Bundle clientState) {
+ @Nullable Bundle clientState, @Nullable ArrayList<String> datasetIds) {
mFillContexts = Preconditions.checkNotNull(fillContexts, "fillContexts");
mClientState = clientState;
+ mDatasetIds = datasetIds;
}
private SaveRequest(@NonNull Parcel parcel) {
- this(parcel.readTypedArrayList(null), parcel.readBundle());
+ this(parcel.readTypedArrayList(null), parcel.readBundle(), parcel.createStringArrayList());
}
/**
@@ -66,6 +69,14 @@
return mClientState;
}
+ /**
+ * Gets the ids of the datasets selected by the user, in the order in which they were selected.
+ */
+ @Nullable
+ public List<String> getDatasetIds() {
+ return mDatasetIds;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -75,6 +86,7 @@
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeTypedArrayList(mFillContexts, flags);
parcel.writeBundle(mClientState);
+ parcel.writeStringList(mDatasetIds);
}
public static final Creator<SaveRequest> CREATOR =
diff --git a/core/java/android/service/oemlock/IOemLockService.aidl b/core/java/android/service/oemlock/IOemLockService.aidl
index 682e7ee..d5e10d6 100644
--- a/core/java/android/service/oemlock/IOemLockService.aidl
+++ b/core/java/android/service/oemlock/IOemLockService.aidl
@@ -28,7 +28,6 @@
void setOemUnlockAllowedByUser(boolean allowed);
boolean isOemUnlockAllowedByUser();
- boolean canUserAllowOemUnlock();
boolean isOemUnlockAllowed();
boolean isDeviceOemUnlocked();
}
diff --git a/core/java/android/service/oemlock/OemLockManager.java b/core/java/android/service/oemlock/OemLockManager.java
index 3a56d9f..f0d6603 100644
--- a/core/java/android/service/oemlock/OemLockManager.java
+++ b/core/java/android/service/oemlock/OemLockManager.java
@@ -118,24 +118,6 @@
}
/**
- * Returns whether all parties other than the user allow OEM unlock meaning the user can
- * directly control whether or not the device can be OEM unlocked.
- *
- * If this is true, {@link #isOemUnlockAllowedByUser} is the same as {@link #isOemUnlockAllowed}
- *
- * @return Whether the user can directly control whether the device can be OEM unlocked.
- *
- * @hide
- */
- public boolean canUserAllowOemUnlock() {
- try {
- return mService.canUserAllowOemUnlock();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* @return Whether the bootloader is able to OEM unlock the device.
*
* @hide
diff --git a/core/java/android/service/settings/suggestions/ISuggestionService.aidl b/core/java/android/service/settings/suggestions/ISuggestionService.aidl
new file mode 100644
index 0000000..423c507
--- /dev/null
+++ b/core/java/android/service/settings/suggestions/ISuggestionService.aidl
@@ -0,0 +1,20 @@
+package android.service.settings.suggestions;
+
+import android.service.settings.suggestions.Suggestion;
+
+import java.util.List;
+
+/** @hide */
+interface ISuggestionService {
+
+ /**
+ * Return all available suggestions.
+ */
+ List<Suggestion> getSuggestions() = 1;
+
+ /**
+ * Dismiss a suggestion. The suggestion will not be included in future {@link #getSuggestions)
+ * calls.
+ */
+ void dismissSuggestion(in Suggestion suggestion) = 2;
+}
\ No newline at end of file
diff --git a/core/java/android/service/settings/suggestions/Suggestion.aidl b/core/java/android/service/settings/suggestions/Suggestion.aidl
new file mode 100644
index 0000000..b26f12c
--- /dev/null
+++ b/core/java/android/service/settings/suggestions/Suggestion.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** @hide */
+package android.service.settings.suggestions;
+
+parcelable Suggestion;
diff --git a/core/java/android/service/settings/suggestions/Suggestion.java b/core/java/android/service/settings/suggestions/Suggestion.java
new file mode 100644
index 0000000..f27cc2e
--- /dev/null
+++ b/core/java/android/service/settings/suggestions/Suggestion.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.settings.suggestions;
+
+import android.annotation.SystemApi;
+import android.app.PendingIntent;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+
+/**
+ * Data object that has information about a device suggestion.
+ *
+ * @hide
+ */
+@SystemApi
+public final class Suggestion implements Parcelable {
+
+ private final String mId;
+ private final CharSequence mTitle;
+ private final CharSequence mSummary;
+ private final PendingIntent mPendingIntent;
+
+ /**
+ * Gets the id for the suggestion object.
+ */
+ public String getId() {
+ return mId;
+ }
+
+ /**
+ * Title of the suggestion that is shown to the user.
+ */
+ public CharSequence getTitle() {
+ return mTitle;
+ }
+
+ /**
+ * Optional summary describing what this suggestion controls.
+ */
+ public CharSequence getSummary() {
+ return mSummary;
+ }
+
+ /**
+ * The Intent to launch when the suggestion is activated.
+ */
+ public PendingIntent getPendingIntent() {
+ return mPendingIntent;
+ }
+
+ private Suggestion(Builder builder) {
+ mId = builder.mId;
+ mTitle = builder.mTitle;
+ mSummary = builder.mSummary;
+ mPendingIntent = builder.mPendingIntent;
+ }
+
+ private Suggestion(Parcel in) {
+ mId = in.readString();
+ mTitle = in.readCharSequence();
+ mSummary = in.readCharSequence();
+ mPendingIntent = in.readParcelable(PendingIntent.class.getClassLoader());
+ }
+
+ public static final Creator<Suggestion> CREATOR = new Creator<Suggestion>() {
+ @Override
+ public Suggestion createFromParcel(Parcel in) {
+ return new Suggestion(in);
+ }
+
+ @Override
+ public Suggestion[] newArray(int size) {
+ return new Suggestion[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mId);
+ dest.writeCharSequence(mTitle);
+ dest.writeCharSequence(mSummary);
+ dest.writeParcelable(mPendingIntent, flags);
+ }
+
+ /**
+ * Builder class for {@link Suggestion}.
+ */
+ public static class Builder {
+ private final String mId;
+ private CharSequence mTitle;
+ private CharSequence mSummary;
+ private PendingIntent mPendingIntent;
+
+ public Builder(String id) {
+ if (TextUtils.isEmpty(id)) {
+ throw new IllegalArgumentException("Suggestion id cannot be empty");
+ }
+ mId = id;
+ }
+
+ /**
+ * Sets suggestion title
+ */
+ public Builder setTitle(CharSequence title) {
+ mTitle = title;
+ return this;
+ }
+
+ /**
+ * Sets suggestion summary
+ */
+ public Builder setSummary(CharSequence summary) {
+ mSummary = summary;
+ return this;
+ }
+
+ /**
+ * Sets suggestion intent
+ */
+ public Builder setPendingIntent(PendingIntent pendingIntent) {
+ mPendingIntent = pendingIntent;
+ return this;
+ }
+
+ /**
+ * Builds an immutable {@link Suggestion} object.
+ */
+ public Suggestion build() {
+ return new Suggestion(this /* builder */);
+ }
+ }
+}
diff --git a/core/java/android/service/settings/suggestions/SuggestionService.java b/core/java/android/service/settings/suggestions/SuggestionService.java
new file mode 100644
index 0000000..2a4c84c
--- /dev/null
+++ b/core/java/android/service/settings/suggestions/SuggestionService.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.settings.suggestions;
+
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * This is the base class for implementing suggestion service. A suggestion service is responsible
+ * to provide a collection of {@link Suggestion}s for the current user when queried.
+ *
+ * @hide
+ */
+@SystemApi
+public abstract class SuggestionService extends Service {
+
+ private static final String TAG = "SuggestionService";
+ private static final boolean DEBUG = false;
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return new ISuggestionService.Stub() {
+ @Override
+ public List<Suggestion> getSuggestions() {
+ if (DEBUG) {
+ Log.d(TAG, "getSuggestions() " + getPackageName());
+ }
+ return onGetSuggestions();
+ }
+
+ @Override
+ public void dismissSuggestion(Suggestion suggestion) {
+ if (DEBUG) {
+ Log.d(TAG, "dismissSuggestion() " + getPackageName());
+ }
+ onSuggestionDismissed(suggestion);
+ }
+ };
+ }
+
+ /**
+ * Return all available suggestions.
+ */
+ public abstract List<Suggestion> onGetSuggestions();
+
+ /**
+ * Dismiss a suggestion. The suggestion will not be included in future
+ * {@link #onGetSuggestions()} calls.
+ * @param suggestion
+ */
+ public abstract void onSuggestionDismissed(Suggestion suggestion);
+}
diff --git a/core/java/android/text/InputType.java b/core/java/android/text/InputType.java
index 8967b70..f38482e 100644
--- a/core/java/android/text/InputType.java
+++ b/core/java/android/text/InputType.java
@@ -182,9 +182,9 @@
* want the IME to correct typos.
* Note the contrast with {@link #TYPE_TEXT_FLAG_AUTO_CORRECT} and
* {@link #TYPE_TEXT_FLAG_AUTO_COMPLETE}:
- * {@code TYPE_TEXT_FLAG_NO_SUGGESTIONS} means the IME should never
+ * {@code TYPE_TEXT_FLAG_NO_SUGGESTIONS} means the IME does not need to
* show an interface to display suggestions. Most IMEs will also take this to
- * mean they should not try to auto-correct what the user is typing.
+ * mean they do not need to try to auto-correct what the user is typing.
*/
public static final int TYPE_TEXT_FLAG_NO_SUGGESTIONS = 0x00080000;
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 62bd6e0..25f791b 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -1704,7 +1704,7 @@
}
private void addSelection(int line, int start, int end,
- int top, int bottom, RectangleConsumer consumer) {
+ int top, int bottom, SelectionRectangleConsumer consumer) {
int linestart = getLineStart(line);
int lineend = getLineEnd(line);
Directions dirs = getLineDirections(line);
@@ -1732,7 +1732,12 @@
float left = Math.min(h1, h2);
float right = Math.max(h1, h2);
- consumer.accept(left, top, right, bottom);
+ final @TextSelectionLayout int layout =
+ ((dirs.mDirections[i + 1] & RUN_RTL_FLAG) != 0)
+ ? TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT
+ : TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT;
+
+ consumer.accept(left, top, right, bottom, layout);
}
}
}
@@ -1746,22 +1751,22 @@
*/
public void getSelectionPath(int start, int end, Path dest) {
dest.reset();
- getSelection(start, end, (left, top, right, bottom) ->
+ getSelection(start, end, (left, top, right, bottom, textSelectionLayout) ->
dest.addRect(left, top, right, bottom, Path.Direction.CW));
}
/**
* Calculates the rectangles which should be highlighted to indicate a selection between start
- * and end and feeds them into the given {@link RectangleConsumer}.
+ * and end and feeds them into the given {@link SelectionRectangleConsumer}.
*
* @param start the starting index of the selection
* @param end the ending index of the selection
- * @param consumer the {@link RectangleConsumer} which will receive the generated rectangles. It
- * will be called every time a rectangle is generated.
+ * @param consumer the {@link SelectionRectangleConsumer} which will receive the generated
+ * rectangles. It will be called every time a rectangle is generated.
* @hide
* @see #getSelectionPath(int, int, Path)
*/
- public final void getSelection(int start, int end, final RectangleConsumer consumer) {
+ public final void getSelection(int start, int end, final SelectionRectangleConsumer consumer) {
if (start == end) {
return;
}
@@ -1787,15 +1792,21 @@
top, getLineBottom(startline), consumer);
if (getParagraphDirection(startline) == DIR_RIGHT_TO_LEFT) {
- consumer.accept(getLineLeft(startline), top, 0, getLineBottom(startline));
+ consumer.accept(getLineLeft(startline), top, 0, getLineBottom(startline),
+ TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT);
} else {
- consumer.accept(getLineRight(startline), top, width, getLineBottom(startline));
+ consumer.accept(getLineRight(startline), top, width, getLineBottom(startline),
+ TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT);
}
for (int i = startline + 1; i < endline; i++) {
top = getLineTop(i);
bottom = getLineBottom(i);
- consumer.accept(0, top, width, bottom);
+ if (getParagraphDirection(i) == DIR_RIGHT_TO_LEFT) {
+ consumer.accept(0, top, width, bottom, TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT);
+ } else {
+ consumer.accept(0, top, width, bottom, TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT);
+ }
}
top = getLineTop(endline);
@@ -1804,9 +1815,11 @@
addSelection(endline, getLineStart(endline), end, top, bottom, consumer);
if (getParagraphDirection(endline) == DIR_RIGHT_TO_LEFT) {
- consumer.accept(width, top, getLineRight(endline), bottom);
+ consumer.accept(width, top, getLineRight(endline), bottom,
+ TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT);
} else {
- consumer.accept(0, top, getLineLeft(endline), bottom);
+ consumer.accept(0, top, getLineLeft(endline), bottom,
+ TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT);
}
}
}
@@ -2310,8 +2323,18 @@
new Directions(new int[] { 0, RUN_LENGTH_MASK | RUN_RTL_FLAG });
/** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT, TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT})
+ public @interface TextSelectionLayout {}
+
+ /** @hide */
+ public static final int TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT = 0;
+ /** @hide */
+ public static final int TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT = 1;
+
+ /** @hide */
@FunctionalInterface
- public interface RectangleConsumer {
+ public interface SelectionRectangleConsumer {
/**
* Performs this operation on the given rectangle.
*
@@ -2319,8 +2342,11 @@
* @param top the top edge of the rectangle
* @param right the right edge of the rectangle
* @param bottom the bottom edge of the rectangle
+ * @param textSelectionLayout the layout (RTL or LTR) of the text covered by this
+ * selection rectangle
*/
- void accept(float left, float top, float right, float bottom);
+ void accept(float left, float top, float right, float bottom,
+ @TextSelectionLayout int textSelectionLayout);
}
}
diff --git a/core/java/android/util/TimingsTraceLog.java b/core/java/android/util/TimingsTraceLog.java
index 36e9f77..3e6f09b 100644
--- a/core/java/android/util/TimingsTraceLog.java
+++ b/core/java/android/util/TimingsTraceLog.java
@@ -25,6 +25,7 @@
/**
* Helper class for reporting boot and shutdown timing metrics.
+ * <p>Note: This class is not thread-safe. Use a separate copy for other threads</p>
* @hide
*/
public class TimingsTraceLog {
@@ -34,10 +35,12 @@
DEBUG_BOOT_TIME ? new ArrayDeque<>() : null;
private final String mTag;
private long mTraceTag;
+ private long mThreadId;
public TimingsTraceLog(String tag, long traceTag) {
mTag = tag;
mTraceTag = traceTag;
+ mThreadId = Thread.currentThread().getId();
}
/**
@@ -45,6 +48,7 @@
* @param name name to appear in trace
*/
public void traceBegin(String name) {
+ assertSameThread();
Trace.traceBegin(mTraceTag, name);
if (DEBUG_BOOT_TIME) {
mStartTimes.push(Pair.create(name, SystemClock.elapsedRealtime()));
@@ -56,6 +60,7 @@
* Also {@link #logDuration logs} the duration.
*/
public void traceEnd() {
+ assertSameThread();
Trace.traceEnd(mTraceTag);
if (!DEBUG_BOOT_TIME) {
return;
@@ -68,6 +73,15 @@
logDuration(event.first, (SystemClock.elapsedRealtime() - event.second));
}
+ private void assertSameThread() {
+ final Thread currentThread = Thread.currentThread();
+ if (currentThread.getId() != mThreadId) {
+ throw new IllegalStateException("Instance of TimingsTraceLog can only be called from "
+ + "the thread it was created on (tid: " + mThreadId + "), but was from "
+ + currentThread.getName() + " (tid: " + currentThread.getId() + ")");
+ }
+ }
+
/**
* Log the duration so it can be parsed by external tools for performance reporting
*/
diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java
index af26a88..74555de 100644
--- a/core/java/android/view/FocusFinder.java
+++ b/core/java/android/view/FocusFinder.java
@@ -574,10 +574,10 @@
switch (direction) {
case View.FOCUS_LEFT:
case View.FOCUS_RIGHT:
- return (rect2.bottom >= rect1.top) && (rect2.top <= rect1.bottom);
+ return (rect2.bottom > rect1.top) && (rect2.top < rect1.bottom);
case View.FOCUS_UP:
case View.FOCUS_DOWN:
- return (rect2.right >= rect1.left) && (rect2.left <= rect1.right);
+ return (rect2.right > rect1.left) && (rect2.left < rect1.right);
}
throw new IllegalArgumentException("direction must be one of "
+ "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index 829b2b7..a2147b7 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -804,8 +804,11 @@
public static final int KEYCODE_SYSTEM_NAVIGATION_LEFT = 282;
/** Key code constant: Consumed by the system for navigation right */
public static final int KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283;
+ /** Key code constant: Show all apps
+ * @hide */
+ public static final int KEYCODE_ALL_APPS = 284;
- private static final int LAST_KEYCODE = KEYCODE_SYSTEM_NAVIGATION_RIGHT;
+ private static final int LAST_KEYCODE = KEYCODE_ALL_APPS;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 1d206ab..cac27af 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -16,6 +16,7 @@
package android.view;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
import static android.view.WindowManagerPolicy.APPLICATION_MEDIA_OVERLAY_SUBLAYER;
import static android.view.WindowManagerPolicy.APPLICATION_MEDIA_SUBLAYER;
import static android.view.WindowManagerPolicy.APPLICATION_PANEL_SUBLAYER;
@@ -871,6 +872,31 @@
return callbacks;
}
+ /**
+ * This method still exists only for compatibility reasons because some applications have relied
+ * on this method via reflection. See Issue 36345857 for details.
+ *
+ * @deprecated No platform code is using this method anymore.
+ * @hide
+ */
+ @Deprecated
+ public void setWindowType(int type) {
+ if (getContext().getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
+ throw new UnsupportedOperationException(
+ "SurfaceView#setWindowType() has never been a public API.");
+ }
+
+ if (type == TYPE_APPLICATION_PANEL) {
+ Log.e(TAG, "If you are calling SurfaceView#setWindowType(TYPE_APPLICATION_PANEL) "
+ + "just to make the SurfaceView to be placed on top of its window, you must "
+ + "call setZOrderOnTop(true) instead.", new Throwable());
+ setZOrderOnTop(true);
+ return;
+ }
+ Log.e(TAG, "SurfaceView#setWindowType(int) is deprecated and now does nothing. "
+ + "type=" + type, new Throwable());
+ }
+
private void runOnUiThread(Runnable runnable) {
Handler handler = getHandler();
if (handler != null && handler.getLooper() != Looper.myLooper()) {
diff --git a/core/java/android/view/inputmethod/ExtractedText.java b/core/java/android/view/inputmethod/ExtractedText.java
index 0c5d9e9..003f221 100644
--- a/core/java/android/view/inputmethod/ExtractedText.java
+++ b/core/java/android/view/inputmethod/ExtractedText.java
@@ -87,6 +87,11 @@
public int flags;
/**
+ * The hint that has been extracted.
+ */
+ public CharSequence hint;
+
+ /**
* Used to package this object into a {@link Parcel}.
*
* @param dest The {@link Parcel} to be written.
@@ -100,6 +105,7 @@
dest.writeInt(selectionStart);
dest.writeInt(selectionEnd);
dest.writeInt(this.flags);
+ TextUtils.writeToParcel(hint, dest, flags);
}
/**
@@ -107,17 +113,18 @@
*/
public static final Parcelable.Creator<ExtractedText> CREATOR
= new Parcelable.Creator<ExtractedText>() {
- public ExtractedText createFromParcel(Parcel source) {
- ExtractedText res = new ExtractedText();
- res.text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
- res.startOffset = source.readInt();
- res.partialStartOffset = source.readInt();
- res.partialEndOffset = source.readInt();
- res.selectionStart = source.readInt();
- res.selectionEnd = source.readInt();
- res.flags = source.readInt();
- return res;
- }
+ public ExtractedText createFromParcel(Parcel source) {
+ ExtractedText res = new ExtractedText();
+ res.text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
+ res.startOffset = source.readInt();
+ res.partialStartOffset = source.readInt();
+ res.partialEndOffset = source.readInt();
+ res.selectionStart = source.readInt();
+ res.selectionEnd = source.readInt();
+ res.flags = source.readInt();
+ res.hint = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
+ return res;
+ }
public ExtractedText[] newArray(int size) {
return new ExtractedText[size];
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index fa7b9a5..1849368 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -261,7 +261,7 @@
* @hide
*/
Builder setVersionInfo(@NonNull String versionInfo) {
- mVersionInfo = Preconditions.checkNotNull(mVersionInfo);
+ mVersionInfo = Preconditions.checkNotNull(versionInfo);
return this;
}
diff --git a/core/java/android/view/textclassifier/TextSelection.java b/core/java/android/view/textclassifier/TextSelection.java
index 085dd32..11ebe83 100644
--- a/core/java/android/view/textclassifier/TextSelection.java
+++ b/core/java/android/view/textclassifier/TextSelection.java
@@ -169,7 +169,7 @@
* @hide
*/
Builder setVersionInfo(@NonNull String versionInfo) {
- mVersionInfo = Preconditions.checkNotNull(mVersionInfo);
+ mVersionInfo = Preconditions.checkNotNull(versionInfo);
return this;
}
diff --git a/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java b/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
index 45baf91..8d88ba6 100644
--- a/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
+++ b/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
@@ -42,17 +42,16 @@
//TODO: Do not allow any crashes from this class.
public final class SmartSelectionEventTracker {
- private static final String LOG_TAG = "SmartSelectionEventTracker";
+ private static final String LOG_TAG = "SmartSelectEventTracker";
private static final boolean DEBUG_LOG_ENABLED = true;
- private static final int START_EVENT_DELTA = MetricsEvent.NOTIFICATION_SINCE_CREATE_MILLIS;
- private static final int PREV_EVENT_DELTA = MetricsEvent.NOTIFICATION_SINCE_UPDATE_MILLIS;
- private static final int ENTITY_TYPE = MetricsEvent.NOTIFICATION_TAG;
- private static final int INDEX = MetricsEvent.NOTIFICATION_SHADE_INDEX;
- private static final int TAG = MetricsEvent.FIELD_CLASS_NAME;
- private static final int SMART_INDICES = MetricsEvent.FIELD_GESTURE_LENGTH;
- private static final int EVENT_INDICES = MetricsEvent.FIELD_CONTEXT;
- private static final int SESSION_ID = MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN;
+ private static final int START_EVENT_DELTA = MetricsEvent.FIELD_SELECTION_SINCE_START;
+ private static final int PREV_EVENT_DELTA = MetricsEvent.FIELD_SELECTION_SINCE_PREVIOUS;
+ private static final int INDEX = MetricsEvent.FIELD_SELECTION_SESSION_INDEX;
+ private static final int VERSION_TAG = MetricsEvent.FIELD_SELECTION_VERSION_TAG;
+ private static final int SMART_INDICES = MetricsEvent.FIELD_SELECTION_SMART_RANGE;
+ private static final int EVENT_INDICES = MetricsEvent.FIELD_SELECTION_RANGE;
+ private static final int SESSION_ID = MetricsEvent.FIELD_SELECTION_SESSION_ID;
private static final String ZERO = "0";
private static final String TEXTVIEW = "textview";
@@ -84,6 +83,7 @@
private long mSessionStartTime;
private long mLastEventTime;
private boolean mSmartSelectionTriggered;
+ private String mVersionTag;
public SmartSelectionEventTracker(@NonNull Context context, @WidgetType int widgetType) {
mWidgetType = widgetType;
@@ -98,7 +98,8 @@
public void logEvent(@NonNull SelectionEvent event) {
Preconditions.checkNotNull(event);
- if (event.mEventType != SelectionEvent.EventType.SELECTION_STARTED && mSessionId == null) {
+ if (event.mEventType != SelectionEvent.EventType.SELECTION_STARTED && mSessionId == null
+ && DEBUG_LOG_ENABLED) {
Log.d(LOG_TAG, "Selection session not yet started. Ignoring event");
return;
}
@@ -114,6 +115,7 @@
case SelectionEvent.EventType.SMART_SELECTION_SINGLE: // fall through
case SelectionEvent.EventType.SMART_SELECTION_MULTI:
mSmartSelectionTriggered = true;
+ mVersionTag = getVersionTag(event);
mSmartIndices[0] = event.mStart;
mSmartIndices[1] = event.mEnd;
break;
@@ -132,16 +134,15 @@
}
private void writeEvent(SelectionEvent event, long now) {
- final LogMaker log = new LogMaker(MetricsEvent.TEXT_SELECTION_MENU_ITEM_ASSIST)
+ final long prevEventDelta = mLastEventTime == 0 ? 0 : now - mLastEventTime;
+ final LogMaker log = new LogMaker(MetricsEvent.TEXT_SELECTION_SESSION)
.setType(getLogType(event))
- .setSubtype(event.mEventType)
+ .setSubtype(getLogSubType(event))
.setPackageName(mContext.getPackageName())
- .setTimestamp(now)
.addTaggedData(START_EVENT_DELTA, now - mSessionStartTime)
- .addTaggedData(PREV_EVENT_DELTA, now - mLastEventTime)
- .addTaggedData(ENTITY_TYPE, event.mEntityType)
+ .addTaggedData(PREV_EVENT_DELTA, prevEventDelta)
.addTaggedData(INDEX, mIndex)
- .addTaggedData(TAG, getTag(event))
+ .addTaggedData(VERSION_TAG, mVersionTag)
.addTaggedData(SMART_INDICES, getSmartDelta())
.addTaggedData(EVENT_INDICES, getEventDelta(event))
.addTaggedData(SESSION_ID, mSessionId);
@@ -168,42 +169,120 @@
mSessionStartTime = 0;
mLastEventTime = 0;
mSmartSelectionTriggered = false;
+ mVersionTag = getVersionTag(null);
mSessionId = null;
}
- private int getLogType(SelectionEvent event) {
+ private static int getLogType(SelectionEvent event) {
switch (event.mEventType) {
- case SelectionEvent.EventType.SELECTION_STARTED: // fall through
- case SelectionEvent.EventType.SMART_SELECTION_SINGLE: // fall through
- case SelectionEvent.EventType.SMART_SELECTION_MULTI: // fall through
- case SelectionEvent.EventType.AUTO_SELECTION:
- return MetricsEvent.TYPE_OPEN;
+ case SelectionEvent.ActionType.OVERTYPE:
+ return MetricsEvent.ACTION_TEXT_SELECTION_OVERTYPE;
+ case SelectionEvent.ActionType.COPY:
+ return MetricsEvent.ACTION_TEXT_SELECTION_COPY;
+ case SelectionEvent.ActionType.PASTE:
+ return MetricsEvent.ACTION_TEXT_SELECTION_PASTE;
+ case SelectionEvent.ActionType.CUT:
+ return MetricsEvent.ACTION_TEXT_SELECTION_CUT;
+ case SelectionEvent.ActionType.SHARE:
+ return MetricsEvent.ACTION_TEXT_SELECTION_SHARE;
+ case SelectionEvent.ActionType.SMART_SHARE:
+ return MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE;
+ case SelectionEvent.ActionType.DRAG:
+ return MetricsEvent.ACTION_TEXT_SELECTION_DRAG;
case SelectionEvent.ActionType.ABANDON:
- return MetricsEvent.TYPE_CLOSE;
- }
- if (event.isActionType()) {
- if (event.isTerminal() && mSmartSelectionTriggered) {
- if (matchesSmartSelectionBounds(event)) {
- // Smart selection accepted.
- return MetricsEvent.TYPE_SUCCESS;
- } else if (containsOriginalSelection(event)) {
- // Smart selection rejected.
- return MetricsEvent.TYPE_FAILURE;
- }
- // User changed the original selection entirely.
- }
- return MetricsEvent.TYPE_ACTION;
- } else {
- return MetricsEvent.TYPE_UPDATE;
+ return MetricsEvent.ACTION_TEXT_SELECTION_ABANDON;
+ case SelectionEvent.ActionType.OTHER:
+ return MetricsEvent.ACTION_TEXT_SELECTION_OTHER;
+ case SelectionEvent.ActionType.SELECT_ALL:
+ return MetricsEvent.ACTION_TEXT_SELECTION_SELECT_ALL;
+ case SelectionEvent.ActionType.RESET:
+ return MetricsEvent.ACTION_TEXT_SELECTION_RESET;
+ case SelectionEvent.EventType.SELECTION_STARTED:
+ return MetricsEvent.ACTION_TEXT_SELECTION_START;
+ case SelectionEvent.EventType.SELECTION_MODIFIED:
+ return MetricsEvent.ACTION_TEXT_SELECTION_MODIFY;
+ case SelectionEvent.EventType.SMART_SELECTION_SINGLE:
+ return MetricsEvent.ACTION_TEXT_SELECTION_SMART_SINGLE;
+ case SelectionEvent.EventType.SMART_SELECTION_MULTI:
+ return MetricsEvent.ACTION_TEXT_SELECTION_SMART_MULTI;
+ case SelectionEvent.EventType.AUTO_SELECTION:
+ return MetricsEvent.ACTION_TEXT_SELECTION_AUTO;
+ default:
+ return MetricsEvent.VIEW_UNKNOWN;
}
}
- private boolean matchesSmartSelectionBounds(SelectionEvent event) {
- return event.mStart == mSmartIndices[0] && event.mEnd == mSmartIndices[1];
+ private static String getLogTypeString(int logType) {
+ switch (logType) {
+ case MetricsEvent.ACTION_TEXT_SELECTION_OVERTYPE:
+ return "OVERTYPE";
+ case MetricsEvent.ACTION_TEXT_SELECTION_COPY:
+ return "COPY";
+ case MetricsEvent.ACTION_TEXT_SELECTION_PASTE:
+ return "PASTE";
+ case MetricsEvent.ACTION_TEXT_SELECTION_CUT:
+ return "CUT";
+ case MetricsEvent.ACTION_TEXT_SELECTION_SHARE:
+ return "SHARE";
+ case MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE:
+ return "SMART_SHARE";
+ case MetricsEvent.ACTION_TEXT_SELECTION_DRAG:
+ return "DRAG";
+ case MetricsEvent.ACTION_TEXT_SELECTION_ABANDON:
+ return "ABANDON";
+ case MetricsEvent.ACTION_TEXT_SELECTION_OTHER:
+ return "OTHER";
+ case MetricsEvent.ACTION_TEXT_SELECTION_SELECT_ALL:
+ return "SELECT_ALL";
+ case MetricsEvent.ACTION_TEXT_SELECTION_RESET:
+ return "RESET";
+ case MetricsEvent.ACTION_TEXT_SELECTION_START:
+ return "SELECTION_STARTED";
+ case MetricsEvent.ACTION_TEXT_SELECTION_MODIFY:
+ return "SELECTION_MODIFIED";
+ case MetricsEvent.ACTION_TEXT_SELECTION_SMART_SINGLE:
+ return "SMART_SELECTION_SINGLE";
+ case MetricsEvent.ACTION_TEXT_SELECTION_SMART_MULTI:
+ return "SMART_SELECTION_MULTI";
+ case MetricsEvent.ACTION_TEXT_SELECTION_AUTO:
+ return "AUTO_SELECTION";
+ default:
+ return UNKNOWN;
+ }
}
- private boolean containsOriginalSelection(SelectionEvent event) {
- return event.mStart <= mOrigStart && event.mEnd > mOrigStart;
+ private static int getLogSubType(SelectionEvent event) {
+ switch (event.mEntityType) {
+ case TextClassifier.TYPE_OTHER:
+ return MetricsEvent.TEXT_CLASSIFIER_TYPE_OTHER;
+ case TextClassifier.TYPE_EMAIL:
+ return MetricsEvent.TEXT_CLASSIFIER_TYPE_EMAIL;
+ case TextClassifier.TYPE_PHONE:
+ return MetricsEvent.TEXT_CLASSIFIER_TYPE_PHONE;
+ case TextClassifier.TYPE_ADDRESS:
+ return MetricsEvent.TEXT_CLASSIFIER_TYPE_ADDRESS;
+ case TextClassifier.TYPE_URL:
+ return MetricsEvent.TEXT_CLASSIFIER_TYPE_URL;
+ default:
+ return MetricsEvent.TEXT_CLASSIFIER_TYPE_UNKNOWN;
+ }
+ }
+
+ private static String getLogSubTypeString(int logSubType) {
+ switch (logSubType) {
+ case MetricsEvent.TEXT_CLASSIFIER_TYPE_OTHER:
+ return TextClassifier.TYPE_OTHER;
+ case MetricsEvent.TEXT_CLASSIFIER_TYPE_EMAIL:
+ return TextClassifier.TYPE_EMAIL;
+ case MetricsEvent.TEXT_CLASSIFIER_TYPE_PHONE:
+ return TextClassifier.TYPE_PHONE;
+ case MetricsEvent.TEXT_CLASSIFIER_TYPE_ADDRESS:
+ return TextClassifier.TYPE_ADDRESS;
+ case MetricsEvent.TEXT_CLASSIFIER_TYPE_URL:
+ return TextClassifier.TYPE_URL;
+ default:
+ return TextClassifier.TYPE_UNKNOWN;
+ }
}
private int getSmartDelta() {
@@ -211,8 +290,9 @@
return (clamp(mSmartIndices[0] - mOrigStart) << 16)
| (clamp(mSmartIndices[1] - mOrigStart) & 0xffff);
}
- // If no smart selection, return start selection indices (i.e. [0, 1])
- return /* (0 << 16) | */ (1 & 0xffff);
+ // If the smart selection model was not run, return invalid selection indices [0,0]. This
+ // allows us to tell from the terminal event alone whether the model was run.
+ return 0;
}
private int getEventDelta(SelectionEvent event) {
@@ -220,7 +300,7 @@
| (clamp(event.mEnd - mOrigStart) & 0xffff);
}
- private String getTag(SelectionEvent event) {
+ private String getVersionTag(@Nullable SelectionEvent event) {
final String widgetType;
switch (mWidgetType) {
case WidgetType.TEXTVIEW:
@@ -238,7 +318,9 @@
default:
widgetType = UNKNOWN;
}
- final String version = Objects.toString(event.mVersionTag, SelectionEvent.NO_VERSION_TAG);
+ final String version = event == null
+ ? SelectionEvent.NO_VERSION_TAG
+ : Objects.toString(event.mVersionTag, SelectionEvent.NO_VERSION_TAG);
return String.format("%s/%s", widgetType, version);
}
@@ -253,66 +335,17 @@
private static void debugLog(LogMaker log) {
if (!DEBUG_LOG_ENABLED) return;
+ final String tag = Objects.toString(log.getTaggedData(VERSION_TAG), "tag");
final int index = Integer.parseInt(Objects.toString(log.getTaggedData(INDEX), ZERO));
-
- final String event;
- switch (log.getSubtype()) {
- case SelectionEvent.ActionType.OVERTYPE:
- event = "OVERTYPE";
- break;
- case SelectionEvent.ActionType.COPY:
- event = "COPY";
- break;
- case SelectionEvent.ActionType.PASTE:
- event = "PASTE";
- break;
- case SelectionEvent.ActionType.CUT:
- event = "CUT";
- break;
- case SelectionEvent.ActionType.SHARE:
- event = "SHARE";
- break;
- case SelectionEvent.ActionType.SMART_SHARE:
- event = "SMART_SHARE";
- break;
- case SelectionEvent.ActionType.DRAG:
- event = "DRAG";
- break;
- case SelectionEvent.ActionType.ABANDON:
- event = "ABANDON";
- break;
- case SelectionEvent.ActionType.OTHER:
- event = "OTHER";
- break;
- case SelectionEvent.ActionType.SELECT_ALL:
- event = "SELECT_ALL";
- break;
- case SelectionEvent.ActionType.RESET:
- event = "RESET";
- break;
- case SelectionEvent.EventType.SELECTION_STARTED:
- final String tag = Objects.toString(log.getTaggedData(TAG), "tag");
- String sessionId = Objects.toString(log.getTaggedData(SESSION_ID), "");
- sessionId = sessionId.substring(sessionId.lastIndexOf("-") + 1);
- Log.d(LOG_TAG, String.format("New selection session: %s(%s)", tag, sessionId));
- event = "SELECTION_STARTED";
- break;
- case SelectionEvent.EventType.SELECTION_MODIFIED:
- event = "SELECTION_MODIFIED";
- break;
- case SelectionEvent.EventType.SMART_SELECTION_SINGLE:
- event = "SMART_SELECTION_SINGLE";
- break;
- case SelectionEvent.EventType.SMART_SELECTION_MULTI:
- event = "SMART_SELECTION_MULTI";
- break;
- case SelectionEvent.EventType.AUTO_SELECTION:
- event = "AUTO_SELECTION";
- break;
- default:
- event = "UNKNOWN";
+ if (log.getType() == MetricsEvent.ACTION_TEXT_SELECTION_START) {
+ String sessionId = Objects.toString(log.getTaggedData(SESSION_ID), "");
+ sessionId = sessionId.substring(sessionId.lastIndexOf("-") + 1);
+ Log.d(LOG_TAG, String.format("New selection session: %s(%s)", tag, sessionId));
}
+ final String type = getLogTypeString(log.getType());
+ final String subType = getLogSubTypeString(log.getSubtype());
+
final int smartIndices = Integer.parseInt(
Objects.toString(log.getTaggedData(SMART_INDICES), ZERO));
final int smartStart = (short) ((smartIndices & 0xffff0000) >> 16);
@@ -323,11 +356,8 @@
final int eventStart = (short) ((eventIndices & 0xffff0000) >> 16);
final int eventEnd = (short) (eventIndices & 0xffff);
- final String entity = Objects.toString(
- log.getTaggedData(ENTITY_TYPE), TextClassifier.TYPE_UNKNOWN);
-
- Log.d(LOG_TAG, String.format("%2d: %s, context=%d,%d - old=%d,%d [%s]",
- index, event, eventStart, eventEnd, smartStart, smartEnd, entity));
+ Log.d(LOG_TAG, String.format("%2d: %s/%s, context=%d,%d - old=%d,%d (%s)",
+ index, type, subType, eventStart, eventEnd, smartStart, smartEnd, tag));
}
/**
diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java
index 45e6eb3..b839420 100644
--- a/core/java/android/webkit/CacheManager.java
+++ b/core/java/android/webkit/CacheManager.java
@@ -230,7 +230,7 @@
* {@link CacheManager.CacheResult#getLocalPath CacheManager.CacheResult.getLocalPath()}.
*
* @return the base directory of the cache
- * @deprecated This method no longer has any effect and always returns null.
+ * @deprecated This method no longer has any effect and always returns {@code null}.
*/
@Deprecated
public static File getCacheFileBaseDir() {
@@ -240,8 +240,8 @@
/**
* Gets whether the HTTP cache is disabled.
*
- * @return true if the HTTP cache is disabled
- * @deprecated This method no longer has any effect and always returns false.
+ * @return {@code true} if the HTTP cache is disabled
+ * @deprecated This method no longer has any effect and always returns {@code false}.
*/
@Deprecated
public static boolean cacheDisabled() {
@@ -249,12 +249,12 @@
}
/**
- * Starts a cache transaction. Returns true if this is the only running
+ * Starts a cache transaction. Returns {@code true} if this is the only running
* transaction. Otherwise, this transaction is nested inside currently
- * running transactions and false is returned.
+ * running transactions and {@code false} is returned.
*
- * @return true if this is the only running transaction
- * @deprecated This method no longer has any effect and always returns false.
+ * @return {@code true} if this is the only running transaction
+ * @deprecated This method no longer has any effect and always returns {@code false}.
*/
@Deprecated
public static boolean startCacheTransaction() {
@@ -265,8 +265,8 @@
* Ends the innermost cache transaction and returns whether this was the
* only running transaction.
*
- * @return true if this was the only running transaction
- * @deprecated This method no longer has any effect and always returns false.
+ * @return {@code true} if this was the only running transaction
+ * @deprecated This method no longer has any effect and always returns {@code false}.
*/
@Deprecated
public static boolean endCacheTransaction() {
@@ -274,7 +274,7 @@
}
/**
- * Gets the cache entry for the specified URL, or null if none is found.
+ * Gets the cache entry for the specified URL, or {@code null} if none is found.
* If a non-null value is provided for the HTTP headers map, and the cache
* entry needs validation, appropriate headers will be added to the map.
* The input stream of the CacheEntry object should be closed by the caller
@@ -284,7 +284,7 @@
* @param headers a map from HTTP header name to value, to be populated
* for the returned cache entry
* @return the cache entry for the specified URL
- * @deprecated This method no longer has any effect and always returns null.
+ * @deprecated This method no longer has any effect and always returns {@code null}.
*/
@Deprecated
public static CacheResult getCacheFile(String url,
diff --git a/core/java/android/webkit/ClientCertRequest.java b/core/java/android/webkit/ClientCertRequest.java
index 4a7f5fd..de17534 100644
--- a/core/java/android/webkit/ClientCertRequest.java
+++ b/core/java/android/webkit/ClientCertRequest.java
@@ -42,13 +42,13 @@
public ClientCertRequest() { }
/**
- * Returns the acceptable types of asymmetric keys (can be null).
+ * Returns the acceptable types of asymmetric keys (can be {@code null}).
*/
public abstract String[] getKeyTypes();
/**
* Returns the acceptable certificate issuers for the certificate
- * matching the private key (can be null).
+ * matching the private key (can be {@code null}).
*/
public abstract Principal[] getPrincipals();
diff --git a/core/java/android/webkit/CookieManager.java b/core/java/android/webkit/CookieManager.java
index 67289c2..8989293 100644
--- a/core/java/android/webkit/CookieManager.java
+++ b/core/java/android/webkit/CookieManager.java
@@ -42,9 +42,9 @@
/**
* Sets whether the application's {@link WebView} instances should send and
* accept cookies.
- * By default this is set to true and the WebView accepts cookies.
+ * By default this is set to {@code true} and the WebView accepts cookies.
* <p>
- * When this is true
+ * When this is {@code true}
* {@link CookieManager#setAcceptThirdPartyCookies setAcceptThirdPartyCookies} and
* {@link CookieManager#setAcceptFileSchemeCookies setAcceptFileSchemeCookies}
* can be used to control the policy for those specific types of cookie.
@@ -58,7 +58,7 @@
* Gets whether the application's {@link WebView} instances send and accept
* cookies.
*
- * @return true if {@link WebView} instances send and accept cookies
+ * @return {@code true} if {@link WebView} instances send and accept cookies
*/
public abstract boolean acceptCookie();
@@ -82,7 +82,7 @@
* Gets whether the {@link WebView} should allow third party cookies to be set.
*
* @param webview the {@link WebView} instance to get the cookie policy for
- * @return true if the {@link WebView} accepts third party cookies
+ * @return {@code true} if the {@link WebView} accepts third party cookies
*/
public abstract boolean acceptThirdPartyCookies(WebView webview);
@@ -202,7 +202,7 @@
/**
* Gets whether there are stored cookies.
*
- * @return true if there are stored cookies
+ * @return {@code true} if there are stored cookies
*/
public abstract boolean hasCookies();
@@ -233,7 +233,7 @@
* Gets whether the application's {@link WebView} instances send and accept
* cookies for file scheme URLs.
*
- * @return true if {@link WebView} instances send and accept cookies for
+ * @return {@code true} if {@link WebView} instances send and accept cookies for
* file scheme URLs
*/
// Static for backward compatibility.
diff --git a/core/java/android/webkit/FindActionModeCallback.java b/core/java/android/webkit/FindActionModeCallback.java
index f313893..71f85d7 100644
--- a/core/java/android/webkit/FindActionModeCallback.java
+++ b/core/java/android/webkit/FindActionModeCallback.java
@@ -109,8 +109,8 @@
/*
* Move the highlight to the next match.
- * @param next If true, find the next match further down in the document.
- * If false, find the previous match, up in the document.
+ * @param next If {@code true}, find the next match further down in the document.
+ * If {@code false}, find the previous match, up in the document.
*/
private void findNext(boolean next) {
if (mWebView == null) {
diff --git a/core/java/android/webkit/MimeTypeMap.java b/core/java/android/webkit/MimeTypeMap.java
index da8901a..e172c02 100644
--- a/core/java/android/webkit/MimeTypeMap.java
+++ b/core/java/android/webkit/MimeTypeMap.java
@@ -17,9 +17,11 @@
package android.webkit;
import android.text.TextUtils;
-import java.util.regex.Pattern;
+
import libcore.net.MimeUtils;
+import java.util.regex.Pattern;
+
/**
* Two-way map that maps MIME-types to file extensions and vice versa.
*
@@ -71,9 +73,9 @@
}
/**
- * Return true if the given MIME type has an entry in the map.
+ * Return {@code true} if the given MIME type has an entry in the map.
* @param mimeType A MIME type (i.e. text/plain)
- * @return True iff there is a mimeType entry in the map.
+ * @return {@code true} iff there is a mimeType entry in the map.
*/
public boolean hasMimeType(String mimeType) {
return MimeUtils.hasMimeType(mimeType);
@@ -82,7 +84,7 @@
/**
* Return the MIME type for the given extension.
* @param extension A file extension without the leading '.'
- * @return The MIME type for the given extension or null iff there is none.
+ * @return The MIME type for the given extension or {@code null} iff there is none.
*/
public String getMimeTypeFromExtension(String extension) {
return MimeUtils.guessMimeTypeFromExtension(extension);
@@ -94,9 +96,9 @@
}
/**
- * Return true if the given extension has a registered MIME type.
+ * Return {@code true} if the given extension has a registered MIME type.
* @param extension A file extension without the leading '.'
- * @return True iff there is an extension entry in the map.
+ * @return {@code true} iff there is an extension entry in the map.
*/
public boolean hasExtension(String extension) {
return MimeUtils.hasExtension(extension);
@@ -107,14 +109,14 @@
* MIME types map to multiple extensions. This call will return the most
* common extension for the given MIME type.
* @param mimeType A MIME type (i.e. text/plain)
- * @return The extension for the given MIME type or null iff there is none.
+ * @return The extension for the given MIME type or {@code null} iff there is none.
*/
public String getExtensionFromMimeType(String mimeType) {
return MimeUtils.guessExtensionFromMimeType(mimeType);
}
/**
- * If the given MIME type is null, or one of the "generic" types (text/plain
+ * If the given MIME type is {@code null}, or one of the "generic" types (text/plain
* or application/octet-stream) map it to a type that Android can deal with.
* If the given type is not generic, return it unchanged.
*
diff --git a/core/java/android/webkit/RenderProcessGoneDetail.java b/core/java/android/webkit/RenderProcessGoneDetail.java
index 1c79399..0843e26 100644
--- a/core/java/android/webkit/RenderProcessGoneDetail.java
+++ b/core/java/android/webkit/RenderProcessGoneDetail.java
@@ -28,7 +28,7 @@
* If the render process was killed, this is most likely caused by the
* system being low on memory.
*
- * @return True if render process crashed, otherwise it was killed by
+ * @return {@code true} if render process crashed, otherwise it was killed by
* system.
**/
public abstract boolean didCrash();
diff --git a/core/java/android/webkit/SafeBrowsingResponse.java b/core/java/android/webkit/SafeBrowsingResponse.java
index 0d0f1cc..1d3a617 100644
--- a/core/java/android/webkit/SafeBrowsingResponse.java
+++ b/core/java/android/webkit/SafeBrowsingResponse.java
@@ -25,28 +25,27 @@
* <p>
* If reporting is enabled, all reports will be sent according to the privacy policy referenced by
* {@link android.webkit.WebView#getSafeBrowsingPrivacyPolicyUrl()}.
- * </p>
*/
public abstract class SafeBrowsingResponse {
/**
* Display the default interstitial.
*
- * @param allowReporting True if the interstitial should show a reporting checkbox.
+ * @param allowReporting {@code true} if the interstitial should show a reporting checkbox.
*/
public abstract void showInterstitial(boolean allowReporting);
/**
* Act as if the user clicked "visit this unsafe site."
*
- * @param report True to enable Safe Browsing reporting.
+ * @param report {@code true} to enable Safe Browsing reporting.
*/
public abstract void proceed(boolean report);
/**
* Act as if the user clicked "back to safety."
*
- * @param report True to enable Safe Browsing reporting.
+ * @param report {@code true} to enable Safe Browsing reporting.
*/
public abstract void backToSafety(boolean report);
}
diff --git a/core/java/android/webkit/ServiceWorkerClient.java b/core/java/android/webkit/ServiceWorkerClient.java
index 2334055..b4964fd 100644
--- a/core/java/android/webkit/ServiceWorkerClient.java
+++ b/core/java/android/webkit/ServiceWorkerClient.java
@@ -24,7 +24,7 @@
/**
* Notify the host application of a resource request and allow the
- * application to return the data. If the return value is null, the
+ * application to return the data. If the return value is {@code null}, the
* Service Worker will continue to load the resource as usual.
* Otherwise, the return response and data will be used.
* NOTE: This method is called on a thread other than the UI thread
@@ -33,7 +33,7 @@
*
* @param request Object containing the details of the request.
* @return A {@link android.webkit.WebResourceResponse} containing the
- * response information or null if the WebView should load the
+ * response information or {@code null} if the WebView should load the
* resource itself.
* @see WebViewClient#shouldInterceptRequest(WebView, WebResourceRequest)
*/
diff --git a/core/java/android/webkit/ServiceWorkerController.java b/core/java/android/webkit/ServiceWorkerController.java
index 571d45e..3517c74 100644
--- a/core/java/android/webkit/ServiceWorkerController.java
+++ b/core/java/android/webkit/ServiceWorkerController.java
@@ -33,7 +33,7 @@
* return null;
* }
* });
- * </pre></p>
+ * </pre>
*/
public abstract class ServiceWorkerController {
diff --git a/core/java/android/webkit/ServiceWorkerWebSettings.java b/core/java/android/webkit/ServiceWorkerWebSettings.java
index 92e9fbe..25058da 100644
--- a/core/java/android/webkit/ServiceWorkerWebSettings.java
+++ b/core/java/android/webkit/ServiceWorkerWebSettings.java
@@ -76,14 +76,15 @@
* Sets whether Service Workers should not load resources from the network,
* see {@link WebSettings#setBlockNetworkLoads}.
*
- * @param flag true means block network loads by the Service Workers
+ * @param flag {@code true} means block network loads by the Service Workers
*/
public abstract void setBlockNetworkLoads(boolean flag);
/**
* Gets whether Service Workers are prohibited from loading any resources from the network.
*
- * @return true if the Service Workers are not allowed to load any resources from the network
+ * @return {@code true} if the Service Workers are not allowed to load any resources from the
+ * network
* @see #setBlockNetworkLoads
*/
public abstract boolean getBlockNetworkLoads();
diff --git a/core/java/android/webkit/TokenBindingService.java b/core/java/android/webkit/TokenBindingService.java
index f7caac7..43565c2 100644
--- a/core/java/android/webkit/TokenBindingService.java
+++ b/core/java/android/webkit/TokenBindingService.java
@@ -20,7 +20,6 @@
import android.net.Uri;
import java.security.KeyPair;
-import java.security.spec.AlgorithmParameterSpec;
/**
* Enables the token binding procotol, and provides access to the keys. See
@@ -82,13 +81,13 @@
* If no key pair exists, WebView chooses an algorithm from the list, in
* the order given, to generate a key.
*
- * The user can pass a null if any algorithm is acceptable.
+ * The user can pass {@code null} if any algorithm is acceptable.
*
* @param origin The origin for the server.
- * @param algorithm The list of algorithms. Can be null. An
+ * @param algorithm The list of algorithms. Can be {@code null}. An
* IllegalArgumentException is thrown if array is empty.
* @param callback The callback that will be called when key is available.
- * Cannot be null.
+ * Cannot be {@code null}.
*/
public abstract void getKey(Uri origin,
String[] algorithm,
@@ -99,7 +98,7 @@
* @param origin The origin of the server.
* @param callback The callback that will be called when key is deleted. The
* callback parameter (Boolean) will indicate if operation is
- * successful or if failed. The callback can be null.
+ * successful or if failed. The callback can be {@code null}.
*/
public abstract void deleteKey(Uri origin,
ValueCallback<Boolean> callback);
@@ -109,7 +108,7 @@
*
* @param callback The callback that will be called when keys are deleted.
* The callback parameter (Boolean) will indicate if operation is
- * successful or if failed. The callback can be null.
+ * successful or if failed. The callback can be {@code null}.
*/
public abstract void deleteAllKeys(ValueCallback<Boolean> callback);
}
diff --git a/core/java/android/webkit/URLUtil.java b/core/java/android/webkit/URLUtil.java
index f5233b6..c8bfb77 100644
--- a/core/java/android/webkit/URLUtil.java
+++ b/core/java/android/webkit/URLUtil.java
@@ -16,16 +16,16 @@
package android.webkit;
+import android.net.ParseException;
+import android.net.Uri;
+import android.net.WebAddress;
+import android.util.Log;
+
import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import android.net.Uri;
-import android.net.ParseException;
-import android.net.WebAddress;
-import android.util.Log;
-
public final class URLUtil {
private static final String LOGTAG = "webkit";
@@ -136,7 +136,7 @@
}
/**
- * @return True iff the url is correctly URL encoded
+ * @return {@code true} iff the url is correctly URL encoded
*/
static boolean verifyURLEncoding(String url) {
int count = url.length();
@@ -170,14 +170,14 @@
}
/**
- * @return True iff the url is an asset file.
+ * @return {@code true} iff the url is an asset file.
*/
public static boolean isAssetUrl(String url) {
return (null != url) && url.startsWith(ASSET_BASE);
}
/**
- * @return True iff the url is a resource file.
+ * @return {@code true} iff the url is a resource file.
* @hide
*/
public static boolean isResourceUrl(String url) {
@@ -185,7 +185,7 @@
}
/**
- * @return True iff the url is a proxy url to allow cookieless network
+ * @return {@code true} iff the url is a proxy url to allow cookieless network
* requests from a file url.
* @deprecated Cookieless proxy is no longer supported.
*/
@@ -195,7 +195,7 @@
}
/**
- * @return True iff the url is a local file.
+ * @return {@code true} iff the url is a local file.
*/
public static boolean isFileUrl(String url) {
return (null != url) && (url.startsWith(FILE_BASE) &&
@@ -204,28 +204,28 @@
}
/**
- * @return True iff the url is an about: url.
+ * @return {@code true} iff the url is an about: url.
*/
public static boolean isAboutUrl(String url) {
return (null != url) && url.startsWith("about:");
}
/**
- * @return True iff the url is a data: url.
+ * @return {@code true} iff the url is a data: url.
*/
public static boolean isDataUrl(String url) {
return (null != url) && url.startsWith("data:");
}
/**
- * @return True iff the url is a javascript: url.
+ * @return {@code true} iff the url is a javascript: url.
*/
public static boolean isJavaScriptUrl(String url) {
return (null != url) && url.startsWith("javascript:");
}
/**
- * @return True iff the url is an http: url.
+ * @return {@code true} iff the url is an http: url.
*/
public static boolean isHttpUrl(String url) {
return (null != url) &&
@@ -234,7 +234,7 @@
}
/**
- * @return True iff the url is an https: url.
+ * @return {@code true} iff the url is an https: url.
*/
public static boolean isHttpsUrl(String url) {
return (null != url) &&
@@ -243,7 +243,7 @@
}
/**
- * @return True iff the url is a network url.
+ * @return {@code true} iff the url is a network url.
*/
public static boolean isNetworkUrl(String url) {
if (url == null || url.length() == 0) {
@@ -253,14 +253,14 @@
}
/**
- * @return True iff the url is a content: url.
+ * @return {@code true} iff the url is a content: url.
*/
public static boolean isContentUrl(String url) {
return (null != url) && url.startsWith(CONTENT_BASE);
}
/**
- * @return True iff the url is valid.
+ * @return {@code true} iff the url is valid.
*/
public static boolean isValidUrl(String url) {
if (url == null || url.length() == 0) {
@@ -293,8 +293,8 @@
* the URL and contentDisposition. File extension, if not defined,
* is added based on the mimetype
* @param url Url to the content
- * @param contentDisposition Content-Disposition HTTP header or null
- * @param mimeType Mime-type of the content or null
+ * @param contentDisposition Content-Disposition HTTP header or {@code null}
+ * @param mimeType Mime-type of the content or {@code null}
*
* @return suggested filename
*/
diff --git a/core/java/android/webkit/UrlInterceptHandler.java b/core/java/android/webkit/UrlInterceptHandler.java
index 59fc0cb..aa5c6dc 100644
--- a/core/java/android/webkit/UrlInterceptHandler.java
+++ b/core/java/android/webkit/UrlInterceptHandler.java
@@ -18,6 +18,7 @@
import android.webkit.CacheManager.CacheResult;
import android.webkit.PluginData;
+
import java.util.Map;
/**
@@ -30,11 +31,11 @@
/**
* Given an URL, returns the CacheResult which contains the
- * surrogate response for the request, or null if the handler is
+ * surrogate response for the request, or {@code null} if the handler is
* not interested.
*
* @param url URL string.
- * @param headers The headers associated with the request. May be null.
+ * @param headers The headers associated with the request. May be {@code null}.
* @return The CacheResult containing the surrogate response.
*
* @hide
@@ -45,11 +46,11 @@
/**
* Given an URL, returns the PluginData which contains the
- * surrogate response for the request, or null if the handler is
+ * surrogate response for the request, or {@code null} if the handler is
* not interested.
*
* @param url URL string.
- * @param headers The headers associated with the request. May be null.
+ * @param headers The headers associated with the request. May be {@code null}.
* @return The PluginData containing the surrogate response.
*
* @hide
diff --git a/core/java/android/webkit/UrlInterceptRegistry.java b/core/java/android/webkit/UrlInterceptRegistry.java
index bdf6747..67af2ad 100644
--- a/core/java/android/webkit/UrlInterceptRegistry.java
+++ b/core/java/android/webkit/UrlInterceptRegistry.java
@@ -47,7 +47,7 @@
/**
* set the flag to control whether url intercept is enabled or disabled
*
- * @param disabled true to disable the cache
+ * @param disabled {@code true} to disable the cache
*
* @hide
* @deprecated This class was intended to be used by Gears. Since Gears was
@@ -77,7 +77,7 @@
* before any that were previously registered.
*
* @param handler The new UrlInterceptHandler object
- * @return true if the handler was not previously registered.
+ * @return {@code true} if the handler was not previously registered.
*
* @hide
* @deprecated This class was intended to be used by Gears. Since Gears was
@@ -98,7 +98,7 @@
* Unregister a previously registered UrlInterceptHandler.
*
* @param handler A previously registered UrlInterceptHandler.
- * @return true if the handler was found and removed from the list.
+ * @return {@code true} if the handler was found and removed from the list.
*
* @hide
* @deprecated This class was intended to be used by Gears. Since Gears was
@@ -112,7 +112,7 @@
/**
* Given an url, returns the CacheResult of the first
- * UrlInterceptHandler interested, or null if none are.
+ * UrlInterceptHandler interested, or {@code null} if none are.
*
* @return A CacheResult containing surrogate content.
*
@@ -139,7 +139,7 @@
/**
* Given an url, returns the PluginData of the first
- * UrlInterceptHandler interested, or null if none are or if
+ * UrlInterceptHandler interested, or {@code null} if none are or if
* intercepts are disabled.
*
* @return A PluginData instance containing surrogate content.
diff --git a/core/java/android/webkit/UserPackage.java b/core/java/android/webkit/UserPackage.java
index 9da6455..4cf3461 100644
--- a/core/java/android/webkit/UserPackage.java
+++ b/core/java/android/webkit/UserPackage.java
@@ -69,7 +69,7 @@
}
/**
- * Return true if the package is installed and not hidden
+ * Return {@code true} if the package is installed and not hidden
*/
public boolean isInstalledPackage() {
if (mPackageInfo == null) return false;
diff --git a/core/java/android/webkit/WebBackForwardList.java b/core/java/android/webkit/WebBackForwardList.java
index 6f763dc..3349b06 100644
--- a/core/java/android/webkit/WebBackForwardList.java
+++ b/core/java/android/webkit/WebBackForwardList.java
@@ -25,7 +25,7 @@
*/
public abstract class WebBackForwardList implements Cloneable, Serializable {
/**
- * Return the current history item. This method returns null if the list is
+ * Return the current history item. This method returns {@code null} if the list is
* empty.
* @return The current history item.
*/
diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java
index 81aa2f3..742daa9 100644
--- a/core/java/android/webkit/WebChromeClient.java
+++ b/core/java/android/webkit/WebChromeClient.java
@@ -52,7 +52,7 @@
* Notify the host application of the url for an apple-touch-icon.
* @param view The WebView that initiated the callback.
* @param url The icon url.
- * @param precomposed True if the url is for a precomposed touch icon.
+ * @param precomposed {@code true} if the url is for a precomposed touch icon.
*/
public void onReceivedTouchIconUrl(WebView view, String url,
boolean precomposed) {}
@@ -106,17 +106,17 @@
/**
* Request the host application to create a new window. If the host
- * application chooses to honor this request, it should return true from
+ * application chooses to honor this request, it should return {@code true} from
* this method, create a new WebView to host the window, insert it into the
* View system and send the supplied resultMsg message to its target with
* the new WebView as an argument. If the host application chooses not to
- * honor the request, it should return false from this method. The default
- * implementation of this method does nothing and hence returns false.
+ * honor the request, it should return {@code false} from this method. The default
+ * implementation of this method does nothing and hence returns {@code false}.
* @param view The WebView from which the request for a new window
* originated.
- * @param isDialog True if the new window should be a dialog, rather than
+ * @param isDialog {@code true} if the new window should be a dialog, rather than
* a full-size window.
- * @param isUserGesture True if the request was initiated by a user gesture,
+ * @param isUserGesture {@code true} if the request was initiated by a user gesture,
* such as the user clicking a link.
* @param resultMsg The message to send when once a new WebView has been
* created. resultMsg.obj is a
@@ -124,10 +124,10 @@
* used to transport the new WebView, by calling
* {@link WebView.WebViewTransport#setWebView(WebView)
* WebView.WebViewTransport.setWebView(WebView)}.
- * @return This method should return true if the host application will
+ * @return This method should return {@code true} if the host application will
* create a new window, in which case resultMsg should be sent to
- * its target. Otherwise, this method should return false. Returning
- * false from this method but also sending resultMsg will result in
+ * its target. Otherwise, this method should return {@code false}. Returning
+ * {@code false} from this method but also sending resultMsg will result in
* undefined behavior.
*/
public boolean onCreateWindow(WebView view, boolean isDialog,
@@ -154,8 +154,8 @@
/**
* Tell the client to display a javascript alert dialog. If the client
- * returns true, WebView will assume that the client will handle the
- * dialog. If the client returns false, it will continue execution.
+ * returns {@code true}, WebView will assume that the client will handle the
+ * dialog. If the client returns {@code false}, it will continue execution.
* @param view The WebView that initiated the callback.
* @param url The url of the page requesting the dialog.
* @param message Message to be displayed in the window.
@@ -169,10 +169,10 @@
/**
* Tell the client to display a confirm dialog to the user. If the client
- * returns true, WebView will assume that the client will handle the
+ * returns {@code true}, WebView will assume that the client will handle the
* confirm dialog and call the appropriate JsResult method. If the
- * client returns false, a default value of false will be returned to
- * javascript. The default behavior is to return false.
+ * client returns false, a default value of {@code false} will be returned to
+ * javascript. The default behavior is to return {@code false}.
* @param view The WebView that initiated the callback.
* @param url The url of the page requesting the dialog.
* @param message Message to be displayed in the window.
@@ -187,10 +187,10 @@
/**
* Tell the client to display a prompt dialog to the user. If the client
- * returns true, WebView will assume that the client will handle the
+ * returns {@code true}, WebView will assume that the client will handle the
* prompt dialog and call the appropriate JsPromptResult method. If the
- * client returns false, a default value of false will be returned to to
- * javascript. The default behavior is to return false.
+ * client returns false, a default value of {@code false} will be returned to to
+ * javascript. The default behavior is to return {@code false}.
* @param view The WebView that initiated the callback.
* @param url The url of the page requesting the dialog.
* @param message Message to be displayed in the window.
@@ -207,12 +207,12 @@
/**
* Tell the client to display a dialog to confirm navigation away from the
* current page. This is the result of the onbeforeunload javascript event.
- * If the client returns true, WebView will assume that the client will
+ * If the client returns {@code true}, WebView will assume that the client will
* handle the confirm dialog and call the appropriate JsResult method. If
- * the client returns false, a default value of true will be returned to
+ * the client returns {@code false}, a default value of {@code true} will be returned to
* javascript to accept navigation away from the current page. The default
- * behavior is to return false. Setting the JsResult to true will navigate
- * away from the current page, false will cancel the navigation.
+ * behavior is to return {@code false}. Setting the JsResult to {@code true} will navigate
+ * away from the current page, {@code false} will cancel the navigation.
* @param view The WebView that initiated the callback.
* @param url The url of the page requesting the dialog.
* @param message Message to be displayed in the window.
@@ -289,7 +289,7 @@
* (API level > {@link android.os.Build.VERSION_CODES#M})
* this method is only called for requests originating from secure
* origins such as https. On non-secure origins geolocation requests
- * are automatically denied.</p>
+ * are automatically denied.
*
* @param origin The origin of the web content attempting to use the
* Geolocation API.
@@ -332,8 +332,8 @@
/**
* Tell the client that a JavaScript execution timeout has occured. And the
* client may decide whether or not to interrupt the execution. If the
- * client returns true, the JavaScript will be interrupted. If the client
- * returns false, the execution will continue. Note that in the case of
+ * client returns {@code true}, the JavaScript will be interrupted. If the client
+ * returns {@code false}, the execution will continue. Note that in the case of
* continuing execution, the timeout counter will be reset, and the callback
* will continue to occur if the script does not finish at the next check
* point.
@@ -365,7 +365,7 @@
* Report a JavaScript console message to the host application. The ChromeClient
* should override this to process the log message as they see fit.
* @param consoleMessage Object containing details of the console message.
- * @return true if the message is handled by the client.
+ * @return {@code true} if the message is handled by the client.
*/
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
// Call the old version of this function for backwards compatability.
@@ -380,7 +380,7 @@
* HTML. If the attribute is absent, then a default poster will be used. This
* method allows the ChromeClient to provide that default image.
*
- * @return Bitmap The image to use as a default poster, or null if no such image is
+ * @return Bitmap The image to use as a default poster, or {@code null} if no such image is
* available.
*/
public Bitmap getDefaultVideoPoster() {
@@ -409,15 +409,16 @@
* This is called to handle HTML forms with 'file' input type, in response to the
* user pressing the "Select File" button.
* To cancel the request, call <code>filePathCallback.onReceiveValue(null)</code> and
- * return true.
+ * return {@code true}.
*
* @param webView The WebView instance that is initiating the request.
* @param filePathCallback Invoke this callback to supply the list of paths to files to upload,
- * or NULL to cancel. Must only be called if the
- * {@link #onShowFileChooser} implementation returns true.
+ * or {@code null} to cancel. Must only be called if the
+ * {@link #onShowFileChooser} implementation returns {@code true}.
* @param fileChooserParams Describes the mode of file chooser to be opened, and options to be
* used with it.
- * @return true if filePathCallback will be invoked, false to use default handling.
+ * @return {@code true} if filePathCallback will be invoked, {@code false} to use default
+ * handling.
*
* @see FileChooserParams
*/
@@ -448,7 +449,7 @@
*
* @param resultCode the integer result code returned by the file picker activity.
* @param data the intent returned by the file picker activity.
- * @return the Uris of selected file(s) or null if the resultCode indicates
+ * @return the Uris of selected file(s) or {@code null} if the resultCode indicates
* activity canceled or any other error.
*/
public static Uri[] parseResult(int resultCode, Intent data) {
@@ -469,20 +470,20 @@
/**
* Returns preference for a live media captured value (e.g. Camera, Microphone).
- * True indicates capture is enabled, false disabled.
+ * True indicates capture is enabled, {@code false} disabled.
*
* Use <code>getAcceptTypes</code> to determine suitable capture devices.
*/
public abstract boolean isCaptureEnabled();
/**
- * Returns the title to use for this file selector, or null. If null a default
+ * Returns the title to use for this file selector, or null. If {@code null} a default
* title should be used.
*/
public abstract CharSequence getTitle();
/**
- * The file name of a default selection if specified, or null.
+ * The file name of a default selection if specified, or {@code null}.
*/
public abstract String getFilenameHint();
diff --git a/core/java/android/webkit/WebHistoryItem.java b/core/java/android/webkit/WebHistoryItem.java
index 569fccd..1591833 100644
--- a/core/java/android/webkit/WebHistoryItem.java
+++ b/core/java/android/webkit/WebHistoryItem.java
@@ -65,8 +65,8 @@
public abstract String getTitle();
/**
- * Return the favicon of this history item or null if no favicon was found.
- * @return A Bitmap containing the favicon for this history item or null.
+ * Return the favicon of this history item or {@code null} if no favicon was found.
+ * @return A Bitmap containing the favicon for this history item or {@code null}.
* Note: The VM ensures 32-bit atomic read/write operations so we don't have
* to synchronize this method.
*/
diff --git a/core/java/android/webkit/WebMessage.java b/core/java/android/webkit/WebMessage.java
index 7683a40..7fe66dc 100644
--- a/core/java/android/webkit/WebMessage.java
+++ b/core/java/android/webkit/WebMessage.java
@@ -53,7 +53,7 @@
}
/**
- * Returns the ports that are sent with the message, or null if no port
+ * Returns the ports that are sent with the message, or {@code null} if no port
* is sent.
*/
public WebMessagePort[] getPorts() {
diff --git a/core/java/android/webkit/WebMessagePort.java b/core/java/android/webkit/WebMessagePort.java
index 54dd502..acd7af9 100644
--- a/core/java/android/webkit/WebMessagePort.java
+++ b/core/java/android/webkit/WebMessagePort.java
@@ -22,30 +22,30 @@
/**
* <p>The Java representation of the
* <a href="https://html.spec.whatwg.org/multipage/comms.html#messageport">
- * HTML5 message ports.</a> </p>
+ * HTML5 message ports.</a>
*
* <p>A Message port represents one endpoint of a Message Channel. In Android
* webview, there is no separate Message Channel object. When a message channel
* is created, both ports are tangled to each other and started, and then
* returned in a MessagePort array, see {@link WebView#createWebMessageChannel}
- * for creating a message channel. </p>
+ * for creating a message channel.
*
* <p>When a message port is first created or received via transfer, it does not
* have a WebMessageCallback to receive web messages. The messages are queued until
- * a WebMessageCallback is set. </p>
+ * a WebMessageCallback is set.
*
* <p>A message port should be closed when it is not used by the embedder application
* anymore. A closed port cannot be transferred or cannot be reopened to send
- * messages. Close can be called multiple times. </p>
+ * messages. Close can be called multiple times.
*
* <p>When a port is transferred to JS, it cannot be used to send or receive messages
* at the Java side anymore. Different from HTML5 Spec, a port cannot be transferred
* if one of these has ever happened: i. a message callback was set, ii. a message was
* posted on it. A transferred port cannot be closed by the application, since
- * the ownership is also transferred. </p>
+ * the ownership is also transferred.
*
* <p>It is possible to transfer both ports of a channel to JS, for example for
- * communication between subframes.</p>
+ * communication between subframes.
*/
public abstract class WebMessagePort {
diff --git a/core/java/android/webkit/WebResourceRequest.java b/core/java/android/webkit/WebResourceRequest.java
index ab93505..964b6f8 100644
--- a/core/java/android/webkit/WebResourceRequest.java
+++ b/core/java/android/webkit/WebResourceRequest.java
@@ -34,7 +34,7 @@
/**
* Gets whether the request was made for the main frame.
*
- * @return whether the request was made for the main frame. Will be false for iframes,
+ * @return whether the request was made for the main frame. Will be {@code false} for iframes,
* for example.
*/
boolean isForMainFrame();
@@ -48,8 +48,9 @@
/**
* Gets whether a gesture (such as a click) was associated with the request.
- * For security reasons in certain situations this method may return false even though the
- * sequence of events which caused the request to be created was initiated by a user gesture.
+ * For security reasons in certain situations this method may return {@code false} even though
+ * the sequence of events which caused the request to be created was initiated by a user
+ * gesture.
*
* @return whether a gesture was associated with the request.
*/
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 82cff7c..22d8561 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -217,7 +217,7 @@
/**
* Enables dumping the pages navigation cache to a text file. The default
- * is false.
+ * is {@code false}.
*
* @deprecated This method is now obsolete.
* @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
@@ -243,7 +243,7 @@
* controls and gestures. The particular zoom mechanisms that should be used
* can be set with {@link #setBuiltInZoomControls}. This setting does not
* affect zooming performed using the {@link WebView#zoomIn()} and
- * {@link WebView#zoomOut()} methods. The default is true.
+ * {@link WebView#zoomOut()} methods. The default is {@code true}.
*
* @param support whether the WebView should support zoom
*/
@@ -252,14 +252,14 @@
/**
* Gets whether the WebView supports zoom.
*
- * @return true if the WebView supports zoom
+ * @return {@code true} if the WebView supports zoom
* @see #setSupportZoom
*/
public abstract boolean supportZoom();
/**
* Sets whether the WebView requires a user gesture to play media.
- * The default is true.
+ * The default is {@code true}.
*
* @param require whether the WebView requires a user gesture to play media
*/
@@ -268,7 +268,7 @@
/**
* Gets whether the WebView requires a user gesture to play media.
*
- * @return true if the WebView requires a user gesture to play media
+ * @return {@code true} if the WebView requires a user gesture to play media
* @see #setMediaPlaybackRequiresUserGesture
*/
public abstract boolean getMediaPlaybackRequiresUserGesture();
@@ -278,7 +278,7 @@
* built-in zoom mechanisms comprise on-screen zoom controls, which are
* displayed over the WebView's content, and the use of a pinch gesture to
* control zooming. Whether or not these on-screen controls are displayed
- * can be set with {@link #setDisplayZoomControls}. The default is false.
+ * can be set with {@link #setDisplayZoomControls}. The default is {@code false}.
* <p>
* The built-in mechanisms are the only currently supported zoom
* mechanisms, so it is recommended that this setting is always enabled.
@@ -293,7 +293,7 @@
/**
* Gets whether the zoom mechanisms built into WebView are being used.
*
- * @return true if the zoom mechanisms built into WebView are being used
+ * @return {@code true} if the zoom mechanisms built into WebView are being used
* @see #setBuiltInZoomControls
*/
public abstract boolean getBuiltInZoomControls();
@@ -301,7 +301,7 @@
/**
* Sets whether the WebView should display on-screen zoom controls when
* using the built-in zoom mechanisms. See {@link #setBuiltInZoomControls}.
- * The default is true.
+ * The default is {@code true}.
*
* @param enabled whether the WebView should display on-screen zoom controls
*/
@@ -311,7 +311,7 @@
* Gets whether the WebView displays on-screen zoom controls when using
* the built-in zoom mechanisms.
*
- * @return true if the WebView displays on-screen zoom controls when using
+ * @return {@code true} if the WebView displays on-screen zoom controls when using
* the built-in zoom mechanisms
* @see #setDisplayZoomControls
*/
@@ -351,7 +351,7 @@
* zooms out the content to fit on screen by width. This setting is
* taken into account when the content width is greater than the width
* of the WebView control, for example, when {@link #getUseWideViewPort}
- * is enabled. The default is false.
+ * is enabled. The default is {@code false}.
*/
public abstract void setLoadWithOverviewMode(boolean overview);
@@ -366,9 +366,9 @@
/**
* Sets whether the WebView will enable smooth transition while panning or
* zooming or while the window hosting the WebView does not have focus.
- * If it is true, WebView will choose a solution to maximize the performance.
+ * If it is {@code true}, WebView will choose a solution to maximize the performance.
* e.g. the WebView's content may not be updated during the transition.
- * If it is false, WebView will keep its fidelity. The default value is false.
+ * If it is false, WebView will keep its fidelity. The default value is {@code false}.
*
* @deprecated This method is now obsolete, and will become a no-op in future.
*/
@@ -388,8 +388,8 @@
/**
* Sets whether the WebView uses its background for over scroll background.
- * If true, it will use the WebView's background. If false, it will use an
- * internal pattern. Default is true.
+ * If {@code true}, it will use the WebView's background. If {@code false}, it will use an
+ * internal pattern. Default is {@code true}.
*
* @deprecated This method is now obsolete.
* @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
@@ -433,7 +433,7 @@
public abstract boolean getSaveFormData();
/**
- * Sets whether the WebView should save passwords. The default is true.
+ * Sets whether the WebView should save passwords. The default is {@code true}.
* @deprecated Saving passwords in WebView will not be supported in future versions.
*/
@Deprecated
@@ -627,9 +627,9 @@
/**
* Sets whether the WebView should enable support for the "viewport"
* HTML meta tag or should use a wide viewport.
- * When the value of the setting is false, the layout width is always set to the
+ * When the value of the setting is {@code false}, the layout width is always set to the
* width of the WebView control in device-independent (CSS) pixels.
- * When the value is true and the page contains the viewport meta tag, the value
+ * When the value is {@code true} and the page contains the viewport meta tag, the value
* of the width specified in the tag is used. If the page does not contain the tag or
* does not provide a width, then a wide viewport will be used.
*
@@ -641,7 +641,7 @@
* Gets whether the WebView supports the "viewport"
* HTML meta tag or will use a wide viewport.
*
- * @return true if the WebView supports the viewport meta tag
+ * @return {@code true} if the WebView supports the viewport meta tag
* @see #setUseWideViewPort
*/
public abstract boolean getUseWideViewPort();
@@ -649,7 +649,7 @@
/**
* Sets whether the WebView whether supports multiple windows. If set to
* true, {@link WebChromeClient#onCreateWindow} must be implemented by the
- * host application. The default is false.
+ * host application. The default is {@code false}.
*
* @param support whether to suport multiple windows
*/
@@ -658,7 +658,7 @@
/**
* Gets whether the WebView supports multiple windows.
*
- * @return true if the WebView supports multiple windows
+ * @return {@code true} if the WebView supports multiple windows
* @see #setSupportMultipleWindows
*/
public abstract boolean supportMultipleWindows();
@@ -838,9 +838,9 @@
* controls loading of all images, including those embedded using the data
* URI scheme. Use {@link #setBlockNetworkImage} to control loading only
* of images specified using network URI schemes. Note that if the value of this
- * setting is changed from false to true, all images resources referenced
+ * setting is changed from {@code false} to {@code true}, all images resources referenced
* by content currently displayed by the WebView are loaded automatically.
- * The default is true.
+ * The default is {@code true}.
*
* @param flag whether the WebView should load image resources
*/
@@ -850,7 +850,7 @@
* Gets whether the WebView loads image resources. This includes
* images embedded using the data URI scheme.
*
- * @return true if the WebView loads image resources
+ * @return {@code true} if the WebView loads image resources
* @see #setLoadsImagesAutomatically
*/
public abstract boolean getLoadsImagesAutomatically();
@@ -859,12 +859,12 @@
* Sets whether the WebView should not load image resources from the
* network (resources accessed via http and https URI schemes). Note
* that this method has no effect unless
- * {@link #getLoadsImagesAutomatically} returns true. Also note that
+ * {@link #getLoadsImagesAutomatically} returns {@code true}. Also note that
* disabling all network loads using {@link #setBlockNetworkLoads}
* will also prevent network images from loading, even if this flag is set
- * to false. When the value of this setting is changed from true to false,
+ * to false. When the value of this setting is changed from {@code true} to {@code false},
* network images resources referenced by content currently displayed by
- * the WebView are fetched automatically. The default is false.
+ * the WebView are fetched automatically. The default is {@code false}.
*
* @param flag whether the WebView should not load image resources from the
* network
@@ -875,7 +875,7 @@
/**
* Gets whether the WebView does not load image resources from the network.
*
- * @return true if the WebView does not load image resources from the network
+ * @return {@code true} if the WebView does not load image resources from the network
* @see #setBlockNetworkImage
*/
public abstract boolean getBlockNetworkImage();
@@ -884,17 +884,17 @@
* Sets whether the WebView should not load resources from the network.
* Use {@link #setBlockNetworkImage} to only avoid loading
* image resources. Note that if the value of this setting is
- * changed from true to false, network resources referenced by content
+ * changed from {@code true} to {@code false}, network resources referenced by content
* currently displayed by the WebView are not fetched until
* {@link android.webkit.WebView#reload} is called.
* If the application does not have the
* {@link android.Manifest.permission#INTERNET} permission, attempts to set
- * a value of false will cause a {@link java.lang.SecurityException}
- * to be thrown. The default value is false if the application has the
+ * a value of {@code false} will cause a {@link java.lang.SecurityException}
+ * to be thrown. The default value is {@code false} if the application has the
* {@link android.Manifest.permission#INTERNET} permission, otherwise it is
- * true.
+ * {@code true}.
*
- * @param flag true means block network loads by the WebView
+ * @param flag {@code true} means block network loads by the WebView
* @see android.webkit.WebView#reload
*/
public abstract void setBlockNetworkLoads(boolean flag);
@@ -902,16 +902,16 @@
/**
* Gets whether the WebView does not load any resources from the network.
*
- * @return true if the WebView does not load any resources from the network
+ * @return {@code true} if the WebView does not load any resources from the network
* @see #setBlockNetworkLoads
*/
public abstract boolean getBlockNetworkLoads();
/**
* Tells the WebView to enable JavaScript execution.
- * <b>The default is false.</b>
+ * <b>The default is {@code false}.</b>
*
- * @param flag true if the WebView should execute JavaScript
+ * @param flag {@code true} if the WebView should execute JavaScript
*/
public abstract void setJavaScriptEnabled(boolean flag);
@@ -927,9 +927,9 @@
* on {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH} and earlier
* devices, you should explicitly set this value to {@code false}.
* <p>
- * The default value is true for API level
+ * The default value is {@code true} for API level
* {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
- * and false for API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
+ * and {@code false} for API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
* and above.
*
* @param flag whether JavaScript running in the context of a file scheme
@@ -942,16 +942,16 @@
* should be allowed to access content from other file scheme URLs. To
* enable the most restrictive, and therefore secure policy, this setting
* should be disabled. Note that the value of this setting is ignored if
- * the value of {@link #getAllowUniversalAccessFromFileURLs} is true.
+ * the value of {@link #getAllowUniversalAccessFromFileURLs} is {@code true}.
* Note too, that this setting affects only JavaScript access to file scheme
* resources. Other access to such resources, for example, from image HTML
* elements, is unaffected. To prevent possible violation of same domain policy
* on {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH} and earlier
* devices, you should explicitly set this value to {@code false}.
* <p>
- * The default value is true for API level
+ * The default value is {@code true} for API level
* {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
- * and false for API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
+ * and {@code false} for API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
* and above.
*
* @param flag whether JavaScript running in the context of a file scheme
@@ -961,9 +961,9 @@
public abstract void setAllowFileAccessFromFileURLs(boolean flag);
/**
- * Sets whether the WebView should enable plugins. The default is false.
+ * Sets whether the WebView should enable plugins. The default is {@code false}.
*
- * @param flag true if plugins should be enabled
+ * @param flag {@code true} if plugins should be enabled
* @deprecated This method has been deprecated in favor of
* {@link #setPluginState}
* @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
@@ -1028,11 +1028,11 @@
/**
* Sets whether the Application Caches API should be enabled. The default
- * is false. Note that in order for the Application Caches API to be
+ * is {@code false}. Note that in order for the Application Caches API to be
* enabled, a valid database path must also be supplied to
* {@link #setAppCachePath}.
*
- * @param flag true if the WebView should enable Application Caches
+ * @param flag {@code true} if the WebView should enable Application Caches
*/
public abstract void setAppCacheEnabled(boolean flag);
@@ -1072,21 +1072,21 @@
* page load within a given process, as the WebView implementation may ignore
* changes to this setting after that point.
*
- * @param flag true if the WebView should use the database storage API
+ * @param flag {@code true} if the WebView should use the database storage API
*/
public abstract void setDatabaseEnabled(boolean flag);
/**
- * Sets whether the DOM storage API is enabled. The default value is false.
+ * Sets whether the DOM storage API is enabled. The default value is {@code false}.
*
- * @param flag true if the WebView should use the DOM storage API
+ * @param flag {@code true} if the WebView should use the DOM storage API
*/
public abstract void setDomStorageEnabled(boolean flag);
/**
* Gets whether the DOM Storage APIs are enabled.
*
- * @return true if the DOM Storage APIs are enabled
+ * @return {@code true} if the DOM Storage APIs are enabled
* @see #setDomStorageEnabled
*/
public abstract boolean getDomStorageEnabled();
@@ -1104,13 +1104,13 @@
/**
* Gets whether the database storage API is enabled.
*
- * @return true if the database storage API is enabled
+ * @return {@code true} if the database storage API is enabled
* @see #setDatabaseEnabled
*/
public abstract boolean getDatabaseEnabled();
/**
- * Sets whether Geolocation is enabled. The default is true.
+ * Sets whether Geolocation is enabled. The default is {@code true}.
* <p>
* Please note that in order for the Geolocation API to be usable
* by a page in the WebView, the following requirements must be met:
@@ -1132,7 +1132,7 @@
/**
* Gets whether JavaScript is enabled.
*
- * @return true if JavaScript is enabled
+ * @return {@code true} if JavaScript is enabled
* @see #setJavaScriptEnabled
*/
public abstract boolean getJavaScriptEnabled();
@@ -1161,7 +1161,7 @@
/**
* Gets whether plugins are enabled.
*
- * @return true if plugins are enabled
+ * @return {@code true} if plugins are enabled
* @see #setPluginsEnabled
* @deprecated This method has been replaced by {@link #getPluginState}
* @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
@@ -1197,16 +1197,16 @@
/**
* Tells JavaScript to open windows automatically. This applies to the
- * JavaScript function window.open(). The default is false.
+ * JavaScript function window.open(). The default is {@code false}.
*
- * @param flag true if JavaScript can open windows automatically
+ * @param flag {@code true} if JavaScript can open windows automatically
*/
public abstract void setJavaScriptCanOpenWindowsAutomatically(boolean flag);
/**
* Gets whether JavaScript can open windows automatically.
*
- * @return true if JavaScript can open windows automatically during
+ * @return {@code true} if JavaScript can open windows automatically during
* window.open()
* @see #setJavaScriptCanOpenWindowsAutomatically
*/
@@ -1229,7 +1229,7 @@
public abstract String getDefaultTextEncodingName();
/**
- * Sets the WebView's user-agent string. If the string is null or empty,
+ * Sets the WebView's user-agent string. If the string is {@code null} or empty,
* the system default value will be used.
*
* Note that starting from {@link android.os.Build.VERSION_CODES#KITKAT} Android
@@ -1262,7 +1262,7 @@
/**
* Tells the WebView whether it needs to set a node to have focus when
* {@link WebView#requestFocus(int, android.graphics.Rect)} is called. The
- * default value is true.
+ * default value is {@code true}.
*
* @param flag whether the WebView needs to set a node
*/
@@ -1355,7 +1355,7 @@
/**
* Gets whether a video overlay will be used for embedded encrypted video.
*
- * @return true if WebView uses a video overlay for embedded encrypted video.
+ * @return {@code true} if WebView uses a video overlay for embedded encrypted video.
* @see #setVideoOverlayForEmbeddedEncryptedVideoEnabled
* @hide
*/
@@ -1380,7 +1380,7 @@
/**
* Gets whether this WebView should raster tiles when it is
* offscreen but attached to a window.
- * @return true if this WebView will raster tiles when it is
+ * @return {@code true} if this WebView will raster tiles when it is
* offscreen but attached to a window.
*/
public abstract boolean getOffscreenPreRaster();
@@ -1394,11 +1394,9 @@
* Safe browsing is disabled by default. The recommended way to enable Safe browsing is using a
* manifest tag to change the default value to enabled for all WebViews (read <a
* href="{@docRoot}reference/android/webkit/WebView.html">general Safe Browsing info</a>).
- * </p>
*
* <p>
* This API overrides the manifest tag value for this WebView.
- * </p>
*
* @param enabled Whether Safe browsing is enabled.
*/
@@ -1408,7 +1406,7 @@
* Gets whether Safe browsing is enabled.
* See {@link #setSafeBrowsingEnabled}.
*
- * @return true if Safe browsing is enabled and false otherwise.
+ * @return {@code true} if Safe browsing is enabled and {@code false} otherwise.
*/
public abstract boolean getSafeBrowsingEnabled();
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index f918cad..419b7b2 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -75,18 +75,22 @@
* can roll your own web browser or simply display some online content within your Activity.
* It uses the WebKit rendering engine to display
* web pages and includes methods to navigate forward and backward
- * through a history, zoom in and out, perform text searches and more.</p>
+ * through a history, zoom in and out, perform text searches and more.
+ *
* <p>Note that, in order for your Activity to access the Internet and load web pages
* in a WebView, you must add the {@code INTERNET} permissions to your
- * Android Manifest file:</p>
- * <pre><uses-permission android:name="android.permission.INTERNET" /></pre>
+ * Android Manifest file:
+ *
+ * <pre>
+ * {@code <uses-permission android:name="android.permission.INTERNET" />}
+ * </pre>
*
* <p>This must be a child of the <a
* href="{@docRoot}guide/topics/manifest/manifest-element.html">{@code <manifest>}</a>
- * element.</p>
+ * element.
*
* <p>For more information, read
- * <a href="{@docRoot}guide/webapps/webview.html">Building Web Apps in WebView</a>.</p>
+ * <a href="{@docRoot}guide/webapps/webview.html">Building Web Apps in WebView</a>.
*
* <h3>Basic usage</h3>
*
@@ -103,17 +107,19 @@
* Intent intent = new Intent(Intent.ACTION_VIEW, uri);
* startActivity(intent);
* </pre>
- * <p>See {@link android.content.Intent} for more information.</p>
+ * <p>See {@link android.content.Intent} for more information.
*
* <p>To provide a WebView in your own Activity, include a {@code <WebView>} in your layout,
* or set the entire Activity window as a WebView during {@link
- * android.app.Activity#onCreate(Bundle) onCreate()}:</p>
+ * android.app.Activity#onCreate(Bundle) onCreate()}:
+ *
* <pre class="prettyprint">
* WebView webview = new WebView(this);
* setContentView(webview);
* </pre>
*
- * <p>Then load the desired web page:</p>
+ * <p>Then load the desired web page:
+ *
* <pre>
* // Simplest usage: note that an exception will NOT be thrown
* // if there is an error loading this page (see below).
@@ -128,7 +134,7 @@
* </pre>
*
* <p>A WebView has several customization points where you can add your
- * own behavior. These are:</p>
+ * own behavior. These are:
*
* <ul>
* <li>Creating and setting a {@link android.webkit.WebChromeClient} subclass.
@@ -153,7 +159,7 @@
* </ul>
*
* <p>Here's a more complicated example, showing error handling,
- * settings, and progress notification:</p>
+ * settings, and progress notification:
*
* <pre class="prettyprint">
* // Let's display the progress in the activity title bar, like the
@@ -183,23 +189,23 @@
*
* <p>To enable the built-in zoom, set
* {@link #getSettings() WebSettings}.{@link WebSettings#setBuiltInZoomControls(boolean)}
- * (introduced in API level {@link android.os.Build.VERSION_CODES#CUPCAKE}).</p>
+ * (introduced in API level {@link android.os.Build.VERSION_CODES#CUPCAKE}).
+ *
* <p>NOTE: Using zoom if either the height or width is set to
* {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} may lead to undefined behavior
- * and should be avoided.</p>
+ * and should be avoided.
*
* <h3>Cookie and window management</h3>
*
* <p>For obvious security reasons, your application has its own
* cache, cookie store etc.—it does not share the Browser
* application's data.
- * </p>
*
* <p>By default, requests by the HTML to open new windows are
- * ignored. This is true whether they be opened by JavaScript or by
+ * ignored. This is {@code true} whether they be opened by JavaScript or by
* the target attribute on a link. You can customize your
* {@link WebChromeClient} to provide your own behavior for opening multiple windows,
- * and render them in whatever manner you want.</p>
+ * and render them in whatever manner you want.
*
* <p>The standard behavior for an Activity is to be destroyed and
* recreated when the device orientation or any other configuration changes. This will cause
@@ -208,7 +214,7 @@
* changes, and then just leave the WebView alone. It'll automatically
* re-orient itself as appropriate. Read <a
* href="{@docRoot}guide/topics/resources/runtime-changes.html">Handling Runtime Changes</a> for
- * more information about how to handle configuration changes during runtime.</p>
+ * more information about how to handle configuration changes during runtime.
*
*
* <h3>Building web pages to support different screen densities</h3>
@@ -220,15 +226,15 @@
* height and width are defined in terms of screen pixels will appear larger on the lower density
* screen and smaller on the higher density screen.
* For simplicity, Android collapses all actual screen densities into three generalized densities:
- * high, medium, and low.</p>
+ * high, medium, and low.
* <p>By default, WebView scales a web page so that it is drawn at a size that matches the default
* appearance on a medium density screen. So, it applies 1.5x scaling on a high density screen
* (because its pixels are smaller) and 0.75x scaling on a low density screen (because its pixels
* are bigger).
* Starting with API level {@link android.os.Build.VERSION_CODES#ECLAIR}, WebView supports DOM, CSS,
* and meta tag features to help you (as a web developer) target screens with different screen
- * densities.</p>
- * <p>Here's a summary of the features you can use to handle different screen densities:</p>
+ * densities.
+ * <p>Here's a summary of the features you can use to handle different screen densities:
* <ul>
* <li>The {@code window.devicePixelRatio} DOM property. The value of this property specifies the
* default scaling factor used for the current device. For example, if the value of {@code
@@ -244,7 +250,7 @@
* <pre>
* <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="hdpi.css" /></pre>
* <p>The {@code hdpi.css} stylesheet is only used for devices with a screen pixel ration of 1.5,
- * which is the high density pixel ratio.</p>
+ * which is the high density pixel ratio.
* </li>
* </ul>
*
@@ -252,7 +258,6 @@
*
* <p>In order to support inline HTML5 video in your application you need to have hardware
* acceleration turned on.
- * </p>
*
* <h3>Full screen support</h3>
*
@@ -263,7 +268,6 @@
* missing then the web contents will not be allowed to enter full screen. Optionally you can implement
* {@link WebChromeClient#getVideoLoadingProgressView()} to customize the View displayed whilst a video
* is loading.
- * </p>
*
* <h3>HTML5 Geolocation API support</h3>
*
@@ -273,7 +277,6 @@
* origins are automatically denied without invoking the corresponding
* {@link WebChromeClient#onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)}
* method.
- * </p>
*
* <h3>Layout size</h3>
* <p>
@@ -284,7 +287,6 @@
* for the height none of the WebView's parents should use a
* {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} layout height since that could result in
* incorrect sizing of the views.
- * </p>
*
* <p>Setting the WebView's height to {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}
* enables the following behaviors:
@@ -294,13 +296,11 @@
* <li>For applications targeting {@link android.os.Build.VERSION_CODES#KITKAT} and earlier SDKs the
* HTML viewport meta tag will be ignored in order to preserve backwards compatibility. </li>
* </ul>
- * </p>
*
* <p>
* Using a layout width of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} is not
* supported. If such a width is used the WebView will attempt to use the width of the parent
* instead.
- * </p>
*
* <h3>Metrics</h3>
*
@@ -313,27 +313,22 @@
* <meta-data android:name="android.webkit.WebView.MetricsOptOut"
* android:value="true" />
* </pre>
- * </p>
* <p>
* Data will only be uploaded for a given app if the user has consented AND the app has not opted
* out.
- * </p>
*
* <h3>Safe Browsing</h3>
*
* <p>
* If Safe Browsing is enabled, WebView will block malicious URLs and present a warning UI to the
* user to allow them to navigate back safely or proceed to the malicious page.
- * </p>
* <p>
* The recommended way for apps to enable the feature is putting the following tag in the manifest:
- * </p>
* <p>
* <pre>
* <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
* android:value="true" />
* </pre>
- * </p>
*
*/
// Implementation notes.
@@ -405,7 +400,7 @@
* may be notified multiple times while the
* operation is underway, and the numberOfMatches
* value should not be considered final unless
- * isDoneCounting is true.
+ * isDoneCounting is {@code true}.
*/
public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
boolean isDoneCounting);
@@ -439,7 +434,7 @@
* @param view the WebView that owns the picture
* @param picture the new picture. Applications targeting
* {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2} or above
- * will always receive a null Picture.
+ * will always receive a {@code null} Picture.
* @deprecated Deprecated due to internal changes.
*/
@Deprecated
@@ -529,7 +524,7 @@
/**
* Gets additional type-dependant information about the result. See
- * {@link WebView#getHitTestResult()} for details. May either be null
+ * {@link WebView#getHitTestResult()} for details. May either be {@code null}
* or contain extra information about this result.
*
* @return additional type-dependant information about the result
@@ -664,7 +659,7 @@
* Specifies whether the horizontal scrollbar has overlay style.
*
* @deprecated This method has no effect.
- * @param overlay true if horizontal scrollbar should have overlay style
+ * @param overlay {@code true} if horizontal scrollbar should have overlay style
*/
@Deprecated
public void setHorizontalScrollbarOverlay(boolean overlay) {
@@ -674,7 +669,7 @@
* Specifies whether the vertical scrollbar has overlay style.
*
* @deprecated This method has no effect.
- * @param overlay true if vertical scrollbar should have overlay style
+ * @param overlay {@code true} if vertical scrollbar should have overlay style
*/
@Deprecated
public void setVerticalScrollbarOverlay(boolean overlay) {
@@ -684,7 +679,7 @@
* Gets whether horizontal scrollbar has overlay style.
*
* @deprecated This method is now obsolete.
- * @return true
+ * @return {@code true}
*/
@Deprecated
public boolean overlayHorizontalScrollbar() {
@@ -696,7 +691,7 @@
* Gets whether vertical scrollbar has overlay style.
*
* @deprecated This method is now obsolete.
- * @return false
+ * @return {@code false}
*/
@Deprecated
public boolean overlayVerticalScrollbar() {
@@ -717,7 +712,7 @@
}
/**
- * Gets the SSL certificate for the main top-level page or null if there is
+ * Gets the SSL certificate for the main top-level page or {@code null} if there is
* no certificate (the site is not secure).
*
* @return the SSL certificate for the main top-level page
@@ -785,7 +780,7 @@
* @param host the host to which the credentials apply
* @param realm the realm to which the credentials apply
* @return the credentials as a String array, if found. The first element
- * is the username and the second element is the password. Null if
+ * is the username and the second element is the password. {@code null} if
* no credentials are found.
* @deprecated Use {@link WebViewDatabase#getHttpAuthUsernamePassword} instead
*/
@@ -859,7 +854,7 @@
*
* @param outState the Bundle to store this WebView's state
* @return the same copy of the back/forward list used to save the state. If
- * saveState fails, the returned list will be null.
+ * saveState fails, the returned list will be {@code null}.
*/
public WebBackForwardList saveState(Bundle outState) {
checkThread();
@@ -872,7 +867,7 @@
* @param b a Bundle to store the display data
* @param dest the file to store the serialized picture data. Will be
* overwritten with this WebView's picture data.
- * @return true if the picture was successfully saved
+ * @return {@code true} if the picture was successfully saved
* @deprecated This method is now obsolete.
* @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
*/
@@ -889,7 +884,7 @@
*
* @param b a Bundle containing the saved display data
* @param src the file where the picture data was stored
- * @return true if the picture was successfully restored
+ * @return {@code true} if the picture was successfully restored
* @deprecated This method is now obsolete.
* @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
*/
@@ -909,7 +904,7 @@
* display data for this WebView.
*
* @param inState the incoming Bundle of state
- * @return the restored back/forward list or null if restoreState failed
+ * @return the restored back/forward list or {@code null} if restoreState failed
*/
public WebBackForwardList restoreState(Bundle inState) {
checkThread();
@@ -977,7 +972,7 @@
* The encoding parameter specifies whether the data is base64 or URL
* encoded. If the data is base64 encoded, the value of the encoding
* parameter must be 'base64'. For all other values of the parameter,
- * including null, it is assumed that the data uses ASCII encoding for
+ * including {@code null}, it is assumed that the data uses ASCII encoding for
* octets inside the range of safe URL characters and use the standard %xx
* hex encoding of URLs for octets outside that range. For example, '#',
* '%', '\', '?' should be replaced by %23, %25, %27, %3f respectively.
@@ -1018,13 +1013,13 @@
* Note that the baseUrl is sent in the 'Referer' HTTP header when
* requesting subresources (images, etc.) of the page loaded using this method.
*
- * @param baseUrl the URL to use as the page's base URL. If null defaults to
+ * @param baseUrl the URL to use as the page's base URL. If {@code null} defaults to
* 'about:blank'.
* @param data a String of data in the given encoding
- * @param mimeType the MIMEType of the data, e.g. 'text/html'. If null,
+ * @param mimeType the MIMEType of the data, e.g. 'text/html'. If {@code null},
* defaults to 'text/html'.
* @param encoding the encoding of the data
- * @param historyUrl the URL to use as the history entry. If null defaults
+ * @param historyUrl the URL to use as the history entry. If {@code null} defaults
* to 'about:blank'. If non-null, this must be a valid URL.
*/
public void loadDataWithBaseURL(String baseUrl, String data,
@@ -1048,7 +1043,7 @@
* @param script the JavaScript to execute.
* @param resultCallback A callback to be invoked when the script execution
* completes with the result of the execution (if any).
- * May be null if no notification of the result is required.
+ * May be {@code null} if no notification of the result is required.
*/
public void evaluateJavascript(String script, ValueCallback<String> resultCallback) {
checkThread();
@@ -1069,12 +1064,12 @@
* Saves the current view as a web archive.
*
* @param basename the filename where the archive should be placed
- * @param autoname if false, takes basename to be a file. If true, basename
+ * @param autoname if {@code false}, takes basename to be a file. If {@code true}, basename
* is assumed to be a directory in which a filename will be
* chosen according to the URL of the current page.
* @param callback called after the web archive has been saved. The
* parameter for onReceiveValue will either be the filename
- * under which the file was saved, or null if saving the
+ * under which the file was saved, or {@code null} if saving the
* file failed.
*/
public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
@@ -1101,7 +1096,7 @@
/**
* Gets whether this WebView has a back history item.
*
- * @return true iff this WebView has a back history item
+ * @return {@code true} iff this WebView has a back history item
*/
public boolean canGoBack() {
checkThread();
@@ -1119,7 +1114,7 @@
/**
* Gets whether this WebView has a forward history item.
*
- * @return true iff this WebView has a forward history item
+ * @return {@code true} iff this WebView has a forward history item
*/
public boolean canGoForward() {
checkThread();
@@ -1170,8 +1165,8 @@
/**
* Scrolls the contents of this WebView up by half the view size.
*
- * @param top true to jump to the top of the page
- * @return true if the page was scrolled
+ * @param top {@code true} to jump to the top of the page
+ * @return {@code true} if the page was scrolled
*/
public boolean pageUp(boolean top) {
checkThread();
@@ -1181,8 +1176,8 @@
/**
* Scrolls the contents of this WebView down by half the page size.
*
- * @param bottom true to jump to bottom of page
- * @return true if the page was scrolled
+ * @param bottom {@code true} to jump to bottom of page
+ * @return {@code true} if the page was scrolled
*/
public boolean pageDown(boolean bottom) {
checkThread();
@@ -1197,11 +1192,11 @@
* immediately be reflected visually by subsequent {@link WebView#onDraw} invocations. The
* {@link VisualStateCallback} provides a mechanism to notify the caller when the contents of
* the DOM at the current time are ready to be drawn the next time the {@link WebView}
- * draws.</p>
+ * draws.
*
* <p>The next draw after the callback completes is guaranteed to reflect all the updates to the
* DOM up to the point at which the {@link VisualStateCallback} was posted, but it may also
- * contain updates applied after the callback was posted.</p>
+ * contain updates applied after the callback was posted.
*
* <p>The state of the DOM covered by this API includes the following:
* <ul>
@@ -1214,7 +1209,7 @@
* It does not include the state of:
* <ul>
* <li>the video tag</li>
- * </ul></p>
+ * </ul>
*
* <p>To guarantee that the {@link WebView} will successfully render the first frame
* after the {@link VisualStateCallback#onComplete} method has been called a set of conditions
@@ -1230,11 +1225,11 @@
* {@link AbsoluteLayout.LayoutParams LayoutParams}'s width and height need to be set to fixed
* values and must be made {@link View#VISIBLE VISIBLE} from the
* {@link VisualStateCallback#onComplete} method.</li>
- * </ul></p>
+ * </ul>
*
* <p>When using this API it is also recommended to enable pre-rasterization if the {@link
* WebView} is off screen to avoid flickering. See {@link WebSettings#setOffscreenPreRaster} for
- * more details and do consider its caveats.</p>
+ * more details and do consider its caveats.
*
* @param requestId An id that will be returned in the callback to allow callers to match
* requests with callbacks.
@@ -1339,7 +1334,7 @@
* If the content fits into the WebView control by width, then
* the zoom is set to 100%. For wide content, the behavior
* depends on the state of {@link WebSettings#getLoadWithOverviewMode()}.
- * If its value is true, the content will be zoomed out to be fit
+ * If its value is {@code true}, the content will be zoomed out to be fit
* by width into the WebView control, otherwise not.
*
* If initial scale is greater than 0, WebView starts with this value
@@ -1389,7 +1384,7 @@
/**
* Requests the anchor or image element URL at the last tapped point.
- * If hrefMsg is null, this method returns immediately and does not
+ * If hrefMsg is {@code null}, this method returns immediately and does not
* dispatch hrefMsg to its target. If the tapped point hits an image,
* an anchor, or an image in an anchor, the message associates
* strings in named keys in its data. The value paired with the key
@@ -1410,7 +1405,7 @@
* to its target with a String representing the URL as its object.
*
* @param msg the message to be dispatched with the result of the request
- * as the data member with "url" as key. The result can be null.
+ * as the data member with "url" as key. The result can be {@code null}.
*/
public void requestImageRef(Message msg) {
checkThread();
@@ -1553,7 +1548,7 @@
/**
* Gets whether this WebView is paused, meaning onPause() was called.
- * Calling onResume() sets the paused state back to false.
+ * Calling onResume() sets the paused state back to {@code false}.
*
* @hide
*/
@@ -1577,7 +1572,7 @@
* Clears the resource cache. Note that the cache is per-application, so
* this will clear the cache for all WebViews used.
*
- * @param includeDiskFiles if false, only the RAM cache is cleared
+ * @param includeDiskFiles if {@code false}, only the RAM cache is cleared
*/
public void clearCache(boolean includeDiskFiles) {
checkThread();
@@ -1620,7 +1615,7 @@
* shared by all the WebViews that are created by the embedder application.
*
* @param onCleared A runnable to be invoked when client certs are cleared.
- * The embedder can pass null if not interested in the
+ * The embedder can pass {@code null} if not interested in the
* callback. The runnable will be called in UI thread.
*/
public static void clearClientCertPreferences(Runnable onCleared) {
@@ -1665,9 +1660,9 @@
* All other rules, including wildcards, are invalid.
*
* @param urls the list of URLs
- * @param callback will be called with true if URLs are successfully added to the whitelist.
- * It will be called with false if any URLs are malformed. The callback will be run on
- * the UI thread
+ * @param callback will be called with {@code true} if URLs are successfully added to the
+ * whitelist. It will be called with {@code false} if any URLs are malformed. The callback will
+ * be run on the UI thread
*/
public static void setSafeBrowsingWhitelist(@NonNull List<String> urls,
@Nullable ValueCallback<Boolean> callback) {
@@ -1761,9 +1756,9 @@
* @param text if non-null, will be the initial text to search for.
* Otherwise, the last String searched for in this WebView will
* be used to start.
- * @param showIme if true, show the IME, assuming the user will begin typing.
- * If false and text is non-null, perform a find all.
- * @return true if the find dialog is shown, false otherwise
+ * @param showIme if {@code true}, show the IME, assuming the user will begin typing.
+ * If {@code false} and text is non-null, perform a find all.
+ * @return {@code true} if the find dialog is shown, {@code false} otherwise
* @deprecated This method does not work reliably on all Android versions;
* implementing a custom find dialog using WebView.findAllAsync()
* provides a more robust solution.
@@ -1794,7 +1789,7 @@
* five digits.
*
* @param addr the string to search for addresses
- * @return the address, or if no address is found, null
+ * @return the address, or if no address is found, {@code null}
*/
public static String findAddress(String addr) {
// TODO: Rewrite this in Java so it is not needed to start up chromium
@@ -1893,7 +1888,7 @@
/**
* Gets the chrome handler.
*
- * @return the WebChromeClient, or null if not yet set
+ * @return the WebChromeClient, or {@code null} if not yet set
* @see #setWebChromeClient
*/
public WebChromeClient getWebChromeClient() {
@@ -1963,7 +1958,7 @@
* </ul>
*
* @param object the Java object to inject into this WebView's JavaScript
- * context. Null values are ignored.
+ * context. {@code null} values are ignored.
* @param name the name used to expose the object in JavaScript
*/
public void addJavascriptInterface(Object object, String name) {
@@ -1990,7 +1985,7 @@
* <a href="https://html.spec.whatwg.org/multipage/comms.html#messagechannel">here
* </a>
*
- * <p>The returned message channels are entangled and already in started state.</p>
+ * <p>The returned message channels are entangled and already in started state.
*
* @return the two message ports that form the message channel.
*/
@@ -2035,7 +2030,7 @@
* code running inside WebViews. Please refer to WebView documentation
* for the debugging guide.
*
- * The default is false.
+ * The default is {@code false}.
*
* @param enabled whether to enable web contents debugging
*/
@@ -2105,7 +2100,7 @@
}
/**
- * @deprecated Only the default case, true, will be supported in a future version.
+ * @deprecated Only the default case, {@code true}, will be supported in a future version.
*/
@Deprecated
public void setMapTrackballToArrowKeys(boolean setMap) {
@@ -2140,7 +2135,7 @@
/**
* Gets whether this WebView can be zoomed in.
*
- * @return true if this WebView can be zoomed in
+ * @return {@code true} if this WebView can be zoomed in
*
* @deprecated This method is prone to inaccuracy due to race conditions
* between the web rendering and UI threads; prefer
@@ -2155,7 +2150,7 @@
/**
* Gets whether this WebView can be zoomed out.
*
- * @return true if this WebView can be zoomed out
+ * @return {@code true} if this WebView can be zoomed out
*
* @deprecated This method is prone to inaccuracy due to race conditions
* between the web rendering and UI threads; prefer
@@ -2185,7 +2180,7 @@
/**
* Performs zoom in in this WebView.
*
- * @return true if zoom in succeeds, false if no zoom changes
+ * @return {@code true} if zoom in succeeds, {@code false} if no zoom changes
*/
public boolean zoomIn() {
checkThread();
@@ -2195,7 +2190,7 @@
/**
* Performs zoom out in this WebView.
*
- * @return true if zoom out succeeds, false if no zoom changes
+ * @return {@code true} if zoom out succeeds, {@code false} if no zoom changes
*/
public boolean zoomOut() {
checkThread();
@@ -2286,7 +2281,7 @@
*
* @param rendererRequestedPriority the minimum priority at which
* this WebView desires the renderer process to be bound.
- * @param waivedWhenNotVisible if true, this flag specifies that
+ * @param waivedWhenNotVisible if {@code true}, this flag specifies that
* when this WebView is not visible, it will be treated as
* if it had requested a priority of
* {@link #RENDERER_PRIORITY_WAIVED}.
@@ -2988,7 +2983,7 @@
* uninstalled. It can also be changed through a Developer Setting.
* If the WebView package changes, any app process that has loaded WebView will be killed. The
* next time the app starts and loads WebView it will use the new WebView package instead.
- * @return the current WebView package, or null if there is none.
+ * @return the current WebView package, or {@code null} if there is none.
*/
public static PackageInfo getCurrentWebViewPackage() {
PackageInfo webviewPackage = WebViewFactory.getLoadedPackageInfo();
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index e7e539c..af7026d 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -33,15 +33,15 @@
* Give the host application a chance to take over the control when a new
* url is about to be loaded in the current WebView. If WebViewClient is not
* provided, by default WebView will ask Activity Manager to choose the
- * proper handler for the url. If WebViewClient is provided, return true
- * means the host application handles the url, while return false means the
+ * proper handler for the url. If WebViewClient is provided, return {@code true}
+ * means the host application handles the url, while return {@code false} means the
* current WebView handles the url.
* This method is not called for requests using the POST "method".
*
* @param view The WebView that is initiating the callback.
* @param url The url to be loaded.
- * @return True if the host application wants to leave the current WebView
- * and handle the url itself, otherwise return false.
+ * @return {@code true} if the host application wants to leave the current WebView
+ * and handle the url itself, otherwise return {@code false}.
* @deprecated Use {@link #shouldOverrideUrlLoading(WebView, WebResourceRequest)
* shouldOverrideUrlLoading(WebView, WebResourceRequest)} instead.
*/
@@ -54,8 +54,8 @@
* Give the host application a chance to take over the control when a new
* url is about to be loaded in the current WebView. If WebViewClient is not
* provided, by default WebView will ask Activity Manager to choose the
- * proper handler for the url. If WebViewClient is provided, return true
- * means the host application handles the url, while return false means the
+ * proper handler for the url. If WebViewClient is provided, return {@code true}
+ * means the host application handles the url, while return {@code false} means the
* current WebView handles the url.
*
* <p>Notes:
@@ -63,15 +63,14 @@
* <li>This method is not called for requests using the POST "method".</li>
* <li>This method is also called for subframes with non-http schemes, thus it is
* strongly disadvised to unconditionally call {@link WebView#loadUrl(String)}
- * with the request's url from inside the method and then return true,
+ * with the request's url from inside the method and then return {@code true},
* as this will make WebView to attempt loading a non-http url, and thus fail.</li>
* </ul>
- * </p>
*
* @param view The WebView that is initiating the callback.
* @param request Object containing the details of the request.
- * @return True if the host application wants to leave the current WebView
- * and handle the url itself, otherwise return false.
+ * @return {@code true} if the host application wants to leave the current WebView
+ * and handle the url itself, otherwise return {@code false}.
*/
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl().toString());
@@ -130,15 +129,15 @@
* <p>This method is called when the body of the HTTP response has started loading, is reflected
* in the DOM, and will be visible in subsequent draws. This callback occurs early in the
* document loading process, and as such you should expect that linked resources (for example,
- * css and images) may not be available.</p>
+ * css and images) may not be available.
*
* <p>For more fine-grained notification of visual state updates, see {@link
- * WebView#postVisualStateCallback}.</p>
+ * WebView#postVisualStateCallback}.
*
* <p>Please note that all the conditions and recommendations applicable to
- * {@link WebView#postVisualStateCallback} also apply to this API.<p>
+ * {@link WebView#postVisualStateCallback} also apply to this API.
*
- * <p>This callback is only called for main frame navigations.</p>
+ * <p>This callback is only called for main frame navigations.
*
* @param view The {@link android.webkit.WebView} for which the navigation occurred.
* @param url The URL corresponding to the page navigation that triggered this callback.
@@ -148,17 +147,21 @@
/**
* Notify the host application of a resource request and allow the
- * application to return the data. If the return value is null, the WebView
+ * application to return the data. If the return value is {@code null}, the WebView
* will continue to load the resource as usual. Otherwise, the return
* response and data will be used. NOTE: This method is called on a thread
* other than the UI thread so clients should exercise caution
* when accessing private data or the view system.
*
+ * <p>Note: when Safe Browsing is enabled, these URLs still undergo Safe Browsing checks. If
+ * this is undesired, whitelist the URL with {@link WebView#setSafeBrowsingWhitelist} or ignore
+ * the warning with {@link #onSafeBrowsingHit}.
+ *
* @param view The {@link android.webkit.WebView} that is requesting the
* resource.
* @param url The raw url of the resource.
* @return A {@link android.webkit.WebResourceResponse} containing the
- * response information or null if the WebView should load the
+ * response information or {@code null} if the WebView should load the
* resource itself.
* @deprecated Use {@link #shouldInterceptRequest(WebView, WebResourceRequest)
* shouldInterceptRequest(WebView, WebResourceRequest)} instead.
@@ -171,17 +174,21 @@
/**
* Notify the host application of a resource request and allow the
- * application to return the data. If the return value is null, the WebView
+ * application to return the data. If the return value is {@code null}, the WebView
* will continue to load the resource as usual. Otherwise, the return
* response and data will be used. NOTE: This method is called on a thread
* other than the UI thread so clients should exercise caution
* when accessing private data or the view system.
*
+ * <p>Note: when Safe Browsing is enabled, these URLs still undergo Safe Browsing checks. If
+ * this is undesired, whitelist the URL with {@link WebView#setSafeBrowsingWhitelist} or ignore
+ * the warning with {@link #onSafeBrowsingHit}.
+ *
* @param view The {@link android.webkit.WebView} that is requesting the
* resource.
* @param request Object containing the details of the request.
* @return A {@link android.webkit.WebResourceResponse} containing the
- * response information or null if the WebView should load the
+ * response information or {@code null} if the WebView should load the
* resource itself.
*/
public WebResourceResponse shouldInterceptRequest(WebView view,
@@ -326,7 +333,7 @@
*
* @param view The WebView that is initiating the callback.
* @param url The url being visited.
- * @param isReload True if this url is being reloaded.
+ * @param isReload {@code true} if this url is being reloaded.
*/
public void doUpdateVisitedHistory(WebView view, String url,
boolean isReload) {
@@ -406,14 +413,14 @@
/**
* Give the host application a chance to handle the key event synchronously.
* e.g. menu shortcut key events need to be filtered this way. If return
- * true, WebView will not handle the key event. If return false, WebView
+ * true, WebView will not handle the key event. If return {@code false}, WebView
* will always handle the key event, so none of the super in the view chain
- * will see the key event. The default behavior returns false.
+ * will see the key event. The default behavior returns {@code false}.
*
* @param view The WebView that is initiating the callback.
* @param event The key event.
- * @return True if the host application wants to handle the key event
- * itself, otherwise return false
+ * @return {@code true} if the host application wants to handle the key event
+ * itself, otherwise return {@code false}
*/
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
return false;
@@ -422,7 +429,7 @@
/**
* Notify the host application that a key was not handled by the WebView.
* Except system keys, WebView always consumes the keys in the normal flow
- * or if shouldOverrideKeyEvent returns true. This is called asynchronously
+ * or if shouldOverrideKeyEvent returns {@code true}. This is called asynchronously
* from where the key is dispatched. It gives the host application a chance
* to handle the unhandled key events.
*
@@ -436,7 +443,7 @@
/**
* Notify the host application that a input event was not handled by the WebView.
* Except system keys, WebView always consumes input events in the normal flow
- * or if shouldOverrideKeyEvent returns true. This is called asynchronously
+ * or if shouldOverrideKeyEvent returns {@code true}. This is called asynchronously
* from where the event is dispatched. It gives the host application a chance
* to handle the unhandled input events.
*
@@ -483,7 +490,7 @@
* user has been processed.
* @param view The WebView requesting the login.
* @param realm The account realm used to look up accounts.
- * @param account An optional account. If not null, the account should be
+ * @param account An optional account. If not {@code null}, the account should be
* checked against accounts on the device. If it is a valid
* account, it should be used to log in the user.
* @param args Authenticator specific arguments used to log in the user.
@@ -512,7 +519,7 @@
*
* @param view The WebView which needs to be cleaned up.
* @param detail the reason why it exited.
- * @return true if the host application handled the situation that process has
+ * @return {@code true} if the host application handled the situation that process has
* exited, otherwise, application will crash if render process crashed,
* or be killed if render process was killed by the system.
*/
diff --git a/core/java/android/webkit/WebViewDatabase.java b/core/java/android/webkit/WebViewDatabase.java
index 982c57b..de75d5d0 100644
--- a/core/java/android/webkit/WebViewDatabase.java
+++ b/core/java/android/webkit/WebViewDatabase.java
@@ -42,7 +42,7 @@
* Gets whether there are any saved username/password pairs for web forms.
* Note that these are unrelated to HTTP authentication credentials.
*
- * @return true if there are any saved username/password pairs
+ * @return {@code true} if there are any saved username/password pairs
* @see WebView#savePassword
* @see #clearUsernamePassword
* @deprecated Saving passwords in WebView will not be supported in future versions.
@@ -129,7 +129,7 @@
* @param host the host to which the credentials apply
* @param realm the realm to which the credentials apply
* @return the credentials as a String array, if found. The first element
- * is the username and the second element is the password. Null if
+ * is the username and the second element is the password. {@code null} if
* no credentials are found.
* @see #setHttpAuthUsernamePassword
* @see #hasHttpAuthUsernamePassword
diff --git a/core/java/android/webkit/WebViewDelegate.java b/core/java/android/webkit/WebViewDelegate.java
index 92d0d71..7339931 100644
--- a/core/java/android/webkit/WebViewDelegate.java
+++ b/core/java/android/webkit/WebViewDelegate.java
@@ -68,22 +68,22 @@
}
/**
- * Returns true if the WebView trace tag is enabled and false otherwise.
+ * Returns {@code true} if the WebView trace tag is enabled and {@code false} otherwise.
*/
public boolean isTraceTagEnabled() {
return Trace.isTagEnabled(Trace.TRACE_TAG_WEBVIEW);
}
/**
- * Returns true if the draw GL functor can be invoked (see {@link #invokeDrawGlFunctor})
- * and false otherwise.
+ * Returns {@code true} if the draw GL functor can be invoked (see {@link #invokeDrawGlFunctor})
+ * and {@code false} otherwise.
*/
public boolean canInvokeDrawGlFunctor(View containerView) {
return true;
}
/**
- * Invokes the draw GL functor. If waitForCompletion is false the functor
+ * Invokes the draw GL functor. If waitForCompletion is {@code false} the functor
* may be invoked asynchronously.
*
* @param nativeDrawGLFunctor the pointer to the native functor that implements
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 668cfba..7c4154f 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -222,7 +222,7 @@
}
/**
- * Returns true if the signatures match, false otherwise
+ * Returns {@code true} if the signatures match, {@code false} otherwise
*/
private static boolean signaturesEquals(Signature[] s1, Signature[] s2) {
if (s1 == null) {
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index 820b49a..c46c681 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -19,16 +19,16 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.content.res.Configuration;
import android.content.Intent;
+import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Picture;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.net.http.SslCertificate;
import android.net.Uri;
+import android.net.http.SslCertificate;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -73,7 +73,8 @@
* Initialize this WebViewProvider instance. Called after the WebView has fully constructed.
* @param javaScriptInterfaces is a Map of interface names, as keys, and
* object implementing those interfaces, as values.
- * @param privateBrowsing If true the web view will be initialized in private / incognito mode.
+ * @param privateBrowsing If {@code true} the web view will be initialized in private /
+ * incognito mode.
*/
public void init(Map<String, Object> javaScriptInterfaces,
boolean privateBrowsing);
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index 0204dff..6e65c7a 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -28,7 +28,6 @@
import com.android.internal.annotations.GuardedBy;
import java.io.File;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -48,8 +47,8 @@
private static final Object sLock = new Object();
/**
- * Instance that maintains the socket connection to the zygote. This is null if the zygote
- * is not running or is not connected.
+ * Instance that maintains the socket connection to the zygote. This is {@code null} if the
+ * zygote is not running or is not connected.
*/
@GuardedBy("sLock")
private static ZygoteProcess sZygote;
@@ -75,7 +74,7 @@
private static String sPackageCacheKey;
/**
- * Flag for whether multi-process WebView is enabled. If this is false, the zygote
+ * Flag for whether multi-process WebView is enabled. If this is {@code false}, the zygote
* will not be started.
*/
@GuardedBy("sLock")
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index 60b4757..e40023d 100755
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -22,11 +22,10 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.icu.text.DateFormat;
import android.icu.text.DisplayContext;
-import android.icu.text.SimpleDateFormat;
import android.icu.util.Calendar;
import android.os.Parcelable;
-import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.util.StateSet;
import android.view.HapticFeedbackConstants;
@@ -62,8 +61,8 @@
private static final int[] ATTRS_DISABLED_ALPHA = new int[] {
com.android.internal.R.attr.disabledAlpha};
- private SimpleDateFormat mYearFormat;
- private SimpleDateFormat mMonthDayFormat;
+ private DateFormat mYearFormat;
+ private DateFormat mMonthDayFormat;
// Top-level container.
private ViewGroup mContainer;
@@ -273,19 +272,16 @@
/**
* Listener called when the user clicks on a header item.
*/
- private final OnClickListener mOnHeaderClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- tryVibrate();
+ private final OnClickListener mOnHeaderClickListener = v -> {
+ tryVibrate();
- switch (v.getId()) {
- case R.id.date_picker_header_year:
- setCurrentView(VIEW_YEAR);
- break;
- case R.id.date_picker_header_date:
- setCurrentView(VIEW_MONTH_DAY);
- break;
- }
+ switch (v.getId()) {
+ case R.id.date_picker_header_year:
+ setCurrentView(VIEW_YEAR);
+ break;
+ case R.id.date_picker_header_date:
+ setCurrentView(VIEW_MONTH_DAY);
+ break;
}
};
@@ -299,10 +295,9 @@
}
// Update the date formatter.
- final String datePattern = DateFormat.getBestDateTimePattern(locale, "EMMMd");
- mMonthDayFormat = new SimpleDateFormat(datePattern, locale);
+ mMonthDayFormat = DateFormat.getInstanceForSkeleton("EMMMd", locale);
mMonthDayFormat.setContext(DisplayContext.CAPITALIZATION_FOR_STANDALONE);
- mYearFormat = new SimpleDateFormat("y", locale);
+ mYearFormat = DateFormat.getInstanceForSkeleton("y", locale);
// Update the header text.
onCurrentDateChanged(false);
@@ -344,14 +339,11 @@
case VIEW_YEAR:
final int year = mCurrentDate.get(Calendar.YEAR);
mYearPickerView.setYear(year);
- mYearPickerView.post(new Runnable() {
- @Override
- public void run() {
- mYearPickerView.requestFocus();
- final View selected = mYearPickerView.getSelectedView();
- if (selected != null) {
- selected.requestFocus();
- }
+ mYearPickerView.post(() -> {
+ mYearPickerView.requestFocus();
+ final View selected = mYearPickerView.getSelectedView();
+ if (selected != null) {
+ selected.requestFocus();
}
});
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 040a1d8..0f61724 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -41,6 +41,7 @@
import android.graphics.RectF;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.metrics.LogMaker;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
@@ -1262,7 +1263,8 @@
}
}
- void sendOnTextChanged(int start, int after) {
+ void sendOnTextChanged(int start, int before, int after) {
+ getSelectionActionModeHelper().onTextChanged(start, start + before);
updateSpellCheckSpans(start, start + after, false);
// Flip flag to indicate the word iterator needs to have the text reset.
@@ -1584,49 +1586,49 @@
outText.startOffset = 0;
outText.selectionStart = mTextView.getSelectionStart();
outText.selectionEnd = mTextView.getSelectionEnd();
+ outText.hint = mTextView.getHint();
return true;
}
boolean reportExtractedText() {
final Editor.InputMethodState ims = mInputMethodState;
- if (ims != null) {
- final boolean contentChanged = ims.mContentChanged;
- if (contentChanged || ims.mSelectionModeChanged) {
- ims.mContentChanged = false;
- ims.mSelectionModeChanged = false;
- final ExtractedTextRequest req = ims.mExtractedTextRequest;
- if (req != null) {
- InputMethodManager imm = InputMethodManager.peekInstance();
- if (imm != null) {
- if (TextView.DEBUG_EXTRACT) {
- Log.v(TextView.LOG_TAG, "Retrieving extracted start="
- + ims.mChangedStart
- + " end=" + ims.mChangedEnd
- + " delta=" + ims.mChangedDelta);
- }
- if (ims.mChangedStart < 0 && !contentChanged) {
- ims.mChangedStart = EXTRACT_NOTHING;
- }
- if (extractTextInternal(req, ims.mChangedStart, ims.mChangedEnd,
- ims.mChangedDelta, ims.mExtractedText)) {
- if (TextView.DEBUG_EXTRACT) {
- Log.v(TextView.LOG_TAG,
- "Reporting extracted start="
- + ims.mExtractedText.partialStartOffset
- + " end=" + ims.mExtractedText.partialEndOffset
- + ": " + ims.mExtractedText.text);
- }
-
- imm.updateExtractedText(mTextView, req.token, ims.mExtractedText);
- ims.mChangedStart = EXTRACT_UNKNOWN;
- ims.mChangedEnd = EXTRACT_UNKNOWN;
- ims.mChangedDelta = 0;
- ims.mContentChanged = false;
- return true;
- }
- }
- }
+ if (ims == null) {
+ return false;
+ }
+ ims.mSelectionModeChanged = false;
+ final ExtractedTextRequest req = ims.mExtractedTextRequest;
+ if (req == null) {
+ return false;
+ }
+ final InputMethodManager imm = InputMethodManager.peekInstance();
+ if (imm == null) {
+ return false;
+ }
+ if (TextView.DEBUG_EXTRACT) {
+ Log.v(TextView.LOG_TAG, "Retrieving extracted start="
+ + ims.mChangedStart
+ + " end=" + ims.mChangedEnd
+ + " delta=" + ims.mChangedDelta);
+ }
+ if (ims.mChangedStart < 0 && !ims.mContentChanged) {
+ ims.mChangedStart = EXTRACT_NOTHING;
+ }
+ if (extractTextInternal(req, ims.mChangedStart, ims.mChangedEnd,
+ ims.mChangedDelta, ims.mExtractedText)) {
+ if (TextView.DEBUG_EXTRACT) {
+ Log.v(TextView.LOG_TAG,
+ "Reporting extracted start="
+ + ims.mExtractedText.partialStartOffset
+ + " end=" + ims.mExtractedText.partialEndOffset
+ + ": " + ims.mExtractedText.text);
}
+
+ imm.updateExtractedText(mTextView, req.token, ims.mExtractedText);
+ ims.mChangedStart = EXTRACT_UNKNOWN;
+ ims.mChangedEnd = EXTRACT_UNKNOWN;
+ ims.mChangedDelta = 0;
+ ims.mContentChanged = false;
+ return true;
}
return false;
}
@@ -1689,6 +1691,10 @@
} else {
layout.draw(canvas, highlight, highlightPaint, cursorOffsetVertical);
}
+
+ if (mSelectionActionModeHelper != null) {
+ mSelectionActionModeHelper.onDraw(canvas);
+ }
}
private void drawHardwareAccelerated(Canvas canvas, Layout layout, Path highlight,
@@ -3927,6 +3933,10 @@
textClassification.getLabel())
.setIcon(textClassification.getIcon())
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ mMetricsLogger.write(
+ new LogMaker(MetricsEvent.TEXT_SELECTION_MENU_ITEM_ASSIST)
+ .setType(MetricsEvent.TYPE_OPEN)
+ .setSubtype(textClassification.getLogType()));
}
}
@@ -3968,6 +3978,9 @@
.onClick(mTextView);
}
}
+ mMetricsLogger.action(
+ MetricsEvent.ACTION_TEXT_SELECTION_MENU_ITEM_ASSIST,
+ textClassification.getLogType());
stopTextActionMode();
return true;
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 46742b8..bc85fad 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -144,11 +144,6 @@
private ArrayList<Action> mActions;
/**
- * A class to keep track of memory usage by this RemoteViews
- */
- private MemoryUsageCounter mMemoryUsageCounter;
-
- /**
* Maps bitmaps to unique indicies to avoid Bitmap duplication.
*/
private BitmapCache mBitmapCache;
@@ -294,7 +289,6 @@
public String asyncMethodName;
}
-
/**
* This annotation indicates that a subclass of View is allowed to be used
* with the {@link RemoteViews} mechanism.
@@ -386,14 +380,6 @@
return 0;
}
- /**
- * Overridden by each class to report on it's own memory usage
- */
- public void updateMemoryUsageEstimate(MemoryUsageCounter counter) {
- // We currently only calculate Bitmap memory usage, so by default,
- // don't do anything here
- }
-
public void setBitmapCache(BitmapCache bitmapCache) {
// Do nothing
}
@@ -466,7 +452,7 @@
// We first copy the new RemoteViews, as the process of merging modifies the way the actions
// reference the bitmap cache. We don't want to modify the object as it may need to
// be merged and applied multiple times.
- RemoteViews copy = newRv.clone();
+ RemoteViews copy = new RemoteViews(newRv);
HashMap<String, Action> map = new HashMap<String, Action>();
if (mActions == null) {
@@ -500,7 +486,6 @@
// Because pruning can remove the need for bitmaps, we reconstruct the bitmap cache
mBitmapCache = new BitmapCache();
setBitmapCache(mBitmapCache);
- recalculateMemoryUsage();
}
private static class RemoteViewsContextWrapper extends ContextWrapper {
@@ -1162,15 +1147,17 @@
}
private static class BitmapCache {
+
ArrayList<Bitmap> mBitmaps;
+ int mBitmapMemory = -1;
public BitmapCache() {
- mBitmaps = new ArrayList<Bitmap>();
+ mBitmaps = new ArrayList<>();
}
public BitmapCache(Parcel source) {
int count = source.readInt();
- mBitmaps = new ArrayList<Bitmap>();
+ mBitmaps = new ArrayList<>(count);
for (int i = 0; i < count; i++) {
Bitmap b = Bitmap.CREATOR.createFromParcel(source);
mBitmaps.add(b);
@@ -1185,6 +1172,7 @@
return mBitmaps.indexOf(b);
} else {
mBitmaps.add(b);
+ mBitmapMemory = -1;
return (mBitmaps.size() - 1);
}
}
@@ -1206,28 +1194,15 @@
}
}
- public void assimilate(BitmapCache bitmapCache) {
- ArrayList<Bitmap> bitmapsToBeAdded = bitmapCache.mBitmaps;
- int count = bitmapsToBeAdded.size();
- for (int i = 0; i < count; i++) {
- Bitmap b = bitmapsToBeAdded.get(i);
- if (!mBitmaps.contains(b)) {
- mBitmaps.add(b);
+ public int getBitmapMemory() {
+ if (mBitmapMemory < 0) {
+ mBitmapMemory = 0;
+ int count = mBitmaps.size();
+ for (int i = 0; i < count; i++) {
+ mBitmapMemory += mBitmaps.get(i).getAllocationByteCount();
}
}
- }
-
- public void addBitmapMemory(MemoryUsageCounter memoryCounter) {
- for (int i = 0; i < mBitmaps.size(); i++) {
- memoryCounter.addBitmapMemory(mBitmaps.get(i));
- }
- }
-
- @Override
- protected BitmapCache clone() {
- BitmapCache bitmapCache = new BitmapCache();
- bitmapCache.mBitmaps.addAll(mBitmaps);
- return bitmapCache;
+ return mBitmapMemory;
}
}
@@ -1429,37 +1404,17 @@
case CHAR_SEQUENCE:
TextUtils.writeToParcel((CharSequence)this.value, out, flags);
break;
- case URI:
- out.writeInt(this.value != null ? 1 : 0);
- if (this.value != null) {
- ((Uri)this.value).writeToParcel(out, flags);
- }
- break;
- case BITMAP:
- out.writeInt(this.value != null ? 1 : 0);
- if (this.value != null) {
- ((Bitmap)this.value).writeToParcel(out, flags);
- }
- break;
case BUNDLE:
out.writeBundle((Bundle) this.value);
break;
+ case URI:
+ case BITMAP:
case INTENT:
- out.writeInt(this.value != null ? 1 : 0);
- if (this.value != null) {
- ((Intent)this.value).writeToParcel(out, flags);
- }
- break;
case COLOR_STATE_LIST:
- out.writeInt(this.value != null ? 1 : 0);
- if (this.value != null) {
- ((ColorStateList)this.value).writeToParcel(out, flags);
- }
- break;
case ICON:
out.writeInt(this.value != null ? 1 : 0);
if (this.value != null) {
- ((Icon)this.value).writeToParcel(out, flags);
+ ((Parcelable) this.value).writeToParcel(out, flags);
}
break;
default:
@@ -1595,7 +1550,6 @@
}
private void configureRemoteViewsAsChild(RemoteViews rv) {
- mBitmapCache.assimilate(rv.mBitmapCache);
rv.setBitmapCache(mBitmapCache);
rv.setNotRoot();
}
@@ -1693,11 +1647,6 @@
}
@Override
- public void updateMemoryUsageEstimate(MemoryUsageCounter counter) {
- counter.increment(mNestedViews.estimateMemoryUsage());
- }
-
- @Override
public void setBitmapCache(BitmapCache bitmapCache) {
mNestedViews.setBitmapCache(bitmapCache);
}
@@ -2302,30 +2251,6 @@
}
/**
- * Simple class used to keep track of memory usage in a RemoteViews.
- *
- */
- private class MemoryUsageCounter {
- public void clear() {
- mMemoryUsage = 0;
- }
-
- public void increment(int numBytes) {
- mMemoryUsage += numBytes;
- }
-
- public int getMemoryUsage() {
- return mMemoryUsage;
- }
-
- public void addBitmapMemory(Bitmap b) {
- increment(b.getAllocationByteCount());
- }
-
- int mMemoryUsage;
- }
-
- /**
* Create a new RemoteViews object that will display the views contained
* in the specified layout file.
*
@@ -2363,9 +2288,6 @@
mApplication = application;
mLayoutId = layoutId;
mBitmapCache = new BitmapCache();
- // setup the memory usage statistics
- mMemoryUsageCounter = new MemoryUsageCounter();
- recalculateMemoryUsage();
}
private boolean hasLandscapeAndPortraitLayouts() {
@@ -2393,14 +2315,49 @@
mLandscape = landscape;
mPortrait = portrait;
- // setup the memory usage statistics
- mMemoryUsageCounter = new MemoryUsageCounter();
-
mBitmapCache = new BitmapCache();
configureRemoteViewsAsChild(landscape);
configureRemoteViewsAsChild(portrait);
+ }
- recalculateMemoryUsage();
+ /**
+ * Creates a copy of another RemoteViews.
+ */
+ public RemoteViews(RemoteViews src) {
+ mBitmapCache = src.mBitmapCache;
+ mApplication = src.mApplication;
+ mIsRoot = src.mIsRoot;
+ mLayoutId = src.mLayoutId;
+ mIsWidgetCollectionChild = src.mIsWidgetCollectionChild;
+ mReapplyDisallowed = src.mReapplyDisallowed;
+
+ if (src.hasLandscapeAndPortraitLayouts()) {
+ mLandscape = new RemoteViews(src.mLandscape);
+ mPortrait = new RemoteViews(src.mPortrait);
+
+ }
+
+ if (src.mActions != null) {
+ mActions = new ArrayList<>();
+
+ Parcel p = Parcel.obtain();
+ int count = src.mActions.size();
+ for (int i = 0; i < count; i++) {
+ p.setDataPosition(0);
+ Action a = src.mActions.get(i);
+ a.writeToParcel(
+ p, a.hasSameAppInfo(mApplication) ? PARCELABLE_ELIDE_DUPLICATES : 0);
+ p.setDataPosition(0);
+ // Since src is already in memory, we do not care about stack overflow as it has
+ // already been read once.
+ mActions.add(getActionFromParcel(p, 0));
+ }
+ p.recycle();
+ }
+
+ // Now that everything is initialized and duplicated, setting a new BitmapCache will
+ // re-initialize the cache.
+ setBitmapCache(new BitmapCache());
}
/**
@@ -2437,71 +2394,9 @@
int count = parcel.readInt();
if (count > 0) {
- mActions = new ArrayList<Action>(count);
- for (int i=0; i<count; i++) {
- int tag = parcel.readInt();
- switch (tag) {
- case SET_ON_CLICK_PENDING_INTENT_TAG:
- mActions.add(new SetOnClickPendingIntent(parcel));
- break;
- case SET_DRAWABLE_PARAMETERS_TAG:
- mActions.add(new SetDrawableParameters(parcel));
- break;
- case REFLECTION_ACTION_TAG:
- mActions.add(new ReflectionAction(parcel));
- break;
- case VIEW_GROUP_ACTION_ADD_TAG:
- mActions.add(new ViewGroupActionAdd(parcel, mBitmapCache, mApplication,
- depth));
- break;
- case VIEW_GROUP_ACTION_REMOVE_TAG:
- mActions.add(new ViewGroupActionRemove(parcel));
- break;
- case SET_REFLECTION_ACTION_WITHOUT_PARAMS_TAG:
- mActions.add(new ReflectionActionWithoutParams(parcel));
- break;
- case SET_EMPTY_VIEW_ACTION_TAG:
- mActions.add(new SetEmptyView(parcel));
- break;
- case SET_PENDING_INTENT_TEMPLATE_TAG:
- mActions.add(new SetPendingIntentTemplate(parcel));
- break;
- case SET_ON_CLICK_FILL_IN_INTENT_TAG:
- mActions.add(new SetOnClickFillInIntent(parcel));
- break;
- case SET_REMOTE_VIEW_ADAPTER_INTENT_TAG:
- mActions.add(new SetRemoteViewsAdapterIntent(parcel));
- break;
- case TEXT_VIEW_DRAWABLE_ACTION_TAG:
- mActions.add(new TextViewDrawableAction(parcel));
- break;
- case TEXT_VIEW_SIZE_ACTION_TAG:
- mActions.add(new TextViewSizeAction(parcel));
- break;
- case VIEW_PADDING_ACTION_TAG:
- mActions.add(new ViewPaddingAction(parcel));
- break;
- case BITMAP_REFLECTION_ACTION_TAG:
- mActions.add(new BitmapReflectionAction(parcel));
- break;
- case SET_REMOTE_VIEW_ADAPTER_LIST_TAG:
- mActions.add(new SetRemoteViewsAdapterList(parcel));
- break;
- case TEXT_VIEW_DRAWABLE_COLOR_FILTER_ACTION_TAG:
- mActions.add(new TextViewDrawableColorFilterAction(parcel));
- break;
- case SET_REMOTE_INPUTS_ACTION_TAG:
- mActions.add(new SetRemoteInputsAction(parcel));
- break;
- case LAYOUT_PARAM_ACTION_TAG:
- mActions.add(new LayoutParamAction(parcel));
- break;
- case OVERRIDE_TEXT_COLORS_TAG:
- mActions.add(new OverrideTextColorsAction(parcel));
- break;
- default:
- throw new ActionException("Tag " + tag + " not found");
- }
+ mActions = new ArrayList<>(count);
+ for (int i = 0; i < count; i++) {
+ mActions.add(getActionFromParcel(parcel, depth));
}
}
} else {
@@ -2512,40 +2407,69 @@
mLayoutId = mPortrait.getLayoutId();
}
mReapplyDisallowed = parcel.readInt() == 0;
-
- // setup the memory usage statistics
- mMemoryUsageCounter = new MemoryUsageCounter();
- recalculateMemoryUsage();
}
+ private Action getActionFromParcel(Parcel parcel, int depth) {
+ int tag = parcel.readInt();
+ switch (tag) {
+ case SET_ON_CLICK_PENDING_INTENT_TAG:
+ return new SetOnClickPendingIntent(parcel);
+ case SET_DRAWABLE_PARAMETERS_TAG:
+ return new SetDrawableParameters(parcel);
+ case REFLECTION_ACTION_TAG:
+ return new ReflectionAction(parcel);
+ case VIEW_GROUP_ACTION_ADD_TAG:
+ return new ViewGroupActionAdd(parcel, mBitmapCache, mApplication, depth);
+ case VIEW_GROUP_ACTION_REMOVE_TAG:
+ return new ViewGroupActionRemove(parcel);
+ case SET_REFLECTION_ACTION_WITHOUT_PARAMS_TAG:
+ return new ReflectionActionWithoutParams(parcel);
+ case SET_EMPTY_VIEW_ACTION_TAG:
+ return new SetEmptyView(parcel);
+ case SET_PENDING_INTENT_TEMPLATE_TAG:
+ return new SetPendingIntentTemplate(parcel);
+ case SET_ON_CLICK_FILL_IN_INTENT_TAG:
+ return new SetOnClickFillInIntent(parcel);
+ case SET_REMOTE_VIEW_ADAPTER_INTENT_TAG:
+ return new SetRemoteViewsAdapterIntent(parcel);
+ case TEXT_VIEW_DRAWABLE_ACTION_TAG:
+ return new TextViewDrawableAction(parcel);
+ case TEXT_VIEW_SIZE_ACTION_TAG:
+ return new TextViewSizeAction(parcel);
+ case VIEW_PADDING_ACTION_TAG:
+ return new ViewPaddingAction(parcel);
+ case BITMAP_REFLECTION_ACTION_TAG:
+ return new BitmapReflectionAction(parcel);
+ case SET_REMOTE_VIEW_ADAPTER_LIST_TAG:
+ return new SetRemoteViewsAdapterList(parcel);
+ case TEXT_VIEW_DRAWABLE_COLOR_FILTER_ACTION_TAG:
+ return new TextViewDrawableColorFilterAction(parcel);
+ case SET_REMOTE_INPUTS_ACTION_TAG:
+ return new SetRemoteInputsAction(parcel);
+ case LAYOUT_PARAM_ACTION_TAG:
+ return new LayoutParamAction(parcel);
+ case OVERRIDE_TEXT_COLORS_TAG:
+ return new OverrideTextColorsAction(parcel);
+ default:
+ throw new ActionException("Tag " + tag + " not found");
+ }
+ };
+
/**
* Returns a deep copy of the RemoteViews object. The RemoteView may not be
* attached to another RemoteView -- it must be the root of a hierarchy.
*
+ * @deprecated use {@link #RemoteViews(RemoteViews)} instead.
* @throws IllegalStateException if this is not the root of a RemoteView
* hierarchy
*/
@Override
+ @Deprecated
public RemoteViews clone() {
- synchronized (this) {
- Preconditions.checkState(mIsRoot, "RemoteView has been attached to another RemoteView. "
- + "May only clone the root of a RemoteView hierarchy.");
+ Preconditions.checkState(mIsRoot, "RemoteView has been attached to another RemoteView. "
+ + "May only clone the root of a RemoteView hierarchy.");
- Parcel p = Parcel.obtain();
-
- // Do not parcel the Bitmap cache - doing so creates an expensive copy of all bitmaps.
- // Instead pretend we're not owning the cache while parceling.
- mIsRoot = false;
- writeToParcel(p, PARCELABLE_ELIDE_DUPLICATES);
- p.setDataPosition(0);
- mIsRoot = true;
-
- RemoteViews rv = new RemoteViews(p, mBitmapCache.clone(), mApplication, 0);
- rv.mIsRoot = true;
-
- p.recycle();
- return rv;
- }
+ return new RemoteViews(this);
}
public String getPackage() {
@@ -2575,30 +2499,6 @@
}
/**
- * Updates the memory usage statistics.
- */
- private void recalculateMemoryUsage() {
- mMemoryUsageCounter.clear();
-
- if (!hasLandscapeAndPortraitLayouts()) {
- // Accumulate the memory usage for each action
- if (mActions != null) {
- final int count = mActions.size();
- for (int i= 0; i < count; ++i) {
- mActions.get(i).updateMemoryUsageEstimate(mMemoryUsageCounter);
- }
- }
- if (mIsRoot) {
- mBitmapCache.addBitmapMemory(mMemoryUsageCounter);
- }
- } else {
- mMemoryUsageCounter.increment(mLandscape.estimateMemoryUsage());
- mMemoryUsageCounter.increment(mPortrait.estimateMemoryUsage());
- mBitmapCache.addBitmapMemory(mMemoryUsageCounter);
- }
- }
-
- /**
* Recursively sets BitmapCache in the hierarchy and update the bitmap ids.
*/
private void setBitmapCache(BitmapCache bitmapCache) {
@@ -2621,7 +2521,7 @@
*/
/** @hide */
public int estimateMemoryUsage() {
- return mMemoryUsageCounter.getMemoryUsage();
+ return mBitmapCache.getBitmapMemory();
}
/**
@@ -2636,12 +2536,9 @@
" portrait layouts individually before constructing the combined layout.");
}
if (mActions == null) {
- mActions = new ArrayList<Action>();
+ mActions = new ArrayList<>();
}
mActions.add(a);
-
- // update the memory usage stats
- a.updateMemoryUsageEstimate(mMemoryUsageCounter);
}
/**
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index f1b36274..36dc330 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -20,7 +20,7 @@
import android.annotation.Nullable;
import android.annotation.UiThread;
import android.annotation.WorkerThread;
-import android.content.Context;
+import android.graphics.Canvas;
import android.graphics.PointF;
import android.graphics.RectF;
import android.os.AsyncTask;
@@ -47,6 +47,7 @@
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;
+import java.util.regex.Pattern;
/**
* Helper class for starting selection action mode
@@ -55,7 +56,7 @@
*/
@UiThread
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
-final class SelectionActionModeHelper {
+public final class SelectionActionModeHelper {
/**
* Maximum time (in milliseconds) to wait for a result before timing out.
@@ -73,6 +74,9 @@
private AsyncTask mTextClassificationAsyncTask;
private final SelectionTracker mSelectionTracker;
+
+ // TODO remove nullable marker once the switch gating the feature gets removed
+ @Nullable
private final SmartSelectSprite mSmartSelectSprite;
SelectionActionModeHelper(@NonNull Editor editor) {
@@ -81,11 +85,11 @@
mTextClassificationHelper = new TextClassificationHelper(
mTextView.getTextClassifier(), mTextView.getText(),
0, 1, mTextView.getTextLocales());
- mSelectionTracker =
- new SelectionTracker(mTextView.getContext(), mTextView.isTextEditable());
+ mSelectionTracker = new SelectionTracker(mTextView);
if (SMART_SELECT_ANIMATION_ENABLED) {
- mSmartSelectSprite = new SmartSelectSprite(mTextView);
+ mSmartSelectSprite = new SmartSelectSprite(mTextView.getContext(),
+ mTextView::invalidate);
} else {
mSmartSelectSprite = null;
}
@@ -142,10 +146,8 @@
SelectionEvent.ActionType.DRAG, mTextClassification);
}
- public void onTypeOverSelection() {
- mSelectionTracker.onSelectionAction(
- mTextView.getSelectionStart(), mTextView.getSelectionEnd(),
- SelectionEvent.ActionType.OVERTYPE, mTextClassification);
+ public void onTextChanged(int start, int end) {
+ mSelectionTracker.onTextChanged(start, end, mTextClassification);
}
public boolean resetSelection(int textIndex) {
@@ -167,6 +169,12 @@
cancelAsyncTask();
}
+ public void onDraw(final Canvas canvas) {
+ if (mSmartSelectSprite != null) {
+ mSmartSelectSprite.draw(canvas);
+ }
+ }
+
private void cancelAsyncTask() {
if (mTextClassificationAsyncTask != null) {
mTextClassificationAsyncTask.cancel(true);
@@ -224,30 +232,6 @@
final List<RectF> selectionRectangles =
convertSelectionToRectangles(layout, result.mStart, result.mEnd);
- /*
- * Do not run the Smart Select animation when there are multiple lines involved, as this
- * behavior is currently broken.
- *
- * TODO fix Smart Select Animation when the selection spans multiple lines
- */
- if (selectionRectangles.size() != 1) {
- onAnimationEndCallback.run();
- return;
- }
-
- /*
- * TODO Figure out a more robust approach for this
- * We have to translate all the generated rectangles by the top-left padding of the
- * TextView because the padding influences the rendering of the ViewOverlay, but is not
- * taken into account when generating the selection path rectangles.
- */
- for (RectF rectangle : selectionRectangles) {
- rectangle.left += mTextView.getPaddingLeft();
- rectangle.right += mTextView.getPaddingLeft();
- rectangle.top += mTextView.getPaddingTop();
- rectangle.bottom += mTextView.getPaddingTop();
- }
-
final PointF touchPoint = new PointF(
mEditor.getLastUpPositionX(),
mEditor.getLastUpPositionY());
@@ -264,17 +248,66 @@
private List<RectF> convertSelectionToRectangles(final Layout layout, final int start,
final int end) {
final List<RectF> result = new ArrayList<>();
- // TODO filter out invalid rectangles
- // getSelection might give us overlapping and zero-dimension rectangles which will interfere
- // with the Smart Select animation
- layout.getSelection(start, end, (left, top, right, bottom) ->
- result.add(new RectF(left, top, right, bottom)));
+ layout.getSelection(start, end, (left, top, right, bottom, textSelectionLayout) ->
+ mergeRectangleIntoList(result, new RectF(left, top, right, bottom)));
result.sort(SmartSelectSprite.RECTANGLE_COMPARATOR);
-
return result;
}
+ /**
+ * Merges a {@link RectF} into an existing list of rectangles. While merging, this method
+ * makes sure that:
+ *
+ * <ol>
+ * <li>No rectangle is redundant (contained within a bigger rectangle)</li>
+ * <li>Rectangles of the same height and vertical position that intersect get merged</li>
+ * </ol>
+ *
+ * @param list the list of rectangles to merge the new rectangle in
+ * @param candidate the {@link RectF} to merge into the list
+ * @hide
+ */
+ @VisibleForTesting
+ public static void mergeRectangleIntoList(List<RectF> list, RectF candidate) {
+ if (candidate.isEmpty()) {
+ return;
+ }
+
+ final int elementCount = list.size();
+ for (int index = 0; index < elementCount; ++index) {
+ final RectF existingRectangle = list.get(index);
+ if (existingRectangle.contains(candidate)) {
+ return;
+ }
+ if (candidate.contains(existingRectangle)) {
+ existingRectangle.setEmpty();
+ continue;
+ }
+
+ final boolean rectanglesContinueEachOther = candidate.left == existingRectangle.right
+ || candidate.right == existingRectangle.left;
+ final boolean canMerge = candidate.top == existingRectangle.top
+ && candidate.bottom == existingRectangle.bottom
+ && (RectF.intersects(candidate, existingRectangle)
+ || rectanglesContinueEachOther);
+
+ if (canMerge) {
+ candidate.union(existingRectangle);
+ existingRectangle.setEmpty();
+ }
+ }
+
+ for (int index = elementCount - 1; index >= 0; --index) {
+ if (list.get(index).isEmpty()) {
+ list.remove(index);
+ }
+ }
+
+ list.add(candidate);
+ }
+
+
/** @hide */
@VisibleForTesting
public static PointF movePointInsideNearestRectangle(final PointF point,
@@ -283,7 +316,9 @@
float bestY = -1;
double bestDistance = Double.MAX_VALUE;
- for (final RectF rectangle : rectangles) {
+ final int elementCount = rectangles.size();
+ for (int index = 0; index < elementCount; ++index) {
+ final RectF rectangle = rectangles.get(index);
final float candidateY = rectangle.centerY();
final float candidateX;
@@ -339,19 +374,18 @@
*/
private static final class SelectionTracker {
- private final Context mContext;
+ private final TextView mTextView;
private SelectionMetricsLogger mLogger;
private int mOriginalStart;
private int mOriginalEnd;
private int mSelectionStart;
private int mSelectionEnd;
- private boolean mSelectionStarted;
private boolean mAllowReset;
- SelectionTracker(Context context, boolean editable) {
- mContext = Preconditions.checkNotNull(context);
- mLogger = new SelectionMetricsLogger(context, editable);
+ SelectionTracker(TextView textView) {
+ mTextView = Preconditions.checkNotNull(textView);
+ mLogger = new SelectionMetricsLogger(textView);
}
/**
@@ -359,11 +393,10 @@
*/
public void onOriginalSelection(
CharSequence text, int selectionStart, int selectionEnd, boolean editableText) {
- mOriginalStart = selectionStart;
- mOriginalEnd = selectionEnd;
- mSelectionStarted = true;
+ mOriginalStart = mSelectionStart = selectionStart;
+ mOriginalEnd = mSelectionEnd = selectionEnd;
mAllowReset = false;
- maybeInvalidateLogger(editableText);
+ maybeInvalidateLogger();
mLogger.logSelectionStarted(text, selectionStart);
}
@@ -371,7 +404,7 @@
* Called when selection action mode is started and the results come from a classifier.
*/
public void onSmartSelection(SelectionResult result) {
- if (mSelectionStarted) {
+ if (isSelectionStarted()) {
mSelectionStart = result.mStart;
mSelectionEnd = result.mEnd;
mAllowReset = mSelectionStart != mOriginalStart || mSelectionEnd != mOriginalEnd;
@@ -386,7 +419,9 @@
public void onSelectionUpdated(
int selectionStart, int selectionEnd,
@Nullable TextClassification classification) {
- if (mSelectionStarted) {
+ if (isSelectionStarted()) {
+ mSelectionStart = selectionStart;
+ mSelectionEnd = selectionEnd;
mAllowReset = false;
mLogger.logSelectionModified(selectionStart, selectionEnd, classification, null);
}
@@ -397,10 +432,13 @@
*/
public void onSelectionDestroyed() {
mAllowReset = false;
- mSelectionStarted = false;
- mLogger.logSelectionAction(
- mSelectionStart, mSelectionEnd,
- SelectionEvent.ActionType.ABANDON, null /* classification */);
+ // Wait a few ms to see if the selection was destroyed because of a text change event.
+ mTextView.postDelayed(() -> {
+ mLogger.logSelectionAction(
+ mSelectionStart, mSelectionEnd,
+ SelectionEvent.ActionType.ABANDON, null /* classification */);
+ mSelectionStart = mSelectionEnd = -1;
+ }, 100 /* ms */);
}
/**
@@ -410,7 +448,7 @@
int selectionStart, int selectionEnd,
@SelectionEvent.ActionType int action,
@Nullable TextClassification classification) {
- if (mSelectionStarted) {
+ if (isSelectionStarted()) {
mAllowReset = false;
mLogger.logSelectionAction(selectionStart, selectionEnd, action, classification);
}
@@ -424,13 +462,15 @@
*/
public boolean resetSelection(int textIndex, Editor editor) {
final TextView textView = editor.getTextView();
- if (mSelectionStarted
+ if (isSelectionStarted()
&& mAllowReset
&& textIndex >= mSelectionStart && textIndex <= mSelectionEnd
&& textView.getText() instanceof Spannable) {
mAllowReset = false;
boolean selected = editor.selectCurrentWord();
if (selected) {
+ mSelectionStart = editor.getTextView().getSelectionStart();
+ mSelectionEnd = editor.getTextView().getSelectionEnd();
mLogger.logSelectionAction(
textView.getSelectionStart(), textView.getSelectionEnd(),
SelectionEvent.ActionType.RESET, null /* classification */);
@@ -440,11 +480,21 @@
return false;
}
- private void maybeInvalidateLogger(boolean editableText) {
- if (mLogger.isEditTextLogger() != editableText) {
- mLogger = new SelectionMetricsLogger(mContext, editableText);
+ public void onTextChanged(int start, int end, TextClassification classification) {
+ if (isSelectionStarted() && start == mSelectionStart && end == mSelectionEnd) {
+ onSelectionAction(start, end, SelectionEvent.ActionType.OVERTYPE, classification);
}
}
+
+ private void maybeInvalidateLogger() {
+ if (mLogger.isEditTextLogger() != mTextView.isTextEditable()) {
+ mLogger = new SelectionMetricsLogger(mTextView);
+ }
+ }
+
+ private boolean isSelectionStarted() {
+ return mSelectionStart >= 0 && mSelectionEnd >= 0 && mSelectionStart != mSelectionEnd;
+ }
}
// TODO: Write tests
@@ -464,20 +514,22 @@
private static final class SelectionMetricsLogger {
private static final String LOG_TAG = "SelectionMetricsLogger";
+ private static final Pattern PATTERN_WHITESPACE = Pattern.compile("\\s+");
private final SmartSelectionEventTracker mDelegate;
private final boolean mEditTextLogger;
- private final BreakIterator mWordIterator = BreakIterator.getWordInstance();
+ private final BreakIterator mWordIterator;
private int mStartIndex;
- private int mEndIndex;
private String mText;
- SelectionMetricsLogger(Context context, boolean editable) {
- final @SmartSelectionEventTracker.WidgetType int widgetType = editable
+ SelectionMetricsLogger(TextView textView) {
+ Preconditions.checkNotNull(textView);
+ final @SmartSelectionEventTracker.WidgetType int widgetType = textView.isTextEditable()
? SmartSelectionEventTracker.WidgetType.EDITTEXT
: SmartSelectionEventTracker.WidgetType.TEXTVIEW;
- mDelegate = new SmartSelectionEventTracker(context, widgetType);
- mEditTextLogger = editable;
+ mDelegate = new SmartSelectionEventTracker(textView.getContext(), widgetType);
+ mEditTextLogger = textView.isTextEditable();
+ mWordIterator = BreakIterator.getWordInstance(textView.getTextLocale());
}
public void logSelectionStarted(CharSequence text, int index) {
@@ -489,7 +541,6 @@
}
mWordIterator.setText(mText);
mStartIndex = index;
- mEndIndex = mWordIterator.following(index);
mDelegate.logEvent(SelectionEvent.selectionStarted(0));
} catch (Exception e) {
// Avoid crashes due to logging.
@@ -552,12 +603,15 @@
} else if (start < mStartIndex) {
wordIndices[0] = -countWordsForward(start);
} else { // start > mStartIndex
- if (mStartIndex < start && start < mEndIndex) {
- // If the new selection did not move past the original word,
- // assume it has not moved.
- wordIndices[0] = 0;
- } else {
- wordIndices[0] = countWordsBackward(start);
+ wordIndices[0] = countWordsBackward(start);
+
+ // For the selection start index, avoid counting a partial word backwards.
+ if (!mWordIterator.isBoundary(start)
+ && !isWhitespace(
+ mWordIterator.preceding(start),
+ mWordIterator.following(start))) {
+ // We counted a partial word. Remove it.
+ wordIndices[0]--;
}
}
@@ -601,7 +655,7 @@
}
private boolean isWhitespace(int start, int end) {
- return mText.substring(start, end).trim().isEmpty();
+ return PATTERN_WHITESPACE.matcher(mText.substring(start, end)).matches();
}
}
diff --git a/core/java/android/widget/SmartSelectSprite.java b/core/java/android/widget/SmartSelectSprite.java
index 8d06f5f..27b93bc 100644
--- a/core/java/android/widget/SmartSelectSprite.java
+++ b/core/java/android/widget/SmartSelectSprite.java
@@ -36,11 +36,11 @@
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.Shape;
import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewOverlay;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
+import com.android.internal.util.Preconditions;
+
import java.lang.annotation.Retention;
import java.util.Collections;
import java.util.Comparator;
@@ -50,7 +50,6 @@
/**
* A utility class for creating and animating the Smart Select animation.
*/
-// TODO Do not rely on ViewOverlays for drawing the Smart Select sprite
final class SmartSelectSprite {
private static final int EXPAND_DURATION = 300;
@@ -65,8 +64,8 @@
private final Interpolator mCornerInterpolator;
private final float mStrokeWidth;
- private final View mView;
private Animator mActiveAnimator = null;
+ private final Runnable mInvalidator;
@ColorInt
private final int mStrokeColor;
@@ -331,8 +330,12 @@
}
- SmartSelectSprite(final View view) {
- final Context context = view.getContext();
+ /**
+ * @param context The {@link Context} in which the animation will run
+ * @param invalidator A {@link Runnable} which will be called every time the animation updates,
+ * indicating that the view drawing the animation should invalidate itself
+ */
+ SmartSelectSprite(final Context context, final Runnable invalidator) {
mExpandInterpolator = AnimationUtils.loadInterpolator(
context,
android.R.interpolator.fast_out_slow_in);
@@ -341,7 +344,7 @@
android.R.interpolator.fast_out_linear_in);
mStrokeWidth = dpToPixel(context, STROKE_WIDTH_DP);
mStrokeColor = getStrokeColor(context);
- mView = view;
+ mInvalidator = Preconditions.checkNotNull(invalidator);
}
/**
@@ -366,7 +369,7 @@
cancelAnimation();
final ValueAnimator.AnimatorUpdateListener updateListener =
- valueAnimator -> mView.invalidate();
+ valueAnimator -> mInvalidator.run();
final List<RoundedRectangleShape> shapes = new LinkedList<>();
final List<Animator> cornerAnimators = new LinkedList<>();
@@ -421,7 +424,6 @@
mExistingRectangleList = rectangleList;
mExistingDrawable = shapeDrawable;
- mView.getOverlay().add(shapeDrawable);
mActiveAnimator = createAnimator(rectangleList, startingOffsetLeft, startingOffsetRight,
cornerAnimators, updateListener,
@@ -480,7 +482,7 @@
@Override
public void onAnimationEnd(Animator animator) {
mExistingRectangleList.setDisplayType(RectangleList.DisplayType.POLYGON);
- mExistingDrawable.invalidateSelf();
+ mInvalidator.run();
onAnimationEnd.run();
}
@@ -581,11 +583,9 @@
}
private void removeExistingDrawables() {
- final ViewOverlay overlay = mView.getOverlay();
- overlay.remove(mExistingDrawable);
-
mExistingDrawable = null;
mExistingRectangleList = null;
+ mInvalidator.run();
}
/**
@@ -599,4 +599,10 @@
}
}
+ public void draw(Canvas canvas) {
+ if (mExistingDrawable != null) {
+ mExistingDrawable.draw(canvas);
+ }
+ }
+
}
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java
index 8de17c0..8696d0d 100644
--- a/core/java/android/widget/TabHost.java
+++ b/core/java/android/widget/TabHost.java
@@ -146,12 +146,17 @@
// and relays them to the tab content.
mTabKeyListener = new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (KeyEvent.isModifierKey(keyCode)) {
+ return false;
+ }
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
+ case KeyEvent.KEYCODE_TAB:
+ case KeyEvent.KEYCODE_SPACE:
case KeyEvent.KEYCODE_ENTER:
return false;
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 140ecc1..efcc3a2 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -5547,6 +5547,14 @@
*/
@android.view.RemotableViewMethod
public final void setHint(CharSequence hint) {
+ setHintInternal(hint);
+
+ if (isInputMethodTarget()) {
+ mEditor.reportExtractedText();
+ }
+ }
+
+ private void setHintInternal(CharSequence hint) {
mHint = TextUtils.stringOrSpannedString(hint);
if (mLayout != null) {
@@ -7644,6 +7652,8 @@
} else {
MetaKeyKeyListener.stopSelecting(this, sp);
}
+
+ setHintInternal(text.hint);
}
/**
@@ -8433,7 +8443,8 @@
if (mMaxMode != LINES) {
desired = Math.min(desired, mMaximum);
- } else if (cap && linecount > mMaximum && layout instanceof DynamicLayout) {
+ } else if (cap && linecount > mMaximum && (layout instanceof DynamicLayout
+ || layout instanceof BoringLayout)) {
desired = layout.getLineTop(mMaximum);
if (dr != null) {
@@ -9402,7 +9413,7 @@
}
}
- if (mEditor != null) mEditor.sendOnTextChanged(start, after);
+ if (mEditor != null) mEditor.sendOnTextChanged(start, before, after);
}
/**
@@ -10942,6 +10953,7 @@
@Override
public boolean performLongClick() {
boolean handled = false;
+ boolean performedHapticFeedback = false;
if (mEditor != null) {
mEditor.mIsBeingLongClicked = true;
@@ -10949,6 +10961,7 @@
if (super.performLongClick()) {
handled = true;
+ performedHapticFeedback = true;
}
if (mEditor != null) {
@@ -10957,7 +10970,9 @@
}
if (handled) {
- performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
+ if (!performedHapticFeedback) {
+ performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
+ }
if (mEditor != null) mEditor.mDiscardNextActionUp = true;
} else {
MetricsLogger.action(
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 54afc95..2cab009 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -1470,10 +1470,8 @@
}
final int oldHeight = holder.row.getLayoutParams().height;
- int measuredRowHeight = holder.measuredRowHeight + holder.row.getPaddingTop()
- + holder.row.getPaddingBottom();
holder.row.getLayoutParams().height = Math.max(1,
- (int) (measuredRowHeight * getRowScale(rowPosition)));
+ (int) (holder.measuredRowHeight * getRowScale(rowPosition)));
if (holder.row.getLayoutParams().height != oldHeight) {
holder.row.requestLayout();
}
diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java
index 36ab394..b22ce5e 100644
--- a/core/java/com/android/internal/app/PlatLogoActivity.java
+++ b/core/java/com/android/internal/app/PlatLogoActivity.java
@@ -53,8 +53,7 @@
import android.widget.ImageView;
public class PlatLogoActivity extends Activity {
- public static final boolean REVEAL_THE_NAME = false;
- public static final boolean FINISH = false;
+ public static final boolean FINISH = true;
FrameLayout mLayout;
int mTapCount;
@@ -85,15 +84,18 @@
im.setAlpha(0f);
im.setBackground(new RippleDrawable(
- ColorStateList.valueOf(0xFFFFFFFF),
+ ColorStateList.valueOf(0xFF776677),
getDrawable(com.android.internal.R.drawable.platlogo),
null));
-// im.setOutlineProvider(new ViewOutlineProvider() {
-// @Override
-// public void getOutline(View view, Outline outline) {
-// outline.setOval(0, 0, view.getWidth(), view.getHeight());
-// }
-// });
+ im.setOutlineProvider(new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ final int w = view.getWidth();
+ final int h = view.getHeight();
+ outline.setOval((int)(w*.125), (int)(h*.125), (int)(w*.96), (int)(h*.96));
+ }
+ });
+ im.setElevation(12f*dp);
im.setClickable(true);
im.setOnClickListener(new View.OnClickListener() {
@Override
@@ -103,18 +105,6 @@
public boolean onLongClick(View v) {
if (mTapCount < 5) return false;
- if (REVEAL_THE_NAME) {
- final Drawable overlay = getDrawable(
- com.android.internal.R.drawable.platlogo_m);
- overlay.setBounds(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
- im.getOverlay().clear();
- im.getOverlay().add(overlay);
- overlay.setAlpha(0);
- ObjectAnimator.ofInt(overlay, "alpha", 0, 255)
- .setDuration(500)
- .start();
- }
-
final ContentResolver cr = getContentResolver();
if (Settings.System.getLong(cr, Settings.System.EGG_MODE, 0)
== 0) {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index c58ff05..0bd2981 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -119,7 +119,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 165 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 166 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS;
@@ -195,6 +195,13 @@
return mKernelMemoryStats;
}
+ /** Container for Resource Power Manager stats. Updated by updateRpmStatsLocked. */
+ private final RpmStats mTmpRpmStats = new RpmStats();
+ /** The soonest the RPM stats can be updated after it was last updated. */
+ private static final long RPM_STATS_UPDATE_FREQ_MS = 1000;
+ /** Last time that RPM stats were updated by updateRpmStatsLocked. */
+ private long mLastRpmStatsUpdateTimeMs = -RPM_STATS_UPDATE_FREQ_MS;
+
public interface BatteryCallback {
public void batteryNeedsCpuUpdate();
public void batteryPowerChanged(boolean onBattery);
@@ -202,6 +209,7 @@
}
public interface PlatformIdleStateCallback {
+ public void fillLowPowerStats(RpmStats rpmStats);
public String getPlatformLowPowerStats();
public String getSubsystemLowPowerStats();
}
@@ -279,7 +287,8 @@
int UPDATE_WIFI = 0x02;
int UPDATE_RADIO = 0x04;
int UPDATE_BT = 0x08;
- int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT;
+ int UPDATE_RPM = 0x10; // 16
+ int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT | UPDATE_RPM;
Future<?> scheduleSync(String reason, int flags);
Future<?> scheduleCpuSyncDueToRemovedUid(int uid);
@@ -628,6 +637,25 @@
protected PowerProfile mPowerProfile;
/*
+ * Holds a SamplingTimer associated with each Resource Power Manager state and voter,
+ * recording their times when on-battery (regardless of screen state).
+ */
+ private final HashMap<String, SamplingTimer> mRpmStats = new HashMap<>();
+ /** Times for each Resource Power Manager state and voter when screen-off and on-battery. */
+ private final HashMap<String, SamplingTimer> mScreenOffRpmStats = new HashMap<>();
+
+ @Override
+ public Map<String, ? extends Timer> getRpmStats() {
+ return mRpmStats;
+ }
+
+ // TODO: Note: screenOffRpmStats has been disabled via SCREEN_OFF_RPM_STATS_ENABLED.
+ @Override
+ public Map<String, ? extends Timer> getScreenOffRpmStats() {
+ return mScreenOffRpmStats;
+ }
+
+ /*
* Holds a SamplingTimer associated with each kernel wakelock name being tracked.
*/
private final HashMap<String, SamplingTimer> mKernelWakelockStats = new HashMap<>();
@@ -2648,6 +2676,26 @@
}
}
+ /** Get Resource Power Manager stats. Create a new one if it doesn't already exist. */
+ public SamplingTimer getRpmTimerLocked(String name) {
+ SamplingTimer rpmt = mRpmStats.get(name);
+ if (rpmt == null) {
+ rpmt = new SamplingTimer(mClocks, mOnBatteryTimeBase);
+ mRpmStats.put(name, rpmt);
+ }
+ return rpmt;
+ }
+
+ /** Get Screen-off Resource Power Manager stats. Create new one if it doesn't already exist. */
+ public SamplingTimer getScreenOffRpmTimerLocked(String name) {
+ SamplingTimer rpmt = mScreenOffRpmStats.get(name);
+ if (rpmt == null) {
+ rpmt = new SamplingTimer(mClocks, mOnBatteryScreenOffTimeBase);
+ mScreenOffRpmStats.put(name, rpmt);
+ }
+ return rpmt;
+ }
+
/*
* Get the wakeup reason counter, and create a new one if one
* doesn't already exist.
@@ -3536,6 +3584,12 @@
updateKernelWakelocksLocked();
updateBatteryPropertiesLocked();
}
+ // This if{} is only necessary due to SCREEN_OFF_RPM_STATS_ENABLED, which exists because
+ // updateRpmStatsLocked is too slow to run each screen change. When the speed is
+ // improved, remove the surrounding if{}.
+ if (SCREEN_OFF_RPM_STATS_ENABLED || updateOnBatteryTimeBase) {
+ updateRpmStatsLocked(); // if either OnBattery or OnBatteryScreenOff timebase changes.
+ }
if (DEBUG_ENERGY_CPU) {
Slog.d(TAG, "Updating cpu time because screen is now " + (screenOff ? "off" : "on")
+ " and battery is " + (unplugged ? "on" : "off"));
@@ -9501,6 +9555,19 @@
}
}
+ if (mRpmStats.size() > 0) {
+ for (SamplingTimer timer : mRpmStats.values()) {
+ mOnBatteryTimeBase.remove(timer);
+ }
+ mRpmStats.clear();
+ }
+ if (mScreenOffRpmStats.size() > 0) {
+ for (SamplingTimer timer : mScreenOffRpmStats.values()) {
+ mOnBatteryScreenOffTimeBase.remove(timer);
+ }
+ mScreenOffRpmStats.clear();
+ }
+
if (mKernelWakelockStats.size() > 0) {
for (SamplingTimer timer : mKernelWakelockStats.values()) {
mOnBatteryScreenOffTimeBase.remove(timer);
@@ -10203,6 +10270,61 @@
}
/**
+ * Read and record Resource Power Manager (RPM) state and voter times.
+ * If RPM stats were fetched more recently than RPM_STATS_UPDATE_FREQ_MS ago, uses the old data
+ * instead of fetching it anew.
+ */
+ public void updateRpmStatsLocked() {
+ if (mPlatformIdleStateCallback == null) return;
+ long now = SystemClock.elapsedRealtime();
+ if (now - mLastRpmStatsUpdateTimeMs >= RPM_STATS_UPDATE_FREQ_MS) {
+ mPlatformIdleStateCallback.fillLowPowerStats(mTmpRpmStats);
+ mLastRpmStatsUpdateTimeMs = now;
+ }
+
+ for (Map.Entry<String, RpmStats.PowerStatePlatformSleepState> pstate
+ : mTmpRpmStats.mPlatformLowPowerStats.entrySet()) {
+
+ // Update values for this platform state.
+ final String pName = pstate.getKey();
+ final long pTimeUs = pstate.getValue().mTimeMs * 1000;
+ final int pCount = pstate.getValue().mCount;
+ getRpmTimerLocked(pName).update(pTimeUs, pCount);
+ if (SCREEN_OFF_RPM_STATS_ENABLED) {
+ getScreenOffRpmTimerLocked(pName).update(pTimeUs, pCount);
+ }
+
+ // Update values for each voter of this platform state.
+ for (Map.Entry<String, RpmStats.PowerStateElement> voter
+ : pstate.getValue().mVoters.entrySet()) {
+ final String vName = pName + "." + voter.getKey();
+ final long vTimeUs = voter.getValue().mTimeMs * 1000;
+ final int vCount = voter.getValue().mCount;
+ getRpmTimerLocked(vName).update(vTimeUs, vCount);
+ if (SCREEN_OFF_RPM_STATS_ENABLED) {
+ getScreenOffRpmTimerLocked(vName).update(vTimeUs, vCount);
+ }
+ }
+ }
+
+ for (Map.Entry<String, RpmStats.PowerStateSubsystem> subsys
+ : mTmpRpmStats.mSubsystemLowPowerStats.entrySet()) {
+
+ final String subsysName = subsys.getKey();
+ for (Map.Entry<String, RpmStats.PowerStateElement> sstate
+ : subsys.getValue().mStates.entrySet()) {
+ final String name = subsysName + "." + sstate.getKey();
+ final long timeUs = sstate.getValue().mTimeMs * 1000;
+ final int count = sstate.getValue().mCount;
+ getRpmTimerLocked(name).update(timeUs, count);
+ if (SCREEN_OFF_RPM_STATS_ENABLED) {
+ getScreenOffRpmTimerLocked(name).update(timeUs, count);
+ }
+ }
+ }
+ }
+
+ /**
* Read and distribute kernel wake lock use across apps.
*/
public void updateKernelWakelocksLocked() {
@@ -11725,6 +11847,27 @@
mBluetoothScanNesting = 0;
mBluetoothScanTimer.readSummaryFromParcelLocked(in);
+ int NRPMS = in.readInt();
+ if (NRPMS > 10000) {
+ throw new ParcelFormatException("File corrupt: too many rpm stats " + NRPMS);
+ }
+ for (int irpm = 0; irpm < NRPMS; irpm++) {
+ if (in.readInt() != 0) {
+ String rpmName = in.readString();
+ getRpmTimerLocked(rpmName).readSummaryFromParcelLocked(in);
+ }
+ }
+ int NSORPMS = in.readInt();
+ if (NSORPMS > 10000) {
+ throw new ParcelFormatException("File corrupt: too many screen-off rpm stats " + NSORPMS);
+ }
+ for (int irpm = 0; irpm < NSORPMS; irpm++) {
+ if (in.readInt() != 0) {
+ String rpmName = in.readString();
+ getScreenOffRpmTimerLocked(rpmName).readSummaryFromParcelLocked(in);
+ }
+ }
+
int NKW = in.readInt();
if (NKW > 10000) {
throw new ParcelFormatException("File corrupt: too many kernel wake locks " + NKW);
@@ -12111,6 +12254,29 @@
mCameraOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
mBluetoothScanTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ out.writeInt(mRpmStats.size());
+ for (Map.Entry<String, SamplingTimer> ent : mRpmStats.entrySet()) {
+ Timer rpmt = ent.getValue();
+ if (rpmt != null) {
+ out.writeInt(1);
+ out.writeString(ent.getKey());
+ rpmt.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ } else {
+ out.writeInt(0);
+ }
+ }
+ out.writeInt(mScreenOffRpmStats.size());
+ for (Map.Entry<String, SamplingTimer> ent : mScreenOffRpmStats.entrySet()) {
+ Timer rpmt = ent.getValue();
+ if (rpmt != null) {
+ out.writeInt(1);
+ out.writeString(ent.getKey());
+ rpmt.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
out.writeInt(mKernelWakelockStats.size());
for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
Timer kwlt = ent.getValue();
@@ -12568,6 +12734,25 @@
mDischargeScreenOffCounter = new LongSamplingCounter(mOnBatteryTimeBase, in);
mLastWriteTime = in.readLong();
+ mRpmStats.clear();
+ int NRPMS = in.readInt();
+ for (int irpm = 0; irpm < NRPMS; irpm++) {
+ if (in.readInt() != 0) {
+ String rpmName = in.readString();
+ SamplingTimer rpmt = new SamplingTimer(mClocks, mOnBatteryTimeBase, in);
+ mRpmStats.put(rpmName, rpmt);
+ }
+ }
+ mScreenOffRpmStats.clear();
+ int NSORPMS = in.readInt();
+ for (int irpm = 0; irpm < NSORPMS; irpm++) {
+ if (in.readInt() != 0) {
+ String rpmName = in.readString();
+ SamplingTimer rpmt = new SamplingTimer(mClocks, mOnBatteryScreenOffTimeBase, in);
+ mScreenOffRpmStats.put(rpmName, rpmt);
+ }
+ }
+
mKernelWakelockStats.clear();
int NKW = in.readInt();
for (int ikw = 0; ikw < NKW; ikw++) {
@@ -12731,6 +12916,29 @@
mDischargeScreenOffCounter.writeToParcel(out);
out.writeLong(mLastWriteTime);
+ out.writeInt(mRpmStats.size());
+ for (Map.Entry<String, SamplingTimer> ent : mRpmStats.entrySet()) {
+ SamplingTimer rpmt = ent.getValue();
+ if (rpmt != null) {
+ out.writeInt(1);
+ out.writeString(ent.getKey());
+ rpmt.writeToParcel(out, uSecRealtime);
+ } else {
+ out.writeInt(0);
+ }
+ }
+ out.writeInt(mScreenOffRpmStats.size());
+ for (Map.Entry<String, SamplingTimer> ent : mScreenOffRpmStats.entrySet()) {
+ SamplingTimer rpmt = ent.getValue();
+ if (rpmt != null) {
+ out.writeInt(1);
+ out.writeString(ent.getKey());
+ rpmt.writeToParcel(out, uSecRealtime);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
if (inclUids) {
out.writeInt(mKernelWakelockStats.size());
for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
@@ -12755,6 +12963,7 @@
}
}
} else {
+ // TODO: There should be two 0's printed here, not just one.
out.writeInt(0);
}
diff --git a/core/java/com/android/internal/os/ClassLoaderFactory.java b/core/java/com/android/internal/os/ClassLoaderFactory.java
index b2b769e..387857f 100644
--- a/core/java/com/android/internal/os/ClassLoaderFactory.java
+++ b/core/java/com/android/internal/os/ClassLoaderFactory.java
@@ -88,12 +88,20 @@
final ClassLoader classLoader = createClassLoader(dexPath, librarySearchPath, parent,
classloaderName);
+ boolean isForVendor = false;
+ for (String path : dexPath.split(":")) {
+ if (path.startsWith("/vendor/")) {
+ isForVendor = true;
+ break;
+ }
+ }
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "createClassloaderNamespace");
String errorMessage = createClassloaderNamespace(classLoader,
targetSdkVersion,
librarySearchPath,
libraryPermittedPath,
- isNamespaceShared);
+ isNamespaceShared,
+ isForVendor);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
if (errorMessage != null) {
@@ -108,5 +116,6 @@
int targetSdkVersion,
String librarySearchPath,
String libraryPermittedPath,
- boolean isNamespaceShared);
+ boolean isNamespaceShared,
+ boolean isForVendor);
}
diff --git a/core/java/com/android/internal/os/RpmStats.java b/core/java/com/android/internal/os/RpmStats.java
new file mode 100644
index 0000000..befc76e
--- /dev/null
+++ b/core/java/com/android/internal/os/RpmStats.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 com.android.internal.os;
+
+import android.util.ArrayMap;
+
+import java.util.Map;
+
+/**
+ * Container for Resource Power Manager states and their data.
+ * Values can be populated by the BatteryStatsService.fillLowPowerStats jni function.
+ */
+public final class RpmStats {
+ public Map<String, PowerStatePlatformSleepState> mPlatformLowPowerStats = new ArrayMap<>();
+ public Map<String, PowerStateSubsystem> mSubsystemLowPowerStats = new ArrayMap<>();
+
+ /**
+ * Finds the PowerStatePlatformSleepState with the given name (creating it if it doesn't exist),
+ * updates its timeMs and count, and returns it.
+ */
+ @SuppressWarnings("unused")
+ public PowerStatePlatformSleepState getAndUpdatePlatformState(
+ String name, long timeMs, int count) {
+
+ PowerStatePlatformSleepState e = mPlatformLowPowerStats.get(name);
+ if (e == null) {
+ e = new PowerStatePlatformSleepState();
+ mPlatformLowPowerStats.put(name, e);
+ }
+ e.mTimeMs = timeMs;
+ e.mCount = count;
+ return e;
+ }
+
+ /**
+ * Returns the PowerStateSubsystem with the given name (creating it if it doesn't exist).
+ */
+ public PowerStateSubsystem getSubsystem(String name) {
+ PowerStateSubsystem e = mSubsystemLowPowerStats.get(name);
+ if (e == null) {
+ e = new PowerStateSubsystem();
+ mSubsystemLowPowerStats.put(name, e);
+ }
+ return e;
+ }
+
+ /** Represents a subsystem state or a platform voter. */
+ public static class PowerStateElement {
+ public long mTimeMs; // totalTimeInMsecVotedForSinceBoot
+ public int mCount; // totalNumberOfTimesVotedSinceBoot
+
+ private PowerStateElement(long timeMs, int count) {
+ this.mTimeMs = timeMs;
+ this.mCount = count;
+ }
+ }
+
+ /** Represents a PowerStatePlatformSleepState, per hardware/interfaces/power/1.0/types.hal */
+ public static class PowerStatePlatformSleepState {
+ public long mTimeMs; // residencyInMsecSinceBoot
+ public int mCount; // totalTransitions
+ public Map<String, PowerStateElement> mVoters = new ArrayMap<>(); // voters for this platform-level sleep state
+
+ /**
+ * Updates (creating if necessary) the voter with the given name, with the given timeMs and
+ * count.
+ */
+ @SuppressWarnings("unused")
+ public void putVoter(String name, long timeMs, int count) {
+ PowerStateElement e = mVoters.get(name);
+ if (e == null) {
+ mVoters.put(name, new PowerStateElement(timeMs, count));
+ } else {
+ e.mTimeMs = timeMs;
+ e.mCount = count;
+ }
+ }
+ }
+
+ /** Represents a PowerStateSubsystem, per hardware/interfaces/power/1.1/types.hal */
+ public static class PowerStateSubsystem {
+ public Map<String, PowerStateElement> mStates = new ArrayMap<>(); // sleep states supported by this susbsystem
+
+ /**
+ * Updates (creating if necessary) the subsystem state with the given name, with the given
+ * timeMs and count.
+ */
+ @SuppressWarnings("unused")
+ public void putState(String name, long timeMs, int count) {
+ PowerStateElement e = mStates.get(name);
+ if (e == null) {
+ mStates.put(name, new PowerStateElement(timeMs, count));
+ } else {
+ e.mTimeMs = timeMs;
+ e.mCount = count;
+ }
+ }
+ }
+}
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index a9350db..5ee0918 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -16,19 +16,17 @@
package com.android.internal.os;
-
+import android.os.IVold;
import android.os.Trace;
-import dalvik.system.ZygoteHooks;
import android.system.ErrnoException;
import android.system.Os;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
+import dalvik.system.ZygoteHooks;
/** @hide */
public final class Zygote {
/*
- * Bit values for "debugFlags" argument. The definitions are duplicated
+ * Bit values for "runtimeFlags" argument. The definitions are duplicated
* in the native code.
*/
@@ -52,13 +50,13 @@
public static final int DEBUG_JAVA_DEBUGGABLE = 1 << 8;
/** No external storage should be mounted. */
- public static final int MOUNT_EXTERNAL_NONE = 0;
+ public static final int MOUNT_EXTERNAL_NONE = IVold.REMOUNT_MODE_NONE;
/** Default external storage should be mounted. */
- public static final int MOUNT_EXTERNAL_DEFAULT = 1;
+ public static final int MOUNT_EXTERNAL_DEFAULT = IVold.REMOUNT_MODE_DEFAULT;
/** Read-only external storage should be mounted. */
- public static final int MOUNT_EXTERNAL_READ = 2;
+ public static final int MOUNT_EXTERNAL_READ = IVold.REMOUNT_MODE_READ;
/** Read-write external storage should be mounted. */
- public static final int MOUNT_EXTERNAL_WRITE = 3;
+ public static final int MOUNT_EXTERNAL_WRITE = IVold.REMOUNT_MODE_WRITE;
private static final ZygoteHooks VM_HOOKS = new ZygoteHooks();
@@ -75,7 +73,7 @@
* fork()ing and and before spawning any threads.
* @param gids null-ok; a list of UNIX gids that the new process should
* setgroups() to after fork and before spawning any threads.
- * @param debugFlags bit flags that enable debugging features.
+ * @param runtimeFlags bit flags that enable ART features.
* @param rlimits null-ok an array of rlimit tuples, with the second
* dimension having a length of 3 and representing
* (resource, rlim_cur, rlim_max). These are set via the posix
@@ -96,18 +94,18 @@
* @return 0 if this is the child, pid of the child
* if this is the parent, or -1 on error.
*/
- public static int forkAndSpecialize(int uid, int gid, int[] gids, int debugFlags,
+ public static int forkAndSpecialize(int uid, int gid, int[] gids, int runtimeFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
int[] fdsToIgnore, String instructionSet, String appDataDir) {
VM_HOOKS.preFork();
// Resets nice priority for zygote process.
resetNicePriority();
int pid = nativeForkAndSpecialize(
- uid, gid, gids, debugFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
+ uid, gid, gids, runtimeFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
fdsToIgnore, instructionSet, appDataDir);
// Enable tracing as soon as possible for the child process.
if (pid == 0) {
- Trace.setTracingEnabled(true, debugFlags);
+ Trace.setTracingEnabled(true, runtimeFlags);
// Note that this event ends at the end of handleChildProc,
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "PostFork");
@@ -116,7 +114,7 @@
return pid;
}
- native private static int nativeForkAndSpecialize(int uid, int gid, int[] gids,int debugFlags,
+ native private static int nativeForkAndSpecialize(int uid, int gid, int[] gids,int runtimeFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
int[] fdsToIgnore, String instructionSet, String appDataDir);
@@ -137,7 +135,7 @@
* fork()ing and and before spawning any threads.
* @param gids null-ok; a list of UNIX gids that the new process should
* setgroups() to after fork and before spawning any threads.
- * @param debugFlags bit flags that enable debugging features.
+ * @param runtimeFlags bit flags that enable ART features.
* @param rlimits null-ok an array of rlimit tuples, with the second
* dimension having a length of 3 and representing
* (resource, rlim_cur, rlim_max). These are set via the posix
@@ -148,22 +146,22 @@
* @return 0 if this is the child, pid of the child
* if this is the parent, or -1 on error.
*/
- public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,
+ public static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
VM_HOOKS.preFork();
// Resets nice priority for zygote process.
resetNicePriority();
int pid = nativeForkSystemServer(
- uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);
+ uid, gid, gids, runtimeFlags, rlimits, permittedCapabilities, effectiveCapabilities);
// Enable tracing as soon as we enter the system_server.
if (pid == 0) {
- Trace.setTracingEnabled(true, debugFlags);
+ Trace.setTracingEnabled(true, runtimeFlags);
}
VM_HOOKS.postForkCommon();
return pid;
}
- native private static int nativeForkSystemServer(int uid, int gid, int[] gids, int debugFlags,
+ native private static int nativeForkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
int[][] rlimits, long permittedCapabilities, long effectiveCapabilities);
/**
@@ -177,9 +175,9 @@
*/
native protected static void nativeUnmountStorageOnInit();
- private static void callPostForkChildHooks(int debugFlags, boolean isSystemServer,
+ private static void callPostForkChildHooks(int runtimeFlags, boolean isSystemServer,
String instructionSet) {
- VM_HOOKS.postForkChild(debugFlags, isSystemServer, instructionSet);
+ VM_HOOKS.postForkChild(runtimeFlags, isSystemServer, instructionSet);
}
/**
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 9fa3239..6a87b1f 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -220,7 +220,7 @@
fd = null;
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
- parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
+ parsedArgs.runtimeFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.instructionSet,
parsedArgs.appDataDir);
@@ -349,11 +349,9 @@
int[] gids;
/**
- * From --enable-jdwp, --enable-checkjni, --enable-assert,
- * --enable-safemode, --generate-debug-info, --enable-jni-logging,
- * --java-debuggable, and --native-debuggable.
+ * From --runtime-flags.
*/
- int debugFlags;
+ int runtimeFlags;
/** From --mount-external */
int mountExternal = Zygote.MOUNT_EXTERNAL_NONE;
@@ -469,26 +467,11 @@
targetSdkVersionSpecified = true;
targetSdkVersion = Integer.parseInt(
arg.substring(arg.indexOf('=') + 1));
- } else if (arg.equals("--enable-jdwp")) {
- debugFlags |= Zygote.DEBUG_ENABLE_JDWP;
- } else if (arg.equals("--enable-safemode")) {
- debugFlags |= Zygote.DEBUG_ENABLE_SAFEMODE;
- } else if (arg.equals("--enable-checkjni")) {
- debugFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
- } else if (arg.equals("--generate-debug-info")) {
- debugFlags |= Zygote.DEBUG_GENERATE_DEBUG_INFO;
- } else if (arg.equals("--always-jit")) {
- debugFlags |= Zygote.DEBUG_ALWAYS_JIT;
- } else if (arg.equals("--native-debuggable")) {
- debugFlags |= Zygote.DEBUG_NATIVE_DEBUGGABLE;
- } else if (arg.equals("--java-debuggable")) {
- debugFlags |= Zygote.DEBUG_JAVA_DEBUGGABLE;
- } else if (arg.equals("--enable-jni-logging")) {
- debugFlags |= Zygote.DEBUG_ENABLE_JNI_LOGGING;
- } else if (arg.equals("--enable-assert")) {
- debugFlags |= Zygote.DEBUG_ENABLE_ASSERT;
} else if (arg.equals("--runtime-args")) {
seenRuntimeArgs = true;
+ } else if (arg.startsWith("--runtime-flags=")) {
+ runtimeFlags = Integer.parseInt(
+ arg.substring(arg.indexOf('=') + 1));
} else if (arg.startsWith("--seinfo=")) {
if (seInfoSpecified) {
throw new IllegalArgumentException(
@@ -704,7 +687,7 @@
*/
public static void applyDebuggerSystemProperty(Arguments args) {
if (RoSystemProperties.DEBUGGABLE) {
- args.debugFlags |= Zygote.DEBUG_ENABLE_JDWP;
+ args.runtimeFlags |= Zygote.DEBUG_ENABLE_JDWP;
}
}
@@ -726,7 +709,7 @@
int peerUid = peer.getUid();
if (args.invokeWith != null && peerUid != 0 &&
- (args.debugFlags & Zygote.DEBUG_ENABLE_JDWP) == 0) {
+ (args.runtimeFlags & Zygote.DEBUG_ENABLE_JDWP) == 0) {
throw new ZygoteSecurityException("Peer is permitted to specify an"
+ "explicit invoke-with wrapper command only for debuggable"
+ "applications.");
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 7058193..4abab28 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -669,7 +669,7 @@
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
- parsedArgs.debugFlags,
+ parsedArgs.runtimeFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 8ea0242..85251d4 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -18,6 +18,9 @@
import android.app.WindowConfiguration;
import android.graphics.Outline;
+import android.graphics.drawable.InsetDrawable;
+import android.graphics.drawable.LayerDrawable;
+import android.util.Pair;
import android.view.ViewOutlineProvider;
import android.view.accessibility.AccessibilityNodeInfo;
import com.android.internal.R;
@@ -1055,7 +1058,7 @@
WindowManager.LayoutParams attrs = mWindow.getAttributes();
int sysUiVisibility = attrs.systemUiVisibility | getWindowSystemUiVisibility();
- if (!mWindow.mIsFloating && ActivityManager.isHighEndGfx()) {
+ if (!mWindow.mIsFloating) {
boolean disallowAnimate = !isLaidOut();
disallowAnimate |= ((mLastWindowFlags ^ attrs.flags)
& FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0;
@@ -1097,8 +1100,8 @@
boolean navBarToLeftEdge = isNavBarToLeftEdge(mLastBottomInset, mLastLeftInset);
int navBarSize = getNavBarSize(mLastBottomInset, mLastRightInset, mLastLeftInset);
updateColorViewInt(mNavigationColorViewState, sysUiVisibility,
- mWindow.mNavigationBarColor, navBarSize, navBarToRightEdge || navBarToLeftEdge,
- navBarToLeftEdge,
+ mWindow.mNavigationBarColor, mWindow.mNavigationBarDividerColor, navBarSize,
+ navBarToRightEdge || navBarToLeftEdge, navBarToLeftEdge,
0 /* sideInset */, animate && !disallowAnimate, false /* force */);
boolean statusBarNeedsRightInset = navBarToRightEdge
@@ -1108,7 +1111,7 @@
int statusBarSideInset = statusBarNeedsRightInset ? mLastRightInset
: statusBarNeedsLeftInset ? mLastLeftInset : 0;
updateColorViewInt(mStatusColorViewState, sysUiVisibility,
- calculateStatusBarColor(), mLastTopInset,
+ calculateStatusBarColor(), 0, mLastTopInset,
false /* matchVertical */, statusBarNeedsLeftInset, statusBarSideInset,
animate && !disallowAnimate,
mForceWindowDrawsStatusBarBackground);
@@ -1195,6 +1198,7 @@
* @param state the color view to update.
* @param sysUiVis the current systemUiVisibility to apply.
* @param color the current color to apply.
+ * @param dividerColor the current divider color to apply.
* @param size the current size in the non-parent-matching dimension.
* @param verticalBar if true the view is attached to a vertical edge, otherwise to a
* horizontal edge,
@@ -1202,7 +1206,7 @@
* @param animate if true, the change will be animated.
*/
private void updateColorViewInt(final ColorViewState state, int sysUiVis, int color,
- int size, boolean verticalBar, boolean seascape, int sideMargin,
+ int dividerColor, int size, boolean verticalBar, boolean seascape, int sideMargin,
boolean animate, boolean force) {
state.present = state.attributes.isPresent(sysUiVis, mWindow.getAttributes().flags, force);
boolean show = state.attributes.isVisible(state.present, color,
@@ -1221,7 +1225,7 @@
if (view == null) {
if (showView) {
state.view = view = new View(mContext);
- view.setBackgroundColor(color);
+ setColor(view, color, dividerColor, verticalBar, seascape);
view.setTransitionName(state.attributes.transitionName);
view.setId(state.attributes.id);
visibilityChanged = true;
@@ -1256,7 +1260,7 @@
view.setLayoutParams(lp);
}
if (showView) {
- view.setBackgroundColor(color);
+ setColor(view, color, dividerColor, verticalBar, seascape);
}
}
if (visibilityChanged) {
@@ -1289,6 +1293,34 @@
state.color = color;
}
+ private static void setColor(View v, int color, int dividerColor, boolean verticalBar,
+ boolean seascape) {
+ if (dividerColor != 0) {
+ final Pair<Boolean, Boolean> dir = (Pair<Boolean, Boolean>) v.getTag();
+ if (dir == null || dir.first != verticalBar || dir.second != seascape) {
+ final int size = Math.round(
+ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
+ v.getContext().getResources().getDisplayMetrics()));
+ // Use an inset to make the divider line on the side that faces the app.
+ final InsetDrawable d = new InsetDrawable(new ColorDrawable(color),
+ verticalBar && !seascape ? size : 0,
+ !verticalBar ? size : 0,
+ verticalBar && seascape ? size : 0, 0);
+ v.setBackground(new LayerDrawable(new Drawable[] {
+ new ColorDrawable(dividerColor), d }));
+ v.setTag(new Pair<>(verticalBar, seascape));
+ } else {
+ final LayerDrawable d = (LayerDrawable) v.getBackground();
+ final InsetDrawable inset = ((InsetDrawable) d.getDrawable(1));
+ ((ColorDrawable) inset.getDrawable()).setColor(color);
+ ((ColorDrawable) d.getDrawable(0)).setColor(dividerColor);
+ }
+ } else {
+ v.setTag(null);
+ v.setBackgroundColor(color);
+ }
+ }
+
private void updateColorViewTranslations() {
// Put the color views back in place when they get moved off the screen
// due to the the ViewRootImpl panning.
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 0d66376..b13560c 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -233,6 +233,7 @@
private int mTextColor = 0;
int mStatusBarColor = 0;
int mNavigationBarColor = 0;
+ int mNavigationBarDividerColor = 0;
private boolean mForcedStatusBarColor = false;
private boolean mForcedNavigationBarColor = false;
@@ -2432,13 +2433,15 @@
}
if (!mForcedNavigationBarColor) {
mNavigationBarColor = a.getColor(R.styleable.Window_navigationBarColor, 0xFF000000);
+ mNavigationBarDividerColor = a.getColor(R.styleable.Window_navigationBarDividerColor,
+ 0x00000000);
}
WindowManager.LayoutParams params = getAttributes();
// Non-floating windows on high end devices must put up decor beneath the system bars and
// therefore must know about visibility changes of those.
- if (!mIsFloating && ActivityManager.isHighEndGfx()) {
+ if (!mIsFloating) {
if (!targetPreL && a.getBoolean(
R.styleable.Window_windowDrawsSystemBarBackgrounds,
false)) {
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 0d15758..b8ef82b 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -803,12 +803,14 @@
+ "of length " + MIN_LOCK_PASSWORD_SIZE);
}
- final int computedQuality = PasswordMetrics.computeForPassword(password).quality;
- setLong(PASSWORD_TYPE_KEY, Math.max(requestedQuality, computedQuality), userHandle);
+ setLong(PASSWORD_TYPE_KEY,
+ computePasswordQuality(CREDENTIAL_TYPE_PASSWORD, password, requestedQuality),
+ userHandle);
getLockSettings().setLockCredential(password, CREDENTIAL_TYPE_PASSWORD, savedPassword,
requestedQuality, userHandle);
- updateEncryptionPasswordIfNeeded(password, computedQuality, userHandle);
+ updateEncryptionPasswordIfNeeded(password,
+ PasswordMetrics.computeForPassword(password).quality, userHandle);
updatePasswordHistory(password, userHandle);
} catch (RemoteException re) {
// Cant do much
@@ -898,6 +900,24 @@
}
/**
+ * Returns the password quality of the given credential, promoting it to a higher level
+ * if DevicePolicyManager has a stronger quality requirement. This value will be written
+ * to PASSWORD_TYPE_KEY.
+ */
+ private int computePasswordQuality(int type, String credential, int requestedQuality) {
+ final int quality;
+ if (type == CREDENTIAL_TYPE_PASSWORD) {
+ int computedQuality = PasswordMetrics.computeForPassword(credential).quality;
+ quality = Math.max(requestedQuality, computedQuality);
+ } else if (type == CREDENTIAL_TYPE_PATTERN) {
+ quality = DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+ } else /* if (type == CREDENTIAL_TYPE_NONE) */ {
+ quality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+ }
+ return quality;
+ }
+
+ /**
* Enables/disables the Separate Profile Challenge for this {@param userHandle}. This is a no-op
* for user handles that do not belong to a managed profile.
*
@@ -1505,25 +1525,34 @@
}
}
- public boolean setLockCredentialWithToken(String credential, int type, long tokenHandle,
- byte[] token, int userId) {
+ /**
+ * Change a user's lock credential with a pre-configured escrow token.
+ *
+ * @param credential The new credential to be set
+ * @param type Credential type: password / pattern / none.
+ * @param requestedQuality the requested password quality by DevicePolicyManager.
+ * See {@link DevicePolicyManager#getPasswordQuality(android.content.ComponentName)}
+ * @param tokenHandle Handle of the escrow token
+ * @param token Escrow token
+ * @param userId The user who's lock credential to be changed
+ * @return {@code true} if the operation is successful.
+ */
+ public boolean setLockCredentialWithToken(String credential, int type, int requestedQuality,
+ 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;
- int quality = Math.max(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
- computedQuality);
+ final int quality = computePasswordQuality(type, credential, requestedQuality);
if (!getLockSettings().setLockCredentialWithToken(credential, type, tokenHandle,
token, quality, userId)) {
return false;
}
setLong(PASSWORD_TYPE_KEY, quality, userId);
- updateEncryptionPasswordIfNeeded(credential, computedQuality, userId);
+ updateEncryptionPasswordIfNeeded(credential, quality, userId);
updatePasswordHistory(credential, userId);
} else {
if (!TextUtils.isEmpty(credential)) {
@@ -1585,7 +1614,8 @@
STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW,
SOME_AUTH_REQUIRED_AFTER_USER_REQUEST,
STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
- STRONG_AUTH_REQUIRED_AFTER_TIMEOUT})
+ STRONG_AUTH_REQUIRED_AFTER_TIMEOUT,
+ STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN})
@Retention(RetentionPolicy.SOURCE)
public @interface StrongAuthFlags {}
@@ -1622,6 +1652,11 @@
public static final int STRONG_AUTH_REQUIRED_AFTER_TIMEOUT = 0x10;
/**
+ * Strong authentication is required because the user has triggered lockdown.
+ */
+ public static final int STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN = 0x20;
+
+ /**
* Strong auth flags that do not prevent fingerprint from being accepted as auth.
*
* If any other flags are set, fingerprint is disabled.
diff --git a/core/java/com/android/internal/widget/NotificationExpandButton.java b/core/java/com/android/internal/widget/NotificationExpandButton.java
index b702898..39f82a5 100644
--- a/core/java/com/android/internal/widget/NotificationExpandButton.java
+++ b/core/java/com/android/internal/widget/NotificationExpandButton.java
@@ -31,7 +31,6 @@
*/
@RemoteViews.RemoteView
public class NotificationExpandButton extends ImageView {
- private View mLabeledBy;
public NotificationExpandButton(Context context) {
super(context);
@@ -69,12 +68,5 @@
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(Button.class.getName());
- if (mLabeledBy != null) {
- info.setLabeledBy(mLabeledBy);
- }
- }
-
- public void setLabeledBy(View labeledBy) {
- mLabeledBy = labeledBy;
}
}
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index 592576b..e53162c 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -25,6 +25,7 @@
import android.hardware.input.InputManager.InputDeviceListener;
import android.os.SystemProperties;
import android.util.Log;
+import android.util.Slog;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -630,6 +631,12 @@
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT; // will be 0 for UP
final int id = event.getPointerId(index);
+ if (id >= NP) {
+ Slog.wtf(TAG, "Got pointer ID out of bounds: id=" + id + " arraysize="
+ + NP + " pointerindex=" + index
+ + " action=0x" + Integer.toHexString(action));
+ return;
+ }
final PointerState ps = mPointers.get(id);
ps.mCurDown = false;
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index 7778892..b5031f2 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -44,7 +44,9 @@
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* Loads global system configuration info.
@@ -60,6 +62,7 @@
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_OEM_PERMISSIONS = 0x20;
private static final int ALLOW_ALL = ~0;
// Group-ids that are given to all packages as read from etc/permissions/*.xml.
@@ -143,6 +146,8 @@
final ArrayMap<String, ArraySet<String>> mPrivAppPermissions = new ArrayMap<>();
final ArrayMap<String, ArraySet<String>> mPrivAppDenyPermissions = new ArrayMap<>();
+ final ArrayMap<String, ArrayMap<String, Boolean>> mOemPermissions = new ArrayMap<>();
+
public static SystemConfig getInstance() {
synchronized (SystemConfig.class) {
if (sInstance == null) {
@@ -224,13 +229,23 @@
return mPrivAppDenyPermissions.get(packageName);
}
+ public Map<String, Boolean> getOemPermissions(String packageName) {
+ final Map<String, Boolean> oemPermissions = mOemPermissions.get(packageName);
+ if (oemPermissions != null) {
+ return oemPermissions;
+ }
+ return Collections.emptyMap();
+ }
+
SystemConfig() {
// Read configuration from system
readPermissions(Environment.buildPath(
Environment.getRootDirectory(), "etc", "sysconfig"), ALLOW_ALL);
+
// 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;
@@ -238,17 +253,20 @@
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(
Environment.getOdmDirectory(), "etc", "sysconfig"), odmPermissionFlag);
readPermissions(Environment.buildPath(
Environment.getOdmDirectory(), "etc", "permissions"), odmPermissionFlag);
- // Only allow OEM to customize features
+
+ // Allow OEM to customize features and OEM permissions
+ int oemPermissionFlag = ALLOW_FEATURES | ALLOW_OEM_PERMISSIONS;
readPermissions(Environment.buildPath(
- Environment.getOemDirectory(), "etc", "sysconfig"), ALLOW_FEATURES);
+ Environment.getOemDirectory(), "etc", "sysconfig"), oemPermissionFlag);
readPermissions(Environment.buildPath(
- Environment.getOemDirectory(), "etc", "permissions"), ALLOW_FEATURES);
+ Environment.getOemDirectory(), "etc", "permissions"), oemPermissionFlag);
}
void readPermissions(File libraryDir, int permissionFlag) {
@@ -327,6 +345,7 @@
boolean allowPermissions = (permissionFlag & ALLOW_PERMISSIONS) != 0;
boolean allowAppConfigs = (permissionFlag & ALLOW_APP_CONFIGS) != 0;
boolean allowPrivappPermissions = (permissionFlag & ALLOW_PRIVAPP_PERMISSIONS) != 0;
+ boolean allowOemPermissions = (permissionFlag & ALLOW_OEM_PERMISSIONS) != 0;
while (true) {
XmlUtils.nextElement(parser);
if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
@@ -569,6 +588,8 @@
XmlUtils.skipCurrentTag(parser);
} else if ("privapp-permissions".equals(name) && allowPrivappPermissions) {
readPrivAppPermissions(parser);
+ } else if ("oem-permissions".equals(name) && allowOemPermissions) {
+ readOemPermissions(parser);
} else {
XmlUtils.skipCurrentTag(parser);
continue;
@@ -695,4 +716,40 @@
mPrivAppDenyPermissions.put(packageName, denyPermissions);
}
}
+
+ void readOemPermissions(XmlPullParser parser) throws IOException, XmlPullParserException {
+ final String packageName = parser.getAttributeValue(null, "package");
+ if (TextUtils.isEmpty(packageName)) {
+ Slog.w(TAG, "package is required for <oem-permissions> in "
+ + parser.getPositionDescription());
+ return;
+ }
+
+ ArrayMap<String, Boolean> permissions = mOemPermissions.get(packageName);
+ if (permissions == null) {
+ permissions = new ArrayMap<>();
+ }
+ final int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ final String name = parser.getName();
+ if ("permission".equals(name)) {
+ final String permName = parser.getAttributeValue(null, "name");
+ if (TextUtils.isEmpty(permName)) {
+ Slog.w(TAG, "name is required for <permission> in "
+ + parser.getPositionDescription());
+ continue;
+ }
+ permissions.put(permName, Boolean.TRUE);
+ } else if ("deny-permission".equals(name)) {
+ String permName = parser.getAttributeValue(null, "name");
+ if (TextUtils.isEmpty(permName)) {
+ Slog.w(TAG, "name is required for <deny-permission> in "
+ + parser.getPositionDescription());
+ continue;
+ }
+ permissions.put(permName, Boolean.FALSE);
+ }
+ }
+ mOemPermissions.put(packageName, permissions);
+ }
}
diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp
index 7b381b4..fd1d87f 100644
--- a/core/jni/android/graphics/Picture.cpp
+++ b/core/jni/android/graphics/Picture.cpp
@@ -31,7 +31,6 @@
} else if (NULL != src->mRecorder.get()) {
mPicture = src->makePartialCopy();
}
- validate();
} else {
mWidth = 0;
mHeight = 0;
@@ -50,18 +49,15 @@
void Picture::endRecording() {
if (NULL != mRecorder.get()) {
mPicture = mRecorder->finishRecordingAsPicture();
- validate();
mRecorder.reset(NULL);
}
}
int Picture::width() const {
- validate();
return mWidth;
}
int Picture::height() const {
- validate();
return mHeight;
}
@@ -84,7 +80,6 @@
if (NULL != mRecorder.get()) {
this->makePartialCopy()->serialize(stream);
} else if (NULL != mPicture.get()) {
- validate();
mPicture->serialize(stream);
} else {
// serialize "empty" picture
@@ -99,7 +94,6 @@
this->endRecording();
SkASSERT(NULL != mPicture.get());
}
- validate();
if (NULL != mPicture.get()) {
mPicture->playback(canvas->asSkCanvas());
}
@@ -115,14 +109,4 @@
return reRecorder.finishRecordingAsPicture();
}
-void Picture::validate() const {
-#ifdef SK_DEBUG
- if (NULL != mPicture.get()) {
- SkRect cullRect = mPicture->cullRect();
- SkRect myRect = SkRect::MakeWH(SkIntToScalar(mWidth), SkIntToScalar(mHeight));
- SkASSERT(cullRect == myRect);
- }
-#endif
-}
-
}; // namespace android
diff --git a/core/jni/android/graphics/Picture.h b/core/jni/android/graphics/Picture.h
index b73b375..3068631 100644
--- a/core/jni/android/graphics/Picture.h
+++ b/core/jni/android/graphics/Picture.h
@@ -61,8 +61,6 @@
// Make a copy of a picture that is in the midst of being recorded. The
// resulting picture will have balanced saves and restores.
sk_sp<SkPicture> makePartialCopy() const;
-
- void validate() const;
};
}; // namespace android
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index 7ec4b8e..5ef2a9e 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -56,7 +56,7 @@
}
template<typename T>
-static void tryAddSchema(const T* object, const XmlConverter<T>& converter,
+static void tryAddSchema(const std::shared_ptr<const T>& object, const XmlConverter<T>& converter,
const std::string& description,
std::vector<std::string>* cStrings) {
if (object == nullptr) {
@@ -66,7 +66,7 @@
}
}
-static void tryAddHalNamesAndVersions(const HalManifest *manifest,
+static void tryAddHalNamesAndVersions(const std::shared_ptr<const HalManifest>& manifest,
const std::string& description,
std::set<std::string> *output) {
if (manifest == nullptr) {
@@ -119,7 +119,7 @@
}
static jstring android_os_VintfObject_getSepolicyVersion(JNIEnv* env, jclass) {
- const HalManifest *manifest = VintfObject::GetDeviceHalManifest();
+ std::shared_ptr<const HalManifest> manifest = VintfObject::GetDeviceHalManifest();
if (manifest == nullptr || manifest->type() != SchemaType::DEVICE) {
LOG(WARNING) << __FUNCTION__ << "Cannot get device manifest";
return nullptr;
@@ -129,7 +129,7 @@
}
static jobject android_os_VintfObject_getVndkSnapshots(JNIEnv* env, jclass) {
- const HalManifest *manifest = VintfObject::GetFrameworkHalManifest();
+ std::shared_ptr<const HalManifest> manifest = VintfObject::GetFrameworkHalManifest();
if (manifest == nullptr || manifest->type() != SchemaType::FRAMEWORK) {
LOG(WARNING) << __FUNCTION__ << "Cannot get framework manifest";
return nullptr;
diff --git a/core/jni/android_os_VintfRuntimeInfo.cpp b/core/jni/android_os_VintfRuntimeInfo.cpp
index 19220cf0..315eac1 100644
--- a/core/jni/android_os_VintfRuntimeInfo.cpp
+++ b/core/jni/android_os_VintfRuntimeInfo.cpp
@@ -32,7 +32,7 @@
#define MAP_STRING_METHOD(javaMethod, cppString) \
static jstring android_os_VintfRuntimeInfo_##javaMethod(JNIEnv* env, jclass clazz) \
{ \
- const RuntimeInfo *info = VintfObject::GetRuntimeInfo(); \
+ std::shared_ptr<const RuntimeInfo> info = VintfObject::GetRuntimeInfo(); \
if (info == nullptr) return nullptr; \
return env->NewStringUTF((cppString).c_str()); \
} \
@@ -50,7 +50,7 @@
static jlong android_os_VintfRuntimeInfo_getKernelSepolicyVersion(JNIEnv *env, jclass clazz)
{
- const RuntimeInfo *info = VintfObject::GetRuntimeInfo();
+ std::shared_ptr<const RuntimeInfo> info = VintfObject::GetRuntimeInfo();
if (info == nullptr) return 0;
return static_cast<jlong>(info->kernelSepolicyVersion());
}
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 5b0f776..883d4db 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -133,6 +133,14 @@
jmethodID mCallback;
} gStrictModeCallbackOffsets;
+static struct thread_dispatch_offsets_t
+{
+ // Class state.
+ jclass mClass;
+ jmethodID mDispatchUncaughtException;
+ jmethodID mCurrentThread;
+} gThreadDispatchOffsets;
+
// ****************************************************************************
// ****************************************************************************
// ****************************************************************************
@@ -166,6 +174,23 @@
return vm->GetEnv((void **)&env, JNI_VERSION_1_4) >= 0 ? env : NULL;
}
+// Report a java.lang.Error (or subclass). This may terminate the runtime.
+static void report_java_lang_error(JNIEnv* env, jthrowable error)
+{
+ // Try to run the uncaught exception machinery.
+ jobject thread = env->CallStaticObjectMethod(gThreadDispatchOffsets.mClass,
+ gThreadDispatchOffsets.mCurrentThread);
+ if (thread != nullptr) {
+ env->CallVoidMethod(thread, gThreadDispatchOffsets.mDispatchUncaughtException,
+ error);
+ // Should not return here, unless more errors occured.
+ }
+ // Some error occurred that meant that either dispatchUncaughtException could not be
+ // called or that it had an error itself (as this should be unreachable under normal
+ // conditions). Clear the exception.
+ env->ExceptionClear();
+}
+
static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
{
env->ExceptionClear();
@@ -192,6 +217,10 @@
}
if (env->IsInstanceOf(excep, gErrorOffsets.mClass)) {
+ // Try to report the error. This should not return under normal circumstances.
+ report_java_lang_error(env, excep);
+ // The traditional handling: re-raise and abort.
+
/*
* It's an Error: Reraise the exception and ask the runtime to abort.
*/
@@ -1337,5 +1366,12 @@
gStrictModeCallbackOffsets.mCallback = GetStaticMethodIDOrDie(env, clazz,
"onBinderStrictModePolicyChange", "(I)V");
+ clazz = FindClassOrDie(env, "java/lang/Thread");
+ gThreadDispatchOffsets.mClass = MakeGlobalRefOrDie(env, clazz);
+ gThreadDispatchOffsets.mDispatchUncaughtException = GetMethodIDOrDie(env, clazz,
+ "dispatchUncaughtException", "(Ljava/lang/Throwable;)V");
+ gThreadDispatchOffsets.mCurrentThread = GetStaticMethodIDOrDie(env, clazz, "currentThread",
+ "()Ljava/lang/Thread;");
+
return 0;
}
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 2f5b2e2..57263b1 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -889,7 +889,7 @@
// Render into the surface
{
ContextFactory factory;
- RenderProxy proxy{false, renderNode, &factory};
+ RenderProxy proxy{true, renderNode, &factory};
proxy.loadSystemProperties();
proxy.setSwapBehavior(SwapBehavior::kSwap_discardBuffer);
proxy.initialize(surface);
diff --git a/core/jni/com_android_internal_os_ClassLoaderFactory.cpp b/core/jni/com_android_internal_os_ClassLoaderFactory.cpp
index 7052e5f..9ce3289 100644
--- a/core/jni/com_android_internal_os_ClassLoaderFactory.cpp
+++ b/core/jni/com_android_internal_os_ClassLoaderFactory.cpp
@@ -27,15 +27,17 @@
jint targetSdkVersion,
jstring librarySearchPath,
jstring libraryPermittedPath,
- jboolean isShared) {
+ jboolean isShared,
+ jboolean isForVendor) {
return android::CreateClassLoaderNamespace(env, targetSdkVersion,
classLoader, isShared == JNI_TRUE,
+ isForVendor == JNI_TRUE,
librarySearchPath, libraryPermittedPath);
}
static const JNINativeMethod g_methods[] = {
{ "createClassloaderNamespace",
- "(Ljava/lang/ClassLoader;ILjava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;",
+ "(Ljava/lang/ClassLoader;ILjava/lang/String;Ljava/lang/String;ZZ)Ljava/lang/String;",
reinterpret_cast<void*>(createClassloaderNamespace_native) },
};
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index fffdda1..32ef3dc 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -481,7 +481,7 @@
// Utility routine to fork zygote and specialize the child process.
static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
- jint debug_flags, jobjectArray javaRlimits,
+ jint runtime_flags, jobjectArray javaRlimits,
jlong permittedCapabilities, jlong effectiveCapabilities,
jint mount_external,
jstring java_se_info, jstring java_se_name,
@@ -662,7 +662,7 @@
UnsetSigChldHandler();
- env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, debug_flags,
+ env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, runtime_flags,
is_system_server, instructionSet);
if (env->ExceptionCheck()) {
RuntimeAbort(env, __LINE__, "Error calling post fork hooks.");
@@ -704,7 +704,7 @@
static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
- jint debug_flags, jobjectArray rlimits,
+ jint runtime_flags, jobjectArray rlimits,
jint mount_external, jstring se_info, jstring se_name,
jintArray fdsToClose,
jintArray fdsToIgnore,
@@ -748,17 +748,17 @@
// available.
capabilities &= GetEffectiveCapabilityMask(env);
- return ForkAndSpecializeCommon(env, uid, gid, gids, debug_flags,
+ return ForkAndSpecializeCommon(env, uid, gid, gids, runtime_flags,
rlimits, capabilities, capabilities, mount_external, se_info,
se_name, false, fdsToClose, fdsToIgnore, instructionSet, appDataDir);
}
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
- jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,
+ jint runtime_flags, jobjectArray rlimits, jlong permittedCapabilities,
jlong effectiveCapabilities) {
pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,
- debug_flags, rlimits,
+ runtime_flags, rlimits,
permittedCapabilities, effectiveCapabilities,
MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
NULL, NULL, NULL);
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index 5dfcd2a..7331a64 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -31,22 +31,13 @@
import "frameworks/base/core/proto/android/service/power.proto";
import "frameworks/base/core/proto/android/service/print.proto";
import "frameworks/base/core/proto/android/providers/settings.proto";
+import "frameworks/base/core/proto/android/os/incidentheader.proto";
import "frameworks/base/core/proto/android/os/kernelwake.proto";
+import "frameworks/base/core/proto/android/os/pagetypeinfo.proto";
import "frameworks/base/core/proto/android/os/procrank.proto";
package android.os;
-message IncidentHeaderProto {
- enum Cause {
- CAUSE_UNKNOWN = 0;
- CAUSE_USER = 1;
- CAUSE_ANR = 2;
- CAUSE_CRASH = 3;
- }
-
- Cause cause = 1;
-}
-
// privacy field options must not be set at this level because all
// the sections are able to be controlled and configured by section ids.
// Instead privacy field options need to be configured in each section proto message.
@@ -62,17 +53,24 @@
(section).type = SECTION_COMMAND,
(section).args = "/system/xbin/procrank"
];
- //PageTypeInfo page_type_info = 2001;
+
+ PageTypeInfo page_type_info = 2001 [
+ (section).type = SECTION_FILE,
+ (section).args = "/proc/pagetypeinfo"
+ ];
+
KernelWakeSources kernel_wake_sources = 2002 [
(section).type = SECTION_FILE,
(section).args = "/d/wakeup_sources"
];
+
// System Services
android.service.fingerprint.FingerprintServiceDumpProto fingerprint = 3000 [
(section).type = SECTION_DUMPSYS,
(section).args = "fingerprint --proto --incident"
];
+
android.service.NetworkStatsServiceDumpProto netstats = 3001;
android.providers.settings.SettingsServiceDumpProto settings = 3002;
android.service.appwidget.AppWidgetServiceDumpProto appwidget = 3003;
diff --git a/core/proto/android/os/incidentheader.proto b/core/proto/android/os/incidentheader.proto
new file mode 100644
index 0000000..55a0616
--- /dev/null
+++ b/core/proto/android/os/incidentheader.proto
@@ -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.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_outer_classname = "IncidentHeaderProtoMetadata";
+
+package android.os;
+
+message IncidentHeaderProto {
+ enum Cause {
+ CAUSE_UNKNOWN = 0;
+ CAUSE_USER = 1;
+ CAUSE_ANR = 2;
+ CAUSE_CRASH = 3;
+ }
+
+ Cause cause = 1;
+}
+
diff --git a/core/proto/android/os/pagetypeinfo.proto b/core/proto/android/os/pagetypeinfo.proto
new file mode 100644
index 0000000..fbb4ee5
--- /dev/null
+++ b/core/proto/android/os/pagetypeinfo.proto
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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";
+
+option java_multiple_files = true;
+option java_outer_classname = "PageTypeInfoProto";
+
+package android.os;
+
+/*
+ * /proc/pagetypeinfo exports free memory distributions.
+ *
+ * For example, the order of a page ranges form 0 to 10.
+ * An order-0 page is 4 KB in size and 4 KB aligned.
+ * An order-1 page is 8 KB in size and 8 KB aligned.
+ * An order-10 page is 4096 KB in size and 4096 aligned.
+ * The memory has multiple zones, e.g. DMA zone, Normal zone
+ * Each zone has 11 free area. Each free area corresponds to pages of the same order.
+ * Each free area has 6 free list. Each corresponds to one migration type.
+ * The six migration types are Unmovable, Reclaimable, Movable, Reserve, CMA, and Isolate.
+ * Each zone has 11 * 6 = 66 free list.
+ *
+ * Next tag: 5
+ */
+message PageTypeInfo {
+
+ int32 page_block_order = 1;
+
+ int32 pages_per_block = 2;
+
+ repeated MigrateTypeProto migrate_types = 3;
+
+ repeated BlockProto blocks = 4;
+}
+
+// Next tag: 5
+message MigrateTypeProto {
+
+ int32 node = 1;
+
+ string zone = 2;
+
+ string type = 3;
+
+ // order level starts from 0 for 4KB to page_block_order defined above, e.g. 10 for 4096KB
+ repeated int32 free_pages_count = 4;
+}
+
+// Next tag: 9
+message BlockProto {
+
+ int32 node = 1;
+
+ string zone = 2;
+
+ int32 unmovable = 3;
+
+ int32 reclaimable = 4;
+
+ int32 movable = 5;
+
+ int32 cma = 6;
+
+ int32 reserve = 7;
+
+ int32 isolate = 8;
+}
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index fc63d37..3db4df0 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -506,6 +506,7 @@
SettingProto instant_apps_enabled = 166;
SettingProto device_paired = 167;
SettingProto notification_badging = 168;
+ SettingProto backup_manager_constants = 169;
}
message SystemSettingsProto {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 0d9a995..8122eb7 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -309,6 +309,10 @@
<protected-broadcast android:name="com.android.server.usb.ACTION_OPEN_IN_APPS" />
<protected-broadcast android:name="com.android.server.am.DELETE_DUMPHEAP" />
<protected-broadcast android:name="com.android.server.net.action.SNOOZE_WARNING" />
+ <protected-broadcast android:name="com.android.server.wifi.ConnectToNetworkNotification.USER_DISMISSED_NOTIFICATION" />
+ <protected-broadcast android:name="com.android.server.wifi.ConnectToNetworkNotification.CONNECT_TO_NETWORK" />
+ <protected-broadcast android:name="com.android.server.wifi.ConnectToNetworkNotification.PICK_WIFI_NETWORK" />
+ <protected-broadcast android:name="com.android.server.wifi.ConnectToNetworkNotification.PICK_NETWORK_AFTER_FAILURE" />
<protected-broadcast android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.WIFI_CREDENTIAL_CHANGED" />
@@ -3140,6 +3144,11 @@
<permission android:name="android.permission.READ_SEARCH_INDEXABLES"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Internal permission to allows an application to bind to suggestion service.
+ @hide -->
+ <permission android:name="android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi Allows applications to set a live wallpaper.
@hide XXX Change to signature once the picker is moved to its
own apk as Ghod Intended. -->
diff --git a/core/res/res/drawable-nodpi/platlogo.xml b/core/res/res/drawable-nodpi/platlogo.xml
index 182ba24..a6dee8a 100644
--- a/core/res/res/drawable-nodpi/platlogo.xml
+++ b/core/res/res/drawable-nodpi/platlogo.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2017 The Android Open Source Project
@@ -14,27 +15,35 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="480dp"
- android:height="480dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:pathData="M25.0,25.0m-20.5,0.0a20.5,20.5,0,1,1,41.0,0.0a20.5,20.5,0,1,1,-41.0,0.0"
- android:fillAlpha="0.066"
- android:fillColor="#000000"/>
- <path
- android:pathData="M24.0,24.0m-20.0,0.0a20.0,20.0,0,1,1,40.0,0.0a20.0,20.0,0,1,1,-40.0,0.0"
- android:fillColor="#FFC107"/>
- <path
- android:pathData="M44,24.2010101 L33.9004889,14.101499 L14.101499,33.9004889 L24.2010101,44 C29.2525804,43.9497929 34.2887564,41.9975027 38.1431296,38.1431296 C41.9975027,34.2887564 43.9497929,29.2525804 44,24.2010101 Z"
- android:fillColor="#FE9F00"/>
- <path
- android:pathData="M24.0,24.0m-14.0,0.0a14.0,14.0,0,1,1,28.0,0.0a14.0,14.0,0,1,1,-28.0,0.0"
- android:fillColor="#FED44F"/>
- <path
- android:pathData="M37.7829445,26.469236 L29.6578482,18.3441397 L18.3441397,29.6578482 L26.469236,37.7829445 C29.1911841,37.2979273 31.7972024,36.0037754 33.9004889,33.9004889 C36.0037754,31.7972024 37.2979273,29.1911841 37.7829445,26.469236 Z"
- android:fillColor="#FFC107"/>
- <path
- android:pathData="M24.0,24.0m-8.0,0.0a8.0,8.0,0,1,1,16.0,0.0a8.0,8.0,0,1,1,-16.0,0.0"
- android:fillColor="#FFFFFF"/>
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <group>
+ <path
+ android:fillColor="#2C292A"
+ android:fillType="evenOdd"
+ android:pathData="M6,26a20,20 0 0,1 40,0a20,20 0 0,1 -40,0z"/>
+ <path
+ android:fillColor="#FAFAFA"
+ android:fillType="evenOdd"
+ android:pathData="M4,24a20,20 0 0,1 40,0a20,20 0 0,1 -40,0z"/>
+ <path
+ android:fillColor="#2C292A"
+ android:fillType="evenOdd"
+ android:pathData="M2,22a20,20 0 0,1 40,0a20,20 0 0,1 -40,0z"/>
+ <path
+ android:fillColor="#00000000"
+ android:strokeColor="#453F41"
+ android:strokeWidth="1"
+ android:fillType="evenOdd"
+ android:pathData="M26.5 29.5v3c0 1.13-.87 2-2 2s-2-.87-2-2v-3h-1v3c0 1.13-.87 2-2 2s-2-.87-2-2v-3H17a1.5 1.5 0 0 1-1.5-1.5V17.5h13V28a1.5 1.5 0 0 1-1.5 1.5h-.5zM13.5 17.5c1.13 0 2 .87 2 2v7c0 1.13-.87 2-2 2s-2-.87-2-2v-7c0-1.13.87-2 2-2zM30.5 17.5c1.13 0 2 .87 2 2v7c0 1.13-.87 2-2 2s-2-.87-2-2v-7c0-1.13.87-2 2-2zM26.3 12.11A6.46 6.46 0 0 1 28.5 17v.5h-13V17a6.46 6.46 0 0 1 2.2-4.89l-.9-.9a.98.98 0 0 1 0-1.41.98.98 0 0 1 1.4 0l1.26 1.25A6.33 6.33 0 0 1 22 10.5c.87 0 1.73.2 2.54.55L25.8 9.8a.98.98 0 0 1 1.4 0 .98.98 0 0 1 0 1.4l-.9.91z"/>
+ <path
+ android:fillColor="#453F41"
+ android:fillType="evenOdd"
+ android:pathData="M20.16 14.5a.66.66 0 1 1-1.31 0c0-.36.29-.65.65-.65.36 0 .65.29.65.65zM25.16 14.5c0 .36-.3.66-.66.66a.65.65 0 1 1 .66-.66z"/>
+ <path
+ android:fillColor="#453F41"
+ android:pathData="M22 40.5c0.36 0 0.73-0.01 1.09-0.03l-0.18-3A15.77 15.77 0 0 1 22 37.5v3zm2.17-0.13a18.48 18.48 0 0 0 1.08-0.15l-0.53-2.96c-0.3 0.05-0.6 0.1-0.9 0.13l0.35 2.98zM26.32 40a18.37 18.37 0 0 0 1.05-0.28l-0.87-2.87a15.37 15.37 0 0 1-0.88 0.23l0.7 2.92zm2.1-0.64l-1.03-2.81a15.39 15.39 0 0 0 0.84-0.34l1.2 2.74a18.39 18.39 0 0 1-1 0.41zm1.99-0.87l-1.37-2.67a15.46 15.46 0 0 0 0.8-0.44l1.52 2.59a18.46 18.46 0 0 1-0.95 0.52zm1.89-1.11l-1.67-2.5a15.55 15.55 0 0 0 0.74-0.52l1.81 2.39a18.55 18.55 0 0 1-0.88 0.63zm1.75-1.33l-1.95-2.28a15.6 15.6 0 0 0 0.67-0.61l2.09 2.15a18.6 18.6 0 0 1-0.8 0.74zm1.6-1.55l-2.22-2.02a15.6 15.6 0 0 0 0.6-0.7l2.33 1.9a18.6 18.6 0 0 1-0.72 0.82zM37 32.82l-2.43-1.76a15.53 15.53 0 0 0 0.5-0.75l2.54 1.6c-0.2 0.31-0.4 0.61-0.61 0.9zm1.15-1.8l-2.62-1.47a15.45 15.45 0 0 0 0.42-0.8l2.7 1.3a18.45 18.45 0 0 1-0.5 0.97zm0.95-1.98l-2.77-1.14a15.38 15.38 0 0 0 0.32-0.86l2.84 0.98a18.38 18.38 0 0 1-0.39 1.02zm0.72-2.09c0.1-0.34 0.18-0.7 0.26-1.05l-2.93-0.63a15.38 15.38 0 0 1-0.22 0.88l2.89 0.8zm0.46-2.15a18.52 18.52 0 0 0 0.13-1.08l-2.99-0.28a15.52 15.52 0 0 1-0.1 0.9l2.96 0.46zm0.2-2.2a18.81 18.81 0 0 0 0-1.1l-3 0.08a16 16 0 0 1 0 0.92l3 0.1zm-0.06-2.2a18.54 18.54 0 0 0-0.12-1.07l-2.97 0.43c0.04 0.3 0.08 0.6 0.1 0.9l3-0.25zm-0.31-2.15a18.39 18.39 0 0 0-0.25-1.06l-2.9 0.78a15.39 15.39 0 0 1 0.21 0.89l2.94-0.6zm-0.57-2.12l-2.85 0.95a15.37 15.37 0 0 0-0.31-0.85l2.78-1.12a18.37 18.37 0 0 1 0.38 1.02zm-0.83-2.06l-2.71 1.29a15.44 15.44 0 0 0-0.42-0.81l2.63-1.45a18.44 18.44 0 0 1 0.5 0.97zm-1.03-1.88l-2.54 1.6a15.53 15.53 0 0 0-0.5-0.76l2.44-1.74 0.6 0.9zm-1.28-1.79l-2.33 1.88a15.6 15.6 0 0 0-0.6-0.69l2.23-2.02a18.6 18.6 0 0 1 0.7 0.83zm-1.48-1.63l-2.1 2.14a15.6 15.6 0 0 0-0.67-0.62l1.97-2.26a18.6 18.6 0 0 1 0.8 0.74zM33.24 7.3l-1.82 2.38a15.55 15.55 0 0 0-0.74-0.53l1.68-2.49c0.3 0.2 0.6 0.42 0.88 0.64zm-1.71-1.17L29.98 8.7a15.47 15.47 0 0 0-0.8-0.45l1.4-2.66a18.47 18.47 0 0 1 0.95 0.54zm-1.95-1.02l-1.23 2.74A15.4 15.4 0 0 0 27.5 7.5l1.06-2.8a18.4 18.4 0 0 1 1.01 0.4zm-2.06-0.78l-0.9 2.86a15.37 15.37 0 0 0-0.87-0.24l0.72-2.92a18.37 18.37 0 0 1 1.05 0.3zM25.38 3.8a18.47 18.47 0 0 0-1.08-0.17l-0.37 2.98c0.3 0.04 0.6 0.08 0.9 0.14l0.55-2.95zm-2.2-0.27A18.75 18.75 0 0 0 22.1 3.5l-0.02 3L23 6.53l0.19-3zM21 3.53a18.6 18.6 0 0 0-1.08 0.09l0.33 2.98a15.6 15.6 0 0 1 0.91-0.08l-0.16-3zm-2.16 0.24A18.4 18.4 0 0 0 17.76 4l0.68 2.92a15.4 15.4 0 0 1 0.9-0.18l-0.51-2.96zm-2.14 0.5l0.86 2.88a15.37 15.37 0 0 0-0.86 0.28l-1.03-2.81a18.37 18.37 0 0 1 1.03-0.35zm-2.07 0.76l1.2 2.75a15.42 15.42 0 0 0-0.83 0.4L13.63 5.5a18.42 18.42 0 0 1 0.99-0.47zM12.7 6l1.5 2.6a15.5 15.5 0 0 0-0.76 0.48l-1.66-2.5A18.5 18.5 0 0 1 12.7 6zm-1.83 1.22l1.8 2.4a15.58 15.58 0 0 0-0.7 0.57L10.01 7.9a18.58 18.58 0 0 1 0.85-0.68zM9.19 8.66l2.07 2.16a15.6 15.6 0 0 0-0.63 0.65l-2.2-2.04a18.6 18.6 0 0 1 0.76-0.77zm-1.51 1.63l2.32 1.9a15.57 15.57 0 0 0-0.56 0.72l-2.42-1.76a18.57 18.57 0 0 1 0.66-0.86zm-1.23 1.69l2.52 1.62a15.5 15.5 0 0 0-0.47 0.78l-2.61-1.47a18.5 18.5 0 0 1 0.56-0.93zm-1.08 1.9l2.7 1.32a15.41 15.41 0 0 0-0.38 0.83l-2.77-1.15a18.41 18.41 0 0 1 0.45-1zm-0.85 2.04l2.84 0.98a15.37 15.37 0 0 0-0.28 0.87L4.2 16.96c0.1-0.35 0.2-0.7 0.32-1.04zm-0.6 2.12a18.43 18.43 0 0 0-0.2 1.07l2.97 0.47c0.05-0.3 0.1-0.6 0.17-0.9l-2.93-0.64zm-0.34 2.18a18.65 18.65 0 0 0-0.07 1.09l3 0.11 0.06-0.91-2.99-0.29zm-0.08 2.2a18.7 18.7 0 0 0 0.06 1.1l3-0.25a15.7 15.7 0 0 1-0.06-0.91l-3 0.07zm0.18 2.18a18.44 18.44 0 0 0 0.18 1.07l2.95-0.6a15.44 15.44 0 0 1-0.16-0.9L3.68 24.6zm0.43 2.14l2.9-0.77a15.37 15.37 0 0 0 0.26 0.88l-2.85 0.94a18.37 18.37 0 0 1-0.3-1.05zm0.7 2.1l2.78-1.11a15.4 15.4 0 0 0 0.36 0.83l-2.71 1.27a18.4 18.4 0 0 1-0.44-1zm0.9 1.95l2.65-1.43a15.48 15.48 0 0 0 0.45 0.8l-2.55 1.57a18.48 18.48 0 0 1-0.54-0.94zm1.17 1.87l2.45-1.73a15.56 15.56 0 0 0 0.54 0.73l-2.34 1.87a18.56 18.56 0 0 1-0.65-0.87zm1.37 1.72l2.23-2a15.6 15.6 0 0 0 0.63 0.65l-2.1 2.14a18.6 18.6 0 0 1-0.76-0.79zm1.58 1.56l1.98-2.26c0.22 0.2 0.46 0.39 0.7 0.58l-1.84 2.37a18.59 18.59 0 0 1-0.84-0.7zm1.66 1.28l1.7-2.46a15.52 15.52 0 0 0 0.77 0.5l-1.56 2.56a18.52 18.52 0 0 1-0.91-0.6zm1.87 1.14l1.4-2.65a15.43 15.43 0 0 0 0.82 0.4l-1.24 2.73a18.43 18.43 0 0 1-0.98-0.48zm2 0.91l1.08-2.8a15.37 15.37 0 0 0 0.86 0.3l-0.9 2.86a18.37 18.37 0 0 1-1.04-0.36zm2.1 0.67a18.4 18.4 0 0 0 1.07 0.23l0.56-2.94a15.4 15.4 0 0 1-0.9-0.2l-0.72 2.91zm2.18 0.41a18.57 18.57 0 0 0 1.08 0.1l0.2-2.99a15.57 15.57 0 0 1-0.9-0.09l-0.38 2.98zm2.2 0.15H22v-3h-0.13l-0.03 3z"/>
+ </group>
</vector>
diff --git a/core/res/res/drawable-nodpi/platlogo_m.xml b/core/res/res/drawable-nodpi/platlogo_m.xml
index d9a558d..aacf674 100644
--- a/core/res/res/drawable-nodpi/platlogo_m.xml
+++ b/core/res/res/drawable-nodpi/platlogo_m.xml
@@ -1,5 +1,5 @@
<!--
-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");
you may not use this file except in compliance with the License.
@@ -14,59 +14,27 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
+ android:width="480dp"
+ android:height="480dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0">
+ <!--<path
+ android:pathData="M25.0,25.0m-20.5,0.0a20.5,20.5,0,1,1,41.0,0.0a20.5,20.5,0,1,1,-41.0,0.0"
+ android:fillAlpha="0.066"
+ android:fillColor="#000000"/>-->
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M33.8,38l-25.5,-25.5l-1.7000003,0.6999998l25.499998,25.5z"/>
+ android:pathData="M24.0,24.0m-20.0,0.0a20.0,20.0,0,1,1,40.0,0.0a20.0,20.0,0,1,1,-40.0,0.0"
+ android:fillColor="#FFC107"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M40.8,34.8l-25.4,-25.5l-1.6999998,0.6999998l25.5,25.5z"/>
+ android:pathData="M44,24.2010101 L33.9004889,14.101499 L14.101499,33.9004889 L24.2010101,44 C29.2525804,43.9497929 34.2887564,41.9975027 38.1431296,38.1431296 C41.9975027,34.2887564 43.9497929,29.2525804 44,24.2010101 Z"
+ android:fillColor="#FE9F00"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.1,13.1l-0.3,-0.4l1.1,-1.3l0,0l-1.6,0.8l-0.4,-0.4l2.6,-1.2l0.4,0.4l-1.1,1.3l0,0l1.6,-0.8l0.3,0.4L11.1,13.1z"/>
+ android:pathData="M24.0,24.0m-14.0,0.0a14.0,14.0,0,1,1,28.0,0.0a14.0,14.0,0,1,1,-28.0,0.0"
+ android:fillColor="#FED44F"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M13,14.2l-0.5,-0.5l-0.6,0.2l-0.4,-0.4l3.1,-0.7l0.4,0.4l-2.1,1.7l-0.4,-0.4L13,14.2z M13,13.6l0.3,0.3l0.8,-0.6 l0,0L13,13.6z"/>
+ android:pathData="M37.7829445,26.469236 L29.6578482,18.3441397 L18.3441397,29.6578482 L26.469236,37.7829445 C29.1911841,37.2979273 31.7972024,36.0037754 33.9004889,33.9004889 C36.0037754,31.7972024 37.2979273,29.1911841 37.7829445,26.469236 Z"
+ android:fillColor="#FFC107"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M16.3,14.6l-1.6,1.2l0,0l2.2,-0.6l0.5,0.5l-2.6,1.2l-0.3,-0.4l0.7,-0.3l1,-0.4l0,0l-2.1,0.5L13.9,16l1.4,-1.1l0,0 l-0.9,0.5l-0.7,0.3l-0.3,-0.4l2.6,-1.2L16.3,14.6z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M17.4,17.8l-0.6,-0.6l-0.7,0.3l0.7,0.7l-0.4,0.2l-1,-1l2.6,-1.2l1,1l-0.4,0.2l-0.7,-0.7L17.2,17l0.6,0.6L17.4,17.8 z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M18.8,18.7L18.8,18.7l1.3,-0.2l0.4,0.4l-2.1,0.3l-0.9,0.4l-0.3,-0.4l1,-0.4l1.2,-1.2l0.4,0.4L18.8,18.7z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M22.2,20.5l-1.6,1.2l0,0l2.2,-0.6l0.5,0.5l-2.6,1.2l-0.3,-0.4l0.7,-0.3l1,-0.4l0,0L20,22.1l-0.2,-0.2l1.4,-1.1l0,0 l-0.9,0.5l-0.7,0.3l-0.3,-0.4l2.6,-1.2L22.2,20.5z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M22,23.6c0,0,0.1,0.1,0.2,0.1c0.1,0,0.2,0,0.3,-0.1l0.3,0.3c-0.2,0.1,-0.4,0.1,-0.6,0.1c-0.2,0,-0.4,-0.1,-0.5,-0.2 c-0.2,-0.2,-0.2,-0.3,-0.1,-0.5c0.1,-0.2,0.2,-0.3,0.5,-0.4l0.2,-0.1c0.3,-0.1,0.5,-0.2,0.8,-0.2c0.2,0,0.5,0.1,0.6,0.3 c0.1,0.1,0.2,0.3,0.1,0.4c0,0.1,-0.2,0.3,-0.4,0.4L23,23.4c0.1,0,0.2,-0.1,0.2,-0.2c0,-0.1,0,-0.1,0,-0.2C23.1,23,23,22.9,22.9,23 c-0.1,0,-0.2,0.1,-0.4,0.1l-0.2,0.1c-0.2,0.1,-0.3,0.1,-0.3,0.2C21.9,23.5,21.9,23.5,22,23.6z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M23.8,25.9l-0.3,-0.4l1.1,-1.3l0,0L22.9,25l-0.4,-0.4l2.6,-1.2l0.4,0.4l-1.1,1.3l0,0l1.6,-0.8l0.3,0.4L23.8,25.9z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M25.7,27l-0.5,-0.5l-0.6,0.2l-0.4,-0.4l3.1,-0.7l0.4,0.4l-2.1,1.7l-0.4,-0.4L25.7,27z M25.7,26.4l0.3,0.3l0.8,-0.6 l0,0L25.7,26.4z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M29,27.4l-1.6,1.2l0,0l2.2,-0.6l0.5,0.5l-2.6,1.2l-0.3,-0.4l0.8,-0.3l1,-0.4l0,0L26.8,29l-0.2,-0.2l1.4,-1.1l0,0 L27,28.1l-0.8,0.3l-0.3,-0.4l2.6,-1.2L29,27.4z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M30,30.6L29.5,30l-0.7,0.3l0.7,0.7L29,31.2l-1,-1l2.6,-1.2l1,1l-0.4,0.2l-0.7,-0.7l-0.6,0.3l0.6,0.6L30,30.6z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M31.5,32.1l-0.6,-0.6L29.8,32l-0.4,-0.4l2.6,-1.2l1,1l-0.4,0.2L32,31l-0.7,0.3l0.6,0.6L31.5,32.1z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M32,33.5L31.6,33L31,33.2l-0.4,-0.4l3.1,-0.7l0.4,0.4l-2.1,1.7l-0.4,-0.4L32,33.5z M32.1,32.9l0.3,0.3l0.8,-0.6 l0,0L32.1,32.9z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M34.3,35.3c-0.3,0.1,-0.5,0.2,-0.8,0.1c-0.2,0,-0.5,-0.1,-0.6,-0.3c-0.2,-0.2,-0.2,-0.4,-0.2,-0.5 c0.1,-0.2,0.2,-0.3,0.6,-0.5l0.8,-0.4c0.3,-0.1,0.6,-0.2,0.9,-0.2c0.3,0,0.5,0.1,0.7,0.3c0.2,0.2,0.3,0.4,0.2,0.5c0,0.2,-0.2,0.3,-0.5,0.5 l-0.3,-0.4c0.2,-0.1,0.3,-0.1,0.3,-0.2c0,-0.1,0,-0.1,-0.1,-0.2C35,34,34.9,34,34.8,34c-0.1,0,-0.3,0,-0.5,0.1l-0.8,0.4 c-0.2,0.1,-0.3,0.2,-0.4,0.2c0,0.1,0,0.1,0,0.2c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.4,-0.1L34.3,35.3z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M36,36.6L35.4,36l-0.7,0.3l0.7,0.7l-0.4,0.2l-1,-1l2.6,-1.2l1,1l-0.4,0.2l-0.7,-0.7l-0.6,0.3l0.6,0.6L36,36.6z"/>
+ android:pathData="M24.0,24.0m-8.0,0.0a8.0,8.0,0,1,1,16.0,0.0a8.0,8.0,0,1,1,-16.0,0.0"
+ android:fillColor="#FFFFFF"/>
</vector>
diff --git a/core/res/res/drawable-nodpi/stat_sys_adb.xml b/core/res/res/drawable-nodpi/stat_sys_adb.xml
index 89e42e6..2e2b395 100644
--- a/core/res/res/drawable-nodpi/stat_sys_adb.xml
+++ b/core/res/res/drawable-nodpi/stat_sys_adb.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2017 The Android Open Source Project
@@ -14,19 +15,23 @@
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="M12.0,12.0m-10.0,0.0a10.0,10.0,0,1,1,20.0,0.0a10.0,10.0,0,1,1,-20.0,0.0"
- android:fillAlpha="0.25"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M12,18.5 C15.5898509,18.5 18.5,15.5898509 18.5,12 C18.5,8.41014913 15.5898509,5.5 12,5.5 C8.41014913,5.5 5.5,8.41014913 5.5,12 C5.5,15.5898509 8.41014913,18.5 12,18.5 Z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M12,18.5 C8.41014913,18.5 5.5,15.5898509 5.5,12 C5.5,8.41014913 8.41014913,5.5 12,5.5 C15.5898509,5.5 18.5,8.41014913 18.5,12 C18.5,15.5898509 15.5898509,18.5 12,18.5 Z M12,15 C13.6568542,15 15,13.6568542 15,12 C15,10.3431458 13.6568542,9 12,9 C10.3431458,9 9,10.3431458 9,12 C9,13.6568542 10.3431458,15 12,15 Z"
- android:fillAlpha="0.25"/>
-</vector>
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <group>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillAlpha=".33"
+ android:fillType="evenOdd"
+ android:pathData="M5.71 18.29A8.99 8.99 0 0 0 22 13c0-3-1.46-5.65-3.71-7.29A8.99 8.99 0 0 0 2 11c0 3 1.46 5.65 3.71 7.29z"/>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillType="evenOdd"
+ android:pathData="M7.25 19.18A8.5 8.5 0 0 0 19.19 7.24 9 9 0 0 1 7.24 19.19z"/>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillAlpha=".33"
+ android:pathData="M10.5 3a0.5 0.5 0 1 1 1 0v2.05a0.5 0.5 0 1 1-1 0V3zm3.1 0.42a0.5 0.5 0 0 1 0.93 0.39l-0.8 1.88A0.5 0.5 0 1 1 12.8 5.3l0.8-1.88zm2.7 1.57a0.5 0.5 0 1 1 0.71 0.7l-1.45 1.46a0.5 0.5 0 0 1-0.7-0.71l1.44-1.45zm1.9 2.5a0.5 0.5 0 0 1 0.38 0.92l-1.9 0.77a0.5 0.5 0 0 1-0.37-0.93l1.9-0.77zM19 10.5a0.5 0.5 0 1 1 0 1h-2.05a0.5 0.5 0 0 1 0-1H19zm-0.42 3.1a0.5 0.5 0 0 1-0.39 0.93l-1.88-0.8a0.5 0.5 0 1 1 0.39-0.92l1.88 0.8zm-1.57 2.7a0.5 0.5 0 1 1-0.7 0.71l-1.46-1.45a0.5 0.5 0 0 1 0.71-0.7l1.45 1.44zm-2.5 1.9a0.5 0.5 0 1 1-0.92 0.38l-0.77-1.9a0.5 0.5 0 0 1 0.93-0.37l0.77 1.9zM11.5 19a0.5 0.5 0 1 1-1 0v-2.05a0.5 0.5 0 0 1 1 0V19zm-3.1-0.42a0.5 0.5 0 0 1-0.93-0.39l0.8-1.88A0.5 0.5 0 0 1 9.2 16.7l-0.8 1.88zm-2.7-1.57a0.5 0.5 0 1 1-0.71-0.7l1.45-1.46a0.5 0.5 0 0 1 0.7 0.71L5.7 17.01zm-1.9-2.48a0.5 0.5 0 0 1-0.38-0.92l1.88-0.8a0.5 0.5 0 0 1 0.4 0.92l-1.9 0.8zM3 11.5a0.5 0.5 0 1 1 0-1h2.05a0.5 0.5 0 1 1 0 1H3zm0.42-3.1A0.5 0.5 0 0 1 3.8 7.46l1.88 0.8A0.5 0.5 0 1 1 5.3 9.2L3.42 8.4zm1.57-2.7a0.5 0.5 0 1 1 0.7-0.71l1.46 1.45a0.5 0.5 0 0 1-0.71 0.7L4.99 5.7zm2.5-1.9A0.5 0.5 0 0 1 8.4 3.41l0.77 1.9a0.5 0.5 0 0 1-0.93 0.37L7.48 3.8z"/>
+ </group>
+</vector>
\ No newline at end of file
diff --git a/core/res/res/drawable/ic_close.xml b/core/res/res/drawable/ic_close.xml
index 7086959..70565f2 100644
--- a/core/res/res/drawable/ic_close.xml
+++ b/core/res/res/drawable/ic_close.xml
@@ -19,6 +19,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:pathData="M19.000000,6.400000l-1.400000,-1.400000 -5.600000,5.600000 -5.600000,-5.600000 -1.400000,1.400000 5.600000,5.600000 -5.600000,5.600000 1.400000,1.400000 5.600000,-5.600000 5.600000,5.600000 1.400000,-1.400000 -5.600000,-5.600000z"
+ android:pathData="M18.3,5.71a0.996,0.996 0,0 0,-1.41 0L12,10.59 7.11,5.7A0.996,0.996 0,1 0,5.7 7.11L10.59,12 5.7,16.89a0.996,0.996 0,1 0,1.41 1.41L12,13.41l4.89,4.89a0.996,0.996 0,1 0,1.41 -1.41L13.41,12l4.89,-4.89c0.38,-0.38 0.38,-1.02 0,-1.4z"
android:fillColor="#FF000000"/>
</vector>
diff --git a/core/res/res/drawable/ic_eject_24dp.xml b/core/res/res/drawable/ic_eject_24dp.xml
index 1bb351a..321ee3b 100644
--- a/core/res/res/drawable/ic_eject_24dp.xml
+++ b/core/res/res/drawable/ic_eject_24dp.xml
@@ -20,5 +20,8 @@
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
- android:pathData="M5 17h14v2H5zm7,-12L5.33 15h13.34z"/>
+ android:pathData="M6,17h12c0.55,0 1,0.45 1,1v0c0,0.55 -0.45,1 -1,1H6c-0.55,0 -1,-0.45 -1,-1v0C5,17.45 5.45,17 6,17z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M11.1,5.48l-5.22,7.83C5.39,14.03 5.91,15 6.78,15h10.44c0.87,0 1.39,-0.97 0.9,-1.69L12.9,5.48C12.47,4.84 11.53,4.84 11.1,5.48z"/>
</vector>
diff --git a/core/res/res/drawable/ic_feedback.xml b/core/res/res/drawable/ic_feedback.xml
index 365863d..c316e7d 100644
--- a/core/res/res/drawable/ic_feedback.xml
+++ b/core/res/res/drawable/ic_feedback.xml
@@ -20,5 +20,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
- android:pathData="M20.0,2.0L4.0,2.0c-1.1,0.0 -1.9,0.9 -1.99,2.0L2.0,22.0l4.0,-4.0l14.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L22.0,4.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-7.0,12.0l-2.0,0.0l0.0,-2.0l2.0,0.0l0.0,2.0zm0.0,-4.0l-2.0,0.0L11.0,6.0l2.0,0.0l0.0,4.0z"/>
+ android:pathData="M20,2H4C2.9,2 2,2.9 2,4v17.39c0,0.54 0.65,0.81 1.04,0.43L6.86,18H20c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM11,7c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v3c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V7zM12,15.2c-0.61,0 -1.1,-0.49 -1.1,-1.1c0,-0.61 0.49,-1.1 1.1,-1.1c0.61,0 1.1,0.49 1.1,1.1C13.1,14.71 12.61,15.2 12,15.2z"/>
</vector>
diff --git a/core/res/res/drawable/ic_refresh.xml b/core/res/res/drawable/ic_refresh.xml
index 1297407..5894f95 100644
--- a/core/res/res/drawable/ic_refresh.xml
+++ b/core/res/res/drawable/ic_refresh.xml
@@ -20,5 +20,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
- android:pathData="M17.65,6.35C16.2,4.9 14.21,4.0 12.0,4.0c-4.42,0.0 -7.99,3.58 -7.99,8.0s3.57,8.0 7.99,8.0c3.73,0.0 6.84,-2.55 7.73,-6.0l-2.08,0.0c-0.82,2.33 -3.04,4.0 -5.65,4.0 -3.31,0.0 -6.0,-2.69 -6.0,-6.0s2.69,-6.0 6.0,-6.0c1.66,0.0 3.1,0.69 4.22,1.78L13.0,11.0l7.0,0.0L20.0,4.0l-2.35,2.35z"/>
+ android:pathData="M17.65,6.35c-1.63,-1.63 -3.94,-2.57 -6.48,-2.31c-3.67,0.37 -6.69,3.35 -7.1,7.02C3.52,15.91 7.27,20 12,20c3.19,0 5.93,-1.87 7.21,-4.57c0.31,-0.66 -0.16,-1.43 -0.89,-1.43h-0.01c-0.37,0 -0.72,0.2 -0.88,0.53c-1.13,2.43 -3.84,3.97 -6.81,3.32c-2.22,-0.49 -4.01,-2.3 -4.49,-4.52C5.31,9.44 8.26,6 12,6c1.66,0 3.14,0.69 4.22,1.78l-2.37,2.37C13.54,10.46 13.76,11 14.21,11H19c0.55,0 1,-0.45 1,-1V5.21c0,-0.45 -0.54,-0.67 -0.85,-0.35L17.65,6.35z"/>
</vector>
diff --git a/core/res/res/layout/autofill_save.xml b/core/res/res/layout/autofill_save.xml
index 50ff50f..63675ab 100644
--- a/core/res/res/layout/autofill_save.xml
+++ b/core/res/res/layout/autofill_save.xml
@@ -44,8 +44,14 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/autofill_save_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
<TextView
android:id="@+id/autofill_save_title"
+ android:paddingLeft="8dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/autofill_save_title"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index a6dcc19..28e1fe1 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Instellings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Help"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Stembystand"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Sluit nou"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nuwe kennisgewing"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuele sleutelbord"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Verkeerde patroon"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Verkeerde wagwoord"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Verkeerde PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Probeer weer oor <xliff:g id="NUMBER">%1$d</xliff:g> sekondes."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Probeer oor <xliff:g id="NUMBER">%d</xliff:g> sekondes weer.</item>
+ <item quantity="one">Probeer oor 1 sekonde weer.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Teken jou patroon"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Voer SIM-PIN in"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Voer PIN in"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 56191b5..dc5222e 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"ቅንብሮች"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ደግፍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"የድምጽ እርዳታ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"አሁን ቆልፍ"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"አዲስ ማሳወቂያ"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ምናባዊ የቁልፍ ሰሌዳ"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"የተሳሳተ ስርዓተ ጥለት"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"የተሳሳተ ይለፍ ቃል"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"የተሳሳተ ፒን"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"በ<xliff:g id="NUMBER">%1$d</xliff:g> ሰከንዶች ውስጥ እንደገና ይሞክሩ።"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
+ <item quantity="other">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ስርዓተ ጥለትዎን ይሳሉ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"የሲም ፒን ያስገቡ"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"ፒን ያስገቡ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 0d63fbe..7c5822a 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -242,7 +242,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"الإعدادات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"مساعدة"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"المساعد الصوتي"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"قفل الآن"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"إشعار جديد"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"لوحة المفاتيح الافتراضية"</string>
@@ -1261,7 +1262,7 @@
<string name="carrier_app_notification_text" msgid="1132487343346050225">"انقر لإعداده."</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"تعيين الوقت"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"تعيين التاريخ"</string>
- <string name="date_time_set" msgid="5777075614321087758">"تعيين"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"ضبط"</string>
<string name="date_time_done" msgid="2507683751759308828">"تم"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"جديد: "</font></string>
<string name="perms_description_app" msgid="5139836143293299417">"يقدمه <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
@@ -1481,7 +1482,7 @@
<string name="data_usage_limit_body" msgid="291731708279614081">"توقفت البيانات مؤقتًا لاستكمال الدورة"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"تم تجاوز حد بيانات شبكات 2G-3G"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"تم تجاوز حد بيانات 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"تم تجاوز حد بيانات الجوال"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"تم تجاوز حد بيانات الجوّال"</string>
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"تم تجاوز حد بيانات شبكة Wi-Fi"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> فوق الحد المعين."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"تم تقييد بيانات الخلفية"</string>
@@ -1538,7 +1539,14 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"نقش خاطئ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"كلمة مرور خاطئة"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"رقم تعريف شخصي خاطئ"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"حاول مرة أخرى خلال <xliff:g id="NUMBER">%1$d</xliff:g> ثانية."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="zero">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
+ <item quantity="two">حاول مرة أخرى خلال ثانيتين (<xliff:g id="NUMBER">%d</xliff:g>).</item>
+ <item quantity="few">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثوانٍ.</item>
+ <item quantity="many">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
+ <item quantity="other">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
+ <item quantity="one">حاول مرة أخرى خلال ثانية واحدة.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ارسم نقشك"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"أدخل رمز PIN لبطاقة SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"أدخل رمز PIN"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index a14bf5a..c907446 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yardım"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Səs Yardımçısı"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"İndi kilidləyin"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Yeni bildiriş"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual klaviatura"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN səhvdir"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniyə ərzində yenidən cəhd edin.</item>
+ <item quantity="one">1 saniyə ərzində yenidən cəhd edin.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Şablonunuzu çəkin"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN kodu daxil edin"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PİN kodu daxil edin"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index c9b2096..38b7b90 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -133,7 +133,7 @@
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Samo Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije prosleđeno"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
- <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> nakon <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunde(i)"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> nakon <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunde/i"</string>
<string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije prosleđeno"</string>
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije prosleđeno"</string>
<string name="fcComplete" msgid="3118848230966886575">"Kôd funkcije je izvršen."</string>
@@ -233,7 +233,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Podešavanja"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Zaključaj odmah"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Novo obaveštenje"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelna tastatura"</string>
@@ -739,19 +740,19 @@
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Pogledajte Korisnički vodič ili kontaktirajte Korisničku podršku."</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM kartica je zaključana."</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Otključavanje SIM kartice…"</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste nepravilno nacrtali šablon za otključavanje. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string>
- <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli lozinku. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli PIN. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste nepravilno nacrtali šablon za otključavanje. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde/i."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli lozinku. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde/i."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli PIN. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde/i."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde/i."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"Neispravno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja od vas će biti zatraženo da otključate TV pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde/i."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Nepravilno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Nakon još neuspešnih pokušaja (<xliff:g id="NUMBER_1">%2$d</xliff:g>) tablet će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja TV će biti resetovan na podrazumevana fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Neispravno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Nakon još neuspešnih pokušaja (<xliff:g id="NUMBER_1">%2$d</xliff:g>) telefon će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Neispravno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Tablet će sada biti vraćen na podrazumevana fabrička podešavanja."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER">%d</xliff:g> puta. TV će sada biti resetovan na podrazumevana fabrička podešavanja."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Neispravno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Telefon će sada biti vraćen na podrazumevana fabrička podešavanja."</string>
- <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde(i)."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde/i."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zaboravili ste šablon?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Otključavanje naloga"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Previše pokušaja unosa šablona"</string>
@@ -883,7 +884,7 @@
<string name="second" msgid="3184235808021478">"sek"</string>
<string name="seconds" msgid="3161515347216589235">"sek"</string>
<string name="week" msgid="5617961537173061583">"nedelja"</string>
- <string name="weeks" msgid="6509623834583944518">"nedelje(a)"</string>
+ <string name="weeks" msgid="6509623834583944518">"nedelje/a"</string>
<string name="year" msgid="4001118221013892076">"godina"</string>
<string name="years" msgid="6881577717993213522">"godine(a)"</string>
<string name="now_string_shortest" msgid="8912796667087856402">"sada"</string>
@@ -1469,7 +1470,11 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan šablon"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Pogrešan PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Probajte ponovo za <xliff:g id="NUMBER">%1$d</xliff:g> sekunde(i)."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
+ <item quantity="few">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Nacrtajte šablon"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Unesite PIN SIM kartice"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Unesite PIN"</string>
@@ -1491,18 +1496,18 @@
<string name="kg_login_invalid_input" msgid="5754664119319872197">"Nevažeće korisničko ime ili lozinka."</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Zaboravili ste korisničko ime ili lozinku?\nPosetite adresu "<b>"google.com/accounts/recovery"</b>"."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"Provera naloga…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Uneli ste netačni PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string>
- <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Uneli ste netač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> sekunde(i)."</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Uneli ste netačni PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde/i."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Uneli ste netač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> sekunde/i."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde/i."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Pokušali ste da otključate tablet netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja tablet će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja TV će biti resetovan na podrazumevana fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Pokušali ste da otključate telefon netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja telefon će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Pokušali ste da otključate tablet netačno <xliff:g id="NUMBER">%d</xliff:g> puta. Tablet će sada biti vraćen na podrazumevana fabrička podešavanja."</string>
<string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER">%d</xliff:g> puta. TV će sada biti resetovan na podrazumevana fabrička podešavanja."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Pokušali ste da otključate telefon netačno <xliff:g id="NUMBER">%d</xliff:g> puta. Telefon će sada biti vraćen na podrazumevana fabrička podešavanja."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nProbajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nProbajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde/i."</string>
<string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Neispravno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate TV pomoću naloga e-pošte.\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="1437638152015574839">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nProbajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nProbajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde/i."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ukloni"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Želite da pojačate zvuk iznad preporučenog nivoa?\n\nSlušanje glasne muzike duže vreme može da vam ošteti sluh."</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 78e0cec..4db9d4d 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Налады"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Дапамога"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Галас. дапамога"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Заблакір. зараз"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Новае апавяшчэнне"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Віртуальная клавіятура"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Няправільны ўзор"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Няправiльны пароль"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Няправільны PIN-код"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Паўтарыце спробу праз <xliff:g id="NUMBER">%1$d</xliff:g> с."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ <item quantity="many">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
+ <item quantity="other">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Намалюйце ключ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Увядзіце PIN-код SIM-карты"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Увядзіце PIN-код"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index cd7fe1a..3682904 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласова помощ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Заключване сега"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ново известие"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуална клавиатура"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Грешна фигура"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Грешна парола"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Грешен ПИН код"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Опитайте отново след <xliff:g id="NUMBER">%1$d</xliff:g> секунди."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Опитайте отново след <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ <item quantity="one">Опитайте отново след 1 секунда.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Начертайте фигурата си"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Въведете ПИН кода за SIM картата"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Въведете ПИН код"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 4b7d20f..ec15c48 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -82,12 +82,12 @@
<string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"রিসেপশন উন্নত করতে সেটিংস > নেটওয়ার্ক এবং ইন্টারনেট > মোবাইল নেটওয়ার্ক > পছন্দের নেটওয়ার্কের ধরণ এ গিয়ে নির্বাচিত নেটওয়ার্কের ধরণ পরিবর্তন করে দেখুন।"</string>
<string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"ওয়াই-ফাই কলিং সক্রিয় আছে"</string>
<string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"জরুরি কলের জন্য মোবাইল নেটওয়ার্ক থাকতে হবে।"</string>
- <string name="notification_channel_network_alert" msgid="4427736684338074967">"সতর্কবার্তা"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"সতর্কতা"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"কল ফরওয়ার্ড করা"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"জরুরি কলব্যাক মোড"</string>
<string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"মোবাইল ডেটার স্থিতি"</string>
- <string name="notification_channel_sms" msgid="3441746047346135073">"এসএমএস বার্তা"</string>
- <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভয়েসমেল বার্তা"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"এসএমএস মেসেজ"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভয়েসমেল মেসেজ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ওয়াই-ফাই কলিং"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"পির TTY মোড FULL অনুরোধ করেছে"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"পির TTY মোড HCO অনুরোধ করেছে"</string>
@@ -157,10 +157,10 @@
<string name="contentServiceSync" msgid="8353523060269335667">"সিঙ্ক"</string>
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"সিঙ্ক"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"অনেকগুলি <xliff:g id="CONTENT_TYPE">%s</xliff:g> মুছে ফেলা হয়েছে৷"</string>
- <string name="low_memory" product="tablet" msgid="6494019234102154896">"ট্যাবলেটের সঞ্চয়স্থানে আর জায়গা খালি নেই৷ স্থান খালি করতে কিছু ফাইল মুছে দিন৷"</string>
- <string name="low_memory" product="watch" msgid="4415914910770005166">"ঘড়ির সঞ্চয়স্থানে আর জায়গা খালি নেই৷ স্থান খালি করতে কিছু ফাইল মুছে দিন৷"</string>
- <string name="low_memory" product="tv" msgid="516619861191025923">"টিভির সঞ্চয়স্থান পূর্ণ হয়েছে৷ স্থান মুক্ত করতে কিছু ফাইল মুছে ফেলুন৷"</string>
- <string name="low_memory" product="default" msgid="3475999286680000541">"ফোনের সঞ্চয়স্থানে আর জায়গা খালি নেই৷ স্থান খালি করতে কিছু ফাইল মুছে দিন৷"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"ট্যাবলেটের স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
+ <string name="low_memory" product="watch" msgid="4415914910770005166">"ঘড়ির স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
+ <string name="low_memory" product="tv" msgid="516619861191025923">"টিভির স্টোরেজ পূর্ণ হয়েছে। জায়গা খালি করতে কিছু ফাইল মুছে ফেলুন৷"</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"ফোনের স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
<item quantity="one">টি শংসাপত্রের কর্তৃপক্ষকে ইনস্টল করা হয়েছে</item>
<item quantity="other">টি শংসাপত্রের কর্তৃপক্ষকে ইনস্টল করা হয়েছে</item>
@@ -212,14 +212,14 @@
<string name="global_action_emergency" msgid="7112311161137421166">"জরুরী"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"ত্রুটির প্রতিবেদন"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ত্রুটির অভিযোগ করুন"</string>
- <string name="bugreport_message" msgid="398447048750350456">"এটি একটি ই-মেল বার্তা পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; দয়া করে ধৈর্য রাখুন৷"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"এটি একটি ই-মেল মেসেজ পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; অনুগ্রহ করে ধৈর্য রাখুন৷"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ইন্টারেক্টিভ প্রতিবেদন"</string>
- <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"বেশিরভাগ পরিস্থিতিতে এটিকে ব্যবহার করুন৷ এটি আপনাকে প্রতিবেদনের কাজ কতটা হয়েছে তার উপর নজর রাখতে দেয়, সমস্যাটির সম্পর্কে আরো অনেক কিছু লিখতে দেয় এবং স্ক্রীনশটগুলি নিতে দেয়৷ এটি হয়ত প্রতিবেদন করতে খুব বেশি সময় নেয় এমনকি কম-ব্যবহৃত বিভাগগুলি সরিয়ে দিতে পারে৷"</string>
+ <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"বেশিরভাগ পরিস্থিতিতে এটিকে ব্যবহার করুন৷ এটি আপনাকে প্রতিবেদনের কাজ কতটা হয়েছে তার উপর নজর রাখতে দেয়, সমস্যাটির সম্পর্কে আরও অনেক কিছু লিখতে দেয় এবং স্ক্রীনশটগুলি নিতে দেয়৷ এটি হয়ত প্রতিবেদন করতে খুব বেশি সময় নেয় এমনকি কম-ব্যবহৃত বিভাগগুলি সরিয়ে দিতে পারে৷"</string>
<string name="bugreport_option_full_title" msgid="6354382025840076439">"সম্পূর্ণ প্রতিবেদন"</string>
- <string name="bugreport_option_full_summary" msgid="7210859858969115745">"যখন আপনার ডিভাইসটি প্রতিক্রিয়াবিহীন থাকে বা খুবই ধীর চলে বা যখন আপনার সমস্ত প্রতিবেদন বিভাগগুলির প্রয়োজন হয় তখন ন্যূনতম সিস্টেম হস্তক্ষেপের জন্য এই বিকল্পটি ব্যবহার করুন৷ আপনাকে আরো বিশদ বিবরণ প্রবেশ করানোর বা অতিরিক্ত স্ক্রীনশর্ট নেওয়ার মঞ্জুরি দেয় না৷"</string>
+ <string name="bugreport_option_full_summary" msgid="7210859858969115745">"যখন আপনার ডিভাইসটি প্রতিক্রিয়াবিহীন থাকে বা খুবই ধীর চলে বা যখন আপনার সমস্ত প্রতিবেদন বিভাগগুলির প্রয়োজন হয় তখন ন্যূনতম সিস্টেম হস্তক্ষেপের জন্য এই বিকল্পটি ব্যবহার করুন৷ আপনাকে আরও বিশদ বিবরণ প্রবেশ করানোর বা অতিরিক্ত স্ক্রীনশর্ট নেওয়ার মঞ্জুরি দেয় না৷"</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
- <item quantity="one"><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_1">%d</xliff:g> সেকেন্ডের মধ্যে ত্রুটির প্রতিবেদনের জন্য স্ক্রিনশট নেওয়া হচ্ছে৷</item>
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে ত্রুটির প্রতিবেদনের জন্য স্ক্রিনশট নেওয়া হচ্ছে৷</item>
</plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"নীরব মোড"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"শব্দ বন্ধ করা আছে"</string>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"সেটিংস"</string>
<string name="global_action_assist" msgid="3892832961594295030">"সহযোগিতা"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ভয়েস সহায়তা"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"এখনই লক করুন"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"৯৯৯+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"নতুন বিজ্ঞপ্তি"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ভার্চুয়াল কীবোর্ড"</string>
@@ -238,14 +239,14 @@
<string name="notification_channel_security" msgid="7345516133431326347">"নিরাপত্তা"</string>
<string name="notification_channel_car_mode" msgid="3553380307619874564">"গাড়ি মোড"</string>
<string name="notification_channel_account" msgid="7577959168463122027">"অ্যাকাউন্টের স্থিতি"</string>
- <string name="notification_channel_developer" msgid="7579606426860206060">"বিকাশকারী সম্পর্কিত বার্তা"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ডেভেলপার সম্পর্কিত মেসেজ"</string>
<string name="notification_channel_updates" msgid="4794517569035110397">"আপডেটগুলি"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"নেটওয়ার্কের স্থিতি"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"নেটওয়ার্ক সক্রান্ত অ্যালার্ট"</string>
<string name="notification_channel_network_available" msgid="4531717914138179517">"নেটওয়ার্ক পাওয়া যাচ্ছে"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN এর স্থিতি"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"ডিভাইস প্রশাসন"</string>
- <string name="notification_channel_alerts" msgid="4496839309318519037">"সতর্কতাগুলি"</string>
+ <string name="notification_channel_alerts" msgid="4496839309318519037">"সতর্কতা"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"খুচরা বিক্রয়ের ডেমো"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB সংযোগ"</string>
<string name="notification_channel_foreground_service" msgid="3931987440602669158">"কিছু অ্যাপ ব্যাটারি ব্যবহার করছে"</string>
@@ -269,7 +270,7 @@
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"এসএমএসগুলি পাঠাতে এবং দেখতে"</string>
<string name="permgrouprequest_sms" msgid="605618939583628306">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> কে এসএমএস মেসেজ দেখতে ও পাঠাতে দিন"</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"সঞ্চয়স্থান"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"স্টোরেজ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"আপনার ডিভাইসে ফটো, মিডিয়া এবং ফাইলগুলিতে অ্যাক্সেস"</string>
<string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> কে আপনার ডিভাইসের ফটো, মিডিয়া এবং ফাইল অ্যাক্সেস করতে দিন"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"মাইক্রোফোন"</string>
@@ -284,7 +285,7 @@
<string name="permgrouplab_sensors" msgid="416037179223226722">"বডি সেন্সরগুলি"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপনার অত্যাবশ্যক লক্ষণগুলির সম্পর্কে সেন্সর ডেটা অ্যাক্সেস করে"</string>
<string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> কে সেন্সর থেকে আপনার জৈবনিক লক্ষণের ডেটা অ্যাক্সেস করতে দিন"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"উইন্ডোর সামগ্রী পুনরুদ্ধার করে"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"উইন্ডোর কন্টেন্ট পুনরুদ্ধার করে"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপনি ইন্টারঅ্যাক্ট করছেন এমন একটি উইন্ডোর সামগ্রীকে সযত্নে নিরীক্ষণ করে৷"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"যে আইটেমগুলিতে আলতো চেপেছেন সেগুলি সশব্দে বলবে এবং ইঙ্গিতগুলি ব্যবহার করে স্ক্রীন অন্বেষণ করা যাবে৷"</string>
@@ -313,19 +314,19 @@
<string name="permlab_receiveSms" msgid="8673471768947895082">"টেক্সট মেসেজ পান (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"অ্যাপ্লিকেশানটিকে এসএমএস প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"টেক্সট মেসেজ পান (MMS)"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"অ্যাপ্লিকেশানটিকে MMS বার্তা প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
- <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"সেল সম্প্রচার বার্তা পড়ুন"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"অ্যাপ্লিকেশানটিকে MMS মেসেজ প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো মেসেজগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"সেল সম্প্রচার মেসেজ পড়ুন"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"আপনার ডিভাইস দ্বারা প্রাপ্ত সেল সম্প্রচার পড়তে অ্যাপ্লিকেশানটিকে অনুমতি দেয়৷ কয়েকটি স্থানে আপনাকে জরুরি অবস্থার জন্য সতর্ক করতে জরুরি সতর্কতাগুলি বিতরণ করা হয়৷ যখন একটি জরুরি সেল সম্প্রচার প্রাপ্ত হয় তখন ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার ডিভাইসের কার্য সম্পাদনা বা কার্যকলাপে প্রতিবন্ধকতার সৃষ্টি করতে পারে৷"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"গ্রাহক হিসেবে নেওয়া ফিডগুলি পড়ে"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"অ্যাপ্লিকেশানকে বর্তমানে সিঙ্ক করা ফিডগুলির সম্পর্কে বিবরণ পেতে দেয়৷"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS পাঠানো ও দেখা,আপনি কি পরিচিতি কে এগুলি করার অনুমতি দেবেন?"</string>
- <string name="permdesc_sendSms" msgid="7094729298204937667">"অ্যাপ্লিকেশানটিকে এসএমএসগুলি পাঠাতে অনুমতি দেয়৷ এর জন্য অপ্রত্যাশিত চার্জ কাটা হতে পারে৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার নিশ্চিতকরণ ছাড়া বার্তা পাঠানোর মাধ্যমে আপনাকে অর্থ চার্জ করতে পারে৷"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"অ্যাপ্লিকেশানটিকে এসএমএসগুলি পাঠাতে অনুমতি দেয়৷ এর জন্য অপ্রত্যাশিত চার্জ কাটা হতে পারে৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার নিশ্চিতকরণ ছাড়া মেসেজ পাঠানোর মাধ্যমে আপনাকে অর্থ চার্জ করতে পারে৷"</string>
<string name="permlab_readSms" msgid="8745086572213270480">"আপনার টেক্সট মেসেজ পড়ুন (SMS বা MMS)"</string>
<string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"এই অ্যাপটি আপনার ট্যাবলেটে স্টোর করা সমস্ত SMS (টেক্সট) মেসেজ পড়তে পারে৷"</string>
<string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"এই অ্যাপটি আপনার টিভিতে স্টোর করা সমস্ত SMS (টেক্সট) মেসেজ পড়তে পারে৷"</string>
<string name="permdesc_readSms" product="default" msgid="6826832415656437652">"এই অ্যাপটি আপনার ফোনে স্টোর করা সমস্ত SMS (টেক্সট) মেসেজ পড়তে পারে৷"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"টেক্সট মেসেজ পান (WAP)"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"অ্যাপ্লিকেশানটিকে WAP বার্তা প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"অ্যাপ্লিকেশানটিকে WAP মেসেজ প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো মেসেজগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"চলমান অ্যাপ্লিকেশান উদ্ধার করে"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"বর্তমানে ও সাম্প্রতিককালের সক্রিয় ক্রিয়াগুলি সম্বন্ধে তথ্য পুনরুদ্ধার করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এছাড়া এটি ডিভাইসটিতে কোন অ্যাপ্লিকেশানগুলি ব্যবহৃত হচ্ছে তার বিষয়ে তথ্য খুঁজে বের করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করতে পারে৷"</string>
<string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"প্রোফাইল এবং ডিভাইস মালিকদের পরিচালনা করুন"</string>
@@ -351,21 +352,21 @@
<string name="permlab_writeSettings" msgid="2226195290955224730">"সিস্টেম সেটিংস পরিবর্তন করুন"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"অ্যাপ্লিকেশানকে সিস্টেমের সেটিংস ডেটা সংশোধন করতে দেয়৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার সিস্টেমের কনফিগারেশন নষ্ট করতে পারে৷"</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"প্রারম্ভেই চালান"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"অ্যাপ্লিকেশানকে সিস্টেম বুট হওযার পরে নিজেথেকে শুরু হওয়ার অনুমতি দেয়৷ এটির ফলে আপনার ট্যাবলেট চালু হতে আরো বেশি সময় নিতে পারে এবং অ্যাপ্লিকেশানটিকে সারাক্ষণ চালু রেখে আপনার ট্যাবলেটের সমগ্রিক গতীশীলতাকে ধীর করে৷"</string>
- <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"অ্যাপ্লিকেশানকে সিস্টেম বুট হওযার পরে নিজেথেকে শুরু হওয়ার অনুমতি দেয়৷ এটির ফলে আপনার ফোন চালু হতে আরো বেশি সময় নিতে পারে এবং অ্যাপ্লিকেশানটিকে সারাক্ষণ চালু রেখে আপনার টিভির সামগ্রিক গতীশীলতাকে ধীর করে৷"</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"অ্যাপ্লিকেশানকে সিস্টেম বুট হওযার পরে নিজেথেকে শুরু হওয়ার অনুমতি দেয়৷ এটির ফলে আপনার ফোন চালু হতে আরো বেশি সময় নিতে পারে এবং অ্যাপ্লিকেশানটিকে সারাক্ষণ চালু রেখে আপনার ফোনের সমগ্রিক গতীশীলতাকে ধীর করে৷"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"অ্যাপ্লিকেশানকে সিস্টেম বুট হওযার পরে নিজেথেকে শুরু হওয়ার অনুমতি দেয়৷ এটির ফলে আপনার ট্যাবলেট চালু হতে আরও বেশি সময় নিতে পারে এবং অ্যাপ্লিকেশানটিকে সারাক্ষণ চালু রেখে আপনার ট্যাবলেটের সমগ্রিক গতীশীলতাকে ধীর করে৷"</string>
+ <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"অ্যাপ্লিকেশানকে সিস্টেম বুট হওযার পরে নিজেথেকে শুরু হওয়ার অনুমতি দেয়৷ এটির ফলে আপনার ফোন চালু হতে আরও বেশি সময় নিতে পারে এবং অ্যাপ্লিকেশানটিকে সারাক্ষণ চালু রেখে আপনার টিভির সামগ্রিক গতীশীলতাকে ধীর করে৷"</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"অ্যাপ্লিকেশানকে সিস্টেম বুট হওযার পরে নিজেথেকে শুরু হওয়ার অনুমতি দেয়৷ এটির ফলে আপনার ফোন চালু হতে আরও বেশি সময় নিতে পারে এবং অ্যাপ্লিকেশানটিকে সারাক্ষণ চালু রেখে আপনার ফোনের সমগ্রিক গতীশীলতাকে ধীর করে৷"</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"স্টিকি সম্প্রচার পাঠায়"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"স্টিকি সম্প্রচারগুলি পাঠাতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে, যা সম্প্রচার শেষ হয়ে যাওয়ার পরও উপলব্ধ থাকে৷ খুব বেশি পরিমাণে ব্যবহার করার ফলে ট্যাবলেটটিকে ধীরগতির করে দিতে পারে অথবা খুব বেশি পরিমাণ মেমরি ব্যবহারের ফলে এটি যথাযথভাবে কাজ নাও করতে পারে৷"</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"অ্যাপ্লিকেশানটিকে স্টিকি সম্প্রচারগুলি পাঠানোর অনুমতি দেয়, যা সম্প্রচার শেষ হওয়ার পরেও থাকে৷ অত্যধিক ব্যবহার টিভিকে ধীর বা ভারসাম্যহীন করে দিতে পারে খুব বেশি মেমোরি ব্যবহারের ফলেই এটি হয়ে থাকে৷"</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"স্টিকি সম্প্রচারগুলি পাঠাতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে, যা সম্প্রচার শেষ হয়ে যাওয়ার পরও উপলব্ধ থাকে৷ খুব বেশি পরিমাণে ব্যবহার করার ফলে ফোনটিকে ধীরগতির করে দিতে পারে অথবা খুব বেশি পরিমাণ মেমরি ব্যবহারের ফলে এটি যথাযথভাবে কাজ নাও করতে পারে৷"</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"আপনার পরিচিতিগুলি পড়ুন"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"অ্যাপ্লিকেশানটিকে আপনি নির্দিষ্ট একজন স্বতন্ত্র ব্যক্তির সঙ্গে ফ্রিকোয়েন্সি দিয়ে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ট্যাবলেটে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পড়তে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশানগুলিকে আপনার পরিচিতি ডেটা সংরক্ষণ করতে দেয় এবং ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনাকে না জানিয়ে পরিচিতি ডেটা শেয়ার করতে পারে৷"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"অ্যাপ্লিকেশনটিকে আপনি নির্দিষ্ট একজন স্বতন্ত্র ব্যক্তির সঙ্গে ফ্রিকোয়েন্সি দিয়ে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ট্যাবলেটে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পড়তে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশনগুলিকে আপনার পরিচিতি ডেটা সংরক্ষণ করতে দেয় এবং ক্ষতিকারক অ্যাপ্লিকেশনগুলি আপনাকে না জানিয়ে পরিচিতি ডেটা ভাগ করতে পারে৷"</string>
<string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"অ্যাপ্লিকেশানটিকে কোনো বিশেষ ব্যক্তির সাথে আপনি কত ঘন ঘন কল, ইমেল বা অন্যভাবে যোগাযোগ করেন সেইরূপ তথ্য সমেত আপনার টিভিতে সংরক্ষিত পরিচিতিগুলির সম্পর্কে ডেটা পড়ার অনুমতি দেয়৷ এই অনুমতিটি অ্যাপ্লিকেশানগুলিকে আপনার পরিচিতি ডেটা সংরক্ষণ করার অনুমতি দেয়, এবং ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার অজান্তে পরিচিতি ডেটা শেয়ার করতে পারে৷"</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"অ্যাপ্লিকেশানটিকে আপনি নির্দিষ্ট একজন স্বতন্ত্র ব্যক্তির সঙ্গে ফ্রিকোয়েন্সি দিয়ে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ফোনে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পড়তে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশানগুলিকে আপনার পরিচিতি ডেটা সংরক্ষণ করতে দেয় এবং ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনাকে না জানিয়ে পরিচিতি ডেটা শেয়ার করতে পারে৷"</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"অ্যাপ্লিকেশনটিকে আপনি নির্দিষ্ট একজন স্বতন্ত্র ব্যক্তির সঙ্গে ফ্রিকোয়েন্সি দিয়ে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ফোনে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পড়তে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশনগুলিকে আপনার পরিচিতি ডেটা সংরক্ষণ করতে দেয় এবং ক্ষতিকারক অ্যাপ্লিকেশনগুলি আপনাকে না জানিয়ে পরিচিতি ডেটা ভাগ করতে পারে৷"</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"আপনার পরিচিতিগুলি সংশোধন করুন"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"অ্যাপ্লিকেশানটিকে আপনি নির্দিষ্ট একজন পরিচিতির সঙ্গে যে ফ্রিকোয়েন্সিতে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ট্যাবলেটে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পরিবর্তন করতে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশানগুলিকে আপনার পরিচিতি ডেটা মুছতে দেয়৷"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"অ্যাপ্লিকেশনটিকে আপনি নির্দিষ্ট একজন পরিচিতির সঙ্গে যে ফ্রিকোয়েন্সিতে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ট্যাবলেটে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পরিবর্তন করতে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশনগুলিকে আপনার পরিচিতি ডেটা মুছতে দেয়৷"</string>
<string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"অ্যাপ্লিকেশানটিকে কোনো বিশেষ পরিচিতির সাথে আপনি কত ঘন ঘন কল, ইমেল বা অন্যভাবে যোগাযোগ করেন সেইরূপ তথ্য সমেত আপনার টিভিতে সংরক্ষিত পরিচিতিগুলির সম্পর্কে ডেটা পড়ার অনুমতি দেয়৷ এই অনুমতিটি অ্যাপ্লিকেশানগুলিকে পরিচিতির ডেটা মোছার অনুমতি দেয়৷"</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"অ্যাপ্লিকেশানটিকে আপনি নির্দিষ্ট একজন পরিচিতির সঙ্গে যে ফ্রিকোয়েন্সিতে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ফোনে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পরিবর্তন করতে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশানগুলিকে আপনার পরিচিতি ডেটা মুছতে দেয়৷"</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"অ্যাপ্লিকেশনটিকে আপনি নির্দিষ্ট একজন পরিচিতির সঙ্গে যে ফ্রিকোয়েন্সিতে কল, ইমেল বা যোগাযোগ করেছেন তা সহ আপনার ফোনে সঞ্চিত পরিচিতিগুলি সম্পর্কে ডেটা পরিবর্তন করতে অনুমতি দেয়৷ এই অনুমতি অ্যাপ্লিকেশনগুলিকে আপনার পরিচিতি ডেটা মুছতে দেয়৷"</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"কল লগ পড়ুন"</string>
<string name="permdesc_readCallLog" msgid="3204122446463552146">"এই অ্যাপটি আপনার কলের ইতিহাস পড়তে পারে৷"</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"কল লগ লিখুন"</string>
@@ -379,26 +380,26 @@
<string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"এই অ্যাপটি আপনার টিভিতে সংরক্ষিত সমস্ত ক্যালেন্ডার ইভেন্ট পড়তে এবং আপনার ক্যালেন্ডারের ডেটা শেয়ার বা সংরক্ষণ করতে পারে৷"</string>
<string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"এই অ্যাপটি আপনার ফোনে সংরক্ষিত সমস্ত ক্যালেন্ডার ইভেন্ট পড়তে এবং আপনার ক্যালেন্ডারের ডেটা শেয়ার বা সংরক্ষণ করতে পারে৷"</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"ক্যালেন্ডারে ইভেন্ট যোগ বা পরিবর্তন করে এবং মালিকদের অজ্ঞাতেই অতিথিদের ইমেল পাঠায়"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"এই অ্যাপটি আপনার ট্যাবলেটে ক্যালেন্ডার ইভেন্টগুলি যোগ করতে, সরাতে বা পরিবর্তিত করতে পারে৷ এই অ্যাপটি বার্তা পাঠাতে পারে যা ক্যালেন্ডারের মাললিকের থেকে এসেছে বলে মনে হয় বা ইভেন্টগুলিকে তাদের মালিকদের না জানিয়েই পরিবর্তিত করতে পারে৷"</string>
- <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"এই অ্যাপটি আপনার টিভিতে ক্যালেন্ডার ইভেন্টগুলি যোগ করতে, সরাতে বা পরিবর্তিত করতে পারে৷ এই অ্যাপটি বার্তা পাঠাতে পারে যা ক্যালেন্ডারের মাললিকের থেকে এসেছে বলে মনে হয় বা ইভেন্টগুলিকে তাদের মালিকদের না জানিয়েই পরিবর্তিত করতে পারে৷"</string>
- <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"এই অ্যাপটি আপনার ফোনে ক্যালেন্ডার ইভেন্টগুলি যোগ করতে, সরাতে বা পরিবর্তিত করতে পারে৷ এই অ্যাপটি বার্তা পাঠাতে পারে যা ক্যালেন্ডারের মাললিকের থেকে এসেছে বলে মনে হয় বা ইভেন্টগুলিকে তাদের মালিকদের না জানিয়েই পরিবর্তিত করতে পারে৷"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"এই অ্যাপটি আপনার ট্যাবলেটে ক্যালেন্ডার ইভেন্টগুলি যোগ করতে, সরাতে বা পরিবর্তিত করতে পারে৷ এই অ্যাপটি মেসেজ পাঠাতে পারে যা ক্যালেন্ডারের মাললিকের থেকে এসেছে বলে মনে হয় বা ইভেন্টগুলিকে তাদের মালিকদের না জানিয়েই পরিবর্তিত করতে পারে৷"</string>
+ <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"এই অ্যাপটি আপনার টিভিতে ক্যালেন্ডার ইভেন্টগুলি যোগ করতে, সরাতে বা পরিবর্তিত করতে পারে৷ এই অ্যাপটি মেসেজ পাঠাতে পারে যা ক্যালেন্ডারের মাললিকের থেকে এসেছে বলে মনে হয় বা ইভেন্টগুলিকে তাদের মালিকদের না জানিয়েই পরিবর্তিত করতে পারে৷"</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"এই অ্যাপটি আপনার ফোনে ক্যালেন্ডার ইভেন্টগুলি যোগ করতে, সরাতে বা পরিবর্তিত করতে পারে৷ এই অ্যাপটি মেসেজ পাঠাতে পারে যা ক্যালেন্ডারের মাললিকের থেকে এসেছে বলে মনে হয় বা ইভেন্টগুলিকে তাদের মালিকদের না জানিয়েই পরিবর্তিত করতে পারে৷"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"অতিরিক্ত অবস্থান প্রদানকারী কমান্ডগুলি অ্যাক্সেস করে"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"অবস্থানের সাথে সম্পর্কিত তথ্য প্রদানকারীর অতিরিক্ত কম্যান্ডগুলিকে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এটি অ্যাপ্লিকেশানটিকে GPS অথবা অন্যান্য অবস্থান নির্ণয়ের সাথে সম্পর্কিত উৎসগুলির ক্রিয়াপ্রণালীর নিয়ন্ত্রণকে মঞ্জুর করতে পারে৷"</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"সুনির্দিষ্ট অবস্থান (GPS এবং নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক অবস্থান উৎসগুলি বা GPS এর উপর ভিত্তি করে এই অ্যাপটি আপনার অবস্থান সনাক্ত করতে পারে৷ এই অবস্থান পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷ এর জন্য অতিরিক্ত ব্যাটারি খরচ হতে পারে৷"</string>
+ <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক লোকেশন উৎসগুলি বা GPS এর উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷ এর জন্য অতিরিক্ত ব্যাটারি খরচ হতে পারে৷"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"আনুমানিক অবস্থান (নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
- <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার অবস্থান সনাক্ত করতে পারে৷ এই অবস্থান পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ট্যাবলেটে উপলব্ধ করে রাখতে হবে৷"</string>
- <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্কের উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার অবস্থান সনাক্ত করতে পারে৷ এই অবস্থান পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার টিভিতে উপলব্ধ করে রাখতে হবে৷"</string>
- <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার অবস্থান সনাক্ত করতে পারে৷ এই অবস্থান পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷"</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেইজন্য সেগুলিকে আপনার ট্যাবলেটে উপলব্ধ করে রাখতে হবে৷"</string>
+ <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্কের উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার টিভিতে উপলব্ধ করে রাখতে হবে৷"</string>
+ <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"আপনার অডিও সেটিংস পরিবর্তন করে"</string>
- <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ভলিউম এবং যেখানে স্পিকার আউটপুট সামগ্রী হিসেবে ব্যবহৃত হয় সেই সব ক্ষেত্রে গ্লোবাল অডিও সেটিংসের সংশোধন করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷"</string>
+ <string name="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">"সিম এ আদেশগুলি পাঠান"</string>
<string name="permdesc_sim_communication" msgid="5725159654279639498">"অ্যাপ্লিকেশানটিকে সিম কার্ডে কমান্ডগুলি পাঠানোর অনুমতি দেয়৷ এটি খুবই বিপজ্জনক৷"</string>
<string name="permlab_camera" msgid="3616391919559751192">"ছবি এবং ভিডিও তোলে"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"এই অ্যাপটি যে কোনো সময় ক্যামেরা ব্যবহার করে ছবি তুলতে বা ভিডিও রেকর্ড করতে পারে৷"</string>
- <string name="permlab_vibrate" msgid="7696427026057705834">"কম্পন নিয়ন্ত্রণ করুন"</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"ভাইব্রেশন নিয়ন্ত্রণ করুন"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"অ্যাপ্লিকেশানকে কম্পক নিয়ন্ত্রণ করতে দেয়৷"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"সরাসরি ফোন নম্বরগুলিতে কল করে"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"অ্যাপ্লিকেশানটিকে আপনার হস্তক্ষেপ ছাড়াই ফোন নম্বরগুলিতে কল করতে মঞ্জুর করে৷ এটি অপ্রত্যাশিত পরিমাণ খরচা বা কলের কারণ হতে পারে৷ মনে রাখবেন, এটি অ্যাপ্লিকেশানটির দ্বারা জরুরি নম্বরগুলিতে কল করাকে অনুমতি দেয় না৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার সম্মতি ছাড়াই কল করার ফলে আপনাকে অহেতুক অর্থ প্রদান করতে হতে পারে৷"</string>
@@ -515,7 +516,7 @@
<string name="permlab_bind_connection_service" msgid="3557341439297014940">"টেলিফোন পরিষেবার সাথে ইন্টারঅ্যাক্ট করুন"</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="permdesc_control_incall_experience" msgid="915159066039828124">"অ্যাপ্লিকেশনটিকে কলে-থাকা এক ব্যবহারকারী অভিজ্ঞতা সরবরাহের অনুমতি দেয়।"</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"তারিখ অনুযায়ী নেটওয়ার্কের ব্যবহার পড়ে"</string>
<string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"অ্যাপ্লিকেশানটিকে নিদিষ্ট নেটওয়ার্ক এবং অ্যাপ্লিকেশানগুলির জন্য পূর্বের নেটওয়ার্কের ব্যবহার পড়তে দেয়৷"</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"নেটওয়ার্ক নীতি পরিচালনা করে"</string>
@@ -574,7 +575,7 @@
<string name="policylab_expirePassword" msgid="5610055012328825874">"স্ক্রিন লক করার জন্য পাসওয়ার্ডের মেয়াদ শেষ হওয়ার সময় সেট করে"</string>
<string name="policydesc_expirePassword" msgid="5367525762204416046">"স্ক্রিন লক করার পাসওয়ার্ড কত ঘন ঘন পরিবর্তন করা আবশ্যক তা পরিবর্তন করুন৷"</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"সঞ্চয়স্থানের এনক্রিপশান সেট করে"</string>
- <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"এই সঞ্চিত অ্যাপ্লিকেশান ডেটা এনক্রিপ্ট করা দরকার৷"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"এই সঞ্চিত অ্যাপ্লিকেশন ডেটা এনক্রিপ্ট করা দরকার৷"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"ক্যামেরাগুলি অক্ষম করে"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"সমস্ত ডিভাইসের ক্যামেরার ব্যবহার আটকায়৷"</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"কিছু স্ক্রিন লক বৈশিষ্ট্য অক্ষম করুন"</string>
@@ -742,9 +743,9 @@
<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="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>
+ <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>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"আপনি <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করে ট্যাবলেটটি আনলক করার চেষ্টা করেছেন৷ ট্যাবলেটটি এখন ফ্যাক্টরী ডিফল্টে রিসেট হবে৷"</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"আপনি <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করে টিভি আনলক করার চেষ্টা করেছেন৷ টিভি এখন ফ্যাক্টরি ডিফল্টে পুনঃসেট হবে৷"</string>
<string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"আপনি <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করে ফোনটি আনলক করার চেষ্টা করেছেন৷ ফোনটি এখন ফ্যাক্টরী ডিফল্টে রিসেট হবে৷"</string>
@@ -756,8 +757,8 @@
<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>
- <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"অবৈধ ব্যবহারকারী নাম অথবা পাসওয়ার্ড৷"</string>
- <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"আপনার ব্যবহারকারী নাম অথবা পাসওয়ার্ড ভুলে গেছেন?\n"<b>"google.com/accounts/recovery"</b>" এ যান৷"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"অবৈধ ইউজারনেম অথবা পাসওয়ার্ড৷"</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"আপনার ইউজারনেম অথবা পাসওয়ার্ড ভুলে গেছেন?\n"<b>"google.com/accounts/recovery"</b>" এ যান৷"</string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"পরীক্ষা করা হচ্ছে..."</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"আনলক করুন"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"শব্দ চালু আছে"</string>
@@ -829,13 +830,13 @@
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"আপনার ওয়েব বুকমার্কগুলি এবং ইতিহাস পড়ুন"</string>
<string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"অ্যাপ্লিকেশানটিকে ব্রাউজার দ্বারা ঘুরে দেখা সমস্ত URL এর ইতিহাস এবং ব্রাউজারের বুকমার্কগুলি পড়ার অনুমতি দেয়৷ দ্রষ্টব্য: এই অনুমতিটি তৃতীয় পক্ষের ব্রাউজার বা ওয়েব ব্রাউজিং ক্ষমতা সহ অন্যান্য অ্যাপ্লিকেশানগুলিতে জারি করা সম্ভব নাও হতে পারে৷"</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"ওয়েব বুকমার্কগুলি এবং ইতিহাস লিখুন"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"অ্যাপ্লিকেশানটিকে আপনার ট্যাবলেটে সঞ্চিত ব্রাউজারের ইতিহাস বা বুকমার্কগুলি পরিবর্তন করতে দেয়৷ এটি অ্যাপ্লিকেশানটিকে ব্রাউজার ডেটা মুছে দিতে বা পরিবর্তন করতে দেয়৷ দ্রষ্টব্য: এই অনুমতি তৃতীয় পক্ষের ব্রাউজারগুলির বা ওয়েব ব্রাউজিং ক্ষমতা সম্পন্ন অন্যান্য অ্যাপ্লিকেশানগুলি দ্বারা বলবৎ নাও হতে পারে৷"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"অ্যাপ্লিকেশনটিকে আপনার ট্যাবলেটে সঞ্চিত ব্রাউজারের ইতিহাস বা বুকমার্কগুলি পরিবর্তন করতে দেয়৷ এটি অ্যাপ্লিকেশনটিকে ব্রাউজার ডেটা মুছে দিতে বা পরিবর্তন করতে দেয়৷ দ্রষ্টব্য: এই অনুমতি তৃতীয় পক্ষের ব্রাউজারগুলির বা ওয়েব ব্রাউজিং ক্ষমতা সম্পন্ন অন্যান্য অ্যাপ্লিকেশনগুলি দ্বারা বলবৎ নাও হতে পারে৷"</string>
<string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"অ্যাপ্লিকেশানকে আপনার টিভিতে সংরক্ষিত ব্রাউজারের ইতিহাস বা বুকমার্কগুলি সংশোধন করার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে ব্রাউজারের ডেটা মোছার বা সংশোধন করার অনুমতি দেয়৷ দ্রষ্টব্য: তৃতীয়-পক্ষের ব্রাউজার বা অন্য ওয়েব ব্রাউজিং করার সক্ষমতা রয়েছে এমন অন্য অ্যাপ্লিকেশানগুলির অনুসারে প্রয়োগ হতে পারে৷"</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"অ্যাপ্লিকেশানটিকে আপনার ফোনে সঞ্চিত ব্রাউজারের ইতিহাস বা বুকমার্কগুলি পরিবর্তন করতে দেয়৷ এটি অ্যাপ্লিকেশানটিকে ব্রাউজার ডেটা মুছে দিতে বা পরিবর্তন করতে দেয়৷ দ্রষ্টব্য: এই অনুমতি তৃতীয় পক্ষের ব্রাউজারগুলির বা ওয়েব ব্রাউজিং ক্ষমতা সম্পন্ন অন্যান্য অ্যাপ্লিকেশানগুলি দ্বারা বলবৎ নাও হতে পারে৷"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"অ্যাপ্লিকেশনটিকে আপনার ফোনে সঞ্চিত ব্রাউজারের ইতিহাস বা বুকমার্কগুলি পরিবর্তন করতে দেয়৷ এটি অ্যাপ্লিকেশনটিকে ব্রাউজার ডেটা মুছে দিতে বা পরিবর্তন করতে দেয়৷ দ্রষ্টব্য: এই অনুমতি তৃতীয় পক্ষের ব্রাউজারগুলির বা ওয়েব ব্রাউজিং ক্ষমতা সম্পন্ন অন্যান্য অ্যাপ্লিকেশনগুলি দ্বারা বলবৎ নাও হতে পারে৷"</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"একটি অ্যালার্ম সেট করুন"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"অ্যাপ্লিকেশানকে একটি ইনস্টল থাকা অ্যালার্ম অ্যাপ্লিকেশানে একটি অ্যালার্ম সেট করতে দেয়৷ কিছু অ্যালার্ম ঘড়ি অ্যাপ্লিকেশানগুলিতে ভবিষ্যতে এটি লাগু নাও হতে পারে৷"</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"ভয়েসমেল যোগ করে"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"অ্যাপ্লিকেশানকে আপনার ভয়েসমেইল ইনবক্সে বার্তা যোগ করার অনুমতি দেয়৷"</string>
+ <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>
@@ -844,14 +845,14 @@
<string name="save_password_never" msgid="8274330296785855105">"কখনই নয়"</string>
<string name="open_permission_deny" msgid="7374036708316629800">"এই পৃষ্ঠাটি খোলার জন্য আপনার কাছে অনুমতি নেই৷"</string>
<string name="text_copied" msgid="4985729524670131385">"ক্লিপবোর্ডে পাঠ্য অনুলিপি করা হয়েছে৷"</string>
- <string name="more_item_label" msgid="4650918923083320495">"আরো"</string>
+ <string name="more_item_label" msgid="4650918923083320495">"আরও"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"মেনু+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"স্পেস"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"মুছুন"</string>
- <string name="search_go" msgid="8298016669822141719">"অনুসন্ধান করুন"</string>
+ <string name="search_go" msgid="8298016669822141719">"খুঁজুন"</string>
<string name="search_hint" msgid="1733947260773056054">"অনুসন্ধান..."</string>
- <string name="searchview_description_search" msgid="6749826639098512120">"অনুসন্ধান করুন"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"খুঁজুন"</string>
<string name="searchview_description_query" msgid="5911778593125355124">"অনুসন্ধান ক্যোয়ারী"</string>
<string name="searchview_description_clear" msgid="1330281990951833033">"ক্যোয়ারী সাফ করুন"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"ক্যোয়ারী জমা দিন"</string>
@@ -958,16 +959,16 @@
<string name="Midnight" msgid="5630806906897892201">"মধ্যরাত্রি"</string>
<string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
- <string name="selectAll" msgid="6876518925844129331">"সবগুলি নির্বাচন করুন"</string>
+ <string name="selectAll" msgid="6876518925844129331">"সবগুলি বেছে নিন"</string>
<string name="cut" msgid="3092569408438626261">"কাটুন"</string>
<string name="copy" msgid="2681946229533511987">"অনুলিপি"</string>
<string name="failed_to_copy_to_clipboard" msgid="1833662432489814471">"ক্লিপবোর্ডে কপি করা যায়নি"</string>
- <string name="paste" msgid="5629880836805036433">"আটকান"</string>
- <string name="paste_as_plain_text" msgid="5427792741908010675">"প্লেইন টেক্সট হিসেবে আটকান"</string>
+ <string name="paste" msgid="5629880836805036433">"পেস্ট করুন"</string>
+ <string name="paste_as_plain_text" msgid="5427792741908010675">"প্লেন টেক্সট হিসাবে পেস্ট করুন"</string>
<string name="replace" msgid="5781686059063148930">"প্রতিস্থাপন করুন..."</string>
<string name="delete" msgid="6098684844021697789">"মুছুন"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL কপি করুন"</string>
- <string name="selectTextMode" msgid="1018691815143165326">"পাঠ্য নির্বাচন করুন"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"পাঠ্য বেছে নিন"</string>
<string name="undo" msgid="7905788502491742328">"পূর্বাবস্থায় ফিরুন"</string>
<string name="redo" msgid="7759464876566803888">"আবার করুন"</string>
<string name="autofill" msgid="3035779615680565188">"আপনাআপনি পূরণ হতে দিন"</string>
@@ -980,11 +981,11 @@
<string name="dial" msgid="4204975095406423102">"ফোন করুন"</string>
<string name="map" msgid="6068210738233985748">"মানচিত্র"</string>
<string name="browse" msgid="6993590095938149861">"ব্রাউজার"</string>
- <string name="low_internal_storage_view_title" msgid="5576272496365684834">"সঞ্চয়স্থান পূর্ণ হতে চলেছে"</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">"সিস্টেমের জন্য যথেষ্ট স্টোরেজ নেই৷ আপনার কাছে ২৫০এমবি ফাঁকা স্থান রয়েছে কিনা সে বিষয়ে নিশ্চিত হন এবং সিস্টেম চালু করুন৷"</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="app_running_notification_text" msgid="1197581823314971177">"আরও তথ্যের জন্য বা অ্যাপ্লিকেশানটি বন্ধ করতে আলতো চাপুন।"</string>
<string name="ok" msgid="5970060430562524910">"ঠিক আছে"</string>
<string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string>
<string name="yes" msgid="5362982303337969312">"ঠিক আছে"</string>
@@ -1008,7 +1009,7 @@
<string name="whichSendToApplication" msgid="8272422260066642057">"এটি ব্যবহার করে পাঠান"</string>
<string name="whichSendToApplicationNamed" msgid="7768387871529295325">"%1$s ব্যবহার করে পাঠান"</string>
<string name="whichSendToApplicationLabel" msgid="8878962419005813500">"পাঠান"</string>
- <string name="whichHomeApplication" msgid="4307587691506919691">"একটি হোম অ্যাপ্লিকেশন নির্বাচন করুন"</string>
+ <string name="whichHomeApplication" msgid="4307587691506919691">"একটি হোম অ্যাপ্লিকেশন বেছে নিন"</string>
<string name="whichHomeApplicationNamed" msgid="4493438593214760979">"হোম হিসেবে %1$s ব্যবহার করুন"</string>
<string name="whichHomeApplicationLabel" msgid="809529747002918649">"ছবি তুলুন"</string>
<string name="whichImageCaptureApplication" msgid="3680261417470652882">"এই দিয়ে ছবি তুলুন"</string>
@@ -1051,7 +1052,7 @@
<string name="smv_process" msgid="5120397012047462446">"প্রক্রিয়াটি <xliff:g id="PROCESS">%1$s</xliff:g> তার স্ব-প্রয়োগ করা কঠোর মোড নীতি লঙ্ঘন করেছে৷"</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"Android আপগ্রেড করা হচ্ছে..."</string>
<string name="android_start_title" msgid="8418054686415318207">"Android চালু হচ্ছে…"</string>
- <string name="android_upgrading_fstrim" msgid="8036718871534640010">"সঞ্চয়স্থান অপ্টিমাইজ করা হচ্ছে৷"</string>
+ <string name="android_upgrading_fstrim" msgid="8036718871534640010">"স্টোরেজ অপ্টিমাইজ করা হচ্ছে৷"</string>
<string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android আপডেট সম্পন্ন করা হচ্ছে…"</string>
<string name="android_upgrading_notification_body" msgid="5761201379457064286">"আপগ্রেড সম্পন্ন না হওয়া পর্যন্ত কিছু অ্যাপ্লিকেশান সঠিকভাবে কাজ নাও করতে পারে"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> আপগ্রেড করা হচ্ছে…"</string>
@@ -1068,7 +1069,7 @@
<string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> শুরু করুন"</string>
<string name="new_app_description" msgid="1932143598371537340">"সংরক্ষণ না করেই পুরোনো অ্যাপ্লিকেশানটি বন্ধ করুন৷"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> মেমরি সীমা অতিক্রম করেছে"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"অনেক ডাটা সংগ্রহ করা হয়েছে; শেয়ার করার জন্য আলতো চাপুন"</string>
+ <string name="dump_heap_notification_detail" msgid="6901391084243999274">"অনেক ডেটা সংগ্রহ করা হয়েছে; শেয়ার করার জন্য ট্যাপ করুন"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"হিপ ডাম্প শেয়ার করবেন?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> প্রক্রিয়াটি তার <xliff:g id="SIZE">%2$s</xliff:g> এর মেমরি সীমা অতিক্রম করেছে৷ তার বিকাশকারীর সাথে শেয়ার করার জন্য একটি হিপ ডাম্প উপলব্ধ৷ সতর্কতা অবলম্বন করুন: এই হিপ ডাম্পে অ্যাপ্লিকেশানটির অ্যাক্সেস আছে এমন আপনার যেকোন ব্যক্তিগত তথ্য থাকতে পারে৷"</string>
<string name="sendText" msgid="5209874571959469142">"পাঠ্যের জন্য একটি কাজ বেছে নিন"</string>
@@ -1148,10 +1149,10 @@
<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">"এসএমএস পাঠানো হচ্ছে"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> অনেকগুলি এসএমএস পাঠাচ্ছে৷ আপনি কি এই অ্যাপ্লিকেশানটিকে বার্তা পাঠানো চালিয়ে যাওয়ার অনুমতি দিতে চান?"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> অনেকগুলি এসএমএস পাঠাচ্ছে৷ আপনি কি এই অ্যাপ্লিকেশানটিকে মেসেজ পাঠানো চালিয়ে যাওয়ার অনুমতি দিতে চান?"</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>
@@ -1165,7 +1166,7 @@
<string name="sim_done_button" msgid="827949989369963775">"সম্পন্ন হয়েছে"</string>
<string name="sim_added_title" msgid="3719670512889674693">"সিম কার্ড যোগ করা হয়েছে"</string>
<string name="sim_added_message" msgid="6599945301141050216">"মোবাইল নেটওয়ার্ক অ্যাক্সেস করতে আপনার ডিভাইসটি পুনর্সূচনা করুন৷"</string>
- <string name="sim_restart_button" msgid="4722407842815232347">"পুনর্সূচনা"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"রিস্টার্ট করুন"</string>
<string name="carrier_app_dialog_message" msgid="7066156088266319533">"যাতে আপনার নতুন সিম সঠিকভাবে কাজ করে, তার জন্য আপনাকে আপনার পরিষেবা প্রদানকারীর থেকে একটি অ্যাপ্লিকেশান ইনস্টল করতে এবং খুলতে হবে৷"</string>
<string name="carrier_app_dialog_button" msgid="7900235513678617329">"অ্যাপ্লিকেশানটি পান"</string>
<string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"এখনই নয়"</string>
@@ -1186,7 +1187,7 @@
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ফটো স্থানান্তরের জন্য USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI এর জন্য USB"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"একটি USB যন্ত্রাংশতে সংযুক্ত হয়েছে"</string>
- <string name="usb_notification_message" msgid="3370903770828407960">"আরো বিকল্পের জন্য আলতো চাপুন৷"</string>
+ <string name="usb_notification_message" msgid="3370903770828407960">"আরও বিকল্পের জন্য আলতো চাপুন৷"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"অ্যানালগ অডিও অ্যাক্সেসরি শনাক্ত করা হয়েছে"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"সংযুক্ত ডিভাইসটি এই ফোনের সাথে ব্যবহার করা যাবে না। আরও জানতে ট্যাপ করুন।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযুক্ত হয়েছে"</string>
@@ -1200,9 +1201,9 @@
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"অস্বীকার করুন"</string>
<string name="select_input_method" msgid="8547250819326693584">"কীবোর্ড পরিবর্তন করুন"</string>
<string name="show_ime" msgid="2506087537466597099">"ফিজিক্যাল কীবোর্ড সক্রিয় থাকার সময় এটিকে স্ক্রীনে রাখুন"</string>
- <string name="hardware" msgid="194658061510127999">"ভার্চুয়াল কীবোর্ড দেখান"</string>
+ <string name="hardware" msgid="194658061510127999">"ভার্চুয়াল কীবোর্ড দেখুন"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ফিজিক্যাল কীবোর্ড কনফিগার করুন"</string>
- <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ভাষা এবং লেআউট নির্বাচন করুন আলতো চাপ দিন"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ভাষা এবং লেআউট বেছে নিন আলতো চাপ দিন"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"অন্যান্য অ্যাপের উপরে দেখুন"</string>
@@ -1216,10 +1217,10 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফটো এবং মিডিয়া ট্রান্সফার"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ৷ ঠিক করতে আলতো চাপুন৷"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ। মেরামত করতে নির্বাচন করুন।"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ। মেরামত করতে বেছে নিন।"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> অসমর্থিত"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে আলতো চাপুন।"</string>
- <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে চাইলে নির্বাচন করুন।"</string>
+ <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে চাইলে বেছে নিন।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> অপ্রত্যাশিতভাবে মুছে ফেলা হয়েছে"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ডেটা যাতে হারিয়ে না যায় তার জন্য সরানোর আগে <xliff:g id="NAME">%s</xliff:g> আনমাউন্ট করুন"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> সরানো হয়েছে"</string>
@@ -1262,7 +1263,7 @@
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"জুম নিয়ন্ত্রণের জন্য দুবার ট্যাপ করুন"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"উইজেট যোগ করা যায়নি৷"</string>
<string name="ime_action_go" msgid="8320845651737369027">"যান"</string>
- <string name="ime_action_search" msgid="658110271822807811">"অনুসন্ধান করুন"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"খুঁজুন"</string>
<string name="ime_action_send" msgid="2316166556349314424">"পাঠান"</string>
<string name="ime_action_next" msgid="3138843904009813834">"পরবর্তী"</string>
<string name="ime_action_done" msgid="8971516117910934605">"সম্পন্ন হয়েছে"</string>
@@ -1370,15 +1371,15 @@
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"আনলক করতে সোয়াইপ করুন৷"</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>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"আরও বিকল্প"</string>
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
- <string name="storage_internal" msgid="3570990907910199483">"অভ্যন্তরীণ শেয়ার করা সঞ্চয়স্থান"</string>
+ <string name="storage_internal" msgid="3570990907910199483">"ইন্টারনাল শেয়ার করা স্টোরেজ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD কার্ড"</string>
<string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD কার্ড"</string>
<string name="storage_usb_drive" msgid="6261899683292244209">"USB ড্রাইভ"</string>
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ড্রাইভ"</string>
- <string name="storage_usb" msgid="3017954059538517278">"USB সঞ্চয়স্থান"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB স্টোরেজ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"সম্পাদনা করুন"</string>
<string name="data_usage_warning_title" msgid="3620440638180218181">"ডেটা ব্যবহারের সতর্কতা"</string>
<string name="data_usage_warning_body" msgid="6660692274311972007">"ব্যবহার এবং সেটিংস দেখতে আলতো চাপুন৷"</string>
@@ -1394,7 +1395,7 @@
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"নির্দিষ্ট সীমার থেকে <xliff:g id="SIZE">%s</xliff:g> বেশি৷"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"পটভূমি ডেটা সীমিত করা আছে"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"সীমাবদ্ধতা সরাতে আলতো চাপুন৷"</string>
- <string name="ssl_certificate" msgid="6510040486049237639">"নিরাপত্তার শংসাপত্র"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"নিরাপত্তার সার্টিফিকেট"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"শংসাপত্রটি বৈধ৷"</string>
<string name="issued_to" msgid="454239480274921032">"এর জন্য ইস্যু করা হয়েছে:"</string>
<string name="common_name" msgid="2233209299434172646">"প্রচলিত নাম:"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ভুল প্যাটার্ন"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ভুল পাসওয়ার্ড"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"ভুল পিন"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"আপনার প্যাটার্ন আঁকুন"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"সিম পিন লিখুন"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"পিন লিখুন"</string>
@@ -1462,11 +1466,11 @@
<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_username_hint" msgid="5718534272070920364">"ব্যবহারকারী নাম (ইমেল)"</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>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"অবৈধ ব্যবহারকারী নাম অথবা পাসওয়ার্ড৷"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"আপনার ব্যবহারকারী নাম অথবা পাসওয়ার্ড ভুলে গেছেন?\n"<b>"google.com/accounts/recovery"</b>" এ যান৷"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"অবৈধ ইউজারনেম অথবা পাসওয়ার্ড৷"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"আপনার ইউজারনেম অথবা পাসওয়ার্ড ভুলে গেছেন?\n"<b>"google.com/accounts/recovery"</b>" এ যান৷"</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"অ্যাকাউন্ট পরীক্ষা করা হচ্ছে..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"আপনি আপনার পিন টাইপ করতে <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="7813713389422226531">"আপনি আপনার পাসওয়ার্ড <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল টাইপ করেছেন৷ \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
@@ -1484,7 +1488,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"সরান"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"প্রস্তাবিত স্তরের চেয়ে বেশি উঁচুতে ভলিউম বাড়াবেন?\n\nউঁচু ভলিউমে বেশি সময় ধরে কিছু শুনলে আপনার শ্রবনশক্তির ক্ষতি হতে পারে।"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"অ্যাক্সেসযোগ্যতা শর্টকাট ব্যবহার করবেন?"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"শর্টকাটটি চালু থাকলে দুটি ভলিউম বোতাম একসাথে ৩ সেকেন্ড টিপে ধরে রাখলে একটি অ্যাক্সেসযোগ্যতা বৈশিষ্ট্য চালু হবে।\n\n বর্তমান অ্যাক্সেসযোগ্যতা বৈশিষ্ট্য:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n আপনি এই বৈশিষ্ট্যটি সেটিংস > অ্যাক্সেসযোগ্যতাতে গিয়ে পরিবর্তন করতে পারবেন।"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"শর্টকাটটি চালু থাকলে দুটি ভলিউম বোতাম একসাথে ৩ সেকেন্ড টিপে ধরে রাখলে একটি অ্যাকসেসিবিলিটি বৈশিষ্ট্য চালু হবে।\n\n বর্তমান অ্যাকসেসিবিলিটি বৈশিষ্ট্য:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n আপনি এই বৈশিষ্ট্যটি সেটিংস > অ্যাকসেসিবিলিটিতে গিয়ে পরিবর্তন করতে পারবেন।"</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"শর্টকাট বন্ধ করুন"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"শর্টকাট ব্যবহার করুন"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে চালু করেছে"</string>
@@ -1494,7 +1498,7 @@
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"বড় করে দেখা"</string>
<string name="user_switched" msgid="3768006783166984410">"বর্তমান ব্যবহারকারী <xliff:g id="NAME">%1$s</xliff:g>৷"</string>
<string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> নামের ব্যবহারকারীতে যাচ্ছে…"</string>
- <string name="user_logging_out_message" msgid="8939524935808875155">"<xliff:g id="NAME">%1$s</xliff:g>কে লগ আউট করা হচ্ছে..."</string>
+ <string name="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_change_not_allowed" msgid="1238035947357923497">"এই পরিবর্তনটি আপনার প্রশাসক দ্বারা অনুমোদিত নয়"</string>
@@ -1582,9 +1586,9 @@
<string name="mediasize_japanese_kaku2" msgid="2359077233775455405">"Kaku2"</string>
<string name="mediasize_japanese_you4" msgid="2091777168747058008">"You4"</string>
<string name="mediasize_unknown_portrait" msgid="3088043641616409762">"অজানা পোর্ট্রেট"</string>
- <string name="mediasize_unknown_landscape" msgid="4876995327029361552">"অজানা ভূদৃশ্য"</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>
@@ -1603,16 +1607,16 @@
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"পরে আবার চেষ্টা করুন"</string>
- <string name="immersive_cling_title" msgid="8394201622932303336">"পূর্ণ স্ক্রীণে দেখা হচ্ছে"</string>
+ <string name="immersive_cling_title" msgid="8394201622932303336">"পূর্ণ স্ক্রিনে দেখা হচ্ছে"</string>
<string name="immersive_cling_description" msgid="3482371193207536040">"প্রস্থান করতে উপর থেকে নীচের দিকে সোয়াইপ করুন"</string>
<string name="immersive_cling_positive" msgid="5016839404568297683">"বুঝেছি"</string>
<string name="done_label" msgid="2093726099505892398">"সম্পন্ন হয়েছে"</string>
<string name="hour_picker_description" msgid="6698199186859736512">"বৃত্তাকার ঘণ্টা নির্বাচকের স্লাইডার"</string>
<string name="minute_picker_description" msgid="8606010966873791190">"বৃত্তাকার মিনিট নির্বাচকের স্লাইডার"</string>
- <string name="select_hours" msgid="6043079511766008245">"ঘণ্টা নির্বাচন করুন"</string>
- <string name="select_minutes" msgid="3974345615920336087">"মিনিট নির্বাচন করুন"</string>
- <string name="select_day" msgid="7774759604701773332">"মাস এবং দিন নির্বাচন করুন"</string>
- <string name="select_year" msgid="7952052866994196170">"বছর নির্বাচন করুন"</string>
+ <string name="select_hours" msgid="6043079511766008245">"ঘণ্টা বেছে নিন"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"মিনিট বেছে নিন"</string>
+ <string name="select_day" msgid="7774759604701773332">"মাস এবং দিন বেছে নিন"</string>
+ <string name="select_year" msgid="7952052866994196170">"বছর বেছে নিন"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> মুছে ফেলা হয়েছে"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"কর্মক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"দ্বিতীয় কার্যক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string>
@@ -1627,8 +1631,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"আপনার প্রশাসক ইনস্টল করেছেন"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"আপনার প্রশাসক আপডেট করেছেন"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"আপনার প্রশাসক মুছে দিয়েছেন"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ব্যাটরির লাইফ উন্নত করতে সহায়তা করতে, ব্যাটারি সাশ্রয়কারী আপনার ডিভাইসের কার্যসম্পাদনা হ্রাস করে এবং কম্পন, অবস্থান পরিষেবাগুলি এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে৷ ইমেল, মেসেজিং এবং অন্যান্য অ্যাপ্লিকেশনগুলিকে যেগুলি সিঙ্কের উপর নির্ভর করে সেগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে৷\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সাশ্রয়কারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়৷"</string>
- <string name="data_saver_description" msgid="6015391409098303235">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার পটভূমিতে কিছু অ্যাপ্লিকেশানকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশান ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবিগুলিতে আলতো চাপ না দেওয়া পর্যন্ত সেগুলি প্রদর্শিত হবে না৷"</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>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1690,7 +1694,7 @@
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB পেরিফেরাল পোর্ট"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
<string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB পেরিফেরাল পোর্ট"</string>
- <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"আরো বিকল্প"</string>
+ <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"আরও বিকল্প"</string>
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ওভারফ্লো বন্ধ করুন"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"বড় করুন"</string>
<string name="close_button_text" msgid="3937902162644062866">"বন্ধ করুন"</string>
@@ -1710,11 +1714,11 @@
<string name="language_picker_section_suggested" msgid="8414489646861640885">"প্রস্তাবিত"</string>
<string name="language_picker_section_all" msgid="3097279199511617537">"সকল ভাষা"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"সমস্ত অঞ্চল"</string>
- <string name="locale_search_menu" msgid="2560710726687249178">"অনুসন্ধান করুন"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"খুঁজুন"</string>
<string name="work_mode_off_title" msgid="2615362773958585967">"কর্মস্থলের মোড চালু করবেন?"</string>
<string name="work_mode_off_message" msgid="2961559609199223594">"এটি অ্যাপ, পটভূমি সিঙ্ক, এবং সম্পর্কিত বৈশিষ্ট্যগুলি সহ কর্মস্থলের প্রোফাইলটিকে চালু করবে"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"চালু করুন"</string>
- <string name="new_sms_notification_title" msgid="8442817549127555977">"আপনার নতুন বার্তা আছে"</string>
+ <string name="new_sms_notification_title" msgid="8442817549127555977">"আপনার নতুন মেসেজ আছে"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"দেখার জন্য SMS অ্যাপ্লিকেশান খুলুন"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"কিছু ক্রিয়াকলাপ সীমিত হতে পারে"</string>
<string name="user_encrypted_message" msgid="4923292604515744267">"আনলক করতে আলতো চাপ দিন"</string>
@@ -1725,7 +1729,7 @@
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ফাইলগুলি দেখতে আলতো চাপ দিন"</string>
<string name="pin_target" msgid="3052256031352291362">"পিন করুন"</string>
<string name="unpin_target" msgid="3556545602439143442">"আনপিন করুন"</string>
- <string name="app_info" msgid="6856026610594615344">"অ্যাপ্লিকেশানের তথ্য"</string>
+ <string name="app_info" msgid="6856026610594615344">"অ্যাপের তথ্য"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ডেমো শুরু করা হচ্ছে…"</string>
<string name="demo_restarting_message" msgid="952118052531642451">"ডিভাইস আবার সেট করা হচ্ছে…"</string>
@@ -1733,14 +1737,14 @@
<string name="conference_call" msgid="3751093130790472426">"কনফারেন্স কল"</string>
<string name="tooltip_popup_title" msgid="5253721848739260181">"টুলটিপ"</string>
<string name="app_category_game" msgid="5431836943981492993">"গেম্স"</string>
- <string name="app_category_audio" msgid="1659853108734301647">"সঙ্গীত ও অডিও"</string>
+ <string name="app_category_audio" msgid="1659853108734301647">"মিউজিক ও অডিও"</string>
<string name="app_category_video" msgid="2728726078629384196">"চলচ্চিত্র ও ভিডিওগুলি"</string>
- <string name="app_category_image" msgid="4867854544519846048">"ফটো ও চিত্রগুলি"</string>
+ <string name="app_category_image" msgid="4867854544519846048">"ফটো ও ছবিগুলি"</string>
<string name="app_category_social" msgid="5842783057834965912">"সামাজিক ও যোগাযোগ"</string>
<string name="app_category_news" msgid="7496506240743986873">"খবর ও পত্রিকাগুলি"</string>
<string name="app_category_maps" msgid="5878491404538024367">"মানচিত্র ও নেভিগেশান"</string>
<string name="app_category_productivity" msgid="3742083261781538852">"উৎপাদনশীলতা"</string>
- <string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"ডিভাইসের সঞ্চয়স্থান"</string>
+ <string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"ডিভাইসের স্টোরেজ"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB ডিবাগিং"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"ঘন্টা"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"মিনিট"</string>
@@ -1750,7 +1754,7 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"সময় ইনপুট দেওয়ার জন্য পাঠ্য ইনপুট মোডে যান।"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"সময় ইনপুট দেওয়ার জন্য ঘড়ি মোডে যান।"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"আপনাআপনি পূরণ করার বিকল্পগুলি"</string>
- <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"স্বতঃপূর্ণর জন্য সংরক্ষণ করুন"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"স্বতঃপূরণের জন্য সেভ করুন"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"বিষয়বস্তুগুলি অটো-ফিল করা যাবে না"</string>
<string name="autofill_picker_no_suggestions" msgid="3908514303773350735">"স্বতঃপূর্ণ করার প্রস্তাবনা নেই"</string>
<plurals name="autofill_picker_some_suggestions" formatted="false" msgid="5506565809835815274">
@@ -1761,7 +1765,7 @@
<string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> কে <b><xliff:g id="LABEL">%2$s</xliff:g></b>এ সংরক্ষণ করবেন?"</string>
<string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> এবং <xliff:g id="TYPE_1">%2$s</xliff:g> কে <b><xliff:g id="LABEL">%3$s</xliff:g></b> এ সংরক্ষণ করবেন?"</string>
<string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, এবং <xliff:g id="TYPE_2">%3$s</xliff:g> কে <b><xliff:g id="LABEL">%4$s</xliff:g></b> এ সংরক্ষণ করবেন?"</string>
- <string name="autofill_save_yes" msgid="6398026094049005921">"সংরক্ষণ করুন"</string>
+ <string name="autofill_save_yes" msgid="6398026094049005921">"সেভ করুন"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"না থাক"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"পাসওয়ার্ড"</string>
<string name="autofill_save_type_address" msgid="4936707762193009542">"ঠিকানা"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 96b9e76..ba0f952 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -214,7 +214,7 @@
<string name="global_action_emergency" msgid="7112311161137421166">"Hitno"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Izvještaj o greškama"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Kreirajte izvještaj o greškama"</string>
- <string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupljati informacije o trenutnom stanju uređaja, koji će biti poslani kao poruka e-pošte. Može malo potrajati dok se izvještaj o greškama ne kreira i bude spreman za slanje. Budite strpljivi."</string>
+ <string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupljati informacije o trenutnom stanju uređaja, koji će biti poslani kao e-poruka. Može malo potrajati dok se izvještaj o greškama ne kreira i bude spreman za slanje. Budite strpljivi."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivni izvještaj"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Koristite ovu opciju u većini slučajeva. Ova opcija vam omogućava praćenje napretka izvještaja, unos dodatnih detalja o problemu i pravljenje snimaka ekrana. Moglo bi doći do izostavljanja nekih manje korištenih dijelova za čije prijavljivanje je potrebno dugo vremena."</string>
<string name="bugreport_option_full_title" msgid="6354382025840076439">"Kompletan izvještaj"</string>
@@ -233,7 +233,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Zaključaj odmah"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Novo obavještenje"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelna tastatura"</string>
@@ -871,7 +872,7 @@
</plurals>
<string name="last_month" msgid="3959346739979055432">"Prošli mjesec"</string>
<string name="older" msgid="5211975022815554840">"Starije"</string>
- <string name="preposition_for_date" msgid="9093949757757445117">"datuma <xliff:g id="DATE">%s</xliff:g>"</string>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string>
<string name="preposition_for_time" msgid="5506831244263083793">"u <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"godine <xliff:g id="YEAR">%s</xliff:g>"</string>
<string name="day" msgid="8144195776058119424">"dan"</string>
@@ -1204,7 +1205,7 @@
<string name="no_permissions" msgid="7283357728219338112">"Nisu potrebna odobrenja"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ovo se možda dodatno plaća"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Uredu"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Ovaj uređaj se puni preko USB-a"</string>
+ <string name="usb_charging_notification_title" msgid="6895185153353640787">"Punjenje uređaja putem USB-a"</string>
<string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB napaja priključeni uređaj"</string>
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB za prijenos fajlova"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB za prijenos slika"</string>
@@ -1409,9 +1410,9 @@
<string name="data_usage_warning_body" msgid="6660692274311972007">"Dodirnite za prikaz potrošnje i postavki."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Dostignut limit za 2G-3G podatke"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Dostignut limit za 4G podatke"</string>
- <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dostignut limit za mob. podatke"</string>
+ <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dostignuto ograničenje za prijenos podataka"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Dostignut limit Wi-Fi podataka"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Podaci pauz. za ostatak ciklusa"</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"Prijenos podataka je pauziran za ostatak ciklusa"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Premašeni 2G-3G podaci"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Premašeni 4G podaci"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Prekoračeno je ograničenje za podatke na mobilnom uređaju"</string>
@@ -1471,7 +1472,11 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan uzorak"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Pogrešan PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Broj sekundi do sljedećeg pokušaja: <xliff:g id="NUMBER">%1$d</xliff:g>."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
+ <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Nacrtajte obrazac"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Unesite PIN za SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Unesite PIN"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 5fa9e1d..d79eae1 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configuració"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistència"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. per veu"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloqueja ara"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"+999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificació nova"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclat virtual"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Patró incorrecte"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contrasenya incorrecta"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorrecte"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Torna-ho a provar d\'aquí a <xliff:g id="NUMBER">%1$d</xliff:g> segons."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Torna-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons.</item>
+ <item quantity="one">Torna-ho a provar d\'aquí a 1 segon.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Dibuixa el patró"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Introdueix el PIN de la SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Introdueix el PIN"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 9a3b86a..c907236 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nastavení"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistence"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlas. asistence"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Zamknout"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nové oznámení"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuální klávesnice"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávné gesto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávné heslo"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Nesprávný kód PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Zkuste to znovu za <xliff:g id="NUMBER">%1$d</xliff:g> s."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="few">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="other">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ <item quantity="one">Zkuste to znovu za 1 sekundu.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Nakreslete gesto"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Zadejte kód PIN SIM karty"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Zadejte kód PIN"</string>
@@ -1791,7 +1797,7 @@
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Klepnutím zobrazíte soubory"</string>
<string name="pin_target" msgid="3052256031352291362">"Připnout"</string>
<string name="unpin_target" msgid="3556545602439143442">"Odepnout"</string>
- <string name="app_info" msgid="6856026610594615344">"Informace o aplikaci"</string>
+ <string name="app_info" msgid="6856026610594615344">"O aplikaci"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Spouštění ukázky…"</string>
<string name="demo_restarting_message" msgid="952118052531642451">"Resetování zařízení…"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index fb76f1e..f3a34ef 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Indstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Taleassistent"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lås nu"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ny underretning"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string>
@@ -1180,7 +1181,7 @@
<string name="no_permissions" msgid="7283357728219338112">"Der kræves ingen tilladelser"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"dette kan koste dig penge"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB, der oplader denne enhed"</string>
+ <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB oplader denne enhed"</string>
<string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB, der leverer strøm til den tilsluttede enhed"</string>
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB til filoverførsel"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB til billedoverførsel"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Forkert mønster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Forkert adgangskode"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Forkert pinkode"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Prøv igen om <xliff:g id="NUMBER">%1$d</xliff:g> sekunder."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ <item quantity="other">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Tegn dit mønster"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Indtast pinkode til SIM-kort"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Indtast pinkode"</string>
@@ -1725,7 +1729,7 @@
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tryk for at se filer"</string>
<string name="pin_target" msgid="3052256031352291362">"Fastgør"</string>
<string name="unpin_target" msgid="3556545602439143442">"Frigør"</string>
- <string name="app_info" msgid="6856026610594615344">"Oplysninger om appen"</string>
+ <string name="app_info" msgid="6856026610594615344">"Appinfo"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starter demoen…"</string>
<string name="demo_restarting_message" msgid="952118052531642451">"Nulstiller enheden…"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 054a3bd..d387035 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Einstellungen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistent"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sprachassistent"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Jetzt sperren"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Neue Benachrichtigung"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Bildschirmtastatur"</string>
@@ -1098,7 +1099,7 @@
<item quantity="one">WLAN verfügbar</item>
</plurals>
<plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606">
- <item quantity="other">Verfügbare WLANe öffnen</item>
+ <item quantity="other">Verfügbare WLANs öffnen</item>
<item quantity="one">Verfügbares WLAN öffnen</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Mit offenem WLAN verbinden"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Falsches Muster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Falsches Passwort"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Falsche PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Versuche es in <xliff:g id="NUMBER">%1$d</xliff:g> Sekunden erneut."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">In <xliff:g id="NUMBER">%d</xliff:g> Sekunden noch einmal versuchen.</item>
+ <item quantity="one">In 1 Sekunde noch einmal versuchen.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Muster zeichnen"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM-PIN eingeben"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN eingeben"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index edccd2e..ed81487 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -38,7 +38,7 @@
<string name="serviceErased" msgid="1288584695297200972">"Η διαγραφή ήταν επιτυχής."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"Λανθασμένος κωδικός πρόσβασης."</string>
<string name="mmiComplete" msgid="8232527495411698359">"Το MMI ολοκληρώθηκε."</string>
- <string name="badPin" msgid="9015277645546710014">"Ο παλιός αριθμός PIN που πληκτρολογήσατε είναι λάθος."</string>
+ <string name="badPin" msgid="9015277645546710014">"Το παλιό PIN που πληκτρολογήσατε είναι λάθος."</string>
<string name="badPuk" msgid="5487257647081132201">"Ο κωδικός PUK που πληκτρολογήσατε είναι λάθος."</string>
<string name="mismatchPin" msgid="609379054496863419">"Οι αριθμοί PIN που πληκτρολογήσατε δεν ταιριάζουν."</string>
<string name="invalidPin" msgid="3850018445187475377">"Πληκτρολογήστε έναν αριθμό PIN μεγέθους 4 έως 8 αριθμών."</string>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ρυθμίσεις"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Βοήθεια"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Φων.υποβοηθ."</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Κλείδωμα τώρα"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Νέα ειδοποίηση"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Εικονικό πληκτρολόγιο"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Λάθος μοτίβο"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Λανθασμένος κωδικός πρόσβασης"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Λανθασμένος κωδικός PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Δοκιμάστε ξανά σε <xliff:g id="NUMBER">%1$d</xliff:g> δευτερόλεπτα."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Δοκιμάστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα.</item>
+ <item quantity="one">Δοκιμάστε ξανά σε 1 δευτερόλεπτο</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Σχεδιάστε το μοτίβο σας"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Εισαγωγή PIN SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Πληκτρολογήστε το PIN"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 013017d4..b0ac9df 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Wrong PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Try again in <xliff:g id="NUMBER">%1$d</xliff:g> seconds."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Enter PIN"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 013017d4..b0ac9df 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Wrong PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Try again in <xliff:g id="NUMBER">%1$d</xliff:g> seconds."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Enter PIN"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 013017d4..b0ac9df 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Wrong PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Try again in <xliff:g id="NUMBER">%1$d</xliff:g> seconds."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Enter PIN"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 013017d4..b0ac9df 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Wrong PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Try again in <xliff:g id="NUMBER">%1$d</xliff:g> seconds."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Enter PIN"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index eff2bd2..03210c9 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Wrong PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Try again in <xliff:g id="NUMBER">%1$d</xliff:g> seconds."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Enter PIN"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index a96f02e..3ed9a2a 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear ahora"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nueva"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Patrón incorrecto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorrecto"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Vuelve a intentarlo en <xliff:g id="NUMBER">%1$d</xliff:g> segundos."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Dibuja tu patrón."</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Ingresa el PIN de la tarjeta SIM."</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Ingresa el PIN."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 3f49aa8..06a6669 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ajustes"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear ahora"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nueva"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"El patrón es incorrecto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorrecto"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Inténtalo de nuevo en <xliff:g id="NUMBER">%1$d</xliff:g> segundos."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Dibuja tu patrón de desbloqueo."</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Introduce el PIN de la tarjeta SIM."</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Introduce el PIN."</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 661ac0b..3d703fe 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Seaded"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Abi"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Häälabi"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lukusta kohe"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Uus märguanne"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuaalne klaviatuur"</string>
@@ -1131,7 +1132,7 @@
<string name="wifi_connect_alert_message" msgid="6451273376815958922">"Rakendus %1$s soovib luua ühenduse WiFi-võrguga %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Rakendus"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"WiFi Direct"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Käivitage WiFi otseühendus. See lülitab välja WiFi kliendi/leviala."</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Käivitage WiFi otseühendus. See lülitab välja WiFi kliendi/kuumkoha."</string>
<string name="wifi_p2p_failed_message" msgid="3763669677935623084">"WiFi otseühenduse käivitamine ebaõnnestus."</string>
<string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"WiFi Direct on sees"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="8064677407830620023">"Puudutage seadete nägemiseks"</string>
@@ -1303,7 +1304,7 @@
<string name="submit" msgid="1602335572089911941">"Saada"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Autorežiim lubatud"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Puudutage autorežiimist väljumiseks."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Jagamine või tööpunkt on aktiivne"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Jagamine või kuumkoht on aktiivne"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Puudutage seadistamiseks."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Jagamine on keelatud"</string>
<string name="disable_tether_notification_message" msgid="2913366428516852495">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Vale muster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Vale parool"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Vale PIN-kood"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Proovige uuesti <xliff:g id="NUMBER">%1$d</xliff:g> sekundi pärast."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Proovige uuesti <xliff:g id="NUMBER">%d</xliff:g> sekundi pärast.</item>
+ <item quantity="one">Proovige uuesti 1 sekundi pärast.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Joonistage oma muster"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Sisestage SIM-i PIN-kood"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Sisestage PIN-kood"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 87dc06e..69a8e67 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ezarpenak"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Lagundu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ahots-laguntza"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Blokeatu"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Jakinarazpen berria"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teklatu birtuala"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Eredu okerra"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pasahitz okerra"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN okerra"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Saiatu berriro <xliff:g id="NUMBER">%1$d</xliff:g> segundo barru."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Saiatu berriro <xliff:g id="NUMBER">%d</xliff:g> segundo igarotakoan.</item>
+ <item quantity="one">Saiatu berriro segundo bat igarotakoan.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Marraztu eredua"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Idatzi SIMaren PIN kodea"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Idatzi PINa"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 4bd8263..7a0d817 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"تنظیمات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"دستیار"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"دستیار صوتی"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"اکنون قفل شود"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"۹۹۹+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"اعلان جدید"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"صفحهکلید مجازی"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"الگوی اشتباه"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"گذرواژه اشتباه"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"پین اشتباه"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"پس از <xliff:g id="NUMBER">%1$d</xliff:g> ثانیه دوباره امتحان کنید."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"الگوی خود را رسم کنید"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"پین سیم کارت را وارد کنید"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"پین را وارد کنید"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 55f3f2a..d586760 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Asetukset"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Auta"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ääniapuri"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lukitse nyt"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Uusi ilmoitus"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuaalinen näppäimistö"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Väärä kuvio"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Väärä salasana"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Väärä PIN-koodi"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Yritä uudelleen <xliff:g id="NUMBER">%1$d</xliff:g> sekunnin kuluttua."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua.</item>
+ <item quantity="one">Yritä uudelleen 1 sekunnin kuluttua.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Piirrä kuvio"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Anna SIM-kortin PIN-koodi"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Anna PIN-koodi"</string>
@@ -1743,7 +1747,7 @@
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Laitteen tallennustila"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB-vianetsintä"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"tunti"</string>
- <string name="time_picker_minute_label" msgid="5168864173796598399">"minuutti"</string>
+ <string name="time_picker_minute_label" msgid="5168864173796598399">"minuutit"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Aseta aika"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Anna kelvollinen aika."</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Kirjoita aika"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 6c4a1d5..5ff39ab 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. vocale"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Verrouiller"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nouvelle notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Clavier virtuel"</string>
@@ -849,9 +850,9 @@
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espace"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"entrée"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"suppr"</string>
- <string name="search_go" msgid="8298016669822141719">"Recherche"</string>
+ <string name="search_go" msgid="8298016669822141719">"Rechercher"</string>
<string name="search_hint" msgid="1733947260773056054">"Recherche en cours..."</string>
- <string name="searchview_description_search" msgid="6749826639098512120">"Recherche"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"Rechercher"</string>
<string name="searchview_description_query" msgid="5911778593125355124">"Requête de recherche"</string>
<string name="searchview_description_clear" msgid="1330281990951833033">"Effacer la requête"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Envoyer la requête"</string>
@@ -1262,7 +1263,7 @@
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Appuyer deux fois pour régler le zoom"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Impossible d\'ajouter le widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Aller"</string>
- <string name="ime_action_search" msgid="658110271822807811">"Recherche"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"Rechercher"</string>
<string name="ime_action_send" msgid="2316166556349314424">"Envoyer"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Suivante"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Terminé"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"NIP incorrect."</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Réessayez dans <xliff:g id="NUMBER">%1$d</xliff:g> secondes."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
+ <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Dessinez votre schéma."</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Saisissez le NIP de la carte SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Saisissez le NIP."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 9340c7c..0482d3a 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assistance vocale"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Verrouiller"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nouvelle notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Clavier virtuel"</string>
@@ -1386,7 +1387,7 @@
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Limite de données 4G atteinte"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite données mobiles atteinte"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite données Wi-Fi atteinte"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Données suspend. pour reste cycle"</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"Données suspendues jusqu\'à la fin du cycle"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Quota de données 2G-3G dépassé"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Quota de données 4G dépassé"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Quota utilisation données dépassé"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Code PIN incorrect."</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Réessayez dans <xliff:g id="NUMBER">%1$d</xliff:g> secondes."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
+ <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Dessinez votre schéma."</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Saisissez le code PIN de la carte SIM."</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Saisissez le code PIN."</string>
@@ -1742,8 +1746,8 @@
<string name="app_category_productivity" msgid="3742083261781538852">"Productivité"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Mémoire de l\'appareil"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Débogage USB"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"heure"</string>
- <string name="time_picker_minute_label" msgid="5168864173796598399">"minute"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"heures"</string>
+ <string name="time_picker_minute_label" msgid="5168864173796598399">"minutes"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Définir l\'heure"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Veuillez indiquer une heure valide"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Indiquez l\'heure"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index ea93ca4..54f00c5 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear agora"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nova"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -1180,7 +1181,7 @@
<string name="no_permissions" msgid="7283357728219338112">"Non é necesario ningún permiso"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"é posible que teñas que pagar"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Aceptar"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"O USB está cargando este dispositivo"</string>
+ <string name="usb_charging_notification_title" msgid="6895185153353640787">"Cargando este dispositivo por USB"</string>
<string name="usb_supplying_notification_title" msgid="5310642257296510271">"O USB está proporcionando enerxía ao dispositivo conectado"</string>
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferencia de ficheiros"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferencia de fotos"</string>
@@ -1384,9 +1385,9 @@
<string name="data_usage_warning_body" msgid="6660692274311972007">"Toca para uso e configuración."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Límite de datos de 2G-3G acadado"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Límite de datos de 4G acadado"</string>
- <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Límite de datos móbiles acadado"</string>
+ <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Alcanzouse o límite de datos móbiles"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Límite de datos da wifi acadado"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Datos pausados para o ciclo"</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"Datos pausados para o resto do ciclo"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Límite de datos 2G-3G superado"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Límite de datos 4G superado"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Límite de datos móbiles superado"</string>
@@ -1432,7 +1433,7 @@
<string name="media_route_chooser_searching" msgid="4776236202610828706">"Buscando dispositivos…"</string>
<string name="media_route_chooser_extended_settings" msgid="87015534236701604">"Configuración"</string>
<string name="media_route_controller_disconnect" msgid="8966120286374158649">"Desconectar"</string>
- <string name="media_route_status_scanning" msgid="7279908761758293783">"Analizando..."</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"Explorando..."</string>
<string name="media_route_status_connecting" msgid="6422571716007825440">"Conectando..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Dispoñible"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Non dispoñibles"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrón incorrecto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contrasinal incorrecto"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorrecto"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Téntao de novo en <xliff:g id="NUMBER">%1$d</xliff:g> segundos."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Téntao de novo dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ <item quantity="one">Téntao de novo dentro de 1 segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Debuxa o teu padrón"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Introduce o PIN da tarxeta SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Introduce o PIN"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index f9041ca..464f832 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -44,11 +44,11 @@
<string name="invalidPin" msgid="3850018445187475377">"એક પિન લખો જે 4 થી 8 સંખ્યાનો છે."</string>
<string name="invalidPuk" msgid="8761456210898036513">"એક PUK લખો કે જે 8 અંક કે તેથી લાંબો હોય."</string>
<string name="needPuk" msgid="919668385956251611">"તમારો સિમ કાર્ડ, PUK-લૉક કરેલ છે. તેને અનલૉક કરવા માટે PUK કોડ લખો."</string>
- <string name="needPuk2" msgid="4526033371987193070">"SIM કાર્ડને અનાવરોધિત કરવા માટે PUK2 લખો."</string>
- <string name="enablePin" msgid="209412020907207950">"અસફળ, SIM/RUIM લૉક સક્ષમ કરો."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"સિમ કાર્ડને અનાવરોધિત કરવા માટે PUK2 લખો."</string>
+ <string name="enablePin" msgid="209412020907207950">"અસફળ, સિમ/RUIM લૉક સક્ષમ કરો."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
- <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>
+ <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="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
@@ -132,7 +132,7 @@
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"ફક્ત વાઇ-ફાઇ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ફોરવર્ડ કર્યો નથી"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
- <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="TIME_DELAY">{2}</xliff:g> સેકંડ પછી <xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="TIME_DELAY">{2}</xliff:g> સેકન્ડ પછી <xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ફોરવર્ડ કર્યો નથી"</string>
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ફોરવર્ડ કર્યો નથી"</string>
<string name="fcComplete" msgid="3118848230966886575">"સુવિધા કોડ પૂર્ણ."</string>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"સેટિંગ્સ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"સહાય"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"વૉઇસ સહાય"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"હવે લૉક કરો"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"નવું નોટિફિકેશન"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"વર્ચ્યુઅલ કીબોર્ડ"</string>
@@ -276,7 +277,7 @@
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ઑડિઓ રેકોર્ડ કરવાની"</string>
<string name="permgrouprequest_microphone" msgid="8065941268709600606">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને ઑડિઓ રોકૉર્ડ કરવાની મંજૂરી આપો"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"કૅમેરો"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"ચિત્રો લેવાની અને વિડિઓ રેકોર્ડ કરવાની"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"ચિત્રો લેવાની અને વીડિઓ રેકોર્ડ કરવાની"</string>
<string name="permgrouprequest_camera" msgid="810824326507258410">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને ચિત્રો લેવાની અને વીડિઓ રેકૉર્ડ કરવાની મંજૂરી આપો"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ફોન"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ફોન કૉલ કરો અને સંચાલિત કરો"</string>
@@ -391,11 +392,11 @@
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"આ ઍપ્લિકેશન, સેલ ટાવર્સ અને વાઇ-ફાઇ નેટવર્ક્સ જેવા નેટવર્ક સ્રોતોના આધારે તમારું સ્થાન મેળવી શકે છે. ઍપ્લિકેશન દ્વારા આ સ્થાન સેવાઓનો ઉપયોગ કરવામાં સમર્થ થવા માટે તમારા ટીવી પર આ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"આ ઍપ્લિકેશન, સેલ ટાવર્સ અને વાઇ-ફાઇ નેટવર્ક્સ જેવા નેટવર્ક સ્રોતોના આધારે તમારું સ્થાન મેળવી શકે છે. ઍપ્લિકેશન દ્વારા આ સ્થાન સેવાઓનો ઉપયોગ કરવામાં સમર્થ થવા માટે તમારા ફોન પર આ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"તમારી ઑડિઓ સેટિંગ્સ બદલો"</string>
- <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"એપ્લિકેશનને વૈશ્વિક ઑડિઓ સેટિંગ્સને સંશોધિત કરવાની મંજૂરી આપે છે, જેમ કે વોલ્યુમ અને આઉટપુટ માટે કયા સ્પીકરનો ઉપયોગ કરવો."</string>
+ <string name="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">"સિમ ને આદેશો મોકલો"</string>
+ <string name="permdesc_sim_communication" msgid="5725159654279639498">"એપ્લિકેશનને સિમ પરા આદેશો મોકલવાની મંજૂરી આપે છે. આ ખૂબ જ ખતરનાક છે."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ચિત્રો અને વિડિઓઝ લો"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"આ ઍપ્લિકેશન, કૅમેરાનો ઉપયોગ કરીને કોઈપણ સમયે ચિત્રો લઈ અને વિડિઓઝ રેકોર્ડ કરી શકે છે."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"વાઇબ્રેશન નિયંત્રિત કરો"</string>
@@ -504,8 +505,8 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"એપ્લિકેશનને SD કાર્ડ પર લખવાની મંજૂરી આપે છે."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP કૉલ્સ કરો/પ્રાપ્ત કરો"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"એપ્લિકેશનને SIP કૉલ્સ કરવા અને પ્રાપ્ત કરવાની મંજૂરી આપે છે."</string>
- <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"નવા ટેલિકોમ SIM કનેક્શન્સની નોંધણી કરો"</string>
- <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"એપ્લિકેશનને નવા ટેલિકોમ SIM કનેક્શન્સની નોંધણી કરવાની મંજૂરી આપે છે."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"નવા ટેલિકોમ સિમ કનેક્શન્સની નોંધણી કરો"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"એપ્લિકેશનને નવા ટેલિકોમ સિમ કનેક્શન્સની નોંધણી કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_register_call_provider" msgid="108102120289029841">"નવા ટેલિકોમ કનેક્શન્સની નોંધણી કરો"</string>
<string name="permdesc_register_call_provider" msgid="7034310263521081388">"એપ્લિકેશનને નવા ટેલિકોમ કનેક્શન્સની નોંધણી કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ટેલિકોમ કનેક્શન્સ સંચાલિત કરો"</string>
@@ -877,7 +878,7 @@
<string name="minute" msgid="9148878657703769868">"મિનિટ"</string>
<string name="minutes" msgid="5646001005827034509">"મિનિટ"</string>
<string name="second" msgid="3184235808021478">"સે"</string>
- <string name="seconds" msgid="3161515347216589235">"સેકંડ"</string>
+ <string name="seconds" msgid="3161515347216589235">"સેકન્ડ"</string>
<string name="week" msgid="5617961537173061583">"અઠવાડિયું"</string>
<string name="weeks" msgid="6509623834583944518">"અઠવાડિયા"</string>
<string name="year" msgid="4001118221013892076">"વર્ષ"</string>
@@ -948,8 +949,8 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> વર્ષમાં</item>
</plurals>
<string name="VideoView_error_title" msgid="3534509135438353077">"વિડિઓમાં સમસ્યા"</string>
- <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"આ ઉપકરણ પર સ્ટ્રીમ કરવા માટે આ વિડિઓ માન્ય નથી."</string>
- <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"આ વિડિઓ ચલાવી શકતાં નથી."</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"આ ઉપકરણ પર સ્ટ્રીમ કરવા માટે આ વીડિઓ માન્ય નથી."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"આ વીડિઓ ચલાવી શકતાં નથી."</string>
<string name="VideoView_error_button" msgid="2822238215100679592">"ઓકે"</string>
<string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="noon" msgid="7245353528818587908">"બપોરે"</string>
@@ -1077,14 +1078,14 @@
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"બ્લૂટૂથ મારફતે ચાલી રહ્યું છે"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"સાઇલેન્ટ રિંગટોન સેટ કરી"</string>
<string name="volume_call" msgid="3941680041282788711">"ઇન-કૉલ વૉલ્યૂમ"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"બ્લૂટૂથ ઇન-કૉલ વોલ્યુમ"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"બ્લૂટૂથ ઇન-કૉલ વૉલ્યૂમ"</string>
<string name="volume_alarm" msgid="1985191616042689100">"એલાર્મ વૉલ્યૂમ"</string>
<string name="volume_notification" msgid="2422265656744276715">"સૂચના વૉલ્યૂમ"</string>
<string name="volume_unknown" msgid="1400219669770445902">"વૉલ્યૂમ"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"બ્લૂટૂથ વૉલ્યૂમ"</string>
- <string name="volume_icon_description_ringer" msgid="3326003847006162496">"રિંગટોન વોલ્યુમ"</string>
- <string name="volume_icon_description_incall" msgid="8890073218154543397">"કૉલ વોલ્યુમ"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"મીડિયા વોલ્યુમ"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"રિંગટોન વૉલ્યૂમ"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"કૉલ વૉલ્યૂમ"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"મીડિયા વૉલ્યૂમ"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"સૂચના વૉલ્યૂમ"</string>
<string name="ringtone_default" msgid="3789758980357696936">"ડિફોલ્ટ રિંગટોન"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"ડિફૉલ્ટ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1165,11 +1166,11 @@
<string name="sim_done_button" msgid="827949989369963775">"થઈ ગયું"</string>
<string name="sim_added_title" msgid="3719670512889674693">"સિમ કાર્ડ ઉમેર્યો"</string>
<string name="sim_added_message" msgid="6599945301141050216">"મોબાઇલ નેટવર્કને ઍક્સેસ કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો."</string>
- <string name="sim_restart_button" msgid="4722407842815232347">"પુનઃપ્રારંભ કરો"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"તમારું નવું SIM ઠીકથી કામ કરે તે માટે, તમને તમારા કેરીઅર પરથી ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને ખોલવી પડશે."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"રિસ્ટાર્ટ કરો"</string>
+ <string name="carrier_app_dialog_message" msgid="7066156088266319533">"તમારું નવું સિમ ઠીકથી કામ કરે તે માટે, તમને તમારા કેરીઅર પરથી ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને ખોલવી પડશે."</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>
+ <string name="carrier_app_notification_title" msgid="8921767385872554621">"નવું સિમ દાખલ કર્યું"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"તેને સેટ કરવા માટે ટૅપ કરો"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"સમય સેટ કરો"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"તારીખ સેટ કરો"</string>
@@ -1213,7 +1214,7 @@
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ને તૈયાર કરી રહ્યું છે"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ભૂલો માટે તપાસી રહ્યું છે"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"નવું <xliff:g id="NAME">%s</xliff:g> મળ્યું"</string>
- <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ફોટા અને મીડિયા સ્થાનાંતરિત કરવા માટે"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ફોટા અને મીડિયા ટ્રાન્સફર કરવા માટે"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"દૂષિત <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> દૂષિત છે. ઠીક કરવા માટે ટૅપ કરો."</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> દૂષિત છે. સુધારવા માટે પસંદ કરો."</string>
@@ -1446,19 +1447,22 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ખોટી પૅટર્ન"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ખોટો પાસવર્ડ"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"ખોટો પિન"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> સેકંડમાં ફરી પ્રયાસ કરો."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"તમારી પૅટર્ન દોરો"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"સિમ પિન દાખલ કરો"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"પિન દાખલ કરો"</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">"સિમ હવે અક્ષમ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. વિગતો માટે કેરીઅરનો સંપર્ક કરો."</string>
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"જોઈતો પિન કોડ દાખલ કરો"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"જોઈતા પિન કોડની પુષ્ટિ કરો"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"સિમ કાર્ડ અનલૉક કરી રહ્યાં છીએ…"</string>
<string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ખોટો પિન કોડ."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"એક પિન લખો જે 4 થી 8 સંખ્યાનો છે."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"PUK કોડ 8 નંબર્સનો હોવો જોઈએ."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"સાચો PUK કોડ ફરીથી દાખલ કરો. પુનરાવર્તિત પ્રયાસો SIM ને કાયમી રીતે અક્ષમ કરશે."</string>
+ <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>
@@ -1603,7 +1607,7 @@
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> સેકંડમાં ફરીથી પ્રયાસ કરો</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"પછી ફરી પ્રયાસ કરો"</string>
- <string name="immersive_cling_title" msgid="8394201622932303336">"પૂર્ણ સ્ક્રીન જોઈ રહ્યાં છે"</string>
+ <string name="immersive_cling_title" msgid="8394201622932303336">"પૂર્ણ સ્ક્રીન પર જુવો"</string>
<string name="immersive_cling_description" msgid="3482371193207536040">"બહાર નીકળવા માટે, ટોચ પરથી નીચે સ્વાઇપ કરો."</string>
<string name="immersive_cling_positive" msgid="5016839404568297683">"સમજાઈ ગયું"</string>
<string name="done_label" msgid="2093726099505892398">"થઈ ગયું"</string>
@@ -1734,7 +1738,7 @@
<string name="tooltip_popup_title" msgid="5253721848739260181">"ટૂલટિપ"</string>
<string name="app_category_game" msgid="5431836943981492993">"રમતો"</string>
<string name="app_category_audio" msgid="1659853108734301647">"સંગીત અને ઑડિઓ"</string>
- <string name="app_category_video" msgid="2728726078629384196">"મૂવી અને વિડિઓ"</string>
+ <string name="app_category_video" msgid="2728726078629384196">"મૂવી અને વીડિઓ"</string>
<string name="app_category_image" msgid="4867854544519846048">"ફોટા અને છબીઓ"</string>
<string name="app_category_social" msgid="5842783057834965912">"સામાજિક અને સંચાર"</string>
<string name="app_category_news" msgid="7496506240743986873">"સમાચાર અને સામાયિકો"</string>
@@ -1762,7 +1766,7 @@
<string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> અને <xliff:g id="TYPE_1">%2$s</xliff:g>ને <b><xliff:g id="LABEL">%3$s</xliff:g></b>માં સાચવીએ?"</string>
<string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> અને <xliff:g id="TYPE_2">%3$s</xliff:g>ને <b><xliff:g id="LABEL">%4$s</xliff:g></b>માં સાચવીએ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"સાચવો"</string>
- <string name="autofill_save_no" msgid="2625132258725581787">"નહીં આભાર"</string>
+ <string name="autofill_save_no" msgid="2625132258725581787">"ના, આભાર"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"પાસવર્ડ"</string>
<string name="autofill_save_type_address" msgid="4936707762193009542">"સરનામું"</string>
<string name="autofill_save_type_credit_card" msgid="7127694776265563071">"ક્રેડિટ કાર્ડ"</string>
@@ -1774,9 +1778,9 @@
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"કટોકટી સંદેશાઓનું પરીક્ષણ"</string>
<string name="notification_reply_button_accessibility" msgid="3621714652387814344">"જવાબ આપો"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
- <string name="mmcc_authentication_reject" msgid="7729819349669603406">"SIM મંજૂર નથી"</string>
+ <string name="mmcc_authentication_reject" msgid="7729819349669603406">"સિમ મંજૂર નથી"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIMની જોગવાઈ કરી નથી"</string>
- <string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM મંજૂર નથી"</string>
+ <string name="mmcc_illegal_ms" msgid="2769452751852211112">"સિમ મંજૂર નથી"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ફોન મંજૂર નથી"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"પૉપઅપ વિંડો"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index c7d8b1f..3fb8cad 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -45,7 +45,7 @@
<string name="invalidPuk" msgid="8761456210898036513">"ऐसा PUK लिखें जो 8 अंकों या अधिक का हो."</string>
<string name="needPuk" msgid="919668385956251611">"आपका सिम कार्ड PUK लॉक किया गया है. इसे अनलॉक करने के लिए PUK कोड लिखें."</string>
<string name="needPuk2" msgid="4526033371987193070">"सिम कार्ड अनब्लॉक करने के लिए PUK2 लिखें."</string>
- <string name="enablePin" msgid="209412020907207950">"असफल, सिम//RUIM लॉक सक्षम करें."</string>
+ <string name="enablePin" msgid="209412020907207950">"नहीं हो सका, सिम//RUIM लॉक चालू करें."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
<item quantity="one">सिम के लॉक हो जाने से पहले आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> प्रयास शेष हैं.</item>
<item quantity="other">सिम के लॉक हो जाने से पहले आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> प्रयास शेष हैं.</item>
@@ -77,7 +77,7 @@
<string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"कोई भी आपातकालीन कॉलिंग नहीं है"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"कोई वॉइस सेवा नहीं है"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कोई वॉइस/आपातकालीन सेवा नहीं है"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"आपके स्थान के मोबाइल नेटवर्क की ओर से इस समय ऑफ़र नहीं किया जा रहा है"</string>
+ <string name="RestrictedStateContent" msgid="4278821484643362350">"मोबाइल नेटवर्क आपके जगह पर इस समय यह सेवाएं नहीं दे पा रहा"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्क तक नहीं पहुंच पा रहे हैं"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"रिसेप्शन बेहतर करने के लिए, सेटिंग > नेटवर्क और इंटरनेट > मोबाइल नेटवर्क > पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें."</string>
<string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"वाई-फ़ाई कॉलिंग सक्रिय है"</string>
@@ -93,7 +93,7 @@
<string name="peerTtyModeHco" msgid="5728602160669216784">"पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीअो (VCO) का अनुरोध किया"</string>
<string name="peerTtyModeOff" msgid="3280819717850602205">"पीयर ने टेलीटाइपराइटर (TTY) मोड बंद का अनुरोध किया"</string>
- <string name="serviceClassVoice" msgid="1258393812335258019">"ध्वनि"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"आवाज़"</string>
<string name="serviceClassData" msgid="872456782077937893">"डेटा"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"फ़ैक्स"</string>
<string name="serviceClassSMS" msgid="2015460373701527489">"मैसेज (एसएमएस)"</string>
@@ -157,10 +157,10 @@
<string name="contentServiceSync" msgid="8353523060269335667">"समन्वयन"</string>
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"समन्वयन"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"बहुत से <xliff:g id="CONTENT_TYPE">%s</xliff:g> हटाए जाते हैं."</string>
- <string name="low_memory" product="tablet" msgid="6494019234102154896">"टैबलेट मेमोरी भर गया है. स्थान खाली करने के लिए कुछ फ़ाइलें हटाएं."</string>
- <string name="low_memory" product="watch" msgid="4415914910770005166">"घड़ी मेमोरी भर गया है. स्थान खाली करने के लिए कुछ फ़ाइलें हटाएं."</string>
- <string name="low_memory" product="tv" msgid="516619861191025923">"टीवी की मेमोरी पूरी हो गई है. स्थान खाली करने के लिए कुछ फ़ाइलें हटाएं."</string>
- <string name="low_memory" product="default" msgid="3475999286680000541">"फ़ोन मेमोरी भर गया है. स्थान खाली करने के लिए कुछ फ़ाइलें हटाएं."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"टैबलेट की मेमोरी भर गई है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
+ <string name="low_memory" product="watch" msgid="4415914910770005166">"घड़ी की मेमोरी भर गई है. स्थान खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
+ <string name="low_memory" product="tv" msgid="516619861191025923">"टीवी की मेमोरी भर गई है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"फ़ोन मेमोरी भर गयी है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
<item quantity="one">प्रमाणपत्र अनुमतियों को इंस्टॉल किया गया</item>
<item quantity="other">प्रमाणपत्र अनुमतियों को इंस्टॉल किया गया</item>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज़ से डिवाइस का इस्तेमाल"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"अभी लॉक करें"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"नई सूचना"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"वर्चुअल कीबोर्ड"</string>
@@ -259,19 +260,19 @@
<string name="managed_profile_label" msgid="5289992269827577857">"कार्य प्रोफ़ाइल में स्विच करें"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"अपने संपर्कों को ऐक्सेस करने की"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने संपर्क एक्सेस करने दें"</string>
- <string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"इस डिवाइस के स्थान को ऐक्सेस करने"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को इस डिवाइस का स्थान एक्सेस करने दें"</string>
+ <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने संपर्क तक पहुंचने दें"</string>
+ <string name="permgrouplab_location" msgid="7275582855722310164">"जगह"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"इस डिवाइस की जगह तक पहुंचने दें"</string>
+ <string name="permgrouprequest_location" msgid="8903573681261610809">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को इस डिवाइस की जगह तक पहुंचने दें"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कैलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"अपने कैलेंडर को ऐक्सेस करने"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपना कैलेंडर एक्सेस करने दें"</string>
+ <string name="permgrouprequest_calendar" msgid="6704529828699071445">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपना कैलेंडर तक पहुंचने दें"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"मैसेज (एसएमएस)"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"मैसेज (एसएमएस) भेजें और देखें"</string>
<string name="permgrouprequest_sms" msgid="605618939583628306">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को मैसेज (एसएमएस) भेजने और देखने दें"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"मेमोरी"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करने की"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने डिवाइस पर फ़ोटो, मीडिया और फ़ाइलें एक्सेस करने दें"</string>
+ <string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने डिवाइस पर फ़ोटो, मीडिया और फ़ाइलों तक पहुंचने दें"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफ़ोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ऑडियो रिकॉर्ड करें"</string>
<string name="permgrouprequest_microphone" msgid="8065941268709600606">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को ऑडियो रिकॉर्ड करने दें"</string>
@@ -283,7 +284,7 @@
<string name="permgrouprequest_phone" msgid="7084161459732093690">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को फ़ोन कॉल करने और संभालने दें"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"शरीर संवेदक"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा को ऐक्सेस करें"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा एक्सेस करने दें"</string>
+ <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने अहम संकेतों के बारे में सेंसर डेटा का इस्तेमाल करने दें"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो सामग्री प्राप्त करें"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"उस विंडो की सामग्री का निरीक्षण करें जिससे आप सहभागिता कर रहे हैं."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छूकर, उससे जुड़ी जानकारी सुनने की सुविधा चालू करें"</string>
@@ -332,7 +333,7 @@
<string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"ऐप्स को प्रोफ़ाइल स्वामी और डिवाइस स्वामी सेट करने दें."</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"चल रहे ऐप्स पुन: क्रमित करें"</string>
<string name="permdesc_reorderTasks" msgid="7734217754877439351">"ऐप्स को कार्यों को अग्रभूमि और पृष्ठभूमि पर ले जाने देता है. ऐप्स आपके इनपुट के बिना यह कर सकता है."</string>
- <string name="permlab_enableCarMode" msgid="5684504058192921098">"कार मोड सक्षम करें"</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"कार मोड चालू करें"</string>
<string name="permdesc_enableCarMode" msgid="4853187425751419467">"ऐप्स को कार मोड सक्षम करने देता है."</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"अन्य ऐप्स बंद करें"</string>
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ऐप्स को अन्य ऐप्स की पृष्ठभूमि प्रक्रियाओं को समाप्त करने देता है. यह अन्य ऐप्स का चलना रोक सकता है."</string>
@@ -346,14 +347,14 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ऐप्स को मेमोरी में स्वयं के कुछ हिस्सों को लगातार बनाने की अनुमति देता है. यह अन्य ऐप्स के लिए उपलब्ध स्मृति को सीमित कर टैबलेट को धीमा कर सकता है."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ऐप को मेमोरी में स्वयं के दीर्घस्थायी भाग बनाने देती है. इससे अन्य ऐप्स के लिए उपलब्ध मेमोरी सीमित हो सकती है जिससे टीवी धीमा हो सकता है."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ऐप्स को मेमोरी में स्वयं के कुछ हिस्सों को लगातार बनाने देता है. यह अन्य ऐप्स के लिए उपलब्ध स्मृति को सीमित कर फ़ोन को धीमा कर सकता है."</string>
- <string name="permlab_getPackageSize" msgid="7472921768357981986">"ऐप्स मेमोरी स्थान मापें"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"ऐप्स को उसका कोड, डेटा, और संचय आकारों को प्राप्त करने देता है"</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"पता करें कि ऐप मेमोरी में कितनी जगह है"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"ऐप को उसका कोड, डेटा, और कैश मेमोरी के आकारों को फिर से पाने देता है"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"सिस्टम सेटिंग बदलें"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"ऐप्स को सिस्टम सेटिंग डेटा संशोधित करने देता है. दुर्भावनापूर्ण ऐप्स आपके सिस्टम के कॉन्फ़िगरेशन को दूषित कर सकते हैं."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"प्रारंभ होने पर चलाएं"</string>
<string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"ऐप्स को सिस्टम द्वारा बूटिंग पूर्ण करते ही स्वतः आरंभ करने देता है. इससे टैबलेट को आरंभ होने में अधिक समय लग सकता है और ऐप्स को निरंतर चलाकर संपूर्ण टैबलेट को धीमा करने देता है."</string>
- <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"ऐप्स को सिस्टम का बूट होना पूर्ण होते ही स्वत: प्रारंभ होने देती है. इससे टीवी को प्रारंभ होने में अधिक समय लग सकता है और ऐप के हमेशा चलने से संपूर्ण टैबलेट धीमा हो सकता है."</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"ऐप्स को सिस्टम द्वारा बूटिंग पूर्ण करते ही स्वतः प्रारंभ होने देता है. इससे फ़ोन को प्रारंभ होने में अधिक समय लग सकता है और ऐप्स के निरंतर चलते रहने से संपूर्ण फ़ोन प्रक्रियाएं धीमी हो सकती हैं."</string>
+ <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"सिस्टम के चालू होते ही ऐप को अपने आप शुरू होने देती है. इससे टीवी को चालू होने में ज़्यादा समय लग सकता है और ऐप के लगातार चलते रहने से पूरा टैबलेट धीमा हो सकता है."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"सिस्टम के चालू होते ही ऐप को अपने आप शुरू होने देती है. इससे फ़ोन को चालू होने में ज़्यादा समय लग सकता है और ऐप के लगातार चलते रहने से पूरा फ़ोन धीमा हो सकता है."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"स्टिकी प्रसारण भेजें"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"ऐप्स को स्टिकी प्रसारण भेजने देता है, जो प्रसारण समाप्त होने के बाद भी बने रहते हैं. अत्यधिक उपयोग, टैबलेट की बहुत अधिक मेमोरी का उपयोग करके उसे धीमा या अस्थिर कर सकता है."</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"ऐप को स्िटकी प्रसारण भेजने देती है, जो प्रसारण बंद होने के बाद भी बने रहते हैं. अत्यधिक उपयोग से टीवी धीमा या अस्थिर हो सकता है जिससे वह बहुत सारी मेमोरी का उपयोग कर सकता है."</string>
@@ -372,8 +373,8 @@
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"एेप को आने वाला कॉल (इनकमिंग) और किया जाने वाला कॉल (आउटगोइंग) डेटा सहित, आपके टैबलेट के कॉल लॉग को बदलने की अनुमति देता है. धोखा देने वाले एेप, इसका इस्तेमाल करके आपके कॉल लॉग को मिटा या बदल सकते हैं."</string>
<string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"एेप को आने वाला कॉल (इनकमिंग) और किया जाने वाला कॉल (आउटगोइंग) डेटा सहित, आपके टीवी के कॉल लॉग को बदलने की अनुमति देता है. धोखा देने वाले एेप, इसका इस्तेमाल करके आपके कॉल लॉग को मिटा या बदल सकते हैं."</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"एेप को आने वाला कॉल (इनकमिंग) और किया जाने वाला कॉल (आउटगोइंग) डेटा सहित, आपके फ़ोन के कॉल लॉग को बदलने की अनुमति देता है. धोखा देने वाले एेप, इसका इस्तेमाल करके आपके कॉल लॉग को मिटा या बदल सकते हैं."</string>
- <string name="permlab_bodySensors" msgid="4683341291818520277">"शरीर संवेदक एक्सेस करें (जैसे हृदय गति मॉनीटर)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ऐप को आपकी शारीरिक स्थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले संवेदकों का डेटा एक्सेस करने देती है."</string>
+ <string name="permlab_bodySensors" msgid="4683341291818520277">"शरीर के लिए बने सेंसर (जैसे हृदय गति मॉनीटर) को एक्सेस करें"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ऐप को आपकी शारीरिक स्थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले सेंसर के डेटा तक पहुंचने देती है."</string>
<string name="permlab_readCalendar" msgid="6716116972752441641">"कैलेंडर इवेंट और विवरण पढ़ें"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"यह ऐप्लिकेशन आपके टैबलेट पर संग्रहित सभी कैलेंडर इवेंट पढ़ सकता है और आपका कैलेंडर डेटा साझा कर सकता है या सहेज सकता है."</string>
<string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"यह ऐप्लिकेशन आपके टीवी पर संग्रहित सभी कैलेंडर इवेंट पढ़ सकता है और आपका कैलेंडर डेटा साझा कर सकता है या सहेज सकता है."</string>
@@ -382,14 +383,14 @@
<string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"यह ऐप्लिकेशन आपके टैबलेट पर मौजूद कैलेंडर इवेंट जोड़, निकाल या बदल सकता है. यह ऐप्लिकेशन ऐसे संदेश भेज सकता है जो कैलेंडर स्वामियों से आए हुए लग सकते हैं या यह स्वामियों को सूचित किए बिना इवेंट में बदलाव कर सकता है."</string>
<string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"यह ऐप्लिकेशन आपके टीवी पर मौजूद कैलेंडर इवेंट जोड़, निकाल या बदल सकता है. यह ऐप्लिकेशन ऐसे संदेश भेज सकता है जो कैलेंडर स्वामियों से आए हुए लग सकते हैं या यह स्वामियों को सूचित किए बिना इवेंट में बदलाव कर सकता है."</string>
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"यह ऐप्लिकेशन आपके फ़ोन पर मौजूद कैलेंडर इवेंट जोड़, निकाल या बदल सकता है. यह ऐप्लिकेशन ऐसे संदेश भेज सकता है जो कैलेंडर स्वामियों से आए हुए लग सकते हैं या यह स्वामियों को सूचित किए बिना इवेंट में बदलाव कर सकता है."</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"कुछ और जगह बताने वाले आदेशों का एक्सेस"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ऐप को कुछ और जगह बताने वाले आदेशों का एक्सेस देता है. इससे ऐप GPS या और स्थान स्रोतों के काम में रोक-टोक कर सकता है."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"सटीक स्थान एक्सेस करें (GPS और नेटवर्क-आधारित)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"यह ऐप्लिकेशन सेल टॉवर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों या GPS के आधार पर आपका स्थान पता कर सकता है. ये स्थान सेवाएं आपके फ़ोन पर चालू और उपलब्ध होनी चाहिए ताकि ऐप्लिकेशन उनका उपयोग कर सके. इससे बैटरी की खपत बढ़ सकती है."</string>
- <string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"अनुमानित स्थान एक्सेस करें (नेटवर्क-आधारित)"</string>
- <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"यह ऐप्लिकेशन सेल टॉवर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों के आधार पर आपका स्थान पता कर सकता है. ये स्थान सेवाएं आपके टैबलेट पर चालू और उपलब्ध होनी चाहिए ताकि ऐप्लिकेशन उनका उपयोग कर सके."</string>
- <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"यह ऐप्लिकेशन सेल टॉवर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों के आधार पर आपका स्थान पता कर सकता है. ये स्थान सेवाएं आपके टीवी पर चालू और उपलब्ध होनी चाहिए ताकि ऐप्लिकेशन उनका उपयोग कर सके."</string>
- <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"यह ऐप्लिकेशन सेल टॉवर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों के आधार पर आपका स्थान पता कर सकता है. ये स्थान सेवाएं आपके फ़ोन पर चालू और उपलब्ध होनी चाहिए ताकि ऐप्लिकेशन उनका उपयोग कर सके."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"कुछ और जगह बताने वाले आदेशों तक पहुंच"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ऐप को कुछ और जगह की जानकारी देने वाले आदेशों की पहुंच पाने देता है. इससे ऐप जीपीएस या जगह की जानकारी देने वाले दूसरे स्रोतों के काम में रोक-टोक कर सकता है."</string>
+ <string name="permlab_accessFineLocation" msgid="251034415460950944">"सटीक जगह की जानकारी लेने दें (जीपीएस और नेटवर्क-आधारित)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों या जीपीएस के आधार पर आपकी जगह पता कर सकता है. जगह की जानकारी आपके फ़ोन पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके. इससे ज़्यादा बैटरी खर्च हो सकती है."</string>
+ <string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"अनुमानित जगह की पहुंच दें (नेटवर्क-आधारित)"</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क के स्रोतों के आधार पर आपकी जगह का पता कर सकता है. ये जगह की जानकारी आपके टैबलेट पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके."</string>
+ <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क के स्रोतों के आधार पर आपकी जगह का पता कर सकता है. ये जगह की जानकारी आपके टीवी पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके."</string>
+ <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क के स्रोतों के आधार पर आपकी जगह का पता कर सकता है. ये जगह की जानकारी आपके फ़ोन पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"अपनी ऑडियो सेटिंग बदलें"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ऐप्स को वैश्विक ऑडियो सेटिंग, जैसे वॉल्यूम और कौन-सा स्पीकर आउटपुट के लिए उपयोग किया गया, संशोधित करने देता है."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ऑडियो रिकॉर्ड करने"</string>
@@ -409,7 +410,7 @@
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"सिस्टम के माध्यम से कॉल रूट करें"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"कॉल करने के अनुभव को बेहतर बनाने के लिए ऐप्लिकेशन को सिस्टम के माध्यम से उसके कॉल रूट करने देती है."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"फ़ोन नंबर पढ़ना"</string>
- <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ऐप्लिकेशन को डिवाइस के फ़ोन नंबर एक्सेस करने देती है."</string>
+ <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ऐप को डिवाइस के फ़ोन नंबर का इस्तेमाल करने देती है."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टैबलेट को सोने (कम बैटरी मोड) से रोकें"</string>
<string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"टीवी को सोने (कम बैटरी मोड) से रोकें"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"टीवी को सोने (कम बैटरी मोड) से रोकें"</string>
@@ -434,8 +435,8 @@
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"ऐप्स को फ़ोन द्वारा ज्ञात खातों की सूची प्राप्त करने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्हें आपके द्वारा इंस्टॉल किए गए ऐप्स ने बनाया है."</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"नेटवर्क कनेक्शन देखें"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"ऐप को नेटवर्क कनेक्शन के बारे में जानकारी देखने देता है, जैसे कौन से नेटवर्क मौजूद हैं और कनेक्ट हैं."</string>
- <string name="permlab_createNetworkSockets" msgid="7934516631384168107">"पूर्ण नेटवर्क एक्सेस पाएं"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"ऐप्स को नेटवर्क सॉकेट बनाने और कस्टम नेटवर्क प्रोटोकॉल का उपयोग करने देता है. ब्राउज़र और अन्य ऐप्स इंटरनेट को डेटा भेजने के साधन उपलब्ध कराते हैं, ताकि इंटरनेट को डेटा भेजने के लिए इस अनुमति की आवश्यकता नहीं हो."</string>
+ <string name="permlab_createNetworkSockets" msgid="7934516631384168107">"नेटवर्क को पूरी तरह इस्तेमाल करें"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"ऐप को नेटवर्क सॉकेट बनाने और मन मुताबिक नेटवर्क प्रोटोकॉल का इस्तेमाल करने देता है. ब्राउज़र और अन्य ऐप से इंटरनेट को डेटा भेजने के तरीके मिलते हैं, ताकि इंटरनेट को डेटा भेजने के लिए इस अनुमति की ज़रुरत न पड़े."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"नेटवर्क कनेक्टिविटी बदलें"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"ऐप्स को नेटवर्क कनेक्टिविटी की स्थिति बदलने देता है."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"टेदर की गई कनेक्टिविटी बदलें"</string>
@@ -498,8 +499,8 @@
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"अपने SD कार्ड की सामग्री पढ़ें"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"एप्लिकेशन को आपके USB मेमोरी की सामग्री पढ़ने की अनुमति देता है."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"एप्लिकेशन को आपके SD कार्ड की सामग्री पढ़ने की अनुमति देता है."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"अपने USB मेमोरी की सामग्री बदलें या हटाएं"</string>
- <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"अपने SD कार्ड की सामग्री बदलें या हटाएं"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"अपने USB मेमोरी की सामग्री बदलें या मिटाएं"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"अपने SD कार्ड की सामग्री बदलें या मिटाएं"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"ऐप्स को USB मेमोरी में लिखने देता है."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ऐप्स को SD कार्ड पर लिखने देता है."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP कॉल करें/प्राप्त करें"</string>
@@ -526,8 +527,8 @@
<string name="permdesc_accessNotifications" msgid="458457742683431387">"ऐप को सूचना पाने, जांच करने और साफ़ करने देता है, जिनमें अन्य ऐप के ज़रिए पोस्ट की गई सूचनाएं भी शामिल हैं."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"सूचना श्रवणकर्ता सेवा से जुड़ें"</string>
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"उपयोगकर्ता को सूचना सुनने वाली सेवा के सबसे बेहतर इंटरफ़ेस से जुड़ने देती है. सामान्य ऐप के लिए कभी भी इसकी ज़रुरत नहीं होगी."</string>
- <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"किसी स्थिति प्रदाता सेवा से आबद्ध हों"</string>
- <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"धारक को किसी स्थिति प्रदाता सेवा के शीर्ष-स्तर के इंटरफ़ेस से आबद्ध होने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"किसी शर्तें लागू करने वाली (कंडीशन प्रोवाइडर) सेवा से जुड़ें"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"उपयोगकर्ता को किसी शर्तें लागू करने वाले (कंडीशन प्रोवाइडर) सबसे बढ़िया इंटरफ़ेस से जोड़ता है. सामान्य ऐप के लिए इसकी कभी ज़रूरत नहीं होती."</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"भावी सेवा से आबद्ध करें"</string>
<string name="permdesc_bindDreamService" msgid="7325825272223347863">"धारक को किसी भावी सेवा के शीर्ष-स्तर इंटरफ़ेस से आबद्ध होने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
<string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी से पाया गया कॉन्फ़िगरेशन ऐप शुरु करें."</string>
@@ -546,7 +547,7 @@
<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="permlab_access_notification_policy" msgid="4247510821662059671">"\'परेशान न करें\' को ऐक्सेस करें"</string>
<string name="permdesc_access_notification_policy" msgid="3296832375218749580">"ऐप को परेशान न करें कॉन्फ़िगरेशन पढ़ने और लिखने देती है."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"पासवर्ड नियम सेट करें"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"स्क्रीन लॉक पासवर्ड तथा पिन की लंबाई और उसमें अनुमत वर्णों को नियंत्रित करें."</string>
@@ -561,7 +562,7 @@
<string name="policydesc_resetPassword" msgid="1278323891710619128">"स्क्रीन लॉक को बदलें."</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"स्क्रीन लॉक करें"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"नियंत्रित करें कि स्क्रीन कैसे और कब लॉक हो."</string>
- <string name="policylab_wipeData" msgid="3910545446758639713">"सभी डेटा हटाएं"</string>
+ <string name="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>
@@ -570,7 +571,7 @@
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"इस टीवी पर मौजूद इस उपयोगकर्ता का डेटा बिना चेतावनी के मिटा दें."</string>
<string name="policydesc_wipeData_secondaryUser" product="default" msgid="6787904546711590238">"इस फ़ोन पर मौजूद इस उपयोगकर्ता का डेटा बिना चेतावनी के मिटा दें."</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"डिवाइस वैश्विक प्रॉक्सी सेट करें"</string>
- <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"नीति सक्षम होने के दौरान डिवाइस वैश्विक प्रॉक्सी सेट करें. केवल डिवाइस स्वामी ही वैश्विक प्रॉक्सी सेट कर सकता है."</string>
+ <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"नीति चालू होने के दौरान इस्तेमाल करने के लिए डिवाइस ग्लोबल प्रॉक्सी सेट करें. केवल डिवाइस का मालिक ही ग्लोबल प्रॉक्सी सेट कर सकता है."</string>
<string name="policylab_expirePassword" msgid="5610055012328825874">"स्क्रीन लॉक पासवर्ड समाप्ति सेट करें"</string>
<string name="policydesc_expirePassword" msgid="5367525762204416046">"यह बदलें कि स्क्रीन लॉक पासवर्ड, पिन या पैटर्न को कितने समय में बदला जाना चाहिए."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"मेमोरी को सुरक्षित करने का तरीका सेट करें"</string>
@@ -587,7 +588,7 @@
<item msgid="1735177144948329370">"घर का फ़ैक्स"</item>
<item msgid="603878674477207394">"पेजर"</item>
<item msgid="1650824275177931637">"अन्य"</item>
- <item msgid="9192514806975898961">"कस्टम"</item>
+ <item msgid="9192514806975898961">"अपने मुताबिक बदलें"</item>
</string-array>
<string-array name="emailAddressTypes">
<item msgid="8073994352956129127">"घर"</item>
@@ -599,7 +600,7 @@
<item msgid="6880257626740047286">"घर"</item>
<item msgid="5629153956045109251">"कार्यालय"</item>
<item msgid="4966604264500343469">"अन्य"</item>
- <item msgid="4932682847595299369">"कस्टम"</item>
+ <item msgid="4932682847595299369">"अपने मुताबिक बदलें"</item>
</string-array>
<string-array name="imAddressTypes">
<item msgid="1738585194601476694">"घर"</item>
@@ -722,7 +723,7 @@
<string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"कोई सिमकार्ड डालें."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"सिम कार्ड गुम है या पढ़ने योग्य नहीं है. कोई सिम कार्ड डालें."</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"अनुपयोगी सिम कार्ड."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"आपका सिम कार्ड स्थायी रूप से अक्षम कर दिया गया है.\n दूसरे सिम कार्ड के लिए अपने वायरलेस सेवा प्रदाता से संपर्क करें."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"आपका सिम कार्ड हमेशा के लिए बंद कर दिया गया है.\n दूसरे सिम कार्ड के लिए अपने वायरलेस सेवा देने वाले से संपर्क करें."</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"पिछला ट्रैक"</string>
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"अगला ट्रैक"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"रोकें"</string>
@@ -752,10 +753,10 @@
<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>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"साइन इन करें"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"उपयोगकर्ता नाम या पासवर्ड गलत है."</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"अपना उपयोगकर्ता नाम या पासवर्ड भूल गए?\n "<b>"google.com/accounts/recovery"</b>" पर जाएं."</string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"जांच रहा है…"</string>
@@ -781,7 +782,7 @@
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट फिर से क्रमित करना प्रारंभ."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट फिर से क्रमित करना समाप्त."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> को हटा दिया गया."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलॉक क्षेत्र विस्तृत करें."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलॉक क्षेत्र का विस्तार करें."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"स्लाइड अनलॉक."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"आकार अनलॉक."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"मालिक का चेहरा पहचानकर अनलॉक करें."</string>
@@ -836,8 +837,8 @@
<string name="permdesc_setAlarm" msgid="316392039157473848">"ऐप्स को इंस्टॉल किए गए अलार्म घड़ी ऐप्स में अलार्म सेट करने देता है. हो सकता है कुछ अलार्म घड़ी ऐप्स में यह सुविधा न हो."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"ध्वनिमेल जोड़ें"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"ऐप्स को आपके ध्वनिमेल इनबॉक्स में संदेश जोड़ने देता है."</string>
- <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"ब्राउज़र भौगोलिक-स्थान अनुमतियों को बदलें"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"ऐप को ब्राउज़र की जगह से जुड़ी अनुमतियों को बदलने देता है. धोखा देने वाले ऐप इसका इस्तेमाल गलत वेबसाइट को स्थान (लोकेशन) की जानकारी भेजने में कर सकते हैं."</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_notnow" msgid="6389675316706699758">"रद्द करें"</string>
<string name="save_password_remember" msgid="6491879678996749466">"याद रखें"</string>
@@ -848,7 +849,7 @@
<string name="prepend_shortcut_label" msgid="2572214461676015642">"मेन्यू+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
- <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"हटाएं"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"मिटाएं"</string>
<string name="search_go" msgid="8298016669822141719">"सर्च करें"</string>
<string name="search_hint" msgid="1733947260773056054">"सर्च करें…"</string>
<string name="searchview_description_search" msgid="6749826639098512120">"सर्च करें"</string>
@@ -856,16 +857,16 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"क्वेरी साफ़ करें"</string>
<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_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="oneMonthDurationPast" msgid="7396384508953779925">"1 माह पहले"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 माह से पहले"</string>
<plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
<item quantity="one">पिछले <xliff:g id="COUNT_1">%d</xliff:g> दिनों में</item>
<item quantity="other">पिछले <xliff:g id="COUNT_1">%d</xliff:g> दिनों में</item>
</plurals>
- <string name="last_month" msgid="3959346739979055432">"पिछला माह"</string>
+ <string name="last_month" msgid="3959346739979055432">"पिछला महीना"</string>
<string name="older" msgid="5211975022815554840">"इससे पुराना"</string>
<string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> को"</string>
<string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g> पर"</string>
@@ -965,7 +966,7 @@
<string name="paste" msgid="5629880836805036433">"चिपकाएं"</string>
<string name="paste_as_plain_text" msgid="5427792741908010675">"सादे पाठ के रूप में चिपकाएं"</string>
<string name="replace" msgid="5781686059063148930">"बदलें•"</string>
- <string name="delete" msgid="6098684844021697789">"हटाएं"</string>
+ <string name="delete" msgid="6098684844021697789">"मिटाएं"</string>
<string name="copyUrl" msgid="2538211579596067402">"यूआरएल को कॉपी करें"</string>
<string name="selectTextMode" msgid="1018691815143165326">"लेख को चुनें"</string>
<string name="undo" msgid="7905788502491742328">"वापस लाएं"</string>
@@ -973,14 +974,14 @@
<string name="autofill" msgid="3035779615680565188">"ऑटोमैटिक भरना"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"लेख चयन"</string>
<string name="addToDictionary" msgid="4352161534510057874">"शब्दकोश में जोड़ें"</string>
- <string name="deleteText" msgid="6979668428458199034">"हटाएं"</string>
+ <string name="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="4204975095406423102">"फ़ोन"</string>
<string name="map" msgid="6068210738233985748">"मानचित्र"</string>
<string name="browse" msgid="6993590095938149861">"ब्राउज़र"</string>
- <string name="low_internal_storage_view_title" msgid="5576272496365684834">"मेमोरी स्थान समाप्त हो रहा है"</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>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> चल रहा है"</string>
@@ -999,24 +1000,24 @@
<string name="whichViewApplication" msgid="3272778576700572102">"इसमें खोलें"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s में खोलें"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोलें"</string>
- <string name="whichEditApplication" msgid="144727838241402655">"इसके द्वारा संपादित करें"</string>
- <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s से संपादित करें"</string>
- <string name="whichEditApplicationLabel" msgid="7183524181625290300">"संपादित करें"</string>
+ <string name="whichEditApplication" msgid="144727838241402655">"इसके ज़रिये बदलाव करें"</string>
+ <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s की मदद से बदलाव करें"</string>
+ <string name="whichEditApplicationLabel" msgid="7183524181625290300">"बदलाव करें"</string>
<string name="whichSendApplication" msgid="6902512414057341668">"इससे साझा करें"</string>
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$s से साझा करें"</string>
<string name="whichSendApplicationLabel" msgid="4579076294675975354">"साझा करें"</string>
<string name="whichSendToApplication" msgid="8272422260066642057">"इसका उपयोग करके भेजें"</string>
<string name="whichSendToApplicationNamed" msgid="7768387871529295325">"%1$s का उपयोग करके भेजें"</string>
<string name="whichSendToApplicationLabel" msgid="8878962419005813500">"भेजें"</string>
- <string name="whichHomeApplication" msgid="4307587691506919691">"होम ऐप्स चुनें"</string>
- <string name="whichHomeApplicationNamed" msgid="4493438593214760979">"होम के रूप में %1$s का उपयोग करें"</string>
+ <string name="whichHomeApplication" msgid="4307587691506919691">"होम ऐप चुनें"</string>
+ <string name="whichHomeApplicationNamed" msgid="4493438593214760979">"होम पेज के के तौर पर %1$s का इस्तेमाल करें"</string>
<string name="whichHomeApplicationLabel" msgid="809529747002918649">"चित्र कैप्चर करें"</string>
<string name="whichImageCaptureApplication" msgid="3680261417470652882">"चित्र को इसके साथ कैप्चर करें"</string>
<string name="whichImageCaptureApplicationNamed" msgid="8619384150737825003">"%1$s के साथ चित्र कैप्चर करें"</string>
<string name="whichImageCaptureApplicationLabel" msgid="6390303445371527066">"चित्र कैप्चर करें"</string>
<string name="alwaysUse" msgid="4583018368000610438">"इस कार्रवाई के लिए डिफ़ॉल्ट के तौर पर इस्तेमाल करें"</string>
<string name="use_a_different_app" msgid="8134926230585710243">"किसी भिन्न ऐप्स का उपयोग करें"</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"सिस्टम सेटिंग > Apps > डाउनलोड किए गए में डिफ़ॉल्ट साफ करें."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"सिस्टम सेटिंग और डाउनलोड किए गए एेप में डिफ़ॉल्ट साफ़ करें."</string>
<string name="chooseActivity" msgid="7486876147751803333">"कोई कार्रवाई चुनें"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"USB डिवाइस के लिए कोई ऐप्स चुनें"</string>
<string name="noApplications" msgid="2991814273936504689">"कोई भी ऐप्स यह कार्यवाही नहीं कर सकता."</string>
@@ -1044,7 +1045,7 @@
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> को वास्तविक रूप से लॉन्च किया गया था."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"स्केल"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"हमेशा दिखाएं"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"इसे सिस्टम सेटिंग > Apps > डाउनलोड किए गए में पुन: सक्षम करें."</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"इसे सिस्टम सेटिंग > ऐप > डाउनलोड किए गए में फिर से चालू करें."</string>
<string name="unsupported_display_size_message" msgid="6545327290756295232">"<xliff:g id="APP_NAME">%1$s</xliff:g> वर्तमान स्क्रीन के आकार की सेटिंग का समर्थन नहीं करता है और अनपेक्षित रूप से व्यवहार कर सकता है."</string>
<string name="unsupported_display_size_show" msgid="7969129195360353041">"हमेशा दिखाएं"</string>
<string name="smv_application" msgid="3307209192155442829">"ऐप्स <xliff:g id="APPLICATION">%1$s</xliff:g> (प्रक्रिया <xliff:g id="PROCESS">%2$s</xliff:g>) ने उसकी स्वयं लागू होने वाली StrictMode नीति का उल्लंघन किया है."</string>
@@ -1108,14 +1109,14 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सभी नेटवर्क देखने के लिए यहां पर टैप करें"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करें"</string>
<string name="wifi_available_action_all_networks" msgid="1100098935861622985">"सभी नेटवर्क"</string>
- <string name="wifi_available_sign_in" msgid="9157196203958866662">"वाई-फ़ाई नेटवर्क में प्रवेश करें"</string>
- <string name="network_available_sign_in" msgid="1848877297365446605">"नेटवर्क में प्रवेश करें"</string>
+ <string name="wifi_available_sign_in" msgid="9157196203958866662">"वाई-फ़ाई नेटवर्क में साइन इन करें"</string>
+ <string name="network_available_sign_in" msgid="1848877297365446605">"नेटवर्क में साइन इन करें"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
<string name="wifi_no_internet" msgid="8451173622563841546">"वाई-फ़ाई में कोई इंटरनेट ऐक्सेस नहीं है"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पों के लिए टैप करें"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> पर ले जाया गया"</string>
- <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> में कोई इंटरनेट एक्सेस नहीं होने पर डिवाइस <xliff:g id="NEW_NETWORK">%1$s</xliff:g> का उपयोग करता है. शुल्क लिया जा सकता है."</string>
+ <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> में कोई इंटरनेट की सुविधा नहीं होने पर डिवाइस <xliff:g id="NEW_NETWORK">%1$s</xliff:g> का इस्तेमाल करता है. इसके लिए शुल्क लिया जा सकता है."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> से <xliff:g id="NEW_NETWORK">%2$s</xliff:g> पर ले जाया गया"</string>
<string-array name="network_switch_type_name">
<item msgid="3979506840912951943">"मोबाइल डेटा"</item>
@@ -1205,7 +1206,7 @@
<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_group_name" msgid="1463953341148606396">"दूसरे ऐप्लिकेशन के ऊपर दिखाएं"</string>
+ <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"दूसरे ऐप के ऊपर दिखाएं"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप्लिकेशन के ऊपर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप पर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें."</string>
@@ -1236,7 +1237,7 @@
<string name="ext_media_move_success_title" msgid="8575300932957954671">"ले जाना पूर्ण हुआ"</string>
<string name="ext_media_move_success_message" msgid="4199002148206265426">"डेटा को <xliff:g id="NAME">%s</xliff:g> पर ले जाया गया"</string>
<string name="ext_media_move_failure_title" msgid="7613189040358789908">"डेटा नहीं ले जाया जा सका"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"डेटा मूल स्थान पर छूट गया है"</string>
+ <string name="ext_media_move_failure_message" msgid="1978096440816403360">"डेटा शुरुआती जगह पर छूट गया है"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"निकाल दिया गया"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"निकाला गया"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"जांच की जा रही है..."</string>
@@ -1266,11 +1267,11 @@
<string name="ime_action_send" msgid="2316166556349314424">"भेजें"</string>
<string name="ime_action_next" msgid="3138843904009813834">"आगे"</string>
<string name="ime_action_done" msgid="8971516117910934605">"पूर्ण"</string>
- <string name="ime_action_previous" msgid="1443550039250105948">"पिछला"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"पीछे जाएं"</string>
<string name="ime_action_default" msgid="2840921885558045721">"निष्पादित करें"</string>
<string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> के उपयोग द्वारा \n नंबर डायल करें"</string>
<string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> का उपयोग करके\n संपर्क बनाएं"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"इनमें से एक या अधिक ऐप, अभी और आने वाले समय में आपके खाते को एक्सेस करने की अनुमति चाहते हैं."</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"इनमें से एक या अधिक ऐप, अभी और आने वाले समय में आपके खाते तक पहुंचने की अनुमति चाहते हैं."</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>
@@ -1324,14 +1325,14 @@
<string name="websearch" msgid="4337157977400211589">"वेब सर्च"</string>
<string name="find_next" msgid="5742124618942193978">"आगे ढूंढें"</string>
<string name="find_previous" msgid="2196723669388360506">"पिछला ढूंढें"</string>
- <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> ने स्थान (लोकेशन) का अनुरोध किया गया है"</string>
- <string name="gpsNotifTitle" msgid="5446858717157416839">"स्थान (लोकेशन) का अनुरोध किया जा रहा है"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> ने जगह का अनुरोध किया गया है"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"जगह का अनुरोध किया जा रहा है"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) द्वारा अनुरोधित"</string>
<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="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> खाते के <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> आइटम हटा दिए गए हैं. आप क्या करना चाहते हैं?"</string>
- <string name="sync_really_delete" msgid="2572600103122596243">"आइटम हटाएं"</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>
<string name="choose_account_label" msgid="5655203089746423927">"खाता चुनें"</string>
@@ -1357,7 +1358,7 @@
<string name="date_picker_next_month_button" msgid="5559507736887605055">"अगला महीना"</string>
<string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
<string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रद्द करें"</string>
- <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"हटाएं"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"मिटाएं"</string>
<string name="keyboardview_keycode_done" msgid="1992571118466679775">"पूर्ण"</string>
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mode change"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
@@ -1379,7 +1380,7 @@
<string name="storage_usb_drive" msgid="6261899683292244209">"USB डिस्क"</string>
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB डिस्क"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB मेमोरी"</string>
- <string name="extract_edit_menu_button" msgid="8940478730496610137">"संपादित करें"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"बदलाव करें"</string>
<string name="data_usage_warning_title" msgid="3620440638180218181">"डेटा खर्च की चेतावनी"</string>
<string name="data_usage_warning_body" msgid="6660692274311972007">"उपयोग व सेटिंग देखने हेतु टैप करें."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G डेटा सीमा पूर्ण हो गई"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत आकार"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"अपना आकार आरेखित करें"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"सिम PIN डालें"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN डालें"</string>
@@ -1461,10 +1465,10 @@
<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>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन करें"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"उपयोगकर्ता नाम या पासवर्ड गलत है"</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"अपना उपयोगकर्ता नाम या पासवर्ड भूल गए?\n "<b>"google.com/accounts/recovery"</b>" पर जाएं."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"खाते की जांच की जा रही है…"</string>
@@ -1483,13 +1487,13 @@
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"निकालें"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"वॉल्यूम को सुझाए गए स्तर से ऊपर बढ़ाएं?\n\nअत्यधिक वॉल्यूम पर अधिक समय तक सुनने से आपकी सुनने की क्षमता को नुकसान हो सकता है."</string>
- <string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"एक्सेस-योग्यता शॉर्टकट का उपयोग करना चाहते हैं?"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"इस शॉर्टकट के चालू होने पर, दोनों वॉल्यूम बटनों को 3 सेकंड तक दबाने से एक्सेस-योग्यता सुविधा शुरू हो जाएगी.\n\n अभी वाली एक्सेस-योग्यता सुविधा:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n आप इस सुविधा को सेटिंग > एक्सेस-योग्यता पर जाकर बदल सकते हैं."</string>
+ <string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"सुलभता शॉर्टकट का इस्तेमाल करना चाहते हैं?"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"इस शॉर्टकट के चालू होने पर, दोनों वॉल्यूम बटनों को 3 सेकंड तक दबाने से सुलभता सुविधा शुरू हो जाएगी.\n\n मौजूदा सुलभता सुविधा:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n आप इस सुविधा को सेटिंग > सुलभता पर जाकर बदल सकते हैं."</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"शॉर्टकट बंद करें"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"शॉर्टकट का उपयोग करें"</string>
- <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"एक्सेस-योग्यता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू किया"</string>
- <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"एक्सेस-योग्यता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद किया"</string>
- <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"एक्सेस-योग्यता बटन पर टैप करते समय उपयोग की जाने वाली सुविधा चुनें:"</string>
+ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू किया"</string>
+ <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद किया"</string>
+ <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"सुलभता बटन पर टैप करते समय इस्तेमाल की जाने वाली सुविधा चुनें:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"सुविधाओं में बदलाव करने के लिए, सुलभता बटन को दबाकर रखें."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"आवर्धन"</string>
<string name="user_switched" msgid="3768006783166984410">"मौजूदा उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
@@ -1588,7 +1592,7 @@
<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>
- <string name="print_service_installed_message" msgid="5897362931070459152">"सक्षम करने के लिए टैप करें"</string>
+ <string name="print_service_installed_message" msgid="5897362931070459152">"चालू करने के लिए टैप करें"</string>
<string name="restr_pin_enter_admin_pin" msgid="8641662909467236832">"व्यवस्थापक पिन डालें"</string>
<string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN डालें"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"गलत"</string>
@@ -1603,9 +1607,9 @@
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंड में पुन: प्रयास करें</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"बाद में फिर से प्रयास करें"</string>
- <string name="immersive_cling_title" msgid="8394201622932303336">"पूर्ण स्क्रीन में देखें"</string>
+ <string name="immersive_cling_title" msgid="8394201622932303336">"पूरे स्क्रीन पर देखें"</string>
<string name="immersive_cling_description" msgid="3482371193207536040">"बाहर निकलने के लिए, ऊपर से नीचे स्वाइप करें."</string>
- <string name="immersive_cling_positive" msgid="5016839404568297683">"समझ लिया"</string>
+ <string name="immersive_cling_positive" msgid="5016839404568297683">"ठीक है"</string>
<string name="done_label" msgid="2093726099505892398">"पूर्ण"</string>
<string name="hour_picker_description" msgid="6698199186859736512">"घंटो का चक्राकार स्लाइडर"</string>
<string name="minute_picker_description" msgid="8606010966873791190">"मिनटों का चक्राकार स्लाइडर"</string>
@@ -1628,7 +1632,7 @@
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपके व्यवस्थापक ने अपडेट किया है"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपके व्यवस्थापक ने हटा दिया है"</string>
<string name="battery_saver_description" msgid="1960431123816253034">"बैटरी लाइफ़ को बेहतर बनाने में मदद करने के लिए, बैटरी सेवर आपके डिवाइस के प्रदर्शन को कम कर देता है और कंपन (वाइब्रेशन), स्थान सेवाओं और ज़्यादातर बैकग्राउंड डेटा को सीमित कर देता है. हो सकता है कि ईमेल, मैसेज सेवा और सिंक पर आधारित अन्य ऐप तब तक ना खुलें जब तक कि आप उन्हें नहीं खोलते.\n\nजब आपका डिवाइस चार्ज हो रहा होता है तो बैटरी सेवर अपने आप बंद हो जाता है."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"डेटा खर्च, कम करने के लिए डेटा सेवर कुछ ऐप को बैकग्राउंड में डेटा भेजने या पाने से रोकता है. आप फ़िलहाल जिस एेप का इस्तेमाल कर रहे हैं वह डेटा एक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इसका मतलब है कि इमेज तब तक दिखाई नहीं देंगी जब तक कि आप उन्हें टैप नहीं करते."</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"डेटा खर्च, कम करने के लिए डेटा सेवर कुछ ऐप को बैकग्राउंड में डेटा भेजने या पाने से रोकता है. आप फ़िलहाल जिस एेप का इस्तेमाल कर रहे हैं वह डेटा तक पहुंच सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इसे समझिये कि तस्वीर तब तक दिखाई नहीं देंगी जब तक कि आप उन्हें टैप नहीं करते."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचाने की सेटिंग चालू करें?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करें"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1668,7 +1672,7 @@
<string name="zen_mode_forever" msgid="1916263162129197274">"जब तक कि आप परेशान ना करें को बंद नहीं कर देते"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"जब तक कि आप परेशान ना करें को बंद नहीं कर देते"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
- <string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त करें"</string>
+ <string name="toolbar_collapse_description" msgid="2821479483960330739">"छोटा करें"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"परेशान ना करें"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"बंद रहने का समय"</string>
<string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"सप्ताह की रात"</string>
@@ -1684,8 +1688,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध को USSD अनुरोध में बदल दिया गया है."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध को नए SS अनुरोध में बदल दिया गया है."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफ़ाइल"</string>
- <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत करें"</string>
- <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संक्षिप्त करें"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तार करें"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"छोटा करें"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"टॉगल विस्तार"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB पेरिफ़ेरल पोर्ट"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
@@ -1750,18 +1754,18 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"समय इनपुट के लिए लेख इनपुट मोड पर जाएं."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"समय इनपुट के लिए घड़ी मोड पर जाएं."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ऑटोमैटिक भरने के विकल्प"</string>
- <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ऑटोमैटिक भरने के लिए सहेजें"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"अपने आप भरने के लिए सेव करें"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"सामग्रियां ऑटोमैटिक रूप से भरी जा सकती हैं"</string>
<string name="autofill_picker_no_suggestions" msgid="3908514303773350735">"ऑटोमैटिक भरने का कोई सुझाव नहीं"</string>
<plurals name="autofill_picker_some_suggestions" formatted="false" msgid="5506565809835815274">
<item quantity="one">ऑटोमैटिक भरने के <xliff:g id="COUNT">%1$s</xliff:g> सुझाव</item>
<item quantity="other">ऑटोमैटिक भरने के <xliff:g id="COUNT">%1$s</xliff:g> सुझाव</item>
</plurals>
- <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> में सहेजें?"</string>
- <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> को <b><xliff:g id="LABEL">%2$s</xliff:g></b> में सहेजें?"</string>
- <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> और <xliff:g id="TYPE_1">%2$s</xliff:g> को <b><xliff:g id="LABEL">%3$s</xliff:g></b> में सहेजें?"</string>
- <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> और <xliff:g id="TYPE_2">%3$s</xliff:g> को <b><xliff:g id="LABEL">%4$s</xliff:g></b> में सहेजें?"</string>
- <string name="autofill_save_yes" msgid="6398026094049005921">"सहेजें"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> में सेव करें?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> को <b><xliff:g id="LABEL">%2$s</xliff:g></b> में सेव करें?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> और <xliff:g id="TYPE_1">%2$s</xliff:g> को <b><xliff:g id="LABEL">%3$s</xliff:g></b> में सेव करें?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> और <xliff:g id="TYPE_2">%3$s</xliff:g> को <b><xliff:g id="LABEL">%4$s</xliff:g></b> में सेव करें?"</string>
+ <string name="autofill_save_yes" msgid="6398026094049005921">"सेव करें"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"नहीं, धन्यवाद"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"पासवर्ड"</string>
<string name="autofill_save_type_address" msgid="4936707762193009542">"पता"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index dea21f0..9029f1f 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -233,7 +233,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Zaključaj sada"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova obavijest"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtualna tipkovnica"</string>
@@ -1211,8 +1212,8 @@
<string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za više opcija."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkriven je analogni audiododatak"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da biste saznali više."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za otklanjanje pogrešaka USB-om"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Dodirnite da biste onemogućili otklanjanje pogrešaka putem USB-a."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za otklanjanje pogrešaka putem USB-a"</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"Dodirnite da biste takvo otklanjanje onemogućili."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Odaberite da biste onemogućili rješavanje programske pogreške na USB-u."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Izrada izvješća o programskoj pogrešci…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Želite li podijeliti izvješće o programskoj pogrešci?"</string>
@@ -1407,9 +1408,9 @@
<string name="data_usage_warning_body" msgid="6660692274311972007">"Dodirnite za upotrebu i postavke"</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Dost. ogr. 2G–3G prijenosa pod."</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Dost. ogr. 4G prijenosa podataka"</string>
- <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dosegnuto je ograničenje mobilnog podatkovnog prometa"</string>
+ <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dosegnuto je ograničenje za mob. podatkovni promet"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Dost. ogr. Wi-Fi prijenosa pod."</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Podaci su pauz. za ostatak cikl."</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"Podaci su pauzirani do kraja ciklusa"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Prekoračeno ograničenje 2G-3G"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Prekoračeno je ograničenje 4G podataka"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Prekoračeno je ograničenje za podatke na mobilnom uređaju"</string>
@@ -1469,7 +1470,11 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan obrazac"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna zaporka"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Pogrešan PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Pokušajte ponovo za <xliff:g id="NUMBER">%1$d</xliff:g> s."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu</item>
+ <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde</item>
+ <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Iscrtajte svoj obrazac"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Unesite PIN za SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Unesite PIN"</string>
@@ -1652,7 +1657,7 @@
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao administrator"</string>
<string name="battery_saver_description" msgid="1960431123816253034">"Da bi se produljilo trajanje baterije, ušteda baterije smanjuje performanse uređaja i ograničava vibraciju, usluge lokacije i većinu pozadinskih radnji. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nUšteda baterije isključuje se automatski dok se uređaj puni."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio podatkovni promet, Ušteda podataka onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio podatkovni promet, Štednja podatkovnog prometa onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index d4be9b5..2fa2628 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Beállítások"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Segítség"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hangsegéd"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Zárolás most"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Új értesítés"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuális billentyűzet"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Helytelen minta"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Helytelen jelszó"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Helytelen PIN-kód"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Próbálkozzon újra <xliff:g id="NUMBER">%1$d</xliff:g> másodperc múlva."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Próbálja újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva.</item>
+ <item quantity="one">Próbálja újra 1 másodperc múlva</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Rajzolja le a mintát"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Adja meg a SIM kártya PIN kódját"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Adja meg a PIN kódot"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 7e3721f..2b78c71 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -93,7 +93,7 @@
<string name="peerTtyModeHco" msgid="5728602160669216784">"Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը"</string>
<string name="peerTtyModeOff" msgid="3280819717850602205">"Բաժանորդի սարքում ընտրված է հեռատիպի ԱՆՋԱՏ ռեժիմը"</string>
- <string name="serviceClassVoice" msgid="1258393812335258019">"Ձայնային"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"Ձայնային կապ"</string>
<string name="serviceClassData" msgid="872456782077937893">"Տվյալներ"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"Ֆաքս"</string>
<string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Կարգավորումներ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Օգնական"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ձայնային օգնութ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Կողպել հիմա"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Նոր ծանուցում"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Վիրտուալ ստեղնաշար"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Սխալ սխեմա"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Սխալ գաղտնաբառ"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Սխալ PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Փորձեք կրկին <xliff:g id="NUMBER">%1$d</xliff:g> վայրկյանից:"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
+ <item quantity="other">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Հավաքեք ձեր սխեման"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Մուտքագրեք SIM-քարտի PIN-կոդը"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Մուտքագրեք PIN-ը"</string>
@@ -1702,8 +1706,8 @@
<string name="default_notification_channel_label" msgid="5929663562028088222">"Չդասակարգված"</string>
<string name="importance_from_user" msgid="7318955817386549931">"Դուք սահմանել եք այս ծանուցումների կարևորությունը:"</string>
<string name="importance_from_person" msgid="9160133597262938296">"Կարևոր է, քանի որ որոշակի մարդիկ են ներգրավված:"</string>
- <string name="user_creation_account_exists" msgid="1942606193570143289">"Թույլ տա՞լ <xliff:g id="APP">%1$s</xliff:g> հավելվածին <xliff:g id="ACCOUNT">%2$s</xliff:g> հաշվով նոր Օտատեր ստեղծել:"</string>
- <string name="user_creation_adding" msgid="4482658054622099197">"Թույլ տա՞լ <xliff:g id="APP">%1$s</xliff:g> հավելվածին <xliff:g id="ACCOUNT">%2$s</xliff:g> հաշվով նոր Օտատեր ստեղծել (նման հաշվով Օտատեր արդեն գոյություն ունի):"</string>
+ <string name="user_creation_account_exists" msgid="1942606193570143289">"Թույլ տա՞լ <xliff:g id="APP">%1$s</xliff:g> հավելվածին <xliff:g id="ACCOUNT">%2$s</xliff:g> հաշվով նոր Օգտատեր ստեղծել:"</string>
+ <string name="user_creation_adding" msgid="4482658054622099197">"Թույլ տա՞լ <xliff:g id="APP">%1$s</xliff:g> հավելվածին <xliff:g id="ACCOUNT">%2$s</xliff:g> հաշվով նոր Օգտատեր ստեղծել (նման հաշվով Օգտատեր արդեն գոյություն ունի):"</string>
<string name="language_selection_title" msgid="2680677278159281088">"Ավելացնել լեզու"</string>
<string name="country_selection_title" msgid="2954859441620215513">"Նախընտրելի տարածաշրջան"</string>
<string name="search_language_hint" msgid="7042102592055108574">"Մուտքագրեք լեզուն"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index e90cce1..5d41c13 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -184,7 +184,7 @@
<string name="turn_on_radio" msgid="3912793092339962371">"Hidupkan nirkabel"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"Matikan nirkabel"</string>
<string name="screen_lock" msgid="799094655496098153">"Kunci layar"</string>
- <string name="power_off" msgid="4266614107412865048">"Matikan daya"</string>
+ <string name="power_off" msgid="4266614107412865048">"Matikan perangkat"</string>
<string name="silent_mode_silent" msgid="319298163018473078">"Pendering mati"</string>
<string name="silent_mode_vibrate" msgid="7072043388581551395">"Pendering bergetar"</string>
<string name="silent_mode_ring" msgid="8592241816194074353">"Pendering nyala"</string>
@@ -208,7 +208,7 @@
<string name="global_actions" product="tv" msgid="7240386462508182976">"Opsi TV"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"Opsi telepon"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Kunci layar"</string>
- <string name="global_action_power_off" msgid="4471879440839879722">"Matikan daya"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"Matikan perangkat"</string>
<string name="global_action_emergency" msgid="7112311161137421166">"Darurat"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Laporan bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan bug"</string>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Setelan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantuan"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Kunci sekarang"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notifikasi baru"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Keyboard virtual"</string>
@@ -1190,7 +1191,7 @@
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aksesori audio analog terdeteksi"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Perangkat yang terpasang tidak kompatibel dengan ponsel ini. Tap untuk mempelajari lebih lanjut."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Ketuk untuk menonaktifkan debug USB."</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"Tap untuk menonaktifkan debug USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pilih untuk menonaktifkan debugging USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Mengambil laporan bug…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Bagikan laporan bug?"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pola Salah"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Sandi Salah"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN Salah"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Coba lagi dalam <xliff:g id="NUMBER">%1$d</xliff:g> detik."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Coba <xliff:g id="NUMBER">%d</xliff:g> detik lagi.</item>
+ <item quantity="one">Coba 1 detik lagi.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Gambar pola Anda"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Masukkan PIN SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Masukkan PIN"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index bb067b1..7add51d 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Stillingar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Aðstoð"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Raddaðstoð"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Læsa núna"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ný tilkynning"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Sýndarlyklaborð"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Rangt mynstur"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Rangt aðgangsorð"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Rangt PIN-númer"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Reyndu aftur eftir <xliff:g id="NUMBER">%1$d</xliff:g> sekúndur."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndu.</item>
+ <item quantity="other">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndur.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Teiknaðu mynstrið þitt"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Sláðu inn PIN-númer SIM-kortsins"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Sláðu inn PIN-númer"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 8fa140e..fdab6dc 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Impostazioni"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistenza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Blocca ora"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nuova notifica"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastiera virtuale"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequenza sbagliata"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Password sbagliata"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN errato"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Riprova fra <xliff:g id="NUMBER">%1$d</xliff:g> secondi."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi.</item>
+ <item quantity="one">Riprova fra 1 secondo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Inserisci la sequenza"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Inserisci il PIN della SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Inserisci PIN"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index e86d114..3d60b42 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"הגדרות"</string>
<string name="global_action_assist" msgid="3892832961594295030">"סיוע"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"נעל עכשיו"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"הודעה חדשה"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"מקלדת וירטואלית"</string>
@@ -426,7 +427,7 @@
<string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"מאפשרת לאפליקציה להשתמש במשדר האינפרה-אדום של הטאבלט."</string>
<string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"מאפשרת לאפליקציה להשתמש במשדר האינפא-האדום של הטלוויזיה."</string>
<string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"מאפשרת לאפליקציה להשתמש במשדר האינפרא-אדום של הטלפון."</string>
- <string name="permlab_setWallpaper" msgid="6627192333373465143">"הגדר טפט"</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"הגדרת טפט"</string>
<string name="permdesc_setWallpaper" msgid="7373447920977624745">"מאפשר לאפליקציה להגדיר את טפט המערכת."</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"התאמת גודל הטפט שלך"</string>
<string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"מאפשר לאפליקציה להגדיר את סמני הגודל של טפט המערכת."</string>
@@ -812,7 +813,7 @@
<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="save_password_label" msgid="6860261758665825069">"אשר"</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>
<string name="setup_autofill" msgid="7103495070180590814">"הגדר מילוי אוטומטי"</string>
@@ -854,7 +855,7 @@
<string name="prepend_shortcut_label" msgid="2572214461676015642">"תפריט+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"רווח"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Enter"</string>
- <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"מחק"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"מחיקה"</string>
<string name="search_go" msgid="8298016669822141719">"חיפוש"</string>
<string name="search_hint" msgid="1733947260773056054">"חיפוש…"</string>
<string name="searchview_description_search" msgid="6749826639098512120">"חיפוש"</string>
@@ -1005,7 +1006,7 @@
<string name="paste" msgid="5629880836805036433">"הדבק"</string>
<string name="paste_as_plain_text" msgid="5427792741908010675">"הדבק כטקסט פשוט"</string>
<string name="replace" msgid="5781686059063148930">"החלף..."</string>
- <string name="delete" msgid="6098684844021697789">"מחק"</string>
+ <string name="delete" msgid="6098684844021697789">"מחיקה"</string>
<string name="copyUrl" msgid="2538211579596067402">"העתק כתובת אתר"</string>
<string name="selectTextMode" msgid="1018691815143165326">"בחר טקסט"</string>
<string name="undo" msgid="7905788502491742328">"ביטול"</string>
@@ -1013,7 +1014,7 @@
<string name="autofill" msgid="3035779615680565188">"מילוי אוטומטי"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"בחירת טקסט"</string>
<string name="addToDictionary" msgid="4352161534510057874">"הוסף למילון"</string>
- <string name="deleteText" msgid="6979668428458199034">"מחק"</string>
+ <string name="deleteText" msgid="6979668428458199034">"מחיקה"</string>
<string name="inputMethod" msgid="1653630062304567879">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"פעולות טקסט"</string>
<string name="email" msgid="4560673117055050403">"אימייל"</string>
@@ -1041,7 +1042,7 @@
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"פתח"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ערוך באמצעות"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"ערוך באמצעות %1$s"</string>
- <string name="whichEditApplicationLabel" msgid="7183524181625290300">"ערוך"</string>
+ <string name="whichEditApplicationLabel" msgid="7183524181625290300">"עריכה"</string>
<string name="whichSendApplication" msgid="6902512414057341668">"שתף באמצעות"</string>
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"שתף באמצעות %1$s"</string>
<string name="whichSendApplicationLabel" msgid="4579076294675975354">"שתף"</string>
@@ -1209,7 +1210,7 @@
<string name="sim_done_button" msgid="827949989369963775">"סיום"</string>
<string name="sim_added_title" msgid="3719670512889674693">"כרטיס ה-SIM נוסף"</string>
<string name="sim_added_message" msgid="6599945301141050216">"הפעל מחדש את המכשיר כדי לגשת אל הרשת הסלולרית."</string>
- <string name="sim_restart_button" msgid="4722407842815232347">"הפעל מחדש"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"הפעלה מחדש"</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>
@@ -1234,7 +1235,7 @@
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"המכשיר זיהה התקן אודיו אנלוגי"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ההתקן שחיברת לא תואם לטלפון הזה. הקש למידע נוסף."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ניפוי באגים של USB מחובר"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"הקש כדי להשבית ניפוי באגים של USB."</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"יש להקיש כדי להשבית ניפוי באגים של USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"בחר להשבית ניפוי באגים ב-USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"עיבוד דוח על באג..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"האם לשתף דוח על באג?"</string>
@@ -1403,7 +1404,7 @@
<string name="date_picker_next_month_button" msgid="5559507736887605055">"החודש הבא"</string>
<string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
<string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ביטול"</string>
- <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"מחק"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"מחיקה"</string>
<string name="keyboardview_keycode_done" msgid="1992571118466679775">"סיום"</string>
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"שינוי מצב"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
@@ -1425,7 +1426,7 @@
<string name="storage_usb_drive" msgid="6261899683292244209">"כונן USB"</string>
<string name="storage_usb_drive_label" msgid="4501418548927759953">"כונן USB של <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"אחסון USB"</string>
- <string name="extract_edit_menu_button" msgid="8940478730496610137">"ערוך"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"עריכה"</string>
<string name="data_usage_warning_title" msgid="3620440638180218181">"התראה על שימוש בנתונים"</string>
<string name="data_usage_warning_body" msgid="6660692274311972007">"הקש כדי להציג נתוני שימוש והגדרות."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"הגעת למגבלת הנתונים של 2G-3G"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"סיסמה שגויה"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"קוד גישה שגוי"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"נסה שוב בעוד <xliff:g id="NUMBER">%1$d</xliff:g> שניות."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="two">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
+ <item quantity="many">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
+ <item quantity="other">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
+ <item quantity="one">אפשר יהיה לנסות שוב בעוד שנייה אחת.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"שרטט את קו ביטול הנעילה"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"הזן קוד גישה ל-SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"הזן קוד גישה"</string>
@@ -1829,7 +1835,7 @@
<string name="autofill_save_title_with_type" msgid="8637809388029313305">"האם לשמור <xliff:g id="TYPE">%1$s</xliff:g> בשירות <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
<string name="autofill_save_title_with_2types" msgid="5214035651838265325">"האם לשמור <xliff:g id="TYPE_0">%1$s</xliff:g> ו<xliff:g id="TYPE_1">%2$s</xliff:g> בשירות <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
<string name="autofill_save_title_with_3types" msgid="6943161834231458441">"האם לשמור <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ו<xliff:g id="TYPE_2">%3$s</xliff:g> בשירות <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
- <string name="autofill_save_yes" msgid="6398026094049005921">"שמור"</string>
+ <string name="autofill_save_yes" msgid="6398026094049005921">"שמירה"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"לא, תודה"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"סיסמה"</string>
<string name="autofill_save_type_address" msgid="4936707762193009542">"כתובת"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 010351a..83426ad 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"サポート"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"音声アシスト"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"今すぐロック"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新しい通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"仮想キーボード"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"パターンが正しくありません"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"パスワードが正しくありません"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PINが正しくありません"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g>秒後にもう一度お試しください。"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> 秒後にもう一度お試しください。</item>
+ <item quantity="one">1 秒後にもう一度お試しください。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"パターンを入力"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PINを入力"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PINを入力"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 3250d4a..173c16b 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"პარამეტრები"</string>
<string name="global_action_assist" msgid="3892832961594295030">"დახმარება"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ხმოვანი ასისტ."</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ახლა ჩაკეტვა"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ახალი შეტყობინება"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ვირტუალური კლავიატურა"</string>
@@ -1303,7 +1304,7 @@
<string name="submit" msgid="1602335572089911941">"გაგზავნა"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"მანქანის რეჟიმი ჩართულია"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"შეეხეთ მანქანის რეჟიმიდან გამოსასვლელად."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"ინტერნეტის მიერთება ან უსადენო ქსელი აქტიურია."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"შეეხეთ დასაყენებლად."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ტეტერინგი გათიშულია"</string>
<string name="disable_tether_notification_message" msgid="2913366428516852495">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"არასწორი ნიმუში"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"არასწორი პაროლი"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"არასწორი PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"კიდევ სცადეთ <xliff:g id="NUMBER">%1$d</xliff:g> წამში."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">ცადეთ ხელახლა <xliff:g id="NUMBER">%d</xliff:g> წამში.</item>
+ <item quantity="one">ცადეთ ხელახლა 1 წამში.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"დახატეთ თქვენი ნიმუში."</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN-ის შეყვანა"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"შეიყვანეთ PIN"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index cf14d47..288b72e 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Параметрлер"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Көмек"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дауыс көмекшісі"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Қазір бекіту"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Жаңа хабарландыру"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалды пернетақта"</string>
@@ -651,7 +652,7 @@
<string name="emailTypeHome" msgid="449227236140433919">"Үй"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Жұмыс"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Басқа"</string>
- <string name="emailTypeMobile" msgid="119919005321166205">"Ұялы"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"Мобильдік"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Арнаулы"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Үй"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Жұмыс"</string>
@@ -1189,7 +1190,7 @@
<string name="usb_notification_message" msgid="3370903770828407960">"Қосымша опциялар үшін түртіңіз."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Аналогтық аудиожабдық анықталды"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Жалғанған құрылғы бұл телефонмен үйлесімсіз. Қосымша ақпарат алу үшін түртіңіз."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"USB жөндеу қосылған"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB түзетуі қосылған"</string>
<string name="adb_active_notification_message" msgid="4948470599328424059">"USB түзетуін өшіру үшін түртіңіз."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB түзетуін өшіру үшін таңдаңыз."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Қате туралы есеп алынуда…"</string>
@@ -1309,7 +1310,7 @@
<string name="disable_tether_notification_message" msgid="2913366428516852495">"Мәліметтерді әкімшіден алыңыз"</string>
<string name="back_button_label" msgid="2300470004503343439">"Артқа"</string>
<string name="next_button_label" msgid="1080555104677992408">"Келесі"</string>
- <string name="skip_button_label" msgid="1275362299471631819">"Аттап өту"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"Өткізіп жіберу"</string>
<string name="no_matches" msgid="8129421908915840737">"Сәйкес табылмады"</string>
<string name="find_on_page" msgid="1946799233822820384">"Беттен табу"</string>
<plurals name="matches_found" formatted="false" msgid="1210884353962081884">
@@ -1386,7 +1387,7 @@
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G деректер шегіне жеттіңіз"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Мобильдік деректер шегіне жетті"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi деректер шегіне жеттіңіз"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Циклдің қал. бөл. үшін дер. кід."</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"Дерек тасымалы кідіртілді"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2Г-3Г дерекқор шектеуінен асып кетті"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4Ш дерекқор шектеуінен асып кетті"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Ұялы дерекқор шектеуінен асып кетті"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Қате өрнек"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Қате кілтсөз"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Қате PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> секундтан кейін қайта әрекеттеніңіз."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"> <xliff:g id="NUMBER">%d</xliff:g> секундтан кейін қайталап көріңіз.</item>
+ <item quantity="one">1 секундтан кейін қайталап көріңіз.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Кескініңізді салыңыз"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN кодын енгізіңіз"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN кодын енгізіңіз"</string>
@@ -1665,8 +1669,8 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> дейін"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> дейін (келесі дабыл)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Өшірмейінше мазаламау"</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Өшірмейінше мазаламау"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"\"Мазаламау\" режимін өшіргенше"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"\"Мазаламау\" режимін өшіргенше"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Тасалау"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Мазаламау"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 399b329..ab23b00 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"ការកំណត់"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ជំនួយ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ជំនួយសម្លេង"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ចាក់សោឥឡូវនេះ"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ការជូនដំណឹងថ្មី"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ក្ដារចុចនិម្មិត"</string>
@@ -1191,8 +1192,8 @@
<string name="usb_notification_message" msgid="3370903770828407960">"ប៉ះសម្រាប់ជម្រើសជាច្រើនទៀត"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"បានរកឃើញគ្រឿងបរិក្ខារសំឡេងអាណាឡូក"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ឧបករណ៍ដែលភ្ជាប់មកជាមួយមិនត្រូវគ្នាជាមួយទូរសព្ទនេះទេ។ ចុចដើម្បីស្វែងយល់បន្ថែម។"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"បានភ្ជាប់ការកែកំហុសយូអេសប៊ី"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"ប៉ះដើម្បីបិទដំណើរការកែកំហុសយូអេសប៊ី"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"បានភ្ជាប់ការកែកំហុស USB"</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"ប៉ះដើម្បីបិទដំណើរការកែកំហុស USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ជ្រើស ដើម្បីបិទការកែកំហុសយូអេសប៊ី។"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"កំពុងទទួលយករបាយការណ៍កំហុស…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ចែករំលែករបាយការណ៍កំហុសឬ?"</string>
@@ -1448,7 +1449,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំមិនត្រឹមត្រូវ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ពាក្យសម្ងាត់មិនត្រឹមត្រូវ"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"កូដ PIN មិនត្រឹមត្រូវ"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER">%1$d</xliff:g> វិនាទី។"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">ព្យាយាមម្តងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER">%d</xliff:g> វិនាទី។</item>
+ <item quantity="one">ព្យាយាមម្តងទៀតក្នុងរយៈពេល 1 វិនាទី។</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"គូរលំនាំរបស់អ្នក"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"បញ្ចូលកូដ PIN ស៊ីមកាត"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"បញ្ចូលកូដ PIN"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index bacf731..352f57a 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ಸಹಾಯ ಮಾಡು"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ಧ್ವನಿ ಸಹಾಯಕ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ಈಗ ಲಾಕ್ ಮಾಡಿ"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ಹೊಸ ಅಧಿಸೂಚನೆ"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ವರ್ಚುಯಲ್ ಕೀಬೋರ್ಡ್"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ತಪ್ಪು ಪ್ಯಾಟರ್ನ್"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ತಪ್ಪು ಪಾಸ್ವರ್ಡ್"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"ತಪ್ಪಾದ ಪಿನ್"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ನಿಮ್ಮ ನಮೂನೆಯನ್ನು ಚಿತ್ರಿಸಿ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"ಪಿನ್ ನಮೂದಿಸಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 1ecfd04..c9fdc46 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"설정"</string>
<string name="global_action_assist" msgid="3892832961594295030">"지원"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"음성 지원"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"지금 잠그기"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"새 알림"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"가상 키보드"</string>
@@ -269,7 +270,7 @@
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS 메시지 전송 및 보기"</string>
<string name="permgrouprequest_sms" msgid="605618939583628306">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 SMS 메시지를 전송하고 보도록 허용합니다."</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"저장"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"저장용량"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"기기 사진, 미디어, 파일 액세스"</string>
<string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 기기의 사진, 미디어, 파일에 액세스하도록 허용합니다."</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"마이크"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"잘못된 패턴"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"잘못된 비밀번호"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"잘못된 PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g>초 후에 다시 시도해 주세요."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요.</item>
+ <item quantity="one">1초 후에 다시 시도하세요.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"패턴 그리기"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN 입력"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN 입력"</string>
@@ -1628,7 +1632,7 @@
<string name="package_updated_device_owner" msgid="1847154566357862089">"관리자에 의해 업데이트되었습니다."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"관리자에 의해 삭제되었습니다."</string>
<string name="battery_saver_description" msgid="1960431123816253034">"배터리 수명 개선을 위해, 배터리 세이버는 기기의 성능을 줄이고 진동, 위치 서비스 및 대부분의 백그라운드 데이터를 제한합니다. 이메일, 메시지 및 동기화에 의존하는 기타 앱은 앱을 열 때까지 업데이트되지 않을 수 있습니다.\n\n배터리 세이버는 기기를 충전 중일 때는 자동으로 사용 중지됩니다."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 즉, 예를 들어 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"데이터 절약 모드를 사용할까요?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"사용 설정"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 0063809..681df65 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Жөндөөлөр"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Жардам"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Үн жардамчысы"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Азыр кулпулоо"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Жаңы эскертме"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалдык баскычтоп"</string>
@@ -484,7 +485,7 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Аракеттер өтө көп болду. Кийинчерээк кайра аракет кылыңыз."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Өтө көп жолу аракет жасадыңыз. Манжа изинин сенсору өчүрүлдү."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Кайра бир аракеттениңиз."</string>
- <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> манжасы"</string>
+ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>-манжа"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Манжа изинин сөлөкөтү"</string>
@@ -1387,7 +1388,7 @@
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G дайындар чегине жетти"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Мобилдик трафик чегине жетти"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi дайындар чегине жетти"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Калган мерчимде дайындар бир азга токтотулду"</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"Маалымат алмашуу токтотулду"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G трафик чектен ашты"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G трафик чектен ашты"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Мобилдик трафик чегинен ашты"</string>
@@ -1447,7 +1448,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Графикалык ачкыч туура эмес"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Сырсөз туура эмес"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN-код туура эмес"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> секундадан кийин кайталаңыз."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайталаңыз.</item>
+ <item quantity="one">1 секунддан кийин кайталаңыз.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Бөгөттөн чыгаруу сүрөтүн тартыңыз"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM-картанын PIN\'ин киргизиңиз"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN\'ди киргизиңиз"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 96eaf8c..ade01c2 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"ການຕັ້ງຄ່າ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ຕົວຊ່ວຍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ຊ່ວຍເຫຼືອທາງສຽງ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ລັອກດຽວນີ້"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ການແຈ້ງເຕືອນໃໝ່"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ແປ້ນພິມສະເໝືອນ"</string>
@@ -1189,7 +1190,7 @@
<string name="usb_notification_message" msgid="3370903770828407960">"ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ກວດພົບອຸປະກອນເສີມສຽງ"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ອຸປະກອນທີ່ເຊື່ອມຕໍ່ນັ້ນບໍ່ສາມາດໃຊ້ຮ່ວມກັບໂທລະສັບນີ້ໄດ້. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັ໊ກຜ່ານ USB ແລ້ວ"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັກຜ່ານ USB ແລ້ວ"</string>
<string name="adb_active_notification_message" msgid="4948470599328424059">"ແຕະເພື່ອປິດການດີບັກຜ່ານ USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ເລືອກເພື່ອປິດການດີບັ໊ກຜ່ານ USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ກຳລັງຂໍລາຍງານຂໍ້ຜິດພາດ…"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບແບບຜິດ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"ລະຫັດ PIN ຜິດ"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER">%1$d</xliff:g> ວິນາທີ."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">ລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ.</item>
+ <item quantity="one">ລອງໃໝ່ໃນອີກ 1 ວິນາທີ.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ໃສ່ລະຫັດ PIN ຂອງຊິມ"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"ໃສ່ລະຫັດ PIN"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index fa4e13b..e7fc04e 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nustatymai"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pagalba"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Užrakinti dabar"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Naujas pranešimas"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtualioji klaviatūra"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Netinkamas atrakinimo piešinys"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Netinkamas slaptažodis"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Netinkamas PIN kodas"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Bandyti dar kartą po <xliff:g id="NUMBER">%1$d</xliff:g> sek."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
+ <item quantity="few">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
+ <item quantity="many">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
+ <item quantity="other">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Nupieškite atrakinimo piešinį"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Įveskite SIM PIN kodą"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Įveskite PIN kodą"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 58757ee..6159e1f 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -233,7 +233,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Iestatījumi"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Palīdzība"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Balss palīgs"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloķēt tūlīt"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Jauns paziņojums"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuālā tastatūra"</string>
@@ -1469,7 +1470,11 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nepareiza kombinācija"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nepareiza parole"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Nepareizs PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%1$d</xliff:g> sekundēm."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="zero">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
+ <item quantity="one">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundes.</item>
+ <item quantity="other">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Norādiet savu kombināciju"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Ievadiet SIM kartes PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Ievadiet PIN"</string>
diff --git a/core/res/res/values-mcc302-mnc370-sk/strings.xml b/core/res/res/values-mcc302-mnc370-sk/strings.xml
index b93949e..6a3e8c7 100644
--- a/core/res/res/values-mcc302-mnc370-sk/strings.xml
+++ b/core/res/res/values-mcc302-mnc370-sk/strings.xml
@@ -21,6 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="wfcSpnFormats">
<item msgid="5022384999749536798">"%s"</item>
- <item msgid="8117276330682171665">"%s Wi-Fi"</item>
+ <item msgid="8117276330682171665">"%s Wi‑Fi"</item>
</string-array>
</resources>
diff --git a/core/res/res/values-mcc302-mnc720-sk/strings.xml b/core/res/res/values-mcc302-mnc720-sk/strings.xml
index 9b2336d..e7411be 100644
--- a/core/res/res/values-mcc302-mnc720-sk/strings.xml
+++ b/core/res/res/values-mcc302-mnc720-sk/strings.xml
@@ -21,6 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="wfcSpnFormats">
<item msgid="2776657861851140021">"%s"</item>
- <item msgid="5094669985484060934">"%s Wi-Fi"</item>
+ <item msgid="5094669985484060934">"%s Wi‑Fi"</item>
</string-array>
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 3df1543..b06f45e 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Поставки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Асистенција"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помош"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Заклучи сега"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ново известување"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуелна тастатура"</string>
@@ -1448,7 +1449,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешна шема"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Погрешен PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Обидете се повторно за <xliff:g id="NUMBER">%1$d</xliff:g> секунди."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунда.</item>
+ <item quantity="other">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Употреби ја својата шема"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Внеси PIN на SIM картичка"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Внеси PIN"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 690b7f1..2cb564c 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"ക്രമീകരണം"</string>
<string name="global_action_assist" msgid="3892832961594295030">"അസിസ്റ്റ്"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"വോയ്സ് സഹായം"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ഇപ്പോൾ ലോക്കുചെയ്യുക"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"പുതിയ അറിയിപ്പ്"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"വെർച്വൽ കീബോർഡ്"</string>
@@ -1180,7 +1181,7 @@
<string name="no_permissions" msgid="7283357728219338112">"അനുമതികളൊന്നും ആവശ്യമില്ല"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ഇത് നിങ്ങൾക്ക് പണച്ചെലവിനിടയാക്കാം"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ശരി"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"ഈ ഉപകരണം USB ചാർജുചെയ്യുന്നു"</string>
+ <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB ഈ ഉപകരണം ചാർജജ് ചെയ്യുന്നു"</string>
<string name="usb_supplying_notification_title" msgid="5310642257296510271">"ഘടിപ്പിച്ചിട്ടുള്ള ഉപകരണത്തിന് USB വൈദ്യുതി നൽകുന്നു"</string>
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ഫയൽ കൈമാറ്റത്തിനുള്ള USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ഫോട്ടോ കൈമാറ്റത്തിനായുള്ള USB"</string>
@@ -1426,7 +1427,7 @@
<string name="default_audio_route_category_name" msgid="3722811174003886946">"സിസ്റ്റം"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"ബ്ലൂടൂത്ത് ഓഡിയോ"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"വയർലെസ് ഡിസ്പ്ലേ"</string>
- <string name="media_route_button_content_description" msgid="591703006349356016">"കാസ്റ്റുചെയ്യുക"</string>
+ <string name="media_route_button_content_description" msgid="591703006349356016">"കാസ്റ്റ് ചെയ്യുക"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"ഉപകരണത്തിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"സ്ക്രീൻ ഉപകരണത്തിലേക്ക് കാസ്റ്റുചെയ്യുക"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"ഉപകരണങ്ങൾക്കായി തിരയുന്നു…"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"പാറ്റേൺ തെറ്റാണ്"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"പാസ്വേഡ് തെറ്റാണ്"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"പിൻ തെറ്റാണ്"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> സെക്കൻഡുകൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
+ <item quantity="one">ഒരു സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"നിങ്ങളുടെ പാറ്റേൺ വരയ്ക്കുക"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"സിം പിൻ നൽകുക"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"പിൻ നൽകുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index d355ffc..011a2bd 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Тохиргоо"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Туслах"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дуут туслах"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Одоо түгжих"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Шинэ мэдэгдэл"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуал гар"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу хээ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Нууц үг буруу"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN буруу"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу.</item>
+ <item quantity="one">1 секундын дараа дахин оролдоно уу.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Хээг зурах"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN оруулна уу"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN оруулна уу"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index a30039e..2ef0960 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग्ज"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहाय्यता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"व्हॉइस सहाय्य"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"आता लॉक करा"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"नवीन सूचना"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"व्हर्च्युअल कीबोर्ड"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"चुकीचा पॅटर्न"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"चुकीचा संकेतशब्द"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"चुकीचा पिन"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> सेकंदात पुन्हा प्रयत्न करा.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंदांत पुन्हा प्रयत्न करा.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"तुमचा पॅटर्न काढा"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"सिम पिन प्रविष्ट करा"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"पिन प्रविष्ट करा"</string>
@@ -1603,7 +1607,7 @@
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"नंतर पुन्हा प्रयत्न करा"</string>
- <string name="immersive_cling_title" msgid="8394201622932303336">"पूर्ण स्क्रीन पाहत आहात"</string>
+ <string name="immersive_cling_title" msgid="8394201622932303336">"पूर्ण स्क्रीनवर पाहत आहात"</string>
<string name="immersive_cling_description" msgid="3482371193207536040">"बाहेर पडण्यासाठी, वरून खाली स्वाइप करा."</string>
<string name="immersive_cling_positive" msgid="5016839404568297683">"समजले"</string>
<string name="done_label" msgid="2093726099505892398">"पूर्ण झाले"</string>
@@ -1762,7 +1766,7 @@
<string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<b><xliff:g id="LABEL">%3$s</xliff:g></b>मध्ये <xliff:g id="TYPE_0">%1$s</xliff:g> आणि <xliff:g id="TYPE_1">%2$s</xliff:g> सेव्ह करायची?"</string>
<string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<b><xliff:g id="LABEL">%4$s</xliff:g></b>मध्ये <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> आणि <xliff:g id="TYPE_2">%3$s</xliff:g> सेव्ह करायची?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"सेव्ह करा"</string>
- <string name="autofill_save_no" msgid="2625132258725581787">"नाही धन्यवाद"</string>
+ <string name="autofill_save_no" msgid="2625132258725581787">"नाही, नको"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"संकेतशब्द"</string>
<string name="autofill_save_type_address" msgid="4936707762193009542">"पत्ता"</string>
<string name="autofill_save_type_credit_card" msgid="7127694776265563071">"क्रेडिट कार्ड"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index d873490..b17abd7 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Tetapan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Kunci sekarang"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Pemberitahuan baharu"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Papan kekunci maya"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Corak Salah"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Kata Laluan Salah"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN salah"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Cuba lagi dalam <xliff:g id="NUMBER">%1$d</xliff:g> saat."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Cuba lagi dalam masa <xliff:g id="NUMBER">%d</xliff:g> saat.</item>
+ <item quantity="one">Cuba lagi dalam masa 1 saat.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Lukiskan corak anda"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Masukkan PIN SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Masukkan PIN"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index bc7a65c..79bdc56 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"ဆက်တင်များ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"အကူအညီ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"အသံ အကူအညီ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ယခု သော့ပိတ်ရန်"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"၉၉၉+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"အကြောင်းကြားချက်အသစ်"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ပကတိအသွင်ကီးဘုတ်"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ပုံဆွဲအမှား"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"စကားဝှက်အမှား"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"ပင် နံပါတ်အမှား"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> စက္ကန့်အကြာတွင် ပြန်ကြိုးစားပါ"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
+ <item quantity="one">၁ စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"သင့်ရဲ့ သော့ဖွင့်သော ပုံစံကို ဆွဲပါ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ဆင်းမ်ကဒ် ပင် နံပါတ် ရိုက်ထည့်ပါ"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"ပင်နံပါတ် ရိုက်ထည့်ပါ"</string>
@@ -1665,7 +1669,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>အထိ"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> အထိ (လာမည့် နှိုးစက်)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"မနှောင့်ယှက်ရန် ကိုသင်ပိတ်သည်အထိ"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"\"မနှောင့်ယှက်ရန်\" ကို သင်ပိတ်လိုက်သည်အထိ"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"မနှောင့်ယှက်ရန် ကိုသင်ပိတ်သည်အထိ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ခေါက်ရန်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 61417ef..de6a9a8 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Innstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjelp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Talehjelp"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lås nå"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nytt varsel"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Feil mønster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Feil passord"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Feil PIN-kode"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Prøv på nytt om <xliff:g id="NUMBER">%1$d</xliff:g> sekunder."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Prøv på nytt om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
+ <item quantity="one">Prøv på nytt om ett sekund.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Tegn mønsteret ditt"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Skriv inn PIN-koden for SIM-kortet"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Skriv inn PIN-koden"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 24279c7..ce3683f 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"सेटिङ्हरू"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता दिनुहोस्"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज सहायता"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"अब बन्द गर्नुहोस्"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"नयाँ सूचना"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"भर्चुअल किबोर्ड"</string>
@@ -1171,7 +1172,7 @@
<string name="sim_done_button" msgid="827949989369963775">"भयो"</string>
<string name="sim_added_title" msgid="3719670512889674693">"SIM कार्ड थप गरियो"</string>
<string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवर्क पहुँच गर्न तपाईँको उपकरण पुनःस्टार्ट गर्नुहोस्।"</string>
- <string name="sim_restart_button" msgid="4722407842815232347">"पुनःस्टार्ट गर्नुहोस्"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"पुनः सुरू गर्नुहोस्"</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>
@@ -1452,7 +1453,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाँचा"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g>सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
+ <item quantity="one">१ सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"आफ्नो ढाँचा कोर्नुहोस्"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN प्रविष्टि गर्नुहोस्"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN प्रविष्टि गर्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index c57763b..123d291 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Instellingen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Helpen"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Spraakassistent"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Nu vergrendelen"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nieuwe melding"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtueel toetsenbord"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Onjuist patroon"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Onjuist wachtwoord"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Onjuiste pincode"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Probeer het over <xliff:g id="NUMBER">%1$d</xliff:g> seconden opnieuw."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw.</item>
+ <item quantity="one">Probeer het over één seconde opnieuw.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Teken je patroon"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Geef de pincode van de simkaart op"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Pincode opgeven"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 326cc99..8c42808 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -28,7 +28,7 @@
<string name="unknownName" msgid="6867811765370350269">"ਅਗਿਆਤ"</string>
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"ਵੌਇਸਮੇਲ"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
- <string name="mmiError" msgid="5154499457739052907">"ਕਨੈਕਸ਼ਨ ਸਮੱਸਿਆ ਜਾਂ ਅਪ੍ਰਮਾਣਿਕ MMI ਕੋਡ।"</string>
+ <string name="mmiError" msgid="5154499457739052907">"ਕਨੈਕਸ਼ਨ ਸਮੱਸਿਆ ਜਾਂ ਅਵੈਧ MMI ਕੋਡ।"</string>
<string name="mmiFdnError" msgid="5224398216385316471">"ਓਪਰੇਸ਼ਨ ਕੇਵਲ ਫਿਕਸਡ ਡਾਇਲਿੰਗ ਨੰਬਰਾਂ ਤੱਕ ਸੀਮਿਤ ਹੈ।"</string>
<string name="mmiErrorWhileRoaming" msgid="762488890299284230">"ਤੁਹਾਡੇ ਰੋਮਿੰਗ ਵਿੱਚ ਹੋਣ ਦੌਰਾਨ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਕਾਲ ਫਾਰਵਰਡਿੰਗ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
<string name="serviceEnabled" msgid="8147278346414714315">"ਸੇਵਾ ਅਸਮਰੱਥ ਬਣਾਈ ਗਈ ਸੀ।"</string>
@@ -36,16 +36,16 @@
<string name="serviceDisabled" msgid="1937553226592516411">"ਸੇਵਾ ਅਸਮਰੱਥ ਬਣਾਈ ਗਈ ਹੈ।"</string>
<string name="serviceRegistered" msgid="6275019082598102493">"ਰਜਿਸਟਰੇਸ਼ਨ ਸਫਲ ਸੀ।"</string>
<string name="serviceErased" msgid="1288584695297200972">"ਮਿਟਾਉਣਾ ਸਫ਼ਲ ਰਿਹਾ ਸੀ।"</string>
- <string name="passwordIncorrect" msgid="7612208839450128715">"ਗ਼ਲਤ ਪਾਸਵਰਡ।"</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"ਗਲਤ ਪਾਸਵਰਡ।"</string>
<string name="mmiComplete" msgid="8232527495411698359">"MMI ਪੂਰਾ।"</string>
<string name="badPin" msgid="9015277645546710014">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤਾ ਪੁਰਾਣਾ ਪਿੰਨ ਠੀਕ ਨਹੀਂ ਹੈ।"</string>
<string name="badPuk" msgid="5487257647081132201">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤਾ PUK ਠੀਕ ਨਹੀਂ ਹੈ।"</string>
<string name="mismatchPin" msgid="609379054496863419">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤੇ ਪਿੰਨ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ।"</string>
- <string name="invalidPin" msgid="3850018445187475377">"ਇੱਕ ਪਿੰਨ ਟਾਈਪ ਕਰੋ ਜੋ 4 ਤੋਂ 8 ਨੰਬਰਾਂ ਦਾ ਹੈ।"</string>
+ <string name="invalidPin" msgid="3850018445187475377">"ਕੋਈ ਪਿੰਨ ਟਾਈਪ ਕਰੋ ਜੋ 4 ਤੋਂ 8 ਨੰਬਰਾਂ ਦਾ ਹੋਵੇ।"</string>
<string name="invalidPuk" msgid="8761456210898036513">"ਇੱਕ PUK ਕੋਡ ਟਾਈਪ ਕਰੋ ਜੋ 8 ਜਾਂ ਵੱਧ ਸੰਖਿਆਵਾਂ ਦਾ ਹੋਵੇ।"</string>
- <string name="needPuk" msgid="919668385956251611">"ਤੁਹਾਡਾ SIM ਕਾਰਡ PUK-ਲੌਕਡ ਹੈ। ਇਸਨੂੰ ਅਨਲੌਕ ਕਰਨ ਲਈ PUK ਕੋਡ ਟਾਈਪ ਕਰੋ।"</string>
+ <string name="needPuk" msgid="919668385956251611">"ਤੁਹਾਡਾ ਸਿਮ ਕਾਰਡ PUK-ਲੌਕਡ ਹੈ। ਇਸਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ PUK ਕੋਡ ਟਾਈਪ ਕਰੋ।"</string>
<string name="needPuk2" msgid="4526033371987193070">"SIM ਕਾਰਡ ਅਨਬਲੌਕ ਕਰਨ ਲਈ PUK2 ਟਾਈਪ ਕਰੋ।"</string>
- <string name="enablePin" msgid="209412020907207950">"ਅਸਫਲ, SIM/RUIM ਲੌਕ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ।"</string>
+ <string name="enablePin" msgid="209412020907207950">"ਅਸਫਲ, SIM/RUIM ਲੌਕ ਨੂੰ ਚਾਲੂ ਕਰੋ।"</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
<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>
@@ -54,10 +54,10 @@
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ਇਨਕਮਿੰਗ ਕਾਲਰ ਆਈ.ਡੀ."</string>
<string name="ClirMmi" msgid="7784673673446833091">"ਆਊਟਗੋਇੰਗ ਕਾਲਰ ਆਈ.ਡੀ."</string>
- <string name="ColpMmi" msgid="3065121483740183974">"ਕਨੈਕਟ ਕੀਤੀ ਲਾਈਨ ID"</string>
- <string name="ColrMmi" msgid="4996540314421889589">"ਕਨੈਕਟ ਕੀਤੀ ਲਾਈਨ ID ਪ੍ਰਤਿਬੰਧ"</string>
- <string name="CfMmi" msgid="5123218989141573515">"ਕਾਲ ਫੌਰਵਾਰਡਿੰਗ"</string>
- <string name="CwMmi" msgid="9129678056795016867">"ਕਾਲ ਉਡੀਕ ਵਿੱਚ"</string>
+ <string name="ColpMmi" msgid="3065121483740183974">"ਕਨੈਕਟ ਕੀਤੀ ਲਾਈਨ ਆਈ.ਡੀ."</string>
+ <string name="ColrMmi" msgid="4996540314421889589">"ਕਨੈਕਟ ਕੀਤੀ ਲਾਈਨ ਆਈ.ਡੀ. ਪ੍ਰਤਿਬੰਧ"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"ਕਾਲ ਫਾਰਵਰਡਿੰਗ"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"ਕਾਲ ਦੀ ਉਡੀਕ"</string>
<string name="BaMmi" msgid="455193067926770581">"ਕਾਲ ਬੈਰਿੰਗ"</string>
<string name="PwdMmi" msgid="7043715687905254199">"ਪਾਸਵਰਡ ਬਦਲੋ"</string>
<string name="PinMmi" msgid="3113117780361190304">"ਪਿੰਨ ਬਦਲਣਾ"</string>
@@ -73,7 +73,7 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ਪ੍ਰਤਿਬੰਧਿਤ ਨਾ ਕਰਨ ਲਈ ਕਾਲਰ ਆਈ.ਡੀ. ਪੂਰਵ-ਨਿਰਧਾਰਤ। ਅਗਲੀ ਕਾਲ: ਪ੍ਰਤਿਬੰਧਿਤ ਨਹੀਂ"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"ਸੇਵਾ ਪ੍ਰਬੰਧਿਤ ਨਹੀਂ ਹੈ।"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"ਤੁਸੀਂ ਕਾਲਰ ਆਈ.ਡੀ. ਸੈਟਿੰਗ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ਕੋਈ ਡੈਟਾ ਸੇਵਾ ਨਹੀਂ"</string>
+ <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ਕੋਈ ਡਾਟਾ ਸੇਵਾ ਨਹੀਂ"</string>
<string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"ਸੰਕਟਕਾਲ ਵਿੱਚ ਕੋਈ ਕਾਲ ਨਹੀਂ"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ਕੋਈ ਆਵਾਜ਼ੀ ਸੇਵਾ ਨਹੀਂ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ਕੋਈ ਆਵਾਜ਼ੀ/ਸੰਕਟਕਾਲੀਨ ਸੇਵਾ ਨਹੀਂ"</string>
@@ -93,8 +93,8 @@
<string name="peerTtyModeHco" msgid="5728602160669216784">"ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeOff" msgid="3280819717850602205">"ਪੀਅਰ ਨੇ TTY Mode OFF ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
- <string name="serviceClassVoice" msgid="1258393812335258019">"ਵੌਇਸ"</string>
- <string name="serviceClassData" msgid="872456782077937893">"ਡੈਟਾ"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"ਅਵਾਜ਼"</string>
+ <string name="serviceClassData" msgid="872456782077937893">" ਡਾਟਾ"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"ਫੈਕਸ"</string>
<string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
<string name="serviceClassDataAsync" msgid="4523454783498551468">"ਅਸਿੰਕ"</string>
@@ -117,7 +117,7 @@
<string name="roamingTextSearching" msgid="8360141885972279963">"ਸੇਵਾ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="wfcRegErrorTitle" msgid="2301376280632110664">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string>
<string-array name="wfcOperatorErrorAlertMessages">
- <item msgid="3910386316304772394">"ਵਾਈ-ਫਾਈ ਤੋਂ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਲਈ, ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਸ ਸੇਵਾ ਦੀ ਸਥਾਪਨਾ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ। (ਗੜਬੜੀ ਕੋਡ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="3910386316304772394">"ਵਾਈ-ਫਾਈ ਤੋਂ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਦੇ ਲਈ, ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਸ ਸੇਵਾ ਦੀ ਸਥਾਪਨਾ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ। (ਗੜਬੜੀ ਕੋਡ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
<item msgid="7472393097168811593">"ਆਪਣੇ ਕੈਰੀਅਰ ਨਾਲ ਪੰਜੀਕਰਨ ਕਰੋ (ਗੜਬੜ ਕੋਡ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
@@ -136,7 +136,7 @@
<string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ਅੱਗੇ ਨਹੀਂ ਭੇਜਿਆ ਗਿਆ"</string>
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ਅੱਗੇ ਨਹੀਂ ਭੇਜਿਆ ਗਿਆ"</string>
<string name="fcComplete" msgid="3118848230966886575">"ਵਿਸ਼ੇਸ਼ਤਾ ਕੋਡ ਪੂਰਾ।"</string>
- <string name="fcError" msgid="3327560126588500777">"ਕਨੈਕਸ਼ਨ ਸਮੱਸਿਆ ਜਾਂ ਅਪ੍ਰਮਾਣਿਕ ਵਿਸ਼ੇਸ਼ਤਾ ਕੋਡ।"</string>
+ <string name="fcError" msgid="3327560126588500777">"ਕਨੈਕਸ਼ਨ ਸਮੱਸਿਆ ਜਾਂ ਅਵੈਧ ਵਿਸ਼ੇਸ਼ਤਾ ਕੋਡ।"</string>
<string name="httpErrorOk" msgid="1191919378083472204">"ਠੀਕ"</string>
<string name="httpError" msgid="7956392511146698522">"ਇੱਕ ਨੈੱਟਵਰਕ ਅਸ਼ੁੱਧੀ ਹੋਈ ਸੀ।"</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"URL ਨਹੀਂ ਲੱਭ ਸਕਿਆ।"</string>
@@ -146,21 +146,21 @@
<string name="httpErrorConnect" msgid="8714273236364640549">"ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string>
<string name="httpErrorIO" msgid="2340558197489302188">"ਸਰਵਰ ਨਾਲ ਸੰਚਾਰ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"ਸਰਵਰ ਨਾਲ ਕਨੈਕਸ਼ਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ।"</string>
- <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"ਸਫ਼ੇ ਵਿੱਚ ਬਹੁਤ ਜ਼ਿਆਦਾ ਰੀਡਾਇਰੈਕਟ ਸ਼ਾਮਲ ਹਨ।"</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"ਪੰਨੇ ਵਿੱਚ ਬਹੁਤ ਜ਼ਿਆਦਾ ਰੀਡਾਇਰੈਕਟ ਸ਼ਾਮਲ ਹਨ।"</string>
<string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"ਪ੍ਰੋਟੋਕੋਲ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।"</string>
<string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"ਇੱਕ ਸੁਰੱਖਿਅਤ ਕਨੈਕਸ਼ਨ ਸਥਾਪਿਤ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string>
- <string name="httpErrorBadUrl" msgid="3636929722728881972">"ਸਫ਼ਾ ਨਹੀਂ ਖੋਲ੍ਹ ਸਕਿਆ ਕਿਉਂਕਿ URL ਅਪ੍ਰਮਾਣਿਕ ਹੈ।"</string>
- <string name="httpErrorFile" msgid="2170788515052558676">"ਫਾਈਲ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਿਆ।"</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"ਪੰਨਾ ਨਹੀਂ ਖੋਲ੍ਹ ਸਕਿਆ ਕਿਉਂਕਿ URL ਅਵੈਧ ਹੈ।"</string>
+ <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="contentServiceSync" msgid="8353523060269335667">"ਸਿੰਕ ਕਰੋ"</string>
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ਸਿੰਕ ਕਰੋ"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ਬਹੁਤ ਜ਼ਿਆਦਾ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ਮਿਟਾਏ।"</string>
- <string name="low_memory" product="tablet" msgid="6494019234102154896">"ਟੈਬਲੇਟ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਸਪੇਸ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫਾਈਲਾਂ ਮਿਟਾਓ।"</string>
- <string name="low_memory" product="watch" msgid="4415914910770005166">"ਘੜੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਸਪੇਸ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫਾਈਲਾਂ ਮਿਟਾਓ।"</string>
- <string name="low_memory" product="tv" msgid="516619861191025923">"TV ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਸਪੇਸ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫਾਈਲਾਂ ਮਿਟਾਓ।"</string>
- <string name="low_memory" product="default" msgid="3475999286680000541">"ਫੋਨ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਸਪੇਸ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫਾਈਲਾਂ ਮਿਟਾਓ।"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"ਟੈਬਲੈੱਟ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
+ <string name="low_memory" product="watch" msgid="4415914910770005166">"ਘੜੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
+ <string name="low_memory" product="tv" msgid="516619861191025923">"ਟੀਵੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"ਫ਼ੋਨ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
<item quantity="one">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀਆਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ</item>
<item quantity="other">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀਆਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ</item>
@@ -168,18 +168,18 @@
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ਇੱਕ ਅਗਿਆਤ ਤੀਜੀ ਪਾਰਟੀ ਵੱਲੋਂ"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ਮੁਤਾਬਕ"</string>
- <string name="work_profile_deleted" msgid="5005572078641980632">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਮਿਟਾਈ ਗਈ"</string>
+ <string name="work_profile_deleted" msgid="5005572078641980632">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਮਿਟਾਈ ਗਈ"</string>
<string name="work_profile_deleted_description" msgid="1100529432509639864">"ਗੁੰਮਸ਼ੁਦਾ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਦੇ ਕਾਰਨ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਮਿਟਾਇਆ ਗਿਆ"</string>
- <string name="work_profile_deleted_details" msgid="6307630639269092360">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਜਾਂ ਤਾਂ ਗੁੰਮਸ਼ੁਦਾ ਹੈ ਜਾਂ ਖਰਾਬ ਹੈ। ਨਤੀਜੇ ਵਜੋਂ, ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਸਬੰਧਿਤ ਡੈਟਾ ਮਿਟਾਇਆ ਗਿਆ ਹੈ। ਸਹਾਇਤਾ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="work_profile_deleted_details" msgid="6307630639269092360">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਜਾਂ ਤਾਂ ਗੁੰਮਸ਼ੁਦਾ ਹੈ ਜਾਂ ਖਰਾਬ ਹੈ। ਨਤੀਜੇ ਵਜੋਂ, ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਸਬੰਧਿਤ ਡਾਟਾ ਮਿਟਾਇਆ ਗਿਆ ਹੈ। ਸਹਾਇਤਾ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਹੁਣ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ਡੀਵਾਈਸ ਪ੍ਰਬੰਧਨ ਅਧੀਨ ਹੈ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ਤੁਹਾਡਾ ਸੰਗਠਨ ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ ਅਤੇ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਮਿਟਾਇਆ ਜਾਏਗਾ"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਵਰਤੀ ਨਹੀਂ ਜਾ ਸਕਦੀ। ਹੁਣ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।\n\nਜੇਕਰ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਸਵਾਲ ਹਨ, ਤਾਂ ਆਪਣੀ ਸੰਸਥਾ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="factory_reset_message" msgid="7972496262232832457">"ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਵਰਤੀ ਨਹੀਂ ਜਾ ਸਕਦੀ। ਹੁਣ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।\n\nਜੇਕਰ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਸਵਾਲ ਹਨ, ਤਾਂ ਆਪਣੀ ਸੰਸਥਾ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="me" msgid="6545696007631404292">"ਮੈਂ"</string>
- <string name="power_dialog" product="tablet" msgid="8545351420865202853">"ਟੈਬਲੇਟ ਚੋਣਾਂ"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"ਟੈਬਲੈੱਟ ਵਿਕਲਪ"</string>
<string name="power_dialog" product="tv" msgid="6153888706430556356">"TV ਚੋਣਾਂ"</string>
- <string name="power_dialog" product="default" msgid="1319919075463988638">"ਫੋਨ ਚੋਣਾਂ"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"ਫ਼ੋਨ ਚੋਣਾਂ"</string>
<string name="silent_mode" msgid="7167703389802618663">"ਸਾਈਲੈਂਟ ਮੋਡ"</string>
<string name="turn_on_radio" msgid="3912793092339962371">"ਵਾਇਰਲੈਸ ਚਾਲੂ ਕਰੋ"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"ਵਾਇਰਲੈਸ ਬੰਦ ਕਰੋ"</string>
@@ -188,38 +188,38 @@
<string name="silent_mode_silent" msgid="319298163018473078">"ਰਿੰਗਰ ਬੰਦ"</string>
<string name="silent_mode_vibrate" msgid="7072043388581551395">"ਰਿੰਗਰ ਥਰਥਰਾਹਟ"</string>
<string name="silent_mode_ring" msgid="8592241816194074353">"ਰਿੰਗਰ ਚਾਲੂ"</string>
- <string name="reboot_to_update_title" msgid="6212636802536823850">"Android ਸਿਸਟਮ ਅਪਡੇਟ"</string>
- <string name="reboot_to_update_prepare" msgid="6305853831955310890">"ਅਪਡੇਟ ਦੀ ਤਿਆਰੀ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="reboot_to_update_package" msgid="3871302324500927291">"ਅਪਡੇਟ ਪੈਕੇਜ ਦੀ ਕਾਰਵਾਈ ਕਰ ਰਿਹਾ ਹੈ..."</string>
+ <string name="reboot_to_update_title" msgid="6212636802536823850">"Android ਸਿਸਟਮ ਅੱਪਡੇਟ"</string>
+ <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_message" msgid="2432077491101416345">"ਰੀਸਟਾਰਟ ਹੋ ਰਿਹਾ ਹੈ…"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ…"</string>
- <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ਤੁਹਾਡੀ ਟੈਬਲੇਟ ਬੰਦ ਕੀਤੀ ਜਾਏਗੀ।"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ।"</string>
<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" product="default" msgid="649792175242821353">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਬੰਦ ਕੀਤਾ ਜਾਏਗਾ।"</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="recent_tasks_title" msgid="3691764623638127888">"ਹਾਲੀਆ"</string>
<string name="no_recent_tasks" msgid="8794906658732193473">"ਕੋਈ ਹਾਲੀਆ ਐਪਸ ਨਹੀਂ।"</string>
- <string name="global_actions" product="tablet" msgid="408477140088053665">"ਟੈਬਲੇਟ ਚੋਣਾਂ"</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"ਟੈਬਲੈੱਟ ਵਿਕਲਪ"</string>
<string name="global_actions" product="tv" msgid="7240386462508182976">"TV ਚੋਣਾਂ"</string>
- <string name="global_actions" product="default" msgid="2406416831541615258">"ਫੋਨ ਚੋਣਾਂ"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"ਫ਼ੋਨ ਚੋਣਾਂ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ਸਕ੍ਰੀਨ ਲੌਕ"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"ਪਾਵਰ ਬੰਦ"</string>
<string name="global_action_emergency" msgid="7112311161137421166">"ਸੰਕਟਕਾਲ"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"ਬਗ ਰਿਪੋਰਟ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ਬਗ ਰਿਪੋਰਟ ਲਓ"</string>
- <string name="bugreport_message" msgid="398447048750350456">"ਇਹ ਇੱਕ ਈਮੇਲ ਸੁਨੇਹਾ ਭੇਜਣ ਲਈ, ਤੁਹਾਡੇ ਵਰਤਮਾਨ ਡੀਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਠੀ ਕਰੇਗਾ। ਬਗ ਰਿਪੋਰਟ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਥੋੜ੍ਹਾ ਸਮਾਂ ਲੱਗੇਗਾ ਜਦੋਂ ਤੱਕ ਇਹ ਭੇਜੇ ਜਾਣ ਲਈ ਤਿਆਰ ਨਾ ਹੋਵੇ, ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ।"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"ਇਹ ਇੱਕ ਈਮੇਲ ਸੁਨੇਹਾ ਭੇਜਣ ਲਈ, ਤੁਹਾਡੇ ਵਰਤਮਾਨ ਡੀਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਠੀ ਕਰੇਗਾ। ਬੱਗ ਰਿਪੋਰਟ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਥੋੜ੍ਹਾ ਸਮਾਂ ਲੱਗੇਗਾ ਜਦੋਂ ਤੱਕ ਇਹ ਭੇਜੇ ਜਾਣ ਲਈ ਤਿਆਰ ਨਾ ਹੋਵੇ, ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ।"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ਅੰਤਰਕਿਰਿਆਤਮਕ ਰਿਪੋਰਟ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"ਜ਼ਿਆਦਾਤਰ ਹਾਲਾਤਾਂ ਵਿੱਚ ਇਸ ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਤੁਹਾਨੂੰ ਰਿਪੋਰਟ ਦੀ ਪ੍ਰਗਤੀ ਨੂੰ ਟਰੈਕ ਕਰਨ, ਸਮੱਸਿਆ ਬਾਰੇ ਹੋਰ ਵੇਰਵੇ ਦਾਖਲ ਕਰਨ, ਅਤੇ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦਿੰਦਾ ਹੈ। ਇਹ ਉਹਨਾਂ ਘੱਟ-ਵਰਤੇ ਗਏ ਕੁਝ ਭਾਗਾਂ ਨੂੰ ਨਜ਼ਰ-ਅੰਦਾਜ਼ ਕਰ ਸਕਦਾ ਹੈ ਜਿਨ੍ਹਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰਨ ਵਿੱਚ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।"</string>
<string name="bugreport_option_full_title" msgid="6354382025840076439">"ਪੂਰੀ ਰਿਪੋਰਟ"</string>
- <string name="bugreport_option_full_summary" msgid="7210859858969115745">"ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਪ੍ਰਤਿਕਿਰਿਆ ਨਾ ਕਰ ਰਿਹਾ ਹੋਵੇ ਜਾਂ ਬਹੁਤ ਹੀ ਹੌਲੀ ਹੋਵੇ, ਜਾਂ ਜਦੋਂ ਤੁਹਾਨੂੰ ਸਾਰੇ ਰਿਪੋਰਟ ਭਾਗਾਂ ਦੀ ਲੋੜ ਹੋਵੇ ਤਾਂ ਇਸ ਚੋਣ ਦੀ ਵਰਤੋਂ ਘੱਟ-ਘੱਟ ਸਿਸਟਮ ਦਖ਼ਲ ਲਈ ਕਰੋ। ਤੁਹਾਨੂੰ ਹੋਰ ਵੇਰਵੇ ਦਾਖਲ ਕਰਨ ਜਾਂ ਵਾਧੂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਨਹੀਂ ਲੈਣ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="bugreport_option_full_summary" msgid="7210859858969115745">"ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਪ੍ਰਤਿਕਿਰਿਆ ਨਾ ਕਰ ਰਿਹਾ ਹੋਵੇ ਜਾਂ ਬਹੁਤ ਹੀ ਹੌਲੀ ਹੋਵੇ, ਜਾਂ ਜਦੋਂ ਤੁਹਾਨੂੰ ਸਾਰੇ ਰਿਪੋਰਟ ਭਾਗਾਂ ਦੀ ਲੋੜ ਹੋਵੇ ਤਾਂ ਇਸ ਚੋਣ ਦੀ ਵਰਤੋਂ ਘੱਟ-ਘੱਟ ਸਿਸਟਮ ਦਖਲ ਲਈ ਕਰੋ। ਤੁਹਾਨੂੰ ਹੋਰ ਵੇਰਵੇ ਦਾਖਲ ਕਰਨ ਜਾਂ ਵਾਧੂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਨਹੀਂ ਲੈਣ ਦਿੰਦਾ ਹੈ।"</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
- <item quantity="one">ਬੱਗ ਰਿਪੋਰਟ ਲਈ <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_1">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।</item>
+ <item quantity="other">ਬੱਗ ਰਿਪੋਰਟ ਲਈ <xliff:g id="NUMBER_1">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।</item>
</plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ਸਾਈਲੈਂਟ ਮੋਡ"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ਅਵਾਜ਼ ਬੰਦ ਹੈ"</string>
@@ -230,14 +230,15 @@
<string name="global_action_settings" msgid="1756531602592545966">"ਸੈਟਿੰਗਾਂ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ਸਹਾਇਤਾ ਕਰੋ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ਹੁਣ ਲੌਕ ਕਰੋ"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ਨਵੀਂ ਸੂਚਨਾ"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ਆਭਾਸੀ ਕੀ-ਬੋਰਡ"</string>
<string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"ਸੁਰੱਖਿਆ"</string>
<string name="notification_channel_car_mode" msgid="3553380307619874564">"ਕਾਰ ਮੋਡ"</string>
- <string name="notification_channel_account" msgid="7577959168463122027">"ਖਾਤੇ ਦੀ ਅਵਸਥਾ"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ਖਾਤੇ ਦੀ ਸਥਿਤੀ"</string>
<string name="notification_channel_developer" msgid="7579606426860206060">"ਵਿਕਾਸਕਾਰ ਸੁਨੇਹੇ"</string>
<string name="notification_channel_updates" msgid="4794517569035110397">"ਅੱਪਡੇਟ"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"ਨੈੱਟਵਰਕ ਅਵਸਥਾ"</string>
@@ -261,79 +262,79 @@
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ਟਿਕਾਣਾ"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਿਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string>
<string name="permgrouprequest_location" msgid="8903573681261610809">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ਕੈਲੰਡਰ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouprequest_calendar" msgid="6704529828699071445">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਕੈਲੰਡਰ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਦੇਖਣ"</string>
+ <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦੇਖੋ"</string>
<string name="permgrouprequest_sms" msgid="605618939583628306">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ SMS ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਦੇਖਣ ਦਿਓ"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ਸਟੋਰੇਜ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨਾ"</string>
<string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ, ਅਤੇ ਫ਼ਾਈਲਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ਮਾਈਕ੍ਰੋਫੋਨ"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦਿਓ"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">" ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
+ <string name="permgrouprequest_microphone" msgid="8065941268709600606">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦਿਓ"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ਕੈਮਰਾ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ਤਸਵੀਰਾਂ ਲੈਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
<string name="permgrouprequest_camera" msgid="810824326507258410">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤਸਵੀਰਾਂ ਖਿੱਚਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦਿਓ"</string>
- <string name="permgrouplab_phone" msgid="5229115638567440675">"ਫੋਨ"</string>
+ <string name="permgrouplab_phone" msgid="5229115638567440675">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ"</string>
<string name="permgrouprequest_phone" msgid="7084161459732093690">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦਿਓ"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ਸਰੀਰ ਸੰਵੇਦਕ"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਚਿੰਨ੍ਹਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡੈਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਲੱਛਣਾਂ ਸਬੰਧੀ ਸੈਂਸਰ ਡੈਟੇ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਚਿੰਨ੍ਹਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
+ <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਲੱਛਣਾਂ ਸਬੰਧੀ ਸੈਂਸਰ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ਵਿੰਡੋ ਸਮੱਗਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਕਿਸੇ ਵਿੰਡੋ ਦੀ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰਨਾ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਅੰਤਰਕਿਰਿਆ ਕਰ ਰਹੇ ਹੋ।"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਇੱਕ ਵਿੰਡੋ ਦੀ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਅੰਤਰਕਿਰਿਆ ਕਰ ਰਹੇ ਹੋ"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ਐਕਸਪਲੋਰ ਬਾਈ ਟੱਚ ਚਾਲੂ ਕਰਨਾ"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ਟੈਪ ਕੀਤੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਉੱਚੀ ਆਵਾਜ਼ ਵਿੱਚ ਬੋਲਿਆ ਜਾਵੇਗਾ ਅਤੇ ਸਕ੍ਰੀਨ ਦੀ ਸੰਕੇਤਾਂ ਦੀ ਵਰਤੋਂ ਨਾਲ ਪੜਚੋਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤੀ ਲਿਖਤ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ"</string>
- <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ਇਸ ਵਿੱਚ ਨਿੱਜੀ ਡੈਟਾ ਸ਼ਾਮਲ ਹੈ ਜਿਵੇਂ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ ਅਤੇ ਪਾਸਵਰਡ।"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ਇਸ ਵਿੱਚ ਨਿੱਜੀ ਡਾਟਾ ਸ਼ਾਮਲ ਹੈ ਜਿਵੇਂ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ ਅਤੇ ਪਾਸਵਰਡ।"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ਡਿਸਪਲੇ ਵੱਡਦਰਸ਼ੀਕਰਨ ਨੂੰ ਕੰਟਰੋਲ ਕਰਨਾ"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"ਡਿਸਪਲੇ ਦੇ ਜ਼ੂਮ ਪੱਧਰ ਅਤੇ ਸਥਿਤੀ ਨੂੰ ਨਿਯੰਤ੍ਰਿਤ ਕਰੋ।"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"ਡਿਸਪਲੇ ਦੇ ਜ਼ੂਮ ਪੱਧਰ ਅਤੇ ਸਥਿਤੀ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ।"</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ਸੰਕੇਤ ਕਰਦੀ ਹੈ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ਟੈਪ ਕਰ ਸਕਦੀ ਹੈ, ਸਵਾਈਪ ਕਰ ਸਕਦੀ ਹੈ, ਪਿੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਅਤੇ ਹੋਰ ਸੰਕੇਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੰਕੇਤ"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ਡੀਵਾਈਸਾਂ ਦੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ \'ਤੇ ਕੀਤੇ ਗਏ ਸੰਕੇਤਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ਸਥਿਤੀ ਬਾਰ ਅਸਮਰੱਥ ਬਣਾਓ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string>
- <string name="permdesc_statusBar" msgid="8434669549504290975">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਬਾਰ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਉਣ ਜਾਂ ਸਿਸਟਮ ਆਈਕਨਾਂ ਨੂੰ ਜੋੜਨ ਅਤੇ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਪੱਟੀ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਉਣ ਜਾਂ ਸਿਸਟਮ ਆਈਕਨਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਅਤੇ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ਸਥਿਤੀ ਪੱਟੀ ਬਣਨ ਦਿਓ"</string>
<string name="permdesc_statusBarService" msgid="716113660795976060">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਬਾਰ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"ਸਥਿਤੀ ਪੱਟੀ ਦਾ ਵਿਸਤਾਰ/ਸੰਖਿਪਤ ਕਰੋ"</string>
<string name="permdesc_expandStatusBar" msgid="6917549437129401132">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਪੱਟੀ ਦਾ ਵਿਸਤਾਰ ਕਰਨ ਜਾਂ ਨਸ਼ਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_install_shortcut" msgid="4279070216371564234">"ਸ਼ਾਰਟਕੱਟ ਇੰਸਟੌਲ ਕਰੋ"</string>
- <string name="permdesc_install_shortcut" msgid="8341295916286736996">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਪਭੋਗਤਾ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ਾਰਟਕੱਟ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"ਸ਼ਾਰਟਕੱਟ ਅਣਇੰਸਟੌਲ ਕਰੋ"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਪਭੋਗਤਾ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ਾਰਟਕੱਟ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_install_shortcut" msgid="4279070216371564234">"ਸ਼ਾਰਟਕੱਟ ਸਥਾਪਤ ਕਰੋ"</string>
+ <string name="permdesc_install_shortcut" msgid="8341295916286736996">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਵਰਤੋਂਕਾਰ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ਾਰਟਕੱਟ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"ਸ਼ਾਰਟਕੱਟ ਅਣਸਥਾਪਤ ਕਰੋ"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਵਰਤੋਂਕਾਰ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ਾਰਟਕੱਟ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਰੀਰੂਟ ਕਰੋ"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ਐਪ ਨੂੰ ਇੱਕ ਵੱਖ ਨੰਬਰ ਨਾਲ ਕਾਲ ਰੀਡਾਇਰੈਕਟ ਕਰਨ ਜਾਂ ਕਾਲ ਨੂੰ ਪੂਰਾ ਰੋਕਣ ਦੀ ਚੋਣ ਨਾਲ ਇੱਕ ਆਊਟਗੋਇੰਗ ਕਾਲ ਦੇ ਦੌਰਾਨ ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਨੰਬਰ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ਫ਼ੋਨ ਕਾਲਾਂ ਦਾ ਜਵਾਬ ਦਿਓ"</string>
<string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ਐਪ ਨੂੰ ਆਉਣ ਵਾਲੀ ਫ਼ੋਨ ਕਾਲ ਦਾ ਜਵਾਬ ਦੇਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string>
- <string name="permlab_receiveSms" msgid="8673471768947895082">"ਟੈਕਸਟ ਸੁਨੇਹੇ (SMS) ਪ੍ਰਾਪਤ ਕਰੋ"</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"ਲਿਖਤ ਸੁਨੇਹੇ (SMS) ਪ੍ਰਾਪਤ ਕਰੋ"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"ਐਪ ਨੂੰ SMS ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਐਪ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹਿਆਂ ਨੂੰ ਤੁਹਾਨੂੰ ਦਿਖਾਏ ਬਿਨਾਂ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ ਜਾਂ ਮਿਟਾ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ਟੈਕਸਟ ਸੁਨੇਹੇ (MMS) ਪੜ੍ਹੋ"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"ਐਪ ਨੂੰ MMS ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਐਪ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹਿਆਂ ਨੂੰ ਤੁਹਾਨੂੰ ਦਿਖਾਏ ਬਿਨਾਂ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ ਜਾਂ ਮਿਟਾ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ਸੈਲ ਪ੍ਰਸਾਰਨ ਸੁਨੇਹੇ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਵੱਲੋਂ ਪ੍ਰਾਪਤ ਕੀਤੇ ਸੈੱਲ ਪ੍ਰਸਾਰਣ ਸੁਨੇਹੇ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸੈੱਲ ਪ੍ਰਸਾਰਣ ਚਿਤਾਵਨੀਆਂ ਤੁਹਾਨੂੰ ਸੰਕਟਕਾਲੀਨ ਸਥਿਤੀਆਂ ਦੀ ਚਿਤਾਵਨੀ ਦੇਣ ਲਈ ਕੁਝ ਨਿਰਧਾਰਿਤ ਟਿਕਾਣਿਆਂ ਤੇ ਪ੍ਰਦਾਨ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ। ਖਰਾਬ ਐਪਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਦਰਸ਼ਨ ਜਾਂ ਓਪਰੇਸ਼ਨ ਵਿੱਚ ਵਿਘਨ ਪਾ ਸਕਦੀਆਂ ਹਨ ਜਦੋਂ ਇੱਕ ਸੰਕਟਕਾਲੀਨ ਸੈੱਲ ਪ੍ਰਸਾਰਣ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
+ <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="permdesc_sendSms" msgid="7094729298204937667">"ਐਪ ਨੂੰ SMS ਸੁਨੇਹੇ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦੇ ਸਿੱਟੇ ਵਜੋਂ ਅਕਲਪਿਤ ਖ਼ਰਚੇ ਪੈ ਸਕਦੇ ਹਨ। ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਪੁਸ਼ਟੀ ਤੋਂ ਬਿਨਾਂ ਸੁਨੇਹੇ ਭੇਜ ਕੇ ਤੁਹਾਨੂੰ ਖ਼ਰਚੇ ਪਾ ਸਕਦੇ ਹਨ।"</string>
- <string name="permlab_readSms" msgid="8745086572213270480">"ਤੁਹਾਡੇ ਟੈਕਸਟ ਸੁਨੇਹੇ (SMS ਜਾਂ MMS) ਪੜ੍ਹੋ"</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>
<string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੀਵੀ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ SMS (ਲਿਖਤ) ਸੁਨੇਹਿਆਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ।"</string>
<string name="permdesc_readSms" product="default" msgid="6826832415656437652">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ SMS (ਲਿਖਤ) ਸੁਨੇਹਿਆਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ਟੈਕਸਟ ਸੁਨੇਹੇ (WAP) ਪ੍ਰਾਪਤ ਕਰੋ"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"ਐਪ ਨੂੰ WAP ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਅਨੁਮਤੀ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ ਐਪ ਦੀ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹਿਆਂ ਨੂੰ ਤੁਹਾਨੂੰ ਦਿਖਾਏ ਬਿਨਾਂ ਨਿਰੀਖਣ ਕਰਨ ਅਤੇ ਮਿਟਾਉਣ ਦੀ ਸਮਰੱਥਾ।"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"ਐਪ ਨੂੰ WAP ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਇਜਾਜ਼ਤ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ ਐਪ ਦੀ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹਿਆਂ ਨੂੰ ਤੁਹਾਨੂੰ ਦਿਖਾਏ ਬਿਨਾਂ ਨਿਰੀਖਣ ਕਰਨ ਅਤੇ ਮਿਟਾਉਣ ਦੀ ਸਮਰੱਥਾ।"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ਚੱਲ ਰਹੇ ਐਪਸ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"ਐਪ ਨੂੰ ਵਰਤਮਾਨ ਵਿੱਚ ਅਤੇ ਹੁਣੇ ਜਿਹੇ ਚੱਲ ਰਹੇ ਕੰਮਾਂ ਬਾਰੇ ਵਿਸਤ੍ਰਿਤ ਜਾਣਕਾਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ ਇਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਖੋਜਣ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ ਕਿ ਡੀਵਾਈਸ ਤੇ ਕਿਹੜੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵਰਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ।"</string>
- <string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"ਪ੍ਰੋਫ਼ਾਈਲ ਅਤੇ ਡੀਵਾਈਸ ਮਾਲਕਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
- <string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"ਪ੍ਰੋਫ਼ਾਈਲ ਦੇ ਮਾਲਕ ਅਤੇ ਡੀਵਾਈਸ ਦੇ ਮਾਲਕ ਨੂੰ ਸੈੱਟ ਕਰਨ ਲਈ ਐਪਾਂ ਨੂੰ ਅਨੁਮਤੀ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਡੀਵਾਈਸ ਮਾਲਕਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
+ <string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"ਪ੍ਰੋਫਾਈਲ ਦੇ ਮਾਲਕ ਅਤੇ ਡੀਵਾਈਸ ਦੇ ਮਾਲਕ ਨੂੰ ਸੈੱਟ ਕਰਨ ਲਈ ਐਪਾਂ ਨੂੰ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"ਚੱਲ ਰਹੇ ਐਪਸ ਨੂੰ ਦੁਬਾਰਾ ਕ੍ਰਮ ਦਿਓ"</string>
<string name="permdesc_reorderTasks" msgid="7734217754877439351">"ਐਪ ਨੂੰ ਕੰਮਾਂ ਨੂੰ ਅਗਲੇ ਭਾਗ ਅਤੇ ਪਿਛੋਕੜ ਵਿੱਚ ਮੂਵ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਐਪ ਤੁਹਾਡੇ ਇਨਪੁਟ ਤੋਂ ਬਿਨਾਂ ਇਹ ਕਰ ਸਕਦਾ ਹੈ।"</string>
- <string name="permlab_enableCarMode" msgid="5684504058192921098">"ਕਾਰ ਮੋਡ ਸਮਰੱਥ ਬਣਾਓ"</string>
- <string name="permdesc_enableCarMode" msgid="4853187425751419467">"ਐਪ ਨੂੰ ਕਾਰ ਮੋਡ ਸਮਰੱਥ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"ਕਾਰ ਮੋਡ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"ਐਪ ਨੂੰ ਕਾਰ ਮੋਡ ਚਾਲੂ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"ਹੋਰ ਐਪਸ ਬੰਦ ਕਰੋ"</string>
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ਐਪ ਨੂੰ ਹੋਰਾਂ ਐਪਸ ਦੀਆਂ ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆਵਾਂ ਖ਼ਤਮ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਹੋਰ ਚੱਲ ਰਹੇ ਐਪਸ ਰੁਕ ਸਕਦੇ ਹਨ।"</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"ਇਹ ਐਪ ਹੋਰ ਐਪਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਵਿਖਾਈ ਦੇ ਸਕਦੀ ਹੈ"</string>
@@ -342,100 +343,100 @@
<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="permlab_persistentActivity" msgid="8841113627955563938">"ਐਪ ਨੂੰ ਹਮੇਸ਼ਾਂ ਚਲਾਏ ਰੱਖੋ"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਟੈਬਲੈੱਟ ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਾਂ ਲਈ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ TV ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਸ ਤੇ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
- <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਫੋਨ ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਸ ਤੇ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
- <string name="permlab_getPackageSize" msgid="7472921768357981986">"ਐਪ ਸਟੋਰੇਜ ਸਪੇਸ ਮਾਪੋ"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"ਐਪ ਨੂੰ ਇਸਦਾ ਕੋਡ, ਡੈਟਾ ਅਤੇ ਕੈਚ ਆਕਾਰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਫ਼ੋਨ ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਾਂ ਤੇ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"ਐਪ ਸਟੋਰੇਜ ਜਗ੍ਹਾ ਮਾਪੋ"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"ਐਪ ਨੂੰ ਇਸਦਾ ਕੋਡ, ਡਾਟਾ ਅਤੇ ਕੈਸ਼ੇ ਆਕਾਰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string>
- <string name="permdesc_writeSettings" msgid="7775723441558907181">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਸੈਟਿੰਗਾਂ ਡੈਟਾ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੇ ਸਿਸਟਮ ਦੀ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨੂੰ ਕਰਪਟ ਕਰ ਸਕਦੇ ਹਨ।"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਸੈਟਿੰਗਾਂ ਡਾਟਾ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਖਰਾਬ ਐਪਾਂ ਤੁਹਾਡੇ ਸਿਸਟਮ ਦੀ ਸੰਰੂਪਣ ਨੂੰ ਕਰਪਟ ਕਰ ਸਕਦੇ ਹਨ।"</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"ਚਾਲੂ ਹੋਣ ਤੇ ਚਲਾਓ"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਬੂਟਿੰਗ ਖ਼ਤਮ ਕਰਨ ਦੇ ਤੁਰੰਤ ਬਾਅਦ ਖੁਦ ਚਾਲੂ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਟੈਬਲੇਟ ਨੂੰ ਚਾਲੂ ਹੋਣ ਵਿੱਚ ਥੋੜ੍ਹਾ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ ਅਤੇ ਇਹ ਐਪ ਨੂੰ ਹਮੇਸ਼ਾਂ ਚਲਾ ਕੇ ਸਮੁੱਚੀ ਟੈਬਲੇਟ ਨੂੰ ਹੌਲਾ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਬੂਟਿੰਗ ਖ਼ਤਮ ਕਰਨ ਦੇ ਤੁਰੰਤ ਬਾਅਦ ਖੁਦ ਚਾਲੂ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ TV ਨੂੰ ਚਾਲੂ ਹੋਣ ਵਿੱਚ ਥੋੜ੍ਹਾ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ ਅਤੇ ਇਹ ਐਪ ਨੂੰ ਹਮੇਸ਼ਾਂ ਚਲਾ ਕੇ ਸਮੁੱਚੀ ਟੈਬਲੇਟ ਨੂੰ ਹੌਲਾ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਬੂਟਿੰਗ ਖ਼ਤਮ ਕਰਨ ਦੇ ਤੁਰੰਤ ਬਾਅਦ ਖੁਦ ਚਾਲੂ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਫੋਨ ਨੂੰ ਚਾਲੂ ਹੋਣ ਵਿੱਚ ਥੋੜ੍ਹਾ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ ਅਤੇ ਇਹ ਐਪ ਨੂੰ ਹਮੇਸ਼ਾਂ ਚਲਾ ਕੇ ਸਮੁੱਚੇ ਫੋਨ ਨੂੰ ਹੌਲਾ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਬੂਟਿੰਗ ਖਤਮ ਕਰਨ ਦੇ ਤੁਰੰਤ ਬਾਅਦ ਖੁਦ ਚਾਲੂ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਟੈਬਲੈੱਟ ਨੂੰ ਚਾਲੂ ਹੋਣ ਵਿੱਚ ਥੋੜ੍ਹਾ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ ਅਤੇ ਇਹ ਐਪ ਨੂੰ ਹਮੇਸ਼ਾਂ ਚਲਾ ਕੇ ਸਮੁੱਚੇ ਟੈਬਲੈੱਟ ਨੂੰ ਹੌਲਾ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਬੂਟਿੰਗ ਖਤਮ ਕਰਨ ਦੇ ਤੁਰੰਤ ਬਾਅਦ ਖੁਦ ਚਾਲੂ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ TV ਨੂੰ ਚਾਲੂ ਹੋਣ ਵਿੱਚ ਥੋੜ੍ਹਾ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ ਅਤੇ ਇਹ ਐਪ ਨੂੰ ਹਮੇਸ਼ਾਂ ਚਲਾ ਕੇ ਸਮੁੱਚੇ ਟੈਬਲੈੱਟ ਨੂੰ ਹੌਲਾ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਦੇ ਬੂਟਿੰਗ ਖਤਮ ਕਰਨ ਦੇ ਤੁਰੰਤ ਬਾਅਦ ਖੁਦ ਚਾਲੂ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਫ਼ੋਨ ਨੂੰ ਚਾਲੂ ਹੋਣ ਵਿੱਚ ਥੋੜ੍ਹਾ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ ਅਤੇ ਇਹ ਐਪ ਨੂੰ ਹਮੇਸ਼ਾਂ ਚਲਾ ਕੇ ਸਮੁੱਚੇ ਫ਼ੋਨ ਨੂੰ ਹੌਲਾ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"ਸਟਿਕੀ ਪ੍ਰਸਾਰਨ ਭੇਜੋ"</string>
- <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"ਐਪ ਨੂੰ ਸਟਿਕੀ ਪ੍ਰਸਾਰਨ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜੋ ਪ੍ਰਸਾਰਨ ਦੇ ਖ਼ਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਰਹਿੰਦੇ ਹਨ। ਵਾਧੂ ਵਰਤੋਂ ਟੈਬਲੇਟ ਨੂੰ ਹੌਲੀ ਜਾਂ ਬਹੁਤ ਜ਼ਿਆਦਾ ਮੈਮਰੀ ਵਰਤ ਕੇ ਇਸਨੂੰ ਅਸਥਿਰ ਬਣਾ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"ਐਪ ਨੂੰ ਸਟਿਕੀ ਪ੍ਰਸਾਰਨ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜੋ ਪ੍ਰਸਾਰਨ ਦੇ ਖਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਰਹਿੰਦੇ ਹਨ। ਵਾਧੂ ਵਰਤੋਂ ਟੈਬਲੈੱਟ ਨੂੰ ਹੌਲੀ ਜਾਂ ਬਹੁਤ ਜ਼ਿਆਦਾ ਮੈਮਰੀ ਵਰਤ ਕੇ ਇਸਨੂੰ ਅਸਥਿਰ ਬਣਾ ਸਕਦੀ ਹੈ।"</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"ਐਪ ਨੂੰ ਸਟਿਕੀ ਪ੍ਰਸਾਰਨ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜੋ ਪ੍ਰਸਾਰਨ ਦੇ ਖ਼ਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਰਹਿੰਦੇ ਹਨ। ਵਾਧੂ ਵਰਤੋਂ TV ਨੂੰ ਹੌਲੀ ਜਾਂ ਬਹੁਤ ਜ਼ਿਆਦਾ ਮੈਮਰੀ ਵਰਤ ਕੇ ਇਸਨੂੰ ਅਸਥਿਰ ਬਣਾ ਸਕਦੀ ਹੈ।"</string>
- <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"ਐਪ ਨੂੰ ਸਟਿਕੀ ਪ੍ਰਸਾਰਨ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜੋ ਪ੍ਰਸਾਰਨ ਦੇ ਖ਼ਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਰਹਿੰਦੇ ਹਨ। ਵਾਧੂ ਵਰਤੋਂ ਫੋਨ ਨੂੰ ਹੌਲੀ ਜਾਂ ਬਹੁਤ ਜ਼ਿਆਦਾ ਮੈਮਰੀ ਵਰਤ ਕੇ ਇਸਨੂੰ ਅਸਥਿਰ ਬਣਾ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"ਐਪ ਨੂੰ ਸਟਿਕੀ ਪ੍ਰਸਾਰਨ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜੋ ਪ੍ਰਸਾਰਨ ਦੇ ਖਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਰਹਿੰਦੇ ਹਨ। ਵਾਧੂ ਵਰਤੋਂ ਫ਼ੋਨ ਨੂੰ ਹੌਲੀ ਜਾਂ ਬਹੁਤ ਜ਼ਿਆਦਾ ਮੈਮਰੀ ਵਰਤ ਕੇ ਇਸਨੂੰ ਅਸਥਿਰ ਬਣਾ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"ਆਪਣੇ ਸੰਪਰਕ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਟੈਬਲੇਟ ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡੈਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਅਨੁਮਤੀ ਐਪਸ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡੈਟਾ ਸੁਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ ਅਤੇ ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਸੰਪਰਕ ਡੈਟਾ ਸ਼ੇਅਰ ਕਰ ਸਕਦੇ ਹਨ।"</string>
- <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ TV ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡੈਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਅਨੁਮਤੀ ਐਪਸ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡੈਟਾ ਸੁਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ ਅਤੇ ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਸੰਪਰਕ ਡੈਟਾ ਸ਼ੇਅਰ ਕਰ ਸਕਦੇ ਹਨ।"</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫੋਨ ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡੈਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਅਨੁਮਤੀ ਐਪਸ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡੈਟਾ ਸੁਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ ਅਤੇ ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਸੰਪਰਕ ਡੈਟਾ ਸ਼ੇਅਰ ਕਰ ਸਕਦੇ ਹਨ।"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ ਹੈ। ਇਹ ਇਜਾਜ਼ਤ ਐਪਾਂ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡਾਟਾ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ ਅਤੇ ਖਰਾਬ ਐਪਾਂ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਸੰਪਰਕ ਡਾਟਾ ਸਾਂਝਾ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
+ <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਟੀਵੀ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ ਹੈ। ਇਹ ਇਜਾਜ਼ਤ ਐਪਾਂ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡਾਟਾ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ ਅਤੇ ਖਰਾਬ ਐਪਾਂ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਸੰਪਰਕ ਡਾਟਾ ਸਾਂਝਾ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ ਹੈ। ਇਹ ਇਜਾਜ਼ਤ ਐਪਾਂ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡਾਟਾ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ ਅਤੇ ਖਰਾਬ ਐਪਾਂ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਸੰਪਰਕ ਡਾਟਾ ਸਾਂਝਾ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"ਆਪਣੇ ਸੰਪਰਕ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਟੈਬਲੇਟ ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡੈਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਅਨੁਮਤੀ ਐਪਸ ਨੂੰ ਸੰਪਰਕ ਡੈਟਾ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
- <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ TV ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡੈਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਅਨੁਮਤੀ ਐਪਸ ਨੂੰ ਸੰਪਰਕ ਡੈਟਾ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫੋਨ ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡੈਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਅਨੁਮਤੀ ਐਪਸ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡੈਟਾ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਟੈਬਲੈੱਟ ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਇਜਾਜ਼ਤ ਐਪਾਂ ਨੂੰ ਸੰਪਰਕ ਡਾਟਾ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
+ <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਟੀਵੀ ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਇਜਾਜ਼ਤ ਐਪਾਂ ਨੂੰ ਸੰਪਰਕ ਡਾਟਾ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੇ ਸਟੋਰ ਕੀਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਬਾਰੇ ਡਾਟਾ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਸ ਬਾਰੰਬਾਰਤਾ ਸਮੇਤ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਕਾਲ ਕੀਤੀ ਹੈ, ਈਮੇਲ ਕੀਤੀ ਹੈ ਜਾਂ ਖ਼ਾਸ ਵਿਅਕਤੀਆਂ ਨਾਲ ਹੋਰ ਤਰੀਕਿਆਂ ਨਾਲ ਸੰਚਾਰ ਕੀਤਾ। ਇਹ ਇਜਾਜ਼ਤ ਐਪਾਂ ਨੂੰ ਤੁਹਾਡਾ ਸੰਪਰਕ ਡਾਟਾ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"ਕਾਲ ਲੌਗ ਪੜ੍ਹੋ"</string>
<string name="permdesc_readCallLog" msgid="3204122446463552146">"ਇਹ ਐਪ ਤੁਹਾਡਾ ਕਾਲ ਇਤਿਹਾਸ ਪੜ੍ਹ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"ਕਾਲ ਲੌਗ ਲਿਖੋ"</string>
- <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਟੈਬਲੇਟ ਦਾ ਕਾਲ ਲੌਗ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡੈਟਾ ਸਮੇਤ। ਖ਼ਰਾਬ ਐਪਸ ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਕਾਲ ਲੌਗ ਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਕਰ ਸਕਦੇ ਹਨ।"</string>
- <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ TV ਦਾ ਕਾਲ ਲੌਗ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡੈਟਾ ਸਮੇਤ। ਖ਼ਰਾਬ ਐਪਸ ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਕਾਲ ਲੌਗ ਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਕਰ ਸਕਦੇ ਹਨ।"</string>
- <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫੋਨ ਦਾ ਕਾਲ ਲੌਗ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡੈਟਾ ਸਮੇਤ। ਖ਼ਰਾਬ ਐਪਸ ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਕਾਲ ਲੌਗ ਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਕਰ ਸਕਦੇ ਹਨ।"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਦਾ ਕਾਲ ਲੌਗ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡਾਟਾ ਸਮੇਤ। ਖਰਾਬ ਐਪਾਂ ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਕਾਲ ਲੌਗ ਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
+ <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ TV ਦਾ ਕਾਲ ਲੌਗ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡਾਟਾ ਸਮੇਤ। ਖਰਾਬ ਐਪਾਂ ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਕਾਲ ਲੌਗ ਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦਾ ਕਾਲ ਲੌਗ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡਾਟਾ ਸਮੇਤ। ਖਰਾਬ ਐਪਾਂ ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਕਾਲ ਲੌਗ ਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="permlab_bodySensors" msgid="4683341291818520277">"ਸਰੀਰ ਸੰਵੇਦਕਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰੋ (ਜਿਵੇਂ ਦਿਲ ਦੀ ਧੜਕਣ ਦੇ ਨਿਰੀਖਕ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ਐਪ ਨੂੰ ਉਹਨਾਂ ਸੰਵੇਦਕਾਂ ਦੇ ਡੈਟਾ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜੋ ਤੁਹਾਡੀ ਸਰੀਰਕ ਸਥਿਤੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੇ ਹਨ, ਜਿਵੇਂ ਤੁਹਾਡੇ ਦਿਲ ਦੀ ਧੜਕਣ।"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ਐਪ ਨੂੰ ਉਹਨਾਂ ਸੰਵੇਦਕਾਂ ਦੇ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜੋ ਤੁਹਾਡੀ ਸਰੀਰਕ ਸਥਿਤੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੇ ਹਨ, ਜਿਵੇਂ ਤੁਹਾਡੇ ਦਿਲ ਦੀ ਧੜਕਣ।"</string>
<string name="permlab_readCalendar" msgid="6716116972752441641">"ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਅਤੇ ਵੇਰਵਿਆਂ ਨੂੰ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਉੱਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡੈਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
- <string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੀਵੀ ਉੱਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡੈਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
- <string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ ਉੱਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡੈਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
- <string name="permlab_writeCalendar" msgid="8438874755193825647">"ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਜੋੜੋ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ ਅਤੇ ਮਾਲਕ ਦੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਮਹਿਮਾਨਾਂ ਨੂੰ ਈਮੇਲ ਭੇਜੋ"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ, ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਬਦਲ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਨੂੰ ਭੇਜ ਸਕਦੀ ਹੈ ਜੋ ਕਿ ਕੈਲੰਡਰ ਮਾਲਕਾਂ ਤੋਂ ਆਉਂਦੇ ਜਾਪ ਸਕਦੇ ਹਨ, ਜਾਂ ਉਹਨਾਂ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਵਰਤਾਰਿਆਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
- <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੀਵੀ \'ਤੇ ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ, ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਬਦਲ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਨੂੰ ਭੇਜ ਸਕਦੀ ਹੈ ਜੋ ਕੈਲੰਡਰ ਮਾਲਕਾਂ ਤੋਂ ਆਉਂਦੇ ਜਾਪ ਸਕਦੇ ਹਨ, ਜਾਂ ਉਹਨਾਂ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਵਰਤਾਰਿਆਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
- <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ, ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਬਦਲ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਨੂੰ ਭੇਜ ਸਕਦੀ ਹੈ ਜੋ ਕੈਲੰਡਰ ਮਾਲਕਾਂ ਤੋਂ ਆਉਂਦੇ ਜਾਪ ਸਕਦੇ ਹਨ, ਜਾਂ ਉਹਨਾਂ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਵਰਤਾਰਿਆਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ਵਾਧੂ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਪ੍ਰਦਾਤਾ ਕਮਾਂਡਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ਐਪ ਨੂੰ ਵਾਧੂ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਪ੍ਰਦਾਤਾ ਕਮਾਂਡਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ GPS ਜਾਂ ਹੋਰ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਸਰੋਤਾਂ ਦੇ ਓਪਰੇਸ਼ਨ ਵਿੱਚ ਵਿਘਨ ਪਾਉਣ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ।"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੀਵੀ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"ਕੈਲੰਡਰ ਇਵੈਂਟ ਸ਼ਾਮਲ ਕਰੋ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ ਅਤੇ ਮਾਲਕ ਦੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਮਹਿਮਾਨਾਂ ਨੂੰ ਈਮੇਲ ਭੇਜੋ"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ, ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਬਦਲ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਨੂੰ ਭੇਜ ਸਕਦੀ ਹੈ ਜੋ ਕਿ ਕੈਲੰਡਰ ਮਾਲਕਾਂ ਤੋਂ ਆਉਂਦੇ ਜਾਪ ਸਕਦੇ ਹਨ, ਜਾਂ ਉਹਨਾਂ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਇਵੈਂਟਾਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੀਵੀ \'ਤੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ, ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਬਦਲ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਨੂੰ ਭੇਜ ਸਕਦੀ ਹੈ ਜੋ ਕੈਲੰਡਰ ਮਾਲਕਾਂ ਤੋਂ ਆਉਂਦੇ ਜਾਪ ਸਕਦੇ ਹਨ, ਜਾਂ ਉਹਨਾਂ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਇਵੈਂਟਾਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ, ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਬਦਲ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਨੂੰ ਭੇਜ ਸਕਦੀ ਹੈ ਜੋ ਕੈਲੰਡਰ ਮਾਲਕਾਂ ਤੋਂ ਆਉਂਦੇ ਜਾਪ ਸਕਦੇ ਹਨ, ਜਾਂ ਉਹਨਾਂ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਇਵੈਂਟਾਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ਵਾਧੂ ਟਿਕਾਣਾ ਪ੍ਰਦਾਤਾ ਕਮਾਂਡਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ਐਪ ਨੂੰ ਵਾਧੂ ਟਿਕਾਣਾ ਪ੍ਰਦਾਤਾ ਕਮਾਂਡਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ GPS ਜਾਂ ਹੋਰ ਟਿਕਾਣਾ ਸਰੋਤਾਂ ਦੇ ਓਪਰੇਸ਼ਨ ਵਿੱਚ ਵਿਘਨ ਪਾਉਣ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ।"</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"ਸਟੀਕ ਟਿਕਾਣੇ \'ਤੇ ਪਹੁੰਚ ਕਰੋ (GPS ਅਤੇ ਨੈੱਟਵਰਕ-ਆਧਾਰਿਤ)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ਇਹ ਐਪ GPS ਜਾਂ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ। ਇਸ ਨਾਲ ਬੈਟਰੀ ਦੀ ਖਪਤ ਵਧ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ਇਹ ਐਪ GPS ਜਾਂ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਦੁਆਰਾ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ। ਇਸ ਨਾਲ ਬੈਟਰੀ ਦੀ ਖਪਤ ਵਧ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ਅੰਦਾਜ਼ਨ ਟਿਕਾਣੇ \'ਤੇ ਪਹੁੰਚ ਕਰੋ (ਨੈੱਟਵਰਕ-ਆਧਾਰਿਤ)"</string>
- <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ਇਹ ਐਪ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ।"</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ਇਹ ਐਪ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਦੁਆਰਾ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ।"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ਇਹ ਐਪ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਟੀਵੀ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ।"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ਇਹ ਐਪ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ।"</string>
- <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ਆਪਣੀਆਂ ਔਡੀਓ ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string>
- <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ਔਪ ਨੂੰ ਗਲੋਬਲ ਔਡੀਓ ਸੈਟਿੰਗਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਵੌਲਿਊਮ ਅਤੇ ਆਊਟਪੁਟ ਲਈ ਕਿਹੜਾ ਸਪੀਕਰ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।"</string>
- <string name="permlab_recordAudio" msgid="3876049771427466323">"ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <string name="permdesc_recordAudio" msgid="4245930455135321433">"ਇਹ ਐਪ ਕਿਸੇ ਵੀ ਸਮੇਂ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਔਡੀਓ ਫ਼ਾਈਲ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ਆਪਣੀਆਂ ਆਡੀਓ ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string>
+ <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_camera" msgid="3616391919559751192">"ਤਸਵੀਰਾਂ ਅਤੇ ਵੀਡੀਓ ਬਣਾਓ"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"ਇਹ ਐਪ ਕਿਸੇ ਵੀ ਸਮੇਂ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"ਵਾਈਬ੍ਰੇਸ਼ਨ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"ਐਪ ਨੂੰ ਵਾਈਬ੍ਰੇਟਰ ਤੇ ਨਿਯੰਤਰਣ ਪਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_callPhone" msgid="3925836347681847954">"ਫੋਨ ਨੰਬਰਾਂ ਤੇ ਸਿੱਧੇ ਕਾਲ ਕਰੋ"</string>
- <string name="permdesc_callPhone" msgid="3740797576113760827">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਫੋਨ ਨੰਬਰਾਂ ਤੇ ਕਾਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦੇ ਸਿੱਟੇ ਵਜੋਂ ਅਕਲਪਿਤ ਖ਼ਰਚੇ ਜਾਂ ਕਾਲਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਧਿਆਨ ਦਿਓ ਕਿ ਇਹ ਐਪ ਨੂੰ ਐਮਰਜੈਂਸੀ ਨੰਬਰਾਂ ਤੇ ਕਾਲ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦਾ। ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਪੁਸ਼ਟੀ ਤੋਂ ਬਿਨਾਂ ਕਾਲਾਂ ਕਰਕੇ ਤੁਹਾਨੂੰ ਖ਼ਰਚੇ ਪਾ ਸਕਦੇ ਹਨ।"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"ਫ਼ੋਨ ਨੰਬਰਾਂ ਤੇ ਸਿੱਧੇ ਕਾਲ ਕਰੋ"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਦਖਲ ਤੋਂ ਬਿਨਾਂ ਫ਼ੋਨ ਨੰਬਰਾਂ ਤੇ ਕਾਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦੇ ਸਿੱਟੇ ਵਜੋਂ ਅਕਲਪਿਤ ਖਰਚੇ ਜਾਂ ਕਾਲਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਧਿਆਨ ਦਿਓ ਕਿ ਇਹ ਐਪ ਨੂੰ ਸੰਕਟਕਾਲੀਨ ਨੰਬਰਾਂ ਤੇ ਕਾਲ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦਾ। ਖਰਾਬ ਐਪਾਂ ਤੁਹਾਡੀ ਪੁਸ਼ਟੀ ਤੋਂ ਬਿਨਾਂ ਕਾਲਾਂ ਕਰਕੇ ਤੁਹਾਨੂੰ ਖਰਚੇ ਪਾ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"IMS ਕਾਲ ਸੇਵਾ ਤੱਕ ਪਹੁੰਚ"</string>
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਕਾਲਾਂ ਕਰਨ ਲਈ IMS ਸੇਵਾ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
- <string name="permlab_readPhoneState" msgid="9178228524507610486">"ਫੋਨ ਸਥਿਤੀ ਅਤੇ ਪਛਾਣ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੀਆਂ ਫ਼ੋਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਅਨੁਮਤੀ ਐਪ ਨੂੰ ਫ਼ੋਨ ਨੰਬਰ ਅਤੇ ਡੀਵਾਈਸ ਆਈ.ਡੀ. ਨਿਰਧਾਰਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ, ਇੱਕ ਕਾਲ ਕਿਰਿਆਸ਼ੀਲ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਰਿਮੋਟ ਨੰਬਰ ਇੱਕ ਕਾਲ ਨਾਲ ਕਨੈਕਟ ਹੈ ਜਾਂ ਨਹੀਂ।"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"ਫ਼ੋਨ ਸਥਿਤੀ ਅਤੇ ਪਛਾਣ ਪੜ੍ਹੋ"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੀਆਂ ਫ਼ੋਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਇਜਾਜ਼ਤ ਐਪ ਨੂੰ ਫ਼ੋਨ ਨੰਬਰ ਅਤੇ ਡੀਵਾਈਸ ਆਈ.ਡੀ. ਨਿਰਧਾਰਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ, ਇੱਕ ਕਾਲ ਕਿਰਿਆਸ਼ੀਲ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਰਿਮੋਟ ਨੰਬਰ ਇੱਕ ਕਾਲ ਨਾਲ ਕਨੈਕਟ ਹੈ ਜਾਂ ਨਹੀਂ।"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ਸਿਸਟਮ ਰਾਹੀਂ ਕਾਲਾਂ ਰੂਟ ਕਰੋ"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"ਕਾਲ ਕਰਨ ਦੇ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਐਪ ਨੂੰ ਇਸਦੀਆਂ ਕਾਲਾਂ ਨੂੰ ਸਿਸਟਮ ਰਾਹੀਂ ਰੂਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ਫ਼ੋਨ ਨੰਬਰ ਪੜ੍ਹੋ"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੇ ਫ਼ੋਨ ਨੰਬਰਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string>
- <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ਟੈਬਲੇਟ ਨੂੰ ਸਲੀਪਿੰਗ ਤੋਂ ਰੋਕੋ"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ਟੈਬਲੈੱਟ ਨੂੰ ਸਲੀਪ ਤੇ ਜਾਣ ਤੋਂ ਰੋਕੋ"</string>
<string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"TV ਨੂੰ ਸਲੀਪਿੰਗ ਤੋਂ ਰੋਕੋ"</string>
- <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ਫੋਨ ਨੂੰ ਸਲੀਪਿੰਗ ਤੋਂ ਰੋਕੋ"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"ਐਪ ਨੂੰ ਟੈਬਲੇਟ ਨੂੰ ਸਲੀਪ ਤੇ ਜਾਣ ਤੋਂ ਰੋਕਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ਫ਼ੋਨ ਨੂੰ ਸਲੀਪਿੰਗ ਤੋਂ ਰੋਕੋ"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"ਐਪ ਨੂੰ ਟੈਬਲੈੱਟ ਨੂੰ ਸਲੀਪ ਤੇ ਜਾਣ ਤੋਂ ਰੋਕਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"ਐਪ ਨੂੰ TV ਨੂੰ ਸਲੀਪ ਤੇ ਜਾਣ ਤੋਂ ਰੋਕਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"ਐਪ ਨੂੰ ਫੋਨ ਨੂੰ ਸਲੀਪ ਤੇ ਜਾਣ ਤੋਂ ਰੋਕਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"ਐਪ ਨੂੰ ਫ਼ੋਨ ਨੂੰ ਸਲੀਪ ਤੇ ਜਾਣ ਤੋਂ ਰੋਕਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"ਇੰਫ੍ਰਾਰੈਡ ਟ੍ਰਾਂਸਮਿਟ ਕਰੋ"</string>
- <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"ਐਪ ਨੂੰ ਟੈਬਲੇਟ ਦਾ ਇੰਫਰਾਰੈਡ ਟ੍ਰਾਂਸਮੀਟਰ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"ਐਪ ਨੂੰ ਟੈਬਲੈੱਟ ਦਾ ਇੰਫਰਾਰੈਡ ਟ੍ਰਾਂਸਮੀਟਰ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"ਐਪ ਨੂੰ TV ਦਾ ਇੰਫਰਾਰੈਡ ਟ੍ਰਾਂਸਮੀਟਰ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"ਐਪ ਨੂੰ ਫੋਨ ਦਾ ਇੰਫਰਾਰੈਡ ਟ੍ਰਾਂਸਮੀਟਰ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"ਐਪ ਨੂੰ ਫ਼ੋਨ ਦਾ ਇੰਫਰਾਰੈਡ ਟ੍ਰਾਂਸਮੀਟਰ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"ਵਾਲਪੇਪਰ ਸੈੱਟ ਕਰੋ"</string>
<string name="permdesc_setWallpaper" msgid="7373447920977624745">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਵਾਲਪੇਪਰ ਸੈਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ਆਪਣਾ ਵਾਲਪੇਪਰ ਆਕਾਰ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
<string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"ਐਪ ਨੂੰ ਸਿਸਟਮ ਵਾਲਪੇਪਰ ਆਕਾਰ ਸੰਕੇਤ ਸੈਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"ਸਮਾਂ ਜ਼ੋਨ ਸੈੱਟ ਕਰੋ"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"ਐਪ ਨੂੰ ਟੈਬਲੇਟ ਦਾ ਸਮਾਂ ਜ਼ੋਨ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"ਐਪ ਨੂੰ ਟੈਬਲੈੱਟ ਦਾ ਸਮਾਂ ਜ਼ੋਨ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permdesc_setTimeZone" product="tv" msgid="888864653946175955">"ਐਪ ਨੂੰ TV ਦਾ ਸਮਾਂ ਜ਼ੋਨ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"ਐਪ ਨੂੰ ਫੋਨ ਦਾ ਸਮਾਂ ਜ਼ੋਨ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"ਐਪ ਨੂੰ ਫ਼ੋਨ ਦਾ ਸਮਾਂ ਜ਼ੋਨ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"ਡੀਵਾਈਸ ਤੇ ਖਾਤੇ ਲੱਭੋ"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"ਐਪ ਨੂੰ ਟੈਬਲੇਟ ਵੱਲੋਂ ਗਿਆਤ ਖਾਤਿਆਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੰਸਟੌਲ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਬਣਾਏ ਗਏ ਕੋਈ ਵੀ ਖਾਤੇ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"ਐਪ ਨੂੰ ਟੈਬਲੈੱਟ ਵੱਲੋਂ ਗਿਆਤ ਖਾਤਿਆਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੁਆਰਾ ਬਣਾਏ ਗਏ ਕੋਈ ਵੀ ਖਾਤੇ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।"</string>
<string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"ਐਪ ਨੂੰ TV ਵੱਲੋਂ ਗਿਆਤ ਖਾਤਿਆਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੰਸਟੌਲ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਬਣਾਏ ਗਏ ਕੋਈ ਵੀ ਖਾਤੇ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।"</string>
- <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"ਐਪ ਨੂੰ ਫੋਨ ਵੱਲੋਂ ਗਿਆਤ ਖਾਤਿਆਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੰਸਟੌਲ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਬਣਾਏ ਗਏ ਕੋਈ ਵੀ ਖਾਤੇ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।"</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"ਐਪ ਨੂੰ ਫ਼ੋਨ ਵੱਲੋਂ ਗਿਆਤ ਖਾਤਿਆਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਬਣਾਏ ਗਏ ਕੋਈ ਵੀ ਖਾਤੇ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।"</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦੇਖੋ"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"ਐਪ ਨੂੰ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਕਿਹੜੇ ਨੈੱਟਵਰਕ ਮੌਜੂਦ ਹਨ ਅਤੇ ਕਨੈਕਟ ਕੀਤੇ ਹੋਏ ਹਨ।"</string>
<string name="permlab_createNetworkSockets" msgid="7934516631384168107">"ਪੂਰੀ ਨੈੱਟਵਰਕ ਪਹੁੰਚ ਪਾਓ"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"ਐਪ ਨੂੰ ਨੈੱਟਵਰਕ ਸੌਕੇਟ ਬਣਾਉਣ ਅਤੇ ਕਸਟਮ ਨੈੱਟਵਰਕ ਪ੍ਰੋਟੋਕੋਲ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਬ੍ਰਾਊਜ਼ਰ ਅਤੇ ਹੋਰ ਐਪਲੀਕੇਸ਼ਨਾਂ ਇੰਟਰਨੈਟ ਨੂੰ ਡੈਟਾ ਭੇਜਣ ਲਈ ਸਾਧਨ ਮੁਹੱਈਆ ਕਰਦਾ ਹੈ, ਇਸਲਈ ਇੰਟਰਨੈਟ ਡੈਟਾ ਭੇਜਣ ਲਈ ਇਹ ਅਨੁਮਤੀ ਲੁੜੀਂਦੀ ਨਹੀਂ ਹੈ।"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"ਐਪ ਨੂੰ ਨੈੱਟਵਰਕ ਸਾਕੇਟ ਬਣਾਉਣ ਅਤੇ ਕਸਟਮ ਨੈੱਟਵਰਕ ਪ੍ਰੋਟੋਕੋਲ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਬ੍ਰਾਊਜ਼ਰ ਅਤੇ ਹੋਰ ਐਪਲੀਕੇਸ਼ਨਾਂ ਇੰਟਰਨੈੱਟ ਨੂੰ ਡਾਟਾ ਭੇਜਣ ਲਈ ਸਾਧਨ ਮੁਹੱਈਆ ਕਰਦੀਆਂ ਹਨ, ਇਸ ਲਈ ਇੰਟਰਨੈੱਟ ਡਾਟਾ ਭੇਜਣ ਲਈ ਇਹ ਅਨੁਮਤੀ ਲੋੜੀਂਦੀ ਨਹੀਂ ਹੈ।"</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"ਨੈੱਟਵਰਕ ਕਨੈਕਟੀਵਿਟੀ ਬਦਲੋ"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"ਐਪ ਨੂੰ ਨੈੱਟਵਰਕ ਕਨੈਕਟੀਵਿਟੀ ਦੀ ਸਥਿਤੀ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"ਟੀਥਰ ਕੀਤੀ ਕਨੈਕਟੀਵਿਟੀ ਬਦਲੋ"</string>
@@ -443,31 +444,31 @@
<string name="permlab_accessWifiState" msgid="5202012949247040011">"ਵਾਈ-ਫਾਈ ਕਨੈਕਸ਼ਨ ਦੇਖੋ"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"ਐਪ ਨੂੰ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਿੰਗ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜਿਵੇਂ ਵਾਈ-ਫਾਈ ਸਮਰਥਿਤ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਕਨੈਕਟ ਕੀਤੇ ਵਾਈ-ਫਾਈ ਡੀਵਾਈਸਾਂ ਦਾ ਨਾਮ।"</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"ਵਾਈ-ਫਾਈ ਤੋਂ ਕਨੈਕਟ ਅਤੇ ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"ਐਪ ਨੂੰ ਵਾਈ-ਫਾਈ ਪਹੁੰਚ ਬਿੰਦੂਆਂ ਤੇ ਕਨੈਕਟ ਅਤੇ ਇਹਨਾਂ ਤੋਂ ਡਿਸਕਨੈਕਟ ਕਰਨ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ ਲਈ ਡੀਵਾਈਸ ਸੰਰੂਪਣ ਵਿੱਚ ਬਦਲਾਵ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"ਐਪ ਨੂੰ ਵਾਈ-ਫਾਈ ਪਹੁੰਚ ਬਿੰਦੂਆਂ ਤੇ ਕਨੈਕਟ ਅਤੇ ਇਹਨਾਂ ਤੋਂ ਡਿਸਕਨੈਕਟ ਕਰਨ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈਟਵਰਕਾਂ ਲਈ ਡੀਵਾਈਸ ਸੰਰੂਪਣ ਵਿੱਚ ਬਦਲਾਵ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"ਵਾਈ-ਫਾਈ ਮਲਟੀਕਾਸਟ ਰਿਸੈਪਸ਼ਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ਐਪ ਨੂੰ ਮਲਟੀਕਾਸਟ ਪਤੇ ਵਰਤਦੇ ਹੋਏ ਇੱਕ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਤੇ ਭੇਜੇ ਗਏ ਪੈਕੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਸਿਰਫ਼ ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਨਹੀਂ। ਇਹ ਗ਼ੈਰ-ਮਲਟੀਕਾਸਟ ਮੋਡ ਦੇ ਮੁਕਾਬਲੇ ਵੱਧ ਪਾਵਰ ਵਰਤਦਾ ਹੈ।"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ਐਪ ਨੂੰ ਮਲਟੀਕਾਸਟ ਪਤੇ ਵਰਤਦੇ ਹੋਏ ਇੱਕ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੇ ਸਾਰੀਆਂ ਡੀਵਾਈਸਾਂ ਤੇ ਭੇਜੇ ਗਏ ਪੈਕੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਕੇਵਲ ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਨਹੀਂ। ਇਹ ਗੈਰ-ਮਲਟੀਕਾਸਟ ਮੋਡ ਦੇ ਮੁਕਾਬਲੇ ਵੱਧ ਪਾਵਰ ਵਰਤਦਾ ਹੈ।"</string>
<string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"ਐਪ ਨੂੰ ਮਲਟੀਕਾਸਟ ਪਤੇ ਵਰਤਦੇ ਹੋਏ ਇੱਕ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਤੇ ਭੇਜੇ ਗਏ ਪੈਕੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਸਿਰਫ਼ ਤੁਹਾਡਾ ਟੀਵੀ ਨਹੀਂ। ਇਹ ਗ਼ੈਰ-ਮਲਟੀਕਾਸਟ ਮੋਡ ਦੇ ਮੁਕਾਬਲੇ ਵੱਧ ਪਾਵਰ ਵਰਤਦਾ ਹੈ।"</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"ਐਪ ਨੂੰ ਮਲਟੀਕਾਸਟ ਪਤੇ, ਵਰਤਦੇ ਹੋਏ ਇੱਕ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਤੇ ਭੇਜੇ ਗਏ ਪੈਕੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਸਿਰਫ਼ ਤੁਹਾਡਾ ਫ਼ੋਨ ਨਹੀਂ। ਇਹ ਗ਼ੈਰ-ਮਲਟੀਕਾਸਟ ਮੋਡ ਦੇ ਮੁਕਾਬਲੇ ਵੱਧ ਪਾਵਰ ਵਰਤਦਾ ਹੈ।"</string>
- <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth ਸੈਟਿੰਗਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ਐਪ ਨੂੰ ਸਥਾਨਕ Bluetooth ਟੈਬਲੇਟ ਨੂੰ ਕੌਂਫਿਗਰ ਕਰਨ ਅਤੇ ਰਿਮੋਟ ਡਿਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਪੇਅਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"ਐਪ ਨੂੰ ਸਥਾਨਕ Bluetooth TV ਨੂੰ ਕੌਂਫਿਗਰ ਕਰਨ ਅਤੇ ਰਿਮੋਟ ਡਿਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਪੇਅਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ਐਪ ਨੂੰ ਸਥਾਨਕ Bluetooth ਫੋਨ ਨੂੰ ਕੌਂਫਿਗਰ ਕਰਨ ਅਤੇ ਰਿਮੋਟ ਡਿਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਪੇਅਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"ਐਪ ਨੂੰ ਮਲਟੀਕਾਸਟ ਪਤੇ, ਵਰਤਦੇ ਹੋਏ ਇੱਕ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਤੇ ਭੇਜੇ ਗਏ ਪੈਕੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਸਿਰਫ਼ ਤੁਹਾਡਾ ਫ਼ੋਨ ਨਹੀਂ। ਇਹ ਗੈਰ-ਮਲਟੀਕਾਸਟ ਮੋਡ ਦੇ ਮੁਕਾਬਲੇ ਵੱਧ ਪਾਵਰ ਵਰਤਦਾ ਹੈ।"</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ਬਲੂਟੁੱਥ ਸੈਟਿੰਗਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ਐਪ ਨੂੰ ਸਥਾਨਕ ਬਲੂਟੁੱਥ ਟੈਬਲੈੱਟ ਸੰਰੂਪਣ ਕਰਨ ਅਤੇ ਰਿਮੋਟ ਡੀਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਜੋੜਾਬੱਧ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"ਐਪ ਨੂੰ ਸਥਾਨਕ Bluetooth ਟੀਵੀ ਦੀ ਰੂਪ-ਰੇਖਾ ਬਦਲਣ ਅਤੇ ਰਿਮੋਟ ਡਿਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਪੇਅਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ਐਪ ਨੂੰ ਸਥਾਨਕ ਬਲੂਟੁੱਥ ਫ਼ੋਨ ਦੀ ਰੂਪ-ਰੇਖਾ ਬਦਲਣ ਅਤੇ ਰਿਮੋਟ ਡਿਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਪੇਅਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX ਤੋਂ ਕਨੈਕਟ ਅਤੇ ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ਐਪ ਨੂੰ ਇਹ ਨਿਰਧਾਰਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਕਿ WiMAX ਸਮਰਥਿਤ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਕਿਸੇ ਵੀ WiMAX ਨੈਟਵਰਕਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਜੋ ਕਨੈਕਟ ਕੀਤੇ ਹੋਏ ਹਨ।"</string>
<string name="permlab_changeWimaxState" msgid="340465839241528618">"WiMAX ਸਥਿਤੀ ਬਦਲੋ"</string>
- <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ਐਪ ਨੂੰ ਟੈਬਲੇਟ ਨੂੰ ਕਨੈਕਟ ਕਰਨ ਅਤੇ WiMAX ਨੈਟਵਰਕਾਂ ਤੋਂ ਟੈਬਲੇਟ ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ਐਪ ਨੂੰ ਟੈਬਲੈੱਟ ਨੂੰ ਕਨੈਕਟ ਕਰਨ ਅਤੇ WiMAX ਨੈਟਵਰਕਾਂ ਤੋਂ ਟੈਬਲੈੱਟ ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permdesc_changeWimaxState" product="tv" msgid="6022307083934827718">"ਐਪ ਨੂੰ TV ਨੂੰ ਕਨੈਕਟ ਕਰਨ ਅਤੇ WiMAX ਨੈਟਵਰਕਾਂ ਤੋਂ TV ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"ਐਪ ਨੂੰ ਫੋਨ ਨੂੰ ਕਨੈਕਟ ਕਰਨ ਅਤੇ WiMAX ਨੈਟਵਰਕਾਂ ਤੋਂ ਫੋਨ ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"ਐਪ ਨੂੰ ਫ਼ੋਨ ਨੂੰ ਕਨੈਕਟ ਕਰਨ ਅਤੇ WiMAX ਨੈੱਟਵਰਕਾਂ ਤੋਂ ਫ਼ੋਨ ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth ਡਿਵਾਈਸਾਂ ਨਾਲ ਪੇਅਰ ਕਰੋ"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ਐਪ ਨੂੰ ਟੈਬਲੇਟ ਤੇ Bluetooth ਦੀ ਕੌਂਫਿਗਰੇਸ਼ਨ ਦੇਖਣ, ਪੇਅਰ ਕੀਤੀਆਂ ਡਿਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਸ਼ਨ ਬਣਾਉਣ ਅਤੇ ਸਵੀਕਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"ਐਪ ਨੂੰ TV ਤੇ Bluetooth ਦੀ ਕੌਂਫਿਗਰੇਸ਼ਨ ਦੇਖਣ, ਪੇਅਰ ਕੀਤੀਆਂ ਡਿਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਸ਼ਨ ਬਣਾਉਣ ਅਤੇ ਸਵੀਕਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ਐਪ ਨੂੰ ਫੋਨ ਤੇ Bluetooth ਦੀ ਕੌਂਫਿਗਰੇਸ਼ਨ ਦੇਖਣ, ਪੇਅਰ ਕੀਤੀਆਂ ਡਿਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਸ਼ਨ ਬਣਾਉਣ ਅਤੇ ਸਵੀਕਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_nfc" msgid="4423351274757876953">"ਨੀਅਰ ਫੀਲਡ ਕਮਿਊਨੀਕੇਸ਼ਨ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string>
- <string name="permdesc_nfc" msgid="7120611819401789907">"ਐਪ ਨੂੰ Near Field Communication (NFC) ਟੈਗਸ, ਕਾਰਡਾਂ ਅਤੇ ਰੀਡਰਾਂ ਨਾਲ ਸੰਚਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ਐਪ ਨੂੰ ਟੈਬਲੈੱਟ ਤੇ ਬਲੂਟੁੱਥ ਦਾ ਸੰਰੂਪਣ ਦੇਖਣ, ਜੋੜਾਬੱਧ ਕੀਤੇ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਸ਼ਨ ਬਣਾਉਣ ਅਤੇ ਸਵੀਕਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"ਐਪ ਨੂੰ ਟੀਵੀ ਤੇ Bluetooth ਦੀ ਸੰਰੂਪਣ ਦੇਖਣ, ਜੋੜਾਬੱਧ ਕੀਤੇ ਡਿਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਸ਼ਨ ਬਣਾਉਣ ਅਤੇ ਸਵੀਕਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ਐਪ ਨੂੰ ਬਲੂਟੁੱਥ ਤੇ ਬਲੂਟੁੱਥ ਦਾ ਸੰਰੂਪਣ ਦੇਖਣ, ਜੋੜਾਬੱਧ ਕੀਤੇ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਸ਼ਨ ਬਣਾਉਣ ਅਤੇ ਸਵੀਕਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <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="permdesc_manageFingerprint" msgid="178208705828055464">"ਐਪ ਨੂੰ ਵਰਤੋਂ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰਨ ਅਤੇ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string>
<string name="permdesc_useFingerprint" msgid="9165097460730684114">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ਅਧੂਰਾ ਫਿੰਗਰਪ੍ਰਿਟ ਮਿਲਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
@@ -487,14 +488,14 @@
<string name="fingerprint_name_template" msgid="5870957565512716938">"ਉਂਗਲ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
- <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਆਈਕਨ"</string>
+ <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਹ ਨਿਰਧਾਰਿਤ ਕਰ ਸਕਦਾ ਹੈ ਕਿ People ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਨਾਲ ਸਿੰਕ ਕੀਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਹੀਂ।"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ਐਪ ਨੂੰ ਕਿਸੇ ਖਾਤੇ ਲਈ ਸਮਕਾਲੀਕਰਨ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਹ ਪਤਾ ਕਰ ਸਕਦਾ ਹੈ ਕਿ People ਐਪ ਦਾ ਕਿਸੇ ਖਾਤੇ ਨਾਲ ਸਮਕਾਲੀਕਿਰਤ ਕੀਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਹੀਂ।"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ਸਿੰਕ ਟੌਗਲ ਚਾਲੂ ਅਤੇ ਬੰਦ"</string>
- <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸਦੀ ਵਰਤੋਂ ਇੱਕ ਖਾਤੇ ਨਾਲ People ਐਪ ਦਾ ਸਿੰਕ ਸਮਰੱਥ ਬਣਾਉਣ ਲਈ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਮਕਾਲੀਕਰਨ ਸੈਟਿੰਗਾਂ ਸੋਧਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸਦੀ ਵਰਤੋਂ ਕਿਸੇ ਖਾਤੇ ਨਾਲ People ਐਪ ਦਾ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰਨ ਲਈ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"ਸਿੰਕ ਅੰਕੜੇ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readSyncStats" msgid="1510143761757606156">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਿੰਕ ਸਟੇਟਸ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਸਿੰਕ ਇਵੈਂਟਾਂ ਦੇ ਇਤਿਹਾਸ ਅਤੇ ਕਿੰਨਾ ਡੈਟਾ ਸਿੰਕ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਸਮੇਤ।"</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"ਆਪਣੀ USB ਸਟੋਰੇਜ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਪੜ੍ਹੋ"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਮਕਾਲੀਕਰਨ ਸਥਿਤੀ ਪੜ੍ਹਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ, ਇਸ ਵਿੱਚ ਸਮਕਾਲੀਕਰਨ ਵਰਤਾਰਿਆਂ ਦਾ ਇਤਿਹਾਸ ਅਤੇ ਕਿੰਨੇ ਡਾਟਾ ਦਾ ਸਮਕਾਲੀਕਿਰਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਵੀ ਸ਼ਾਮਲ ਹੈ।"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"USB ਸਟੋਰੇਜ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਪੜ੍ਹੋ"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"ਆਪਣੇ SD ਕਾਰਡ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਪੜ੍ਹੋ"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"ਐਪ ਨੂੰ ਆਪਣੀ USB ਸਟੋਰੇਜ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ SD ਕਾਰਡ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
@@ -510,12 +511,12 @@
<string name="permdesc_register_call_provider" msgid="7034310263521081388">"ਐਪ ਨੂੰ ਨਵੇਂ ਟੈਲੀਕੌਮ ਕਨੈਕਸ਼ਨ ਰਜਿਸਟਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ਟੈਲੀਕੌਮ ਕਨੈਕਸ਼ਨ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"ਐਪ ਨੂੰ ਟੈਲੀਕੌਮ ਕਨੈਕਸ਼ਨ ਵਿਵਸਥਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ਇਨ-ਕਾਲ ਸਕ੍ਰੀਨ ਨਾਲ ਇੰਟਰੈਕਟ ਕਰੋ"</string>
- <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ਐਪ ਨੂੰ ਇਸਤੇ ਨਿਯੰਤਰਣ ਪਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਕਿ ਉਪਭੋਗਤਾ ਕਦੋ ਅਤੇ ਕਿਵੇਂ ਇਨ-ਕਾਲ ਸਕ੍ਰੀਨ ਦੇਖਦਾ ਹੈ।"</string>
+ <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="permlab_control_incall_experience" msgid="9061024437607777619">"ਇੱਕ ਇਨ-ਕਾਲ ਉਪਭੋਗਤਾ ਅਨੁਭਵ ਮੁਹੱਈਆ ਕਰੋ"</string>
- <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ਐਪ ਨੂੰ ਇੱਕ ਇਨ-ਕਾਲ ਉਪਭੋਗਤਾ ਅਨੁਭਵ ਮੁਹੱਈਆ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</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>
<string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"ਐਪ ਨੂੰ ਖ਼ਾਸ ਨੈੱਟਵਰਕਾਂ ਅਤੇ ਐਪਸ ਲਈ ਇਤਿਹਾਸਕ ਨੈੱਟਵਰਕ ਵਰਤੋਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ਨੈੱਟਵਰਕ ਨੀਤੀ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
@@ -525,11 +526,11 @@
<string name="permlab_accessNotifications" msgid="7673416487873432268">"ਪਹੁੰਚ ਸੂਚਨਾਵਾਂ"</string>
<string name="permdesc_accessNotifications" msgid="458457742683431387">"ਐਪ ਨੂੰ ਸੂਚਨਾਵਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ, ਜਾਂਚ ਕਰਨ ਅਤੇ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਹੋਰਾਂ ਐਪਸ ਵੱਲੋਂ ਪੋਸਟ ਕੀਤੀਆਂ ਸਮੇਤ।"</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ਇੱਕ ਸੂਚਨਾ ਸੁਣਨ ਵਾਲੀ ਸੇਵਾ ਨਾਲ ਜੋੜੋ"</string>
- <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ਹੋਲਡਰ ਨੂੰ ਇੱਕ ਸੂਚਨਾ ਸੁਣਨ ਵਾਲੀ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਸ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ਹੋਲਡਰ ਨੂੰ ਇੱਕ ਸੂਚਨਾ ਸੁਣਨ ਵਾਲੀ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ਇੱਕ ਸਥਿਤੀ ਪ੍ਰਦਾਤਾ ਸੇਵਾ ਨਾਲ ਜੋੜੋ"</string>
- <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ਹੋਲਡਰ ਨੂੰ ਇੱਕ ਸਥਿਤੀ ਪ੍ਰਦਾਤਾ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਸ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ਧਾਰਕ ਨੂੰ ਇੱਕ ਸਥਿਤੀ ਪ੍ਰਦਾਤਾ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"ਇੱਕ ਡ੍ਰੀਮ ਸੇਵਾ ਨਾਲ ਜੋੜੋ"</string>
- <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ਹੋਲਡਰ ਨੂੰ ਇੱਕ ਡ੍ਰੀਮ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਸ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ਹੋਲਡਰ ਨੂੰ ਇੱਕ ਡ੍ਰੀਮ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
<string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ਕੈਰੀਅਰ-ਵੱਲੋਂ ਮੁਹੱਈਆ ਕੀਤੇ ਕੌਂਫਿਗਰੇਸ਼ਨ ਐਪ ਦੀ ਬੇਨਤੀ ਕਰੋ"</string>
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ਹੋਲਡਰ ਨੂੰ ਕੈਰੀਅਰ-ਵੱਲੋਂ ਮੁਹੱਈਆ ਕੀਤੇ ਕੌਂਫਿਗਰੇਸ਼ਨ ਐਪ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਸ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ਨੈੱਟਵਰਕ ਸਥਿਤੀਆਂ ਤੇ ਟਿੱਪਣੀਆਂ ਸੁਣੋ"</string>
@@ -541,40 +542,40 @@
<string name="permlab_handoverStatus" msgid="7820353257219300883">"Android ਬੀਮ ਟ੍ਰਾਂਸਫਰ ਸਥਿਤੀ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
<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="permdesc_removeDrmCertificates" msgid="7272999075113400993">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ DRM ਸਰਟੀਫਿਕੇਟ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
<string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ਇੱਕ ਕੈਰੀਅਰ ਮੈਸੇਜਿੰਗ ਸੇਵਾ ਨਾਲ ਜੋੜੋ"</string>
- <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"ਹੋਲਡਰ ਨੂੰ ਇੱਕ ਕੈਰੀਅਰ ਮੈਸੇਜਿੰਗ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਸ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</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>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"ਸਕ੍ਰੀਨ ਲੌਕ ਪਾਸਵਰਡਾਂ ਅਤੇ ਪਿੰਨ ਵਿੱਚ ਆਗਿਆ ਦਿੱਤੀ ਲੰਮਾਈ ਅਤੇ ਅੱਖਰਾਂ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ।"</string>
- <string name="policylab_watchLogin" msgid="5091404125971980158">"ਸਕ੍ਰੀਨ ਅਨਲੌਕ ਕਰਨ ਦੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ \'ਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਟੈਬਲੇਟ ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ ਟੈਬਲੇਟ ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
- <string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ TV ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ TV ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
- <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਫੋਨ ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ ਫੋਨ ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
- <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਟੈਬਲੇਟ ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ ਟੈਬਲੇਟ ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
- <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ TV ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ TV ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
- <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਫੋਨ ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ ਫੋਨ ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
+ <string name="policylab_watchLogin" msgid="5091404125971980158">"ਸਕ੍ਰੀਨ ਅਣਲਾਕ ਕਰਨ ਦੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ \'ਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਣਲਾਕ ਕਰਦੇ ਹੋਏ ਟਾਈਪ ਕੀਤੇ ਗਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਟੈਬਲੈੱਟ ਨੂੰ ਲਾਕ ਕਰੋ ਜਾਂ ਟੈਬਲੈੱਟ ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ, ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
+ <string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ TV ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ TV ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਣਲਾਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਫ਼ੋਨ ਨੂੰ ਲਾਕ ਕਰੋ ਜਾਂ ਫ਼ੋਨ ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
+ <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਣਲਾਕ ਕਰਦੇ ਹੋਏ ਟਾਈਪ ਕੀਤੇ ਗਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਟੈਬਲੈੱਟ ਨੂੰ ਲਾਕ ਕਰੋ ਜਾਂ ਟੈਬਲੈੱਟ ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ, ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
+ <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਲੌਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗ਼ਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ TV ਨੂੰ ਲੌਕ ਕਰੋ ਜਾਂ TV ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗ਼ਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
+ <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"ਸਕ੍ਰੀਨ ਨੂੰ ਅਣਲਾਕ ਕਰਦੇ ਸਮੇਂ ਟਾਈਪ ਕੀਤੇ ਗਲਤ ਪਾਸਵਰਡਾਂ ਦੀ ਸੰਖਿਆ ਦਾ ਨਿਰੀਖਣ ਕਰੋ ਅਤੇ ਫ਼ੋਨ ਨੂੰ ਲਾਕ ਕਰੋ ਜਾਂ ਫ਼ੋਨ ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ ਜੇਕਰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗਲਤ ਪਾਸਵਰਡ ਟਾਈਪ ਕੀਤੇ ਹਨ।"</string>
<string name="policylab_resetPassword" msgid="4934707632423915395">"ਸਕ੍ਰੀਨ ਲੌਕ ਬਦਲੋ"</string>
<string name="policydesc_resetPassword" msgid="1278323891710619128">"ਸਕ੍ਰੀਨ ਲੌਕ ਬਦਲੋ।"</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"ਸਕ੍ਰੀਨ ਲੌਕ ਕਰੋ"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"ਇਸਤੇ ਨਿਯੰਤਰਣ ਪਾਓ ਕਿ ਸਕ੍ਰਿਨ ਕਿਵੇਂ ਅਤੇ ਕਦੋਂ ਲੌਕ ਹੁੰਦੀ ਹੈ।"</string>
- <string name="policylab_wipeData" msgid="3910545446758639713">"ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"ਇੱਕ ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਕਰਕੇ ਚਿਤਾਵਨੀ ਤੋਂ ਬਿਨਾਂ ਟੈਬਲੇਟ ਦਾ ਡਾਟਾ ਮਿਟਾਓ।"</string>
+ <string name="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="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">"ਬਿਨਾਂ ਚਿਤਾਵਨੀ ਦੇ ਇਸ TV ਤੇ ਮੌਜੂਦ ਇਸ ਉਪਭੋਗਤਾ ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ।"</string>
- <string name="policydesc_wipeData_secondaryUser" product="default" msgid="6787904546711590238">"ਬਿਨਾਂ ਚਿਤਾਵਨੀ ਦੇ ਇਸ ਫੋਨ ਤੇ ਮੌਜੂਦ ਇਸ ਉਪਭੋਗਤਾ ਦਾ ਸਾਰਾ ਡੈਟਾ ਮਿਟਾਓ।"</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">"ਬਿਨਾਂ ਚਿਤਾਵਨੀ ਦੇ ਇਸ TV ਤੇ ਮੌਜੂਦ ਇਸ ਉਪਭੋਗਤਾ ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ।"</string>
+ <string name="policydesc_wipeData_secondaryUser" product="default" msgid="6787904546711590238">"ਬਿਨਾਂ ਚਿਤਾਵਨੀ ਦੇ ਇਸ ਫ਼ੋਨ ਤੇ ਮੌਜੂਦ ਇਸ ਵਰਤੋਂਕਾਰ ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ।"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"ਡੀਵਾਈਸ ਗਲੋਬਲ ਪ੍ਰੌਕਸੀ ਸੈੱਟ ਕਰੋ"</string>
- <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"ਜਦੋਂ ਨੀਤੀ ਸਮਰਥਿਤ ਹੋਵੇ ਤਾਂ ਵਰਤੇ ਜਾਣ ਲਈ ਡੀਵਾਈਸ ਗਲੋਬਲ ਪ੍ਰੌਕਸੀ ਸੈੱਟ ਕਰੋ। ਕੇਵਲ ਡੀਵਾਈਸ ਮਾਲਕ ਗਲੋਬਲ ਪ੍ਰੌਕਸੀ ਸੈੱਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
- <string name="policylab_expirePassword" msgid="5610055012328825874">"ਸਕ੍ਰੀਨ ਲੌਕ ਪਾਸਵਰਡ ਸਮਾਪਤੀ ਮਿਆਦ ਸੈੱਟ ਕਰੋ"</string>
- <string name="policydesc_expirePassword" msgid="5367525762204416046">"ਇਸ ਵਿੱਚ ਬਦਲਾਵ ਕਰੋ ਕਿ ਸਕ੍ਰੀਨ ਲੌਕ ਪਾਸਵਰਡ, ਪਿੰਨ ਜਾਂ ਪੈਟਰਨ ਨੂੰ ਕਿੰਨੀ ਵਾਰ ਬਦਲਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ।"</string>
+ <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"ਜਦੋਂ ਨੀਤੀ ਚਾਲੂ ਹੋਵੇ ਤਾਂ ਵਰਤੇ ਜਾਣ ਲਈ ਡੀਵਾਈਸ ਗਲੋਬਲ ਪ੍ਰੌਕਸੀ ਸੈੱਟ ਕਰੋ। ਕੇਵਲ ਡੀਵਾਈਸ ਮਾਲਕ ਗਲੋਬਲ ਪ੍ਰੌਕਸੀ ਸੈੱਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="policylab_expirePassword" msgid="5610055012328825874">"ਸਕ੍ਰੀਨ ਲਾਕ ਪਾਸਵਰਡ ਸਮਾਪਤੀ ਮਿਆਦ ਸੈੱਟ ਕਰੋ"</string>
+ <string name="policydesc_expirePassword" msgid="5367525762204416046">"ਇਸ ਵਿੱਚ ਬਦਲਾਵ ਕਰੋ ਕਿ ਸਕ੍ਰੀਨ ਲਾਕ ਪਾਸਵਰਡ, ਪਿੰਨ ਜਾਂ ਪੈਟਰਨ ਨੂੰ ਕਿੰਨੀ ਵਾਰ ਬਦਲਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ।"</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"ਸਟੋਰੇਜ ਇਨਕ੍ਰਿਪਸ਼ਨ ਸੈੱਟ ਕਰੋ"</string>
- <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ਲੋੜ ਹੈ ਕਿ ਸਟੋਰ ਕੀਤਾ ਐਪ ਡੈਟਾ ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾਏ।"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ਲੋੜ ਹੈ ਕਿ ਸਟੋਰ ਕੀਤਾ ਐਪ ਡਾਟਾ ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾਏ।"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"ਕੈਮਰੇ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"ਸਾਰੇ ਡੀਵਾਈਸ ਕੈਮਰਿਆਂ ਦੀ ਵਰਤੋਂ ਰੋਕੋ।"</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"ਸਕ੍ਰੀਨ ਲੌਕ ਦੀਆਂ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
@@ -587,30 +588,30 @@
<item msgid="1735177144948329370">"ਘਰ ਦੀ ਫੈਕਸ"</item>
<item msgid="603878674477207394">"ਪੇਜਰ"</item>
<item msgid="1650824275177931637">"ਹੋਰ"</item>
- <item msgid="9192514806975898961">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</item>
+ <item msgid="9192514806975898961">"ਵਿਉਂਂਤੀ"</item>
</string-array>
<string-array name="emailAddressTypes">
<item msgid="8073994352956129127">"ਘਰ"</item>
<item msgid="7084237356602625604">"ਕੰਮ"</item>
<item msgid="1112044410659011023">"ਹੋਰ"</item>
- <item msgid="2374913952870110618">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</item>
+ <item msgid="2374913952870110618">"ਵਿਉਂਂਤੀ"</item>
</string-array>
<string-array name="postalAddressTypes">
<item msgid="6880257626740047286">"ਘਰ"</item>
<item msgid="5629153956045109251">"ਕੰਮ"</item>
<item msgid="4966604264500343469">"ਹੋਰ"</item>
- <item msgid="4932682847595299369">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</item>
+ <item msgid="4932682847595299369">"ਵਿਉਂਂਤੀ"</item>
</string-array>
<string-array name="imAddressTypes">
<item msgid="1738585194601476694">"ਘਰ"</item>
<item msgid="1359644565647383708">"ਕੰਮ"</item>
<item msgid="7868549401053615677">"ਹੋਰ"</item>
- <item msgid="3145118944639869809">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</item>
+ <item msgid="3145118944639869809">"ਵਿਉਂਂਤੀ"</item>
</string-array>
<string-array name="organizationTypes">
<item msgid="7546335612189115615">"ਕੰਮ"</item>
<item msgid="4378074129049520373">"ਹੋਰ"</item>
- <item msgid="3455047468583965104">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</item>
+ <item msgid="3455047468583965104">"ਵਿਉਂਂਤੀ"</item>
</string-array>
<string-array name="imProtocols">
<item msgid="8595261363518459565">"AIM"</item>
@@ -622,7 +623,7 @@
<item msgid="2506857312718630823">"ICQ"</item>
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
- <string name="phoneTypeCustom" msgid="1644738059053355820">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"ਵਿਉਂਂਤੀ"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"ਘਰ"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"ਮੋਬਾਈਲ"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"ਕੰਮ"</string>
@@ -639,28 +640,28 @@
<string name="phoneTypeRadio" msgid="4093738079908667513">"ਰੇਡੀਓ"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"ਟੈਲੈਕਸ"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
- <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"ਦਫ਼ਤਰ ਦਾ ਮੋਬਾਈਲ"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"ਕੰਮ ਦਾ ਮੋਬਾਈਲ"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"ਦਫ਼ਤਰ ਦਾ ਪੇਜਰ"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"ਸਹਾਇਕ"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <string name="eventTypeCustom" msgid="7837586198458073404">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"ਵਿਉਂਂਤੀ"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"ਜਨਮਦਿਨ"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"ਵਰ੍ਹੇਗੰਢ"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"ਹੋਰ"</string>
- <string name="emailTypeCustom" msgid="8525960257804213846">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"ਵਿਉਂਂਤੀ"</string>
<string name="emailTypeHome" msgid="449227236140433919">"ਘਰ"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"ਕੰਮ"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"ਹੋਰ"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"ਮੋਬਾਈਲ"</string>
- <string name="postalTypeCustom" msgid="8903206903060479902">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"ਵਿਉਂਂਤੀ"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"ਘਰ"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"ਕੰਮ"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"ਹੋਰ"</string>
- <string name="imTypeCustom" msgid="2074028755527826046">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"ਵਿਉਂਂਤੀ"</string>
<string name="imTypeHome" msgid="6241181032954263892">"ਘਰ"</string>
<string name="imTypeWork" msgid="1371489290242433090">"ਕੰਮ"</string>
<string name="imTypeOther" msgid="5377007495735915478">"ਹੋਰ"</string>
- <string name="imProtocolCustom" msgid="6919453836618749992">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"ਵਿਉਂਂਤੀ"</string>
<string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
<string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
<string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
@@ -672,8 +673,8 @@
<string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
<string name="orgTypeWork" msgid="29268870505363872">"ਕੰਮ"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"ਹੋਰ"</string>
- <string name="orgTypeCustom" msgid="225523415372088322">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
- <string name="relationTypeCustom" msgid="3542403679827297300">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"ਵਿਉਂਂਤੀ"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"ਵਿਉਂਂਤੀ"</string>
<string name="relationTypeAssistant" msgid="6274334825195379076">"ਸਹਾਇਕ"</string>
<string name="relationTypeBrother" msgid="8757913506784067713">"ਭਰਾ"</string>
<string name="relationTypeChild" msgid="1890746277276881626">"ਬੱਚਾ"</string>
@@ -688,7 +689,7 @@
<string name="relationTypeRelative" msgid="1799819930085610271">"ਰਿਸ਼ਤੇਦਾਰ"</string>
<string name="relationTypeSister" msgid="1735983554479076481">"ਭੈਣ"</string>
<string name="relationTypeSpouse" msgid="394136939428698117">"ਜੀਵਨਸਾਥੀ"</string>
- <string name="sipAddressTypeCustom" msgid="2473580593111590945">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"ਵਿਉਂਂਤੀ"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"ਘਰ"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"ਕੰਮ"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"ਹੋਰ"</string>
@@ -698,31 +699,31 @@
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK ਕੋਡ"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"ਨਵਾਂ ਪਿੰਨ ਕੋਡ"</string>
<string name="keyguard_password_entry_touch_hint" msgid="2644215452200037944"><font size="17">"ਪਾਸਵਰਡ ਟਾਈਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</font></string>
- <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਟਾਈਪ ਕਰੋ"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਪਿੰਨ ਟਾਈਪ ਕਰੋ"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ਗ਼ਲਤ ਪਿੰਨ ਕੋਡ।"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"ਅਨਲੌਕ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਮੀਨੂ ਫਿਰ 0 ਦਬਾਓ।"</string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਟਾਈਪ ਕਰੋ"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਿੰਨ ਟਾਈਪ ਕਰੋ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ਗਲਤ ਪਿੰਨ ਕੋਡ।"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"ਅਣਲਾਕ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਮੀਨੂ ਫਿਰ 0 ਦਬਾਓ।"</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"ਐਮਰਜੈਂਸੀ ਨੰਬਰ"</string>
<string name="lockscreen_carrier_default" msgid="6169005837238288522">"ਕੋਈ ਸੇਵਾ ਨਹੀਂ"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"ਸਕ੍ਰੀਨ ਲੌਕ ਕੀਤੀ।"</string>
- <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਮੀਨੂ ਦਬਾਓ ਜਾਂ ਸੰਕਟਕਾਲੀਨ ਕਾਲ ਕਰੋ।"</string>
- <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਮੀਨੂ ਦਬਾਓ।"</string>
- <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਪੈਟਰਨ ਡ੍ਰਾ ਕਰੋ"</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਮੀਨੂ ਦਬਾਓ ਜਾਂ ਸੰਕਟਕਾਲੀਨ ਕਾਲ ਕਰੋ।"</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਮੀਨੂ ਦਬਾਓ।"</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਪੈਟਰਨ ਡ੍ਰਾ ਕਰੋ"</string>
<string name="lockscreen_emergency_call" msgid="5298642613417801888">"ਸੰਕਟਕਾਲ"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"ਕਾਲ ਤੇ ਵਾਪਸ ਜਾਓ"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ਸਹੀ!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
- <string name="lockscreen_storage_locked" msgid="9167551160010625200">"ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਡੈਟੇ ਲਈ ਅਨਲੌਕ ਕਰੋ"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ਅਧਿਕਤਮ ਚਿਹਰਾ ਅਨਲੌਕ ਕੋਸ਼ਿਸ਼ਾਂ ਵਧੀਆਂ"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ਕੋਈ SIM ਕਾਰਡ ਨਹੀਂ"</string>
- <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ਟੈਬਲੇਟ ਵਿੱਚ ਕੋਈ SIM ਕਾਰਡ ਨਹੀਂ।"</string>
- <string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"TV ਵਿੱਚ ਕੋਈ SIM ਕਾਰਡ ਨਹੀਂ।"</string>
- <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ਫੋਨ ਵਿੱਚ ਕੋਈ SIM ਕਾਰਡ ਨਹੀਂ।"</string>
+ <string name="lockscreen_storage_locked" msgid="9167551160010625200">"ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਡਾਟੇ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ਅਧਿਕਤਮ ਚਿਹਰਾ ਅਣਲਾਕ ਕੋਸ਼ਿਸ਼ਾਂ ਵਧੀਆਂ"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ਕੋਈ ਸਿਮ ਕਾਰਡ ਨਹੀਂ"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ਟੈਬਲੈੱਟ ਵਿੱਚ ਕੋਈ ਸਿਮ ਕਾਰਡ ਨਹੀਂ ਹੈ।"</string>
+ <string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"TV ਵਿੱਚ ਕੋਈ ਸਿਮ ਕਾਰਡ ਨਹੀਂ।"</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ਫ਼ੋਨ ਵਿੱਚ ਕੋਈ ਸਿਮ ਕਾਰਡ ਮੌਜੂਦ ਨਹੀਂ।"</string>
<string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ਇੱਕ SIM ਕਾਰਡ ਪਾਓ।"</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM ਕਾਰਡ ਲੁਪਤ ਹੈ ਜਾਂ ਪੜ੍ਹਨਯੋਗ ਨਹੀਂ ਹੈ। ਇੱਕ SIM ਕਾਰਡ ਪਾਓ।"</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"ਨਾਵਰਤਣਯੋਗ SIM ਕਾਰਡ।"</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ਤੁਹਾਡਾ SIM ਕਾਰਡ ਸਥਾਈ ਤੌਰ ਤੇ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।\n ਦੂਜੇ SIM ਕਾਰਡ ਲਈ ਆਪਣੇ ਵਾਇਰਲੈਸ ਸੇਵਾ ਪ੍ਰਦਾਤਾ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ਤੁਹਾਡਾ ਸਿਮ ਕਾਰਡ ਸਥਾਈ ਤੌਰ \'ਤੇ ਅਯੋਗ ਬਣਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।\n ਇੱਕ ਹੋਰ ਸਿਮ ਕਾਰਡ ਲਈ ਆਪਣੇ ਵਾਇਰਲੈੱਸ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"ਪਿਛਲਾ ਟਰੈਕ"</string>
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"ਅਗਲਾ ਟਰੈਕ"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"ਰੋਕੋ"</string>
@@ -736,30 +737,30 @@
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"ਉਪਭੋਗਤਾ ਗਾਈਡ ਦੇਖੋ ਜਾਂ ਗਾਹਕ ਸੇਵਾ ਨੂੰ ਫੋਨ ਕਰੋ।"</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM ਕਾਰਡ ਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ।"</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM ਕਾਰਡ ਅਨਲੌਕ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <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 ਸਾਈਨਇਨ ਵਰਤਦੇ ਹੋਏ ਆਪਣਾ TV ਅਨਲੌਕ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਏਗਾ।\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> ਵਾਰ ਗ਼ਲਤ ਢੰਗ ਨਾਲ TV ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। <xliff:g id="NUMBER_1">%2$d</xliff:g> ਵੱਧ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ, TV ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗਾ ਅਤੇ ਸਾਰਾ ਉਪਭੋਗਤਾ ਡੈਟਾ ਨਸ਼ਟ ਹੋ ਜਾਏਗਾ।"</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>
- <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗ਼ਲਤ ਢੰਗ ਨਾਲ ਟੈਬਲੇਟ ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਹੁਣ ਟੌਬਲੇਟ ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗੀ।"</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗ਼ਲਤ ਢੰਗ ਨਾਲ TV ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਹੁਣ TV ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗਾ।"</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗ਼ਲਤ ਢੰਗ ਨਾਲ ਫੋਨ ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਹੁਣ ਫੋਨ ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗਾ।"</string>
+ <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_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>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗਲਤ ਢੰਗ ਨਾਲ ਟੈਬਲੈੱਟ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਹੁਣ ਟੈਬਲੈੱਟ ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਵੇਗਾ।"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗਲਤ ਢੰਗ ਨਾਲ ਟੀਵੀ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਹੁਣ ਟੀਵੀ ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗਾ।"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗਲਤ ਢੰਗ ਨਾਲ ਫ਼ੋਨ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਹੁਣ ਫ਼ੋਨ ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗਾ।"</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"ਕੀ ਪੈਟਰਨ ਭੁੱਲ ਗਏ?"</string>
- <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"ਖਾਤਾ ਅਨਲੌਕ"</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>
- <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ਅਪ੍ਰਮਾਣਿਕ ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਪਾਸਵਰਡ।"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ਅਵੈਧ ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਪਾਸਵਰਡ।"</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ?\n"<b>"google.com/accounts/recovery"</b>" ਤੇ ਜਾਓ।"</string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ..."</string>
- <string name="lockscreen_unlock_label" msgid="737440483220667054">"ਅਨਲੌਕ ਕਰੋ"</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"ਅਣਲਾਕ ਕਰੋ"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"ਅਵਾਜ਼ ਚਾਲੂ"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"ਅਵਾਜ਼ ਬੰਦ"</string>
<string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ਪੈਟਰਨ ਚਾਲੂ ਕੀਤਾ"</string>
@@ -769,10 +770,10 @@
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ਪੈਟਰਨ ਪੂਰਾ ਕੀਤਾ"</string>
<string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ਪੈਟਰਨ ਖੇਤਰ।"</string>
<string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s। %3$d ਦਾ ਵਿਜੇਟ %2$d।"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ਵਿਜੇਟ ਜੋੜੋ।"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰੋ।"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ਖਾਲੀ"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ਅਨਲੌਕ ਖੇਤਰ ਦਾ ਵਿਸਤਾਰ ਕੀਤਾ।"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ਅਨਲੌਕ ਖੇਤਰ ਨਸ਼ਟ ਕੀਤਾ।"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ਅਣਲਾਕ ਖੇਤਰ ਦਾ ਵਿਸਤਾਰ ਕੀਤਾ।"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ਅਣਲਾਕ ਖੇਤਰ ਨਸ਼ਟ ਕੀਤਾ।"</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ਵਿਜੇਟ।"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ਉਪਭੋਗਤਾ ਚੋਣਕਾਰ"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"ਅਵਸਥਾ"</string>
@@ -781,12 +782,12 @@
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ਵਿਜੇਟ ਨੂੰ ਪੁਨਰ ਤਰਤੀਬ ਦੇਣਾ ਸ਼ੁਰੂ ਹੋਇਆ।"</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ਵਿਜੇਟ ਨੂੰ ਪੁਨਰ ਤਰਤੀਬ ਦੇਣਾ ਖ਼ਤਮ ਹੋਇਆ।"</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ਵਿਜੇਟ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ਮਿਟਾਇਆ।"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ਅਨਲੌਕ ਖੇਤਰ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ਅਨਲੌਕ ਸਲਾਈਡ ਕਰੋ।"</string>
- <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ਪੈਟਰਨ ਅਨਲੌਕ।"</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ਚਿਹਰਾ ਅਨਲੌਕ।"</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ਪਿੰਨ ਅਨਲੌਕ।"</string>
- <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ਪਾਸਵਰਡ ਅਨਲੌਕ।"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ਅਣਲਾਕ ਖੇਤਰ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ਅਣਲਾਕ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ਪੈਟਰਨ ਅਣਲਾਕ।"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ਚਿਹਰਾ ਅਣਲਾਕ।"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ਪਿੰਨ ਅਣਲਾਕ।"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ਪਾਸਵਰਡ ਅਣਲਾਕ।"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ਪੈਟਰਨ ਖੇਤਰ।"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ਖੇਤਰ ਸਲਾਈਡ ਕਰੋ।"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
@@ -797,17 +798,17 @@
<string name="granularity_label_link" msgid="5815508880782488267">"ਲਿੰਕ"</string>
<string name="granularity_label_line" msgid="5764267235026120888">"ਲਾਈਨ"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"ਫੈਕਟਰੀ ਜਾਂਚ ਅਸਫਲ"</string>
- <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST ਕਿਰਿਆ ਕੇਵਲ /ਸਿਸਟਮ/ਐਪ ਵਿੱਚ ਇੰਸਟੌਲ ਕੀਤੇ ਪੈਕੇਜਾਂ ਲਈ ਸਮਰਥਿਤ ਹੈ।"</string>
- <string name="factorytest_no_action" msgid="872991874799998561">"ਅਜਿਹਾ ਕੋਈ ਪੈਕੇਜ ਨਹੀਂ ਮਿਲਿਆ ਜੋ FACTORY_TEST ਕਿਰਿਆ ਮੁਹੱਈਆ ਕਰਦਾ ਹੈ।"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST ਕਾਰਵਾਈ ਕੇਵਲ /ਸਿਸਟਮ/ਐਪ ਵਿੱਚ ਸਥਾਪਤ ਕੀਤੇ ਪੈਕੇਜਾਂ ਲਈ ਸਮਰਥਿਤ ਹੈ।"</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"ਅਜਿਹਾ ਕੋਈ ਪੈਕੇਜ ਨਹੀਂ ਮਿਲਿਆ ਜੋ FACTORY_TEST ਕਾਰਵਾਈ ਮੁਹੱਈਆ ਕਰਦਾ ਹੈ।"</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"ਰੀਬੂਟ ਕਰੋ"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\" ਤੇ ਸਫ਼ੇ ਦੇ ਮੁਤਾਬਕ:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<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="double_tap_toast" msgid="4595046515400268881">"ਨੁਕਤਾ: ਜ਼ੂਮ ਵਧਾਉਣ ਅਤੇ ਘਟਾਉਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ।"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ਆਟੋਫਿਲ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ਆਟੋਫਿਲ ਸੈਟ ਅਪ ਕਰੋ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
@@ -817,7 +818,7 @@
<string name="autofill_province" msgid="2231806553863422300">"ਸੂਬਾ"</string>
<string name="autofill_postal_code" msgid="4696430407689377108">"ਡਾਕ ਕੋਡ"</string>
<string name="autofill_state" msgid="6988894195520044613">"ਰਾਜ"</string>
- <string name="autofill_zip_code" msgid="8697544592627322946">"ਜ਼ਿੱਪ ਕੋਡ"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ਜ਼ਿਪ ਕੋਡ"</string>
<string name="autofill_county" msgid="237073771020362891">"ਕਾਉਂਟੀ"</string>
<string name="autofill_island" msgid="4020100875984667025">"ਟਾਪੂ"</string>
<string name="autofill_district" msgid="8400735073392267672">"ਜ਼ਿਲ੍ਹਾ"</string>
@@ -827,17 +828,17 @@
<string name="autofill_area" msgid="3547409050889952423">"ਖੇਤਰ"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"ਅਮੀਰਾਤ"</string>
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"ਆਪਣੇ ਵੈੱਬ ਬੁੱਕਮਾਰਕ ਅਤੇ ਇਤਿਹਾਸ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"ਐਪ ਨੂੰ ਸਾਰੇ URL ਜਿਨ੍ਹਾਂ \'ਤੇ ਬ੍ਰਾਊਜ਼ਰ ਨੇ ਵਿਜਿਟ ਕੀਤਾ ਹੈ ਅਤੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਸਾਰੇ ਬੁੱਕਮਾਰਕਾਂ ਦਾ ਇਤਿਹਾਸ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਨੋਟ: ਇਹ ਇਜਾਜ਼ਤ ਤੀਜੀ-ਪਾਰਟੀ ਬ੍ਰਾਊਜ਼ਰਾਂ ਜਾਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਮਰੱਥਾ ਵਾਲੀਆਂ ਹੋਰਾਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਲਾਗੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"ਐਪ ਨੂੰ ਸਾਰੇ URL ਜਿਨ੍ਹਾਂ ਤੇ ਬ੍ਰਾਊਜ਼ਰ ਨੇ ਵਿਜਿਟ ਕੀਤਾ ਹੈ ਅਤੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਸਾਰੇ ਬੁੱਕਮਾਰਕਾਂ, ਦਾ ਇਤਿਹਾਸ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਨੋਟ: ਇਹ ਅਨੁਮਤੀ ਤੀਜੀ-ਪਾਰਟੀ ਬ੍ਰਾਊਜ਼ਰਾਂ ਜਾਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਮਰੱਥਾ ਵਾਲੀਆਂ ਹੋਰਾਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਲਾਗੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"ਵੈੱਬ ਬੁੱਕਮਾਰਕ ਅਤੇ ਇਤਿਹਾਸ ਲਿਖੋ"</string>
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਇਤਿਹਾਸ ਅਤੇ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਬੁੱਕਮਾਰਕਾਂ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਡਾਟਾ ਸਾਫ਼ ਕਰਨ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ। ਨੋਟ: ਇਹ ਇਜਾਜ਼ਤ ਤੀਜੀ-ਪਾਰਟੀ ਬ੍ਰਾਊਜ਼ਰਾਂ ਜਾਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਮਰੱਥਾ ਵਾਲੀਆਂ ਹੋਰਾਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਲਾਗੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਇਤਿਹਾਸ ਅਤੇ ਤੁਹਾਡੇ TV \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਬੁੱਕਮਾਰਕਾਂ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਡਾਟਾ ਸਾਫ਼ ਕਰਨ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ। ਨੋਟ: ਇਹ ਇਜਾਜ਼ਤ ਤੀਜੀ-ਪਾਰਟੀ ਬ੍ਰਾਊਜ਼ਰਾਂ ਜਾਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਮਰੱਥਾ ਵਾਲੀਆਂ ਹੋਰਾਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਲਾਗੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਇਤਿਹਾਸ ਅਤੇ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਬੁੱਕਮਾਰਕਾਂ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਡਾਟਾ ਸਾਫ਼ ਕਰਨ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ। ਨੋਟ: ਇਹ ਇਜਾਜ਼ਤ ਤੀਜੀ-ਪਾਰਟੀ ਬ੍ਰਾਊਜ਼ਰਾਂ ਜਾਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਮਰੱਥਾ ਵਾਲੀਆਂ ਹੋਰਾਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਲਾਗੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਇਤਿਹਾਸ ਅਤੇ ਤੁਹਾਡੇ ਟੀਵੀ ਤੇ ਸਟੋਰ ਕੀਤੇ ਬੁੱਕਮਾਰਕਾਂ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਡਾਟਾ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ। ਨੋਟ: ਇਹ ਅਨੁਮਤੀ ਤੀਜੀ-ਪਾਰਟੀ ਬ੍ਰਾਊਜ਼ਰਾਂ ਜਾਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਮਰੱਥਾ ਵਾਲੀਆਂ ਹੋਰਾਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਲਾਗੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਇਤਿਹਾਸ ਅਤੇ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੇ ਸਟੋਰ ਕੀਤੇ ਬੁੱਕਮਾਰਕਾਂ ਨੂੰ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਡਾਟਾ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ। ਨੋਟ: ਇਹ ਅਨੁਮਤੀ ਤੀਜੀ-ਪਾਰਟੀ ਬ੍ਰਾਊਜ਼ਰਾਂ ਜਾਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਮਰੱਥਤਾਵਂ ਵਾਲੀਆਂ ਹੋਰਾਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵੱਲੋਂ ਲਾਗੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"ਇੱਕ ਅਲਾਰਮ ਸੈੱਟ ਕਰੋ"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"ਐਪ ਨੂੰ ਇੱਕ ਇੰਸਟੌਲ ਕੀਤੀ ਅਲਾਰਮ ਘੜੀ ਐਪ ਵਿੱਚ ਇੱਕ ਅਲਾਰਮ ਸੈਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਕੁਝ ਅਲਾਰਮ ਘੜੀ ਐਪਲ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਲਾਗੂ ਨਹੀਂ ਵੀ ਕਰ ਸਕਦੇ।"</string>
- <string name="permlab_addVoicemail" msgid="5525660026090959044">"ਵੌਇਸਮੇਲ ਜੋੜੋ"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਇਨਬੌਕਸ ਵਿੱਚ ਸੁਨੇਹੇ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"ਬ੍ਰਾਊਜ਼ਰ ਜਿਓਲੋਕੇਸ਼ਨ ਅਨੁਮਤੀਆਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"ਐਪ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਦੀਆਂ ਜਿਓਲੋਕੇਸ਼ਨ ਇਜਾਜ਼ਤਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਖਰਾਬ ਐਪਾਂ ਇਸਦੀ ਵਰਤੋਂ ਆਰਬਿਟਰੇਰੀ ਵੈੱਬ ਸਾਈਟਾਂ ਨੂੰ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦੇਣ ਲਈ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"ਵੌਇਸਮੇਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <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_notnow" msgid="6389675316706699758">"ਅਜੇ ਨਹੀਂ"</string>
<string name="save_password_remember" msgid="6491879678996749466">"ਯਾਦ ਰੱਖੋ"</string>
@@ -856,9 +857,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"ਸਵਾਲ ਹਟਾਓ"</string>
<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_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="oneMonthDurationPast" msgid="7396384508953779925">"1 ਮਹੀਨੇ ਪਹਿਲਾਂ"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 ਮਹੀਨਾ ਪਹਿਲਾਂ ਤੋਂ ਪਹਿਲਾਂ"</string>
<plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
@@ -948,7 +949,7 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ ਵਿੱਚ</item>
</plurals>
<string name="VideoView_error_title" msgid="3534509135438353077">"ਵੀਡੀਓ ਸਮੱਸਿਆ"</string>
- <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ਇਹ ਵੀਡੀਓ ਇਸ ਡੀਵਾਈਸ ਤੇ ਸਟ੍ਰੀਮਿੰਗ ਲਈ ਵੈਧ ਨਹੀਂ ਹੈ।"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ਇਹ ਵੀਡੀਓ ਇਸ ਡੀਵਾਈਸ ਤੇ ਸਟ੍ਰੀਮਿੰਗ ਲਈ ਪ੍ਰਮਾਣਕ ਨਹੀਂ ਹੈ।"</string>
<string name="VideoView_error_text_unknown" msgid="3450439155187810085">"ਇਹ ਵੀਡੀਓ ਪਲੇ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string>
<string name="VideoView_error_button" msgid="2822238215100679592">"ਠੀਕ"</string>
<string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -972,17 +973,17 @@
<string name="redo" msgid="7759464876566803888">"ਮੁੜ-ਓਹੀ ਕਰੋ"</string>
<string name="autofill" msgid="3035779615680565188">"ਆਟੋਫਿਲ"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"ਟੈਕਸਟ ਚੋਣ"</string>
- <string name="addToDictionary" msgid="4352161534510057874">"ਸ਼ਬਦਕੋਸ਼ ਵਿੱਚ ਜੋੜੋ"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"ਸ਼ਬਦਕੋਸ਼ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="deleteText" msgid="6979668428458199034">"ਮਿਟਾਓ"</string>
- <string name="inputMethod" msgid="1653630062304567879">"ਇਨਪੁਟ ਵਿਧੀ"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ਟੈਕਸਟ ਕਿਰਿਆਵਾਂ"</string>
<string name="email" msgid="4560673117055050403">"ਈਮੇਲ ਕਰੋ"</string>
<string name="dial" msgid="4204975095406423102">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="map" msgid="6068210738233985748">"ਨਕਸ਼ੇ"</string>
<string name="browse" msgid="6993590095938149861">"ਬ੍ਰਾਊਜ਼ਰ"</string>
- <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ਸਟੋਰੇਜ ਸਪੇਸ ਖ਼ਤਮ ਹੋ ਰਿਹਾ ਹੈ"</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>
+ <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ਸਿਸਟਮ ਲਈ ਲੋੜੀਂਦੀ ਸਟੋਰੇਜ ਨਹੀਂ ਹੈ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੇ ਕੋਲ 250MB ਖਾਲੀ ਜਗ੍ਹਾ ਹੈ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"ਹੋਰ ਜਾਣਕਾਰੀ ਜਾਂ ਐਪ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="ok" msgid="5970060430562524910">"ਠੀਕ"</string>
@@ -993,14 +994,14 @@
<string name="loading" msgid="7933681260296021180">"ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ..."</string>
<string name="capital_on" msgid="1544682755514494298">"ਚਾਲੂ"</string>
<string name="capital_off" msgid="6815870386972805832">"ਬੰਦ"</string>
- <string name="whichApplication" msgid="4533185947064773386">"ਇਸਨੂੰ ਵਰਤਦੇ ਹੋਏ ਕਿਰਿਆ ਪੂਰੀ ਕਰੋ"</string>
- <string name="whichApplicationNamed" msgid="8260158865936942783">"%1$s ਵਰਤਦੇ ਹੋਏ ਕਿਰਿਆ ਪੂਰੀ ਕਰੋ"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"ਇਸਨੂੰ ਵਰਤਦੇ ਹੋਏ ਕਾਰਵਾਈ ਪੂਰੀ ਕਰੋ"</string>
+ <string name="whichApplicationNamed" msgid="8260158865936942783">"%1$s ਵਰਤਦੇ ਹੋਏ ਕਾਰਵਾਈ ਪੂਰੀ ਕਰੋ"</string>
<string name="whichApplicationLabel" msgid="7425855495383818784">"ਕਾਰਵਾਈ ਪੂਰੀ ਕਰੋ"</string>
<string name="whichViewApplication" msgid="3272778576700572102">"ਨਾਲ ਖੋਲ੍ਹੋ"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ਨਾਲ ਖੋਲ੍ਹੋ"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"ਖੋਲ੍ਹੋ"</string>
- <string name="whichEditApplication" msgid="144727838241402655">"ਨਾਲ ਸੰਪਾਦਿਤ ਕਰੋ"</string>
- <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ਨਾਲ ਸੰਪਾਦਿਤ ਕਰੋ"</string>
+ <string name="whichEditApplication" msgid="144727838241402655">"ਇਸ ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string>
+ <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="whichSendApplication" msgid="6902512414057341668">"ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$s ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
@@ -1014,12 +1015,12 @@
<string name="whichImageCaptureApplication" msgid="3680261417470652882">"ਇਸ ਨਾਲ ਚਿਤਰ ਕੈਪਚਰ ਕਰੋ"</string>
<string name="whichImageCaptureApplicationNamed" msgid="8619384150737825003">"%1$s ਨਾਲ ਚਿਤਰ ਕੈਪਚਰ ਕਰੋ"</string>
<string name="whichImageCaptureApplicationLabel" msgid="6390303445371527066">"ਚਿਤਰ ਕੈਪਚਰ ਕਰੋ"</string>
- <string name="alwaysUse" msgid="4583018368000610438">"ਇਸ ਕਿਰਿਆ ਲਈ ਬਾਇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਵਰਤੋ।"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"ਇਸ ਕਾਰਵਾਈ ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਵਰਤੋ।"</string>
<string name="use_a_different_app" msgid="8134926230585710243">"ਇੱਕ ਵੱਖਰਾ ਖਾਤਾ ਵਰਤੋ"</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ > ਐਪਸ > ਡਾਊਨਲੋਡ ਕੀਤਿਆਂ ਵਿੱਚ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਹਟਾਓ।"</string>
- <string name="chooseActivity" msgid="7486876147751803333">"ਇੱਕ ਕਿਰਿਆ ਚੁਣੋ"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ > ਐਪਾਂ > ਡਾਊਨਲੋਡ ਕੀਤਿਆਂ ਵਿੱਚ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਹਟਾਓ।"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"ਇੱਕ ਕਾਰਵਾਈ ਚੁਣੋ"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"USB ਡੀਵਾਈਸ ਲਈ ਇੱਕ ਐਪ ਚੁਣੋ"</string>
- <string name="noApplications" msgid="2991814273936504689">"ਕੋਈ ਐਪਸ ਇਸ ਕਿਰਿਆ ਨੂੰ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string>
+ <string name="noApplications" msgid="2991814273936504689">"ਕੋਈ ਐਪਾਂ ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ।"</string>
<string name="aerr_application" msgid="250320989337856518">"<xliff:g id="APPLICATION">%1$s</xliff:g> ਰੁਕ ਗਈ ਹੈ"</string>
<string name="aerr_process" msgid="6201597323218674729">"<xliff:g id="PROCESS">%1$s</xliff:g> ਰੁਕ ਗਿਆ ਹੈ"</string>
<string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> ਵਾਰ-ਵਾਰ ਰੁਕ ਰਹੀ ਹੈ"</string>
@@ -1044,24 +1045,24 @@
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਅਸਲ ਵਿੱਚ ਲੌਂਚ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"ਸਕੇਲ"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"ਹਮੇਸ਼ਾਂ ਦਿਖਾਓ"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ > ਐਪਸ > ਡਾਊਨਲੋਡ ਕੀਤਿਆਂ ਵਿੱਚ ਇਸਨੂੰ ਮੁੜ-ਸਮਰੱਥ ਬਣਾਓ।"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ > ਐਪਾਂ > ਡਾਊਨਲੋਡ ਕੀਤਿਆਂ ਵਿੱਚ ਇਸਨੂੰ ਮੁੜ-ਸਮਰੱਥ ਬਣਾਓ।"</string>
<string name="unsupported_display_size_message" msgid="6545327290756295232">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਆਕਾਰ ਸੈਟਿੰਗ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਹੈ ਅਤੇ ਅਣਕਿਆਸੇ ਤੌਰ \'ਤੇ ਵਿਹਾਰ ਕਰ ਸਕਦੀ ਹੈ।"</string>
- <string name="unsupported_display_size_show" msgid="7969129195360353041">"ਹਮੇਸ਼ਾ ਵਿਖਾਓ"</string>
- <string name="smv_application" msgid="3307209192155442829">"ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> (ਪ੍ਰਕਿਰਿਆ<xliff:g id="PROCESS">%2$s</xliff:g>) ਨੇ ਆਪਣੀ ਖੁਦ-ਲਾਗੂ ਕੀਤੀ ਸਟ੍ਰਿਕਟਮੋਡ ਨੀਤੀ ਦੀ ਉਲੰਘਣਾ ਕੀਤੀ ਹੈ।"</string>
+ <string name="unsupported_display_size_show" msgid="7969129195360353041">"ਹਮੇਸ਼ਾ ਦਿਖਾਓ"</string>
+ <string name="smv_application" msgid="3307209192155442829">"ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> (ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROCESS">%2$s</xliff:g>) ਨੇ ਆਪਣੀ ਖੁਦ-ਲਾਗੂ ਕੀਤੀ ਸਟ੍ਰਿਕਟਮੋਡ ਨੀਤੀ ਦੀ ਉਲੰਘਣਾ ਕੀਤੀ ਹੈ।"</string>
<string name="smv_process" msgid="5120397012047462446">"ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROCESS">%1$s</xliff:g> ਨੇ ਆਪਣੀ ਖੁਦ-ਲਾਗੂ ਕੀਤੀ ਸਟ੍ਰਿਕਟਮੋਡ ਨੀਤੀ ਦੀ ਉਲੰਘਣਾ ਕੀਤੀ ਹੈ।"</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"Android ਅਪਗ੍ਰੇਡ ਕਰ ਰਿਹਾ ਹੈ…"</string>
<string name="android_start_title" msgid="8418054686415318207">"Android ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="android_upgrading_fstrim" msgid="8036718871534640010">"ਸਟੋਰੇਜ ਅਨੁਕੂਲ ਕਰ ਰਿਹਾ ਹੈ।"</string>
+ <string name="android_upgrading_fstrim" msgid="8036718871534640010">"ਸਟੋਰੇਜ ਅਨੁਕੂਲ ਹੋ ਰਹੀ ਹੈ।"</string>
<string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android ਅੱਪਡੇਟ ਮੁਕੰਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਕੁਝ ਐਪਾਂ ਅੱਪਗ੍ਰੇਡ ਦੇ ਪੂਰੀ ਹੋਣ ਤੱਕ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ"</string>
+ <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਕੁਝ ਐਪਾਂ ਅੱਪਗ੍ਰੇਡ ਪੂਰਾ ਹੋਣ ਤੱਕ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ਅੱਪਗ੍ਰੇਡ ਹੋ ਰਹੀ ਹੈ…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> <xliff:g id="NUMBER_1">%2$d</xliff:g> ਦਾ ਐਪ ਅਨੁਕੂਲ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ਐਪਸ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ਬੂਟ ਪੂਰਾ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ਵਾਪਸ ਐਪ \'ਤੇ ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ਕੀ ਐਪਸ ਸਵਿਚ ਕਰਨੇ ਹਨ?"</string>
+ <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ਵਾਪਸ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ਕੀ ਐਪਾਂ \'ਤੇ ਸਵਿੱਚ ਕਰਨਾ ਹੈ?"</string>
<string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ਦੂਜਾ ਐਪ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਿਹਾ ਹੈ, ਜਿਸਨੂੰ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੱਕ ਨਵਾਂ ਐਪ ਚਾਲੂ ਕਰ ਸਕਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਰੋਕਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ।"</string>
<string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> ਤੇ ਵਾਪਸ ਜਾਓ"</string>
<string name="old_app_description" msgid="2082094275580358049">"ਨਵਾਂ ਐਪ ਚਾਲੂ ਨਾ ਕਰੋ।"</string>
@@ -1070,20 +1071,20 @@
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਮੈਮਰੀ ਸੀਮਾ ਵਧ ਗਈ ਹੈ"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ਹੀਪ ਡੰਪ ਇਕੱਤਰ ਕੀਤਾ ਗਿਆ; ਸਾਂਝਾ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ਕੀ ਹੀਪ ਡੰਪ ਸ਼ੇਅਰ ਕਰਨਾ ਹੈ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਆਪਣੀ ਪ੍ਰਕਿਰਿਆ ਮੈਮਰੀ ਸੀਮਾ<xliff:g id="SIZE">%2$s</xliff:g> ਵਧ ਗਈ ਹੈ। ਇਸਦੇ ਵਿਕਾਸਕਾਰ ਨਾਲ ਸ਼ੇਅਰ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਹੀਪ ਡੰਪ ਉਪਲਬਧ ਹੈ। ਸਾਵਧਾਨ ਰਹੋ: ਇਸ ਹੀਪ ਡੰਪ ਵਿੱਚ ਤੁਹਾਡੀ ਕੋਈ ਵੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਹੋ ਸਕਦੀ ਹੈ, ਜਿਸਤੇ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਪਹੁੰਚ ਹੈ।"</string>
- <string name="sendText" msgid="5209874571959469142">"ਟੈਕਸਟ ਲਈ ਇੱਕ ਕਿਰਿਆ ਚੁਣੋ"</string>
+ <string name="dump_heap_text" msgid="4809417337240334941">"ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਆਪਣੀ ਪ੍ਰਕਿਰਿਆ ਮੈਮਰੀ ਸੀਮਾ <xliff:g id="SIZE">%2$s</xliff:g> ਵਧ ਗਈ ਹੈ। ਇਸਦੇ ਵਿਕਾਸਕਾਰ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਹੀਪ ਡੰਪ ਉਪਲਬਧ ਹੈ। ਸਾਵਧਾਨ ਰਹੋ: ਇਸ ਹੀਪ ਡੰਪ ਵਿੱਚ ਤੁਹਾਡੀ ਕੋਈ ਵੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਹੋ ਸਕਦੀ ਹੈ, ਜਿਸ \'ਤੇ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਪਹੁੰਚ ਹੈ।"</string>
+ <string name="sendText" msgid="5209874571959469142">"ਲਿਖਤ ਲਈ ਕੋਈ ਕਾਰਵਾਈ ਚੁਣੋ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ਰਿੰਗਰ ਵੌਲਿਊਮ"</string>
<string name="volume_music" msgid="5421651157138628171">"ਮੀਡੀਆ ਵੌਲਿਊਮ"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth ਰਾਹੀਂ ਪਲੇ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"ਖਾਮੋਸ਼ ਰਿੰਗਟੋਨ ਸੈੱਟ ਕੀਤੀ"</string>
- <string name="volume_call" msgid="3941680041282788711">"ਇਨ-ਕਾਲ ਵੌਲਿਊਮ"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth ਇਨ-ਕਾਲ ਵੌਲਿਊਮ"</string>
+ <string name="volume_call" msgid="3941680041282788711">"ਇਨ-ਕਾਲ ਅਵਾਜ਼"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"ਬਲੂਟੁੱਥ ਇਨ-ਕਾਲ ਅਵਾਜ਼"</string>
<string name="volume_alarm" msgid="1985191616042689100">"ਅਲਾਰਮ ਵੌਲਿਊਮ"</string>
<string name="volume_notification" msgid="2422265656744276715">"ਸੂਚਨਾ ਵੌਲਿਊਮ"</string>
<string name="volume_unknown" msgid="1400219669770445902">"ਵੌਲਿਊਮ"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth ਵੌਲਿਊਮ"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"ਰਿੰਗਟੋਨ ਵੌਲਿਊਮ"</string>
- <string name="volume_icon_description_incall" msgid="8890073218154543397">"ਕਾਲ ਵੌਲਿਊਮ"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"ਕਾਲ ਅਵਾਜ਼"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"ਮੀਡੀਆ ਵੌਲਿਊਮ"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"ਸੂਚਨਾ ਵੌਲਿਊਮ"</string>
<string name="ringtone_default" msgid="3789758980357696936">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰਿੰਗਟੋਨ"</string>
@@ -1108,8 +1109,8 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ਕਨੈਕਟ ਕਰੋ"</string>
<string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ਸਾਰੇ ਨੈੱਟਵਰਕ"</string>
- <string name="wifi_available_sign_in" msgid="9157196203958866662">"ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
- <string name="network_available_sign_in" msgid="1848877297365446605">"ਨੈੱਟਵਰਕ ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ"</string>
+ <string name="wifi_available_sign_in" msgid="9157196203958866662">"ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ \'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
+ <string name="network_available_sign_in" msgid="1848877297365446605">"ਨੈੱਟਵਰਕ \'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
<string name="wifi_no_internet" msgid="8451173622563841546">"ਵਾਈ-ਫਾਈ ਦੀ ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
@@ -1126,12 +1127,12 @@
</string-array>
<string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ਇੱਕ ਅਗਿਆਤ ਨੈੱਟਵਰਕ ਕਿਸਮ"</string>
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ਵਾਈ-ਫਾਈ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੋ ਸਕਿਆ"</string>
- <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ਇਸਦਾ ਇੱਕ ਖ਼ਰਾਬ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਹੈ।"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ਇਸਦਾ ਇੱਕ ਖਰਾਬ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਹੈ।"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"ਕੀ ਕਨੈਕਸ਼ਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
<string name="wifi_connect_alert_message" msgid="6451273376815958922">"ਐਪਲੀਕੇਸ਼ਨ %1$s ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ %2$s ਨਾਲ ਕਨੈਕਟ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"ਵਾਈ-ਫਾਈ ਡਾਇਰੈਕਟ"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ਵਾਈ-ਫਾਈ ਡਾਇਰੈਕਟ ਚਾਲੂ ਕਰੋ। ਇਹ ਵਾਈ-ਫਾਈ ਕਲਾਈਂਟ/ਹੌਟਸਪੌਟ ਨੂੰ ਬੰਦ ਕਰ ਦੇਵੇਗਾ।"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi ਡਾਇਰੈਕਟ ਚਾਲੂ ਕਰੋ। ਇਹ ਵਾਈ-ਫਾਈ ਕਲਾਇੰਟ/ਹੌਟਸਪੌਟ ਨੂੰ ਬੰਦ ਕਰ ਦੇਵੇਗਾ।"</string>
<string name="wifi_p2p_failed_message" msgid="3763669677935623084">"ਵਾਈ-ਫਾਈ ਡਾਇਰੈਕਟ ਚਾਲੂ ਨਹੀਂ ਹੋ ਸਕਿਆ।"</string>
<string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"ਵਾਈ-ਫਾਈ ਡਾਇਰੈਕਟ ਚਾਲੂ ਹੈ।"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="8064677407830620023">"ਸੈਟਿੰਗਾਂ ਲਈ ਟੈਪ ਕਰੋ"</string>
@@ -1143,7 +1144,7 @@
<string name="wifi_p2p_to_message" msgid="248968974522044099">"ਵੱਲ:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"ਲੋੜੀਂਦਾ ਪਿੰਨ ਟਾਈਪ ਕਰੋ:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"ਪਿੰਨ:"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"ਟੈਬਲੈੱਟ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤੇ ਜਾਣ ਤੇ ਵਾਈ-ਫਾਈ ਤੋਂ ਅਸਥਾਈ ਤੌਰ ਤੇ ਡਿਸਕਨੈਕਟ ਹੋ ਜਾਏਗਾ"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"ਟੈਬਲੈੱਟ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤੇ ਜਾਣ ਤੇ ਵਾਈ-ਫਾਈ ਤੋਂ ਅਸਥਾਈ ਤੌਰ ਤੇ ਡਿਸਕਨੈਕਟ ਹੋ ਜਾਵੇਗਾ"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"TV <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤੇ ਜਾਣ ਤੇ ਵਾਈ-ਫਾਈ ਤੋਂ ਅਸਥਾਈ ਤੌਰ ਤੇ ਡਿਸਕਨੈਕਟ ਹੋ ਜਾਏਗਾ"</string>
<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>
@@ -1152,21 +1153,21 @@
<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_details" msgid="5873295990846059400">"ਇਸ ਨਾਲ "<b>"ਤੁਹਾਡੇ ਮੋਬਾਈਲ ਖਾਤੇ ਤੇ ਖ਼ਰਚੇ"</b>" ਪੈ ਸਕਦੇ ਹਨ।"</string>
- <string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"ਇਸ ਨਾਲ ਤੁਹਾਡੇ ਮੋਬਾਈਲ ਖਾਤੇ ਤੇ ਖ਼ਰਚੇ ਪੈਣਗੇ।"</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="2333164559970958645">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਅਣਉਪਲਬਧ ਹੋਵੇਗਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਇੱਕ ਪ੍ਰਮਾਣਿਕ ਸਿਮ ਕਾਰਡ ਪਾ ਕੇ ਰੀਸਟਾਰਟ ਨਹੀਂ ਕਰਦੇ।"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਅਣਉਪਲਬਧ ਹੋਵੇਗਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਇੱਕ ਵੈਧ ਸਿਮ ਕਾਰਡ ਪਾ ਕੇ ਮੁੜ-ਚਾਲੂ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="sim_done_button" msgid="827949989369963775">"ਹੋ ਗਿਆ"</string>
<string name="sim_added_title" msgid="3719670512889674693">"SIM ਕਾਰਡ ਜੋੜਿਆ ਗਿਆ"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਲਈ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ਰੀਸਟਾਰਟ ਕਰੋ"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"ਤੁਹਾਡੀ ਨਵੀਂ SIM ਦੇ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਤੋਂ ਇੱਕ ਐਪ ਸਥਾਪਤ ਕਰਨ ਅਤੇ ਖੋਲ੍ਹਣ ਦੀ ਲੋੜ ਪਵੇਗੀ।"</string>
+ <string name="carrier_app_dialog_message" msgid="7066156088266319533">"ਤੁਹਾਡੀ ਨਵੀਂ ਸਿਮ ਦੇ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਤੋਂ ਇੱਕ ਐਪ ਸਥਾਪਤ ਕਰਨ ਅਤੇ ਖੋਲ੍ਹਣ ਦੀ ਲੋੜ ਪਵੇਗੀ।"</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>
@@ -1178,7 +1179,7 @@
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"ਨਵਾਂ: "</font></string>
<string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਮੁਹੱਈਆ ਕੀਤਾ।"</string>
<string name="no_permissions" msgid="7283357728219338112">"ਕੋਈ ਅਨੁਮਤੀਆਂ ਲੁੜੀਂਦੀਆਂ ਨਹੀਂ"</string>
- <string name="perm_costs_money" msgid="4902470324142151116">"ਇਸ ਨਾਲ ਤੁਹਾਨੂੰ ਖ਼ਰਚਾ ਪੈ ਸਕਦਾ ਹੈ"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"ਇਸ ਨਾਲ ਤੁਹਾਨੂੰ ਖਰਚਾ ਪੈ ਸਕਦਾ ਹੈ"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ਠੀਕ"</string>
<string name="usb_charging_notification_title" msgid="6895185153353640787">"ਇਹ ਡੀਵਾਈਸ USB ਰਾਹੀਂ ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="usb_supplying_notification_title" msgid="5310642257296510271">"ਨੱਥੀ ਕੀਤੇ ਡੀਵਾਈਸ ਨੂੰ USB ਰਾਹੀਂ ਪਾਵਰ ਮਿਲ ਰਹੀ ਹੈ"</string>
@@ -1187,10 +1188,10 @@
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI ਲਈ USB"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"ਇੱਕ USB ਐਕਸੈਸਰੀ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ਐਨਾਲੌਗ ਔਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
- <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ਨੱਥੀ ਕੀਤੀ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ਐਨਾਲੌਗ ਆਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
+ <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ਨੱਥੀ ਕੀਤਾ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB ਡੀਬੱਗਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"USB ਡੀਬੱਗਿੰਗ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ਡੀਬੱਗਿੰਗ ਅਯੋਗ ਬਣਾਉਣ ਲਈ ਚੁਣੋ।"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ਬੱਗ ਰਿਪਰੋਟ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ਕੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨੀ ਹੈ?"</string>
@@ -1200,15 +1201,15 @@
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
<string name="select_input_method" msgid="8547250819326693584">"ਕੀ-ਬੋਰਡ ਬਦਲੋ"</string>
<string name="show_ime" msgid="2506087537466597099">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ ਸਰਗਰਮ ਹੋਣ ਦੌਰਾਨ ਇਸ ਨੂੰ ਸਕ੍ਰੀਨ \'ਤੇ ਬਣਾਈ ਰੱਖੋ"</string>
- <string name="hardware" msgid="194658061510127999">"ਆਭਾਸੀ ਕੀ-ਬੋਰਡ ਵਿਖਾਓ"</string>
- <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
+ <string name="hardware" msgid="194658061510127999">"ਆਭਾਸੀ ਕੀ-ਬੋਰਡ ਦਿਖਾਓ"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ ਦੀ ਰੂਪ-ਰੇਖਾ ਬਦਲੋ"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ਭਾਸ਼ਾ ਅਤੇ ਖਾਕਾ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਪਰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰਾਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ।"</string>
- <string name="alert_windows_notification_message" msgid="8917232109522912560">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
+ <string name="alert_windows_notification_message" msgid="8917232109522912560">"ਜੇਕਰ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ਬੰਦ ਕਰੋ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ਤਿਆਰ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ਤਰੁੱਟੀਆਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ"</string>
@@ -1218,8 +1219,8 @@
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ਗ਼ਲਤ ਹੈ। ਠੀਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ਖਰਾਬ ਹੈ। ਠੀਕ ਕਰਨ ਲਈ ਚੁਣੋ।"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ਅਸਮਰਥਿਤ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫੌਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਵੰਨਗੀ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਚੁਣੋ।"</string>
+ <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਚੁਣੋ।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਅਚਨਚੇਤ ਹਟਾਇਆ ਗਿਆ"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ਡੇਟਾ ਦੇ ਨੁਕਸਾਨ ਤੋਂ ਬੱਚਣ ਲਈ ਹਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ <xliff:g id="NAME">%s</xliff:g> ਅਨਮਾਊਂਟ ਕਰੋ"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"ਹਟਾਇਆ <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1251,16 +1252,16 @@
<string name="activity_list_empty" msgid="1675388330786841066">"ਕੋਈ ਮੇਲ ਖਾਂਦੀਆਂ ਗਤੀਵਿਧੀਆਂ ਨਹੀਂ ਮਿਲੀਆਂ।"</string>
<string name="permlab_route_media_output" msgid="6243022988998972085">"ਰੂਟ ਮੀਡੀਆ ਆਊਟਪੁਟ"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੂੰ ਹੋਰਾਂ ਬਾਹਰੀ ਡਿਵਾਈਸਾਂ ਲਈ ਮੀਡੀਆ ਆਊਟਪੁਟ ਰੂਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_readInstallSessions" msgid="3713753067455750349">"ਸਥਾਪਿਤ ਸੈਸ਼ਨਾਂ ਨੂੰ ਪੜ੍ਹੋ"</string>
- <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਇੰਸਟੌਲ ਸੈਸ਼ਨ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਇਸਨੂੰ ਸਕਿਰਿਆ ਪੈਕੇਜ ਇੰਸਟੌਲੇਸ਼ਨਾਂ ਬਾਰੇ ਵੇਰਵੇ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_requestInstallPackages" msgid="5782013576218172577">"ਪੈਕੇਜ ਸਥਾਪਿਤ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕਰੋ"</string>
- <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"ਪੈਕੇਜ ਦੀ ਸਥਾਪਨਾ ਦੀ ਬੇਨਤੀ ਕਰਨ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਅਨੁਮਤੀ ਦਿੰਦਾ ਹੈ"</string>
+ <string name="permlab_readInstallSessions" msgid="3713753067455750349">"ਸਥਾਪਤ ਸੈਸ਼ਨਾਂ ਨੂੰ ਪੜ੍ਹੋ"</string>
+ <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਸਥਾਪਤ ਸੈਸ਼ਨ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਇਸਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਪੈਕੇਜ ਸਥਾਪਨਾਵਾਂ ਬਾਰੇ ਵੇਰਵੇ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_requestInstallPackages" msgid="5782013576218172577">"ਪੈਕੇਜ ਸਥਾਪਤ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕਰੋ"</string>
+ <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"ਪੈਕੇਜ ਦੀ ਸਥਾਪਨਾ ਦੀ ਬੇਨਤੀ ਕਰਨ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਆਗਿਆ ਦਿੰਦਾ ਹੈ"</string>
<string name="permlab_requestDeletePackages" msgid="1703686454657781242">"ਪੈਕੇਜਾਂ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਬੇਨਤੀ ਕਰੋ"</string>
- <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"ਕਿਸੇ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਪੈਕੇਜਾਂ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string>
+ <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"ਕਿਸੇ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਪੈਕੇਜਾਂ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"ਬੈਟਰੀ ਸੁਯੋਗਤਾਵਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਲਈ ਪੁੱਛੋ"</string>
<string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"ਕਿਸੇ ਐਪ ਨੂੰ ਉਸ ਵਾਸਤੇ ਬੈਟਰੀ ਸੁਯੋਗਤਾਵਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਲਈ ਇਜਾਜ਼ਤ ਵਾਸਤੇ ਪੁੱਛਣ ਲਈ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"ਜ਼ੂਮ ਕੰਟਰੋਲ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ"</string>
- <string name="gadget_host_error_inflating" msgid="4882004314906466162">"ਵਿਜੇਟ ਨਹੀਂ ਜੋੜ ਸਕਿਆ।"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"ਵਿਜੇਟ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋ ਸਕਿਆ।"</string>
<string name="ime_action_go" msgid="8320845651737369027">"ਜਾਓ"</string>
<string name="ime_action_search" msgid="658110271822807811">"ਖੋਜੋ"</string>
<string name="ime_action_send" msgid="2316166556349314424">"ਭੇਜੋ"</string>
@@ -1270,16 +1271,16 @@
<string name="ime_action_default" msgid="2840921885558045721">"ਐਗਜੀਕਿਊਟ ਕਰੋ"</string>
<string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> ਵਰਤਦੇ ਹੋਏ ਨੰਬਰ\n ਡਾਇਲ ਕਰੋ"</string>
<string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> ਵਰਤਦੇ ਹੋਏ \nਸੰਪਰਕ ਬਣਾਓ"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"ਇਹ ਇੱਕ ਜਾਂ ਹੋਰ ਐਪਸ ਹੁਣ ਅਤੇ ਭਵਿੱਖ ਵਿੱਚ, ਤੁਹਾਡੇ ਖਾਤੇ ਤੱਕ ਪਹੁੰਚ ਦੀ ਅਨੁਮਤੀ ਦੀ ਬੇਨਤੀ ਕਰਦੇ ਹਨ।"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"ਇਹ ਇੱਕ ਜਾਂ ਹੋਰ ਐਪਾਂ ਹੁਣ ਅਤੇ ਭਵਿੱਖ ਵਿੱਚ, ਤੁਹਾਡੇ ਖਾਤੇ ਤੱਕ ਪਹੁੰਚ ਦੀ ਇਜਾਜ਼ਤ ਦੀ ਬੇਨਤੀ ਕਰਦੇ ਹਨ।"</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">"<xliff:g id="ACCOUNT">%s</xliff:g> ਖਾਤੇ ਲਈ ਅਨੁਮਤੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ\n।"</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="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>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"ਵਾਲਪੇਪਰ"</string>
@@ -1296,14 +1297,14 @@
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਤੋਂ ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="vpn_lockdown_error" msgid="6009249814034708175">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਅਸ਼ੁੱਧੀ"</string>
- <string name="vpn_lockdown_config" msgid="8151951501116759194">"ਨੈੱਟਵਰਕ ਜਾਂ VPN ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string>
+ <string name="vpn_lockdown_config" msgid="8151951501116759194">"Change network or VPN settings"</string>
<string name="upload_file" msgid="2897957172366730416">"ਫਾਈਲ ਚੁਣੋ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ਕੋਈ ਫਾਈਲ ਨਹੀਂ ਚੁਣੀ ਗਈ"</string>
<string name="reset" msgid="2448168080964209908">"ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="submit" msgid="1602335572089911941">"ਪ੍ਰਸਤੁਤ ਕਰੋ"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"ਕਾਰ ਮੋਡ ਸਮਰਥਿਤ"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"ਕਾਰ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"ਟੀਥਰਿਗ ਜਾਂ ਹੌਟਸਪੌਟ ਸਕਿਰਿਆ"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ਟੈਦਰਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
<string name="disable_tether_notification_message" msgid="2913366428516852495">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ"</string>
@@ -1332,7 +1333,7 @@
<string name="sync_too_many_deletes" msgid="5296321850662746890">"ਵਧੀ ਸੀਮਾ ਮਿਟਾਓ"</string>
<string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, ਖਾਤੇ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ਲਈ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ਆਈਟਮਾਂ ਮਿਟਾਈਆਂ ਗਈਆਂ ਹਨ। ਤੁਸੀਂ ਕੀ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"ਆਈਟਮਾਂ ਹਟਾਓ"</string>
- <string name="sync_undo_deletes" msgid="2941317360600338602">"ਮਿਟਾਏ ਗਏ ਅਨਡੂ ਕਰੋ"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"ਮਿਟਾਏ ਗਏ ਨੂੰ ਅਣਕੀਤਾ ਕਰੋ"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"ਹੁਣ ਕੁਝ ਨਾ ਕਰੋ"</string>
<string name="choose_account_label" msgid="5655203089746423927">"ਇੱਕ ਖਾਤਾ ਚੁਣੋ"</string>
<string name="add_account_label" msgid="2935267344849993553">"ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
@@ -1360,42 +1361,42 @@
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ਮਿਟਾਓ"</string>
<string name="keyboardview_keycode_done" msgid="1992571118466679775">"ਹੋ ਗਿਆ"</string>
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ਮੋਡ ਬਦਲੋ"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ਸ਼ਿਫ਼ਟ"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ਸ਼ਿਫਟ ਕੁੰਜੀ"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ਦਾਖਲ ਕਰੋ"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"ਇੱਕ ਐਪ ਚੁਣੋ"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ਨੂੰ ਲਾਂਚ ਨਹੀਂ ਕਰ ਸਕਿਆ"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
<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="action_bar_home_description" msgid="5293600496601490216">"ਹੋਮ ਨੈਵੀਗੇਟ ਕਰੋ"</string>
- <string name="action_bar_up_description" msgid="2237496562952152589">"ਉੱਪਰ ਨੈਵੀਗੇਟ ਕਰੋ"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"ਹੈਂਡਲ ਸਲਾਈਡ ਕਰ ਰਿਹਾ ਹੈ। ਛੋਹਵੋ & ਹੋਲਡ ਕਰੋ।"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਸਵਾਈਪ ਕਰੋ।"</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>
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
- <string name="storage_internal" msgid="3570990907910199483">"ਅੰਦਰੂਨੀ ਸਾਂਝੀ ਕੀਤੀ ਗਈ ਸਟੋਰੇਜ"</string>
+ <string name="storage_internal" msgid="3570990907910199483">"ਸਾਂਝੀ ਕੀਤੀ ਗਈ ਅੰਦਰੂਨੀ ਸਟੋਰੇਜ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD ਕਾਰਡ"</string>
<string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD ਕਾਰਡ"</string>
<string name="storage_usb_drive" msgid="6261899683292244209">"USB ਡ੍ਰਾਇਵ"</string>
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ਡ੍ਰਾਇਵ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB ਸਟੋਰੇਜ"</string>
- <string name="extract_edit_menu_button" msgid="8940478730496610137">"ਸੰਪਾਦਿਤ ਕਰੋ"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ਡੈਟਾ ਵਰਤੋਂ ਚੇਤਾਵਨੀ"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"ਵਰਤੋਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ਡੈਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ਡੈਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋਈ"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"ਸੰਪਾਦਨ ਕਰੋ"</string>
+ <string name="data_usage_warning_title" msgid="3620440638180218181">" ਡਾਟਾ ਵਰਤੋਂ ਚਿਤਾਵਨੀ"</string>
+ <string name="data_usage_warning_body" msgid="6660692274311972007">"ਵਰਤੋਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ਡਾਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ"</string>
+ <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ਡਾਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋਈ"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ਮੋਬਾਈਲ ਡਾਟਾ ਸੀਮਾ ਸਮਾਪਤ ਹੋਈ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ਵਾਈ-ਫਾਈ ਡਾਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ਬਾਕੀ ਸਾਇਕਲ ਲਈ ਡੈਟਾ ਰੁਕ ਗਿਆ"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ਡੈਟਾ ਸੀਮਾ ਵਧ ਗਈ"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ਡੈਟਾ ਸੀਮਾ ਵਧੀ"</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"ਬਾਕੀ ਸਾਇਕਲ ਲਈ ਡਾਟਾ ਰੁਕ ਗਿਆ"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ਡਾਟਾ ਸੀਮਾ ਵਧ ਗਈ"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ਡਾਟਾ ਸੀਮਾ ਵਧੀ"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਸੀਮਾ ਵਧ ਗਈ"</string>
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"ਵਾਈ-ਫਾਈ ਡਾਟਾ ਸੀਮਾ ਵਧ ਗਈ"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ਤੋਂ ਵੱਧ ਨਿਰਦਿਸ਼ਟ ਸੀਮਾ।"</string>
- <string name="data_usage_restricted_title" msgid="5965157361036321914">"ਪਿਛੋਕੜ ਡੈਟਾ ਪ੍ਰਤਿਬੰਧਿਤ"</string>
- <string name="data_usage_restricted_body" msgid="469866376337242726">"ਪਾਬੰੰਦੀ ਹਟਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="ssl_certificate" msgid="6510040486049237639">"ਸੁਰੱਖਿਆ ਸਰਟੀਫਿਕੇਟ"</string>
- <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ਇਹ ਸਰਟੀਫਿਕੇਟ ਪ੍ਰਮਾਣਿਕ ਹੈ।"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"ਪਿਛੋਕੜ ਡਾਟਾ ਪ੍ਰਤਿਬੰਧਿਤ"</string>
+ <string name="data_usage_restricted_body" msgid="469866376337242726">"ਪਾਬੰਦੀ ਹਟਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"ਸੁਰੱਖਿਆ ਪ੍ਰਮਾਣ-ਪੱਤਰ"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ਇਹ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਵੈਧ ਹੈ।"</string>
<string name="issued_to" msgid="454239480274921032">"ਨੂੰ ਜਾਰੀ ਕੀਤਾ ਗਿਆ:"</string>
<string name="common_name" msgid="2233209299434172646">"ਕੌਮਨ ਨਾਮ:"</string>
<string name="org_name" msgid="6973561190762085236">"ਕੰਪਨੀ:"</string>
@@ -1416,16 +1417,16 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"ਕੀ ਕਾਲ ਸਵੀਕਾਰ ਕਰਨੀ ਹੈ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"ਹਮੇਸ਼ਾਂ"</string>
<string name="activity_resolver_use_once" msgid="2404644797149173758">"ਕੇਵਲ ਇੱਕ ਵਾਰ"</string>
- <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
- <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ਟੈਬਲੇਟ"</string>
+ <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ਟੈਬਲੈੱਟ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
- <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ਫੋਨ"</string>
- <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ਹੈਡਫੋਨ"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ਫ਼ੋਨ ਕਰੋ"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ਹੈੱਡਫ਼ੋਨ"</string>
<string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"ਡੌਕ ਸਪੀਕਰਸ"</string>
<string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
<string name="default_audio_route_category_name" msgid="3722811174003886946">"ਸਿਸਟਮ"</string>
- <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth ਔਡੀਓ"</string>
- <string name="wireless_display_route_description" msgid="9070346425023979651">"ਵਾਇਰਲੈਸ ਡਿਸਪਲੇ"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth ਆਡੀਓ"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ"</string>
<string name="media_route_button_content_description" msgid="591703006349356016">"ਪ੍ਰਸਾਰਿਤ ਕਰੋ"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"ਡੀਵਾਈਸ ਨਾਲ ਸਕ੍ਰੀਨ ਜੋੜੋ"</string>
@@ -1444,47 +1445,50 @@
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ਸੁਰੱਖਿਅਤ"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ਪੈਟਰਨ ਭੁੱਲ ਗਏ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ਗ਼ਲਤ ਪੈਟਰਨ"</string>
- <string name="kg_wrong_password" msgid="2333281762128113157">"ਗ਼ਲਤ ਪਾਸਵਰਡ"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"ਗ਼ਲਤ ਪਿੰਨ"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ਗਲਤ ਪਾਸਵਰਡ"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ਗਲਤ ਪਿੰਨ"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ਆਪਣਾ ਪੈਟਰਨ ਡ੍ਰਾ ਕਰੋ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</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_pin_hint" msgid="7871604527429602024">"ਲੋੜੀਂਦਾ ਪਿੰਨ ਕੋਡ ਦਾਖਲ ਕਰੋ"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ਲੋੜੀਂਦੇ ਪਿੰਨ ਕੋਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ਸਿਮ ਹੁਣ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ਇੱਛਤ ਪਿੰਨ ਕੋਡ ਦਾਖਲ ਕਰੋ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ਇੱਛਤ ਪਿੰਨ ਕੋਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM ਕਾਰਡ ਅਨਲੌਕ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ਗ਼ਲਤ ਪਿੰਨ ਕੋਡ।"</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ਇੱਕ ਪਿੰਨ ਟਾਈਪ ਕਰੋ ਜੋ 4 ਤੋਂ 8 ਨੰਬਰਾਂ ਦਾ ਹੈ।"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ਗਲਤ ਪਿੰਨ ਕੋਡ।"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ਕੋਈ ਪਿੰਨ ਟਾਈਪ ਕਰੋ ਜੋ 4 ਤੋਂ 8 ਨੰਬਰਾਂ ਦਾ ਹੋਵੇ।"</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"PUK ਕੋਡ 8 ਸੰਖਿਆਵਾਂ ਦਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।"</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"ਲਹੀ PUK ਕੋਡ ਮੁੜ-ਦਾਖਲ ਕਰੋ। ਦੁਹਰਾਈਆਂ ਗਈਆਂ ਕੋਸ਼ਿਸ਼ਾਂ SIM ਨੂੰ ਸਥਾਈ ਤੌਰ ਤੇ ਅਸਮਰੱਥ ਬਣਾ ਦੇਵੇਗਾ।"</string>
+ <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>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ਅਪ੍ਰਮਾਣਿਕ ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਪਾਸਵਰਡ।"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ਅਵੈਧ ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਪਾਸਵਰਡ।"</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ?\n"<b>"google.com/accounts/recovery"</b>" ਤੇ ਜਾਓ।"</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"ਖਾਤੇ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ਤੁਸੀਂ ਆਪਣਾ ਪਿੰਨ <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="7813713389422226531">"ਤੁਸੀਂ <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="74089475965050805">"ਤੁਸੀਂ <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="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> ਵਾਰ ਗ਼ਲਤ ਢੰਗ ਨਾਲ TV ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। <xliff:g id="NUMBER_1">%2$d</xliff:g> ਵੱਧ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ, TV ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗਾ ਅਤੇ ਸਾਰਾ ਉਪਭੋਗਤਾ ਡੈਟਾ ਨਸ਼ਟ ਹੋ ਜਾਏਗਾ।"</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="tv" msgid="4987878286750741463">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗ਼ਲਤ ਢੰਗ ਨਾਲ TV ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਹੁਣ TV ਫੈਕਟਰੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੇ ਰੀਸੈੱਟ ਹੋ ਜਾਏਗਾ।"</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> ਹੋਰ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਨੂੰ ਇੱਕ ਈਮੇਲ ਖਾਤਾ ਵਰਤਦੇ ਹੋਏ ਆਪਣਾ TV ਅਨਲੌਕ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਏਗਾ।\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>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ਤੁਸੀਂ ਆਪਣਾ ਪਿੰਨ <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="7813713389422226531">"ਤੁਸੀਂ <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="74089475965050805">"ਤੁਸੀਂ <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="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="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_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>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ਹਟਾਓ"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"ਕੀ ਵੌਲਿਊਮ ਸਿਫਾਰਿਸ਼ ਕੀਤੇ ਪੱਧਰ ਤੋਂ ਵਧਾਉਣੀ ਹੈ?\n\nਲੰਮੇ ਸਮੇਂ ਤੱਕ ਉੱਚ ਵੌਲਿਊਮ ਤੇ ਸੁਣਨ ਨਾਲ ਤੁਹਾਡੀ ਸੁਣਨ ਸ਼ਕਤੀ ਨੂੰ ਨੁਕਸਾਨ ਪਹੁੰਚ ਸਕਦਾ ਹੈ।"</string>
- <string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਵਰਤੀਏ?"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"ਸ਼ਾਰਟਕੱਟ ਚਾਲੂ ਹੋਣ \'ਤੇ, ਕਿਸੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਵੌਲਿਊਮ ਬਟਨਾਂ ਨੂੰ 3 ਸਕਿੰਟ ਲਈ ਦਬਾ ਕੇ ਰੱਖੋ।\n\n ਵਰਤਮਾਨ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ > ਪਹੁੰਚਯੋਗਤਾ ਵਿੱਚ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"ਕੀ ਵੌਲਿਊਮ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ ਪੱਧਰ ਤੋਂ ਵਧਾਉਣੀ ਹੈ?\n\nਲੰਮੇ ਸਮੇਂ ਤੱਕ ਉੱਚ ਵੌਲਿਊਮ ਤੇ ਸੁਣਨ ਨਾਲ ਤੁਹਾਡੀ ਸੁਣਨ ਸ਼ਕਤੀ ਨੂੰ ਨੁਕਸਾਨ ਪਹੁੰਚ ਸਕਦਾ ਹੈ।"</string>
+ <string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"ਕੀ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਵਰਤਣਾ ਹੈ?"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"ਸ਼ਾਰਟਕੱਟ ਚਾਲੂ ਹੋਣ \'ਤੇ, ਕਿਸੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਅਵਾਜ਼ ਬਟਨਾਂ ਨੂੰ 3 ਸਕਿੰਟ ਲਈ ਦਬਾ ਕੇ ਰੱਖੋ।\n\n ਵਰਤਮਾਨ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ > ਪਹੁੰਚਯੋਗਤਾ ਵਿੱਚ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।"</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"ਸ਼ਾਰਟਕੱਟ ਬੰਦ ਕਰੋ"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"ਸ਼ਾਰਟਕੱਟ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕੀਤਾ"</string>
@@ -1498,7 +1502,7 @@
<string name="owner_name" msgid="2716755460376028154">"ਮਾਲਕ"</string>
<string name="error_message_title" msgid="4510373083082500195">"ਅਸ਼ੁੱਧੀ"</string>
<string name="error_message_change_not_allowed" msgid="1238035947357923497">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਇਸ ਤਬਦੀਲੀ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
- <string name="app_not_found" msgid="3429141853498927379">"ਇਸ ਕਿਰਿਆ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਮਿਲੀ।"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਮਿਲੀ।"</string>
<string name="revoke" msgid="5404479185228271586">"ਰੱਦ ਕਰੋ"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
<string name="mediasize_iso_a1" msgid="3333060421529791786">"ISO A1"</string>
@@ -1539,9 +1543,9 @@
<string name="mediasize_na_junior_legal" msgid="3309324162155085904">"ਜੂਨੀਅਰ ਕਨੂੰਨੀ"</string>
<string name="mediasize_na_ledger" msgid="5567030340509075333">"ਖਾਤਾ"</string>
<string name="mediasize_na_tabloid" msgid="4571735038501661757">"ਪੱਤਰਕਾ"</string>
- <string name="mediasize_na_index_3x5" msgid="5182901917818625126">"ਇੰਡੈਕਸ ਕਾਰਡ 3x5"</string>
- <string name="mediasize_na_index_4x6" msgid="7687620625422312396">"ਇੰਡੈਕਸ ਕਾਰਡ 4x6"</string>
- <string name="mediasize_na_index_5x8" msgid="8834215284646872800">"ਇੰਡੈਕਸ ਕਾਰਡ 5x8"</string>
+ <string name="mediasize_na_index_3x5" msgid="5182901917818625126">"ਕ੍ਰਮ-ਸੂਚੀ ਕਾਰਡ 3x5"</string>
+ <string name="mediasize_na_index_4x6" msgid="7687620625422312396">"ਕ੍ਰਮ-ਸੂਚੀ ਕਾਰਡ 4x6"</string>
+ <string name="mediasize_na_index_5x8" msgid="8834215284646872800">"ਕ੍ਰਮ-ਸੂਚੀ ਕਾਰਡ 5x8"</string>
<string name="mediasize_na_monarch" msgid="213639906956550754">"ਸਮਰਾਟ"</string>
<string name="mediasize_na_quarto" msgid="835778493593023223">"ਚੁਪੱਤਰੀ"</string>
<string name="mediasize_na_foolscap" msgid="1573911237983677138">"Foolscap"</string>
@@ -1581,14 +1585,14 @@
<string name="mediasize_japanese_kahu" msgid="6872696027560065173">"Kahu"</string>
<string name="mediasize_japanese_kaku2" msgid="2359077233775455405">"Kaku2"</string>
<string name="mediasize_japanese_you4" msgid="2091777168747058008">"You4"</string>
- <string name="mediasize_unknown_portrait" msgid="3088043641616409762">"ਅਗਿਆਤ ਤਸਵੀਰ"</string>
+ <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>
- <string name="print_service_installed_message" msgid="5897362931070459152">"ਸਮਰੱਥ ਬਣਾਉਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="print_service_installed_message" msgid="5897362931070459152">"ਚਾਲੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="restr_pin_enter_admin_pin" msgid="8641662909467236832">"ਪ੍ਰਸ਼ਾਸਕ ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
<string name="restr_pin_enter_pin" msgid="3395953421368476103">"ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"ਗ਼ਲਤ"</string>
@@ -1603,8 +1607,8 @@
<item quantity="other"> <xliff:g id="COUNT">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
- <string name="immersive_cling_title" msgid="8394201622932303336">"ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੇਖ ਰਿਹਾ ਹੈ"</string>
- <string name="immersive_cling_description" msgid="3482371193207536040">"ਬਾਹਰ ਜਾਣ ਲਈ, ਟੌਪ ਤੋਂ ਹੇਠਾਂ ਸਵਾਈਪ ਕਰੋ।"</string>
+ <string name="immersive_cling_title" msgid="8394201622932303336">"ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦੇਖੋ"</string>
+ <string name="immersive_cling_description" msgid="3482371193207536040">"ਬਾਹਰ ਜਾਣ ਲਈ, ਉਪਰੋਂ ਹੇਠਾਂ ਸਵਾਈਪ ਕਰੋ।"</string>
<string name="immersive_cling_positive" msgid="5016839404568297683">"ਸਮਝ ਲਿਆ"</string>
<string name="done_label" msgid="2093726099505892398">"ਹੋ ਗਿਆ"</string>
<string name="hour_picker_description" msgid="6698199186859736512">"ਘੰਟੇ ਸਰਕੁਲਰ ਸਲਾਈਡਰ"</string>
@@ -1622,13 +1626,13 @@
<string name="lock_to_app_start" msgid="6643342070839862795">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"ਸਕ੍ਰੀਨ ਅਨਪਿਨ ਕੀਤੀ"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ਅਨਪਿੰਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਿੰਨ ਮੰਗੋ"</string>
- <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ਅਨਪਿਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਅਨਲੌਕ ਪੈਟਰਨ ਵਾਸਤੇ ਪੁੱਛੋ"</string>
- <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ਅਨਪਿਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡ ਮੰਗੋ"</string>
+ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ਅਨਪਿੰਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਅਣਲਾਕ ਪੈਟਰਨ ਵਾਸਤੇ ਪੁੱਛੋ"</string>
+ <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ਅਨਪਿੰਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡ ਮੰਗੋ"</string>
<string name="package_installed_device_owner" msgid="6875717669960212648">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਮਿਟਾਇਆ ਗਿਆ"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ਬੈਟਰੀ ਲਾਈਫ਼ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਹਾਇਤਾ ਕਰਨ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਦਰਸ਼ਨ ਘਟਾਉਂਦਾ ਹੈ ਅਤੇ ਵਾਈਬ੍ਰੇਸ਼ਨ, ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਅਤੇ ਜ਼ਿਆਦਾਤਰ ਪਿਛੋਕੜ ਡਾਟੇ ਨੂੰ ਸੀਮਿਤ ਕਰਦਾ ਹੈ। ਈਮੇਲ, ਸੁਨੇਹਾ ਭੇਜਣ ਅਤੇ ਹੋਰ ਐਪਾਂ, ਜੋ ਸਮਕਾਲੀਕਰਨ \'ਤੇ ਨਿਰਭਰ ਹਨ, ਉਹ ਉਦੋਂ ਤੱਕ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਖੋਲ੍ਹਦੇ ਨਹੀਂ।\n\nਬੈਟਰੀ ਸੇਵਰ ਆਪਣੇ-ਆਪ ਬੰਦ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੁੰਦਾ ਹੈ।"</string>
- <string name="data_saver_description" msgid="6015391409098303235">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟੇ \'ਤੇ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਦਿਖਾਏ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</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>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1683,7 +1687,7 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ਬੇਨਤੀ DIAL ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ਬੇਨਤੀ USSD ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ਬੇਨਤੀ ਨਵੀਂ SS ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
- <string name="notification_work_profile_content_description" msgid="4600554564103770764">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ"</string>
+ <string name="notification_work_profile_content_description" msgid="4600554564103770764">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ਸੁੰਗੇੜੋ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ਟੌਗਲ ਵਿਸਤਾਰ"</string>
@@ -1703,37 +1707,37 @@
<string name="importance_from_user" msgid="7318955817386549931">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਦੀ ਮਹੱਤਤਾ ਸੈੱਟ ਕੀਤੀ।"</string>
<string name="importance_from_person" msgid="9160133597262938296">"ਇਹ ਸ਼ਾਮਲ ਲੋਕਾਂ ਦੇ ਕਾਰਨ ਮਹੱਤਵਪੂਰਨ ਹੈ।"</string>
<string name="user_creation_account_exists" msgid="1942606193570143289">"ਕੀ <xliff:g id="APP">%1$s</xliff:g> ਨੂੰ <xliff:g id="ACCOUNT">%2$s</xliff:g> ਨਾਲ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਮਨਜ਼ੂਰੀ ਦੇਣੀ ਹੈ?"</string>
- <string name="user_creation_adding" msgid="4482658054622099197">"ਕੀ <xliff:g id="APP">%1$s</xliff:g> ਨੂੰ <xliff:g id="ACCOUNT">%2$s</xliff:g> ਨਾਲ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਮਨਜ਼ੂਰੀ ਦੇਣੀ ਹੈ (ਇਸ ਖਾਤੇ ਨਾਲ ਇੱਕ ਵਰਤੋਂਕਾਰ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ) ?"</string>
+ <string name="user_creation_adding" msgid="4482658054622099197">"ਕੀ <xliff:g id="APP">%1$s</xliff:g> ਨੂੰ <xliff:g id="ACCOUNT">%2$s</xliff:g> ਨਾਲ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ (ਇਸ ਖਾਤੇ ਨਾਲ ਇੱਕ ਵਰਤੋਂਕਾਰ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ) ?"</string>
<string name="language_selection_title" msgid="2680677278159281088">"ਇੱਕ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="country_selection_title" msgid="2954859441620215513">"ਖੇਤਰ ਤਰਜੀਹ"</string>
<string name="search_language_hint" msgid="7042102592055108574">"ਭਾਸ਼ਾ ਨਾਮ ਟਾਈਪ ਕਰੋ"</string>
<string name="language_picker_section_suggested" msgid="8414489646861640885">"ਸੁਝਾਈਆਂ ਗਈਆਂ"</string>
<string name="language_picker_section_all" msgid="3097279199511617537">"ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ਸਾਰੇ ਖੇਤਰ"</string>
- <string name="locale_search_menu" msgid="2560710726687249178">"ਖੋਜ"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ਖੋਜੋ"</string>
<string name="work_mode_off_title" msgid="2615362773958585967">"ਕੀ ਕਾਰਜ ਮੋਡ ਚਾਲੂ ਕਰੀਏ?"</string>
<string name="work_mode_off_message" msgid="2961559609199223594">"ਇਸ ਨਾਲ ਐਪਾਂ, ਬੈਕਗ੍ਰਾਊਂਡ ਸਮਕਾਲੀਕਰਨ, ਅਤੇ ਸਬੰਧਿਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸਮੇਤ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਜਾਵੇਗਾ"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ਚਾਲੂ ਕਰੋ"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"ਤੁਹਾਨੂੰ ਨਵੇਂ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਹੋਏ ਹਨ"</string>
- <string name="new_sms_notification_content" msgid="7002938807812083463">"ਵੇਖਣ ਲਈ SMS ਐਪ ਖੋਲ੍ਹੋ"</string>
+ <string name="new_sms_notification_content" msgid="7002938807812083463">"ਦੇਖਣ ਲਈ SMS ਐਪ ਖੋਲ੍ਹੋ"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"ਕੁਝ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਸੀਮਿਤ ਹੋ ਸਕਦੀ ਹੈ"</string>
- <string name="user_encrypted_message" msgid="4923292604515744267">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="user_encrypted_detail" msgid="5708447464349420392">"ਵਰਤੋਂਕਾਰ ਡੈਟਾ ਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
- <string name="profile_encrypted_detail" msgid="3700965619978314974">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਲੌਕ ਕੀਤੀ ਗਈ"</string>
- <string name="profile_encrypted_message" msgid="6964994232310195874">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="user_encrypted_message" msgid="4923292604515744267">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="user_encrypted_detail" msgid="5708447464349420392">"ਵਰਤੋਂਕਾਰ ਡਾਟਾ ਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="profile_encrypted_detail" msgid="3700965619978314974">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਕੀਤੀ ਗਈ"</string>
+ <string name="profile_encrypted_message" msgid="6964994232310195874">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋਈ"</string>
- <string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ਫ਼ਾਈਲਾਂ ਵੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ਫ਼ਾਈਲਾਂ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="pin_target" msgid="3052256031352291362">"ਪਿੰਨ ਕਰੋ"</string>
<string name="unpin_target" msgid="3556545602439143442">"ਅਨਪਿੰਨ ਕਰੋ"</string>
<string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ਡੈਮੋ ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
- <string name="demo_restarting_message" msgid="952118052531642451">"ਡੀਵਾਈਸ ਮੁੜ-ਸੈੱਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+ <string name="demo_restarting_message" msgid="952118052531642451">"ਡੀਵਾਈਸ ਰੀਸੈੱਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="suspended_widget_accessibility" msgid="6712143096475264190">"ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="conference_call" msgid="3751093130790472426">"ਕਾਨਫਰੰਸ ਕਾਲ"</string>
- <string name="tooltip_popup_title" msgid="5253721848739260181">"ਟੂਲਟਿਪ"</string>
+ <string name="tooltip_popup_title" msgid="5253721848739260181">"ਟੂਲ-ਟਿੱਪ"</string>
<string name="app_category_game" msgid="5431836943981492993">"ਗੇਮਾਂ"</string>
- <string name="app_category_audio" msgid="1659853108734301647">"ਸੰਗੀਤ ਅਤੇ ਔਡੀਓ"</string>
+ <string name="app_category_audio" msgid="1659853108734301647">"ਸੰਗੀਤ ਅਤੇ ਆਡੀਓ"</string>
<string name="app_category_video" msgid="2728726078629384196">"ਮੂਵੀਆਂ ਅਤੇ ਵੀਡੀਓ"</string>
<string name="app_category_image" msgid="4867854544519846048">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਚਿੱਤਰ"</string>
<string name="app_category_social" msgid="5842783057834965912">"ਸਮਾਜਕ ਅਤੇ ਸੰਚਾਰ"</string>
@@ -1747,8 +1751,8 @@
<string name="time_picker_header_text" msgid="143536825321922567">"ਸਮਾਂ ਸੈੱਟ ਕਰੋ"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"ਇੱਕ ਵੈਧ ਸਮਾਂ ਦਾਖਲ ਕਰੋ"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"ਸਮਾਂ ਟਾਈਪ ਕਰੋ"</string>
- <string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਬਦਲੀ ਕਰੋ।"</string>
- <string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਘੜੀ ਮੋਡ \'ਤੇ ਬਦਲੀ ਕਰੋ।"</string>
+ <string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ।"</string>
+ <string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਘੜੀ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ।"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ਆਟੋਫਿਲ ਵਿਕਲਪ"</string>
<string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ਆਟੋਫਿਲ ਲਈ ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"ਸਮੱਗਰੀਆਂ ਨੂੰ ਆਟੋਫਿਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
@@ -1757,10 +1761,10 @@
<item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> ਆਟੋਫਿਲ ਸੁਝਾਅ</item>
<item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> ਆਟੋਫਿਲ ਸੁਝਾਅ</item>
</plurals>
- <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
- <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%2$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
- <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> ਅਤੇ <xliff:g id="TYPE_1">%2$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%3$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, ਅਤੇ <xliff:g id="TYPE_2">%3$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%4$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"ਕੀ <b><xliff:g id="LABEL">%1$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"ਕੀ <xliff:g id="TYPE">%1$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%2$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"ਕੀ <xliff:g id="TYPE_0">%1$s</xliff:g> ਅਤੇ <xliff:g id="TYPE_1">%2$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%3$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"ਕੀ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, ਅਤੇ <xliff:g id="TYPE_2">%3$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%4$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"ਪਾਸਵਰਡ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index d5bcdfb..0f4e2e8 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ustawienia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoc"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asystent głosowy"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Zablokuj teraz"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nowe powiadomienie"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Klawiatura wirtualna"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nieprawidłowy wzór"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nieprawidłowe hasło"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Nieprawidłowy PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Spróbuj ponownie za <xliff:g id="NUMBER">%1$d</xliff:g> s."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="few">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ <item quantity="other">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="one">Spróbuj ponownie za sekundę</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Narysuj wzór"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Podaj PIN karty SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Podaj PIN"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index a7dafde..bb37055 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear agora"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova notificação"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Senha incorreta"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorreto"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Tente novamente em <xliff:g id="NUMBER">%1$d</xliff:g> segundos."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
+ <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Desenhe seu padrão"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Digite o PIN do cartão SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Digite o PIN"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 95f7828..60d7900 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Definições"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. de voz"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear agora"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova notificação"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequência Incorreta"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Palavra-passe Incorreta"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN Incorreto"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Tente novamente dentro de <xliff:g id="NUMBER">%1$d</xliff:g> segundos."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Tente novamente dentro de 1 segundo.</item>
+ <item quantity="other">Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Desenhe a sua sequência"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Introduzir PIN do cartão SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Introduzir PIN"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index a7dafde..bb37055 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear agora"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova notificação"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Senha incorreta"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorreto"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Tente novamente em <xliff:g id="NUMBER">%1$d</xliff:g> segundos."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
+ <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Desenhe seu padrão"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Digite o PIN do cartão SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Digite o PIN"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index efc946c..81ab4dd 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -233,7 +233,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Setări"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistență"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistent vocal"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Blocați acum"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"˃999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificare nouă"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastatură virtuală"</string>
@@ -1211,9 +1212,9 @@
<string name="usb_notification_message" msgid="3370903770828407960">"Atingeți pentru mai multe opțiuni."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"S-a detectat un accesoriu audio analogic"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Dispozitivul atașat nu este compatibil cu acest telefon. Atingeți pentru a afla mai multe."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"Depanarea USB este conectată"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Remedierea erorilor prin USB este conectată"</string>
<string name="adb_active_notification_message" msgid="4948470599328424059">"Atingeți ca să dezactivați remedierea erorilor prin USB."</string>
- <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selectați pentru a dezactiva depanarea USB."</string>
+ <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selectați pentru a dezactiva remedierea erorilor prin USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Se creează un raport de eroare…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Trimiteți raportul de eroare?"</string>
<string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Se trimite raportul de eroare…"</string>
@@ -1469,7 +1470,11 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Model greșit"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Parolă greșită"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Cod PIN greșit"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Încercați din nou peste <xliff:g id="NUMBER">%1$d</xliff:g> secunde."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="few">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> secunde.</item>
+ <item quantity="other">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> de secunde.</item>
+ <item quantity="one">Încercați din nou într-o secundă.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Desenați modelul"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Introduceți codul PIN al cardului SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Introduceți codul PIN"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 2ba3c6e..b01a6fc 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощник"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Аудиоподсказки"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Заблокировать"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Новое уведомление"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуальная клавиатура"</string>
@@ -490,7 +491,7 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Слишком много попыток. Повторите позже."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Слишком много попыток. Сканер отпечатков пальцев отключен."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторите попытку."</string>
- <string name="fingerprint_name_template" msgid="5870957565512716938">"Палец <xliff:g id="FINGERID">%d</xliff:g>"</string>
+ <string name="fingerprint_name_template" msgid="5870957565512716938">"Отпечаток <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок отпечатка пальца"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильный графический ключ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Неправильный пароль"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Неправильный PIN-код"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Повторите попытку через <xliff:g id="NUMBER">%1$d</xliff:g> сек."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ <item quantity="many">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
+ <item quantity="other">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Введите графический ключ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Введите PIN-код SIM-карты"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Введите PIN"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 1c3b2eb..2555825 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"සැකසීම්"</string>
<string name="global_action_assist" msgid="3892832961594295030">"සහාය දීම"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"හඬ සහායක"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"දැන් අගුළු දමන්න"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"නව දැනුම්දීම"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"අතථ්ය යතුරු පුවරුව"</string>
@@ -1448,7 +1449,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"වැරදි රටාවකි"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"වැරදි මුරපදය"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN එක වැරදියි"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"තත්පර <xliff:g id="NUMBER">%1$d</xliff:g> ට පසුව නැවත උත්සහ කරන්න."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
+ <item quantity="other">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ඔබගේ රටාව අඳින්න"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN ඇතුලු කරන්න"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN එක ඇතුළු කරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 04e70cd..4bf240a1 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -90,7 +90,7 @@
<string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"Stav mobilných dát"</string>
<string name="notification_channel_sms" msgid="3441746047346135073">"Správy SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Správy hlasovej schránky"</string>
- <string name="notification_channel_wfc" msgid="2130802501654254801">"Volanie cez Wi-Fi"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Volanie cez Wi‑Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu"</string>
@@ -117,21 +117,21 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner roamingu je zapnutý"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner roamingu je vypnutý"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Vyhľadávanie služby"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Volanie cez Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Volanie cez Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
- <item msgid="3910386316304772394">"Ak chcete volať a odosielať správy prostredníctvom siete Wi-Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi-Fi. (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="3910386316304772394">"Ak chcete volať a odosielať správy prostredníctvom siete Wi‑Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi‑Fi. (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
<item msgid="7472393097168811593">"Zaregistrujte sa u operátora (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
- <item msgid="4397097370387921767">"Volanie siete Wi-Fi %s"</item>
+ <item msgid="4397097370387921767">"Volanie siete Wi‑Fi %s"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Vypnuté"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Uprednostniť Wi-Fi"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Uprednostniť Wi‑Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferujem mobilné dáta"</string>
- <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Len Wi-Fi"</string>
+ <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Len Wi‑Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepresmerované"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> s"</string>
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nastavenia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomôcť"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlasový asistent"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Uzamknúť"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nové upozornenie"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuálna klávesnica"</string>
@@ -391,11 +392,11 @@
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"prístup k ďalším príkazom poskytovateľa polohy"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Umožňuje aplikácii pristupovať k ďalším príkazom poskytovateľa informácií o polohe. Aplikácii to môže umožniť zasahovať do činnosti systému GPS alebo iných zdrojov informácií o polohe."</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"prístup k presnej polohe (pomocou GPS a siete)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Táto aplikácia môže získať údaje o vašej polohe na základe systému GPS alebo sieťových zdrojov, ako sú mobilné veže a siete Wi-Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na telefóne. Môže to viesť k zvýšeniu spotreby batérie."</string>
+ <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Táto aplikácia môže získať údaje o vašej polohe na základe systému GPS alebo sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na telefóne. Môže to viesť k zvýšeniu spotreby batérie."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"prístup k približnej polohe (pomocou siete)"</string>
- <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi-Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na tablete."</string>
- <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi-Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na televízore."</string>
- <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi-Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na telefóne."</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na tablete."</string>
+ <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na televízore."</string>
+ <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na telefóne."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"meniť nastavenia zvuku"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Umožňuje aplikácii upraviť globálne nastavenia zvuku, ako je hlasitosť, alebo určiť, z ktorého reproduktora bude zvuk vychádzať."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"nahrávať zvuk"</string>
@@ -446,14 +447,14 @@
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Umožňuje aplikácii zmeniť stav sieťového pripojenia zdieľaného pomocou tetheringu."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"zmeniť zdieľané dátové pripojenie"</string>
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"Umožňuje aplikácii zmeniť stav sieťového pripojenia zdieľaného pomocou tetheringu."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"zobraziť pripojenia Wi-Fi"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Umožňuje aplikácii zobraziť informácie o sieťach Wi-Fi. Napríklad o tom, či je sieť Wi-Fi povolená alebo názvy pripojených zariadení Wi-Fi."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"pripojiť a odpojiť od siete Wi-Fi"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Umožňuje aplikácii pripojiť sa na prístupové body siete Wi-Fi, odpojiť sa od nich a meniť konfiguráciu zariadení pre siete Wi-Fi."</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"povoliť príjem Wi-Fi Multicast"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Umožňuje aplikácii prijímať pakety odoslané na všetky zariadenia v sieti Wi-Fi pomocou viacsmerových adries, nielen pomocou vášho tabletu. Spotrebuje viac energie ako režim bez viacsmerového vysielania."</string>
- <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Umožňuje aplikácii prijímať pakety odosielané na všetky zariadenia v sieti Wi-Fi pomocou viacsmerových adries (a nie iba do vášho televízora). Spotrebúva viac energie ako režim bez viacsmerového vysielania."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Umožňuje aplikácii prijímať pakety odoslané na všetky zariadenia v sieti Wi-Fi pomocou viacsmerových adries, nielen pomocou vášho telefónu. Spotrebuje viac energie ako režim bez viacsmerového vysielania."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"zobraziť pripojenia Wi‑Fi"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Umožňuje aplikácii zobraziť informácie o sieťach Wi‑Fi. Napríklad o tom, či je sieť Wi‑Fi povolená alebo názvy pripojených zariadení Wi‑Fi."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"pripojiť a odpojiť od siete Wi‑Fi"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Umožňuje aplikácii pripojiť sa na prístupové body siete Wi‑Fi, odpojiť sa od nich a meniť konfiguráciu zariadení pre siete Wi‑Fi."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"povoliť príjem Wi‑Fi Multicast"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Umožňuje aplikácii prijímať pakety odoslané na všetky zariadenia v sieti Wi‑Fi pomocou viacsmerových adries, nielen pomocou vášho tabletu. Spotrebuje viac energie ako režim bez viacsmerového vysielania."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Umožňuje aplikácii prijímať pakety odosielané na všetky zariadenia v sieti Wi‑Fi pomocou viacsmerových adries (a nie iba do vášho televízora). Spotrebúva viac energie ako režim bez viacsmerového vysielania."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Umožňuje aplikácii prijímať pakety odoslané na všetky zariadenia v sieti Wi‑Fi pomocou viacsmerových adries, nielen pomocou vášho telefónu. Spotrebuje viac energie ako režim bez viacsmerového vysielania."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"pristupovať k nastaveniam Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Umožňuje aplikácii konfigurovať miestny tablet s rozhraním Bluetooth a vyhľadávať a spárovať vzdialené zariadenia."</string>
<string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"Umožňuje aplikácii konfigurovať miestny televízor s rozhraním Bluetooth, objavovať vzdialené zariadenia a párovať sa s nimi."</string>
@@ -1134,50 +1135,50 @@
<string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Zvuky upozornení"</string>
<string name="ringtone_unknown" msgid="3914515995813061520">"Neznáme"</string>
<plurals name="wifi_available" formatted="false" msgid="7900333017752027322">
- <item quantity="few">K dispozícii sú siete Wi-Fi</item>
- <item quantity="many">K dispozícii sú siete Wi-Fi</item>
- <item quantity="other">K dispozícii sú siete Wi-Fi</item>
- <item quantity="one">K dispozícii je sieť Wi-Fi</item>
+ <item quantity="few">K dispozícii sú siete Wi‑Fi</item>
+ <item quantity="many">K dispozícii sú siete Wi‑Fi</item>
+ <item quantity="other">K dispozícii sú siete Wi‑Fi</item>
+ <item quantity="one">K dispozícii je sieť Wi‑Fi</item>
</plurals>
<plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606">
- <item quantity="few">K dispozícii sú verejné siete Wi-Fi</item>
- <item quantity="many">K dispozícii sú verejné siete Wi-Fi</item>
- <item quantity="other">K dispozícii sú verejné siete Wi-Fi</item>
- <item quantity="one">K dispozícii je verejná sieť Wi-Fi</item>
+ <item quantity="few">K dispozícii sú verejné siete Wi‑Fi</item>
+ <item quantity="many">K dispozícii sú verejné siete Wi‑Fi</item>
+ <item quantity="other">K dispozícii sú verejné siete Wi‑Fi</item>
+ <item quantity="one">K dispozícii je verejná sieť Wi‑Fi</item>
</plurals>
- <string name="wifi_available_title" msgid="3817100557900599505">"Pripojenie k otvorenej sieti Wi-Fi"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Pripája sa k otvorenej sieti Wi-Fi"</string>
- <string name="wifi_available_title_connected" msgid="7542672851522241548">"Pripojenie k sieti Wi-Fi"</string>
+ <string name="wifi_available_title" msgid="3817100557900599505">"Pripojenie k otvorenej sieti Wi‑Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Pripája sa k otvorenej sieti Wi‑Fi"</string>
+ <string name="wifi_available_title_connected" msgid="7542672851522241548">"Pripojenie k sieti Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"K sieti Wi‑Fi sa nepodarilo pripojiť"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všetky siete"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Pripojiť"</string>
<string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Všetky siete"</string>
- <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prihlásiť sa do siete Wi-Fi"</string>
+ <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prihlásiť sa do siete Wi‑Fi"</string>
<string name="network_available_sign_in" msgid="1848877297365446605">"Prihlásenie do siete"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8451173622563841546">"Sieť Wi-Fi nemá prístup k internetu"</string>
+ <string name="wifi_no_internet" msgid="8451173622563841546">"Sieť Wi‑Fi nemá prístup k internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím získate možnosti"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Prepnuté na sieť: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="5325661434777870353">"Keď sieť <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nemá prístup k internetu, zariadenie používa sieť <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Môžu sa účtovať poplatky."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Prepnuté zo siete <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na sieť <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
<string-array name="network_switch_type_name">
<item msgid="3979506840912951943">"mobilné dáta"</item>
- <item msgid="75483255295529161">"Wi-Fi"</item>
+ <item msgid="75483255295529161">"Wi‑Fi"</item>
<item msgid="6862614801537202646">"Bluetooth"</item>
<item msgid="5447331121797802871">"Ethernet"</item>
<item msgid="8257233890381651999">"VPN"</item>
</string-array>
<string name="network_switch_type_name_unknown" msgid="4552612897806660656">"neznámy typ siete"</string>
- <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepodarilo sa pripojiť k sieti Wi-Fi"</string>
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepodarilo sa pripojiť k sieti Wi‑Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" má nekvalitné internetové pripojenie."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Povoliť pripojenie?"</string>
- <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikácia %1$s sa chce pripojiť k sieti Wi-Fi %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikácia %1$s sa chce pripojiť k sieti Wi‑Fi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikácia"</string>
- <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Priame pripojenie Wi-Fi"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Spustiť priame pripojenie siete Wi-Fi. Táto možnosť vypne sieť Wi-Fi v režime klient alebo hotspot."</string>
- <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Priame pripojenie siete Wi-Fi sa nepodarilo spustiť"</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Priame pripojenie siete Wi-Fi je zapnuté"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Priame pripojenie Wi‑Fi"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Spustiť priame pripojenie siete Wi‑Fi. Táto možnosť vypne sieť Wi‑Fi v režime klient alebo hotspot."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Priame pripojenie siete Wi‑Fi sa nepodarilo spustiť"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Priame pripojenie siete Wi‑Fi je zapnuté"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="8064677407830620023">"Klepnutím zobrazíte nastavenia"</string>
<string name="accept" msgid="1645267259272829559">"Prijať"</string>
<string name="decline" msgid="2112225451706137894">"Odmietnuť"</string>
@@ -1187,9 +1188,9 @@
<string name="wifi_p2p_to_message" msgid="248968974522044099">"Komu:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Zadajte požadovaný kód PIN:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Tablet bude počas pripojenia k zariadeniu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> od siete Wi-Fi dočasne odpojený."</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"Televízor sa počas pripojenia k zariadeniu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> dočasne odpojí zo siete Wi-Fi."</string>
- <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Telefón bude počas pripojenia k zariadeniu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> od siete Wi-Fi dočasne odpojený."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Tablet bude počas pripojenia k zariadeniu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> od siete Wi‑Fi dočasne odpojený."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"Televízor sa počas pripojenia k zariadeniu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> dočasne odpojí zo siete Wi‑Fi."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Telefón bude počas pripojenia k zariadeniu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> od siete Wi‑Fi dočasne odpojený."</string>
<string name="select_character" msgid="3365550120617701745">"Vkladanie znakov"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Odosielanie správ SMS"</string>
<string name="sms_control_message" msgid="3867899169651496433">"Aplikácia <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> posiela veľký počet správ SMS. Chcete tejto aplikácií povoliť, aby aj naďalej posielala správy?"</string>
@@ -1224,7 +1225,7 @@
<string name="no_permissions" msgid="7283357728219338112">"Nevyžadujú sa žiadne oprávnenia."</string>
<string name="perm_costs_money" msgid="4902470324142151116">"môžu sa vám účtovať poplatky"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Prebieha nabíjanie tohto zariadenia pomocou USB"</string>
+ <string name="usb_charging_notification_title" msgid="6895185153353640787">"Zariadenie sa nabíja cez USB"</string>
<string name="usb_supplying_notification_title" msgid="5310642257296510271">"Prebieha nabíjanie pripojeného zariadenia pomocou USB"</string>
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB na prenos súborov"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB na prenos fotiek"</string>
@@ -1431,12 +1432,12 @@
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Bol dosiahnutý limit 2G–3G"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Bol dosiahnutý limit 4G"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dosiahnutý limit mobilných dát"</string>
- <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Bol dosiahnutý limit dát Wi-Fi"</string>
+ <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Bol dosiahnutý limit dát Wi‑Fi"</string>
<string name="data_usage_limit_body" msgid="291731708279614081">"Údaje pre zbytok cyklu pozastavené"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G, 3G dátový limit prekročený"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Dátový limit 4G bol prekročený"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Prekroč. limit pre mobil. dáta"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Dát. limit Wi-Fi bol prekročený"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Dát. limit Wi‑Fi bol prekročený"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> nad stanovenou hranicou."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dátové prenosy obmedzené"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Klepnutím odstránite obmedzenie."</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávny vzor"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávne heslo"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Nesprávny kód PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Skúste to znova o <xliff:g id="NUMBER">%1$d</xliff:g> s."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="few">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="other">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekúnd.</item>
+ <item quantity="one">Skúste to znova o 1 sekundu.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Nakreslite svoj vzor"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Zadajte kód PIN SIM karty"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Zadajte kód PIN"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index fe43306..31582d2 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nastavitve"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoč"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glas. pomočnik"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Zakleni zdaj"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Novo obvestilo"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Navidezna tipkovnica"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Napačen vzorec"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Napačno geslo"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Napačen PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Čez <xliff:g id="NUMBER">%1$d</xliff:g> sekund poskusite znova."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundo.</item>
+ <item quantity="two">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
+ <item quantity="few">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Narišite vzorec"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Vnesite PIN za kartico SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Vnesite PIN"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 6a66805..d9bbed0 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Cilësimet"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Ndihma"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ndihma zanore"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Kyç tani"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Njoftim i ri"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastiera virtuale"</string>
@@ -254,7 +255,7 @@
<string name="foreground_service_tap_for_details" msgid="372046743534354644">"Trokit për detaje mbi baterinë dhe përdorimin e të dhënave"</string>
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Modaliteti i sigurisë"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Sistemi \"android\""</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Sistemi Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Ndryshoje te \"Personale\""</string>
<string name="managed_profile_label" msgid="5289992269827577857">"Ndryshoje te \"Puna\""</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktet"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Motivi është i gabuar"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Fjalëkalim i gabuar"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN-i është i gabuar"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Provo sërish për <xliff:g id="NUMBER">%1$d</xliff:g> sekonda."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Provo sërish për <xliff:g id="NUMBER">%d</xliff:g> sekonda.</item>
+ <item quantity="one">Provo sërish për 1 sekondë.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Vizato motivin tënd"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Fut PIN-in e kartës SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Fut PIN-in"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index aef07ac..138df3b 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -133,7 +133,7 @@
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Само Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Није прослеђено"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
- <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> након <xliff:g id="TIME_DELAY">{2}</xliff:g> секунде(и)"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> након <xliff:g id="TIME_DELAY">{2}</xliff:g> секунде/и"</string>
<string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Није прослеђено"</string>
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Није прослеђено"</string>
<string name="fcComplete" msgid="3118848230966886575">"Кôд функције је извршен."</string>
@@ -233,7 +233,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Подешавања"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помоћ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помоћ"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Закључај одмах"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ново обавештење"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуелна тастатура"</string>
@@ -739,19 +740,19 @@
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Погледајте Кориснички водич или контактирајте Корисничку подршку."</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM картица је закључана."</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Откључавање SIM картице…"</string>
- <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> пута сте погрешно унели PIN. \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_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> пута сте погрешно унели PIN. \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="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>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Неисправно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пута. Таблет ће сада бити враћен на подразумевана фабричка подешавања."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"Покушали сте да откључате ТВ нетачно <xliff:g id="NUMBER">%d</xliff:g> пута. ТВ ће сада бити ресетован на подразумевана фабричка подешавања."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Неисправно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Телефон ће сада бити враћен на подразумевана фабричка подешавања."</string>
- <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде(и)."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде/и."</string>
<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>
@@ -883,7 +884,7 @@
<string name="second" msgid="3184235808021478">"сек"</string>
<string name="seconds" msgid="3161515347216589235">"сек"</string>
<string name="week" msgid="5617961537173061583">"недеља"</string>
- <string name="weeks" msgid="6509623834583944518">"недеље(а)"</string>
+ <string name="weeks" msgid="6509623834583944518">"недеље/а"</string>
<string name="year" msgid="4001118221013892076">"година"</string>
<string name="years" msgid="6881577717993213522">"годинe(а)"</string>
<string name="now_string_shortest" msgid="8912796667087856402">"сада"</string>
@@ -1469,7 +1470,11 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешан шаблон"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Погрешан PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Пробајте поново за <xliff:g id="NUMBER">%1$d</xliff:g> секунде(и)."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде.</item>
+ <item quantity="other">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Нацртајте шаблон"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Унесите PIN SIM картице"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Унесите PIN"</string>
@@ -1491,18 +1496,18 @@
<string name="kg_login_invalid_input" msgid="5754664119319872197">"Неважеће корисничко име или лозинка."</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Заборавили сте корисничко име или лозинку?\nПосетите адресу "<b>"google.com/accounts/recovery"</b>"."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"Провера налога…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Унели сте нетачни 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="7813713389422226531">"Унели сте нетачну лозинку <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="74089475965050805">"Нацртали сте шаблон за откључавање нетачно <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_pin_attempts_dialog_message" msgid="8276745642049502550">"Унели сте нетачни 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="7813713389422226531">"Унели сте нетачну лозинку <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="74089475965050805">"Нацртали сте шаблон за откључавање нетачно <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="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="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_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="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>
+ <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>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Уклони"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Желите да појачате звук изнад препорученог нивоа?\n\nСлушање гласне музике дуже време може да вам оштети слух."</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index d45d94a..0edf277 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Inställningar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjälp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Lås nu"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ny avisering"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuellt tangentbord"</string>
@@ -1303,7 +1304,7 @@
<string name="submit" msgid="1602335572089911941">"Skicka"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Billäge aktiverat"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tryck om du vill avsluta billäge."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Internetdelning eller surfpunkt aktiverad"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Internetdelning eller surfzon aktiverad"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tryck om du vill konfigurera."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Internetdelning har inaktiverats"</string>
<string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontakta administratören om du vill veta mer"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Fel grafiskt lösenord"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Fel lösenord"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Fel PIN-kod"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Försök igen om <xliff:g id="NUMBER">%1$d</xliff:g> sekunder."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
+ <item quantity="one">Försök igen om 1 sekund.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Rita ditt grafiska lösenord"</string>
<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>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 8e6b345..08d930a 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -228,7 +228,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Mipangilio"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Mapendekezo"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Usaidizi wa Sauti"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Funga sasa"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Arifa mpya"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Kibodi pepe"</string>
@@ -1082,7 +1083,7 @@
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Sauti ya Bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Sauti ya toni mlio"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Sauti ya simu"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"Sauti ya midia"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Sauti ya faili"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Sauti ya arifa"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Mlio chaguo-msingi"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"Chaguo-msingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1382,9 +1383,9 @@
<string name="data_usage_warning_body" msgid="6660692274311972007">"Gonga ili uangalie matumizi na mipangilio."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Kikomo data ya 2G-3G kimefikiwa"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Kikomo cha data ya 4G kimefikiwa"</string>
- <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Umefikisha kiwango cha juu kinachoruhusiwa cha matumizi ya data ya simu"</string>
+ <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Umefikisha kipimo cha juu cha data"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Kikomo data ya Wi-Fi kimefikiwa"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data imesitishwa kwa mzunguko uliosalia"</string>
+ <string name="data_usage_limit_body" msgid="291731708279614081">"Matumizi ya data yamesitishwa kwa kipindi kilichosalia"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Kikomo cha data ya 2G-3G kimezidishwa"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Kikomo cha data cha 4G kimezidishwa"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Umepitisha kiwango cha data ulichoweka"</string>
@@ -1444,7 +1445,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Mchoro huo si sahihi"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nenosiri Lisilo sahihi"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Nambari ya PIN si sahihi"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Jaribu tena baada ya sekunde <xliff:g id="NUMBER">%1$d</xliff:g>."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Jaribu tena baada ya sekunde <xliff:g id="NUMBER">%d</xliff:g>.</item>
+ <item quantity="one">Jaribu tena baada ya sekunde 1.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Chora ruwaza yako"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Ingiza PIN ya SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Ingiza PIN"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index a699882..c76f53f 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -66,7 +66,7 @@
<string name="ThreeWCMmi" msgid="9051047170321190368">"மும்முனை அழைப்பு"</string>
<string name="RuacMmi" msgid="7827887459138308886">"விரும்பத்தகாத தொல்லைதரும் அழைப்புகளை நிராகரித்தல்"</string>
<string name="CndMmi" msgid="3116446237081575808">"அழைப்பின் விவரங்கள்"</string>
- <string name="DndMmi" msgid="1265478932418334331">"தொந்தரவு செய்ய வேண்டாம்"</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>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"அமைப்பு"</string>
<string name="global_action_assist" msgid="3892832961594295030">"உதவி"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"குரல் உதவி"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"இப்போது பூட்டு"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"புதிய அறிவிப்பு"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"விர்ச்சுவல் விசைப்பலகை"</string>
@@ -281,7 +282,7 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ஃபோன்"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"யாரையும் தொலைபேசியில் அழைக்கலாம்"</string>
<string name="permgrouprequest_phone" msgid="7084161459732093690">"மொபைல் அழைப்புகளைச் செய்யவும், அவற்றை நிர்வகிக்கவும், <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>க்கு அனுமதி வழங்கவும்"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"உடல் உணர்விகள்"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"உடல் சென்சார்கள்"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"உங்கள் உடல் இயக்கம் பற்றி உணர்விகள் கூறும் தகவலைப் பார்க்கலாம்"</string>
<string name="permgrouprequest_sensors" msgid="8631146669524259656">"உடலியக்கக் குறிகள் பற்றிய உணர்வித் தரவை அணுக, <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>க்கு அனுமதி வழங்கவும்"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"சாளர உள்ளடக்கத்தைப் பெறும்"</string>
@@ -295,7 +296,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"சைகைகளைச் செயல்படுத்துதல்"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"தட்டலாம், ஸ்வைப் செய்யலாம், பின்ச் செய்யலாம் மற்றும் பிற சைகைகளைச் செயல்படுத்தலாம்."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"கைரேகை சைகைகள்"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"சாதனத்தின் கைரேகை உணர்வி மேல் செய்யப்படும் சைகைகளைப் படமெடுக்க முடியும்."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"சாதனத்தின் கைரேகை சென்சார் மேல் செய்யப்படும் சைகைகளைப் படமெடுக்க முடியும்."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"நிலைப் பட்டியை முடக்குதல் அல்லது மாற்றுதல்"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"நிலைப் பட்டியை முடக்க அல்லது முறைமையில் ஐகான்களைச் சேர்க்க மற்றும் அகற்ற பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"நிலைப் பட்டியில் இருக்கும்"</string>
@@ -348,7 +349,7 @@
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"நினைவகத்தில் நிலையாக இருக்கும் தன்னுடைய பகுதிகளை உருவாக்கப் பயன்பாட்டை அனுமதிக்கிறது. இதனால பிற பயன்பாடுகளுக்குக் கிடைக்கும் நினைவகம் வரையறுக்கப்பட்டு, மொபைலின் வேகத்தைக் குறைக்கலாம்"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"பயன்பாட்டுச் சேமிப்பு இடத்தை அளவிடல்"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"பயன்பாடு, அதன் குறியீடு, தரவு, மற்றும் தற்காலிகச் சேமிப்பு அளவுகளை மீட்டெடுக்க அனுமதிக்கிறது"</string>
- <string name="permlab_writeSettings" msgid="2226195290955224730">"முறைமை அமைப்புகளை மாற்றுதல்"</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"சாதன அமைப்புகளை மாற்றுதல்"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"முறைமையின் அமைப்பு தரவைத் திருத்த, பயன்பாட்டை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் பயன்பாடுகள், முறைமையின் உள்ளமைவைச் சிதைக்கலாம்."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"தொடக்கத்தில் இயக்குதல்"</string>
<string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"மறுஇயக்கம் முடிந்தது, விரைவில் தானாகவே தொடங்க, பயன்பாட்டை அனுமதிக்கிறது. இதனால் டேப்லெட் நீண்ட நேரம் கழித்து தொடங்கும் மற்றும் எப்போதும் இயங்குகின்ற டேப்லெட்டின் ஒட்டுமொத்தச் செயல்பாட்டையும் தாமதமாகும்."</string>
@@ -482,7 +483,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"கைரேகை செயல்பாடு ரத்துசெய்யப்பட்டது."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"அதிகமான முயற்சிகள். பிறகு முயற்சிக்கவும்."</string>
- <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"பலமுறை முயன்றுவிட்டீர்கள். கைரேகை உணர்வி முடக்கப்பட்டது."</string>
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"பலமுறை முயன்றுவிட்டீர்கள். கைரேகை சென்சார் முடக்கப்பட்டது."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"மீண்டும் முயற்சிக்கவும்."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"கைரேகை <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -561,7 +562,7 @@
<string name="policydesc_resetPassword" msgid="1278323891710619128">"திரைப் பூட்டை மாற்றும்."</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"திரையைப் பூட்டு"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"திரை எப்படி, எப்போது பூட்டப்படுகிறது என்பதைக் கட்டுப்படுத்தலாம்."</string>
- <string name="policylab_wipeData" msgid="3910545446758639713">"எல்லா தரவையும் அழித்தல்"</string>
+ <string name="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>
@@ -574,7 +575,7 @@
<string name="policylab_expirePassword" msgid="5610055012328825874">"திரைப் பூட்டு கடவுச்சொல் காலாவதி நேரத்தை அமை"</string>
<string name="policydesc_expirePassword" msgid="5367525762204416046">"எந்த இடைவெளியில் திரைப் பூட்டின் கடவுச்சொல், பின் அல்லது வடிவம் மாற்றப்பட வேண்டும் என்பதை மாற்றும்."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"சேமிப்பிட முறைமையாக்கலை அமை"</string>
- <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"சேமித்தப் பயன்பாட்டுத் தரவை முறைமையாக்கப்பட வேண்டும் என்பதைக் கோரலாம்."</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"சேமித்த ஆப்ஸ் டேட்டாவை முறைமையாக்கப்பட வேண்டும் என்பதைக் கோரலாம்."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"கேமராக்களை முடக்கு"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"எல்லா சாதன கேமராக்களைப் பயன்படுத்துவதையும் தடுக்கலாம்."</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"திரைப் பூட்டின் சில அம்சங்களை முடக்குதல்"</string>
@@ -841,7 +842,7 @@
<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>
+ <string name="save_password_never" msgid="8274330296785855105">"ஒருபோதும் வேண்டாம்"</string>
<string name="open_permission_deny" msgid="7374036708316629800">"இந்தப் பக்கத்தைத் திறக்க, உங்களிடம் அனுமதி இல்லை."</string>
<string name="text_copied" msgid="4985729524670131385">"உரை கிளிப்போர்டிற்கு நகலெடுக்கப்பட்டது."</string>
<string name="more_item_label" msgid="4650918923083320495">"மேலும்"</string>
@@ -868,7 +869,7 @@
<string name="last_month" msgid="3959346739979055432">"சென்ற மாதம்"</string>
<string name="older" msgid="5211975022815554840">"பழையது"</string>
<string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> அன்று"</string>
- <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g> இல்"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> இல்"</string>
<string name="day" msgid="8144195776058119424">"நாள்"</string>
<string name="days" msgid="4774547661021344602">"நாட்கள்"</string>
@@ -991,8 +992,8 @@
<string name="no" msgid="5141531044935541497">"ரத்துசெய்"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"கவனத்திற்கு"</string>
<string name="loading" msgid="7933681260296021180">"ஏற்றுகிறது..."</string>
- <string name="capital_on" msgid="1544682755514494298">"இயக்கு"</string>
- <string name="capital_off" msgid="6815870386972805832">"முடக்கு"</string>
+ <string name="capital_on" msgid="1544682755514494298">"ஆன்"</string>
+ <string name="capital_off" msgid="6815870386972805832">"ஆஃப்"</string>
<string name="whichApplication" msgid="4533185947064773386">"இதைப் பயன்படுத்தி செயலை நிறைவுசெய்"</string>
<string name="whichApplicationNamed" msgid="8260158865936942783">"%1$s ஐப் பயன்படுத்தி செயலை முடிக்கவும்"</string>
<string name="whichApplicationLabel" msgid="7425855495383818784">"செயலை முடி"</string>
@@ -1118,7 +1119,7 @@
<string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> இல் இணைய அணுகல் இல்லாததால், சாதனமானது <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ஐப் பயன்படுத்துகிறது. கட்டணங்கள் விதிக்கப்படலாம்."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> இலிருந்து <xliff:g id="NEW_NETWORK">%2$s</xliff:g>க்கு மாற்றப்பட்டது"</string>
<string-array name="network_switch_type_name">
- <item msgid="3979506840912951943">"மொபைல் தரவு"</item>
+ <item msgid="3979506840912951943">"மொபைல் டேட்டா"</item>
<item msgid="75483255295529161">"வைஃபை"</item>
<item msgid="6862614801537202646">"புளூடூத்"</item>
<item msgid="5447331121797802871">"ஈத்தர்நெட்"</item>
@@ -1165,7 +1166,7 @@
<string name="sim_done_button" msgid="827949989369963775">"முடிந்தது"</string>
<string name="sim_added_title" msgid="3719670512889674693">"சிம் கார்டு சேர்க்கப்பட்டது"</string>
<string name="sim_added_message" msgid="6599945301141050216">"மொபைல் நெட்வொர்க்கை அணுக உங்கள் சாதனத்தை மறுதொடக்கம் செய்யவும்."</string>
- <string name="sim_restart_button" msgid="4722407842815232347">"மறுதொடக்கம்"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"மீண்டும் தொடங்கு"</string>
<string name="carrier_app_dialog_message" msgid="7066156088266319533">"புதிய சிம் சரியாக இயங்குவதற்கு, நீங்கள் பயன்படுத்தும் மொபைல் நிறுவனத்திலிருந்து ஒரு பயன்பாட்டை நிறுவி, திறக்க வேண்டும்."</string>
<string name="carrier_app_dialog_button" msgid="7900235513678617329">"பயன்பாட்டைப் பெறுக"</string>
<string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"இப்போது வேண்டாம்"</string>
@@ -1189,8 +1190,8 @@
<string name="usb_notification_message" msgid="3370903770828407960">"மேலும் விருப்பங்களுக்கு, தட்டவும்."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"அனலாக் ஆடியோ துணைக்கருவி கண்டறியப்பட்டது"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"இணைத்துள்ள சாதனமானது இந்த மொபைலுடன் இணங்கவில்லை. மேலும் அறிய, தட்டவும்."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைதிருத்தம் இணைக்கப்பட்டது"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB பிழை திருத்தத்தை முடக்க, தட்டவும்."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைத் திருத்தம் இணைக்கப்பட்டது"</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"USB பிழைத் திருத்தத்தை முடக்க, தட்டவும்."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB பிழைத்திருத்தத்தை முடக்க, தேர்ந்தெடுக்கவும்."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"பிழை அறிக்கையை எடுக்கிறது…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"பிழை அறிக்கையைப் பகிரவா?"</string>
@@ -1205,7 +1206,7 @@
<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_group_name" msgid="1463953341148606396">"பிற பயன்பாடுகளின் மேலே காட்டு"</string>
+ <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"பிற ஆப்ஸின் மேலே காட்டு"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> பிற பயன்பாடுகளின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> பிற ஆப்ஸின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string>
@@ -1384,12 +1385,12 @@
<string name="data_usage_warning_body" msgid="6660692274311972007">"தரவு உபயோகம், அமைப்புகளைப் பார்க்க, தட்டவும்."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G தரவு வரம்பைக் கடந்தது"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G தரவு வரம்பைக் கடந்தது"</string>
- <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"மொபைல் தரவு வரம்பை அடைந்தது"</string>
+ <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"மொபைல் டேட்டா வரம்பை அடைந்தது"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"வைஃபை தரவு வரம்பைக் கடந்தது"</string>
<string name="data_usage_limit_body" msgid="291731708279614081">"மீதமுள்ள சுழற்சிக்கு தரவு இடைநிறுத்தப்பட்டது"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G தரவு வரம்பு கடந்தது"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G தரவு வரம்பு கடந்தது"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"மொபைல் தரவு வரம்பு கடந்தது"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"மொபைல் டேட்டா வரம்பு கடந்தது"</string>
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"வைஃபை தரவு வரம்பு கடந்தது"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"குறிப்பிட்ட வரம்பைவிட <xliff:g id="SIZE">%s</xliff:g> கூடுதல்."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"பின்புல வரம்பு வரையறுக்கப்பட்டது"</string>
@@ -1423,10 +1424,10 @@
<string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ஹெட்ஃபோன்கள்"</string>
<string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"மொபைல் வைக்கும் கருவியின் ஸ்பீக்கர்கள்"</string>
<string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
- <string name="default_audio_route_category_name" msgid="3722811174003886946">"அமைப்பு"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"சிஸ்டம்"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"புளூடூத் ஆடியோ"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"வயர்லெஸ் காட்சி"</string>
- <string name="media_route_button_content_description" msgid="591703006349356016">"திரையிடு"</string>
+ <string name="media_route_button_content_description" msgid="591703006349356016">"Cast"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"சாதனத்துடன் இணைக்கவும்"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"ஸ்கிரீனை சாதனத்தில் திரையிடு"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"சாதனங்களைத் தேடுகிறது..."</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"தவறான வடிவம்"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"தவறான கடவுச்சொல்"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"தவறான பின்"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> வினாடிகளுக்குப் பிறகு முயலவும்.</item>
+ <item quantity="one">1 வினாடிக்குப் பிறகு முயலவும்.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"வடிவத்தை வரையவும்"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"சிம் பின்னை உள்ளிடவும்"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"பின்னை உள்ளிடுக"</string>
@@ -1627,9 +1631,9 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"உங்கள் நிர்வாகி நிறுவியுள்ளார்"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"உங்கள் நிர்வாகி நீக்கியுள்ளார்"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"பேட்டரி ஆயுளை மேம்படுத்த, பேட்டரி சேமிப்பான் உங்கள் சாதனத்தின் செயல்திறனைக் குறைத்து, அதிர்வு, இடச் சேவைகள் மற்றும் பெரும்பாலான பின்புலத் தரவு போன்றவற்றைக் கட்டுப்படுத்துகிறது. ஒத்திசைவைச் சார்ந்துள்ள மின்னஞ்சல், செய்தியிடல் மற்றும் பிற பயன்பாடுகள் திறக்கும்வரை, அவை புதுப்பிக்கப்படாமல் இருக்கலாம்.\n\nஉங்கள் ஃபோன் சார்ஜ் செய்யப்படும்போது, பேட்டரி சேமிப்பான் தானாகவே முடங்கும்."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"தரவுப் பயன்பாட்டைக் குறைப்பதற்கு உதவ, பின்புலத்தில் தரவை அனுப்புவது அல்லது பெறுவதிலிருந்து சில பயன்பாடுகளைத் தரவுச் சேமிப்பான் தடுக்கும். தற்போது பயன்படுத்தும் பயன்பாடானது தரவை அணுகலாம், ஆனால் அடிக்கடி அல்ல. எடுத்துக்காட்டாக, படங்களை நீங்கள் தட்டும் வரை, அவை காட்டப்படாது."</string>
- <string name="data_saver_enable_title" msgid="4674073932722787417">"தரவு சேமிப்பானை இயக்கவா?"</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>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
<item quantity="other">%1$d நிமிடங்களுக்கு (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> வரை)</item>
@@ -1665,11 +1669,11 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> வரை"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> மணி (அடுத்த அலாரம்) வரை"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"தொந்தரவு செய்ய வேண்டாம் என்பதை முடக்கும் வரை"</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"தொந்தரவு செய்ய வேண்டாம் என்பதை முடக்கும் வரை"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"\'தொந்தரவு செய்யாதே\' என்பதை முடக்கும் வரை"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"\'தொந்தரவு செய்யாதே\' என்பதை முடக்கும் வரை"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"சுருக்கு"</string>
- <string name="zen_mode_feature_name" msgid="5254089399895895004">"தொந்தரவு செய்ய வேண்டாம்"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"தொந்தரவு செய்யாதே"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"செயலற்ற நேரம்"</string>
<string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"வார இரவு"</string>
<string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"வார இறுதி"</string>
@@ -1725,14 +1729,14 @@
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"கோப்புகளைப் பார்க்க, தட்டவும்"</string>
<string name="pin_target" msgid="3052256031352291362">"பின் செய்"</string>
<string name="unpin_target" msgid="3556545602439143442">"பின்னை அகற்று"</string>
- <string name="app_info" msgid="6856026610594615344">"பயன்பாட்டுத் தகவல்"</string>
+ <string name="app_info" msgid="6856026610594615344">"ஆப்ஸ் தகவல்"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"டெமோவைத் தொடங்குகிறது…"</string>
<string name="demo_restarting_message" msgid="952118052531642451">"சாதனத்தை மீட்டமைக்கிறது…"</string>
<string name="suspended_widget_accessibility" msgid="6712143096475264190">"முடக்கப்பட்டது: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="conference_call" msgid="3751093130790472426">"குழு அழைப்பு"</string>
<string name="tooltip_popup_title" msgid="5253721848739260181">"உதவிக்குறிப்பு"</string>
- <string name="app_category_game" msgid="5431836943981492993">"கேம்கள்"</string>
+ <string name="app_category_game" msgid="5431836943981492993">"கேம்ஸ்"</string>
<string name="app_category_audio" msgid="1659853108734301647">"இசையும் ஆடியோவும்"</string>
<string name="app_category_video" msgid="2728726078629384196">"திரைப்படங்களும் வீடியோவும்"</string>
<string name="app_category_image" msgid="4867854544519846048">"புகைப்படங்களும் படங்களும்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 685622a..1117cea 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -67,10 +67,10 @@
<string name="RuacMmi" msgid="7827887459138308886">"అవాంఛిత అంతరాయ కాల్ల తిరస్కరణ"</string>
<string name="CndMmi" msgid="3116446237081575808">"కాలింగ్ నంబర్ బట్వాడా"</string>
<string name="DndMmi" msgid="1265478932418334331">"అంతరాయం కలిగించవద్దు"</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="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="RestrictedOnDataTitle" msgid="1322504692764166532">"డేటా సేవ లేదు"</string>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"సెట్టింగ్లు"</string>
<string name="global_action_assist" msgid="3892832961594295030">"సహాయం"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"వాయిస్ అసిస్టెంట్"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ఇప్పుడు లాక్ చేయండి"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"కొత్త నోటిఫికేషన్"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"వర్చువల్ కీబోర్డ్"</string>
@@ -546,7 +547,7 @@
<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="permlab_access_notification_policy" msgid="4247510821662059671">"అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం"</string>
<string name="permdesc_access_notification_policy" msgid="3296832375218749580">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"పాస్వర్డ్ నియమాలను సెట్ చేయండి"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"స్క్రీన్ లాక్ పాస్వర్డ్లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది."</string>
@@ -722,9 +723,9 @@
<string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"సిమ్ కార్డును చొప్పించండి."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"సిమ్ కార్డు లేదు లేదా చదవగలిగేలా లేదు. సిమ్ కార్డును చొప్పించండి."</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"నిరుపయోగ సిమ్ కార్డు."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"మీ సిమ్ కార్డు శాశ్వతంగా నిలిపివేయబడింది.\n మరో సిమ్ కార్డు కోసం మీ వైర్లెస్ సేవా ప్రదాతను సంప్రదించండి."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"మీ SIM కార్డ్ శాశ్వతంగా నిలిపివేయబడింది.\n మరో SIM కార్డ్ని పొందడం కోసం మీ వైర్లెస్ సేవా ప్రదాతను సంప్రదించండి."</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"మునుపటి ట్రాక్"</string>
- <string name="lockscreen_transport_next_description" msgid="573285210424377338">"తదుపరి ట్రాక్"</string>
+ <string name="lockscreen_transport_next_description" msgid="573285210424377338">"తర్వాత ట్రాక్"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"పాజ్ చేయి"</string>
<string name="lockscreen_transport_play_description" msgid="1901258823643886401">"ప్లే చేయి"</string>
<string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"ఆపివేయి"</string>
@@ -986,9 +987,9 @@
<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>
- <string name="cancel" msgid="6442560571259935130">"రద్దు చేయండి"</string>
+ <string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string>
<string name="yes" msgid="5362982303337969312">"సరే"</string>
- <string name="no" msgid="5141531044935541497">"రద్దు చేయండి"</string>
+ <string name="no" msgid="5141531044935541497">"రద్దు చేయి"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"గమనిక"</string>
<string name="loading" msgid="7933681260296021180">"లోడ్ చేస్తోంది…"</string>
<string name="capital_on" msgid="1544682755514494298">"ఆన్లో ఉంది"</string>
@@ -1264,13 +1265,13 @@
<string name="ime_action_go" msgid="8320845651737369027">"వెళ్లు"</string>
<string name="ime_action_search" msgid="658110271822807811">"వెతుకు"</string>
<string name="ime_action_send" msgid="2316166556349314424">"పంపు"</string>
- <string name="ime_action_next" msgid="3138843904009813834">"తదుపరి"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"తర్వాత"</string>
<string name="ime_action_done" msgid="8971516117910934605">"పూర్తయింది"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"మునుపటి"</string>
<string name="ime_action_default" msgid="2840921885558045721">"అమలు చేయి"</string>
<string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g>ని ఉపయోగించి\nనంబర్ డయల్ చేయండి"</string>
<string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>ని ఉపయోగించి\nపరిచయాన్ని సృష్టించండి"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"క్రింది ఒకటి లేదా అంతకంటే ఎక్కువ యాప్లు మీ ఖాతాను యాక్సెస్ చేయడానికి ఇప్పుడే మరియు భవిష్యత్తులో అనుమతిని అభ్యర్థించవచ్చు."</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"క్రింది ఒకటి లేదా అంతకంటే ఎక్కువ యాప్లు మీ ఖాతాను యాక్సెస్ చేయడానికి ఇప్పుడు మరియు భవిష్యత్తులో అనుమతిని అభ్యర్థించవచ్చు."</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>
@@ -1305,10 +1306,10 @@
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"కారు మోడ్ నుండి నిష్క్రమించడానికి నొక్కండి."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"టీథర్ చేయబడినది లేదా హాట్స్పాట్ సక్రియంగా ఉండేది"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"సెటప్ చేయడానికి నొక్కండి."</string>
- <string name="disable_tether_notification_title" msgid="7526977944111313195">"టీథెరింగ్ నిలిపివేయబడింది"</string>
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"టెథెరింగ్ నిలిపివేయబడింది"</string>
<string name="disable_tether_notification_message" msgid="2913366428516852495">"వివరాల కోసం మీ నిర్వాహకులను సంప్రదించండి"</string>
<string name="back_button_label" msgid="2300470004503343439">"వెనుకకు"</string>
- <string name="next_button_label" msgid="1080555104677992408">"తదుపరి"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"తర్వాత"</string>
<string name="skip_button_label" msgid="1275362299471631819">"దాటవేయి"</string>
<string name="no_matches" msgid="8129421908915840737">"సరిపోలికలు లేవు"</string>
<string name="find_on_page" msgid="1946799233822820384">"పేజీలో కనుగొనండి"</string>
@@ -1354,13 +1355,13 @@
<string name="date_picker_increment_year_button" msgid="6318697384310808899">"సంవత్సరాన్ని పెంచండి"</string>
<string name="date_picker_decrement_year_button" msgid="4482021813491121717">"సంవత్సరాన్ని తగ్గించండి"</string>
<string name="date_picker_prev_month_button" msgid="2858244643992056505">"మునుపటి నెల"</string>
- <string name="date_picker_next_month_button" msgid="5559507736887605055">"తదుపరి నెల"</string>
+ <string name="date_picker_next_month_button" msgid="5559507736887605055">"తర్వాత నెల"</string>
<string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
<string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"రద్దు చేయి"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"తొలగించు"</string>
<string name="keyboardview_keycode_done" msgid="1992571118466679775">"పూర్తయింది"</string>
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"మోడ్ మార్పు"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"షిఫ్ట్"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"యాప్ను ఎంచుకోండి"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ని ప్రారంభించడం సాధ్యపడలేదు"</string>
@@ -1394,8 +1395,8 @@
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"పేర్కొన్న పరిమితి కంటే <xliff:g id="SIZE">%s</xliff:g> మించిపోయింది."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"నేపథ్య డేటా పరిమితం చేయబడింది"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"నియంత్రణ తీసివేయడానికి నొక్కండి."</string>
- <string name="ssl_certificate" msgid="6510040486049237639">"భద్రతా ప్రమాణపత్రం"</string>
- <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ఈ ప్రమాణపత్రం చెల్లుబాటు అవుతుంది."</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"భద్రతా సర్టిఫికెట్"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ఈ సర్టిఫికెట్ చెల్లుబాటు అవుతుంది."</string>
<string name="issued_to" msgid="454239480274921032">"దీనికి జారీ చేయబడింది:"</string>
<string name="common_name" msgid="2233209299434172646">"సాధారణ పేరు:"</string>
<string name="org_name" msgid="6973561190762085236">"సంస్థ:"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ఆకృతి తప్పు"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"పాస్వర్డ్ తప్పు"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"పిన్ తప్పు"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి.</item>
+ <item quantity="one">1 సెకనులో మళ్లీ ప్రయత్నించండి.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"మీ నమూనాను గీయండి"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"సిమ్ పిన్ను నమోదు చేయండి"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"పిన్ను నమోదు చేయండి"</string>
@@ -1483,14 +1487,14 @@
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"తీసివేయి"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"వాల్యూమ్ను సిఫార్సు చేయబడిన స్థాయి కంటే ఎక్కువగా పెంచాలా?\n\nసుదీర్ఘ వ్యవధుల పాటు అధిక వాల్యూమ్లో వినడం వలన మీ వినికిడి శక్తి దెబ్బ తినవచ్చు."</string>
- <string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"యాక్సెస్ షార్ట్కట్ ఉపయోగించాలా?"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"షార్ట్కట్ ఆన్లో ఉన్నప్పుడు, రెండు వాల్యూమ్ బటన్లను 3 సెకన్ల పాటు నొక్కితే యాక్సెస్ ఫీచర్ ప్రారంభం అవుతుంది.\n\n ప్రస్తుత యాక్సెస్ ఫీచర్:\n<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n సెట్టింగ్లు > యాక్సెస్లో మీరు ఫీచర్ను మార్చవచ్చు."</string>
+ <string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"యాక్సెస్ సామర్థ్యం షార్ట్కట్ను ఉపయోగించాలా?"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"షార్ట్కట్ ఆన్లో ఉన్నప్పుడు, రెండు వాల్యూమ్ బటన్లను 3 సెకన్ల పాటు నొక్కితే యాక్సెస్ సామర్థ్య ఫీచర్ ప్రారంభం అవుతుంది.\n\n ప్రస్తుత యాక్సెస్ సామర్థ్య ఫీచర్:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n సెట్టింగ్లు > యాక్సెస్ సామర్థ్యంలో మీరు ఫీచర్ను మార్చవచ్చు."</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"సత్వరమార్గాన్ని ఆఫ్ చేయి"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"సత్వరమార్గాన్ని ఉపయోగించు"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆన్ చేయబడింది"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆఫ్ చేయబడింది"</string>
- <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"యాక్సెస్ బటన్ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్ను ఎంచుకోండి:"</string>
- <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ఫీచర్లను మార్చడానికి, యాక్సెస్ సామర్థ్య బటన్ను నొక్కి & పట్టుకోండి."</string>
+ <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"యాక్సెస్ సామర్థ్య బటన్ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్ను ఎంచుకోండి:"</string>
+ <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ఫీచర్లను మార్చడానికి, యాక్సెస్ సామర్థ్య బటన్ను నొక్కి & పట్టుకోండి."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"మాగ్నిఫికేషన్"</string>
<string name="user_switched" msgid="3768006783166984410">"ప్రస్తుత వినియోగదారు <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>కి మారుస్తోంది…"</string>
@@ -1664,7 +1668,7 @@
<item quantity="one">1 గం పాటు</item>
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> వరకు"</string>
- <string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (తదుపరి అలారం) వరకు"</string>
+ <string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (తర్వాత అలారం) వరకు"</string>
<string name="zen_mode_forever" msgid="1916263162129197274">"మీరు అంతరాయం కలిగించవద్దు ఎంపిక ఆఫ్ చేసే వరకు"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"మీరు అంతరాయం కలిగించవద్దు ఎంపిక ఆఫ్ చేసే వరకు"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 802d0ee..dd1b62d 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"การตั้งค่า"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ผู้ช่วย"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ตัวช่วยเสียง"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ล็อกเลย"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"การแจ้งเตือนใหม่"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"แป้นพิมพ์เสมือน"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"รูปแบบไม่ถูกต้อง"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"รหัสผ่านไม่ถูกต้อง"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN ไม่ถูกต้อง"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ลองอีกครั้งในอีก <xliff:g id="NUMBER">%1$d</xliff:g> วินาที"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">ลองอีกครั้งใน <xliff:g id="NUMBER">%d</xliff:g> วินาที</item>
+ <item quantity="one">ลองอีกครั้งใน 1 วินาที</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"วาดรูปแบบของคุณ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ป้อน PIN ของซิม"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"ป้อน PIN"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 36f94d4..1a8751f 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Mga Setting"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Tulong"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"I-lock ngayon"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Bagong notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual na keyboard"</string>
@@ -972,7 +973,7 @@
<string name="redo" msgid="7759464876566803888">"Gawing muli"</string>
<string name="autofill" msgid="3035779615680565188">"I-autofill"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Pagpili ng teksto"</string>
- <string name="addToDictionary" msgid="4352161534510057874">"Idagdag sa diksyunaryo"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"Idagdag sa diksyonaryo"</string>
<string name="deleteText" msgid="6979668428458199034">"I-delete"</string>
<string name="inputMethod" msgid="1653630062304567879">"Pamamaraan ng pag-input"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Pagkilos ng teksto"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Maling Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Maling Password"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Maling PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Subukang muli sa loob ng <xliff:g id="NUMBER">%1$d</xliff:g> (na) segundo."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
+ <item quantity="other">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> na segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Iguhit ang iyong pattern"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Ilagay ang SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Ilagay ang PIN"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 99b88a0..8032338 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sesli Yardım"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Şimdi kilitle"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Yeni bildirim"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Sanal klavye"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Desen"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifre"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Yanlış PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> saniye içinde tekrar deneyin."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniye içinde tekrar deneyin.</item>
+ <item quantity="one">]1 saniye içinde tekrar deneyin.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Deseninizi çizin"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN kodunu girin"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN\'i girin"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 98663b5..ee06099 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -236,7 +236,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Налаштування"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Підказки"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Голос. підказки"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Блокувати зараз"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Нове сповіщення"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Віртуальна клавіатура"</string>
@@ -1492,7 +1493,12 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильний ключ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Неправильний пароль"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Неправильний PIN-код"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Повторіть спробу через <xliff:g id="NUMBER">%1$d</xliff:g> с."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ <item quantity="many">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
+ <item quantity="other">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Намалюйте ключ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Введіть PIN-код SIM-карти"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Введіть PIN-код"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 0cef222..df6af2b 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"ترتیبات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"اسسٹ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"ابھی مقفل کریں"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"نئی اطلاع"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ورچوئل کی بورڈ"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"غلط پیٹرن"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"غلط پاس ورڈ"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"غلط PIN"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> سیکنڈز میں دوبارہ کوشش کریں۔</item>
+ <item quantity="one">1 سیکنڈ میں دوبارہ کوشش کریں۔</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"اپنا پیٹرن ڈرا کریں"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN درج کریں"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN درج کریں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index ea8609f..d91b8f4 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Sozlamalar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yordam"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ovozli yordam"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Qulflash"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Yangi bildirishnoma"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual klaviatura"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Grafik kalit xato"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Parol noto‘g‘ri"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN-kod noto‘g‘ri"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> soniyadan keyin qaytadan urining.</item>
+ <item quantity="one">1 soniyadan keyin qaytadan urining.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Chizmali parolni chizing"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM kartaning PIN kodini kiriting"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN kodni tering"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 89ee92f..08c257d 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -79,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Không có dịch vụ thoại/khẩn cấp"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tạm thời không được cung cấp bởi mạng di động tại vị trí của bạn"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Không thể kết nối mạng"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong Cài đặt > Mạng và Internet > Mạng di động > Loại mạng ưa thích."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong Cài đặt > Mạng và Internet > Mạng di động > Loại mạng ưu tiên."</string>
<string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Gọi qua Wi‑Fi đang hoạt động"</string>
<string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Cuộc gọi khẩn cấp yêu cầu có mạng di động."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Thông báo"</string>
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Cài đặt"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hỗ trợ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Trợ lý thoại"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Khóa ngay"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Thông báo mới"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Bàn phím ảo"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Hình sai"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Mật khẩu sai"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN sai"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Hãy thử lại sau <xliff:g id="NUMBER">%1$d</xliff:g> giây."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">Hãy thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây.</item>
+ <item quantity="one">Hãy thử lại sau 1 giây.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Vẽ hình của bạn"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Nhập PIN của SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Nhập PIN"</string>
@@ -1628,7 +1632,7 @@
<string name="package_updated_device_owner" msgid="1847154566357862089">"Do quản trị viên của bạn cập nhật"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Do quản trị viên của bạn xóa"</string>
<string name="battery_saver_description" msgid="1960431123816253034">"Để giúp tăng tuổi thọ pin, trình tiết kiệm pin sẽ giảm hiệu suất thiết bị của bạn và hạn chế rung, dịch vụ vị trí và hầu hết dữ liệu nền. Email, nhắn tin và các ứng dụng khác dựa trên đồng bộ hóa có thể không cập nhật nếu bạn không mở chúng.\n\nTrình tiết kiệm pin tự động tắt khi thiết bị của bạn đang sạc."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"Để giúp giảm mức sử dụng dữ liệu. Trình tiết kiệm dữ liệu chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể truy cập dữ liệu nhưng có thể thực hiện việc đó ít thường xuyên hơn. Ví như, hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể truy cập dữ liệu nhưng có thể thực hiện việc đó ít thường xuyên hơn. Ví dụ: hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Bật Trình tiết kiệm dữ liệu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Bật"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 7f4885f..2f6439a 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"设置"</string>
<string name="global_action_assist" msgid="3892832961594295030">"助理"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"语音助理"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"立即锁定"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虚拟键盘"</string>
@@ -867,7 +868,7 @@
</plurals>
<string name="last_month" msgid="3959346739979055432">"上个月"</string>
<string name="older" msgid="5211975022815554840">"往前"</string>
- <string name="preposition_for_date" msgid="9093949757757445117">"日期:<xliff:g id="DATE">%s</xliff:g>"</string>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string>
<string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"年份:<xliff:g id="YEAR">%s</xliff:g>"</string>
<string name="day" msgid="8144195776058119424">"天"</string>
@@ -1130,7 +1131,7 @@
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"要允许连接吗?"</string>
<string name="wifi_connect_alert_message" msgid="6451273376815958922">"“%1$s”应用想要连接到 WLAN 网络“%2$s”"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"一款应用"</string>
- <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"WLAN直连"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"WLAN 直连"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"启动WLAN直连。此操作将会关闭WLAN客户端/热点。"</string>
<string name="wifi_p2p_failed_message" msgid="3763669677935623084">"无法启动WLAN直连。"</string>
<string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"已启用WLAN直连"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"图案错误"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"密码错误"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN码有误"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"请在 <xliff:g id="NUMBER">%1$d</xliff:g> 秒后重试。"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">请在 <xliff:g id="NUMBER">%d</xliff:g> 秒后重试。</item>
+ <item quantity="one">请在 1 秒后重试。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"绘制您的图案"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"输入SIM卡PIN码"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"输入PIN码"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 180d31e..69133b8 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"協助"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音助手"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"立即鎖定"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string>
@@ -1432,7 +1433,7 @@
<string name="media_route_chooser_searching" msgid="4776236202610828706">"正在搜尋裝置…"</string>
<string name="media_route_chooser_extended_settings" msgid="87015534236701604">"設定"</string>
<string name="media_route_controller_disconnect" msgid="8966120286374158649">"停止連接"</string>
- <string name="media_route_status_scanning" msgid="7279908761758293783">"正在掃瞄…"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"正在掃描…"</string>
<string name="media_route_status_connecting" msgid="6422571716007825440">"正在連線..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"可用"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"無法使用"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"圖形不對"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN 錯誤"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"請在 <xliff:g id="NUMBER">%1$d</xliff:g> 秒後再試一次。"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">請在 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
+ <item quantity="one">請在 1 秒後再試一次。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"畫出圖案"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"輸入 SIM 卡 PIN 碼"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"輸入 PIN 碼"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 046c8bd..b34d1ef 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"協助"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音小幫手"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"立即鎖定"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"超過 999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"圖案錯誤"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN 錯誤"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"請在 <xliff:g id="NUMBER">%1$d</xliff:g> 秒後再試一次。"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other">請於 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
+ <item quantity="one">請於 1 秒後再試一次。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"畫出圖案"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"輸入 SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"輸入 PIN"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index f74ab76..6ddddfb 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -230,7 +230,8 @@
<string name="global_action_settings" msgid="1756531602592545966">"Izilungiselelo"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Siza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Isisekeli sezwi"</string>
- <string name="global_action_lockdown" msgid="8751542514724332873">"Khiya manje"</string>
+ <!-- no translation found for global_action_lockdown (2277328351790053477) -->
+ <skip />
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Isaziso esisha"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Ikhibhodi ebonakalayo"</string>
@@ -1446,7 +1447,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Iphatheni engalungile"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Iphasiwedi engalungile"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"Iphinikhodi engalungile"</string>
- <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Zama futhi emasekhondini angu-<xliff:g id="NUMBER">%1$d</xliff:g>."</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="one">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
+ <item quantity="other">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"Dweba iphethini"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Faka iphinikhodi ye-SIM"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Faka iphinikhodi"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 598b586..61b4123 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1891,6 +1891,7 @@
<enum name="KEYCODE_SYSTEM_NAVIGATION_DOWN" value="281" />
<enum name="KEYCODE_SYSTEM_NAVIGATION_LEFT" value="282" />
<enum name="KEYCODE_SYSTEM_NAVIGATION_RIGHT" value="283" />
+ <enum name="KEYCODE_ALL_APPS" value="284" />
</attr>
<!-- ***************************************************************** -->
@@ -2055,6 +2056,14 @@
Corresponds to {@link android.view.Window#setNavigationBarColor(int)}. -->
<attr name="navigationBarColor" format="color" />
+ <!-- @hide
+ Shows 1dp line of the specified color between the navigation bar and the app content.
+ <p>For this to take effect, the window must be drawing the system bar backgrounds with
+ {@link android.R.attr#windowDrawsSystemBarBackgrounds} and the navigation bar must not
+ have been requested to be translucent with
+ {@link android.R.attr#windowTranslucentNavigation}. -->
+ <attr name="navigationBarDividerColor" format="color" />
+
<!-- The duration, in milliseconds, of the window background fade duration
when transitioning into or away from an Activity when called with an
Activity Transition. Corresponds to
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 793b5b2..e6c829f 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -249,6 +249,11 @@
that target runtime permissions ({@link android.os.Build.VERSION_CODES#M} and above)
-->
<flag name="runtime" value="0x2000" />
+ <!-- Additional flag from base permission type: this permission can be granted only
+ if its protection level is signature, the requesting app resides on the OEM partition,
+ and the OEM has white-listed the app to receive this permission by the OEM.
+ -->
+ <flag name="oem" value="0x4000" />
</attr>
<!-- Flags indicating more context for a permission group. -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index ddceb8b..83bb443 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -44,7 +44,11 @@
<item><xliff:g id="id">@string/status_bar_zen</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_mute</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_volume</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_vpn</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_ethernet</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_wifi</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_cdma_eri</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_data_connection</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_phone_evdo_signal</xliff:g></item>
@@ -81,6 +85,10 @@
<string translatable="false" name="status_bar_alarm_clock">alarm_clock</string>
<string translatable="false" name="status_bar_secure">secure</string>
<string translatable="false" name="status_bar_clock">clock</string>
+ <string translatable="false" name="status_bar_mobile">mobile</string>
+ <string translatable="false" name="status_bar_vpn">vpn</string>
+ <string translatable="false" name="status_bar_ethernet">ethernet</string>
+ <string translatable="false" name="status_bar_airplane">airplane</string>
<!-- Flag indicating whether the surface flinger has limited
alpha compositing functionality in hardware. If set, the window
@@ -2359,12 +2367,14 @@
"silent" = silent mode
"users" = list of users
"restart" = restart device
+ "lockdown" = Lock down device until the user authenticates
-->
<string-array translatable="false" name="config_globalActionsList">
<item>power</item>
<item>restart</item>
<item>bugreport</item>
<item>users</item>
+ <item>lockdown</item>
</string-array>
<!-- Number of milliseconds to hold a wake lock to ensure that drawing is fully
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 9b1ebc8..9be00f7 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -604,4 +604,7 @@
<!-- Max height of the the autofill save custom subtitle as a fraction of the screen width/height -->
<dimen name="autofill_save_custom_subtitle_max_height">20%</dimen>
+ <!-- Max (absolute) dimensions (both width and height) of autofill service icon on autofill save affordance -->
+ <dimen name="autofill_save_icon_max_size">100dp</dimen>
+
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 9bd779e..bd5b711 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -526,8 +526,8 @@
<!-- label for item that launches voice assist in phone options dialog [CHAR LIMIT=15]-->
<string name="global_action_voice_assist">Voice Assist</string>
- <!-- label for item that locks the phone and enforces that it can't be unlocked without entering a credential. [CHAR LIMIT=15] -->
- <string name="global_action_lockdown">Lock now</string>
+ <!-- label for item that locks the phone and enforces that it can't be unlocked without strong authentication. [CHAR LIMIT=15] -->
+ <string name="global_action_lockdown">Enter lockdown</string>
<!-- Text to use when the number in a notification info is too large
(greater than status_bar_notification_info_maxnum, defined in
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 927d9dc..bf84fa7 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2907,8 +2907,9 @@
<java-symbol type="id" name="autofill_dataset_list"/>
<java-symbol type="id" name="autofill" />
<java-symbol type="id" name="autofill_save_custom_subtitle" />
- <java-symbol type="id" name="autofill_save_title" />
+ <java-symbol type="id" name="autofill_save_icon" />
<java-symbol type="id" name="autofill_save_no" />
+ <java-symbol type="id" name="autofill_save_title" />
<java-symbol type="id" name="autofill_save_yes" />
<java-symbol type="string" name="autofill_error_cannot_autofill" />
<java-symbol type="string" name="autofill_picker_no_suggestions" />
@@ -2932,6 +2933,7 @@
<java-symbol type="style" name="AutofillSaveAnimation" />
<java-symbol type="dimen" name="autofill_dataset_picker_max_size"/>
<java-symbol type="dimen" name="autofill_save_custom_subtitle_max_height"/>
+ <java-symbol type="dimen" name="autofill_save_icon_max_size"/>
<java-symbol type="dimen" name="notification_big_picture_max_height"/>
<java-symbol type="dimen" name="notification_big_picture_max_width"/>
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 8755e37..bf0c906 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -745,6 +745,11 @@
<item name="colorSecondary">@color/secondary_device_default_settings_light</item>
<item name="colorAccent">@color/accent_device_default_light</item>
<item name="colorEdgeEffect">@android:color/black</item>
+
+ <!-- Add white nav bar with divider that matches material -->
+ <item name="navigationBarDividerColor">#1f000000</item>
+ <item name="navigationBarColor">@android:color/white</item>
+ <item name="windowLightNavigationBar">true</item>
</style>
<!-- @hide DeviceDefault theme for a window that should use Settings theme colors
diff --git a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
index c707240..a8d5164 100644
--- a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
+++ b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
@@ -275,6 +275,21 @@
}
@Test
+ public void testStepLoop() {
+ openTuner();
+
+ for (int i = 0; i < 10; i++) {
+ Log.d(TAG, "step loop iteration " + (i + 1));
+
+ int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
+
+ resetCallback();
+ }
+ }
+
+ @Test
public void testTuneAndGetPI() {
openTuner();
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index ab9912a..ac5d224 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -1264,6 +1264,11 @@
</intent-filter>
</service>
+ <service
+ android:name="android.service.settings.suggestions.MockSuggestionService"
+ android:permission="android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE"
+ android:exported="true"/>
+
<provider android:name="android.app.activity.LocalProvider"
android:authorities="com.android.frameworks.coretests.LocalProvider">
<meta-data android:name="com.android.frameworks.coretests.string" android:value="foo" />
diff --git a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
index 2470e87..d289f1f 100644
--- a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
+++ b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
@@ -17,6 +17,7 @@
package android.app.admin;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import android.os.Parcel;
import android.support.test.filters.SmallTest;
@@ -119,4 +120,48 @@
// ordered, but not composed of alphas or digits
assertEquals(1, PasswordMetrics.maxLengthSequence(":;<=>"));
}
+
+ @Test
+ public void testEquals() {
+ PasswordMetrics metrics0 = new PasswordMetrics();
+ PasswordMetrics metrics1 = new PasswordMetrics();
+ assertNotEquals(metrics0, null);
+ assertNotEquals(metrics0, new Object());
+ assertEquals(metrics0, metrics0);
+ assertEquals(metrics0, metrics1);
+
+ assertEquals(new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4),
+ new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4));
+
+ assertNotEquals(new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4),
+ new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 5));
+
+ assertNotEquals(new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4),
+ new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, 4));
+
+ metrics0 = PasswordMetrics.computeForPassword("1234abcd,./");
+ metrics1 = PasswordMetrics.computeForPassword("1234abcd,./");
+ assertEquals(metrics0, metrics1);
+ metrics1.letters++;
+ assertNotEquals(metrics0, metrics1);
+ metrics1.letters--;
+ metrics1.upperCase++;
+ assertNotEquals(metrics0, metrics1);
+ metrics1.upperCase--;
+ metrics1.lowerCase++;
+ assertNotEquals(metrics0, metrics1);
+ metrics1.lowerCase--;
+ metrics1.numeric++;
+ assertNotEquals(metrics0, metrics1);
+ metrics1.numeric--;
+ metrics1.symbols++;
+ assertNotEquals(metrics0, metrics1);
+ metrics1.symbols--;
+ metrics1.nonLetter++;
+ assertNotEquals(metrics0, metrics1);
+ metrics1.nonLetter--;
+ assertEquals(metrics0, metrics1);
+
+
+ }
}
diff --git a/core/tests/coretests/src/android/content/pm/AppCacheTest.java b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
index 59aa50a..a5fdef6 100644
--- a/core/tests/coretests/src/android/content/pm/AppCacheTest.java
+++ b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
@@ -566,44 +566,6 @@
}
}
- public PackageStats invokePMGetPackageSizeInfo() throws Exception {
- try {
- String packageName = mContext.getPackageName();
- PackageStatsObserver observer = new PackageStatsObserver();
- //wait on observer
- synchronized(observer) {
- getPm().getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
- long waitTime = 0;
- while((!observer.isDone()) || (waitTime > MAX_WAIT_TIME) ) {
- observer.wait(WAIT_TIME_INCR);
- waitTime += WAIT_TIME_INCR;
- }
- if(!observer.isDone()) {
- throw new Exception("Timed out waiting for PackageStatsObserver.onGetStatsCompleted");
- }
- }
- if(localLOGV) Log.i(TAG, "OBSERVER RET VALUES code="+observer.stats.codeSize+
- ", data="+observer.stats.dataSize+", cache="+observer.stats.cacheSize);
- return observer.stats;
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
- return null;
- } catch (InterruptedException e) {
- Log.w(TAG, "InterruptedException :"+e);
- return null;
- }
- }
-
- @SmallTest
- public void testGetPackageSizeInfo() throws Exception {
- String testName="testGetPackageSizeInfo";
- PackageStats stats = invokePMGetPackageSizeInfo();
- assertTrue(stats!=null);
- //confirm result
- if(localLOGV) Log.i(TAG, "code="+stats.codeSize+", data="+stats.dataSize+
- ", cache="+stats.cacheSize);
- }
-
@SmallTest
public void testGetSystemSharedLibraryNames() throws Exception {
try {
diff --git a/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
index 4d2a047..1a54bd6 100644
--- a/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
@@ -68,20 +68,58 @@
}
@Test
- public void remove_org_apache_http_legacy_from_usesLibraries() {
- mPackage.usesLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
+ public void targeted_at_O() {
+ mPackage.applicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
PackageBackwardCompatibility.modifySharedLibraries(mPackage);
- assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
+ assertEquals("usesLibraries not updated correctly",
+ arrayList(ORG_APACHE_HTTP_LEGACY),
+ mPackage.usesLibraries);
+ assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
}
@Test
- public void remove_org_apache_http_legacy_from_usesOptionalLibraries() {
+ public void targeted_at_O_org_apache_http_legacy_in_usesLibraries() {
+ mPackage.applicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
+ mPackage.usesLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertEquals("usesLibraries not updated correctly",
+ arrayList(ORG_APACHE_HTTP_LEGACY),
+ mPackage.usesLibraries);
+ assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
+ }
+
+ @Test
+ public void targeted_at_O_org_apache_http_legacy_in_usesOptionalLibraries() {
+ mPackage.applicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
mPackage.usesOptionalLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
+ assertEquals("usesOptionalLibraries not updated correctly",
+ arrayList(ORG_APACHE_HTTP_LEGACY),
+ mPackage.usesOptionalLibraries);
+ }
+
+ @Test
+ public void org_apache_http_legacy_in_usesLibraries() {
+ mPackage.usesLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertEquals("usesLibraries not updated correctly",
+ arrayList(ORG_APACHE_HTTP_LEGACY),
+ mPackage.usesLibraries);
assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
}
@Test
+ public void org_apache_http_legacy_in_usesOptionalLibraries() {
+ mPackage.usesOptionalLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
+ assertEquals("usesOptionalLibraries not updated correctly",
+ arrayList(ORG_APACHE_HTTP_LEGACY),
+ mPackage.usesOptionalLibraries);
+ }
+
+ @Test
public void android_test_runner_in_usesLibraries() {
mPackage.usesLibraries = arrayList(ANDROID_TEST_RUNNER);
PackageBackwardCompatibility.modifySharedLibraries(mPackage);
diff --git a/core/tests/coretests/src/android/net/LinkPropertiesTest.java b/core/tests/coretests/src/android/net/LinkPropertiesTest.java
index d5f6321..bc2b9a6 100644
--- a/core/tests/coretests/src/android/net/LinkPropertiesTest.java
+++ b/core/tests/coretests/src/android/net/LinkPropertiesTest.java
@@ -19,15 +19,23 @@
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
+import android.net.LinkProperties.CompareResult;
import android.net.LinkProperties.ProvisioningChange;
import android.net.RouteInfo;
import android.system.OsConstants;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.Suppress;
+import android.util.ArraySet;
+
import junit.framework.TestCase;
import java.net.InetAddress;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
public class LinkPropertiesTest extends TestCase {
@@ -678,4 +686,104 @@
stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
assertTrue(v6lp.isReachable(DNS1));
}
+
+ @SmallTest
+ public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
+ // IPv4 case: no route added initially
+ LinkProperties rmnet0 = new LinkProperties();
+ rmnet0.setInterfaceName("rmnet0");
+ rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
+ RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
+ rmnet0.getInterfaceName());
+
+ // Since no routes is added explicitly, getAllRoutes() should return empty.
+ assertTrue(rmnet0.getAllRoutes().isEmpty());
+ rmnet0.ensureDirectlyConnectedRoutes();
+ // ensureDirectlyConnectedRoutes() should have added the missing local route.
+ assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
+
+ // IPv4 case: both direct and default routes added initially
+ LinkProperties rmnet1 = new LinkProperties();
+ rmnet1.setInterfaceName("rmnet1");
+ rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
+ RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null,
+ NetworkUtils.numericToInetAddress("10.0.0.1"), rmnet1.getInterfaceName());
+ RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
+ rmnet1.getInterfaceName());
+ rmnet1.addRoute(defaultRoute1);
+ rmnet1.addRoute(directRoute1);
+
+ // Check added routes
+ assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
+ // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
+ // route is already part of the configuration.
+ rmnet1.ensureDirectlyConnectedRoutes();
+ assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
+
+ // IPv6 case: only default routes added initially
+ LinkProperties rmnet2 = new LinkProperties();
+ rmnet2.setInterfaceName("rmnet2");
+ rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
+ rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
+ RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null,
+ NetworkUtils.numericToInetAddress("2001:db8::1"), rmnet2.getInterfaceName());
+ RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
+ rmnet2.getInterfaceName());
+ RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
+ rmnet2.getInterfaceName());
+ rmnet2.addRoute(defaultRoute2);
+
+ assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
+ rmnet2.ensureDirectlyConnectedRoutes();
+ assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
+ rmnet2.getAllRoutes());
+
+ // Corner case: no interface name
+ LinkProperties rmnet3 = new LinkProperties();
+ rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
+ RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
+ rmnet3.getInterfaceName());
+
+ assertTrue(rmnet3.getAllRoutes().isEmpty());
+ rmnet3.ensureDirectlyConnectedRoutes();
+ assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
+
+ }
+
+ @SmallTest
+ public void testCompareResult() {
+ // Either adding or removing items
+ testCompareResult(Arrays.asList(1), Arrays.asList(1, 2, 3, 4),
+ Arrays.asList(2, 3, 4), new ArrayList<>());
+ testCompareResult(Arrays.asList(1, 2), Arrays.asList(3, 2, 1, 4),
+ new ArrayList<>(), Arrays.asList(3, 4));
+
+
+ // adding and removing items at the same time
+ testCompareResult(Arrays.asList(1, 2, 3, 4), Arrays.asList(2, 3, 4, 5),
+ Arrays.asList(1), Arrays.asList(5));
+ testCompareResult(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6),
+ Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6));
+
+ // null cases
+ testCompareResult(Arrays.asList(1, 2, 3), null, Arrays.asList(1, 2, 3), new ArrayList<>());
+ testCompareResult(null, Arrays.asList(3, 2, 1), new ArrayList<>(), Arrays.asList(1, 2, 3));
+ testCompareResult(null, null, new ArrayList<>(), new ArrayList<>());
+ }
+
+ private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
+ Set<RouteInfo> expectedSet = new ArraySet<>(expected);
+ Set<RouteInfo> actualSet = new ArraySet<>(actual);
+ // Duplicated entries in actual routes are considered failures
+ assertEquals(actual.size(), actualSet.size());
+
+ assertEquals(expectedSet, actualSet);
+ }
+
+ private <T> void testCompareResult(List<T> oldItems, List<T> newItems, List<T> expectAdded,
+ List<T> expectRemoved) {
+ CompareResult<T> result = new CompareResult<>(newItems, oldItems);
+ assertEquals(new ArraySet<>(expectAdded), new ArraySet<>(result.added));
+ assertEquals(new ArraySet<>(expectRemoved), (new ArraySet<>(result.removed)));
+ }
}
diff --git a/core/tests/coretests/src/android/print/BasePrintTest.java b/core/tests/coretests/src/android/print/BasePrintTest.java
index 8ef8062..a70c604 100644
--- a/core/tests/coretests/src/android/print/BasePrintTest.java
+++ b/core/tests/coretests/src/android/print/BasePrintTest.java
@@ -39,8 +39,8 @@
import android.printservice.PrintJob;
import android.printservice.PrintService;
import android.support.test.InstrumentationRegistry;
-import android.support.test.uiautomator.UiDevice;
import android.support.test.rule.ActivityTestRule;
+import android.support.test.uiautomator.UiDevice;
import org.junit.After;
import org.junit.Before;
@@ -143,6 +143,13 @@
mStartSessionCallCounter = new CallCounter();
}
+ @Before
+ public void unlockScreen() throws Exception {
+ // Unlock screen.
+ runShellCommand(getInstrumentation(), "input keyevent KEYCODE_WAKEUP");
+ runShellCommand(getInstrumentation(), "wm dismiss-keyguard");
+ }
+
@After
public void exitActivities() throws Exception {
// Exit print spooler
diff --git a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java
index 2e9c8e7..45e3f67 100644
--- a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java
+++ b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java
@@ -16,6 +16,9 @@
package android.print;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.Context;
@@ -30,17 +33,15 @@
import android.print.PrintAttributes.Margins;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintAttributes.Resolution;
-import android.printservice.PrintServiceInfo;
-import android.printservice.recommendation.IRecommendationsChangeListener;
-
import android.print.mockservice.MockPrintService;
import android.print.mockservice.PrintServiceCallbacks;
import android.print.mockservice.PrinterDiscoverySessionCallbacks;
import android.print.mockservice.StubbablePrinterDiscoverySession;
-
+import android.printservice.recommendation.IRecommendationsChangeListener;
import android.support.test.filters.LargeTest;
import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -48,9 +49,6 @@
import java.util.ArrayList;
import java.util.List;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
/**
* tests feeding all possible parameters to the IPrintManager Binder.
*/
@@ -399,7 +397,8 @@
public void testAddPrintServicesChangeListener() throws Exception {
final IPrintServicesChangeListener listener = createMockIPrintServicesChangeListener();
- mIPrintManager.addPrintServicesChangeListener(listener, mUserId);
+ assertException(() -> mIPrintManager.addPrintServicesChangeListener(listener, mUserId),
+ SecurityException.class);
assertException(() -> mIPrintManager.addPrintServicesChangeListener(null, mUserId),
NullPointerException.class);
@@ -415,17 +414,11 @@
public void testRemovePrintServicesChangeListener() throws Exception {
final IPrintServicesChangeListener listener = createMockIPrintServicesChangeListener();
- mIPrintManager.addPrintServicesChangeListener(listener, mUserId);
- mIPrintManager.removePrintServicesChangeListener(listener, mUserId);
+ assertException(() -> mIPrintManager.removePrintServicesChangeListener(listener, mUserId),
+ SecurityException.class);
- // Removing unknown listeners is a no-op
- mIPrintManager.removePrintServicesChangeListener(listener, mUserId);
-
- mIPrintManager.addPrintServicesChangeListener(listener, mUserId);
- assertException(() -> mIPrintManager.removePrintServicesChangeListener(null, mUserId),
+ assertException(() -> mIPrintManager.removePrintServicesChangeListener(null, mUserId),
NullPointerException.class);
-
- // Cannot test bad user Id as these tests are allowed to call across users
}
/**
@@ -434,12 +427,11 @@
@MediumTest
@Test
public void testGetPrintServices() throws Exception {
- List<PrintServiceInfo> printServices = mIPrintManager.getPrintServices(
- PrintManager.ALL_SERVICES, mUserId);
- assertTrue(printServices.size() >= 1);
+ assertException(() -> mIPrintManager.getPrintServices(PrintManager.ALL_SERVICES, mUserId),
+ SecurityException.class);
- printServices = mIPrintManager.getPrintServices(0, mUserId);
- assertEquals(printServices, null);
+ assertException(() -> mIPrintManager.getPrintServices(0, mUserId),
+ SecurityException.class);
assertException(() -> mIPrintManager.getPrintServices(~PrintManager.ALL_SERVICES, mUserId),
IllegalArgumentException.class);
@@ -453,15 +445,6 @@
@MediumTest
@Test
public void testSetPrintServiceEnabled() throws Exception {
- final ComponentName printService = mIPrintManager.getPrintServices(
- PrintManager.ALL_SERVICES, mUserId).get(0).getComponentName();
-
- assertException(() -> mIPrintManager.setPrintServiceEnabled(printService, false, mUserId),
- SecurityException.class);
-
- assertException(() -> mIPrintManager.setPrintServiceEnabled(printService, true, mUserId),
- SecurityException.class);
-
assertException(
() -> mIPrintManager.setPrintServiceEnabled(new ComponentName("bad", "name"), true,
mUserId), SecurityException.class);
@@ -481,7 +464,8 @@
final IRecommendationsChangeListener listener =
createMockIPrintServiceRecommendationsChangeListener();
- mIPrintManager.addPrintServiceRecommendationsChangeListener(listener, mUserId);
+ assertException(() -> mIPrintManager.addPrintServiceRecommendationsChangeListener(listener,
+ mUserId), SecurityException.class);
assertException(
() -> mIPrintManager.addPrintServiceRecommendationsChangeListener(null, mUserId),
@@ -499,13 +483,9 @@
final IRecommendationsChangeListener listener =
createMockIPrintServiceRecommendationsChangeListener();
- mIPrintManager.addPrintServiceRecommendationsChangeListener(listener, mUserId);
- mIPrintManager.removePrintServiceRecommendationsChangeListener(listener, mUserId);
+ assertException(() -> mIPrintManager.removePrintServiceRecommendationsChangeListener(
+ listener, mUserId), SecurityException.class);
- // Removing unknown listeners is a no-op
- mIPrintManager.removePrintServiceRecommendationsChangeListener(listener, mUserId);
-
- mIPrintManager.addPrintServiceRecommendationsChangeListener(listener, mUserId);
assertException(
() -> mIPrintManager.removePrintServiceRecommendationsChangeListener(null, mUserId),
NullPointerException.class);
@@ -519,7 +499,8 @@
@MediumTest
@Test
public void testGetPrintServiceRecommendations() throws Exception {
- mIPrintManager.getPrintServiceRecommendations(mUserId);
+ assertException(() -> mIPrintManager.getPrintServiceRecommendations(mUserId),
+ SecurityException.class);
// Cannot test bad user Id as these tests are allowed to call across users
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 8a57ea9..8395638 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -327,7 +327,9 @@
Settings.Global.SMS_SHORT_CODE_RULE,
Settings.Global.SMS_SHORT_CODES_UPDATE_CONTENT_URL,
Settings.Global.SMS_SHORT_CODES_UPDATE_METADATA_URL,
+ Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
Settings.Global.STORAGE_BENCHMARK_INTERVAL,
+ Settings.Global.STORAGE_SETTINGS_CLOBBER_THRESHOLD,
Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
Settings.Global.SYS_STORAGE_CACHE_MAX_BYTES,
@@ -503,7 +505,8 @@
Settings.Secure.USER_SETUP_COMPLETE,
Settings.Secure.VOICE_INTERACTION_SERVICE,
Settings.Secure.VOICE_RECOGNITION_SERVICE,
- Settings.Secure.INSTANT_APPS_ENABLED);
+ Settings.Secure.INSTANT_APPS_ENABLED,
+ Settings.Secure.BACKUP_MANAGER_CONSTANTS);
@Test
public void systemSettingsBackedUpOrBlacklisted() {
diff --git a/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java b/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java
new file mode 100644
index 0000000..c158b9f
--- /dev/null
+++ b/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.settings.suggestions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MockSuggestionService extends SuggestionService {
+
+ @Override
+ public List<Suggestion> onGetSuggestions() {
+ final List<Suggestion> data = new ArrayList<>();
+
+ data.add(new Suggestion.Builder("test")
+ .setTitle("title")
+ .setSummary("summary")
+ .build());
+ return data;
+ }
+
+ @Override
+ public void onSuggestionDismissed(Suggestion suggestion) {
+ }
+}
diff --git a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java
new file mode 100644
index 0000000..bc88231
--- /dev/null
+++ b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.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.service.settings.suggestions;
+
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ServiceTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.TimeoutException;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SuggestionServiceTest {
+
+ @Rule
+ public ServiceTestRule mServiceTestRule;
+ private Intent mMockServiceIntent;
+
+ @Before
+ public void setUp() {
+ mServiceTestRule = new ServiceTestRule();
+ mMockServiceIntent = new Intent(
+ InstrumentationRegistry.getTargetContext(),
+ MockSuggestionService.class);
+ }
+
+ @Test
+ public void canStartService() throws TimeoutException {
+ mServiceTestRule.startService(mMockServiceIntent);
+ // Do nothing after starting service.
+ }
+}
diff --git a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java
new file mode 100644
index 0000000..5548e48
--- /dev/null
+++ b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.settings.suggestions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Parcel;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SuggestionTest {
+ private static final String TEST_ID = "id";
+ private static final String TEST_TITLE = "title";
+ private static final String TEST_SUMMARY = "summary";
+ private PendingIntent mTestIntent;
+
+
+ @Before
+ public void setUp() {
+ final Context context = InstrumentationRegistry.getContext();
+ mTestIntent = PendingIntent.getActivity(context, 0 /* requestCode */,
+ new Intent(), 0 /* flags */);
+ }
+
+ @Test
+ public void buildSuggestion_allFieldsShouldBeSet() {
+ final Suggestion suggestion = new Suggestion.Builder(TEST_ID)
+ .setTitle(TEST_TITLE)
+ .setSummary(TEST_SUMMARY)
+ .setPendingIntent(mTestIntent)
+ .build();
+
+ assertThat(suggestion.getId()).isEqualTo(TEST_ID);
+ assertThat(suggestion.getTitle()).isEqualTo(TEST_TITLE);
+ assertThat(suggestion.getSummary()).isEqualTo(TEST_SUMMARY);
+ assertThat(suggestion.getPendingIntent()).isEqualTo(mTestIntent);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void buildSuggestion_emptyKey_shouldCrash() {
+ new Suggestion.Builder(null)
+ .setTitle(TEST_TITLE)
+ .setSummary(TEST_SUMMARY)
+ .setPendingIntent(mTestIntent)
+ .build();
+ }
+
+ @Test
+ public void buildSuggestion_fromParcelable() {
+ final Parcel parcel = Parcel.obtain();
+ final Suggestion oldSuggestion = new Suggestion.Builder(TEST_ID)
+ .setTitle(TEST_TITLE)
+ .setSummary(TEST_SUMMARY)
+ .setPendingIntent(mTestIntent)
+ .build();
+
+ oldSuggestion.writeToParcel(parcel, 0 /* flags */);
+ parcel.setDataPosition(0);
+ final Suggestion newSuggestion = Suggestion.CREATOR.createFromParcel(parcel);
+
+ assertThat(newSuggestion.getId()).isEqualTo(TEST_ID);
+ assertThat(newSuggestion.getTitle()).isEqualTo(TEST_TITLE);
+ assertThat(newSuggestion.getSummary()).isEqualTo(TEST_SUMMARY);
+ assertThat(newSuggestion.getPendingIntent()).isEqualTo(mTestIntent);
+ }
+}
diff --git a/core/tests/coretests/src/android/text/LayoutTest.java b/core/tests/coretests/src/android/text/LayoutTest.java
index 0cc41ba..9cf8e1e 100644
--- a/core/tests/coretests/src/android/text/LayoutTest.java
+++ b/core/tests/coretests/src/android/text/LayoutTest.java
@@ -299,7 +299,8 @@
*/
layout.getSelection(5 /* startIndex */, 5 /* endIndex */,
- (left, top, right, bottom) -> fail(String.format(Locale.getDefault(),
+ (left, top, right, bottom, textSelectionLayout) -> fail(
+ String.format(Locale.getDefault(),
"Did not expect any rectangles, got a rectangle with (left: %f,"
+ " top: %f), (right: %f, bottom: %f)",
left, top, right, bottom)));
@@ -313,7 +314,8 @@
final List<RectF> rectangles = new ArrayList<>();
layout.getSelection(0 /* startIndex */, 1 /* endIndex */,
- (left, top, right, bottom) -> rectangles.add(new RectF(left, top, right, bottom)));
+ (left, top, right, bottom, textSelectionLayout) -> rectangles.add(
+ new RectF(left, top, right, bottom)));
/*
* The selection we expect will only cover the letter "a". Hence, we expect one rectangle
@@ -343,7 +345,8 @@
final List<RectF> rectangles = new ArrayList<>();
layout.getSelection(0 /* startIndex */, 2 /* endIndex */,
- (left, top, right, bottom) -> rectangles.add(new RectF(left, top, right, bottom)));
+ (left, top, right, bottom, textSelectionLayout) -> rectangles.add(
+ new RectF(left, top, right, bottom)));
/*
* The selection that will be selected is "a\n" - the selection starts at the beginning
@@ -388,7 +391,8 @@
final List<RectF> rectangles = new ArrayList<>();
layout.getSelection(0 /* startIndex */, 3 /* endIndex */,
- (left, top, right, bottom) -> rectangles.add(new RectF(left, top, right, bottom)));
+ (left, top, right, bottom, textSelectionLayout) -> rectangles.add(
+ new RectF(left, top, right, bottom)));
/*
* The selection that will be selected is "a\nb" - the selection starts at the beginning
@@ -430,7 +434,8 @@
final List<RectF> rectangles = new ArrayList<>();
layout.getSelection(0 /* startIndex */, 1 /* endIndex */,
- (left, top, right, bottom) -> rectangles.add(new RectF(left, top, right, bottom)));
+ (left, top, right, bottom, textSelectionLayout) -> rectangles.add(
+ new RectF(left, top, right, bottom)));
/*
* In the single line selection case, we expect that only one rectangle covering the letter
@@ -455,6 +460,44 @@
}
@Test
+ public void testGetSelection_latinTextDirection() {
+ final Layout layout = new StaticLayout("abc", mTextPaint, Integer.MAX_VALUE,
+ Alignment.ALIGN_LEFT, mSpacingMult, mSpacingAdd, false);
+
+ layout.getSelection(0 /* startIndex */, 2 /* endIndex */,
+ (left, top, right, bottom, textSelectionLayout) ->
+ assertEquals(Layout.TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT,
+ textSelectionLayout));
+ }
+
+ @Test
+ public void testGetSelection_arabicTextDirection() {
+ final Layout layout = new StaticLayout("غينيا", mTextPaint, Integer.MAX_VALUE,
+ Alignment.ALIGN_LEFT, mSpacingMult, mSpacingAdd, false);
+
+ layout.getSelection(0 /* startIndex */, 2 /* endIndex */,
+ (left, top, right, bottom, textSelectionLayout) ->
+ assertEquals(Layout.TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT,
+ textSelectionLayout));
+ }
+
+ @Test
+ public void testGetSelection_mixedLatinAndArabicTextDirection() {
+ final Layout layout = new StaticLayout("abcغينيا", mTextPaint, Integer.MAX_VALUE,
+ Alignment.ALIGN_LEFT, mSpacingMult, mSpacingAdd, false);
+
+ final List<Integer> layouts = new ArrayList<>(2);
+
+ layout.getSelection(0 /* startIndex */, 6 /* endIndex */,
+ (left, top, right, bottom, textSelectionLayout) -> layouts.add(
+ textSelectionLayout));
+
+ assertEquals(2, layouts.size());
+ assertEquals(Layout.TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT, (long) layouts.get(0));
+ assertEquals(Layout.TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT, (long) layouts.get(1));
+ }
+
+ @Test
public void testIsSpanned() {
MockLayout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
mAlign, mSpacingMult, mSpacingAdd);
diff --git a/core/tests/coretests/src/android/util/TimingsTraceLogTest.java b/core/tests/coretests/src/android/util/TimingsTraceLogTest.java
new file mode 100644
index 0000000..7bb4ab8
--- /dev/null
+++ b/core/tests/coretests/src/android/util/TimingsTraceLogTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.util;
+
+import static org.junit.Assert.assertTrue;
+
+import android.os.Trace;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Tests for {@link TimingsTraceLog}.
+ * <p>Usage: bit FrameworksCoreTests:android.util.TimingsTraceLogTest
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TimingsTraceLogTest {
+
+ @Test
+ public void testDifferentThreads() throws Exception {
+ TimingsTraceLog log = new TimingsTraceLog("TEST", Trace.TRACE_TAG_APP);
+ // Should be able to log on the same thread
+ log.traceBegin("test");
+ log.traceEnd();
+ final List<String> errors = new ArrayList<>();
+ // Calling from a different thread should fail
+ Thread t = new Thread(() -> {
+ try {
+ log.traceBegin("test");
+ errors.add("traceBegin should fail on a different thread");
+ } catch (IllegalStateException expected) {
+ }
+ try {
+ log.traceEnd();
+ errors.add("traceEnd should fail on a different thread");
+ } catch (IllegalStateException expected) {
+ }
+ // Verify that creating a new log will work
+ TimingsTraceLog log2 = new TimingsTraceLog("TEST", Trace.TRACE_TAG_APP);
+ log2.traceBegin("test");
+ log2.traceEnd();
+
+ });
+ t.start();
+ t.join();
+ assertTrue(errors.toString(), errors.isEmpty());
+ }
+
+}
diff --git a/core/tests/coretests/src/android/widget/RemoteViewsTest.java b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
index bf994a9..d26437e 100644
--- a/core/tests/coretests/src/android/widget/RemoteViewsTest.java
+++ b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
@@ -16,6 +16,10 @@
package android.widget;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
@@ -36,10 +40,6 @@
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
@@ -336,7 +336,9 @@
parent.addView(R.id.layout, views);
views = parent;
}
+ // Both clone and parcel/unparcel work,
views.clone();
+ parcelAndRecreate(views);
views = new RemoteViews(mPackage, R.layout.remote_views_test);
for (int i = 0; i < 11; i++) {
@@ -344,8 +346,10 @@
parent.addView(R.id.layout, views);
views = parent;
}
- exception.expect(IllegalArgumentException.class);
+ // Clone works but parcel/unparcel fails
views.clone();
+ exception.expect(IllegalArgumentException.class);
+ parcelAndRecreate(views);
}
@Test
@@ -355,15 +359,27 @@
views = new RemoteViews(views,
new RemoteViews(mPackage, R.layout.remote_views_test));
}
+ // Both clone and parcel/unparcel work,
views.clone();
+ parcelAndRecreate(views);
views = new RemoteViews(mPackage, R.layout.remote_views_test);
for (int i = 0; i < 11; i++) {
- RemoteViews parent = new RemoteViews(mPackage, R.layout.remote_views_test);
- parent.addView(R.id.layout, views);
- views = parent;
+ views = new RemoteViews(views,
+ new RemoteViews(mPackage, R.layout.remote_views_test));
}
- exception.expect(IllegalArgumentException.class);
+ // Clone works but parcel/unparcel fails
views.clone();
+ exception.expect(IllegalArgumentException.class);
+ parcelAndRecreate(views);
+ }
+
+ private void parcelAndRecreate(RemoteViews views) {
+ Parcel p = Parcel.obtain();
+ views.writeToParcel(p, 0);
+ p.setDataPosition(0);
+
+ RemoteViews.CREATOR.createFromParcel(p);
+ p.recycle();
}
}
diff --git a/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java b/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java
index d94a017..b881053 100644
--- a/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java
+++ b/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java
@@ -25,6 +25,7 @@
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -110,4 +111,154 @@
assertEquals(expectedPointY, adjustedPoint.y, 0.0f);
}
+ @Test
+ public void testMergeRectangleIntoList_addThreeDisjointRectangles() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 1, 1),
+ new RectF(10, 10, 11, 11),
+ new RectF(20, 20, 21, 21)
+ },
+ new RectF[] {
+ new RectF(0, 0, 1, 1),
+ new RectF(10, 10, 11, 11),
+ new RectF(20, 20, 21, 21)
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_addAnEmptyRectangle() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 0, 0)
+ },
+ new RectF[] {
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_addAContainedRectangle() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 10, 10),
+ new RectF(9, 0, 10, 10)
+ },
+ new RectF[] {
+ new RectF(0, 0, 10, 10)
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_addARectangleThatContainsExistingRectangles() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 1, 1),
+ new RectF(1, 0, 2, 1),
+ new RectF(0, 0, 2, 1)
+ },
+ new RectF[] {
+ new RectF(0, 0, 2, 1)
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_addRectangleThatIntersectsAndHasTheSameHeightOnRight() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 1, 1),
+ new RectF(0.5f, 0, 1.5f, 1)
+ },
+ new RectF[] {
+ new RectF(0, 0, 1.5f, 1)
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_addRectangleThatIntersectsAndHasTheSameHeightOnLeft() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0.5f, 0, 1.5f, 1),
+ new RectF(0, 0, 1, 1)
+ },
+ new RectF[] {
+ new RectF(0, 0, 1.5f, 1)
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_addRectangleThatExpandsToTheRight() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 1, 1),
+ new RectF(1, 0, 1.5f, 1)
+ },
+ new RectF[] {
+ new RectF(0, 0, 1.5f, 1)
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_addRectangleThatExpandsToTheLeft() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(1, 0, 1.5f, 1),
+ new RectF(0, 0, 1, 1)
+ },
+ new RectF[] {
+ new RectF(0, 0, 1.5f, 1)
+ }
+ );
+ }
+
+
+ @Test
+ public void testMergeRectangleIntoList_addRectangleMadeObsoleteByMultipleExistingRectangles() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 1, 1),
+ new RectF(0.5f, 0, 1.5f, 1),
+ new RectF(0.25f, 0, 1.25f, 1)
+ },
+ new RectF[] {
+ new RectF(0, 0, 1.5f, 1)
+ }
+ );
+ }
+
+ @Test
+ public void testMergeRectangleIntoList_threeRectanglesThatTouchEachOther() {
+ testExpandRectangleList(
+ new RectF[] {
+ new RectF(0, 0, 1, 1),
+ new RectF(1, 0, 2, 1),
+ new RectF(2, 0, 3, 1)
+ },
+ new RectF[] {
+ new RectF(0, 0, 3, 1)
+ }
+ );
+ }
+
+
+ private void testExpandRectangleList(final RectF[] inputRectangles,
+ final RectF[] outputRectangles) {
+ final List<RectF> expectedOutput = Arrays.asList(outputRectangles);
+
+ final List<RectF> result = new ArrayList<>();
+ final int size = inputRectangles.length;
+ for (int index = 0; index < size; ++index) {
+ SelectionActionModeHelper.mergeRectangleIntoList(result, inputRectangles[index]);
+ }
+
+ assertEquals(expectedOutput, result);
+ }
+
+
}
diff --git a/core/tests/utiltests/jni/Android.bp b/core/tests/utiltests/jni/Android.bp
index e9a4144..b0b09c2 100644
--- a/core/tests/utiltests/jni/Android.bp
+++ b/core/tests/utiltests/jni/Android.bp
@@ -17,7 +17,6 @@
shared_libs: [
"libcutils",
],
- clang: true,
stl: "libc++",
srcs: [
"registration.cpp",
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 26741fe..7e24530 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -170,7 +170,7 @@
<library name="javax.obex"
file="/system/framework/javax.obex.jar" />
<library name="org.apache.http.legacy"
- file="/system/framework/org.apache.http.legacy.jar" />
+ file="/system/framework/org.apache.http.legacy.boot.jar" />
<!-- These are the standard packages that are white-listed to always have internet
access while in power save mode, even if they aren't in the foreground. -->
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 1f55232..7a2df85 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -280,6 +280,7 @@
<permission name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<permission name="android.permission.MOVE_PACKAGE"/>
+ <permission name="android.permission.PACKAGE_USAGE_STATS" />
<permission name="android.permission.READ_FRAME_BUFFER"/>
<permission name="android.permission.REAL_GET_TASKS"/>
<permission name="android.permission.REGISTER_CALL_PROVIDER"/>
diff --git a/data/keyboards/Vendor_054c_Product_05c4.kl b/data/keyboards/Vendor_054c_Product_05c4.kl
new file mode 100644
index 0000000..f465733
--- /dev/null
+++ b/data/keyboards/Vendor_054c_Product_05c4.kl
@@ -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.
+
+#
+# Sony Playstation(R) DualShock 4 Controller
+#
+
+
+# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html
+
+# Square
+key 0x130 BUTTON_X
+# Cross
+key 0x131 BUTTON_A
+# Circle
+key 0x132 BUTTON_B
+# Triangle
+key 0x133 BUTTON_Y
+
+key 0x134 BUTTON_L1
+key 0x135 BUTTON_R1
+key 0x136 BUTTON_L2
+key 0x137 BUTTON_R2
+
+# L2 axis
+axis 0x03 LTRIGGER
+# R2 axis
+axis 0x04 RTRIGGER
+
+
+# Left Analog Stick
+axis 0x00 X
+axis 0x01 Y
+# Right Analog Stick
+axis 0x02 Z
+axis 0x05 RZ
+
+# Left stick click
+key 0x13a BUTTON_THUMBL
+# Right stick click
+key 0x13b BUTTON_THUMBR
+
+# Hat
+axis 0x10 HAT_X
+axis 0x11 HAT_Y
+
+# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
+# Share
+key 0x138 BUTTON_SELECT
+# Options
+key 0x139 BUTTON_START
+
+# PS key
+key 0x13c HOME
+# Touchpad press
+key 0x13d BUTTON_MODE
diff --git a/data/keyboards/Vendor_054c_Product_09cc.kl b/data/keyboards/Vendor_054c_Product_09cc.kl
new file mode 100644
index 0000000..f465733
--- /dev/null
+++ b/data/keyboards/Vendor_054c_Product_09cc.kl
@@ -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.
+
+#
+# Sony Playstation(R) DualShock 4 Controller
+#
+
+
+# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html
+
+# Square
+key 0x130 BUTTON_X
+# Cross
+key 0x131 BUTTON_A
+# Circle
+key 0x132 BUTTON_B
+# Triangle
+key 0x133 BUTTON_Y
+
+key 0x134 BUTTON_L1
+key 0x135 BUTTON_R1
+key 0x136 BUTTON_L2
+key 0x137 BUTTON_R2
+
+# L2 axis
+axis 0x03 LTRIGGER
+# R2 axis
+axis 0x04 RTRIGGER
+
+
+# Left Analog Stick
+axis 0x00 X
+axis 0x01 Y
+# Right Analog Stick
+axis 0x02 Z
+axis 0x05 RZ
+
+# Left stick click
+key 0x13a BUTTON_THUMBL
+# Right stick click
+key 0x13b BUTTON_THUMBR
+
+# Hat
+axis 0x10 HAT_X
+axis 0x11 HAT_Y
+
+# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
+# Share
+key 0x138 BUTTON_SELECT
+# Options
+key 0x139 BUTTON_START
+
+# PS key
+key 0x13c HOME
+# Touchpad press
+key 0x13d BUTTON_MODE
diff --git a/data/sounds/AudioPackageGo.mk b/data/sounds/AudioPackageGo.mk
index 3756d30..ae742df 100644
--- a/data/sounds/AudioPackageGo.mk
+++ b/data/sounds/AudioPackageGo.mk
@@ -40,3 +40,9 @@
$(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
$(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
$(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
diff --git a/data/sounds/AudioTv.mk b/data/sounds/AudioTv.mk
new file mode 100644
index 0000000..ee37cb9
--- /dev/null
+++ b/data/sounds/AudioTv.mk
@@ -0,0 +1,125 @@
+# 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.
+
+LOCAL_PATH := frameworks/base/data/sounds
+
+PRODUCT_COPY_FILES += \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Rooster_02.ogg:system/media/audio/alarms/Alarm_Rooster_02.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Barium.ogg:system/media/audio/alarms/Barium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:system/media/audio/alarms/Fermium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:system/media/audio/alarms/Hassium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:system/media/audio/alarms/Neptunium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:system/media/audio/alarms/Promethium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:system/media/audio/alarms/Scandium.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:system/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:system/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:system/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoStop_48k.ogg:system/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/ogg/WirelessChargingStarted.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
+ $(LOCAL_PATH)/F1_MissedCall.ogg:system/media/audio/notifications/F1_MissedCall.ogg \
+ $(LOCAL_PATH)/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_MMS.ogg \
+ $(LOCAL_PATH)/F1_New_SMS.ogg:system/media/audio/notifications/F1_New_SMS.ogg \
+ $(LOCAL_PATH)/notifications/Aldebaran.ogg:system/media/audio/notifications/Aldebaran.ogg \
+ $(LOCAL_PATH)/notifications/Altair.ogg:system/media/audio/notifications/Altair.ogg \
+ $(LOCAL_PATH)/notifications/Antares.ogg:system/media/audio/notifications/Antares.ogg \
+ $(LOCAL_PATH)/notifications/arcturus.ogg:system/media/audio/notifications/arcturus.ogg \
+ $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:system/media/audio/notifications/Beat_Box_Android.ogg \
+ $(LOCAL_PATH)/notifications/Betelgeuse.ogg:system/media/audio/notifications/Betelgeuse.ogg \
+ $(LOCAL_PATH)/notifications/Canopus.ogg:system/media/audio/notifications/Canopus.ogg \
+ $(LOCAL_PATH)/notifications/Castor.ogg:system/media/audio/notifications/Castor.ogg \
+ $(LOCAL_PATH)/notifications/Cricket.ogg:system/media/audio/notifications/Cricket.ogg \
+ $(LOCAL_PATH)/notifications/Deneb.ogg:system/media/audio/notifications/Deneb.ogg \
+ $(LOCAL_PATH)/notifications/Doink.ogg:system/media/audio/notifications/Doink.ogg \
+ $(LOCAL_PATH)/notifications/Drip.ogg:system/media/audio/notifications/Drip.ogg \
+ $(LOCAL_PATH)/notifications/Electra.ogg:system/media/audio/notifications/Electra.ogg \
+ $(LOCAL_PATH)/notifications/Fomalhaut.ogg:system/media/audio/notifications/Fomalhaut.ogg \
+ $(LOCAL_PATH)/notifications/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \
+ $(LOCAL_PATH)/notifications/Merope.ogg:system/media/audio/notifications/Merope.ogg \
+ $(LOCAL_PATH)/notifications/moonbeam.ogg:system/media/audio/notifications/moonbeam.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Antimony.ogg:system/media/audio/notifications/Antimony.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Argon.ogg:system/media/audio/notifications/Argon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Beryllium.ogg:system/media/audio/notifications/Beryllium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Cobalt.ogg:system/media/audio/notifications/Cobalt.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Fluorine.ogg:system/media/audio/notifications/Fluorine.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Gallium.ogg:system/media/audio/notifications/Gallium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Helium.ogg:system/media/audio/notifications/Helium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:system/media/audio/notifications/Iridium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Krypton.ogg:system/media/audio/notifications/Krypton.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Palladium.ogg:system/media/audio/notifications/Palladium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Radon.ogg:system/media/audio/notifications/Radon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Rubidium.ogg:system/media/audio/notifications/Rubidium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Selenium.ogg:system/media/audio/notifications/Selenium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Strontium.ogg:system/media/audio/notifications/Strontium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Thallium.ogg:system/media/audio/notifications/Thallium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Xenon.ogg:system/media/audio/notifications/Xenon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Zirconium.ogg:system/media/audio/notifications/Zirconium.ogg \
+ $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \
+ $(LOCAL_PATH)/notifications/pizzicato.ogg:system/media/audio/notifications/pizzicato.ogg \
+ $(LOCAL_PATH)/notifications/Plastic_Pipe.ogg:system/media/audio/notifications/Plastic_Pipe.ogg \
+ $(LOCAL_PATH)/notifications/regulus.ogg:system/media/audio/notifications/regulus.ogg \
+ $(LOCAL_PATH)/notifications/sirius.ogg:system/media/audio/notifications/sirius.ogg \
+ $(LOCAL_PATH)/notifications/Sirrah.ogg:system/media/audio/notifications/Sirrah.ogg \
+ $(LOCAL_PATH)/notifications/SpaceSeed.ogg:system/media/audio/notifications/SpaceSeed.ogg \
+ $(LOCAL_PATH)/notifications/TaDa.ogg:system/media/audio/notifications/TaDa.ogg \
+ $(LOCAL_PATH)/notifications/Tinkerbell.ogg:system/media/audio/notifications/Tinkerbell.ogg \
+ $(LOCAL_PATH)/notifications/tweeters.ogg:system/media/audio/notifications/tweeters.ogg \
+ $(LOCAL_PATH)/notifications/vega.ogg:system/media/audio/notifications/vega.ogg
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index 3b272c8..ffb39e3 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -433,10 +433,15 @@
static void validate(Options opts) {
if (opts == null) return;
- if (opts.inMutable && opts.inPreferredConfig == Bitmap.Config.HARDWARE) {
+ if (opts.inBitmap != null && opts.inBitmap.getConfig() == Bitmap.Config.HARDWARE) {
throw new IllegalArgumentException("Bitmaps with Config.HARWARE are always immutable");
}
+ if (opts.inMutable && opts.inPreferredConfig == Bitmap.Config.HARDWARE) {
+ throw new IllegalArgumentException("Bitmaps with Config.HARDWARE cannot be " +
+ "decoded into - they are immutable");
+ }
+
if (opts.inPreferredColorSpace != null) {
if (!(opts.inPreferredColorSpace instanceof ColorSpace.Rgb)) {
throw new IllegalArgumentException("The destination color space must use the " +
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index c3ef450..ceac325 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -31,6 +31,7 @@
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Shader;
+import android.os.Trace;
import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
@@ -605,38 +606,44 @@
public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
@NonNull AttributeSet attrs, @Nullable Theme theme)
throws XmlPullParserException, IOException {
- if (mVectorState.mRootGroup != null || mVectorState.mNativeTree != null) {
- // This VD has been used to display other VD resource content, clean up.
- if (mVectorState.mRootGroup != null) {
- // Subtract the native allocation for all the nodes.
- VMRuntime.getRuntime().registerNativeFree(mVectorState.mRootGroup.getNativeSize());
- // Remove child nodes' reference to tree
- mVectorState.mRootGroup.setTree(null);
+ try {
+ Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "VectorDrawable#inflate");
+ if (mVectorState.mRootGroup != null || mVectorState.mNativeTree != null) {
+ // This VD has been used to display other VD resource content, clean up.
+ if (mVectorState.mRootGroup != null) {
+ // Subtract the native allocation for all the nodes.
+ VMRuntime.getRuntime().registerNativeFree(
+ mVectorState.mRootGroup.getNativeSize());
+ // Remove child nodes' reference to tree
+ mVectorState.mRootGroup.setTree(null);
+ }
+ mVectorState.mRootGroup = new VGroup();
+ if (mVectorState.mNativeTree != null) {
+ // Subtract the native allocation for the tree wrapper, which contains root node
+ // as well as rendering related data.
+ VMRuntime.getRuntime().registerNativeFree(mVectorState.NATIVE_ALLOCATION_SIZE);
+ mVectorState.mNativeTree.release();
+ }
+ mVectorState.createNativeTree(mVectorState.mRootGroup);
}
- mVectorState.mRootGroup = new VGroup();
- if (mVectorState.mNativeTree != null) {
- // Subtract the native allocation for the tree wrapper, which contains root node
- // as well as rendering related data.
- VMRuntime.getRuntime().registerNativeFree(mVectorState.NATIVE_ALLOCATION_SIZE);
- mVectorState.mNativeTree.release();
- }
- mVectorState.createNativeTree(mVectorState.mRootGroup);
+ final VectorDrawableState state = mVectorState;
+ state.setDensity(Drawable.resolveDensity(r, 0));
+
+ final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.VectorDrawable);
+ updateStateFromTypedArray(a);
+ a.recycle();
+
+ mDpiScaledDirty = true;
+
+ state.mCacheDirty = true;
+ inflateChildElements(r, parser, attrs, theme);
+
+ state.onTreeConstructionFinished();
+ // Update local properties.
+ updateLocalState(r);
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
}
- final VectorDrawableState state = mVectorState;
- state.setDensity(Drawable.resolveDensity(r, 0));
-
- final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.VectorDrawable);
- updateStateFromTypedArray(a);
- a.recycle();
-
- mDpiScaledDirty = true;
-
- state.mCacheDirty = true;
- inflateChildElements(r, parser, attrs, theme);
-
- state.onTreeConstructionFinished();
- // Update local properties.
- updateLocalState(r);
}
private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index ccf9de0..7e959a8 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -754,6 +754,8 @@
// None of the key's SIDs can ever be authenticated
return new KeyPermanentlyInvalidatedException();
}
+ case UNINITIALIZED:
+ return new KeyPermanentlyInvalidatedException();
default:
return new InvalidKeyException("Keystore operation failed", e);
}
diff --git a/legacy-test/Android.mk b/legacy-test/Android.mk
index ef2950b..0e6b31e 100644
--- a/legacy-test/Android.mk
+++ b/legacy-test/Android.mk
@@ -94,11 +94,10 @@
LOCAL_SOURCE_FILES_ALL_GENERATED := true
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
# Make sure to run droiddoc first to generate the stub source files.
-$(full_classes_compiled_jar) : $(legacy_test_api_gen_stamp)
-$(full_classes_jack) : $(legacy_test_api_gen_stamp)
+LOCAL_ADDITIONAL_DEPENDENCIES := $(legacy_test_api_gen_stamp)
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
# Archive a copy of the classes.jar in SDK build.
$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):legacy.test.stubs.jar)
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 0782269..7a0ef2b 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -59,7 +59,6 @@
#endif
#define IDMAP_MAGIC 0x504D4449
-#define IDMAP_CURRENT_VERSION 0x00000001
#define APP_PACKAGE_ID 0x7f
#define SYS_PACKAGE_ID 0x01
@@ -246,11 +245,11 @@
}
const uint32_t version = htodl(*(reinterpret_cast<const uint32_t*>(idmap) + 1));
- if (version != IDMAP_CURRENT_VERSION) {
+ if (version != ResTable::IDMAP_CURRENT_VERSION) {
// We are strict about versions because files with this format are
// auto-generated and don't need backwards compatibility.
ALOGW("idmap: version mismatch in header (is 0x%08x, expected 0x%08x)",
- version, IDMAP_CURRENT_VERSION);
+ version, ResTable::IDMAP_CURRENT_VERSION);
return false;
}
return true;
@@ -6855,7 +6854,7 @@
uint32_t* data = (uint32_t*)*outData;
*data++ = htodl(IDMAP_MAGIC);
- *data++ = htodl(IDMAP_CURRENT_VERSION);
+ *data++ = htodl(ResTable::IDMAP_CURRENT_VERSION);
*data++ = htodl(targetCrc);
*data++ = htodl(overlayCrc);
const char* paths[] = { targetPath, overlayPath };
diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h
index 7a6e37d..66c66c2 100644
--- a/libs/androidfw/include/androidfw/ResourceTypes.h
+++ b/libs/androidfw/include/androidfw/ResourceTypes.h
@@ -1933,6 +1933,7 @@
void** outData, size_t* outSize) const;
static const size_t IDMAP_HEADER_SIZE_BYTES = 4 * sizeof(uint32_t) + 2 * 256;
+ static const uint32_t IDMAP_CURRENT_VERSION = 0x00000001;
// Retrieve idmap meta-data.
//
diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp
index e0373ca..376371d 100644
--- a/libs/hwui/VectorDrawable.cpp
+++ b/libs/hwui/VectorDrawable.cpp
@@ -22,6 +22,7 @@
#include "SkShader.h"
#include <utils/Log.h>
#include "utils/Macros.h"
+#include "utils/TraceUtils.h"
#include "utils/VectorDrawableUtils.h"
#include <math.h>
@@ -580,14 +581,17 @@
void Tree::updateBitmapCache(Bitmap& bitmap, bool useStagingData) {
SkBitmap outCache;
bitmap.getSkBitmap(&outCache);
+ int cacheWidth = outCache.width();
+ int cacheHeight = outCache.height();
+ ATRACE_FORMAT("VectorDrawable repaint %dx%d", cacheWidth, cacheHeight);
outCache.eraseColor(SK_ColorTRANSPARENT);
SkCanvas outCanvas(outCache);
float viewportWidth = useStagingData ?
mStagingProperties.getViewportWidth() : mProperties.getViewportWidth();
float viewportHeight = useStagingData ?
mStagingProperties.getViewportHeight() : mProperties.getViewportHeight();
- float scaleX = outCache.width() / viewportWidth;
- float scaleY = outCache.height() / viewportHeight;
+ float scaleX = cacheWidth / viewportWidth;
+ float scaleY = cacheHeight / viewportHeight;
outCanvas.scale(scaleX, scaleY);
mRootNode->draw(&outCanvas, useStagingData);
}
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 742f14d..6f117de 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -46,7 +46,7 @@
}
TaskManager* SkiaPipeline::getTaskManager() {
- return &mTaskManager;
+ return mRenderThread.cacheManager().getTaskManager();
}
void SkiaPipeline::onDestroyHardwareResources() {
@@ -83,7 +83,8 @@
void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers,
bool opaque, bool wideColorGamut) {
- // TODO: Handle wide color gamut
+ sk_sp<GrContext> cachedContext;
+
// Render all layers that need to be updated, in order.
for (size_t i = 0; i < layers.entries().size(); i++) {
RenderNode* layerNode = layers.entries()[i].renderNode.get();
@@ -126,10 +127,23 @@
RenderNodeDrawable root(layerNode, layerCanvas, false);
root.forceDraw(layerCanvas);
layerCanvas->restoreToCount(saveCount);
- layerCanvas->flush();
mLightCenter = savedLightCenter;
+
+ // cache the current context so that we can defer flushing it until
+ // either all the layers have been rendered or the context changes
+ GrContext* currentContext = layerCanvas->getGrContext();
+ if (cachedContext.get() != currentContext) {
+ if (cachedContext.get()) {
+ cachedContext->flush();
+ }
+ cachedContext.reset(SkSafeRef(currentContext));
+ }
}
}
+
+ if (cachedContext.get()) {
+ cachedContext->flush();
+ }
}
bool SkiaPipeline::createOrUpdateLayer(RenderNode* node,
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h
index 19ffc46..2b0c419 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -126,7 +126,6 @@
*/
void renderVectorDrawableCache();
- TaskManager mTaskManager;
std::vector<sk_sp<SkImage>> mPinnedImages;
/**
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp
index f6b23e1..0572a8d 100644
--- a/libs/hwui/renderthread/CacheManager.cpp
+++ b/libs/hwui/renderthread/CacheManager.cpp
@@ -22,6 +22,7 @@
#include <gui/Surface.h>
#include <GrContextOptions.h>
+#include <SkExecutor.h>
#include <math.h>
#include <set>
@@ -73,6 +74,29 @@
mGrContext->setResourceCacheLimits(mMaxResources, mMaxResourceBytes);
}
+class CacheManager::SkiaTaskProcessor : public TaskProcessor<bool>, public SkExecutor {
+public:
+ explicit SkiaTaskProcessor(TaskManager* taskManager) : TaskProcessor<bool>(taskManager) {}
+
+ // This is really a Task<void> but that doesn't really work when Future<>
+ // expects to be able to get/set a value
+ struct SkiaTask : public Task<bool> {
+ std::function<void()> func;
+ };
+
+ virtual void add(std::function<void(void)> func) override {
+ sp<SkiaTask> task(new SkiaTask());
+ task->func = func;
+ TaskProcessor<bool>::add(task);
+ }
+
+ virtual void onProcess(const sp<Task<bool> >& task) override {
+ SkiaTask* t = static_cast<SkiaTask*>(task.get());
+ t->func();
+ task->setResult(true);
+ }
+};
+
void CacheManager::configureContext(GrContextOptions* contextOptions) {
contextOptions->fAllowPathMaskCaching = true;
@@ -95,6 +119,13 @@
// Skia's implementation doesn't provide a mechanism to resize the font cache due to
// the potential cost of recreating the glyphs.
contextOptions->fGlyphCacheTextureMaximumBytes = fontCacheMB * 1024 * 1024;
+
+ if (mTaskManager.canRunTasks()) {
+ if (!mTaskProcessor.get()) {
+ mTaskProcessor = new SkiaTaskProcessor(&mTaskManager);
+ }
+ contextOptions->fExecutor = mTaskProcessor.get();
+ }
}
void CacheManager::trimMemory(TrimMemoryMode mode) {
diff --git a/libs/hwui/renderthread/CacheManager.h b/libs/hwui/renderthread/CacheManager.h
index 90362f3..3ba2690 100644
--- a/libs/hwui/renderthread/CacheManager.h
+++ b/libs/hwui/renderthread/CacheManager.h
@@ -22,7 +22,10 @@
#include <ui/DisplayInfo.h>
#include <utils/String8.h>
#include <vector>
+
#include "pipeline/skia/VectorDrawableAtlas.h"
+#include "thread/TaskManager.h"
+#include "thread/TaskProcessor.h"
namespace android {
@@ -54,6 +57,7 @@
size_t getCacheSize() const { return mMaxResourceBytes; }
size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; }
+ TaskManager* getTaskManager() { return &mTaskManager; }
private:
friend class RenderThread;
@@ -77,6 +81,10 @@
};
sp<skiapipeline::VectorDrawableAtlas> mVectorDrawableAtlas;
+
+ class SkiaTaskProcessor;
+ sp<SkiaTaskProcessor> mTaskProcessor;
+ TaskManager mTaskManager;
};
} /* namespace renderthread */
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index aa6d2f3..4a5b2c7 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -162,8 +162,8 @@
void addRenderNode(RenderNode* node, bool placeFront);
void removeRenderNode(RenderNode* node);
- void setContentDrawBounds(int left, int top, int right, int bottom) {
- mContentDrawBounds.set(left, top, right, bottom);
+ void setContentDrawBounds(const Rect& bounds) {
+ mContentDrawBounds = bounds;
}
RenderState& getRenderState() {
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp
index 7d641d3..a097272 100644
--- a/libs/hwui/renderthread/DrawFrameTask.cpp
+++ b/libs/hwui/renderthread/DrawFrameTask.cpp
@@ -32,6 +32,7 @@
DrawFrameTask::DrawFrameTask()
: mRenderThread(nullptr)
, mContext(nullptr)
+ , mContentDrawBounds(0, 0, 0, 0)
, mSyncResult(SyncResult::OK) {
}
@@ -123,6 +124,7 @@
mLayers[i]->apply();
}
mLayers.clear();
+ mContext->setContentDrawBounds(mContentDrawBounds);
mContext->prepareTree(info, mFrameInfo, mSyncQueued, mTargetNode);
// This is after the prepareTree so that any pending operations
diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h
index fb48062..83ecb98 100644
--- a/libs/hwui/renderthread/DrawFrameTask.h
+++ b/libs/hwui/renderthread/DrawFrameTask.h
@@ -61,6 +61,9 @@
virtual ~DrawFrameTask();
void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode);
+ void setContentDrawBounds(int left, int top, int right, int bottom) {
+ mContentDrawBounds.set(left, top, right, bottom);
+ }
void pushLayerUpdate(DeferredLayerUpdater* layer);
void removeLayerUpdate(DeferredLayerUpdater* layer);
@@ -82,6 +85,7 @@
RenderThread* mRenderThread;
CanvasContext* mContext;
RenderNode* mTargetNode = nullptr;
+ Rect mContentDrawBounds;
/*********************************************
* Single frame data
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 6904743..a6aa301 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -551,20 +551,8 @@
staticPostAndWait(task);
}
-CREATE_BRIDGE5(setContentDrawBounds, CanvasContext* context, int left, int top,
- int right, int bottom) {
- args->context->setContentDrawBounds(args->left, args->top, args->right, args->bottom);
- return nullptr;
-}
-
void RenderProxy::setContentDrawBounds(int left, int top, int right, int bottom) {
- SETUP_TASK(setContentDrawBounds);
- args->context = mContext;
- args->left = left;
- args->top = top;
- args->right = right;
- args->bottom = bottom;
- staticPostAndWait(task);
+ mDrawFrameTask.setContentDrawBounds(left, top, right, bottom);
}
CREATE_BRIDGE1(serializeDisplayListTree, CanvasContext* context) {
diff --git a/libs/incident/include/android/os/IncidentReportArgs.h b/libs/incident/include/android/os/IncidentReportArgs.h
index 956ef6c..da80989 100644
--- a/libs/incident/include/android/os/IncidentReportArgs.h
+++ b/libs/incident/include/android/os/IncidentReportArgs.h
@@ -39,12 +39,13 @@
virtual status_t readFromParcel(const Parcel* in);
void setAll(bool all);
+ void setDest(int dest);
void addSection(int section);
void addHeader(const vector<int8_t>& header);
- inline bool all() const { return mAll; };
+ inline bool all() const { return mAll; }
bool containsSection(int section) const;
-
+ inline int dest() const { return mDest; }
inline const set<int>& sections() const { return mSections; }
inline const vector<vector<int8_t>>& headers() const { return mHeaders; }
@@ -54,6 +55,7 @@
set<int> mSections;
vector<vector<int8_t>> mHeaders;
bool mAll;
+ int mDest;
};
}
diff --git a/libs/incident/src/IncidentReportArgs.cpp b/libs/incident/src/IncidentReportArgs.cpp
index f604909..e628722 100644
--- a/libs/incident/src/IncidentReportArgs.cpp
+++ b/libs/incident/src/IncidentReportArgs.cpp
@@ -25,14 +25,16 @@
IncidentReportArgs::IncidentReportArgs()
:mSections(),
- mAll(false)
+ mAll(false),
+ mDest(-1)
{
}
IncidentReportArgs::IncidentReportArgs(const IncidentReportArgs& that)
:mSections(that.mSections),
mHeaders(that.mHeaders),
- mAll(that.mAll)
+ mAll(that.mAll),
+ mDest(that.mDest)
{
}
@@ -74,6 +76,11 @@
}
}
+ err = out->writeInt32(mDest);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
return NO_ERROR;
}
@@ -120,6 +127,13 @@
}
}
+ int32_t dest;
+ err = in->readInt32(&dest);
+ if (err != NO_ERROR) {
+ return err;
+ }
+ mDest = dest;
+
return OK;
}
@@ -133,6 +147,12 @@
}
void
+IncidentReportArgs::setDest(int dest)
+{
+ mDest = dest;
+}
+
+void
IncidentReportArgs::addSection(int section)
{
if (!mAll) {
diff --git a/libs/services/include/android/os/DropBoxManager.h b/libs/services/include/android/os/DropBoxManager.h
index 8717178..2ed203d 100644
--- a/libs/services/include/android/os/DropBoxManager.h
+++ b/libs/services/include/android/os/DropBoxManager.h
@@ -57,7 +57,7 @@
// and a handle will be passed to the system process, so no additional permissions
// are required from the system process. Returns NULL if the file can't be opened.
Status addFile(const String16& tag, const string& filename, int flags);
-
+
class Entry : public virtual RefBase, public Parcelable {
public:
Entry();
@@ -65,7 +65,12 @@
virtual status_t writeToParcel(Parcel* out) const;
virtual status_t readFromParcel(const Parcel* in);
-
+
+ const vector<uint8_t>& getData() const;
+ const unique_fd& getFd() const;
+ int32_t getFlags() const;
+ int64_t getTimestamp() const;
+
private:
Entry(const String16& tag, int32_t flags);
Entry(const String16& tag, int32_t flags, int fd);
@@ -80,6 +85,9 @@
friend class DropBoxManager;
};
+ // Get the next entry from the drop box after the specified time.
+ Status getNextEntry(const String16& tag, long msec, Entry* entry);
+
private:
enum {
HAS_BYTE_ARRAY = 8
diff --git a/libs/services/src/os/DropBoxManager.cpp b/libs/services/src/os/DropBoxManager.cpp
index bbb45f0..1c760e8 100644
--- a/libs/services/src/os/DropBoxManager.cpp
+++ b/libs/services/src/os/DropBoxManager.cpp
@@ -143,6 +143,29 @@
return NO_ERROR;
}
+const vector<uint8_t>&
+DropBoxManager::Entry::getData() const
+{
+ return mData;
+}
+
+const unique_fd&
+DropBoxManager::Entry::getFd() const
+{
+ return mFd;
+}
+
+int32_t
+DropBoxManager::Entry::getFlags() const
+{
+ return mFlags;
+}
+
+int64_t
+DropBoxManager::Entry::getTimestamp() const
+{
+ return mTimeMillis;
+}
DropBoxManager::DropBoxManager()
{
@@ -195,5 +218,16 @@
return service->add(entry);
}
+Status
+DropBoxManager::getNextEntry(const String16& tag, long msec, Entry* entry)
+{
+ sp<IDropBoxManagerService> service = interface_cast<IDropBoxManagerService>(
+ defaultServiceManager()->getService(android::String16("dropbox")));
+ if (service == NULL) {
+ return Status::fromExceptionCode(Status::EX_NULL_POINTER, "can't find dropbox service");
+ }
+ return service->getNextEntry(tag, msec, entry);
+}
+
}} // namespace android::os
diff --git a/libs/usb/Android.bp b/libs/usb/Android.bp
new file mode 100644
index 0000000..b8f2904
--- /dev/null
+++ b/libs/usb/Android.bp
@@ -0,0 +1 @@
+subdirs = ["tests/*"]
diff --git a/libs/usb/tests/AccessoryChat/Android.bp b/libs/usb/tests/AccessoryChat/Android.bp
new file mode 100644
index 0000000..4af6274
--- /dev/null
+++ b/libs/usb/tests/AccessoryChat/Android.bp
@@ -0,0 +1 @@
+subdirs = ["accessorychat"]
diff --git a/libs/usb/tests/AccessoryChat/accessorychat/Android.bp b/libs/usb/tests/AccessoryChat/accessorychat/Android.bp
new file mode 100644
index 0000000..5613745
--- /dev/null
+++ b/libs/usb/tests/AccessoryChat/accessorychat/Android.bp
@@ -0,0 +1,30 @@
+cc_binary {
+ name: "accessorychat",
+ host_supported: true,
+
+ srcs: ["accessorychat.c"],
+ cflags: [
+ "-Werror",
+ "-Wno-unused-parameter",
+ ],
+
+ target: {
+ android: {
+ shared_libs: [
+ "libusbhost",
+ "libcutils",
+ ],
+ },
+ host: {
+ static_libs: [
+ "libusbhost",
+ "libcutils",
+ ],
+
+ cflags: ["-O0"],
+ },
+ darwin: {
+ enabled: false,
+ },
+ },
+}
diff --git a/libs/usb/tests/AccessoryChat/accessorychat/Android.mk b/libs/usb/tests/AccessoryChat/accessorychat/Android.mk
deleted file mode 100644
index 51f2111..0000000
--- a/libs/usb/tests/AccessoryChat/accessorychat/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# Build for Linux (desktop) host
-ifeq ($(HOST_OS),linux)
-
-include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := accessorychat.c
-
-LOCAL_MODULE := accessorychat
-
-LOCAL_STATIC_LIBRARIES := libusbhost libcutils
-LOCAL_LDLIBS += -lpthread
-LOCAL_CFLAGS := -g -O0
-
-include $(BUILD_HOST_EXECUTABLE)
-
-endif
-
-# Build for device
-include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := accessorychat.c
-
-LOCAL_MODULE := accessorychat
-
-LOCAL_SHARED_LIBRARIES := libusbhost libcutils
-
-include $(BUILD_EXECUTABLE)
diff --git a/libs/usb/tests/accessorytest/Android.bp b/libs/usb/tests/accessorytest/Android.bp
new file mode 100644
index 0000000..c6340e3
--- /dev/null
+++ b/libs/usb/tests/accessorytest/Android.bp
@@ -0,0 +1,28 @@
+cc_binary_host {
+ name: "accessorytest",
+
+ srcs: [
+ "accessory.c",
+ "audio.c",
+ "hid.c",
+ "usb.c",
+ ],
+
+ static_libs: [
+ "libusbhost",
+ "libcutils",
+ "libtinyalsa",
+ ],
+ cflags: [
+ "-O0",
+ "-Wno-unused-parameter",
+ "-Werror",
+ ],
+
+ target: {
+ darwin: {
+ // Build for Linux host only
+ enabled: false,
+ },
+ },
+}
diff --git a/libs/usb/tests/accessorytest/Android.mk b/libs/usb/tests/accessorytest/Android.mk
deleted file mode 100644
index 6d9a946..0000000
--- a/libs/usb/tests/accessorytest/Android.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# Build for Linux host only
-ifeq ($(HOST_OS),linux)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := accessory.c \
- audio.c \
- hid.c \
- usb.c
-
-LOCAL_C_INCLUDES += external/tinyalsa/include
-
-LOCAL_MODULE := accessorytest
-
-LOCAL_STATIC_LIBRARIES := libusbhost libcutils libtinyalsa
-LOCAL_LDLIBS += -lpthread
-LOCAL_CFLAGS := -g -O0
-
-include $(BUILD_HOST_EXECUTABLE)
-
-endif
diff --git a/libs/usb/tests/accessorytest/accessory.h b/libs/usb/tests/accessorytest/accessory.h
index 55c4550..e86986e 100644
--- a/libs/usb/tests/accessorytest/accessory.h
+++ b/libs/usb/tests/accessorytest/accessory.h
@@ -19,7 +19,7 @@
int init_audio(unsigned int ic, unsigned int id, unsigned int oc, unsigned int od);
void init_hid();
-void usb_run(int enable_accessory);
+void usb_run(uintptr_t enable_accessory);
struct usb_device* usb_wait_for_device();
diff --git a/libs/usb/tests/accessorytest/hid.c b/libs/usb/tests/accessorytest/hid.c
index b70d678..283755d 100644
--- a/libs/usb/tests/accessorytest/hid.c
+++ b/libs/usb/tests/accessorytest/hid.c
@@ -139,7 +139,7 @@
fprintf(stderr, "opened /dev/%s\n", name);
pthread_t th;
- pthread_create(&th, NULL, hid_thread, (void *)fd);
+ pthread_create(&th, NULL, hid_thread, (void *)(uintptr_t)fd);
}
static void* inotify_thread(void* arg)
diff --git a/libs/usb/tests/accessorytest/usb.c b/libs/usb/tests/accessorytest/usb.c
index ac72b35..1a161ad 100644
--- a/libs/usb/tests/accessorytest/usb.c
+++ b/libs/usb/tests/accessorytest/usb.c
@@ -219,7 +219,7 @@
return device;
}
-void usb_run(int enable_accessory) {
+void usb_run(uintptr_t enable_accessory) {
struct usb_host_context* context = usb_host_init();
usb_host_run(context, usb_device_added, usb_device_removed, NULL, (void *)enable_accessory);
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 1575457..186b265 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -3058,7 +3058,11 @@
private final IPlaybackConfigDispatcher mPlayCb = new IPlaybackConfigDispatcher.Stub() {
@Override
- public void dispatchPlaybackConfigChange(List<AudioPlaybackConfiguration> configs) {
+ public void dispatchPlaybackConfigChange(List<AudioPlaybackConfiguration> configs,
+ boolean flush) {
+ if (flush) {
+ Binder.flushPendingCommands();
+ }
synchronized(mPlaybackCallbackLock) {
if (mPlaybackCallbackList != null) {
for (int i=0 ; i < mPlaybackCallbackList.size() ; i++) {
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index 14bc555..8a36f91 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -212,8 +212,10 @@
* @hide
*/
public void init() {
- if (mIPlayerShell != null) {
- mIPlayerShell.monitorDeath();
+ synchronized (this) {
+ if (mIPlayerShell != null) {
+ mIPlayerShell.monitorDeath();
+ }
}
}
@@ -322,7 +324,11 @@
*/
@SystemApi
public PlayerProxy getPlayerProxy() {
- return mIPlayerShell == null ? null : new PlayerProxy(this);
+ final IPlayerShell ips;
+ synchronized (this) {
+ ips = mIPlayerShell;
+ }
+ return ips == null ? null : new PlayerProxy(this);
}
/**
@@ -330,7 +336,11 @@
* @return the IPlayer interface for the associated player
*/
IPlayer getIPlayer() {
- return mIPlayerShell == null ? null : mIPlayerShell.getIPlayer();
+ final IPlayerShell ips;
+ synchronized (this) {
+ ips = mIPlayerShell;
+ }
+ return ips == null ? null : ips.getIPlayer();
}
/**
@@ -351,10 +361,14 @@
* @return true if the state changed, false otherwise
*/
public boolean handleStateEvent(int event) {
- final boolean changed = (mPlayerState != event);
- mPlayerState = event;
- if ((event == PLAYER_STATE_RELEASED) && (mIPlayerShell != null)) {
- mIPlayerShell.release();
+ final boolean changed;
+ synchronized (this) {
+ changed = (mPlayerState != event);
+ mPlayerState = event;
+ if (changed && (event == PLAYER_STATE_RELEASED) && (mIPlayerShell != null)) {
+ mIPlayerShell.release();
+ mIPlayerShell = null;
+ }
}
return changed;
}
@@ -447,7 +461,11 @@
dest.writeInt(mClientPid);
dest.writeInt(mPlayerState);
mPlayerAttr.writeToParcel(dest, 0);
- dest.writeStrongInterface(mIPlayerShell == null ? null : mIPlayerShell.getIPlayer());
+ final IPlayerShell ips;
+ synchronized (this) {
+ ips = mIPlayerShell;
+ }
+ dest.writeStrongInterface(ips == null ? null : ips.getIPlayer());
}
private AudioPlaybackConfiguration(Parcel in) {
@@ -479,14 +497,17 @@
static final class IPlayerShell implements IBinder.DeathRecipient {
final AudioPlaybackConfiguration mMonitor; // never null
- private IPlayer mIPlayer;
+ private volatile IPlayer mIPlayer;
IPlayerShell(@NonNull AudioPlaybackConfiguration monitor, @NonNull IPlayer iplayer) {
mMonitor = monitor;
mIPlayer = iplayer;
}
- void monitorDeath() {
+ synchronized void monitorDeath() {
+ if (mIPlayer == null) {
+ return;
+ }
try {
mIPlayer.asBinder().linkToDeath(this, 0);
} catch (RemoteException e) {
@@ -509,8 +530,13 @@
} else if (DEBUG) { Log.i(TAG, "IPlayerShell binderDied"); }
}
- void release() {
+ synchronized void release() {
+ if (mIPlayer == null) {
+ return;
+ }
mIPlayer.asBinder().unlinkToDeath(this, 0);
+ mIPlayer = null;
+ Binder.flushPendingCommands();
}
}
@@ -532,7 +558,7 @@
case PLAYER_TYPE_HW_SOURCE: return "hardware source";
case PLAYER_TYPE_EXTERNAL_PROXY: return "external proxy";
default:
- return "unknown player type - FIXME";
+ return "unknown player type " + type + " - FIXME";
}
}
diff --git a/media/java/android/media/IPlaybackConfigDispatcher.aidl b/media/java/android/media/IPlaybackConfigDispatcher.aidl
index 3cb5216..150ff26 100644
--- a/media/java/android/media/IPlaybackConfigDispatcher.aidl
+++ b/media/java/android/media/IPlaybackConfigDispatcher.aidl
@@ -25,6 +25,6 @@
*/
oneway interface IPlaybackConfigDispatcher {
- void dispatchPlaybackConfigChange(in List<AudioPlaybackConfiguration> configs);
+ void dispatchPlaybackConfigChange(in List<AudioPlaybackConfiguration> configs, in boolean flush);
}
diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java
index 832b297..91e57ee 100644
--- a/media/java/android/media/MediaMuxer.java
+++ b/media/java/android/media/MediaMuxer.java
@@ -70,7 +70,7 @@
<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
+ doing offline processing. Metadata 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
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index 1291dfb..b8184a0 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -119,7 +119,7 @@
private final ISession mBinder;
private final CallbackStub mCbStub;
- private CallbackMessageHandler mCallback;
+ private CallbackMessageHandler mCallbackHandler;
private VolumeProvider mVolumeProvider;
private PlaybackState mPlaybackState;
@@ -194,16 +194,14 @@
*/
public void setCallback(@Nullable Callback callback, @Nullable Handler handler) {
synchronized (mLock) {
- if (callback == null) {
- if (mCallback != null) {
- mCallback.mCallback.mSession = null;
- }
- mCallback = null;
- return;
- }
- if (mCallback != null) {
+ if (mCallbackHandler != null) {
// We're updating the callback, clear the session from the old one.
- mCallback.mCallback.mSession = null;
+ mCallbackHandler.mCallback.mSession = null;
+ mCallbackHandler.removeCallbacksAndMessages(null);
+ }
+ if (callback == null) {
+ mCallbackHandler = null;
+ return;
}
if (handler == null) {
handler = new Handler();
@@ -211,7 +209,7 @@
callback.mSession = this;
CallbackMessageHandler msgHandler = new CallbackMessageHandler(handler.getLooper(),
callback);
- mCallback = msgHandler;
+ mCallbackHandler = msgHandler;
}
}
@@ -636,8 +634,8 @@
private void postToCallback(int what, Object obj, Bundle extras) {
synchronized (mLock) {
- if (mCallback != null) {
- mCallback.post(what, obj, extras);
+ if (mCallbackHandler != null) {
+ mCallbackHandler.post(what, obj, extras);
}
}
}
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 2d008c7..022198b 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -137,7 +137,7 @@
mLooper->start(
false, // runOnCallingThread
true, // canCallJava
- PRIORITY_FOREGROUND);
+ ANDROID_PRIORITY_VIDEO);
if (nameIsType) {
mCodec = MediaCodec::CreateByType(mLooper, name, encoder, &mInitStatus);
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
index fcb861c..cf5882f 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
@@ -271,7 +271,7 @@
* @see android.hardware.camera2.ICameraDeviceCallbacks#onRepeatingRequestError()
*/
@Override
- public void onRepeatingRequestError(long lastFrameNumber) {
+ public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {
// TODO Auto-generated method stub
}
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
index 476f016..e628b68 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
@@ -161,7 +161,7 @@
* @see android.hardware.camera2.ICameraDeviceCallbacks#onRepeatingRequestError()
*/
@Override
- public void onRepeatingRequestError(long lastFrameNumber) {
+ public void onRepeatingRequestError(long lastFrameNumber, int repeatingRequestId) {
// TODO Auto-generated method stub
}
}
diff --git a/packages/BackupRestoreConfirmation/res/values-bn/strings.xml b/packages/BackupRestoreConfirmation/res/values-bn/strings.xml
index 2b69d5b..afc8c3e 100644
--- a/packages/BackupRestoreConfirmation/res/values-bn/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-bn/strings.xml
@@ -20,13 +20,13 @@
<string name="restore_confirm_title" msgid="5469365809567486602">"সম্পূর্ণ পুনরুদ্ধার"</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="deny_backup_button_label" msgid="6009119115581097708">"ব্যাক-আপ করবেন না"</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="device_encryption_backup_text" msgid="5866590762672844664">"অনুগ্রহ করে নিচে আপানার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷ এছাড়াও ব্যাক-আপ আর্কাইভ এনক্রিপ্ট করতে এটি ব্যবহার করা হবে৷"</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে দয়া করে একটি পাসওয়ার্ড লিখুন৷ যদি এটি খালি রেখে দেওয়া হয় তবে আপনার বর্তমান ব্যাকআপ পাসওয়ার্ডটি ব্যবহার করা হবে:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"আপনি যদি সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে চান তাহলে নিচে একটি পাসওয়ার্ড লিখুন:"</string>
<string name="backup_enc_password_required" msgid="7889652203371654149">"আপনার ডিভাইস এনক্রিপ্ট হয়ে থাকার কারণে আপনার ব্যাকআপকে এনক্রিপ্ট করতে হবে। দয়া করে নিচে একটি পাসওয়ার্ড দিন:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-pa/strings.xml b/packages/BackupRestoreConfirmation/res/values-pa/strings.xml
index dd3b580..72513ba 100644
--- a/packages/BackupRestoreConfirmation/res/values-pa/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-pa/strings.xml
@@ -16,23 +16,23 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"ਪੂਰਾ ਬੈਕਅਪ"</string>
+ <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="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="allow_restore_button_label" msgid="3081286752277127827">"ਮੇਰਾ ਡੈਟਾ ਰੀਸਟੋਰ ਕਰੋ"</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="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="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">"ਕਿਰਪਾ ਕਰਕੇ ਪੂਰਾ ਬੈਕਅਪ ਡੈਟਾ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਦੀ ਵਰਤੋਂ ਲਈ ਇੱਕ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ। ਜੇਕਰ ਇਸਨੂੰ ਖਾਲੀ ਛੱਡਿਆ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਵਰਤਮਾਨ ਬੈਕਅਪ ਪਾਸਵਰਡ ਵਰਤਿਆ ਜਾਏਗਾ:"</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>
- <string name="toast_backup_ended" msgid="3818080769548726424">"ਬੈਕਅਪ ਪੂਰਾ ਹੋਇਆ"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਆਪਣਾ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਸ਼ਨ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ। ਇਹ ਬੈਕਅੱਪ ਪੁਰਾਲੇਖ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਲਈ ਵੀ ਵਰਤਿਆ ਜਾਏਗਾ।"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"ਕਿਰਪਾ ਕਰਕੇ ਪੂਰਾ ਬੈਕਅੱਪ ਡਾਟਾ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਦੀ ਵਰਤੋਂ ਲਈ ਇੱਕ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ। ਜੇਕਰ ਇਸਨੂੰ ਖਾਲੀ ਛੱਡਿਆ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਵਰਤਮਾਨ ਬੈਕਅੱਪ ਪਾਸਵਰਡ ਵਰਤਿਆ ਜਾਏਗਾ:"</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>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ਬੈਕਅੱਪ ਪੂਰਾ ਹੋਇਆ"</string>
<string name="toast_restore_started" msgid="7881679218971277385">"ਰੀਸਟੋਰ ਚਾਲੂ ਹੋ ਰਿਹਾ ਹੈ..."</string>
<string name="toast_restore_ended" msgid="1764041639199696132">"ਰੀਸਟੋਰ ਖ਼ਤਮ ਹੋਇਆ"</string>
<string name="toast_timeout" msgid="5276598587087626877">"ਓਪਰੇਸ਼ਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-te/strings.xml b/packages/BackupRestoreConfirmation/res/values-te/strings.xml
index 52916d8..35e9492 100644
--- a/packages/BackupRestoreConfirmation/res/values-te/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-te/strings.xml
@@ -25,8 +25,8 @@
<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="device_encryption_restore_text" msgid="1570864916855208992">"దయచేసి దిగువ మీ పరికర ఎన్క్రిప్షన్ పాస్వర్డ్ను నమోదు చేయండి."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"దయచేసి దిగువ మీ పరికర ఎన్క్రిప్షన్ పాస్వర్డ్ను నమోదు చేయండి. ఇది బ్యాకప్ ఆర్కైవ్ను ఎన్క్రిప్ట్ చేయడానికి కూడా ఉపయోగించబడుతుంది."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"దయచేసి పూర్తి బ్యాకప్ డేటాను గుప్తీకరించడం కోసం ఉపయోగించడానికి పాస్వర్డ్ను నమోదు చేయండి. దీన్ని ఖాళీగా వదిలిపెడితే, మీ ప్రస్తుత బ్యాకప్ పాస్వర్డ్ ఉపయోగించబడుతుంది:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"మీరు పూర్తి బ్యాకప్ డేటాను గుప్తీకరించాలని కోరుకుంటున్నట్లయితే, దిగువ పాస్వర్డ్ను నమోదు చేయండి:"</string>
<string name="backup_enc_password_required" msgid="7889652203371654149">"మీ పరికరం గుప్తీకరించబడినందున, మీరు మీ బ్యాకప్ని గుప్తీకరించాల్సి ఉంటుంది. దయచేసి దిగువ పాస్వర్డ్ని నమోదు చేయండి:"</string>
diff --git a/packages/CaptivePortalLogin/res/values-bn/strings.xml b/packages/CaptivePortalLogin/res/values-bn/strings.xml
index 886a667..b75d76e 100644
--- a/packages/CaptivePortalLogin/res/values-bn/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-bn/strings.xml
@@ -7,6 +7,6 @@
<string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে সাইন-ইন করুন"</string>
<string name="action_bar_title" msgid="5645564790486983117">"%1$s তে সাইন-ইন করুন"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"আপনি যে নেটওয়ার্কে যোগ দেওয়ার চেষ্টা করছেন তাতে নিরাপত্তার সমস্যা আছে।"</string>
- <string name="ssl_error_example" msgid="647898534624078900">"উদাহরণস্বরূপ, লগইন পৃষ্ঠাটি প্রদর্শিত প্রতিষ্ঠানের অন্তর্গত নাও হতে পারে৷"</string>
+ <string name="ssl_error_example" msgid="647898534624078900">"উদাহরণস্বরূপ, লগ-ইন পৃষ্ঠাটি প্রদর্শিত প্রতিষ্ঠানের অন্তর্গত নাও হতে পারে৷"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"যাই হোক না কেন ব্রাউজারের মাধ্যমে অবিরত রাখুন"</string>
</resources>
diff --git a/packages/CaptivePortalLogin/res/values-hi/strings.xml b/packages/CaptivePortalLogin/res/values-hi/strings.xml
index 1bc6879..1bacc46 100644
--- a/packages/CaptivePortalLogin/res/values-hi/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-hi/strings.xml
@@ -4,8 +4,8 @@
<string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
<string name="action_use_network" msgid="6076184727448466030">"इस नेटवर्क का उपयोग जैसा है वैसा ही करें"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"इस नेटवर्क का उपयोग न करें"</string>
- <string name="action_bar_label" msgid="917235635415966620">"नेटवर्क में प्रवेश करें"</string>
- <string name="action_bar_title" msgid="5645564790486983117">"%1$s में प्रवेश करें"</string>
+ <string name="action_bar_label" msgid="917235635415966620">"नेटवर्क में साइन इन करें"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s में साइन इन करें"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"आप जिस नेटवर्क में शामिल होने का प्रयास कर रहे हैं उसमें सुरक्षा समस्याएं हैं."</string>
<string name="ssl_error_example" msgid="647898534624078900">"उदाहरण के लिए, हो सकता है कि लॉगिन पृष्ठ दिखाए गए संगठन से संबद्ध ना हो."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ब्राउज़र के द्वारा फिर जारी रखें"</string>
diff --git a/packages/CaptivePortalLogin/res/values-pa/strings.xml b/packages/CaptivePortalLogin/res/values-pa/strings.xml
index 11bfc77..03e252f 100644
--- a/packages/CaptivePortalLogin/res/values-pa/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-pa/strings.xml
@@ -4,9 +4,9 @@
<string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
<string name="action_use_network" msgid="6076184727448466030">"ਇਸ ਨੈੱਟਵਰਕ ਨੂੰ ਉਵੇਂ ਵਰਤੋ ਜਿਵੇਂ ਇਹ ਹੈ"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ਇਹ ਨੈੱਟਵਰਕ ਨਾ ਵਰਤੋ"</string>
- <string name="action_bar_label" msgid="917235635415966620">"ਨੈੱਟਵਰਕ ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ"</string>
- <string name="action_bar_title" msgid="5645564790486983117">"%1$s \'ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ"</string>
+ <string name="action_bar_label" msgid="917235635415966620">"ਨੈੱਟਵਰਕ \'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s \'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ਤੁਹਾਡੇ ਦੁਆਰਾ ਸ਼ਾਮਿਲ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੇ ਜਾ ਰਹੇ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ।"</string>
- <string name="ssl_error_example" msgid="647898534624078900">"ਉਦਾਹਰਣ ਵੱਜੋਂ, ਲੌਗਇਨ ਪੰਨਾ ਦਿਖਾਈ ਗਈ ਸੰਸਥਾ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
+ <string name="ssl_error_example" msgid="647898534624078900">"ਉਦਾਹਰਣ ਵੱਜੋਂ, ਲੌਗ-ਇਨ ਪੰਨਾ ਦਿਖਾਈ ਗਈ ਸੰਸਥਾ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ਬ੍ਰਾਊਜ਼ਰ ਰਾਹੀਂ ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ"</string>
</resources>
diff --git a/packages/CarrierDefaultApp/res/values-bn/strings.xml b/packages/CarrierDefaultApp/res/values-bn/strings.xml
index e691839..448c42b 100644
--- a/packages/CarrierDefaultApp/res/values-bn/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-bn/strings.xml
@@ -12,6 +12,6 @@
<string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"মোবাইল ডেটার স্ট্যাটাস"</string>
<string name="action_bar_label" msgid="4290345990334377177">"মোবাইল নেটওয়ার্কে সাইন-ইন করুন"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"আপনি যে নেটওয়ার্কে যোগ দেওয়ার চেষ্টা করছেন সেটিতে নিরাপত্তাজনিত সমস্যা আছে।"</string>
- <string name="ssl_error_example" msgid="6188711843183058764">"যেমন, লগইন পৃষ্ঠাটি যে প্রতিষ্ঠানের পৃষ্ঠা বলে দেখানো আছে, আসলে তা নাও হতে পারে৷"</string>
+ <string name="ssl_error_example" msgid="6188711843183058764">"যেমন, লগ-ইন পৃষ্ঠাটি যে প্রতিষ্ঠানের পৃষ্ঠা বলে দেখানো আছে, আসলে তা নাও হতে পারে৷"</string>
<string name="ssl_error_continue" msgid="1138548463994095584">"যাই হোক, ব্রাউজারের মাধ্যমে চালিয়ে যান"</string>
</resources>
diff --git a/packages/CarrierDefaultApp/res/values-hi/strings.xml b/packages/CarrierDefaultApp/res/values-hi/strings.xml
index 842bb5d..b9d6f42 100644
--- a/packages/CarrierDefaultApp/res/values-hi/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-hi/strings.xml
@@ -6,11 +6,11 @@
<string name="portal_notification_id" msgid="5155057562457079297">"मोबाइल डेटा खत्म हो गया है"</string>
<string name="no_data_notification_id" msgid="668400731803969521">"आपका मोबाइल डेटा बंद कर दिया गया है"</string>
<string name="portal_notification_detail" msgid="2295729385924660881">"%s वेबसाइट पर जाने के लिए टैप करें"</string>
- <string name="no_data_notification_detail" msgid="3112125343857014825">"कृपया अपने सेवा प्रदाता %s से संपर्क करें"</string>
+ <string name="no_data_notification_detail" msgid="3112125343857014825">"कृपया अपने सेवा देने वाले %s से संपर्क करें"</string>
<string name="no_mobile_data_connection_title" msgid="7449525772416200578">"कोई भी मोबाइल डेटा कनेक्शन नहीं है"</string>
<string name="no_mobile_data_connection" msgid="544980465184147010">"%s के ज़रिए डेटा या रोमिंग योजना जोड़ें"</string>
<string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"मोबाइल डेटा की स्थिति"</string>
- <string name="action_bar_label" msgid="4290345990334377177">"मोबाइल नेटवर्क में प्रवेश करें"</string>
+ <string name="action_bar_label" msgid="4290345990334377177">"मोबाइल नेटवर्क में साइन इन करें"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"आप जिस नेटवर्क में शामिल होने की कोशिश कर रहे हैं उसमें सुरक्षा से जुड़ी समस्याएं हैं."</string>
<string name="ssl_error_example" msgid="6188711843183058764">"उदाहरण के लिए, हो सकता है कि लॉगिन पेज दिखाए गए संगठन का ना हो."</string>
<string name="ssl_error_continue" msgid="1138548463994095584">"ब्राउज़र के ज़रिए किसी भी तरह जारी रखें"</string>
diff --git a/packages/CarrierDefaultApp/res/values-pa/strings.xml b/packages/CarrierDefaultApp/res/values-pa/strings.xml
index df052af..f4d4053 100644
--- a/packages/CarrierDefaultApp/res/values-pa/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-pa/strings.xml
@@ -8,10 +8,10 @@
<string name="portal_notification_detail" msgid="2295729385924660881">"%s ਵੈੱਬਸਾਈਟ \'ਤੇ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="no_data_notification_detail" msgid="3112125343857014825">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਸੇਵਾ ਪ੍ਰਦਾਨਕ %s ਨੂੰ ਸੰਪਰਕ ਕਰੋ"</string>
<string name="no_mobile_data_connection_title" msgid="7449525772416200578">"ਕੋਈ ਮੋਬਾਈਲ ਡਾਟਾ ਕਨੈਕਸ਼ਨ ਨਹੀਂ"</string>
- <string name="no_mobile_data_connection" msgid="544980465184147010">"%s ਰਾਹੀਂ ਡੈਟਾ ਜਾਂ ਰੋਮਿੰਗ ਯੋਜਨਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="no_mobile_data_connection" msgid="544980465184147010">"%s ਰਾਹੀਂ ਡਾਟਾ ਜਾਂ ਰੋਮਿੰਗ ਯੋਜਨਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਸਥਿਤੀ"</string>
<string name="action_bar_label" msgid="4290345990334377177">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"ਤੁਸੀਂ ਜਿਸ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹੋ ਉਸ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ।"</string>
- <string name="ssl_error_example" msgid="6188711843183058764">"ਉਦਾਹਰਣ ਵਜੋਂ, ਹੋ ਸਕਦਾ ਹੈ ਲੌਗਇਨ ਪੰਨਾ ਦਿਖਾਈ ਗਈ ਸੰਸਥਾ ਨਾਲ ਸਬੰਧਿਤ ਨਾ ਹੋਵੇ।"</string>
- <string name="ssl_error_continue" msgid="1138548463994095584">"ਫਿਰ ਵੀ ਬ੍ਰਾਊਜ਼ਰ ਰਾਹੀਂ ਜਾਰੀ ਰੱਖੋ"</string>
+ <string name="ssl_error_example" msgid="6188711843183058764">"ਉਦਾਹਰਣ ਵੱਜੋਂ, ਲੌਗ-ਇਨ ਪੰਨਾ ਦਿਖਾਈ ਗਈ ਸੰਸਥਾ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
+ <string name="ssl_error_continue" msgid="1138548463994095584">"ਬ੍ਰਾਊਜ਼ਰ ਰਾਹੀਂ ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ"</string>
</resources>
diff --git a/packages/CarrierDefaultApp/res/values-ta/strings.xml b/packages/CarrierDefaultApp/res/values-ta/strings.xml
index 111f8d1..1a786fa 100644
--- a/packages/CarrierDefaultApp/res/values-ta/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ta/strings.xml
@@ -3,13 +3,13 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
<string name="android_system_label" msgid="2797790869522345065">"தொலைத்தொடர்பு நிறுவனம்"</string>
- <string name="portal_notification_id" msgid="5155057562457079297">"மொபைல் தரவு தீர்ந்துவிட்டது"</string>
- <string name="no_data_notification_id" msgid="668400731803969521">"மொபைல் தரவு முடக்கப்பட்டது"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"மொபைல் டேட்டா தீர்ந்துவிட்டது"</string>
+ <string name="no_data_notification_id" msgid="668400731803969521">"மொபைல் டேட்டா முடக்கப்பட்டது"</string>
<string name="portal_notification_detail" msgid="2295729385924660881">"%s இணையதளத்திற்குச் செல்ல, தட்டவும்"</string>
<string name="no_data_notification_detail" msgid="3112125343857014825">"%s எனும் உங்கள் சேவை வழங்குநரைத் தொடர்புகொள்ளவும்"</string>
- <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"மொபைல் தரவு இணைப்பு இல்லை"</string>
+ <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"மொபைல் டேட்டா இணைப்பு இல்லை"</string>
<string name="no_mobile_data_connection" msgid="544980465184147010">"%s மூலம் தரவு அல்லது ரோமிங் திட்டத்தைச் சேர்க்கவும்"</string>
- <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"மொபைல் தரவின் நிலை"</string>
+ <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"மொபைல் டேட்டாவின் நிலை"</string>
<string name="action_bar_label" msgid="4290345990334377177">"மொபைல் நெட்வொர்க்கில் உள்நுழையவும்"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"நீங்கள் சேர முயலும் நெட்வொர்க்கில் பாதுகாப்புச் சிக்கல்கள் உள்ளன."</string>
<string name="ssl_error_example" msgid="6188711843183058764">"எடுத்துக்காட்டாக, உள்நுழைவுப் பக்கமானது காட்டப்படும் அமைப்பிற்குச் சொந்தமானதாக இல்லாமல் இருக்கலாம்."</string>
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
index a61881f..95ec83d 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
@@ -181,7 +181,8 @@
}
private void done(boolean success) {
- if (DBG) logd(String.format("Result success %b for %s", success, mUrl.toString()));
+ if (DBG) logd(String.format("Result success %b for %s", success,
+ mUrl != null ? mUrl.toString() : "null"));
if (success) {
// Trigger re-evaluation upon success http response code
CarrierActionUtils.applyCarrierAction(
diff --git a/packages/EasterEgg/AndroidManifest.xml b/packages/EasterEgg/AndroidManifest.xml
index 14861c26..172490d 100644
--- a/packages/EasterEgg/AndroidManifest.xml
+++ b/packages/EasterEgg/AndroidManifest.xml
@@ -84,5 +84,16 @@
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
+
+ <!-- FileProvider for sending pictures -->
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="com.android.egg.fileprovider"
+ android:grantUriPermissions="true"
+ android:exported="false">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/filepaths" />
+ </provider>
</application>
</manifest>
diff --git a/packages/EasterEgg/res/drawable/food_cookie.xml b/packages/EasterEgg/res/drawable/food_cookie.xml
new file mode 100644
index 0000000..74dd134
--- /dev/null
+++ b/packages/EasterEgg/res/drawable/food_cookie.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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <group>
+ <path
+ android:fillColor="#55FFFFFF"
+ android:fillType="evenOdd"
+ android:pathData="M5.71 18.29A8.99 8.99 0 0 0 22 13c0-3-1.46-5.65-3.71-7.29A8.99 8.99 0 0 0 2 11c0 3 1.46 5.65 3.71 7.29z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:fillType="evenOdd"
+ android:pathData="M7.25 19.18A8.5 8.5 0 0 0 19.19 7.24 9 9 0 0 1 7.24 19.19z"/>
+ <path
+ android:fillColor="#55FFFFFF"
+ android:pathData="M10.5 3a0.5 0.5 0 1 1 1 0v2.05a0.5 0.5 0 1 1-1 0V3zm3.1 0.42a0.5 0.5 0 0 1 0.93 0.39l-0.8 1.88A0.5 0.5 0 1 1 12.8 5.3l0.8-1.88zm2.7 1.57a0.5 0.5 0 1 1 0.71 0.7l-1.45 1.46a0.5 0.5 0 0 1-0.7-0.71l1.44-1.45zm1.9 2.5a0.5 0.5 0 0 1 0.38 0.92l-1.9 0.77a0.5 0.5 0 0 1-0.37-0.93l1.9-0.77zM19 10.5a0.5 0.5 0 1 1 0 1h-2.05a0.5 0.5 0 0 1 0-1H19zm-0.42 3.1a0.5 0.5 0 0 1-0.39 0.93l-1.88-0.8a0.5 0.5 0 1 1 0.39-0.92l1.88 0.8zm-1.57 2.7a0.5 0.5 0 1 1-0.7 0.71l-1.46-1.45a0.5 0.5 0 0 1 0.71-0.7l1.45 1.44zm-2.5 1.9a0.5 0.5 0 1 1-0.92 0.38l-0.77-1.9a0.5 0.5 0 0 1 0.93-0.37l0.77 1.9zM11.5 19a0.5 0.5 0 1 1-1 0v-2.05a0.5 0.5 0 0 1 1 0V19zm-3.1-0.42a0.5 0.5 0 0 1-0.93-0.39l0.8-1.88A0.5 0.5 0 0 1 9.2 16.7l-0.8 1.88zm-2.7-1.57a0.5 0.5 0 1 1-0.71-0.7l1.45-1.46a0.5 0.5 0 0 1 0.7 0.71L5.7 17.01zm-1.9-2.48a0.5 0.5 0 0 1-0.38-0.92l1.88-0.8a0.5 0.5 0 0 1 0.4 0.92l-1.9 0.8zM3 11.5a0.5 0.5 0 1 1 0-1h2.05a0.5 0.5 0 1 1 0 1H3zm0.42-3.1A0.5 0.5 0 0 1 3.8 7.46l1.88 0.8A0.5 0.5 0 1 1 5.3 9.2L3.42 8.4zm1.57-2.7a0.5 0.5 0 1 1 0.7-0.71l1.46 1.45a0.5 0.5 0 0 1-0.71 0.7L4.99 5.7zm2.5-1.9A0.5 0.5 0 0 1 8.4 3.41l0.77 1.9a0.5 0.5 0 0 1-0.93 0.37L7.48 3.8z"/>
+ </group>
+</vector>
\ No newline at end of file
diff --git a/packages/EasterEgg/res/values/strings.xml b/packages/EasterEgg/res/values/strings.xml
index 8478a43..61e3834 100644
--- a/packages/EasterEgg/res/values/strings.xml
+++ b/packages/EasterEgg/res/values/strings.xml
@@ -17,6 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<string name="app_name" translatable="false">Android Easter Egg</string>
<string name="notification_name" translatable="false">Android Neko</string>
+ <string name="notification_channel_name" translatable="false">New cats</string>
<string name="default_tile_name" translatable="false">\????</string>
<string name="notification_title" translatable="false">A cat is here.</string>
<string name="default_cat_name" translatable="false">Cat #%s</string>
@@ -34,7 +35,7 @@
<item>@drawable/food_bits</item>
<item>@drawable/food_sysuituna</item>
<item>@drawable/food_chicken</item>
- <item>@drawable/food_donut</item>
+ <item>@drawable/food_cookie</item>
</array>
<integer-array name="food_intervals">
<item>0</item>
diff --git a/packages/EasterEgg/res/xml/filepaths.xml b/packages/EasterEgg/res/xml/filepaths.xml
new file mode 100644
index 0000000..2130025
--- /dev/null
+++ b/packages/EasterEgg/res/xml/filepaths.xml
@@ -0,0 +1,19 @@
+<?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.
+-->
+<paths>
+ <external-path name="cats" path="Pictures/Cats" />
+</paths>
\ No newline at end of file
diff --git a/packages/EasterEgg/src/com/android/egg/neko/Cat.java b/packages/EasterEgg/src/com/android/egg/neko/Cat.java
index a4df372..dd1bd07 100644
--- a/packages/EasterEgg/src/com/android/egg/neko/Cat.java
+++ b/packages/EasterEgg/src/com/android/egg/neko/Cat.java
@@ -31,6 +31,8 @@
import com.android.egg.R;
import com.android.internal.logging.MetricsLogger;
+import static com.android.egg.neko.NekoLand.CHAN_ID;
+
public class Cat extends Drawable {
public static final long[] PURR = {0, 40, 20, 40, 20, 40, 20, 40, 20, 40, 20, 40};
@@ -218,6 +220,7 @@
.setContentText(getName())
.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0))
.setAutoCancel(true)
+ .setChannel(CHAN_ID)
.setVibrate(PURR)
.addExtras(extras);
}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java b/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java
index 689e381..d2e37d8 100644
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java
+++ b/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java
@@ -31,6 +31,7 @@
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore.Images;
+import android.support.v4.content.FileProvider;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
@@ -56,6 +57,8 @@
import java.util.List;
public class NekoLand extends Activity implements PrefsListener {
+ public static String CHAN_ID = "EGG";
+
public static boolean DEBUG = false;
public static boolean DEBUG_NOTIFICATIONS = false;
@@ -289,10 +292,13 @@
new String[] {png.toString()},
new String[] {"image/png"},
null);
- Uri uri = Uri.fromFile(png);
+ Log.v("Neko", "cat file: " + png);
+ Uri uri = FileProvider.getUriForFile(this, "com.android.egg.fileprovider", png);
+ Log.v("Neko", "cat uri: " + uri);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.putExtra(Intent.EXTRA_SUBJECT, cat.getName());
+ intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setType("image/png");
startActivity(Intent.createChooser(intent, null));
cat.logShare(this);
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java b/packages/EasterEgg/src/com/android/egg/neko/NekoService.java
index 808ec36..42506e6 100644
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java
+++ b/packages/EasterEgg/src/com/android/egg/neko/NekoService.java
@@ -15,15 +15,15 @@
package com.android.egg.neko;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
import java.util.List;
@@ -33,6 +33,9 @@
import java.util.Random;
+import static com.android.egg.neko.Cat.PURR;
+import static com.android.egg.neko.NekoLand.CHAN_ID;
+
public class NekoService extends JobService {
private static final String TAG = "NekoService";
@@ -40,6 +43,7 @@
public static int JOB_ID = 42;
public static int CAT_NOTIFICATION = 1;
+ public static int DEBUG_NOTIFICATION = 1234;
public static float CAT_CAPTURE_PROB = 1.0f; // generous
@@ -50,6 +54,18 @@
public static float INTERVAL_JITTER_FRAC = 0.25f;
+ private static void setupNotificationChannels(Context context) {
+ NotificationManager noman = context.getSystemService(NotificationManager.class);
+ NotificationChannel eggChan = new NotificationChannel(CHAN_ID,
+ context.getString(R.string.notification_channel_name),
+ NotificationManager.IMPORTANCE_DEFAULT);
+ eggChan.setSound(Uri.EMPTY, Notification.AUDIO_ATTRIBUTES_DEFAULT); // cats are quiet
+ eggChan.setVibrationPattern(PURR); // not totally quiet though
+ eggChan.setBlockableSystem(true); // unlike a real cat, you can push this one off your lap
+ eggChan.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); // cats sit in the window
+ noman.createNotificationChannel(eggChan);
+ }
+
@Override
public boolean onStartJob(JobParameters params) {
Log.v(TAG, "Starting job: " + String.valueOf(params));
@@ -64,8 +80,9 @@
final Notification.Builder builder
= cat.buildNotification(this)
.setContentTitle("DEBUG")
+ .setChannel(NekoLand.CHAN_ID)
.setContentText("Ran job: " + params);
- noman.notify(1, builder.build());
+ noman.notify(DEBUG_NOTIFICATION, builder.build());
}
final PrefState prefs = new PrefState(this);
@@ -111,6 +128,8 @@
}
public static void registerJob(Context context, long intervalMinutes) {
+ setupNotificationChannels(context);
+
JobScheduler jss = context.getSystemService(JobScheduler.class);
jss.cancel(JOB_ID);
long interval = intervalMinutes * MINUTES;
@@ -126,12 +145,13 @@
if (NekoLand.DEBUG_NOTIFICATIONS) {
NotificationManager noman = context.getSystemService(NotificationManager.class);
- noman.notify(500, new Notification.Builder(context)
+ noman.notify(DEBUG_NOTIFICATION, new Notification.Builder(context)
.setSmallIcon(R.drawable.stat_icon)
.setContentTitle(String.format("Job scheduled in %d min", (interval / MINUTES)))
.setContentText(String.valueOf(jobInfo))
.setPriority(Notification.PRIORITY_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
+ .setChannel(NekoLand.CHAN_ID)
.setShowWhen(true)
.build());
}
diff --git a/packages/ExternalStorageProvider/res/values-bn/strings.xml b/packages/ExternalStorageProvider/res/values-bn/strings.xml
index f1cb2f2..264d82a 100644
--- a/packages/ExternalStorageProvider/res/values-bn/strings.xml
+++ b/packages/ExternalStorageProvider/res/values-bn/strings.xml
@@ -16,8 +16,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="7123375275748530234">"বাহ্যিক সঞ্চয়স্থান"</string>
- <string name="storage_description" msgid="8541974407321172792">"স্থানীয় সঞ্চয়স্থান"</string>
- <string name="root_internal_storage" msgid="827844243068584127">"অভ্যন্তরীণ সঞ্চয়স্থান"</string>
+ <string name="app_label" msgid="7123375275748530234">"এক্সটারনাল স্টোরেজ"</string>
+ <string name="storage_description" msgid="8541974407321172792">"স্থানীয় স্টোরেজ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"ইন্টারনাল স্টোরেজ"</string>
<string name="root_documents" msgid="4051252304075469250">"দস্তাবেজগুলি"</string>
</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-gu/strings.xml b/packages/MtpDocumentsProvider/res/values-gu/strings.xml
index 40ec38d..468bd9d 100644
--- a/packages/MtpDocumentsProvider/res/values-gu/strings.xml
+++ b/packages/MtpDocumentsProvider/res/values-gu/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/MtpDocumentsProvider/res/values-pa/strings.xml b/packages/MtpDocumentsProvider/res/values-pa/strings.xml
index 236db6f..7e3b892 100644
--- a/packages/MtpDocumentsProvider/res/values-pa/strings.xml
+++ b/packages/MtpDocumentsProvider/res/values-pa/strings.xml
@@ -21,5 +21,5 @@
<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_locked_device" msgid="7557872102188356147">"ਕੋਈ ਫ਼ਾਈਲਾਂ ਨਹੀਂ ਮਿਲੀਆਂ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਦੂਜਾ ਡੀਵਾਈਸ ਲੌਕ ਹੋਵੇ। ਜੇਕਰ ਇੰਝ ਹੈ, ਤਾਂ ਉਸਨੂੰ ਅਨਲੌਕ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"ਕੋਈ ਫ਼ਾਈਲਾਂ ਨਹੀਂ ਮਿਲੀਆਂ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਦੂਜਾ ਡੀਵਾਈਸ ਲਾਕ ਹੋਵੇ। ਜੇਕਰ ਇੰਝ ਹੈ, ਤਾਂ ਉਸਨੂੰ ਅਣਲਾਕ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
</resources>
diff --git a/packages/MtpDocumentsProvider/tests/AndroidTest.xml b/packages/MtpDocumentsProvider/tests/AndroidTest.xml
index d0b4c6e..940d364 100644
--- a/packages/MtpDocumentsProvider/tests/AndroidTest.xml
+++ b/packages/MtpDocumentsProvider/tests/AndroidTest.xml
@@ -21,7 +21,7 @@
<option name="test-suite-tag" value="apct" />
<option name="test-tag" value="MtpDocumentsProviderTests" />
<test class="com.android.tradefed.testtype.InstrumentationTest" >
- <option name="package" value="com.android.mtp" />
- <option name="runner" value="android.test.InstrumentationTestRunner" />
+ <option name="package" value="com.android.mtp.tests" />
+ <option name="runner" value="com.android.mtp.TestResultInstrumentation" />
</test>
</configuration>
diff --git a/packages/PrintSpooler/res/values-bn/strings.xml b/packages/PrintSpooler/res/values-bn/strings.xml
index 1791358..d2751f1 100644
--- a/packages/PrintSpooler/res/values-bn/strings.xml
+++ b/packages/PrintSpooler/res/values-bn/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="4469836075319831821">"প্রিন্ট স্পোলার"</string>
- <string name="more_options_button" msgid="2243228396432556771">"আরো বিকল্প"</string>
+ <string name="more_options_button" msgid="2243228396432556771">"আরও বিকল্প"</string>
<string name="label_destination" msgid="9132510997381599275">"গন্তব্য"</string>
<string name="label_copies" msgid="3634531042822968308">"প্রতিলিপিগুলি"</string>
<string name="label_copies_summary" msgid="3861966063536529540">"অনুলিপিগুলি:"</string>
@@ -27,7 +27,7 @@
<string name="label_duplex" msgid="5370037254347072243">"দ্বিভুজ"</string>
<string name="label_orientation" msgid="2853142581990496477">"সজ্জা"</string>
<string name="label_pages" msgid="7768589729282182230">"পৃষ্ঠাগুলি"</string>
- <string name="destination_default_text" msgid="5422708056807065710">"একটি মুদ্রক নির্বাচন করুন"</string>
+ <string name="destination_default_text" msgid="5422708056807065710">"একটি মুদ্রক বেছে নিন"</string>
<string name="template_all_pages" msgid="3322235982020148762">"সমস্ত <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
<string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> এর পরিসর"</string>
<string name="pages_range_example" msgid="8558694453556945172">"যেমন, ১—৫,৮,১১—১৩"</string>
@@ -35,7 +35,7 @@
<string name="install_for_print_preview" msgid="6366303997385509332">"প্রিভিউ দেখার জন্য PDF ভিউয়ার ইনস্টল করুন"</string>
<string name="printing_app_crashed" msgid="854477616686566398">"প্রিন্ট অ্যাপ্লিকেশান ক্র্যাশ করছে"</string>
<string name="generating_print_job" msgid="3119608742651698916">"প্রিন্ট কার্য তৈরি করা হচ্ছে"</string>
- <string name="save_as_pdf" msgid="5718454119847596853">"PDF হিসেবে সংরক্ষণ করুন"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"পিডিএফ হিসাবে সেভ করুন"</string>
<string name="all_printers" msgid="5018829726861876202">"সমস্ত মুদ্রক…"</string>
<string name="print_dialog" msgid="32628687461331979">"প্রিন্ট ডায়লগ"</string>
<string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
@@ -44,33 +44,33 @@
<string name="expand_handle" msgid="7282974448109280522">"প্রসারিত করার হ্যান্ডেল"</string>
<string name="collapse_handle" msgid="6886637989442507451">"সঙ্কুচিত করার হ্যান্ডেল"</string>
<string name="print_button" msgid="645164566271246268">"প্রিন্ট করুন"</string>
- <string name="savetopdf_button" msgid="2976186791686924743">"PDF হিসেবে সংরক্ষণ করুন"</string>
+ <string name="savetopdf_button" msgid="2976186791686924743">"পিডিএফ হিসাবে সেভ করুন"</string>
<string name="print_options_expanded" msgid="6944679157471691859">"প্রিন্ট বিকল্প প্রসারিত হয়েছে"</string>
<string name="print_options_collapsed" msgid="7455930445670414332">"প্রিন্ট বিকল্প সংকুচিত হয়েছে"</string>
- <string name="search" msgid="5421724265322228497">"অনুসন্ধান করুন"</string>
+ <string name="search" msgid="5421724265322228497">"খুঁজুন"</string>
<string name="all_printers_label" msgid="3178848870161526399">"সমস্ত মুদ্রক"</string>
<string name="add_print_service_label" msgid="5356702546188981940">"পরিষেবা যোগ করুন"</string>
<string name="print_search_box_shown_utterance" msgid="7967404953901376090">"অনুসন্ধান বাক্স দেখানো হচ্ছে"</string>
<string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"অনুসন্ধান বাক্স লুকানো রয়েছে"</string>
<string name="print_add_printer" msgid="1088656468360653455">"মুদ্রক যোগ করুন"</string>
- <string name="print_select_printer" msgid="7388760939873368698">"মুদ্রক নির্বাচন করুন"</string>
+ <string name="print_select_printer" msgid="7388760939873368698">"মুদ্রক বেছে নিন"</string>
<string name="print_forget_printer" msgid="5035287497291910766">"মুদ্রকটিকে সরিয়ে দিন"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
<item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g>টি মুদ্রক খুঁজে পাওয়া গেছে</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>টি মুদ্রক খুঁজে পাওয়া গেছে</item>
</plurals>
<string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
- <string name="printer_info_desc" msgid="7181988788991581654">"এই মুদ্রকটির বিষয়ে আরো তথ্য"</string>
+ <string name="printer_info_desc" msgid="7181988788991581654">"এই মুদ্রকটির বিষয়ে আরও তথ্য"</string>
<string name="notification_channel_progress" msgid="872788690775721436">"এগুলি প্রিন্ট হচ্ছে"</string>
<string name="notification_channel_failure" msgid="9042250774797916414">"এগুলি প্রিন্ট করা যায়নি"</string>
<string name="could_not_create_file" msgid="3425025039427448443">"ফাইল তৈরি করা গেল না"</string>
- <string name="print_services_disabled_toast" msgid="9089060734685174685">"কিছু মুদ্রণ পরিষেবা অক্ষম করা আছে"</string>
+ <string name="print_services_disabled_toast" msgid="9089060734685174685">"কিছু প্রিন্ট পরিষেবা অক্ষম করা আছে"</string>
<string name="print_searching_for_printers" msgid="6550424555079932867">"মুদ্রকগুলি অনুসন্ধান করা হচ্ছে"</string>
<string name="print_no_print_services" msgid="8561247706423327966">"প্রিন্ট পরিষেবা সক্ষম নেই"</string>
<string name="print_no_printers" msgid="4869403323900054866">"কোনো মুদ্রক পাওয়া যায়নি"</string>
<string name="cannot_add_printer" msgid="7840348733668023106">"মুদ্রকগুলি যোগ করা যাবে না"</string>
- <string name="select_to_add_printers" msgid="3800709038689830974">"মুদ্রক যোগ করতে নির্বাচন করুন"</string>
- <string name="enable_print_service" msgid="3482815747043533842">"সক্ষম করতে নির্বাচন করুন"</string>
+ <string name="select_to_add_printers" msgid="3800709038689830974">"মুদ্রক যোগ করতে বেছে নিন"</string>
+ <string name="enable_print_service" msgid="3482815747043533842">"সক্ষম করতে বেছে নিন"</string>
<string name="enabled_services_title" msgid="7036986099096582296">"সক্ষম করা পরিষেবাগুলি"</string>
<string name="recommended_services_title" msgid="3799434882937956924">"প্রস্তাবিত পরিষেবাগুলি"</string>
<string name="disabled_services_title" msgid="7313253167968363211">"অক্ষম করা পরিষেবাগুলি"</string>
@@ -84,7 +84,7 @@
<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>
+ <string name="restart" msgid="2472034227037808749">"রিস্টার্ট করুন"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"মুদ্রকে কোনো সংযোগ নেই"</string>
<string name="reason_unknown" msgid="5507940196503246139">"অজানা"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> ব্যবহার করবেন?"</string>
@@ -100,7 +100,7 @@
</string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"পোর্ট্রেট"</item>
- <item msgid="3199660090246166812">"ভূদৃশ্য"</item>
+ <item msgid="3199660090246166812">"ল্যান্ডস্কেপ"</item>
</string-array>
<string name="print_write_error_message" msgid="5787642615179572543">"ফাইলে লেখা যায়নি"</string>
<string name="print_error_default_message" msgid="8602678405502922346">"দুঃখিত, এটি কাজ করেনি৷ আবার চেষ্টা করুন৷"</string>
diff --git a/packages/PrintSpooler/res/values-gu/strings.xml b/packages/PrintSpooler/res/values-gu/strings.xml
index 7ad8d57..4d035da 100644
--- a/packages/PrintSpooler/res/values-gu/strings.xml
+++ b/packages/PrintSpooler/res/values-gu/strings.xml
@@ -84,7 +84,7 @@
<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>
+ <string name="restart" msgid="2472034227037808749">"રિસ્ટાર્ટ કરો"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"પ્રિન્ટર માટે કોઈ કનેક્શન નથી"</string>
<string name="reason_unknown" msgid="5507940196503246139">"અજાણ્યું"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> નો ઉપયોગ કરીએ?"</string>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index 454834c..37777d2 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -32,8 +32,8 @@
<string name="template_page_range" msgid="428638530038286328">"पेज संख्या <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
<string name="pages_range_example" msgid="8558694453556945172">"उदाहरण 1—5,8,11—13"</string>
<string name="print_preview" msgid="8010217796057763343">"प्रिंट की झलक"</string>
- <string name="install_for_print_preview" msgid="6366303997385509332">"झलक के लिए पीडीएफ़ व्यूअर इंस्टॉल करें"</string>
- <string name="printing_app_crashed" msgid="854477616686566398">"प्रिंटिंग ऐप्लिकेशन क्रैश हो गया"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"झलक देखने के लिए PDF व्यूअर इंस्टॉल करें"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"प्रिंटिंग ऐप बंद हो गया"</string>
<string name="generating_print_job" msgid="3119608742651698916">"प्रिंट कार्य जनरेट हो रहा है"</string>
<string name="save_as_pdf" msgid="5718454119847596853">"पीडीएफ़ के तौर पर सेव करें"</string>
<string name="all_printers" msgid="5018829726861876202">"सभी प्रिंटर..."</string>
@@ -41,8 +41,8 @@
<string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="PAGE_COUNT">%2$d</xliff:g> में से पेज <xliff:g id="CURRENT_PAGE">%1$d</xliff:g>"</string>
<string name="summary_template" msgid="8899734908625669193">"सारांश, प्रतियां <xliff:g id="COPIES">%1$s</xliff:g>, काग़ज़ का आकार <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
- <string name="expand_handle" msgid="7282974448109280522">"हैंडल विस्तृत करें"</string>
- <string name="collapse_handle" msgid="6886637989442507451">"हैंडल संक्षिप्त करें"</string>
+ <string name="expand_handle" msgid="7282974448109280522">"हैंडल का विस्तार करें"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"हैंडल को छोटा करें"</string>
<string name="print_button" msgid="645164566271246268">"प्रिंट करें"</string>
<string name="savetopdf_button" msgid="2976186791686924743">"पीडीएफ़ में सेव करें"</string>
<string name="print_options_expanded" msgid="6944679157471691859">"प्रिंट विकल्पों को विस्तृत किया गया"</string>
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index 6540ca1..22ef612 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -88,7 +88,7 @@
<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>
+ <string name="restart" msgid="2472034227037808749">"הפעלה מחדש"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"אין חיבור למדפסת"</string>
<string name="reason_unknown" msgid="5507940196503246139">"לא ידוע"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"האם להשתמש ב-<xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
diff --git a/packages/PrintSpooler/res/values-my/strings.xml b/packages/PrintSpooler/res/values-my/strings.xml
index c581e59..7c7b03e6 100644
--- a/packages/PrintSpooler/res/values-my/strings.xml
+++ b/packages/PrintSpooler/res/values-my/strings.xml
@@ -49,7 +49,7 @@
<string name="print_options_collapsed" msgid="7455930445670414332">"ပရင့်ထုတ် ရွေးစရာများကို ခေါက်ထား"</string>
<string name="search" msgid="5421724265322228497">"ရှာဖွေခြင်း"</string>
<string name="all_printers_label" msgid="3178848870161526399">"စာထုတ်စက် အားလုံး"</string>
- <string name="add_print_service_label" msgid="5356702546188981940">"ဆားဗစ် အသစ်ထည့်ရန်"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"ဝန်ဆောင်မှုထည့်ရန်"</string>
<string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ရှာဖွေစရာ နေရာ မြင်တွေ့ရပါသည်"</string>
<string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ရှာဖွေရန် နေရာ ပျောက်ကွယ်နေပါသည်"</string>
<string name="print_add_printer" msgid="1088656468360653455">"စာထုတ်စက်ကို ထည့်ပါ"</string>
diff --git a/packages/PrintSpooler/res/values-ne/strings.xml b/packages/PrintSpooler/res/values-ne/strings.xml
index c5f5978..75991f5 100644
--- a/packages/PrintSpooler/res/values-ne/strings.xml
+++ b/packages/PrintSpooler/res/values-ne/strings.xml
@@ -84,7 +84,7 @@
<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>
+ <string name="restart" msgid="2472034227037808749">"पुनः सुरू गर्नुहोस्"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"प्रिन्टरमा कुनै जडान छैन"</string>
<string name="reason_unknown" msgid="5507940196503246139">"अज्ञात"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> प्रयोग गर्ने हो?"</string>
diff --git a/packages/PrintSpooler/res/values-pa/strings.xml b/packages/PrintSpooler/res/values-pa/strings.xml
index d7885ad..634ce90 100644
--- a/packages/PrintSpooler/res/values-pa/strings.xml
+++ b/packages/PrintSpooler/res/values-pa/strings.xml
@@ -32,10 +32,10 @@
<string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> ਦੀ ਰੇਂਜ"</string>
<string name="pages_range_example" msgid="8558694453556945172">"ਉਦਾਹਰਨ ਲਈ 1—5,8,11—13"</string>
<string name="print_preview" msgid="8010217796057763343">"ਪ੍ਰਿੰਟ ਪ੍ਰੀਵਿਊ"</string>
- <string name="install_for_print_preview" msgid="6366303997385509332">"ਪ੍ਰੀਵਿਊ ਲਈ PDF ਵਿਊਅਰ ਇੰਸਟੌਲ ਕਰੋ"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ਪੂਰਵ-ਝਲਕ ਲਈ PDF ਵਿਊਅਰ ਸਥਾਪਤ ਕਰੋ"</string>
<string name="printing_app_crashed" msgid="854477616686566398">"ਪ੍ਰਿੰਟਿੰਗ ਐਪ ਕ੍ਰੈਸ਼ ਹੋਇਆ"</string>
<string name="generating_print_job" msgid="3119608742651698916">"ਪ੍ਰਿੰਟ ਜੌਬ ਬਣਾ ਰਿਹਾ ਹੈ"</string>
- <string name="save_as_pdf" msgid="5718454119847596853">"PDF ਦੇ ਤੌਰ ਤੇ ਰੱਖਿਅਤ ਕਰੋ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF ਦੇ ਤੌਰ \'ਤੇ ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="all_printers" msgid="5018829726861876202">"ਸਾਰੇ ਪ੍ਰਿੰਟਰ…"</string>
<string name="print_dialog" msgid="32628687461331979">"ਪ੍ਰਿੰਟ ਡਾਇਲੌਗ"</string>
<string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
@@ -43,16 +43,16 @@
<string name="summary_template" msgid="8899734908625669193">"ਸਾਰ, ਕਾਪੀਆਂ <xliff:g id="COPIES">%1$s</xliff:g>, ਪੇਪਰ ਦਾ ਆਕਾਰ <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
<string name="expand_handle" msgid="7282974448109280522">"ਹੈਂਡਲ ਨੂੰ ਵਿਸਤਾਰ ਦਿਓ"</string>
<string name="collapse_handle" msgid="6886637989442507451">"ਇਕੱਠਾ ਹੋਣ ਦੀ ਸੰਭਾਲ"</string>
- <string name="print_button" msgid="645164566271246268">"ਪ੍ਰਿੰਟ"</string>
+ <string name="print_button" msgid="645164566271246268">"ਪ੍ਰਿੰਟ ਕਰੋ"</string>
<string name="savetopdf_button" msgid="2976186791686924743">"PDF ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="print_options_expanded" msgid="6944679157471691859">"ਪ੍ਰਿੰਟ ਚੋਣਾਂ ਦਾ ਵਿਸਤਾਰ ਕੀਤਾ"</string>
<string name="print_options_collapsed" msgid="7455930445670414332">"ਪ੍ਰਿੰਟ ਚੋਣਾਂ ਇਕੱਠਾ ਹੋਈਆਂ"</string>
<string name="search" msgid="5421724265322228497">"ਖੋਜੋ"</string>
<string name="all_printers_label" msgid="3178848870161526399">"ਸਾਰੇ ਪ੍ਰਿੰਟਰ"</string>
- <string name="add_print_service_label" msgid="5356702546188981940">"ਸੇਵਾ ਜੋੜੋ"</string>
- <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ਖੋਜ ਬੌਕਸ ਦਿਖਾਇਆ"</string>
- <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ਖੋਜ ਬੌਕਸ ਲੁਕਾਇਆ"</string>
- <string name="print_add_printer" msgid="1088656468360653455">"ਪ੍ਰਿੰਟਰ ਜੋੜੋ"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"ਸੇਵਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ਖੋਜ ਬਾਕਸ ਦਿਖਾਇਆ"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ਖੋਜ ਬਾਕਸ ਲੁਕਾਇਆ"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"ਪ੍ਰਿੰਟਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="print_select_printer" msgid="7388760939873368698">"ਪ੍ਰਿੰਟਰ ਚੁਣੋ"</string>
<string name="print_forget_printer" msgid="5035287497291910766">"ਪ੍ਰਿੰਟਰ ਭੁੱਲੋ"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
@@ -61,16 +61,16 @@
</plurals>
<string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="printer_info_desc" msgid="7181988788991581654">"ਇਸ ਪ੍ਰਿੰਟਰ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ"</string>
- <string name="notification_channel_progress" msgid="872788690775721436">"ਚੱਲ ਰਹੇ ਪ੍ਰਿੰਟ ਕਾਰਜ"</string>
- <string name="notification_channel_failure" msgid="9042250774797916414">"ਅਸਫਲ ਰਹੇ ਪ੍ਰਿੰਟ ਕਾਰਜ"</string>
+ <string name="notification_channel_progress" msgid="872788690775721436">"ਚੱਲ ਰਹੇ ਪ੍ਰਿੰਟ ਜੌਬ"</string>
+ <string name="notification_channel_failure" msgid="9042250774797916414">"ਅਸਫਲ ਰਹੇ ਪ੍ਰਿੰਟ ਜੌਬ"</string>
<string name="could_not_create_file" msgid="3425025039427448443">"ਫ਼ਾਈਲ ਨੂੰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"</string>
- <string name="print_services_disabled_toast" msgid="9089060734685174685">"ਕੁਝ ਪ੍ਰਿੰਟ ਸੇਵਾਵਾਂ ਅਯੋਗ ਬਣਾਈਆਂ ਗਈਆਂ ਹਨ"</string>
+ <string name="print_services_disabled_toast" msgid="9089060734685174685">"ਕੁਝ ਪ੍ਰਿੰਟ ਸੇਵਾਵਾਂ ਬੰਦ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ"</string>
<string name="print_searching_for_printers" msgid="6550424555079932867">"ਪ੍ਰਿੰਟਰ ਖੋਜ ਰਿਹਾ ਹੈ"</string>
- <string name="print_no_print_services" msgid="8561247706423327966">"ਪ੍ਰਿੰਟ ਸੇਵਾਵਾਂ ਯੋਗ ਨਹੀਂ ਬਣਾਈਆਂ ਗਈਆਂ"</string>
+ <string name="print_no_print_services" msgid="8561247706423327966">"ਪ੍ਰਿੰਟ ਸੇਵਾਵਾਂ ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕੀਤਾ ਗਿਆ"</string>
<string name="print_no_printers" msgid="4869403323900054866">"ਕੋਈ ਪ੍ਰਿੰਟਰ ਨਹੀਂ ਮਿਲੇ"</string>
<string name="cannot_add_printer" msgid="7840348733668023106">"ਪ੍ਰਿੰਟਰ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
<string name="select_to_add_printers" msgid="3800709038689830974">"ਪ੍ਰਿੰਟਰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਚੁਣੋ"</string>
- <string name="enable_print_service" msgid="3482815747043533842">"ਯੋਗ ਬਣਾਉਣ ਲਈ ਚੁਣੋ"</string>
+ <string name="enable_print_service" msgid="3482815747043533842">"ਚਾਲੂ ਕਰਨ ਲਈ ਚੁਣੋ"</string>
<string name="enabled_services_title" msgid="7036986099096582296">"ਯੋਗ ਬਣਾਈਆਂ ਗਈਆਂ ਸੇਵਾਵਾਂ"</string>
<string name="recommended_services_title" msgid="3799434882937956924">"ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀਆਂ ਸੇਵਾਵਾਂ"</string>
<string name="disabled_services_title" msgid="7313253167968363211">"ਅਯੋਗ ਬਣਾਈਆਂ ਗਈਆਂ ਸੇਵਾਵਾਂ"</string>
@@ -99,13 +99,13 @@
<item msgid="79513688117503758">"ਛੋਟਾ ਕਿਨਾਰਾ"</item>
</string-array>
<string-array name="orientation_labels">
- <item msgid="4061931020926489228">"ਤਸਵੀਰ"</item>
+ <item msgid="4061931020926489228">"ਪੋਰਟਰੇਟ"</item>
<item msgid="3199660090246166812">"ਲੈਂਡਸਕੇਪ"</item>
</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_printer_unavailable" msgid="8985614415253203381">"ਇਹ ਪ੍ਰਿੰਟਰ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
- <string name="print_cannot_load_page" msgid="6179560924492912009">"ਝਲਕ ਨਹੀਂ ਵਿਖਾਈ ਜਾ ਸਕਦੀ"</string>
+ <string name="print_cannot_load_page" msgid="6179560924492912009">"ਪੂਰਵ-ਝਲਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="print_preparing_preview" msgid="3939930735671364712">"ਪ੍ਰੀਵਿਊ ਦੀ ਤਿਆਰੀ ਕਰ ਰਿਹਾ ਹੈ…"</string>
</resources>
diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/BasePrintTest.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/BasePrintTest.java
index 4de3570..9a7f362 100644
--- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/BasePrintTest.java
+++ b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/BasePrintTest.java
@@ -16,33 +16,8 @@
package com.android.printspooler.outofprocess.tests;
-import android.annotation.NonNull;
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.CancellationSignal;
-import android.os.ParcelFileDescriptor;
-import android.print.PrintAttributes;
-import android.print.PrintDocumentAdapter;
-import android.print.PrintManager;
-import android.print.PrinterId;
-import com.android.printspooler.outofprocess.tests.mockservice.PrintServiceCallbacks;
-import com.android.printspooler.outofprocess.tests.mockservice.PrinterDiscoverySessionCallbacks;
-import com.android.printspooler.outofprocess.tests.mockservice.StubbablePrinterDiscoverySession;
-import android.printservice.CustomPrinterIconCallback;
-import android.printservice.PrintJob;
-import android.printservice.PrintService;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.uiautomator.UiDevice;
-import org.junit.After;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.mockito.stubbing.Answer;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.List;
+import static android.content.pm.PackageManager.GET_META_DATA;
+import static android.content.pm.PackageManager.GET_SERVICES;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
@@ -52,6 +27,42 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.annotation.NonNull;
+import android.app.Instrumentation;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.CancellationSignal;
+import android.os.ParcelFileDescriptor;
+import android.print.PrintAttributes;
+import android.print.PrintDocumentAdapter;
+import android.print.PrintManager;
+import android.print.PrinterId;
+import android.printservice.CustomPrinterIconCallback;
+import android.printservice.PrintJob;
+import android.printservice.PrintService;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.uiautomator.UiDevice;
+
+import com.android.printspooler.outofprocess.tests.mockservice.PrintServiceCallbacks;
+import com.android.printspooler.outofprocess.tests.mockservice.PrinterDiscoverySessionCallbacks;
+import com.android.printspooler.outofprocess.tests.mockservice.StubbablePrinterDiscoverySession;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.mockito.stubbing.Answer;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.List;
+
/**
* This is the base class for print tests.
*/
@@ -59,6 +70,7 @@
protected static final long OPERATION_TIMEOUT = 30000;
private static final String PM_CLEAR_SUCCESS_OUTPUT = "Success";
private static final int CURRENT_USER_ID = -2; // Mirrors UserHandle.USER_CURRENT
+ private static String sDisabledPrintServicesBefore;
private android.print.PrintJob mPrintJob;
@@ -93,12 +105,26 @@
// Make sure we start with a clean slate.
clearPrintSpoolerData();
+ disablePrintServices(sInstrumentation.getTargetContext().getPackageName());
+
// Workaround for dexmaker bug: https://code.google.com/p/dexmaker/issues/detail?id=2
// Dexmaker is used by mockito.
System.setProperty("dexmaker.dexcache", getInstrumentation()
.getTargetContext().getCacheDir().getPath());
}
+ @AfterClass
+ public static void tearDownClass() throws Exception {
+ enablePrintServices();
+ }
+
+ @Before
+ public void unlockScreen() throws Exception {
+ // Unlock screen.
+ runShellCommand("input keyevent KEYCODE_WAKEUP");
+ runShellCommand("wm dismiss-keyguard");
+ }
+
@After
public void exitActivities() throws Exception {
// Exit print spooler
@@ -122,9 +148,9 @@
return mActivityRule.getActivity();
}
- public static String runShellCommand(Instrumentation instrumentation, String cmd)
+ public static String runShellCommand(String cmd)
throws IOException {
- ParcelFileDescriptor pfd = instrumentation.getUiAutomation().executeShellCommand(cmd);
+ ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation().executeShellCommand(cmd);
byte[] buf = new byte[512];
int bytesRead;
FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
@@ -137,11 +163,49 @@
}
protected static void clearPrintSpoolerData() throws Exception {
- assertTrue("failed to clear print spooler data",
- runShellCommand(getInstrumentation(), String.format(
- "pm clear --user %d %s", CURRENT_USER_ID,
- PrintManager.PRINT_SPOOLER_PACKAGE_NAME))
- .contains(PM_CLEAR_SUCCESS_OUTPUT));
+ assertTrue("failed to clear print spooler data", runShellCommand(
+ String.format("pm clear --user %d %s", CURRENT_USER_ID,
+ PrintManager.PRINT_SPOOLER_PACKAGE_NAME)).contains(
+ PM_CLEAR_SUCCESS_OUTPUT));
+ }
+
+ /**
+ * Disable all print services beside the ones we want to leave enabled.
+ *
+ * @param packageToLeaveEnabled The package of the services to leave enabled.
+ */
+ private static void disablePrintServices(String packageToLeaveEnabled) throws IOException {
+ Instrumentation instrumentation = getInstrumentation();
+
+ sDisabledPrintServicesBefore = runShellCommand(
+ "settings get secure " + Settings.Secure.DISABLED_PRINT_SERVICES);
+
+ Intent printServiceIntent = new Intent(android.printservice.PrintService.SERVICE_INTERFACE);
+ List<ResolveInfo> installedServices = instrumentation.getContext().getPackageManager()
+ .queryIntentServices(printServiceIntent, GET_SERVICES | GET_META_DATA);
+
+ StringBuilder builder = new StringBuilder();
+ for (ResolveInfo service : installedServices) {
+ if (packageToLeaveEnabled.equals(service.serviceInfo.packageName)) {
+ continue;
+ }
+ if (builder.length() > 0) {
+ builder.append(":");
+ }
+ builder.append(new ComponentName(service.serviceInfo.packageName,
+ service.serviceInfo.name).flattenToString());
+ }
+
+ runShellCommand(
+ "settings put secure " + Settings.Secure.DISABLED_PRINT_SERVICES + " " + builder);
+ }
+
+ /**
+ * Revert {@link #disablePrintServices(String)}
+ */
+ private static void enablePrintServices() throws IOException {
+ runShellCommand("settings put secure " + Settings.Secure.DISABLED_PRINT_SERVICES + " "
+ + sDisabledPrintServicesBefore);
}
@SuppressWarnings("unchecked")
diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java
index 184e559..78a0cac 100644
--- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java
+++ b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java
@@ -16,6 +16,8 @@
package com.android.printspooler.outofprocess.tests;
+import static org.junit.Assert.assertNotNull;
+
import android.graphics.pdf.PdfDocument;
import android.os.Bundle;
import android.os.CancellationSignal;
@@ -27,10 +29,6 @@
import android.print.PrinterCapabilitiesInfo;
import android.print.PrinterId;
import android.print.PrinterInfo;
-import com.android.printspooler.outofprocess.tests.mockservice.AddPrintersActivity;
-import com.android.printspooler.outofprocess.tests.mockservice.MockPrintService;
-import com.android.printspooler.outofprocess.tests.mockservice.PrinterDiscoverySessionCallbacks;
-import com.android.printspooler.outofprocess.tests.mockservice.StubbablePrinterDiscoverySession;
import android.print.pdf.PrintedPdfDocument;
import android.support.test.filters.LargeTest;
import android.support.test.uiautomator.By;
@@ -39,13 +37,16 @@
import android.support.test.uiautomator.UiSelector;
import android.support.test.uiautomator.Until;
import android.util.Log;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
+
+import com.android.printspooler.outofprocess.tests.mockservice.AddPrintersActivity;
+import com.android.printspooler.outofprocess.tests.mockservice.MockPrintService;
+import com.android.printspooler.outofprocess.tests.mockservice.PrinterDiscoverySessionCallbacks;
+import com.android.printspooler.outofprocess.tests.mockservice.StubbablePrinterDiscoverySession;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
-import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
@@ -54,8 +55,6 @@
import java.util.concurrent.TimeoutException;
import java.util.function.Supplier;
-import static org.junit.Assert.assertNotNull;
-
/**
* Tests for the basic printing workflows
*/
@@ -101,74 +100,6 @@
}
}
- /**
- * Executes a shell command using shell user identity, and return the standard output in
- * string.
- *
- * @param cmd the command to run
- *
- * @return the standard output of the command
- */
- private static String runShellCommand(String cmd) throws IOException {
- try (FileInputStream is = new ParcelFileDescriptor.AutoCloseInputStream(
- getInstrumentation().getUiAutomation().executeShellCommand(cmd))) {
- byte[] buf = new byte[64];
- int bytesRead;
-
- StringBuilder stdout = new StringBuilder();
- while ((bytesRead = is.read(buf)) != -1) {
- stdout.append(new String(buf, 0, bytesRead));
- }
-
- return stdout.toString();
- }
- }
-
- @BeforeClass
- public static void disableAnimations() throws Exception {
- try {
- sWindowAnimationScaleBefore = Float.parseFloat(runShellCommand(
- "settings get global window_animation_scale"));
-
- runShellCommand("settings put global window_animation_scale 0");
- } catch (NumberFormatException e) {
- sWindowAnimationScaleBefore = Float.NaN;
- }
- try {
- sTransitionAnimationScaleBefore = Float.parseFloat(runShellCommand(
- "settings get global transition_animation_scale"));
-
- runShellCommand("settings put global transition_animation_scale 0");
- } catch (NumberFormatException e) {
- sTransitionAnimationScaleBefore = Float.NaN;
- }
- try {
- sAnimatiorDurationScaleBefore = Float.parseFloat(runShellCommand(
- "settings get global animator_duration_scale"));
-
- runShellCommand("settings put global animator_duration_scale 0");
- } catch (NumberFormatException e) {
- sAnimatiorDurationScaleBefore = Float.NaN;
- }
- }
-
- @AfterClass
- public static void enableAnimations() throws Exception {
- if (sWindowAnimationScaleBefore != Float.NaN) {
- runShellCommand(
- "settings put global window_animation_scale " + sWindowAnimationScaleBefore);
- }
- if (sTransitionAnimationScaleBefore != Float.NaN) {
- runShellCommand(
- "settings put global transition_animation_scale " +
- sTransitionAnimationScaleBefore);
- }
- if (sAnimatiorDurationScaleBefore != Float.NaN) {
- runShellCommand(
- "settings put global animator_duration_scale " + sAnimatiorDurationScaleBefore);
- }
- }
-
/** Add a printer with a given name and supported mediasize to a session */
private void addPrinter(StubbablePrinterDiscoverySession session,
String name, PrintAttributes.MediaSize mediaSize) {
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index 3c76395..771abe6 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (verstek)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Gebruik stelselkeuse (verstek)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-oudio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-oudio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Aktiveer opsionele kodekke"</item>
+ <item msgid="3304843301758635896">"Deaktiveer opsionele kodekke"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Gebruik stelselkeuse (verstek)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-oudio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-oudio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Aktiveer opsionele kodekke"</item>
+ <item msgid="741805482892725657">"Deaktiveer opsionele kodekke"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Gebruik stelselkeuse (verstek)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 2cb374a..0e0d9ae 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Laat altyd Wi-Fi-swerfskanderings toe"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobiele data is altyd aktief"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardewareversnelling vir verbinding"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Wys Bluetooth-toestelle sonder name"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Deaktiveer absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Aktiveer inband-luitoon"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-weergawe"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Hierdie instellings is bedoel net vir ontwikkelinggebruik. Dit kan jou toestel en die programme daarop breek of vreemde dinge laat doen."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifieer programme oor USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontroleer programme wat via ADB/ADT geïnstalleer is vir skadelike gedrag."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-toestelle sonder name (net MAC-adresse) sal gewys word"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Deaktiveer die Bluetooth-kenmerk vir absolute volume indien daar volumeprobleme met afgeleë toestelle is, soos onaanvaarbare harde klank of geen beheer nie."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Laat toe dat luitone op die foon op Bluetooth-kopstukke gespeel word"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Plaaslike terminaal"</string>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 49a0123..a5fb9cf 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ነባሪ)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"የስርዓቱን ምርጫ (ነባሪ) ተጠቀም"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ኦዲዮ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ኦዲዮ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"አማራጭ ኮዴኮችን አንቃ"</item>
+ <item msgid="3304843301758635896">"አማራጭ ኮዴኮችን አሰናክል"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"የስርዓቱን ምርጫ (ነባሪ) ተጠቀም"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ኦዲዮ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ኦዲዮ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"አማራጭ ኮዴኮችን አንቃ"</item>
+ <item msgid="741805482892725657">"አማራጭ ኮዴኮችን አሰናክል"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"የስርዓቱን ምርጫ (ነባሪ) ተጠቀም"</item>
<item msgid="8895532488906185219">"44.1 ኪኸ"</item>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index c57f9b0..017722f 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ሁልጊዜ የWi‑Fi ማንቀሳቀስ ቅኝቶችን ይፍቀዱ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"የተንቀሳቃሽ ስልክ ውሂብ ሁልጊዜ ገቢር ነው"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"የሃርድዌር ማቀላጠፊያን በማስተሳሰር ላይ"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"የብሉቱዝ መሣሪያዎችን ያለ ስሞች አሳይ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ፍጹማዊ ድምፅን አሰናክል"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"የውስጠ-ሞገድ ማስጮህን አንቃ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"የብሉቱዝ AVRCP ስሪት"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"እነዚህ ቅንብሮች የታሰቡት ለግንባታ አጠቃቀም ብቻ ናቸው። መሳሪያህን እና በሱ ላይ ያሉትን መተግበሪያዎች እንዲበለሹ ወይም በትክክል እንዳይሰሩ ሊያደርጉ ይችላሉ።"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"መተግበሪያዎች በUSB በኩል ያረጋግጡ"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"በADB/ADT በኩል የተጫኑ መተግበሪያዎች ጎጂ ባህሪ ካላቸው ያረጋግጡ።"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"የብሉቱዝ መሣሪያዎች ያለ ስሞች (MAC አድራሻዎች ብቻ) ይታያሉ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"እንደ ተቀባይነት በሌለው ደረጃ ድምፁ ከፍ ማለት ወይም መቆጣጠር አለመቻል ያሉ ከሩቅ መሣሪያዎች ጋር የድምፅ ችግር በሚኖርበት ጊዜ የብሉቱዝ ፍጹማዊ ድምፅን ባሕሪ ያሰናክላል።"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"በስልኩ ላይ ያሉ የጥሪ ቅላጼዎች በብሉቱዝ ጆሮ ማዳመጫዎች ላይ እንዲጫወቱ ፍቀድ"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"አካባቢያዊ ተርሚናል"</string>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index 0af1077..603dcc8 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (الافتراضي)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"استخدام اختيار النظام (افتراضي)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"صوت <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"صوت <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"تمكين برامج الترميز الاختيارية"</item>
+ <item msgid="3304843301758635896">"تعطيل برامج الترميز الاختيارية"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"استخدام اختيار النظام (افتراضي)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"صوت <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"صوت <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"تمكين برامج الترميز الاختيارية"</item>
+ <item msgid="741805482892725657">"تعطيل برامج الترميز الاختيارية"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"استخدام اختيار النظام (افتراضي)"</item>
<item msgid="8895532488906185219">"44.1 كيلو هرتز"</item>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index e59ad8f..2c39566 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"السماح دائمًا بعمليات فحص Wi-Fi للتجوال"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"بيانات الجوّال نشطة دائمًا"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"تسريع الأجهزة للتوصيل"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"عرض أجهزة البلوتوث بدون أسماء"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"تعطيل مستوى الصوت المطلق"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"تمكين الرنين ضمن النطاق الأساسي"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"إصدار Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"هذه الإعدادات مخصصة لاستخدام التطوير فقط. قد يتسبب هذا في حدوث أعطال أو خلل في أداء الجهاز والتطبيقات المثبتة عليه."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"التحقق من التطبيقات عبر USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"التحقق من التطبيقات المثبتة عبر ADB/ADT لكشف السلوك الضار"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"سيتم عرض أجهزة البلوتوث بدون أسماء (عناوين MAC فقط)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"لتعطيل ميزة مستوى الصوت المطلق للبلوتوث في حالة حدوث مشكلات متعلقة بمستوى الصوت مع الأجهزة البعيدة مثل مستوى صوت عالٍ بشكل غير مقبول أو نقص إمكانية التحكم في الصوت."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"السماح بتشغيل نغمات الرنين على الهاتف من خلال سماعات الرأس البلوتوث"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"تطبيق طرفي محلي"</string>
diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml
index 38e94ec..9048d93 100644
--- a/packages/SettingsLib/res/values-az/arrays.xml
+++ b/packages/SettingsLib/res/values-az/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Defolt)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Sistem Seçimini istifadə edin (Defolt)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Şəxsi Kodekləri Aktiv edin"</item>
+ <item msgid="3304843301758635896">"Şəxsi Kodekləri Deaktiv edin"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Sistem Seçimini istifadə edin (Defolt)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Şəxsi Kodekləri Aktiv edin"</item>
+ <item msgid="741805482892725657">"Şəxsi Kodekləri Deaktiv edin"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Sistem Seçimini istifadə edin (Defolt)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 1ec5d62..33e9e85 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi axtarışlarına həmişə icazə verin"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobil data həmişə aktiv"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Birləşmə üçün avadanlıq akselerasiyası"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth cihazlarını adsız göstərin"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Mütləq səs həcmi deaktiv edin"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Diapazon daxili zəngi aktiv edin"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Versiya"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Bu parametrlər yalnız inkişafetdirici istifadə üçün nəzərdə tutulub. Onlar cihaz və tətbiqlərinizin sınması və ya pis işləməsinə səbəb ola bilər."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB üzərindən tətbiqləri yoxlayın"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT vasitəsi ilə quraşdırılmış tətbiqləri zərərli davranış üzrə yoxlayın."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Adsız Bluetooth cihazları (yalnız MAC ünvanları) göstəriləcək"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Uzaqdan idarə olunan cihazlarda dözülməz yüksək səs həcmi və ya nəzarət çatışmazlığı kimi səs problemləri olduqda Bluetooth mütləq səs həcmi xüsusiyyətini deaktiv edir."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Telefondakı bütün melodiyaların Bluetooth qulaqlıqlarında oxudulmasına icazə verin"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Yerli terminal"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 884f55b..aaf67e7d 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (podrazumevano)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Koristi izbor sistema (podrazumevano)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Omogući opcionalne kodeke"</item>
+ <item msgid="3304843301758635896">"Onemogući opcionalne kodeke"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Koristi izbor sistema (podrazumevano)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Omogući opcionalne kodeke"</item>
+ <item msgid="741805482892725657">"Onemogući opcionalne kodeke"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Koristi izbor sistema (podrazumevano)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index d0427c9..48e8e6d 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvek dozvoli skeniranje Wi‑Fi-ja u romingu"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilni podaci su uvek aktivni"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardversko ubrzanje privezivanja"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Prikaži Bluetooth uređaje bez naziva"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogući glavno podešavanje jačine zvuka"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Omogućavanje zvonjave na istom kanalu"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verzija Bluetooth AVRCP-a"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ova podešavanja su namenjena samo za programiranje. Mogu da izazovu prestanak funkcionisanja ili neočekivano ponašanje uređaja i aplikacija na njemu."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikuj aplikacije preko USB-a"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Proverava da li su aplikacije instalirane preko ADB-a/ADT-a štetne."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Biće prikazani Bluetooth uređaji bez naziva (samo sa MAC adresama)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Onemogućava glavno podešavanje jačine zvuka na Bluetooth uređaju u slučaju problema sa jačinom zvuka na daljinskim uređajima, kao što su izuzetno velika jačina zvuka ili nedostatak kontrole."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Omogućite da se melodija zvona na telefonu pušta preko Bluetooth slušalica"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string>
diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml
index 0e887e5..ce5ca02 100644
--- a/packages/SettingsLib/res/values-be/arrays.xml
+++ b/packages/SettingsLib/res/values-be/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (стандартная)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Выбар сістэмы (стандартны)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Аўдыя <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Аўдыя <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Уключыць дадатковыя кодэкі"</item>
+ <item msgid="3304843301758635896">"Адключыць дадатковыя кодэкі"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Выбар сістэмы (стандартны)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Аўдыя <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Аўдыя <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Уключыць дадатковыя кодэкі"</item>
+ <item msgid="741805482892725657">"Адключыць дадатковыя кодэкі"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Выбар сістэмы (стандартны)"</item>
<item msgid="8895532488906185219">"44,1 кГц"</item>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 363a904..551a86d 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Заўсёды дазваляць роўмінгавае сканіраванне Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Мабільная перадача даных заўсёды актыўная"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Апаратнае паскарэнне ў рэжыме мадэма"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Паказваць прылады Bluetooth без назваў"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Адключыць абсалютны гук"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Уключыць унутрыпалосны празвон"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версія Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Гэтыя налады прызначаны толькi для распрацоўшыкаў. Яны могуць выклікаць збоi прылад i ўсталяваных на iх прыкладанняў, а таксама перашкаджаць iх працы."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Праверце прыкладаннi па USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Праверце прыкладаннi, усталяваныя з дапамогай ADB/ADT, на нестабiльныя паводзiны."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Прылады Bluetooth будуць паказаны без назваў (толькі MAC-адрасы)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Адключыць функцыю абсалютнага гуку Bluetooth у выпадку праблем з гукам на аддаленых прыладах, напр., пры непрымальна высокай гучнасці або адсутнасці кіравання."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Дазволіць прайграванне рынгтонаў на тэлефоне праз гарнітуры Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Лакальны тэрмінал"</string>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index 2017886..7eec6ed 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (по подразбиране)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Използване на сист. избор (стандартно)"</item>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 43859e0..802e66e 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Сканирането за роуминг на Wi-Fi да е разрешено винаги"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Винаги активни мобилни данни"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Хардуерно ускорение за тетъринга"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Показване на устройствата с Bluetooth без имена"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Деактивиране на пълната сила на звука"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Активиране на звъненето в една и съща честотна лента"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версия на AVRCP за Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Тези настройки са предназначени само за програмиране. Те могат да доведат до прекъсване на работата или неправилно функциониране на устройството ви и приложенията в него."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Потвържд. на прил. през USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Проверка на инсталираните чрез ADB/ADT приложения за опасно поведение."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Ще бъдат показани устройствата с Bluetooth без имена (само MAC адресите)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Деактивира функцията на Bluetooth за пълна сила на звука в случай на проблеми със звука на отдалечени устройства, като например неприемливо висока сила на звука или липса на управление."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Разрешаване на мелодиите на телефона да се възпроизвеждат на слушалките с Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Локален терминал"</string>
diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml
index 9f35159..60869c4 100644
--- a/packages/SettingsLib/res/values-bn/arrays.xml
+++ b/packages/SettingsLib/res/values-bn/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ডিফল্ট)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"সিস্টেমের নির্বাচন ব্যবহার করুন (ডিফল্ট)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> অডিও"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> অডিও"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"ঐচ্ছিক কোডেক সক্ষম করুন"</item>
+ <item msgid="3304843301758635896">"ঐচ্ছিক কোডেক অক্ষম করুন"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"সিস্টেমের নির্বাচন ব্যবহার করুন (ডিফল্ট)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> অডিও"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> অডিও"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"ঐচ্ছিক কোডেক সক্ষম করুন"</item>
+ <item msgid="741805482892725657">"ঐচ্ছিক কোডেক অক্ষম করুন"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"সিস্টেমের নির্বাচন ব্যবহার করুন (ডিফল্ট)"</item>
<item msgid="8895532488906185219">"৪৪.১ kHz"</item>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 593f5ca..9e2ef59 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_not_in_range" msgid="1136191511238508967">"পরিসরের মধ্যে নয়"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"স্বয়ংক্রিয়ভাবে সংযোগ করবে না"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"কোনো ইন্টারনেট অ্যাক্সেস নেই"</string>
- <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> দ্বারা সংরক্ষিত"</string>
+ <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> দ্বারা সেভ করা"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"স্বয়ংক্রিয়ভাবে %1$s এর মাধ্যমে সংযুক্ত হয়েছে"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটওয়ার্কের রেটিং প্রদানকারীর মাধ্যমে স্বয়ংক্রিয়ভাবে সংযুক্ত"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s মাধ্যমে সংযুক্ত হয়েছে"</string>
@@ -57,7 +57,7 @@
<string name="bluetooth_pairing" msgid="1426882272690346242">"চেনানো হচ্ছে..."</string>
<string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"সংযুক্ত (কোনো ফোন নেই)"</string>
<string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"সংযুক্ত (কোনো মিডিয়া নেই)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"সংযুক্ত (কোনো বার্তা অ্যাক্সেস নেই)"</string>
+ <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"সংযুক্ত (কোনো মেসেজ অ্যাক্সেস নেই)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"সংযুক্ত (কোনো ফোন বা মিডিয়া নেই)"</string>
<string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"সংযুক্ত হয়েছে, ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"সংযুক্ত হয়েছে (ফোন ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
@@ -135,7 +135,7 @@
<string name="tts_play_example_summary" msgid="8029071615047894486">"কথন সংশ্লেষণের উপর একটি ছোট ডেমো প্লে করুন"</string>
<string name="tts_install_data_title" msgid="4264378440508149986">"ভয়েস ডেটা ইনস্টল করুন"</string>
<string name="tts_install_data_summary" msgid="5742135732511822589">"বিবৃতি সংশ্লেষণের জন্য প্রয়োজনীয় ভয়েস ডেটা ইনস্টল করুন"</string>
- <string name="tts_engine_security_warning" msgid="8786238102020223650">"এই বিবৃতি সংশ্লেষণ ইঞ্জিন হয়তো পাসওয়ার্ড এবং ক্রেডিট কার্ড নম্বর সহ কথ্য সমস্ত পাঠ্য সংগ্রহ করতে সক্ষম হতে পারে। এটি <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ইঞ্জিন থেকে আসে। এই বিবৃতি সংশ্লেষণ ইঞ্জিন সক্ষম করবেন?"</string>
+ <string name="tts_engine_security_warning" msgid="8786238102020223650">"এই বিবৃতি সংশ্লেষণ ইঞ্জিন হয়তো পাসওয়ার্ড এবং ক্রেডিট কার্ড নম্বর সহ কথ্য সমস্ত টেক্সট সংগ্রহ করতে সক্ষম হতে পারে। এটি <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ইঞ্জিন থেকে আসে। এই বিবৃতি সংশ্লেষণ ইঞ্জিন সক্রিয় করবেন?"</string>
<string name="tts_engine_network_required" msgid="1190837151485314743">"পাঠ্য থেকে ভাষ্য আউটপুটের জন্য এই ভাষার একটি কাজ করছে এমন নেটওয়ার্ক সংযোগ প্রয়োজন।"</string>
<string name="tts_default_sample_string" msgid="4040835213373086322">"এটি হল ভাষ্য সংশ্লেষণের একটি উদাহরণ"</string>
<string name="tts_status_title" msgid="7268566550242584413">"ডিফল্ট ভাষা স্থিতি"</string>
@@ -183,7 +183,7 @@
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুট-লোডার আনলক করার অনুমতি দিন"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM আনলক করার অনুমতি দিতে চান?"</string>
<string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"সতর্কতা: এই ডিভাইসে সেটিংটি চালু থাকা অবস্থায় ডিভাইস সুরক্ষা বৈশিষ্ট্যগুলি কাজ করবে না৷"</string>
- <string name="mock_location_app" msgid="7966220972812881854">"অনুরূপ অবস্থান অ্যাপ্লিকেশান নির্বাচন করুন"</string>
+ <string name="mock_location_app" msgid="7966220972812881854">"অনুরূপ অবস্থান অ্যাপ্লিকেশান বেছে নিন"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"কোনো অনুরূপ অবস্থান অ্যাপ্লিকেশান সেট করা নেই"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"অনুরূপ অবস্থান অ্যাপ্লিকেশান: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="debug_networking_category" msgid="7044075693643009662">"নেটওয়ার্কিং"</string>
@@ -193,12 +193,11 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"সর্বদা ওয়াই ফাই রোম স্ক্যানকে অনুমতি দিন"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"মোবাইল ডেটা সব সময় সক্রিয় থাক"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"টিথারিং হার্ডওয়্যার অ্যাক্সিলারেশন"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"নামহীন ব্লুটুথ ডিভাইসগুলি দেখুন"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"চূড়ান্ত ভলিউম অক্ষম করুন"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ইন-ব্যান্ড রিং করা সক্ষম করুন"</string>
- <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ব্লুটুথ AVRCP সংস্করণ"</string>
- <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ব্লুটুথ AVRCP সংস্করণ বেছে নিন"</string>
+ <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ব্লুটুথ AVRCP ভার্সন"</string>
+ <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ব্লুটুথ AVRCP ভার্সন বেছে নিন"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ব্লুটুথ অডিও কোডেক"</string>
<string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ব্লুটুথ অডিও কোডেক বেছে নিন"</string>
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ব্লুটুথ অডিওর নমুনা হার"</string>
@@ -215,13 +214,13 @@
<string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"সক্ষম করা থাকলে, ওয়াই ফাই সিগন্যালের মান খারাপ হলে ডেটা সংযোগ মোবাইলের কাছে হস্তান্তর করার জন্য ওয়াই ফাই আরো বেশি তৎপর হবে।"</string>
<string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ইন্টারফেসে উপস্থিত ডেটা ট্রাফিকের পরিমাণের উপরে ভিত্তি করে ওয়াই-ফাই রোম স্ক্যানকে অনুমোদিত/অননুমোদিত করুন"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"লগার বাফারের আকারগুলি"</string>
- <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"লগ বাফার প্রতি অপেক্ষাকৃত বড় আকারগুলির নির্বাচন করুন"</string>
- <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"লগারের সঞ্চয়স্থান সাফ করবেন?"</string>
+ <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"লগ বাফার প্রতি অপেক্ষাকৃত বড় আকারগুলির বেছে নিন"</string>
+ <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"লগারের স্টোরেজ সাফ করবেন?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"যেহেতু আমারা সর্বদা লগার চালু রেখে আর নিরিক্ষণ করছি না, তাই আমাদের আপনার ডিভাইসে থাকা লগার ডেটা মুছে ফেলতে হবে৷"</string>
- <string name="select_logpersist_title" msgid="7530031344550073166">"ডিভাইসে স্থায়ীভাবে লগার ডেটা সংরক্ষণ করুন"</string>
- <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ডিভাইসে স্থায়ীভাবে সঞ্চয় করতে লগ বাফারগুলিকে নির্বাচন করুন"</string>
- <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB কনফিগারেশন নির্বাচন করুন"</string>
- <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB কনফিগারেশন নির্বাচন করুন"</string>
+ <string name="select_logpersist_title" msgid="7530031344550073166">"ডিভাইসে স্থায়ীভাবে লগার ডেটা সেভ করুন"</string>
+ <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ডিভাইসে স্থায়ীভাবে সঞ্চয় করতে লগ বাফারগুলিকে বেছে নিন"</string>
+ <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB কনফিগারেশন বেছে নিন"</string>
+ <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB কনফিগারেশন বেছে নিন"</string>
<string name="allow_mock_location" msgid="2787962564578664888">"নকল অবস্থানের অনুমতি দিন"</string>
<string name="allow_mock_location_summary" msgid="317615105156345626">"মক অবস্থানগুলি মঞ্জুর করুন"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"অ্যাট্রিবিউট পরিদর্শন দেখা সক্ষম করুন"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"এইসব সেটিংস কেবলমাত্র উন্নত করার উদ্দেশ্য। সেগুলি কারণে আপনার ডিভাইস ভেঙ্গে এবং অ্যাপ্লিকেশানগুলি ভালো ভাবে কাজ করা নাও কারতে পারে।"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB এর অ্যাপ্লিকেশনগুলি যাচাই করুন"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ক্ষতিকারক ক্রিয়াকলাপ করছে কিনা তার জন্য ADB/ADT মারফত ইনস্টল করা অ্যাপ্লিকেশানগুলি চেক করুন।"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"নামহীন ব্লুটুথ ডিভাইসগুলি দেখানো হবে (শুধুমাত্র MAC ঠিকানা)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"অপ্রত্যাশিত উচ্চ ভলিউম বা নিয়ন্ত্রণের অভাবের মত দূরবর্তী ডিভাইসের ভলিউম সমস্যাগুলির ক্ষেত্রে, ব্লুটুথ চুড়ান্ত ভলিউম বৈশিষ্ট্য অক্ষম করে৷"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ফোনের রিংটোন ব্লুটুথ হেডসেটে শোনা সক্ষম করুন"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"স্থানীয় টার্মিনাল"</string>
@@ -243,10 +241,10 @@
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP পরীক্ষণ"</string>
<string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP চেক করার আচরণ সেট করুন"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"ডিবাগিং"</string>
- <string name="debug_app" msgid="8349591734751384446">"ডিবাগ অ্যাপ্লিকেশান নির্বাচন করুন"</string>
+ <string name="debug_app" msgid="8349591734751384446">"ডিবাগ অ্যাপ্লিকেশান বেছে নিন"</string>
<string name="debug_app_not_set" msgid="718752499586403499">"ডিবাগ অ্যাপ্লিকেশান সেট করা নেই"</string>
<string name="debug_app_set" msgid="2063077997870280017">"ডিবাগিং অ্যাপ্লিকেশান: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="select_application" msgid="5156029161289091703">"অ্যাপ্লিকেশান নির্বাচন করুন"</string>
+ <string name="select_application" msgid="5156029161289091703">"অ্যাপ্লিকেশান বেছে নিন"</string>
<string name="no_application" msgid="2813387563129153880">"কিছুই না"</string>
<string name="wait_for_debugger" msgid="1202370874528893091">"ডিবাগারের জন্য অপেক্ষা করুন"</string>
<string name="wait_for_debugger_summary" msgid="1766918303462746804">"চালানোর আগে সংযুক্ত করতে জন্য ডিবাগ করা অ্যাপ্লিকেশনটি ডিবাগারের জন্য অপেক্ষা করছে"</string>
@@ -390,6 +388,6 @@
<string name="active_input_method_subtypes" msgid="3596398805424733238">"সক্রিয় ইনপুট পদ্ধতিগুলি"</string>
<string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"সিস্টেমের ভাষাগুলি ব্যবহার করুন"</string>
<string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> জন্য সেটিংস খুলতে ব্যর্থ হয়েছে"</string>
- <string name="ime_security_warning" msgid="4135828934735934248">"এই ইনপুট পদ্ধতিটি হয়তো পাসওয়ার্ড এবং ক্রেডিট কার্ড নম্বর সহ আপনার টাইপ করা সমস্ত পাঠ্য সংগ্রহ করতে সক্ষম হতে পারে। এটি <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> অ্যাপ্লিকেশানের। এই ইনপুট পদ্ধতিটি ব্যবহার করবেন?"</string>
+ <string name="ime_security_warning" msgid="4135828934735934248">"এই ইনপুট পদ্ধতিটি হয়তো পাসওয়ার্ড এবং ক্রেডিট কার্ড নম্বর সহ আপনার টাইপ করা সমস্ত টেক্সট সংগ্রহ করতে সক্ষম হতে পারে। এটি <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> অ্যাপ থেকে এসেছে। এই ইনপুট পদ্ধতিটি ব্যবহার করবেন?"</string>
<string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"দ্রষ্টব্য: পুনরায় চালু করার পরে, আপনি আপনার ফোন আনলক না করা পর্যন্ত এই অ্যাপটিকে চালু করতে পারবেন না"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index c27f4e8..c274d4c 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Zadano)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Omogućite opcionalne kodeke"</item>
+ <item msgid="3304843301758635896">"Onemogućite opcionalne kodeke"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Omogućite opcionalne kodeke"</item>
+ <item msgid="741805482892725657">"Onemogućite opcionalne kodeke"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Koristi odabir sistema (Zadano)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index bbea335..d16ec3c 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nije u dometu"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Neće se automatski povezati"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"Nema pristupa internetu"</string>
- <string name="saved_network" msgid="4352716707126620811">"Sačuvao <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="saved_network" msgid="4352716707126620811">"Sačuvano: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezano koristeći %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezano putem ocjenjivača mreže"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezani preko %1$s"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvijek dopustiti Wi-Fi lutajuće skeniranje"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilna mreža za prijenos podataka je uvijek aktivna"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardversko ubrzavanje dijeljenja veze"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Prikaži Bluetooth uređaje bez naziva"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogućite apsolutnu jačinu zvuka"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Omogući zvono unutar pojasa"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP verzija"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ove postavke su namijenjene samo za svrhe razvoja. Mogu izazvati pogrešno ponašanje uređaja i aplikacija na njemu."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikuj aplikacije putem USB-a"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Provjerava da li se u aplikacijama instaliranim putem ADB-a/ADT-a javlja zlonamerno ponašanje."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Prikazat će se Bluetooth uređaji bez naziva (samo MAC adrese)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Onemogućava opciju Bluetooth apsolutne jačine zvuka u slučaju problema s jačinom zvuka na udaljenim uređajima, kao što je neprihvatljivo glasan zvuk ili nedostatak kontrole."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Dopusti da se melodije zvona reproduciranju na Bluetooth slušalicama"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index ca910cd..b163642 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (predeterminada)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Utilitza selecció del sistema (predeterminada)"</item>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index a026123..ded9352 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permet sempre cerca de Wi-Fi en ininerància"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Dades mòbils sempre actives"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per compartir la xarxa"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostra els dispositius Bluetooth sense el nom"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactiva el volum absolut"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activa el so al mateix canal"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versió AVRCP de Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Aquesta configuració només està prevista per a usos de desenvolupament. Pot fer que el dispositiu i que les aplicacions s\'interrompin o tinguin un comportament inadequat."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifica aplicacions per USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprova les aplicacions instal·lades mitjançant ADB/ADT per detectar possibles comportaments perillosos"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Es mostraran els dispositius Bluetooth sense el nom (només l\'adreça MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Desactiva la funció de volum absolut de Bluetooth en cas que es produeixin problemes de volum amb dispositius remots, com ara un volum massa alt o una manca de control."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permet que els sons de trucada del telèfon es reprodueixin en auriculars amb Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index 73e41f3..9d665a3 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (výchozí)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Použít systémový výběr (výchozí)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Zvuk <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Zvuk <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Povolit volitelné kodeky"</item>
+ <item msgid="3304843301758635896">"Zakázat volitelné kodeky"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Použít systémový výběr (výchozí)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Zvuk <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Zvuk <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Povolit volitelné kodeky"</item>
+ <item msgid="741805482892725657">"Zakázat volitelné kodeky"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Použít systémový výběr (výchozí)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index e6e91cd..5afa00c 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vždy povolit Wi-Fi roaming"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilní data jsou vždy aktivní"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardwarová akcelerace tetheringu"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Zobrazovat zařízení Bluetooth bez názvů"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Zakázat absolutní hlasitost"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Povolit vyzvánění v hovorovém pásmu"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verze profilu Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Tato nastavení jsou určena pouze pro vývojáře. Mohou způsobit rozbití nebo nesprávné fungování zařízení a nainstalovaných aplikací."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Ověřit aplikace z USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrolovat škodlivost aplikací nainstalovaných pomocí nástroje ADB/ADT"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Zařízení Bluetooth se budou zobrazovat bez názvů (pouze adresy MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Zakáže funkci absolutní hlasitosti Bluetooth. Zabrání tak problémům s hlasitostí vzdálených zařízení (jako je příliš vysoká hlasitost nebo nemožnost ovládání)."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Umožňuje přehrávat vyzváněcí tóny z telefonu v náhlavní soupravě Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Místní terminál"</string>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index fe0b1fc..0993d31 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (standard)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Brug systemvalg (standard)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-lyd"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-lyd"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Aktivér Optional Codecs"</item>
+ <item msgid="3304843301758635896">"Deaktiver Optional Codecs"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Brug systemvalg (standard)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-lyd"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-lyd"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Aktivér Optional Codecs"</item>
+ <item msgid="741805482892725657">"Deaktiver Optional Codecs"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Brug systemvalg (standard)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index a18a4a4..275822c 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"Ingen forbindelse på grund af lav netværkskvalitet"</string>
<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_cant_connect" msgid="5410016875644565884">"Der kan ikke oprettes forbindelse"</string>
+ <string name="wifi_cant_connect" msgid="5410016875644565884">"Kan ikke forbinde"</string>
<string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"Der kan ikke oprettes forbindelse til \"<xliff:g id="AP_NAME">%1$s</xliff:g>\""</string>
<string name="wifi_check_password_try_again" msgid="516958988102584767">"Tjek adgangskoden, og prøv igen"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ikke inden for rækkevidde"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillad altid scanning af Wi-Fi-roaming"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobildata er altid aktiveret"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardwareacceleration ved netdeling"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Vis Bluetooth-enheder uden navne"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Deaktiver absolut lydstyrke"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Afspil ringetone via Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"AVRCP-version for Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Disse indstillinger er kun beregnet til brug i forbindelse med udvikling. De kan forårsage, at din enhed og dens applikationer går ned eller ikke fungerer korrekt."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificer apps via USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Tjek apps, der er installeret via ADB/ADT, for skadelig adfærd."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-enheder uden navne (kun MAC-adresser) vises"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Deaktiverer funktionen til absolut lydstyrke via Bluetooth i tilfælde af problemer med lydstyrken på eksterne enheder, f.eks. uacceptabel høj lyd eller manglende kontrol."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Tillad, at ringetoner på telefonen kan afspilles i Bluetooth-headset"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokal terminal"</string>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index 14d9bf1..b5e3491 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Standard)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Systemauswahl verwenden (Standard)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-Audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-Audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Optionale Codecs aktivieren"</item>
+ <item msgid="3304843301758635896">"Optionale Codecs deaktivieren"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Systemauswahl verwenden (Standard)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-Audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-Audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Optionale Codecs aktivieren"</item>
+ <item msgid="741805482892725657">"Optionale Codecs deaktivieren"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Systemauswahl verwenden (Standard)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 309b75b..5f11b51 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"WLAN-Roamingsuchen immer zulassen"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobile Datennutzung immer aktiviert"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardwarebeschleunigung für Tethering"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth-Geräte ohne Namen anzeigen"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Maximallautstärke deaktivieren"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"In-Band-Klingeln aktivieren"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-Version"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Diese Einstellungen sind ausschließlich für Entwicklungszwecke gedacht. Sie können dein Gerät und die darauf installierten Apps beschädigen oder zu unerwünschtem Verhalten führen."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Apps über USB bestätigen"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Überprüft installierte Apps über ADB/ADT auf schädliches Verhalten"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-Geräte ohne Namen (nur MAC-Adressen) werden angezeigt"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Deaktiviert die Bluetooth-Maximallautstärkefunktion, falls auf Remote-Geräten Probleme mit der Lautstärke auftreten, wie beispielsweise übermäßig laute Wiedergabe oder fehlende Kontrolle bei der Steuerung."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Wiedergabe von Smartphone-Klingeltönen auf Bluetooth-Headsets zulassen"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokales Terminal"</string>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index a900b24..1b740e6 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Προεπιλογή)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Χρήση επιλογής συστήματος (Προεπιλογή)"</item>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index bfaa778..cdb9518 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Να επιτρέπεται πάντα η σάρωση Wi-Fi κατά την περιαγωγή"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Πάντα ενεργά δεδομένα κινητής τηλεφωνίας"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Σύνδεση επιτάχυνσης υλικού"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Εμφάνιση συσκευών Bluetooth χωρίς ονόματα"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Απενεργοποίηση απόλυτης έντασης"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Ενεργοποίηση κλήσης εντός εύρους"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Έκδοση AVRCP Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Αυτές οι ρυθμίσεις προορίζονται για χρήση κατά την ανάπτυξη. Μπορούν να προκαλέσουν προβλήματα στη λειτουργία της συσκευής και των εφαρμογών σας."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Επαλήθευση εφαρμογών μέσω USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Έλεγχος εφαρμογών που έχουν εγκατασταθεί μέσω ADB/ADT για επιβλαβή συμπεριφορά."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Θα εμφανιστούν οι συσκευές Bluetooth χωρίς ονόματα (μόνο διευθύνσεις MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Απενεργοποιεί τη δυνατότητα απόλυτης έντασης του Bluetooth σε περίπτωση προβλημάτων έντασης με απομακρυσμένες συσκευές, όπως όταν υπάρχει μη αποδεκτά υψηλή ένταση ή απουσία ελέγχου."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Να επιτρέπεται η αναπαραγωγή των ήχων κλήσης του τηλεφώνου στα ακουστικά Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Τοπική τερματική εφαρμογή"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index 55feafa..f4fceae 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Use System Selection (Default)"</item>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index db8cfa1..c964367 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobile data always active"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering hardware acceleration"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Enable in-band ringing"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Allow ringtones on the phone to be played on Bluetooth headsets"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml
index 55feafa..f4fceae 100644
--- a/packages/SettingsLib/res/values-en-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Use System Selection (Default)"</item>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index db8cfa1..c964367 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobile data always active"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering hardware acceleration"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Enable in-band ringing"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Allow ringtones on the phone to be played on Bluetooth headsets"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index 55feafa..f4fceae 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Use System Selection (Default)"</item>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index db8cfa1..c964367 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobile data always active"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering hardware acceleration"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Enable in-band ringing"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Allow ringtones on the phone to be played on Bluetooth headsets"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index 55feafa..f4fceae 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Use System Selection (Default)"</item>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index db8cfa1..c964367 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobile data always active"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering hardware acceleration"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Enable in-band ringing"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Allow ringtones on the phone to be played on Bluetooth headsets"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/arrays.xml b/packages/SettingsLib/res/values-en-rXC/arrays.xml
index 2e74ce1..846e314 100644
--- a/packages/SettingsLib/res/values-en-rXC/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rXC/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Use System Selection (Default)"</item>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 01809e7..9c313ee 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobile data always active"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering hardware acceleration"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Show Bluetooth devices without names"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Enable in-band ringing"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behavior."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth devices without names (MAC addresses only) will be displayed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Allow ringtones on the phone to be played on Bluetooth headsets"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index 466d433..16f725a 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (predeterminado)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Usar selección del sistema (predeterminado)"</item>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 2290a7e..fdf39c8 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Datos móviles siempre activados"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración de hardware de conexión mediante dispositivo portátil"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostrar dispositivos Bluetooth sin nombre"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Habilitar sonido dentro de banda"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión de AVRCP del Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Estos parámetros de configuración están destinados únicamente a los programadores. Pueden hacer que el dispositivo o sus aplicaciones no funcionen correctamente."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicaciones por USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprobar que las aplicaciones instaladas mediante ADB/ADT no ocasionen daños"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Se mostrarán los dispositivos Bluetooth sin nombre (solo direcciones MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Inhabilita la función de volumen absoluto de Bluetooth si se producen problemas de volumen con dispositivos remotos (por ejemplo, volumen demasiado alto o falta de control)."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permite que los tonos del teléfono suenen en auriculares Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index b6d5218..a752db9 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Predeterminada)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Usar preferencia del sistema (predeter.)"</item>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 2819d41..6065bb0 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Datos móviles siempre activos"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración por hardware para conexión compartida"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostrar dispositivos Bluetooth sin nombre"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Habilitar tono de llamada por Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP del Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Estos ajustes están destinados únicamente a los desarrolladores. Pueden provocar que el dispositivo o las aplicaciones no funcionen correctamente."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicaciones por USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprueba las aplicaciones instaladas mediante ADB/ADT para detectar comportamientos dañinos"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Se mostrarán dispositivos Bluetooth sin nombre (solo direcciones MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Inhabilita la función de volumen absoluto de Bluetooth si se producen problemas de volumen con dispositivos remotos (por ejemplo, volumen demasiado alto o falta de control)."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permite que los tonos de llamada del teléfono se reproduzcan en auriculares Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index 1915176..db796f1 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (vaikeseade)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Süsteemi valiku kasutamine (vaikeseade)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Heli: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Heli: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Lubatakse valikulised kodekid"</item>
+ <item msgid="3304843301758635896">"Keelatakse valikulised kodekid"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Süsteemi valiku kasutamine (vaikeseade)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Heli: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Heli: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Lubatakse valikulised kodekid"</item>
+ <item msgid="741805482892725657">"Keelatakse valikulised kodekid"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Süsteemi valiku kasutamine (vaikeseade)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index a5299c2..48b7719 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -111,10 +111,10 @@
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Eemaldatud rakendused"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Eemaldatud rakendused ja kasutajad"</string>
<string name="tether_settings_title_usb" msgid="6688416425801386511">"USB jagamine"</string>
- <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Kantav tööpunkt"</string>
+ <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Mobiilne kuumkoht"</string>
<string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Jagamine Bluetoothiga"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Jagamine"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Jagam. ja kant. kuumkoht"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Jagamine / kantav kuumkoht"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Kõik töörakendused"</string>
<string name="user_guest" msgid="8475274842845401871">"Külaline"</string>
<string name="unknown" msgid="1592123443519355854">"Tundmatu"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Luba alati WiFi-rändluse skannimine"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobiilne andmeside on alati aktiivne"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Jagamise riistvaraline kiirendus"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Kuva Bluetoothi seadmed ilma nimedeta"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Keela absoluutne helitugevus"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Luba ribasisene helisemine"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetoothi AVRCP versioon"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Need seaded on mõeldud ainult arendajatele. Need võivad põhjustada seadme ja seadmes olevate rakenduste rikkeid või valesti toimimist."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Kinnita rakendus USB kaudu"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrolli, kas ADB/ADT-ga installitud rakendused on ohtlikud."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Kuvatakse ilma nimedeta (ainult MAC-aadressidega) Bluetoothi seadmed"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Keelatakse Bluetoothi absoluutse helitugevuse funktsioon, kui kaugseadmetega on helitugevuse probleeme (nt liiga vali heli või juhitavuse puudumine)."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Lubab telefonis olevaid helinaid esitada Bluetoothi peakomplektides"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Kohalik terminal"</string>
diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml
index 64d5986..d4a5e6e 100644
--- a/packages/SettingsLib/res/values-eu/arrays.xml
+++ b/packages/SettingsLib/res/values-eu/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (lehenetsia)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Erabili sistema-hautapena (lehenetsia)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audioa"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audioa"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Gaitu aukerako kodekak"</item>
+ <item msgid="3304843301758635896">"Desgaitu aukerako kodekak"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Erabili sistema-hautapena (lehenetsia)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audioa"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audioa"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Gaitu aukerako kodekak"</item>
+ <item msgid="741805482892725657">"Desgaitu aukerako kodekak"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Erabili sistema-hautapena (lehenetsia)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 1629e41..fc60954 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Onartu beti ibiltaritzan Wi-Fi sareak bilatzea"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Datu mugikorrak beti aktibo"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Konexioa partekatzeko hardwarearen azelerazioa"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Erakutsi Bluetooth gailuak izenik gabe"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desgaitu bolumen absolutua"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Gaitu tonuak audio-kanal berean erreproduzitzeko aukera"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP bertsioa"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ezarpen hauek garapen-xedeetarako pentsatu dira soilik. Baliteke ezarpenen eraginez gailua matxuratzea edo funtzionamendu okerra izatea."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Egiaztatu USBko aplikazioak."</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Egiaztatu ADB/ADT bidez instalatutako aplikazioak portaera kaltegarriak antzemateko."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth gailuak izenik gabe (MAC helbideak soilik) erakutsiko dira"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Desgaitu egiten du Bluetooth bidezko bolumen absolutuaren eginbidea urruneko gailuetan arazoak hautematen badira; esaterako, bolumena ozenegia bada edo ezin bada kontrolatu."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Onartu telefonoko tonuak Bluetooth entzungailuetan erreproduzitzeko aukera"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Tokiko terminala"</string>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index d229777..2436e79 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP نسخه ۱.۴ (پیشفرض)"</item>
- <item msgid="2089555299377409443">"AVRCP نسخه ۱.۵"</item>
- <item msgid="2895327394279434278">"AVRCP نسخه ۱.۶"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp نسخه ۱۴"</item>
- <item msgid="1913619118958233129">"avrcp نسخه ۱۵"</item>
- <item msgid="7142710449249088270">"avrcp نسخه ۱۶"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"استفاده از انتخاب سیستم (پیشفرض)"</item>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 5d806d0..2500d5d 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"اسکنهای رومینگ Wi‑Fi همیشه مجاز است"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"داده تلفن همراه همیشه فعال باشد"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"شتاب سختافزاری اتصال به اینترنت با تلفن همراه"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"نمایش دستگاههای بلوتوث بدون نام"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"غیرفعال کردن میزان صدای مطلق"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"فعال کردن زنگ زدن درون باندی"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"نسخه AVRCP بلوتوث"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"این تنظیمات فقط برای برنامهنویسی در نظر گرفته شده است. ممکن است استفاده از این تنظیمات موجب خرابی یا عملکرد نادرست دستگاه یا برنامههای شما شود."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"تأیید برنامههای نصب شده از طریق USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"برنامههای نصب شده از طریق ADB/ADT را ازنظر رفتار مخاطرهآمیز بررسی کنید."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"دستگاههای بلوتوث بدون نام (فقط نشانیهای MAC) نشان داده خواهند شد"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"در صورت وجود مشکل میزان صدا با دستگاههای راه دور مثل میزان صدای بلند ناخوشایند یا عدم کنترل صدا، قابلیت میزان صدای کامل بلوتوث را غیرفعال کنید."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"اجازه میدهد آهنگهای زنگ تلفن در هدستهای بلوتوث پخش شود"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"ترمینال محلی"</string>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 311d408..9ed0c89 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (oletus)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Käytä järjestelmän valintaa (oletus)"</item>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 6b3953e..414a4c7f 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Salli Wi-Fi-verkkovierailuskannaus aina"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobiilidata aina käytössä"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Laitteistokiihdytyksen yhteyden jakaminen"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Näytä nimettömät Bluetooth-laitteet"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Poista yleinen äänenvoimakkuuden säätö käytöstä"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Ota käyttöön kaistalla soitto"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetoothin AVRCP-versio"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Nämä asetukset on tarkoitettu vain kehityskäyttöön, ja ne voivat aiheuttaa haittaa laitteellesi tai sen sovelluksille."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Tarkista USB:n kautta asennetut"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Tarkista ADB:n/ADT:n kautta asennetut sovellukset haitallisen toiminnan varalta."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Näytetään Bluetooth-laitteet, joilla ei ole nimiä (vain MAC-osoitteet)."</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Bluetoothin yleinen äänenvoimakkuuden säätö poistetaan käytöstä ongelmien välttämiseksi esimerkiksi silloin, kun laitteen äänenvoimakkuus on liian kova tai sitä ei voi säätää."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Salli puhelimen soittoäänten toistaminen Bluetooth-kuulokemikrofoneissa"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Paikallinen pääte"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 8253614..be568ed 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (par défaut)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Utiliser sélect. du système (par défaut)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Activer les codecs optionnels"</item>
+ <item msgid="3304843301758635896">"Désactiver les codecs optionnels"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Utiliser sélect. du système (par défaut)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Activer les codecs optionnels"</item>
+ <item msgid="741805482892725657">"Désactiver les codecs optionnels"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Utiliser sélect. du système (par défaut)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 28e41fd..6306306 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -112,7 +112,7 @@
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Applications et utilisateurs supprimés"</string>
<string name="tether_settings_title_usb" msgid="6688416425801386511">"Partage de connexion par USB"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Point d\'accès Wi-Fi mobile"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Par Bluetooth"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Partage connexion Bluetooth"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Partage de connexion"</string>
<string name="tether_settings_title_all" msgid="8356136101061143841">"Partage de connexion"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Toutes les applis profess."</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Toujours autoriser la détection de réseaux Wi-Fi en itinérance"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Données cellulaires toujours actives"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Accélération matérielle pour le partage de connexion"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Afficher les appareils Bluetooth sans nom"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Désactiver le volume absolu"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activer la signalisation intra-bande"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Version du profil Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ces paramètres sont en cours de développement. Ils peuvent endommager votre appareil et les applications qui s\'y trouvent, ou provoquer leur dysfonctionnement."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Vérifier les applis via USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Vérifiez que les applications installées par ADB/ADT ne présentent pas de comportement dangereux."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Les appareils Bluetooth sans nom (adresses MAC seulement) seront affichés"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Désactive la fonctionnalité de volume absolu par Bluetooth en cas de problème de volume sur les appareils à distance, par exemple si le volume est trop élevé ou s\'il ne peut pas être contrôlé."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Autoriser la lecture des sonneries du téléphone sur les écouteurs Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index aaa0381..995a1ff 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (par défaut)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Utiliser sélection système (par défaut)"</item>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index d7c7920..b53765b 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_not_in_range" msgid="1136191511238508967">"Hors de portée"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Reconnexion automatique impossible"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"Aucun accès à Internet"</string>
- <string name="saved_network" msgid="4352716707126620811">"Enregistré par : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="saved_network" msgid="4352716707126620811">"Enregistré lors de : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Connecté automatiquement via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connecté automatiquement via un fournisseur d\'évaluation de l\'état du réseau"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté via %1$s"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Toujours autoriser la détection de réseaux Wi-Fi en itinérance"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Données mobiles toujours actives"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Accélération matérielle pour le partage de connexion"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Afficher les appareils Bluetooth sans nom"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Désactiver le volume absolu"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activer la signalisation intra-bande"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Version Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ces paramètres sont en cours de développement. Ils peuvent endommager votre appareil et les applications qui s\'y trouvent, ou provoquer leur dysfonctionnement."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Vérifier les applis via USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Vérifiez que les applications installées par ADB/ADT ne présentent pas de comportement dangereux."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Les appareils Bluetooth seront affichés sans nom (adresse MAC uniquement)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Désactive la fonctionnalité de volume absolu du Bluetooth en cas de problème de volume sur les appareils à distance, par exemple si le volume est trop élevé ou s\'il ne peut pas être contrôlé."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Autoriser la lecture des sonneries du téléphone sur les casques Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index 4b70cb3..d06fe9c 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -22,7 +22,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="wifi_status">
<item msgid="1922181315419294640"></item>
- <item msgid="8934131797783724664">"Buscando..."</item>
+ <item msgid="8934131797783724664">"Explorando..."</item>
<item msgid="8513729475867537913">"Conectando..."</item>
<item msgid="515055375277271756">"Autenticando…"</item>
<item msgid="1943354004029184381">"Obtendo enderezo IP..."</item>
@@ -36,7 +36,7 @@
</string-array>
<string-array name="wifi_status_with_ssid">
<item msgid="7714855332363650812"></item>
- <item msgid="8878186979715711006">"Buscando..."</item>
+ <item msgid="8878186979715711006">"Explorando..."</item>
<item msgid="355508996603873860">"Conectando con <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
<item msgid="554971459996405634">"Autenticando con <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
<item msgid="7928343808033020343">"Obtendo enderezo IP de <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (predeterminado)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Usar selección sistema (predeterminado)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Activar códecs opcionais"</item>
+ <item msgid="3304843301758635896">"Desactivar códecs opcionais"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Usa selección sistema (predeterminado)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Activa os códecs opcionais"</item>
+ <item msgid="741805482892725657">"Desactiva os códecs opcionais"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Usar selección sistema (predeterminado)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index cc6a96c..39fd72c 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir sempre buscas de itinerancia da wifi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Datos móbiles sempre activados"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración de hardware para conexión compartida"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostrar dispositivos Bluetooth sen nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactivar volume absoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activar a función de soar na mesma banda"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP de Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Esta configuración só está destinada á programación. Esta pode provocar que o dispositivo e as aplicacións fallen ou se comporten incorrectamente."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicacións por USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprobar as aplicacións instaladas a través de ADB/ADT para detectar comportamento perigoso."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Mostraranse dispositivos Bluetooth sen nomes (só enderezos MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Desactiva a función do volume absoluto do Bluetooth en caso de que se produzan problemas de volume cos dispositivos remotos, como volume demasiado alto ou falta de control."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permite que os tons de chamada do teléfono se reproduzan nos auriculares Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index cdb0eb3..00eb29c 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -50,28 +50,46 @@
</string-array>
<string-array name="hdcp_checking_titles">
<item msgid="441827799230089869">"ક્યારેય તપાસશો નહીં"</item>
- <item msgid="6042769699089883931">"ફક્ત DRM સામગ્રી માટે તપાસો"</item>
+ <item msgid="6042769699089883931">"ફક્ત DRM કન્ટેન્ટ માટે તપાસો"</item>
<item msgid="9174900380056846820">"હંમેશાં તપાસો"</item>
</string-array>
<string-array name="hdcp_checking_summaries">
<item msgid="505558545611516707">"HDCP તપાસનો ક્યારેય ઉપયોગ કરશો નહીં"</item>
- <item msgid="3878793616631049349">"ફક્ત DRM સામગ્રી માટે HDCP તપાસનો ઉપયોગ કરો"</item>
+ <item msgid="3878793616631049349">"ફક્ત DRM કન્ટેન્ટ માટે HDCP તપાસનો ઉપયોગ કરો"</item>
<item msgid="45075631231212732">"હંમેશા HDCP તપાસનો ઉપયોગ કરો"</item>
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ડિફૉલ્ટ)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ઑડિઓ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ઑડિઓ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"વૈકલ્પિક કોડેક સક્ષમ કરો"</item>
+ <item msgid="3304843301758635896">"વૈકલ્પિક કોડેક અક્ષમ કરો"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ઑડિઓ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ઑડિઓ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"વૈકલ્પિક કોડેક સક્ષમ કરો"</item>
+ <item msgid="741805482892725657">"વૈકલ્પિક કોડેક અક્ષમ કરો"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 1de92cd2..fccac47 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -72,7 +72,7 @@
<string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"સંપર્ક શેરિંગ માટે ઉપયોગ કરો"</string>
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ઇન્ટરનેટ કનેક્શન શેરિંગ"</string>
<string name="bluetooth_profile_map" msgid="1019763341565580450">"ટેક્સ્ટ સંદેશા"</string>
- <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ઍક્સેસ"</string>
+ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"સિમ ઍક્સેસ"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ઑડિઓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ઑડિઓ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"મીડિયા ઑડિઓ સાથે કનેક્ટ કર્યુ"</string>
@@ -86,7 +86,7 @@
<string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"ઉપકરણ સાથે સ્થાનિક ઇન્ટરનેટ કનેક્શન શેર કરે છે"</string>
<string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"ઇન્ટરનેટ ઍક્સેસ માટે ઉપયોગ કરો"</string>
<string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"નકશા માટે વાપરો"</string>
- <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM ઍક્સેસ માટે ઉપયોગ કરો"</string>
+ <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"સિમ ઍક્સેસ માટે ઉપયોગ કરો"</string>
<string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"મીડિયા ઑડિઓ માટે ઉપયોગ કરો"</string>
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ફોન ઑડિઓ માટે ઉપયોગ કરો"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ફાઇલ સ્થાનાંતર માટે ઉપયોગ કરો"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"હંમેશા વાઇ-ફાઇ રોમ સ્કૅન્સને મંજૂરી આપો"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"મોબાઇલ ડેટા હંમેશાં સક્રિય"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ટિથરિંગ માટે હાર્ડવેર ગતિવૃદ્ધિ"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"નામ વિનાના બ્લૂટૂથ ઉપકરણો બતાવો"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ચોક્કસ વૉલ્યૂમને અક્ષમ કરો"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"બેંડમાં રિંગ કરવાનું સક્ષમ કરો"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"બ્લૂટૂથ AVRCP સંસ્કરણ"</string>
@@ -228,14 +227,13 @@
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"વાઇ-ફાઇ સક્રિય હોય ત્યારે પણ, હંમેશા મોબાઇલ ડેટાને સક્રિય રાખો (ઝડપી નેટવર્ક સ્વિચિંગ માટે)."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"જો ટિથરિંગ માટે હાર્ડવેર ગતિવૃદ્ધિ ઉપલબ્ધ હોય તો તેનો ઉપયોગ કરો"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB ડિબગિંગને મંજૂરી આપીએ?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"USB ડિબગીંગ ફક્ત વિકાસ હેતુઓ માટે જ બનાવાયેલ છે. તેનો ઉપયોગ તમારા કમ્પ્યુટર અને તમારા ઉપકરણ વચ્ચે ડેટાને કૉપિ કરવા, સૂચના વગર તમારા ઉપકરણ પર ઍપ્લિકેશનો ઇન્સ્ટોલ કરવા અને લૉગ ડેટા વાંચવા માટે કરો."</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"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>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"હાનિકારક વર્તણૂંક માટે ADB/ADT મારફતે ઇન્સ્ટોલ કરવામાં આવેલી ઍપ્લિકેશનો તપાસો."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"નામ વગરના (ફક્ત MAC ઍડ્રેસવાળા) બ્લૂટૂથ ઉપકરણો બતાવવામાં આવશે"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"રિમોટ ઉપકરણોમાં વધુ પડતું ઊંચું વૉલ્યૂમ અથવા નિયંત્રણની કમી જેવી વૉલ્યૂમની સમસ્યાઓની સ્થિતિમાં બ્લૂટૂથ ચોક્કસ વૉલ્યૂમ સુવિધાને અક્ષમ કરે છે."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ફોનની રિંગટોન બ્લૂટૂથ હૅડસેટ પર વાગવાની મંજૂરી આપો"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"સ્થાનિક ટર્મિનલ"</string>
@@ -297,8 +295,8 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"બૅકગ્રાઉન્ડ પ્રક્રિયા સીમા"</string>
<string name="show_all_anrs" msgid="28462979638729082">"બધા ANR બતાવો"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"બૅકગ્રાઉન્ડ ઍપ્લિકેશનો માટે ઍપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string>
- <string name="show_notification_channel_warnings" msgid="1399948193466922683">"સૂચના ચૅનલની ચેતવણી બતાવો"</string>
- <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"ઍપ્લિકેશન માન્ય ચૅનલ વિના સૂચના પોસ્ટ કરે તો સ્ક્રીન પર ચેતવણી દેખાય છે"</string>
+ <string name="show_notification_channel_warnings" msgid="1399948193466922683">"નોટિફિકેશન ચૅનલની ચેતવણી બતાવો"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"ઍપ્લિકેશન માન્ય ચૅનલ વિના નોટિફિકેશન પોસ્ટ કરે તો સ્ક્રીન પર ચેતવણી દેખાય છે"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string>
@@ -319,7 +317,7 @@
<string-array name="color_mode_descriptions">
<item msgid="4979629397075120893">"વધારેલ રંગો"</item>
<item msgid="8280754435979370728">"આંખો વડે જોઈ શકાતાં કુદરતી રંગો"</item>
- <item msgid="5363960654009010371">"ડિજિટલ સામગ્રી માટે ઓપ્ટિમાઇઝ કરાયેલા રંગો"</item>
+ <item msgid="5363960654009010371">"ડિજિટલ કન્ટેન્ટ માટે ઓપ્ટિમાઇઝ કરાયેલા રંગો"</item>
</string-array>
<string name="inactive_apps_title" msgid="1317817863508274533">"નિષ્ક્રિય ઍપ્લિકેશનો"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"નિષ્ક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index a90e378..a41c4f2 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (डिफ़ॉल्ट)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ऑडियो"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ऑडियो"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"वैकल्पिक कोडेक चालू करें"</item>
+ <item msgid="3304843301758635896">"वैकल्पिक कोडेक अक्षम करें"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ऑडियो"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ऑडियो"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"वैकल्पिक कोडेक चालू करें"</item>
+ <item msgid="741805482892725657">"वैकल्पिक कोडेक अक्षम करें"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 252be3c..7b01903 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -33,7 +33,7 @@
<string name="wifi_check_password_try_again" msgid="516958988102584767">"पासवर्ड जांचें और दोबारा कोशिश करें"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"रेंज में नहीं"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"अपने आप कनेक्ट नहीं होगा"</string>
- <string name="wifi_no_internet" msgid="3880396223819116454">"कोई इंटरनेट एक्सेस नहीं"</string>
+ <string name="wifi_no_internet" msgid="3880396223819116454">"इंटरनेट नहीं है"</string>
<string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> के द्वारा सहेजा गया"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s के ज़रिए ऑटोमैटिक रूप से कनेक्ट है"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदाता के ज़रिए अपने आप कनेक्ट है"</string>
@@ -94,7 +94,7 @@
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"युग्म बनाएं"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"दूसरे डिवाइस से जोड़ें"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करें"</string>
- <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट रहने पर, पेयरिंग आपको अपने संपर्कों और कॉल इतिहास की एक्सेस प्रदान करता है."</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट होने पर, पेयरिंग से आपके संपर्कों और कॉल इतिहास तक पहुंचा जा सकता है."</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> के साथ युग्मित नहीं हो सका."</string>
<string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"गलत पिन या पासकी के कारण <xliff:g id="DEVICE_NAME">%1$s</xliff:g> के साथ युग्मित नहीं हो सका."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> से संचार नहीं कर सकता."</string>
@@ -110,9 +110,9 @@
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"निकाले गए ऐप्स"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ऐप्स और उपयोगकर्ताओं को निकालें"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB टेदरिंग"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB से इंटरनेट पर शेयर करें"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"पोर्टेबल हॉटस्पॉट"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ब्लूटूथ टेदरिंग"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ब्लूटूथ से इंटरनेट पर शेयर करें."</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"टेदरिंग"</string>
<string name="tether_settings_title_all" msgid="8356136101061143841">"टेदरिंग और पोर्टेबल हॉटस्पॉट"</string>
<string name="managed_user_title" msgid="8109605045406748842">"सभी कार्यस्थल ऐप्लिकेशन"</string>
@@ -135,7 +135,7 @@
<string name="tts_play_example_summary" msgid="8029071615047894486">"लिखे हुए को बोली में बदलने की सुविधा की एक छोटी सी झलक चलाएं"</string>
<string name="tts_install_data_title" msgid="4264378440508149986">"ध्वनि डेटा इंस्टॉल करें"</string>
<string name="tts_install_data_summary" msgid="5742135732511822589">"बोली-संश्लेषण के लिए आवश्यक ध्वनि डेटा इंस्टॉल करें"</string>
- <string name="tts_engine_security_warning" msgid="8786238102020223650">"यह बोली संश्लेषण इंजन पासवर्ड और क्रेडिट कार्ड नंबर जैसे निजी डेटा समेत आपके द्वारा बोले जाने वाले सभी लेख को एकत्र कर सकता है. यह <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> इंजन से आता है. इस बोली संश्लेषण इंजन के उपयोग को सक्षम करें?"</string>
+ <string name="tts_engine_security_warning" msgid="8786238102020223650">"यह स्पीच सिंथेसिस (लिखे हुए को मशीन द्वारा बोली में बदलना) इंजन, पासवर्ड और क्रेडिट कार्ड नंबर जैसे निजी डेटा सहित आपके द्वारा बोले जाने वाले सभी लेख इकट्ठा कर सकता है. यह <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> इंजन से आता है. स्पीच सिंथेसिस इंजन के इस्तेमाल को चालू करें?"</string>
<string name="tts_engine_network_required" msgid="1190837151485314743">"लेख-से-बोली आउटपुट के लिए इस भाषा को क्रियाशील नेटवर्क कनेक्शन की आवश्यकता है."</string>
<string name="tts_default_sample_string" msgid="4040835213373086322">"यह बोली संश्लेषण का एक उदाहरण है"</string>
<string name="tts_status_title" msgid="7268566550242584413">"डिफ़ॉल्ट भाषा स्थिति"</string>
@@ -164,7 +164,7 @@
<string name="category_personal" msgid="1299663247844969448">"व्यक्तिगत"</string>
<string name="category_work" msgid="8699184680584175622">"कार्यालय"</string>
<string name="development_settings_title" msgid="215179176067683667">"डेवलपर के लिए सेटिंग और टूल"</string>
- <string name="development_settings_enable" msgid="542530994778109538">"डेवलपर के लिए सेटिंग और टूल सक्षम करें"</string>
+ <string name="development_settings_enable" msgid="542530994778109538">"डेवलपर के लिए सेटिंग और टूल चालू करें"</string>
<string name="development_settings_summary" msgid="1815795401632854041">"ऐप्स विकास के लिए विकल्प सेट करें"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"यह उपयोगकर्ता, डेवलपर के लिए सेटिंग और टूल का इस्तेमाल नहीं कर सकता"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"VPN सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string>
@@ -177,26 +177,25 @@
<string name="bugreport_in_power_summary" msgid="1778455732762984579">"गड़बड़ी की रिपोर्ट लेने के लिए पावर मेन्यू में कोई बटन दिखाएं"</string>
<string name="keep_screen_on" msgid="1146389631208760344">"स्क्रीन को चालू रखें"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज करते समय स्क्रीन कभी भी कम बैटरी मोड में नहीं जाएगी"</string>
- <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ HCI स्नूप लॉग सक्षम करें"</string>
+ <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ HCI स्नूप लॉग चालू करें"</string>
<string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"फ़ाइल के सभी ब्लूटूथ HCI पैकेट कैप्चर करें"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलॉक करना"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"बूटलोडर को अनलाॅक किए जाने की अनुमति दें"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलॉक करने की अनुमति दें?"</string>
<string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"चेतावनी: इस सेटिंग के चालू रहने पर डिवाइस सुरक्षा सुविधाएं इस डिवाइस पर काम नहीं करेंगी."</string>
- <string name="mock_location_app" msgid="7966220972812881854">"कृत्रिम स्थान वाला ऐप चुनें"</string>
- <string name="mock_location_app_not_set" msgid="809543285495344223">"कृत्रिम स्थान वाला कोई ऐप सेट नहीं है"</string>
- <string name="mock_location_app_set" msgid="8966420655295102685">"कृत्रिम स्थान वाला ऐप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="mock_location_app" msgid="7966220972812881854">"जगह की नकली जानकारी देने के लिए ऐप चुनें"</string>
+ <string name="mock_location_app_not_set" msgid="809543285495344223">"जगह की नकली जानकारी देने के लिए ऐप सेट नहीं है"</string>
+ <string name="mock_location_app_set" msgid="8966420655295102685">"जगह की नकली जानकारी देने वाला ऐप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="debug_networking_category" msgid="7044075693643009662">"नेटवर्किंग"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"वायरलेस दिखाई देने के लिए प्रमाणन"</string>
- <string name="wifi_verbose_logging" msgid="4203729756047242344">"वाई-फ़ाई वर्बोस प्रवेश सक्षम करें"</string>
+ <string name="wifi_verbose_logging" msgid="4203729756047242344">"वाई-फ़ाई वर्बोस लॉगिंग चालू करें"</string>
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"वाई-फ़ाई से मोबाइल पर ज़्यादा तेज़ी से हैंडओवर"</string>
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"हमेशा वाई-फ़ाई रोम स्कैन करने दें"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"मोबाइल डेटा हमेशा सक्रिय"</string>
- <string name="tethering_hardware_offload" msgid="7470077827090325814">"हार्डवेयर त्वरण को टेदर करना"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"हार्डवेयर से तेज़ी लाने के लिए टेदर करें"</string>
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"बिना नाम वाले ब्लूटूथ डिवाइस दिखाएं"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"पूर्ण वॉल्यूम अक्षम करें"</string>
- <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"इन-बैंड रिंग करना सक्षम करें"</string>
+ <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"इन-बैंड रिंग करना चालू करें"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लूटूथ AVRCP वर्शन"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ब्लूटूथ AVRCP वर्शन चुनें"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ब्लूटूथ ऑडियो कोडेक"</string>
@@ -209,7 +208,7 @@
<string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ब्लूटूथ ऑडियो कोडेक चुनें:\nचैनल मोड"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ब्लूटूथ ऑडियो LDAC कोडेक: प्लेबैक क्वालिटी"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ब्लूटूथ ऑडियो LDAC कोडेक चुनें:\nप्लेबैक क्वालिटी"</string>
- <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"स्ट्रीम हो रहा है: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
+ <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"चलाया जा रहा है: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस दिखाई देने के लिए प्रमाणन विकल्प दिखाएं"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाई-फ़ाई प्रवेश स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string>
<string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"इसके सक्षम होने पर, जब वाई-फ़ाई संकेत कमज़ोर हों तो वाई-फ़ाई, डेटा कनेक्शन को मोबाइल पर ज़्यादा तेज़ी से भेजेगा"</string>
@@ -224,9 +223,9 @@
<string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB कॉन्फ़िगरेशन चुनें"</string>
<string name="allow_mock_location" msgid="2787962564578664888">"कृत्रिम स्थानों को अनुमति दें"</string>
<string name="allow_mock_location_summary" msgid="317615105156345626">"कृत्रिम स्थानों को अनुमति दें"</string>
- <string name="debug_view_attributes" msgid="6485448367803310384">"दृश्य विशेषता निरीक्षण सक्षम करें"</string>
+ <string name="debug_view_attributes" msgid="6485448367803310384">"देखने वाले से जुड़े खास डेटा को रखना चालू करें"</string>
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"वाई-फ़ाई के सक्रिय रहने पर भी, हमेशा मोबाइल डेटा सक्रिय रखें (तेज़ी से नेटवर्क स्विच करने के लिए)."</string>
- <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"हार्डवेयर त्वरण को टेदर करना उपलब्ध होने पर उसका उपयोग करें"</string>
+ <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"हार्डवेयर से तेज़ी लाने के लिए टेदर करने की सुविधा मौजूद होने पर उसका इस्तेमाल करें"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB डीबग करने की अनुमति दें?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग करने का मकसद केवल डेवेलप करना है. इसका इस्तेमाल आपके कंप्यूटर और आपके डिवाइस के बीच डेटा को कॉपी करने, बिना सूचना के आपके डिवाइस पर ऐप इंस्टॉल करने और लॉग डेटा पढ़ने के लिए करें."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"उन सभी कंप्यूटरों से USB डीबग करने की पहुंचर रद्द करें, जिन्हें आपने पहले इसकी मंज़ूरी दी थी?"</string>
@@ -234,12 +233,11 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ये सेटिंग केवल विकास संबंधी उपयोग के प्रयोजन से हैं. वे आपके डिवाइस और उस पर स्थित ऐप्स को खराब कर सकती हैं या उनके दुर्व्यवहार का कारण हो सकती हैं."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB पर ऐप की पुष्टि करें"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"नुकसानदेह व्यवहार के लिए ADB/ADT के द्वारा इंस्टॉल किए गए ऐप्स जांचें."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"बिना नाम वाले ब्लूटूथ डिवाइस (केवल MAC पते वाले) दिखाए जाएंगे"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"दूरस्थ डिवाइस के साथ वॉल्यूम की समस्याओं जैसे अस्वीकार्य तेज़ वॉल्यूम या नियंत्रण की कमी की स्थिति में ब्लूटूथ पूर्ण वॉल्यूम सुविधा को अक्षम करता है."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"फ़ोन की रिंगटोन को ब्लूटूथ हेडसेट पर बजने दें"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"स्थानीय टर्मिनल"</string>
- <string name="enable_terminal_summary" msgid="67667852659359206">"स्थानीय शेल एक्सेस ऑफ़र करने वाला टर्मिनल ऐप्स सक्षम करें"</string>
+ <string name="enable_terminal_summary" msgid="67667852659359206">"लोकल शेल तक पहुंचने की सुविधा देने वाले टर्मिनल ऐप को चालू करें"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP जांच"</string>
<string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP जांच व्यवहार सेट करें"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"डीबग करना"</string>
@@ -259,7 +257,7 @@
<string name="debug_monitoring_category" msgid="7640508148375798343">"निगरानी"</string>
<string name="strict_mode" msgid="1938795874357830695">"सख्त मोड सक्षम किया गया"</string>
<string name="strict_mode_summary" msgid="142834318897332338">"जब ऐप्स मुख्य थ्रेड पर लंबी कार्यवाही करते हैं तो स्क्रीन फ़्लैश करें"</string>
- <string name="pointer_location" msgid="6084434787496938001">"सूचक स्थान"</string>
+ <string name="pointer_location" msgid="6084434787496938001">"पॉइंटर की जगह"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"मौजूदा स्पर्श डेटा दिखाने वाला स्क्रीन ओवरले"</string>
<string name="show_touches" msgid="2642976305235070316">"टैप दिखाएं"</string>
<string name="show_touches_summary" msgid="6101183132903926324">"टैप के लिए विज़ुअल फ़ीडबैक दिखाएं"</string>
@@ -274,7 +272,7 @@
<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>
- <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL चिह्न सक्षम करें"</string>
+ <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ट्रेस चालू करें"</string>
<string name="usb_audio_disable_routing" msgid="8114498436003102671">"USB ऑडियो रूटिंग अक्षम करें"</string>
<string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"USB ऑडियो पेरिफ़ेरल पर स्वत: रूटिंग अक्षम करें"</string>
<string name="debug_layout" msgid="5981361776594526155">"लेआउट सीमाएं दिखाएं"</string>
@@ -284,7 +282,7 @@
<string name="force_hw_ui" msgid="6426383462520888732">"बलपूर्वक GPU रेंडर करें"</string>
<string name="force_hw_ui_summary" msgid="5535991166074861515">"2d ड्रॉइंग के लिए GPU का बलपूर्वक उपयोग करें"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA को बाध्य करें"</string>
- <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ऐप्स में 4x MSAA को सक्षम करें"</string>
+ <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ऐप में 4x MSAA को चालू करें"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"गैर-आयताकार क्लिप परिचालनों को डीबग करें"</string>
<string name="track_frame_time" msgid="6146354853663863443">"प्रोफ़ाइल GPU रेंडरिंग"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"विंडो एनिमेशन स्केल"</string>
@@ -303,8 +301,8 @@
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"इससे कोई भी ऐप बाहरी मेमोरी में रखने लायक बन जाता है चाहे उसकी मेनिफ़ेस्ट वैल्यू कुछ भी हो"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"आकार बदले जाने के लिए गतिविधियों को बाध्य करें"</string>
<string name="force_resizable_activities_summary" msgid="6667493494706124459">"सभी गतिविधियों को मल्टी-विंडो (एक से ज़्यादा ऐप, एक साथ) के लिए आकार बदलने लायक बनाएं, चाहे उनकी मेनिफ़ेस्ट वैल्यू कुछ भी हो."</string>
- <string name="enable_freeform_support" msgid="1461893351278940416">"फ़्रीफ़ॉर्म विंडो सक्षम करें"</string>
- <string name="enable_freeform_support_summary" msgid="8247310463288834487">"प्रयोगात्मक फ़्रीफ़ॉर्म विंडो का समर्थन सक्षम करें."</string>
+ <string name="enable_freeform_support" msgid="1461893351278940416">"फ़्रीफ़ॉर्म विंडो (एक साथ कई विंडो दिखाना) चालू करें"</string>
+ <string name="enable_freeform_support_summary" msgid="8247310463288834487">"जांच के लिए बनी फ़्रीफ़ॉर्म विंडो के लिए सहायता चालू करें."</string>
<string name="local_backup_password_title" msgid="3860471654439418822">"डेस्कटॉप बैकअप पासवर्ड"</string>
<string name="local_backup_password_summary_none" msgid="6951095485537767956">"डेस्कटॉप पूर्ण बैकअप वर्तमान में सुरक्षित नहीं हैं"</string>
<string name="local_backup_password_summary_change" msgid="5376206246809190364">"डेस्कटॉप के पूर्ण बैकअप का पासवर्ड बदलने या निकालने के लिए टैप करें"</string>
@@ -323,7 +321,7 @@
</string-array>
<string name="inactive_apps_title" msgid="1317817863508274533">"बंद एेप"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"बंद है. टॉगल करने के लिए टैप करें."</string>
- <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करने पर टैप करें."</string>
+ <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करने के लिए टैप करें."</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"चल रही सेवाएं"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"वर्तमान में चल रही सेवाओं को देखें और नियंत्रित करें"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"वेबव्यू लागू करें"</string>
@@ -367,8 +365,8 @@
<string name="disabled" msgid="9206776641295849915">"अक्षम किया गया"</string>
<string name="external_source_trusted" msgid="2707996266575928037">"अनुमति है"</string>
<string name="external_source_untrusted" msgid="2677442511837596726">"अनुमति नहीं है"</string>
- <string name="install_other_apps" msgid="6986686991775883017">"अनजान ऐप्लिकेशन इंस्टॉल करें"</string>
- <string name="home" msgid="3256884684164448244">"सेटिंग होम"</string>
+ <string name="install_other_apps" msgid="6986686991775883017">"अनजान ऐप इंस्टॉल करें"</string>
+ <string name="home" msgid="3256884684164448244">"सेटिंग का होम पेज"</string>
<string-array name="battery_labels">
<item msgid="8494684293649631252">"0%"</item>
<item msgid="8934126114226089439">"50%"</item>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index fb1f546..ffc76e8 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (zadano)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Upotreba odabira sustava (zadano)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Omogućivanje izbornih kodeka"</item>
+ <item msgid="3304843301758635896">"Onemogućivanje izbornih kodeka"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Upotreba odabira sustava (zadano)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Omogućivanje izbornih kodeka"</item>
+ <item msgid="741805482892725657">"Onemogućivanje izbornih kodeka"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Upotreba odabira sustava (zadano)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 3795dde..a58561a 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nije u rasponu"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Neće se povezati automatski"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"Nema pristupa internetu"</string>
- <string name="saved_network" msgid="4352716707126620811">"Spremljeno: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="saved_network" msgid="4352716707126620811">"Spremila aplik. <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezan putem %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezan putem ocjenjivača mreže"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezano putem %1$s"</string>
@@ -171,7 +171,7 @@
<string name="tethering_settings_not_available" msgid="6765770438438291012">"Postavke dijeljenja veze nisu dostupne ovom korisniku"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Postavke pristupne točke nisu dostupne ovom korisniku"</string>
<string name="enable_adb" msgid="7982306934419797485">"Otklanjanje pogrešaka putem USB-a"</string>
- <string name="enable_adb_summary" msgid="4881186971746056635">"Otklanjanje pogrešaka s priključenim USB-om"</string>
+ <string name="enable_adb_summary" msgid="4881186971746056635">"Otklanjanje pogrešaka putem USB-a"</string>
<string name="clear_adb_keys" msgid="4038889221503122743">"Opoziv autorizacija za otklanjanje pogrešaka putem USB-a"</string>
<string name="bugreport_in_power" msgid="7923901846375587241">"Prečac izvješća o pogreškama"</string>
<string name="bugreport_in_power_summary" msgid="1778455732762984579">"Prikaži gumb u izborniku napajanja za izradu izvješća o programskim pogreškama"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvijek dopusti slobodno traženje Wi-Fi mreže"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilni podaci uvijek aktivni"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardversko ubrzanje za modemsko povezivanje"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Prikaži Bluetooth uređaje bez naziva"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogući apsolutnu glasnoću"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Omogući zvuk zvona unutar pojasne širine"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verzija AVRCP-a za Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ove su postavke namijenjene samo razvojnim programerima. One mogu uzrokovati kvar ili neželjeno ponašanje vašeg uređaja i aplikacija na njemu."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Potvrdi aplikacije putem USB-a"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Provjerite uzrokuju li aplikacije instalirane putem ADB-a/ADT-a poteškoće."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Prikazivat će se Bluetooth uređaji bez naziva (samo MAC adrese)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Onemogućuje Bluetoothovu značajku apsolutne glasnoće ako udaljeni uređaji imaju poteškoća sa zvukom, kao što su, primjerice, neprihvatljiva glasnoća ili nepostojanje kontrole."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Omogući reprodukciju melodija zvona telefona putem Bluetooth slušalica"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index b9a42fc..7ad170a 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (alapértelmezett)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Rendszerérték (alapértelmezett)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Hang: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Hang: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Nem kötelező kodekek engedélyezése"</item>
+ <item msgid="3304843301758635896">"Nem kötelező kodekek letiltása"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Rendszerérték (alapértelmezett)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Hang: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Hang: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Engedélyezi a nem kötelező kodekeket"</item>
+ <item msgid="741805482892725657">"Letiltja a nem kötelező kodekeket"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Rendszerérték (alapértelmezett)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index e22b3ce..82e7432 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi-roaming ellenőrzésének engedélyezése mindig"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"A mobilhálózati kapcsolat mindig aktív"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Internetmegosztás hardveres gyorsítása"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Név nélküli Bluetooth-eszközök megjelenítése"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Abszolút hangerő funkció letiltása"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Sávon belüli csörgetés engedélyezése"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"A Bluetooth AVRCP-verziója"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ezek a beállítások csak fejlesztői használatra szolgálnak. Használatuk esetén eszköze vagy alkalmazásai meghibásodhatnak, illetve nem várt módon viselkedhetnek."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB-n keresztül telepített alkalmazások ellenőrzése"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Az ADB/ADT útján telepített alkalmazások ellenőrzése kártékony viselkedésre."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Név nélküli Bluetooth-eszközök jelennek meg (csak MAC-címekkel)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Letiltja a Bluetooth abszolút hangerő funkcióját a távoli eszközökkel kapcsolatos hangerőproblémák – például elfogadhatatlanul magas vagy nem vezérelhető hangerő – esetén."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"A telefonon lévő csengőhangok Bluetooth-headseteken való lejátszásának engedélyezése"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Helyi végpont"</string>
diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml
index 27ea288..7406554 100644
--- a/packages/SettingsLib/res/values-hy/arrays.xml
+++ b/packages/SettingsLib/res/values-hy/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (կանխադրված)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Օգտագործել համակարգի կարգավորումը (կանխադրված)"</item>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 6c844b9..9e6e101 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -118,7 +118,7 @@
<string name="managed_user_title" msgid="8109605045406748842">"Բոլոր աշխատանքային հավելվածները"</string>
<string name="user_guest" msgid="8475274842845401871">"Հյուր"</string>
<string name="unknown" msgid="1592123443519355854">"Անհայտ"</string>
- <string name="running_process_item_user_label" msgid="3129887865552025943">"Օտատեր՝ <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
+ <string name="running_process_item_user_label" msgid="3129887865552025943">"Օգտատեր՝ <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="launch_defaults_some" msgid="313159469856372621">"Որոշ կանխադրված կարգավորումներ կան"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Կանխադրված կարգավորումներ չկան"</string>
<string name="tts_settings" msgid="8186971894801348327">"Տեքստի հնչեցման կարգավորումներ"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Միշտ թույլատրել Wi‑Fi ռոումինգի որոնումը"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Բջջային ինտերնետը միշտ ակտիվ է"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Սարքակազմի արագացման միացում"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Ցուցադրել Bluetooth սարքերն առանց անունների"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Անջատել ձայնի բացարձակ ուժգնությունը"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Միացնել ներխմբային զանգը"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP տարբերակը"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Այս կարգավորումները միայն ծրագրավորման նպատակների համար են նախատեսված: Դրանք կարող են խանգարել ձեր սարքի կամ ծրագրի աշխատանքին:"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Ստուգել հավելվածները USB-ի նկատմամբ"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Ստուգեք տեղադրված հավելվածը ADB/ADT-ի միջոցով կասկածելի աշխատանքի պատճառով:"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth սարքերը կցուցադրվեն առանց անունների (միայն MAC հասցեները)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Կասեցնում է Bluetooth-ի ձայնի բացարձակ ուժգնության գործառույթը՝ հեռավոր սարքերի հետ ձայնի ուժգնությանը վերաբերող խնդիրներ ունենալու դեպքում (օրինակ՝ երբ ձայնի ուժգնությունն անընդունելի է կամ դրա կառավարումը հնարավոր չէ):"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Ընձեռել հեռախոսի բոլոր զանգերանգների Bluetooth ականջակալներով նվագարկումը"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Տեղային տերմինալ"</string>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index 56c14b9..0e2217d 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Gunakan Pilihan Sistem (Default)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Aktifkan Codec Opsional"</item>
+ <item msgid="3304843301758635896">"Nonaktifkan Codec Opsional"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Gunakan Pilihan Sistem (Default)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Aktifkan Codec Opsional"</item>
+ <item msgid="741805482892725657">"Nonaktifkan Codec Opsional"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Gunakan Pilihan Sistem (Default)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 2838be4..5dcc045 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Selalu izinkan Pemindaian Roaming Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Data seluler selalu aktif"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Akselerasi hardware tethering"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Tampilkan perangkat Bluetooth tanpa nama"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Nonaktifkan volume absolut"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Aktifkan dering in-band"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versi AVRCP Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Setelan ini hanya dimaksudkan untuk penggunaan pengembangan. Setelan dapat menyebabkan perangkat dan aplikasi yang menerapkannya rusak atau tidak berfungsi semestinya."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikasi aplikasi melalui USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Periksa perilaku membahayakan dalam aplikasi yang terpasang melalui ADB/ADT."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Perangkat Bluetooth tanpa nama (hanya alamat MAC) akan ditampilkan"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Menonaktifkan fitur volume absolut Bluetooth jika ada masalah volume dengan perangkat jarak jauh, misalnya volume terlalu keras atau kurangnya kontrol."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Izinkan nada dering di ponsel diputar di headset Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal lokal"</string>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index c4edfd5..a8a01a4 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (sjálfgefið)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Nota val kerfisins (sjálfgefið)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> hljóð"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> hljóð"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Gera valfrjálsa kóðara virka"</item>
+ <item msgid="3304843301758635896">"Gera valfrjálsa kóðara óvirka"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Nota val kerfisins (sjálfgefið)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> hljóð"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> hljóð"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Gera valfrjálsa kóðara virka"</item>
+ <item msgid="741805482892725657">"Gera valfrjálsa kóðara óvirka"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Nota val kerfisins (sjálfgefið)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 5db0a3a..c4d6777 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Leyfa alltaf reikileit með Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Alltaf kveikt á farsímagögnum"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Vélbúnaðarhröðun fyrir tjóðrun"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Sýna Bluetooth-tæki án heita"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Slökkva á samstillingu hljóðstyrks"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Leyfa símtöl á sömu rás"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-útgáfa"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Þessar stillingar eru einungis ætlaðar í þróunarskyni. Þær geta valdið því að tækið og forrit þess bili eða starfi á rangan hátt."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Staðfesta forrit gegnum USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kanna skaðlega hegðun forrita sem sett eru upp frá ADB/ADT."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-tæki án heita (aðeins MAC-vistfang) verða birt"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Slekkur á samstillingu Bluetooth-hljóðstyrks ef vandamál koma upp með hljóðstyrk hjá fjartengdum tækjum, svo sem of hár hljóðstyrkur eða erfiðleikar við stjórnun."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Leyfa að hringitónar í símanum spilist í Bluetooth-höfuðtólum"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Staðbundin skipanalína"</string>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 40b28f0..42a246d 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (predefinita)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Usa selezione di sistema (predefinita)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Attiva codec facoltativi"</item>
+ <item msgid="3304843301758635896">"Disattiva codec facoltativi"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Usa selezione di sistema (predefinita)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Attiva codec facoltativi"</item>
+ <item msgid="741805482892725657">"Disattiva codec facoltativi"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Usa selezione di sistema (predefinita)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index b82dce8..85993aa 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Consenti sempre scansioni roaming Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Dati mobili sempre attivi"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering accelerazione hardware"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostra dispositivi Bluetooth senza nome"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disattiva volume assoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Attiva suoneria in banda"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versione Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Queste impostazioni sono utilizzabili solo a scopo di sviluppo. Possono causare l\'arresto o il comportamento anomalo del dispositivo e delle applicazioni su di esso."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifica app tramite USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Controlla che le app installate tramite ADB/ADT non abbiano un comportamento dannoso."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Verranno mostrati solo dispositivi Bluetooth senza nome (solo indirizzo MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Consente di disattivare la funzione del volume assoluto Bluetooth in caso di problemi con il volume dei dispositivi remoti, ad esempio un volume troppo alto o la mancanza di controllo."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Consenti la riproduzione delle suonerie del telefono tramite gli auricolari Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminale locale"</string>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index f069595..b8197a8 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ברירת המחדל)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"שימוש בבחירת המערכת (ברירת המחדל)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"אודיו <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"אודיו <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"הפעלה של Codecs אופציונליים"</item>
+ <item msgid="3304843301758635896">"השבתה של Codecs אופציונליים"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"השתמש בבחירת המערכת (ברירת המחדל)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"אודיו <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"אודיו <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"הפעלה של Codecs אופציונליים"</item>
+ <item msgid="741805482892725657">"השבתה של Codecs אופציונליים"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"שימוש בבחירת המערכת (ברירת המחדל)"</item>
<item msgid="8895532488906185219">"44.1 קילו-הרץ"</item>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index d73f420..df690ef 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"התר תמיד סריקות נדידה של Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"חבילת הגלישה פעילה תמיד"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"שיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"הצגת מכשירי Bluetooth ללא שמות"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"השבת עוצמת קול מוחלטת"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"הפעל צלצולים בערוץ ה-Bluetooth (in-band ringing)"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth גרסה AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"הגדרות אלה מיועדות לשימוש בפיתוח בלבד. הן עלולות לגרום למכשיר או לאפליקציות המותקנות בו לקרוס או לפעול באופן לא תקין."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"אמת אפליקציות באמצעות USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"בדוק אפליקציות שהותקנו באמצעות ADB/ADT לאיתור התנהגות מזיקה."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"יוצגו מכשירי Bluetooth ללא שמות (כתובות MAC בלבד)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"משבית את תכונת עוצמת הקול המוחלטת ב-Bluetooth במקרה של בעיות בעוצמת הקול במכשירים מרוחקים, כגון עוצמת קול רמה מדי או חוסר שליטה ברמת העוצמה."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"הפעלת רינגטונים באוזניות Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"מסוף מקומי"</string>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index 1c7d2e9..aa20097 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4(デフォルト)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"システムの選択(デフォルト)を使用"</item>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 4a57495..46b51d1 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -110,7 +110,7 @@
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"削除したアプリケーション"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"削除されたアプリとユーザー"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"USBテザリング"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB テザリング"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"ポータブルアクセスポイント"</string>
<string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetoothテザリング"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"テザリング"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fiローミングスキャンを常に許可する"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"モバイルデータを常に ON にする"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"テザリング時のハードウェア アクセラレーション"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth デバイスを名前なしで表示"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"絶対音量を無効にする"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"インバンド リンギングを有効にする"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP バージョン"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"これらの設定は開発専用に設計されています。そのため端末や端末上のアプリが故障したり正常に動作しなくなったりするおそれがあります。"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB経由のアプリを確認"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT経由でインストールされたアプリに不正な動作がないかを確認する"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth デバイスを名前なしで(MAC アドレスのみで)表示します"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"リモート端末で音量に関する問題(音量が大きすぎる、制御できないなど)が発生した場合に、Bluetooth の絶対音量の機能を無効にする。"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"スマートフォンの着信音が Bluetooth ヘッドセットで再生されることを許可する"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"ローカルターミナル"</string>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index 69ebd33..7e36f86 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ნაგულისხმევი)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"სისტემის არჩეულის გამოყენება (ნაგულისხმევი)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> აუდიო"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> აუდიო"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"არასავალდებულო კოდეკების ჩართვა"</item>
+ <item msgid="3304843301758635896">"არასავალდებულო კოდეკების გათიშვა"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"სისტემის არჩეულის გამოყენება (ნაგულისხმევი)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> აუდიო"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> აუდიო"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"არასავალდებულო კოდეკების ჩართვა"</item>
+ <item msgid="741805482892725657">"არასავალდებულო კოდეკების გათიშვა"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"სისტემის არჩეულის გამოყენება (ნაგულისხმევი)"</item>
<item msgid="8895532488906185219">"44,1 კჰც"</item>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index cbacb28c..49a6902 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -110,11 +110,11 @@
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"აპების წაშლა"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"წაშლილი აპები და მომხმარებლები"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB მოდემი"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB ტეტერინგი"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"პორტატული უსადენო ქსელი"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth-მოდემი"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"მოდემის რეჟიმი"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"მოდემი და პორტატული უსადენო ქსელი"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth ტეტერინგი"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"ტეტერინგი"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"ტეტერინგი და პორტატული უსადენო ქსელი"</string>
<string name="managed_user_title" msgid="8109605045406748842">"სამსახურის ყველა აპი"</string>
<string name="user_guest" msgid="8475274842845401871">"სტუმარი"</string>
<string name="unknown" msgid="1592123443519355854">"უცნობი"</string>
@@ -168,7 +168,7 @@
<string name="development_settings_summary" msgid="1815795401632854041">"პარამეტრების დაყენება აპების დეველოპერებისთვის"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"ამ მომხმარებლისთვის დეველოპერის პარამეტრები არ არის ხელმისაწვდომი"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"VPN პარამეტრები ამ მომხმარებლისათვის მიუწვდომელია"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"ტეთერინგის პარამეტრები ამ მომხმარებლისათვის მიუწვდომელია"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"ტეტერინგის პარამეტრები ამ მომხმარებლისათვის მიუწვდომელია"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"წვდომის წერტილის (APN) პარამეტრები ამ მომხმარებლისათვის მიუწვდომელია"</string>
<string name="enable_adb" msgid="7982306934419797485">"USB გამართვა"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"გამართვის რეჟიმი, როდესაც USB შეერთებულია"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi Roam სკანირების მუდამ დაშვება"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"მობილური ინტერნეტის ყოველთვის გააქტიურება"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ტეტერინგის აპარატურული აჩქარება"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth-მოწყობილობების ჩვენება სახელების გარეშე"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ხმის აბსოლუტური სიძლიერის გათიშვა"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ზოლსშიდა დარეკვის ჩართვა"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth-ის AVRCP-ის ვერსია"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ამ პარამეტრების გამოყენება დასაშვებია მხოლოდ დეველოპერული მიზნებით. მათმა გამოყენებამ შეიძლება გამოიწვიოს თქვენი მოწყობილობის და მისი აპლიკაციების დაზიანება ან გაუმართავი მუშაობა."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"აპლიკაციების USB-ს საშუალებით შემოწმება"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"შეამოწმეთ, რამდენად უსაფრთხოა ADB/ADT-ის საშუალებით ინსტალირებული აპლიკაციები."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-მოწყობილობები ნაჩვენები იქნება სახელების გარეშე (მხოლოდ MAC-მისამართები)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"გათიშავს Bluetooth-ის ხმის აბსოლუტური სიძლიერის ფუნქციას დისტანციურ მოწყობილობებზე ხმასთან დაკავშირებული ისეთი პრობლემების არსებობის შემთხვევაში, როგორიცაა ხმის დაუშვებლად მაღალი სიძლიერე ან კონტროლის შეუძლებლობა."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ტელეფონის ზარების Bluetooth-ყურსაცვამებზე დაკვრის დაშვება"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"ადგილობრივი ტერმინალი"</string>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index 2fb35e0..b0ba2ff 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (әдепкі)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Жүйені таңдау (әдепкі)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудиокодегі"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудиокодегі"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Қосымша кодектерді қосу"</item>
+ <item msgid="3304843301758635896">"Қосымша кодектерді өшіру"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Жүйені таңдау (әдепкі)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудиокодегі"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудиокодегі"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Қосымша кодектерді қосу"</item>
+ <item msgid="741805482892725657">"Қосымша кодектерді өшіру"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Жүйені таңдау (әдепкі)"</item>
<item msgid="8895532488906185219">"44,1 кГц"</item>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 354e0b5..7dea44a 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi роумингін іздеулерге әрқашан рұқсат ету"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Мобильдік деректер әрқашан қосулы"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Тетерингтің аппараттық жеделдетуі"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Атаусыз Bluetooth құрылғыларын көрсету"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Абсолютті дыбыс деңгейін өшіру"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Ішкі жолақтағы шылдырлауды қосу"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP нұсқасы"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Бұл параметрлер жетілдіру мақсатында ғана қолданылады. Олар құрылғыңыз бен қолданбаларыңыздың бұзылуына немесе әдеттен тыс әрекеттерге себеп болуы мүмкін."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB арқылы орнатылған қолданбаларды растау"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT арқылы орнатылған қолданбалардың залалды болмауын тексеру."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Атаусыз Bluetooth құрылғылары (тек MAC мекенжайымен) көрсетіледі"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Қолайсыз қатты дыбыс деңгейі немесе басқарудың болмауы сияқты қашықтағы құрылғыларда дыбыс деңгейімен мәселелер жағдайында Bluetooth абсолютті дыбыс деңгейі функциясын өшіреді."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Телефондағы қоңырау әуендерінің Bluetooth құлақаспабында ойнатылуына мүмкіндік беру"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Жергілікті терминал"</string>
diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml
index 43406c0..3cbdc37 100644
--- a/packages/SettingsLib/res/values-km/arrays.xml
+++ b/packages/SettingsLib/res/values-km/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (លំនាំដើម)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"ប្រើការជ្រើសរើសប្រព័ន្ធ (លំនាំដើម)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g>សំឡេង <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g>សំឡេង <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"បើកកូឌិកប្រភេទស្រេចចិត្ត"</item>
+ <item msgid="3304843301758635896">"បិទកូឌិកប្រភេទស្រេចចិត្ត"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"ប្រើការជ្រើសរើសប្រព័ន្ធ (លំនាំដើម)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g>សំឡេង <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g>សំឡេង <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"បើកកូឌិកប្រភេទស្រេចចិត្ត"</item>
+ <item msgid="741805482892725657">"បិទកូឌិកប្រភេទស្រេចចិត្ត"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"ប្រើការជ្រើសរើសប្រព័ន្ធ (លំនាំដើម)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index f980066..4dd298d 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"តែងតែអនុញ្ញាតការវិភាគរ៉ូមវ៉ាយហ្វាយ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"ទិន្នន័យទូរសព្ទចល័តដំណើរការជានិច្ច"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ការបង្កើនល្បឿនផ្នែករឹងសម្រាប់ការភ្ជាប់"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"បង្ហាញឧបករណ៍ប្ល៊ូធូសគ្មានឈ្មោះ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"បិទកម្រិតសំឡេងលឺខ្លាំង"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"បើកការរោទ៍ក្នុងបណ្តាញ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"កំណែប្ល៊ូធូស AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ការកំណត់ទាំងនេះសម្រាប់តែការប្រើក្នុងការអភិវឌ្ឍប៉ុណ្ណោះ។ ពួកវាអាចធ្វើឲ្យឧបករណ៍ និងកម្មវិធីរបស់អ្នកខូច ឬដំណើរមិនត្រឹមត្រូវ។"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"ផ្ទៀងផ្ទាត់កម្មវិធីតាមយូអេសប៊ី"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ពិនិត្យកម្មវិធីបានដំឡើងតាមរយៈ ADB/ADT សម្រាប់ឥរិយាបថដែលគ្រោះថ្នាក់។"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"ឧបករណ៍ប្ល៊ូធូសគ្មានឈ្មោះ (អាសយដ្ឋាន MAC តែប៉ុណ្ណោះ) នឹងបង្ហាញ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"បិទលក្ខណៈពិសេសកម្រិតសំឡេងលឺខ្លាំងពេលភ្ជាប់ប៊្លូធូសក្នុងករណីមានបញ្ហាជាមួយឧបករណ៍បញ្ជាពីចម្ងាយ ដូចជាកម្រិតសំឡេងលឺខ្លាំងដែលមិនអាចទទួលយកបាន ឬខ្វះការគ្រប់គ្រង។"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"អនុញ្ញាតឲ្យសំឡេងរោទ៍នៅលើទូរសព្ទបញ្ចេញសំឡេងតាមរយៈកាសប្ល៊ូធូស"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"ស្ថានីយមូលដ្ឋាន"</string>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 54eebda..455b0a9 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ಡಿಫಾಲ್ಟ್)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"ಸಿಸ್ಟಂ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ (ಡಿಫಾಲ್ಟ್)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ಆಡಿಯೋ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ಆಡಿಯೋ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</item>
+ <item msgid="3304843301758635896">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"ಸಿಸ್ಟಂ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ (ಡಿಫಾಲ್ಟ್)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ಆಡಿಯೋ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ಆಡಿಯೋ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</item>
+ <item msgid="741805482892725657">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"ಸಿಸ್ಟಂ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ (ಡಿಫಾಲ್ಟ್)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 40dea01..bbfef4b 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_not_in_range" msgid="1136191511238508967">"ವ್ಯಾಪ್ತಿಯಲ್ಲಿಲ್ಲ"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವಿಲ್ಲ"</string>
- <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> ರಿಂದ ಉಳಿಸಲಾಗಿದೆ"</string>
+ <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> ನಿಂದ ಉಳಿಸಲಾಗಿದೆ"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ನೆಟ್ವರ್ಕ್ ರೇಟಿಂಗ್ ಒದಗಿಸುವವರ ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
@@ -94,7 +94,7 @@
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ಜೋಡಿ"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ಜೋಡಿ ಮಾಡು"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ರದ್ದುಮಾಡಿ"</string>
- <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ಸಂಪರ್ಕಪಡಿಸಿದಾಗ, ಜೋಡಿಸುವಿಕೆಯು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆ ಇತಿಹಾಸಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ಸಂಪರ್ಕಗೊಳಿಸಿದಾಗ, ಜೋಡಿಸುವಿಕೆಯು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆ ಇತಿಹಾಸಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಜೊತೆಗೆ ಜೋಡಣೆ ಮಾಡಲಾಗಲಿಲ್ಲ."</string>
<string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ತಪ್ಪಾಗಿರುವ ಪಿನ್ ಅಥವಾ ಪಾಸ್ಕೀ ಕಾರಣದಿಂದಾಗಿ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಜೊತೆಗೆ ಜೋಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಜೊತೆಗೆ ಸಂವಹನ ನಡೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ವೈ-ಫೈ ರೋಮ್ ಸ್ಕ್ಯಾನ್ಗಳನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"ಮೊಬೈಲ್ ಡೇಟಾ ಯಾವಾಗಲೂ ಸಕ್ರಿಯ"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ಹಾರ್ಡ್ವೇರ್ನ ವೇಗವರ್ಧನೆಯನ್ನು ಟೆಥರಿಂಗ್ ಮಾಡಿ"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"ಹೆಸರುಗಳಿಲ್ಲದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ತೋರಿಸಿ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ಸಂಪೂರ್ಣ ವಾಲ್ಯೂಮ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ಇನ್ ಬ್ಯಾಂಡ್ ರಿಂಗಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ಬ್ಲೂಟೂತ್ AVRCP ಆವೃತ್ತಿ"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ಈ ಸೆಟ್ಟಿಂಗ್ಗಳು ಅಭಿವೃದ್ಧಿಯ ಬಳಕೆಗೆ ಮಾತ್ರ. ಅವುಗಳು ನಿಮ್ಮ ಸಾಧನ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಧಕ್ಕೆ ಮಾಡಬಹುದು ಅಥವಾ ಅವು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರುವಂತೆ ಮಾಡಬಹುದು."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ಮೂಲಕ ಆಪ್ ಪರಿಶೀಲಿಸಿ"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ಹಾನಿಮಾಡುವಂತಹ ವರ್ತನೆಗಾಗಿ ADB/ADT ಮೂಲಕ ಸ್ಥಾಪಿಸಲಾದ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"ಹೆಸರುಗಳಿಲ್ಲದ (ಕೇವಲ MAC ವಿಳಾಸಗಳು ಮಾತ್ರ) ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ರಿಮೋಟ್ ಸಾಧನಗಳೊಂದಿಗೆ ಒಪ್ಪಲಾಗದ ಜೋರಾದ ವಾಲ್ಯೂಮ್ ಅಥವಾ ನಿಯಂತ್ರಣದ ಕೊರತೆಯಂತಹ ವಾಲ್ಯೂಮ್ ಸಮಸ್ಯೆಗಳಂತಹ ಸಂದರ್ಭದಲ್ಲಿ ಬ್ಲೂಟೂತ್ ಸಂಪೂರ್ಣ ವಾಲ್ಯೂಮ್ ವೈಶಿಷ್ಟ್ಯವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ಫೋನ್ನ ರಿಂಗ್ಟೋನ್ಗಳನ್ನು ಬ್ಲೂಟೂತ್ ಹೆಡ್ಸೆಟ್ಗಳಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲು ಅನುಮತಿ ನೀಡಿ"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"ಸ್ಥಳೀಯ ಟರ್ಮಿನಲ್"</string>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index 57b6911..3dbf759 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4(기본)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"시스템 설정 사용(기본)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 오디오"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 오디오"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"선택사항 코덱 사용 설정"</item>
+ <item msgid="3304843301758635896">"선택사항 코덱 사용 중지"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"시스템 설정 사용(기본)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 오디오"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 오디오"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"선택사항 코덱 사용 설정"</item>
+ <item msgid="741805482892725657">"선택사항 코덱 사용 중지"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"시스템 설정 사용(기본)"</item>
<item msgid="8895532488906185219">"44.1kHz"</item>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 5c89d8b..6633558 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi 로밍 스캔 항상 허용"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"항상 모바일 데이터 활성화"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"테더링 하드웨어 가속"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"이름이 없는 블루투스 기기 표시"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"절대 볼륨 사용 안함"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"대역 내 벨소리 사용 설정"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"블루투스 AVRCP 버전"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"이 설정은 개발자용으로만 설계되었습니다. 이 설정을 사용하면 기기 및 애플리케이션에 예기치 않은 중단이나 오류가 발생할 수 있습니다."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB를 통해 설치된 앱 확인"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT을 통해 설치된 앱에 유해한 동작이 있는지 확인"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"이름이 없이 MAC 주소만 있는 블루투스 기기가 표시됩니다."</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"참기 어려울 정도로 볼륨이 크거나 제어가 되지 않는 등 원격 기기에서 볼륨 문제가 발생할 경우 블루투스 절대 볼륨 기능을 사용 중지합니다."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"휴대전화의 벨소리가 블루투스 헤드셋에서 재생되도록 허용"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"로컬 터미널"</string>
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index bb4da49..721bfaa7 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Демейки)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Тутум тандаганды колдонуу (демейки)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Кошумча кодекстер иштетилсин"</item>
+ <item msgid="3304843301758635896">"Кошумча кодекстер өчүрүлсүн"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Тутум тандаганды колдонуу (демейки)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Кошумча кодекстер иштетилсин"</item>
+ <item msgid="741805482892725657">"Кошумча кодекстер өчүрүлсүн"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Тутум тандаганды колдонуу (демейки)"</item>
<item msgid="8895532488906185219">"44,1 кГц"</item>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 6680d07..e59d3f8 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -122,7 +122,7 @@
<string name="launch_defaults_some" msgid="313159469856372621">"Айрым демейки параметрлер туураланды"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Демейкилер коюлган жок"</string>
<string name="tts_settings" msgid="8186971894801348327">"Кеп синтезаторунун жөндөөлөрү"</string>
- <string name="tts_settings_title" msgid="1237820681016639683">"Текстти-оозекилөө"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"Кеп синтезатору"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"Кеп ылдамдыгы"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Текст айтылчу ылдамдык"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"Негизги тон"</string>
@@ -136,7 +136,7 @@
<string name="tts_install_data_title" msgid="4264378440508149986">"Үн дайындарын орнотуу"</string>
<string name="tts_install_data_summary" msgid="5742135732511822589">"Кеп синтезине керектүү үн дайындарын орнотуңуз"</string>
<string name="tts_engine_security_warning" msgid="8786238102020223650">"Бул кепти синтездөө каражаты бардык айтыла турган текстти, анын ичинде сырсөздөр жана насыя карточкасынын номери сыяктуу жеке маалыматты, топтошу мүмкүн. Ал <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> каражатынан алынат. Бул кепти синтездөө каражаты колдонулсунбу?"</string>
- <string name="tts_engine_network_required" msgid="1190837151485314743">"Бул тилде текстти-оозекилөө үчүн иштеп турган интернет-байланыш керек."</string>
+ <string name="tts_engine_network_required" msgid="1190837151485314743">"Бул тилде кеп синтезаторун иштетүү үчүн Интернетке туташуу керек."</string>
<string name="tts_default_sample_string" msgid="4040835213373086322">"Бул айтылганды синтездөөнүн мисалы"</string>
<string name="tts_status_title" msgid="7268566550242584413">"Абалкы тилдин абалы"</string>
<string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> толук колдоого алынган"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi Роуминг Скандоо мүмкүнчүлүгүнө ар дайым уруксат берилсин"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Мобилдик Интернет иштей берсин"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Тетерингдин иштешин тездетүү"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Аталышсыз Bluetooth түзмөктөрү көрсөтүлсүн"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Үндүн абсолюттук деңгээли өчүрүлсүн"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Канал аралык чалууну иштетүү"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP версиясы"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Бул орнотуулар өндүрүүчүлөр үчүн гана берилген. Булар түзмөгүңүздүн колдонмолорун бузулушуна же туура эмес иштешине алып келиши мүмкүн."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB аркылуу келген колдонмолорду ырастоо"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT аркылуу орнотулган колдонмолорду зыянкечтикке текшерүү."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Аталышсыз Bluetooth түзмөктөрү (MAC даректери менен гана) көрсөтүлөт"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Алыскы түзмөктөр өтө катуу добуш чыгарып же көзөмөлдөнбөй жатса Bluetooth \"Үндүн абсолюттук деңгээли\" функциясын өчүрөт."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Телефондогу рингтондор Bluetooth гарнитурасында ойнотулсун"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Жергиликтүү терминал"</string>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index 5b546ff..6aa8ffc 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Use System Selection (Default)"</item>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 25809e1..20869a7 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ອະນຸຍາດການສະແກນການໂຣມ Wi‑Fi ສະເໝີ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"ເປີດໃຊ້ອິນເຕີເນັດມືຖືຕະຫຼອດເວລາ"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ເປີດໃຊ້ການເລັ່ງຄວາມໄວດ້ວຍຮາດແວ"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"ສະແດງອຸປະກອນ Bluetooth ທີ່ບໍ່ມີຊື່"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ປິດໃຊ້ລະດັບສຽງສົມບູນ"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ເປີດສຽງເຕືອນແບບອິນແບນ"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ເວີຊັນ Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ການຕັ້ງຄ່າເຫຼົ່ານີ້ແມ່ນມີຈຸດປະສົງເພື່ອການພັດທະນາເທົ່ານັ້ນ. ພວກມັນສາມາດເຮັດໃຫ້ອຸປະກອນ ແລະແອັບພລິເຄຊັນຂອງທ່ານຢຸດເຮັດວຽກ ຫຼືເຮັດວຽກຜິດປົກກະຕິໄດ້."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"ຢືນຢັນແອັບຯຜ່ານທາງ USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ກວດສອບແອັບຯທີ່ຕິດຕັ້ງແລ້ວຜ່ານທາງ ADB/ADT ເພື່ອກວດຫາພຶດຕິກຳທີ່ເປັນອັນຕະລາຍ."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"ຈະສະແດງອຸປະກອນ Bluetooth ທີ່ບໍ່ມີຊື່ (ທີ່ຢູ່ MAC ເທົ່ານັ້ນ)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ປິດໃຊ້ຄຸນສົມບັດລະດັບສຽງສົມບູນຂອງ Bluetooth ໃນກໍລະນີເກີດບັນຫາລະດັບສຽງສົມບູນກັບອຸປະກອນທາງໄກ ເຊັ່ນວ່າ ລະດັບສຽງດັງເກີນຍອມຮັບໄດ້ ຫຼື ຄວບຄຸມບໍ່ໄດ້."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ເປີດໃຫ້ສຽງຣິງໂທນຢູ່ໂທລະສັບດັງໃນຫູຟັງ Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal ໃນໂຕເຄື່ອງ"</string>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 1276e2b..b4407ea 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (numatytoji)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Naudoti sistemos pasirink. (numatytasis)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> garsas"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> garsas"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Įgalinti nebūtinus kodekus"</item>
+ <item msgid="3304843301758635896">"Išjungti nebūtinus kodekus"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Naudoti sistemos pasirink. (numatytasis)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> garsas"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> garsas"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Įgalinti nebūtinus kodekus"</item>
+ <item msgid="741805482892725657">"Išjungti nebūtinus kodekus"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Naudoti sistemos pasirink. (numatytasis)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 5c8c5db..8d17a3a 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Visada leisti „Wi-Fi“ tarptiklinio ryšio nuskaitymą"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobiliojo ryšio duomenys visada suaktyvinti"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Įrenginio kaip modemo naudojimo aparatinės įrangos spartinimas"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Rodyti „Bluetooth“ įrenginius be pavadinimų"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Išjungti didžiausią garsą"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Įgalinti diapazono skambėjimą"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"„Bluetooth“ AVRCP versija"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Šie nustatymai skirti tik kūrėjams. Nustačius juos įrenginys ir jame naudojamos programos gali nustoti veikti arba veikti netinkamai."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Patvirtinti progr. naudojant USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Patikrinkite, ar programų, įdiegtų naudojant ADB / ADT, veikimas nėra žalingas."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bus rodomi „Bluetooth“ įrenginiai be pavadinimų (tik MAC adresai)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Išjungiama „Bluetooth“ didžiausio garso funkcija, jei naudojant nuotolinio valdymo įrenginius kyla problemų dėl garso, pvz., garsas yra per didelis arba jo negalima tinkamai valdyti."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Leisti telefono skambėjimo tonus per „Bluetooth“ ausines"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Vietinis terminalas"</string>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 9cc2702..09fc613 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (noklusējuma)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Sistēmas atlases izmantošana (nokl.)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Iespējot neobligātos kodekus"</item>
+ <item msgid="3304843301758635896">"Atspējot neobligātos kodekus"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Sistēmas atlases izmantošana (nokl.)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Iespējot neobligātos kodekus"</item>
+ <item msgid="741805482892725657">"Atspējot neobligātos kodekus"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Sistēmas atlases izmantošana (nokl.)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 0898624..101b30b 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vienmēr atļaut Wi‑Fi meklēšanu"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Vienmēr aktīvs mobilo datu savienojums"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Paātrināta aparatūras darbība piesaistei"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Rādīt Bluetooth ierīces bez nosaukumiem"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Atspējot absolūto skaļumu"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Iespējot iekšjoslas zvanīšanu"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP versija"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Šie iestatījumi ir paredzēti tikai izstrādei. To dēļ var tikt pārtraukta vai traucēta ierīces un lietojumprogrammu darbība."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificēt, ja instalētas no USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Pārbaudīt, vai lietotņu, kuru instalēšanai izmantots ADB/ADT, darbība nav kaitīga."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Tiks parādītas Bluetooth ierīces bez nosaukumiem (tikai MAC adreses)."</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Atspējo Bluetooth absolūtā skaļuma funkciju skaļuma problēmu gadījumiem attālajās ierīcēs, piemēram, ja ir nepieņemami liels skaļums vai nav iespējas kontrolēt skaļumu."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Atļaut tālrunī esošo zvana signālu atskaņošanu Bluetooth austiņās"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Vietējā beigu lietotne"</string>
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index a204da6..2d9d73ce 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Стандардно)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Користи избор на системот (стандардно)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Овозможување на „Кодеци по избор“"</item>
+ <item msgid="3304843301758635896">"Оневозможување на „Кодеци по избор“"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Користи избор на системот (стандардно)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Овозможи ја „Кодеци по избор“"</item>
+ <item msgid="741805482892725657">"Оневозможи ја „Кодеци по избор“"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Користи избор на системот (стандардно)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 8377fd5..40feed0 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Секогаш дозволувај Wi‑Fi скенирање во роаминг"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Мобилниот интернет е секогаш активен"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Хардверско забрзување за врзување"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Прикажувај уреди со Bluetooth без имиња"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Оневозможете апсолутна јачина на звук"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Овозможете ѕвонење во појас"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Верзија Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Овие поставки се наменети само за употреба за развој. Тие може да предизвикаат уредот и апликациите во него да се расипат или да се однесуваат необично."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Потврди апликации преку USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Провери апликации инсталирани преку ADB/ADT за штетно однесување."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Уредите со Bluetooth без имиња (само MAC-адреси) ќе се прикажуваат"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Ја оневозможува карактеристиката за апсолутна јачина на звук преку Bluetooth во случај кога ќе настанат проблеми со далечинските уреди, како на пр., неприфатливо силен звук или недоволна контрола."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Дозволи мелодиите на телефонот да се пуштаат на Bluetooth слушалките"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Локален терминал"</string>
diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml
index bf58608..121c287 100644
--- a/packages/SettingsLib/res/values-ml/arrays.xml
+++ b/packages/SettingsLib/res/values-ml/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ഡിഫോൾട്ട്)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"സിസ്റ്റം സെലക്ഷൻ ഉപയോഗിക്കൂ (ഡിഫോൾട്ട്)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ഓഡിയോ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ഓഡിയോ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനക്ഷമമാക്കുക"</item>
+ <item msgid="3304843301758635896">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനരഹിതമാക്കുക"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"സിസ്റ്റം സെലക്ഷൻ ഉപയോഗിക്കൂ (ഡിഫോൾട്ട്)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ഓഡിയോ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ഓഡിയോ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനക്ഷമമാക്കുക"</item>
+ <item msgid="741805482892725657">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനരഹിതമാക്കുക"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"സിസ്റ്റം സെലക്ഷൻ ഉപയോഗിക്കൂ (ഡിഫോൾട്ട്)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 63704f4..40525ed 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"എപ്പോഴും വൈഫൈ റോം സ്കാൻ അനുവദിക്കൂ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"മൊബൈൽ ഡാറ്റ എല്ലായ്പ്പോഴും സജീവം"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ടെതറിംഗ് ഹാർഡ്വെയർ ത്വരിതപ്പെടുത്തൽ"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"പേരില്ലാത്ത Bluetooth ഉപകരണങ്ങൾ കാണിക്കുക"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"അബ്സൊല്യൂട്ട് വോളിയം പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ഇൻ-ബാൻഡ് റിംഗുചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP പതിപ്പ്"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ഈ ക്രമീകരണങ്ങൾ വികസന ഉപയോഗത്തിന് മാത്രമായുള്ളതാണ്. അവ നിങ്ങളുടെ ഉപകരണവും അതിലെ അപ്ലിക്കേഷനുകളും തകരാറിലാക്കുന്നതിനോ തെറ്റായി പ്രവർത്തിക്കുന്നതിനോ ഇടയാക്കാം."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB വഴി ആപ്സ് പരിശോധിച്ചുറപ്പിക്കൂ"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"കേടാക്കുന്ന പ്രവർത്തനരീതിയുള്ള ADB/ADT വഴി ഇൻസ്റ്റാളുചെയ്ത അപ്ലിക്കേഷനുകൾ പരിശോധിക്കുക."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"പേരില്ലാത്ത Bluetooth ഉപകരണങ്ങൾ (MAC വിലാസങ്ങൾ മാത്രം) പ്രദർശിപ്പിക്കും"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"അസ്വീകാര്യമായ തരത്തിൽ ഉയർന്ന വോളിയമോ ശബ്ദ നിയന്ത്രണത്തിന്റെ അഭാവമോ പോലെ, വിദൂര ഉപകരണങ്ങളുമായി ബന്ധപ്പെട്ട വോളിയം പ്രശ്നങ്ങൾ ഉണ്ടാകുന്ന സാഹചര്യത്തിൽ, Bluetooth അബ്സൊല്യൂട്ട് വോളിയം ഫീച്ചർ പ്രവർത്തനരഹിതമാക്കുന്നു."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ഫോണിലെ റിംഗ്ടോണുകൾ Bluetooth ഹെഡ്സെറ്റുകളിൽ പ്ലേ ചെയ്യാനായി അനുവദിക്കുക"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"പ്രാദേശിക ടെർമിനൽ"</string>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index 01c36bf..73f4099 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Өгөгдмөл)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Системийн сонголтыг ашиглах (Өгөгдмөл)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Нэмэлт кодлогчийг идэвхжүүлэх"</item>
+ <item msgid="3304843301758635896">"Нэмэлт кодлогчийг идэвхгүй болгох"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Системийн сонголтыг ашиглах (Өгөгдмөл)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Нэмэлт кодлогчийг идэвхжүүлэх"</item>
+ <item msgid="741805482892725657">"Нэмэлт кодлогчийг идэвхгүй болгох"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Системийн сонголтыг ашиглах (Өгөгдмөл)"</item>
<item msgid="8895532488906185219">"44.1 кГц"</item>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 4da11e5..f6abd54 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi Роум сканыг байнга зөвшөөрөх"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Мобайл дата байнга идэвхтэй"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Модем болгох хардвер хурдасгуур"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Нэргүй Bluetooth төхөөрөмжийг харуулах"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Үнэмлэхүй дууны түвшинг идэвхгүй болгох"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Сүлжээний хонхны аяыг идэвхжүүлэх"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP хувилбар"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Эдгээр тохиргоо нь зөвхөн хөгжүүлэлтэд ашиглах зорилготой. Эдгээр нь таны төхөөрөмж буюу түүн дээрх аппликейшнүүдийг эвдрэх, буруу ажиллах шалтгаан нь болж болно."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Апп-г USB-р тулгах"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT-р суулгасан апп-уудыг хорлонтой авиртай эсэхийг шалгах."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Нэргүй Bluetooth төхөөрөмжийг (зөвхөн MAC хаяг) харуулна"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Хэт чанга дуугаралт эсвэл муу тохиргоо зэрэг алсын зайн төхөөрөмжийн дуугаралттай холбоотой асуудлын үед Bluetooth-ийн үнэмлэхүй дууны түвшинг идэвхгүй болго."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Утасны хонхны аяыг Bluetooth чихэвчээр тоглуулахыг зөвшөөрөх"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Локал терминал"</string>
diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml
index c983cfd..6064949 100644
--- a/packages/SettingsLib/res/values-mr/arrays.xml
+++ b/packages/SettingsLib/res/values-mr/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (डीफॉल्ट)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"प्रणाली निवड वापरा (डीफॉल्ट)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ऑडिओ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ऑडिओ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"पर्यायी कोडेक सक्षम करा"</item>
+ <item msgid="3304843301758635896">"पर्यायी कोडेक अक्षम करा"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"प्रणाली निवड वापरा (डीफॉल्ट)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ऑडिओ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ऑडिओ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"पर्यायी कोडेक सक्षम करा"</item>
+ <item msgid="741805482892725657">"पर्यायी कोडेक अक्षम करा"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"प्रणाली निवड वापरा (डीफॉल्ट)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 7cb7509..99dd3a1 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -66,7 +66,7 @@
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मीडिया ऑडिओ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"फोन कॉल"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"फाइल स्थानांतरण"</string>
- <string name="bluetooth_profile_hid" msgid="3680729023366986480">"इनपुट डीव्हाइस"</string>
+ <string name="bluetooth_profile_hid" msgid="3680729023366986480">"इनपुट डिव्हाइस"</string>
<string name="bluetooth_profile_pan" msgid="3391606497945147673">"इंटरनेट अॅक्सेस"</string>
<string name="bluetooth_profile_pbap" msgid="5372051906968576809">"संपर्क सामायिकरण"</string>
<string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"संपर्क सामायिकरणासाठी वापरा"</string>
@@ -182,7 +182,7 @@
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलॉक करणे"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"बूटलोडर अनलॉक करण्यासाठी अनुमती द्या"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलॉक करण्यास अनुमती द्यायची?"</string>
- <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"चेतावणी: हे सेटिंग चालू असताना या डीव्हाइस वर डीव्हाइस संरक्षण वैशिष्ट्ये काम करणार नाहीत."</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"चेतावणी: हे सेटिंग चालू असताना या डिव्हाइस वर डिव्हाइस संरक्षण वैशिष्ट्ये काम करणार नाहीत."</string>
<string name="mock_location_app" msgid="7966220972812881854">"बनावट स्थान अॅप निवडा"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"कोणताही बनावट स्थान अॅप सेट केला नाही"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"बनावट स्थान अॅप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"वाय-फाय रोम स्कॅनला नेहमी अनुमती द्या"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"मोबाइल डेटा नेहमी सक्रिय"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"टेदरिंग हार्डवेअर प्रवेग"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"नावांशिवाय ब्लूटूथ डिव्हाइस दाखवा"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"संपूर्ण आवाज अक्षम करा"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"इन-बँड रिंगिंग सक्षम करा"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लूटूथ AVRCP आवृत्ती"</string>
@@ -228,14 +227,13 @@
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"जरी वाय-फाय चालू असले तरीही, मोबाईल डेटा नेहमी चालू ठेवा (नेटवर्क जलदरीत्या स्विच करण्यासाठी)."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"उपलब्ध असल्यास टेदरिंग हार्डवेअर प्रवेग वापरा"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB डीबग करण्यास अनुमती द्यायची?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग करण्याचा हेतू फक्त विकास उद्देशांसाठी आहे. याचा वापर तुमचा कॉंप्युटर आणि तुमचे डीव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय तुमच्या डीव्हाइस वर अॅप्स इंस्टॉल करा आणि लॉग डेटा वाचा."</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"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="dev_settings_warning_message" msgid="2298337781139097964">"या सेटिंग्जचा हेतू फक्त विकास वापरासाठी आहे. त्यामुळे तुमचे डिव्हाइस आणि त्यावरील अॅप्लिकेशन ब्रेक होऊ शकतात किंवा नेहमीपेक्षा वेगळे वर्तन करू शकतात."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB वर अॅप्स पडताळून पाहा"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"हानिकारक वर्तनासाठी ADB/ADT द्वारे इंस्टॉल अॅप्स तपासा."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"नावांशिवाय ब्लूटूथ डीव्हाइस (फक्त MAC पत्ते) दाखवले जातील"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"दूरस्थ डीव्हाइसमध्ये सहन न होणारा मोठा आवाज किंवा नियंत्रणचा अभाव यासारखी आवाजाची समस्या असल्यास ब्लूटूथ संपूर्ण आवाज वैशिष्ट्य अक्षम करते."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"फोनवरील रिंगटोन ब्लूटूथ हेडसेटवर वाजू द्या"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"स्थानिक टर्मिनल"</string>
@@ -300,9 +298,9 @@
<string name="show_notification_channel_warnings" msgid="1399948193466922683">"सूचना चॅनेल चेतावण्या दाखवा"</string>
<string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"एखादे अॅप वैध चॅनेलशिवाय सूचना पोस्ट करते तेव्हा स्क्रीनवर चेतावणी देते"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यवर अॅप्सना अनुमती देण्याची सक्ती करा"</string>
- <string name="force_allow_on_external_summary" msgid="3640752408258034689">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, कोणत्याही अॅपला बाह्य संचयनावर लेखन केले जाण्यासाठी पात्र बनविते"</string>
+ <string name="force_allow_on_external_summary" msgid="3640752408258034689">"manifest मूल्यांकडे दुर्लक्ष करून, कोणत्याही अॅपला बाह्य स्टोरेजवर लेखन केले जाण्यासाठी पात्र बनविते"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"क्रियाकलापाचा आकार बदलण्यायोग्य होण्याची सक्ती करा"</string>
- <string name="force_resizable_activities_summary" msgid="6667493494706124459">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, एकाधिक-विंडोसाठी सर्व क्रियाकलापांचा आकार बदलण्यायोग्य करा."</string>
+ <string name="force_resizable_activities_summary" msgid="6667493494706124459">"manifest मूल्यांकडे दुर्लक्ष करून, एकाधिक-विंडोसाठी सर्व क्रियाकलापांचा आकार बदलण्यायोग्य करा."</string>
<string name="enable_freeform_support" msgid="1461893351278940416">"freeform विंडो सक्षम करा"</string>
<string name="enable_freeform_support_summary" msgid="8247310463288834487">"प्रायोगिक मुक्तस्वरूपाच्या विंडोसाठी समर्थन सक्षम करा."</string>
<string name="local_backup_password_title" msgid="3860471654439418822">"डेस्कटॉप बॅकअप संकेतशब्द"</string>
@@ -388,7 +386,7 @@
<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>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"सिस्टम भाषा वापरा"</string>
<string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> साठी सेटिंग्ज उघडण्यात अयशस्वी"</string>
<string name="ime_security_warning" msgid="4135828934735934248">"ही इनपुट पद्धत संकेतशब्द आणि क्रेडिट कार्ड नंबर यासह, आपण टाइप करता तो सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. ही <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> अॅपवरून येते. ही इनपुट पद्धत वापरायची?"</string>
<string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"टीप: रीबूट केल्यानंतर, तुम्ही आपला फोन अनलॉक करे पर्यंत हे अॅप सुरू होऊ शकत नाही"</string>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index 9338c02..915814f 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Lalai)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Gunakan Pilihan Sistem (Lalai)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Dayakan Codec Pilihan"</item>
+ <item msgid="3304843301758635896">"Lumpuhkan Codec Pilihan"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Gunakan Pilihan Sistem (Lalai)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Dayakan Codec Pilihan"</item>
+ <item msgid="741805482892725657">"Lumpuhkan Codec Pilihan"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Gunakan Pilihan Sistem (Lalai)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index e3a86f7..f252c2a 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sentiasa benarkan Imbasan Perayauan Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Data mudah alih sentiasa aktif"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Pecutan perkakasan penambatan"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Tunjukkan peranti Bluetooth tanpa nama"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Lumpuhkan kelantangan mutlak"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Dayakan dering dalam jalur"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versi AVRCP Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Tetapan ini adalah untuk penggunaan pembangunan sahaja. Peranti dan aplikasi yang terdapat padanya boleh rosak atau tidak berfungsi dengan betul."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Sahkan apl melalui USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Semak apl yang dipasang melalui ADB/ADT untuk tingkah laku yang berbahaya."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Peranti Bluetooth tanpa nama (alamat MAC sahaja) akan dipaparkan"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Lumpuhkan ciri kelantangan mutlak Bluetooth dalam kes isu kelantangan menggunakan peranti kawalan jauh seperti kelantangan yang sangat kuat atau tidak dapat mengawal."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Benarkan nada dering pada telefon dimainkan pada set kepala Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal setempat"</string>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index 750c042..8e3ed3f 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (မူလ)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"စနစ်ရွေးချယ်မှုကို အသုံးပြုပါ (မူရင်း)"</item>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index ebbb7df..74302a0 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi ရွမ်းရှာဖွေမှုကို အမြဲတမ်း ခွင့်ပြုမည်"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"မိုဘိုင်းဒေတာကို အမြဲဖွင့်ထားရန်"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ဖုန်းကို မိုဒမ်အဖြစ်အသုံးပြုမှု စက်ပစ္စည်းဖြင့် အရှိန်မြှင့်တင်ခြင်း"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"အမည်မရှိသော ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသရန်"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ပကတိ အသံနှုန်း သတ်မှတ်ချက် ပိတ်ရန်"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"သတ်မှတ်ထားသည့်ဖုန်းမြည်သံကို အသုံးပြုခြင်းအား ဖွင့်ရန်"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ဘလူးတုသ် AVRCP ဗားရှင်း"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ဤဆက်တင်းများကို တည်ဆောက်ပြုပြင်ရာတွင် သုံးရန်အတွက်သာ ရည်ရွယ်သည်။ ၎င်းတို့သည် သင်၏စက်နှင့် အပလီကေးရှင်းများကို ရပ်စေခြင်း သို့ လုပ်ဆောင်ချက်မမှန်ကန်ခြင်းများ ဖြစ်ပေါ်စေနိုင်သည်။"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USBပေါ်မှ အပလီကေးရှင်းများကို အတည်ပြုစိစစ်ရန်"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT မှတဆင့် ထည့်သွင်းသော အပလီကေးရှင်းများကို အန္တရာယ်ဖြစ်နိုင်ခြင်း ရှိမရှိ စစ်ဆေးရန်။"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"အမည်မရှိသော (MAC လိပ်စာများသာပါသော) ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသပါမည်"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ချိတ်ဆက်ထားသည့် ကိရိယာတွင် လက်မခံနိုင်လောက်အောင် ဆူညံ သို့မဟုတ် ထိန်းညှိမရနိုင်သော အသံပိုင်းပြဿနာ ရှိခဲ့လျှင် ဘလူးတုသ် ပကတိ အသံနှုန်းကို ပိတ်ပါ။"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ဖုန်းတွင်းရှိ ဖုန်းမြည်သံများကို ဘလူးတုသ် မိုက်ခွက်ပါနားကြပ်တွင် ဖွင့်ခွင့်ပြုရန်"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"လိုကယ်တာမီနယ်"</string>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 1c9186a..1882e2e 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (standard)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Bruk systemvalg (standard)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-lyd"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-lyd"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Slå på valgfrie kodeker"</item>
+ <item msgid="3304843301758635896">"Slå av valgfrie kodeker"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Bruk systemvalg (standard)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-lyd"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-lyd"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Slå på valgfrie kodeker"</item>
+ <item msgid="741805482892725657">"Slå av valgfrie kodeker"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Bruk systemvalg (standard)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 3f82a05..cc73ef9 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillat alltid skanning for Wi-Fi-roaming"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobildata er alltid aktiv"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Maskinvareakselerasjon for internettdeling"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Vis Bluetooth-enheter uten navn"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Slå av funksjonen for absolutt volum"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Slå på innenbåndsringing"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-versjon"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Disse innstillingene er bare beregnet for bruk under programutvikling. De kan forårsake problemer med enheten din og tilhørende apper."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Bekreft apper via USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Sjekk apper som er installert via ADB/ADT for skadelig adferd."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-enheter uten navn (bare MAC-adresser) vises"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Slår av funksjonen for absolutt volum via Bluetooth i tilfelle det oppstår volumrelaterte problemer med eksterne enheter, for eksempel uakseptabelt høyt volum eller mangel på kontroll."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Tillater at ringelyder på telefonen spilles av på Bluetooth-hodetelefoner"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokal terminal"</string>
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index b22dc12..de6b86e 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP १.४ (पूर्वनिर्धारित)"</item>
- <item msgid="2089555299377409443">"AVRCP १.५"</item>
- <item msgid="2895327394279434278">"AVRCP १.६"</item>
+ <item msgid="2809759619990248160">"AVRCP १.३"</item>
+ <item msgid="6199178154704729352">"AVRCP १.५"</item>
+ <item msgid="5172170854953034852">"AVRCP १.६"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp १३"</item>
+ <item msgid="8837606198371920819">"avrcp १५"</item>
+ <item msgid="3422726142222090896">"avrcp १६"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"प्रणालीको चयन प्रयोग गर्नुहोस् (पूर्वनिर्धारित)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> अडियो"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> अडियो"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"वैकल्पिक कोडेकहरूलाई सक्षम पार्नुहोस्"</item>
+ <item msgid="3304843301758635896">"वैकल्पिक कोडेकहरूलाई असक्षम पार्नुहोस्"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"प्रणालीको चयन प्रयोग गर्नुहोस् (पूर्वनिर्धारित)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> अडियो"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> अडियो"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"वैकल्पिक कोडेकहरूलाई सक्षम पार्नुहोस्"</item>
+ <item msgid="741805482892725657">"वैकल्पिक कोडेकहरूलाई असक्षम पार्नुहोस्"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"प्रणालीको चयन प्रयोग गर्नुहोस् (पूर्वनिर्धारित)"</item>
<item msgid="8895532488906185219">"४४.१ kHz"</item>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 1b8f470..fef1ebe 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi घुम्ने स्क्यान गर्न सधैँ अनुमति दिनुहोस्"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"मोबाइल डेटा सधैँ सक्रिय राख्नुहोस्"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"टेदरिङको लागि हार्डवेयरको प्रवेग"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"नामकरण नगरिएका ब्लुटुथ यन्त्रहरू देखाउनुहोस्"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"निरपेक्ष आवाज असक्षम गर्नुहोस्"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"इन-ब्यान्ड घन्टी बज्ने सुविधालाई सक्षम पार्नुहोस्"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लुटुथको AVRCP संस्करण"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"यी सेटिङहरू केवल विकास प्रयोगको लागि विचार गरिएको हो। तिनीहरूले तपाईंको उपकरण र अनुप्रयोगहरूलाई विच्छेदन गर्न वा दुर्व्यवहार गर्न सक्दछ।"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB मा अनुप्रयोगहरू रुजु गर्नुहोस्"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"हानिकारक व्यवहारको लागि ADB/ADT को माध्यमबाट स्थापित अनुप्रयोगहरूको जाँच गर्नुहोस्।"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"नामकरण नगरिएका ब्लुटुथ यन्त्रहरू (MAC ठेगाना भएका मात्र) देखाइनेछ"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"रिमोट यन्त्रहरूमा अस्वीकार्य चर्को आवाज वा नियन्त्रणमा कमी जस्ता आवाज सम्बन्धी समस्याहरूको अवस्थामा ब्लुटुथ निरपेक्ष आवाज सुविधालाई असक्षम गराउँछ।"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"उक्त फोनमा भएका रिङटोनहरूलाई ब्लुटुथका हेडसेटहरूमा प्ले गर्न दिनुहोस्"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"स्थानीय टर्मिनल"</string>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index 94443c2..ace58fd 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (standaard)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Systeemselectie gebruiken (standaard)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Optionele codecs inschakelen"</item>
+ <item msgid="3304843301758635896">"Optionele codecs uitschakelen"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Systeemselectie gebruiken (standaard)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Optionele codecs inschakelen"</item>
+ <item msgid="741805482892725657">"Optionele codecs uitschakelen"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Systeemselectie gebruiken (standaard)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 93291a0..25d7cc5 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Altijd roamingscans voor wifi toestaan"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobiele data altijd actief"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardwareversnelling voor tethering"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth-apparaten zonder namen weergeven"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Absoluut volume uitschakelen"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"In-band bellen inschakelen"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth-AVRCP-versie"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Deze instellingen zijn uitsluitend bedoeld voor ontwikkelingsgebruik. Je apparaat en apps kunnen hierdoor vastlopen of anders reageren."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Apps verifiëren via USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Apps die zijn geïnstalleerd via ADB/ADT, controleren op schadelijk gedrag"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-apparaten zonder namen (alleen MAC-adressen) worden weergegeven"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Hiermee wordt de functie voor absoluut volume van Bluetooth uitgeschakeld in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Toestaan dat beltonen worden afgespeeld op Bluetooth-headsets"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokale terminal"</string>
diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml
index af20992..b6e97ca 100644
--- a/packages/SettingsLib/res/values-pa/arrays.xml
+++ b/packages/SettingsLib/res/values-pa/arrays.xml
@@ -39,7 +39,7 @@
<item msgid="8878186979715711006">"ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</item>
<item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ…"</item>
<item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਨਾਲ ਪ੍ਰਮਾਣਿਤ ਕਰ ਰਿਹਾ ਹੈ…"</item>
- <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਤੋਂ IP ਪਤਾ ਪ੍ਰਾਪਤ ਕਰ ਰਿਹਾ ਹੈ…"</item>
+ <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਤੋਂ IP ਪਤਾ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</item>
<item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</item>
<item msgid="1330262655415760617">"ਮੁਅੱਤਲ ਕੀਤਾ"</item>
<item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਤੋਂ ਡਿਸਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ…"</item>
@@ -50,7 +50,7 @@
</string-array>
<string-array name="hdcp_checking_titles">
<item msgid="441827799230089869">"ਕਦੇ ਵੀ ਜਾਂਚ ਨਾ ਕਰੋ"</item>
- <item msgid="6042769699089883931">"ਕੇਵਲ DRM ਸਮੱਗਰੀ ਲਈ ਜਾਂਚ ਕਰੋ"</item>
+ <item msgid="6042769699089883931">"ਸਿਰਫ਼ DRM ਸਮੱਗਰੀ ਲਈ ਜਾਂਚ ਕਰੋ"</item>
<item msgid="9174900380056846820">"ਹਮੇਸ਼ਾਂ ਜਾਂਚ ਕਰੋ"</item>
</string-array>
<string-array name="hdcp_checking_summaries">
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"ਸਿਸਟਮ ਚੋਣ ਦੀ ਵਰਤੋਂ ਕਰੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ਆਡੀਓ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ਆਡੀਓ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਚਾਲੂ ਕਰੋ"</item>
+ <item msgid="3304843301758635896">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਅਯੋਗ ਬਣਾਓ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"ਸਿਸਟਮ ਚੋਣ ਦੀ ਵਰਤੋਂ ਕਰੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ਆਡੀਓ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ਆਡੀਓ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਚਾਲੂ ਕਰੋ"</item>
+ <item msgid="741805482892725657">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਅਯੋਗ ਬਣਾਓ"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"ਸਿਸਟਮ ਚੋਣ ਦੀ ਵਰਤੋਂ ਕਰੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
@@ -109,14 +127,14 @@
<item msgid="8883739882299884241">"ਸਟੀਰੀਓ"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles">
- <item msgid="7158319962230727476">"ਔਡੀਓ ਗੁਣਵੱਤਾ ਲਈ ਸੁਯੋਗ ਬਣਾਇਆ ਗਿਆ (990kbps/909kbps)"</item>
- <item msgid="2921767058740704969">"ਸੰਤੁਲਿਤ ਔਡੀਓ ਅਤੇ ਕਨੈਕਸ਼ਨ ਗੁਣਵੱਤਾ (660kbps/606kbps)"</item>
+ <item msgid="7158319962230727476">" ਆਡੀਓ ਗੁਣਵੱਤਾ ਲਈ ਸੁਯੋਗ ਬਣਾਇਆ ਗਿਆ (990kbps/909kbps)"</item>
+ <item msgid="2921767058740704969">"ਸੰਤੁਲਿਤ ਆਡੀਓ ਅਤੇ ਕਨੈਕਸ਼ਨ ਗੁਣਵੱਤਾ (660kbps/606kbps)"</item>
<item msgid="8860982705384396512">"ਕਨੈਕਸ਼ਨ ਗੁਣਵੱਤਾ ਲਈ ਸੁਯੋਗ ਬਣਾਇਆ ਗਿਆ (330kbps/303kbps)"</item>
<item msgid="4414060457677684127">"ਸਰਵੋਤਮ ਕੋਸ਼ਿਸ਼ (ਅਨੁਕੂਲਨਕਾਰੀ ਬਿਟ ਰੇਟ)"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries">
- <item msgid="6398189564246596868">"ਔਡੀਓ ਗੁਣਵੱਤਾ ਲਈ ਸੁਯੋਗ ਬਣਾਇਆ ਗਿਆ"</item>
- <item msgid="4327143584633311908">"ਸੰਤੁਲਿਤ ਔਡੀਓ ਅਤੇ ਕਨੈਕਸ਼ਨ ਗੁਣਵੱਤਾ"</item>
+ <item msgid="6398189564246596868">" ਆਡੀਓ ਗੁਣਵੱਤਾ ਲਈ ਸੁਯੋਗ ਬਣਾਇਆ ਗਿਆ"</item>
+ <item msgid="4327143584633311908">"ਸੰਤੁਲਿਤ ਆਡੀਓ ਅਤੇ ਕਨੈਕਸ਼ਨ ਗੁਣਵੱਤਾ"</item>
<item msgid="4681409244565426925">"ਕਨੈਕਸ਼ਨ ਗੁਣਵੱਤਾ ਲਈ ਸੁਯੋਗ ਬਣਾਇਆ ਗਿਆ"</item>
<item msgid="364670732877872677">"ਸਰਵੋਤਮ ਕੋਸ਼ਿਸ਼ (ਅਨੁਕੂਲਨਕਾਰੀ ਬਿਟ ਰੇਟ)"</item>
</string-array>
@@ -136,11 +154,11 @@
</string-array>
<string-array name="select_logd_size_summaries">
<item msgid="6921048829791179331">"ਬੰਦ"</item>
- <item msgid="2969458029344750262">"64K ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ"</item>
- <item msgid="1342285115665698168">"256K ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ"</item>
- <item msgid="1314234299552254621">"1M ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ"</item>
- <item msgid="3606047780792894151">"4M ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ"</item>
- <item msgid="5431354956856655120">"16M ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ"</item>
+ <item msgid="2969458029344750262">"64K ਪ੍ਰਤੀ ਲੌਗ ਬਫ਼ਰ"</item>
+ <item msgid="1342285115665698168">"256K ਪ੍ਰਤੀ ਲੌਗ ਬਫ਼ਰ"</item>
+ <item msgid="1314234299552254621">"1M ਪ੍ਰਤੀ ਲੌਗ ਬਫ਼ਰ"</item>
+ <item msgid="3606047780792894151">"4M ਪ੍ਰਤੀ ਲੌਗ ਬਫ਼ਰ"</item>
+ <item msgid="5431354956856655120">"16M ਪ੍ਰਤੀ ਲੌਗ ਬਫ਼ਰ"</item>
</string-array>
<string-array name="select_logpersist_titles">
<item msgid="1744840221860799971">"ਬੰਦ"</item>
@@ -204,7 +222,7 @@
<string-array name="show_non_rect_clip_entries">
<item msgid="993742912147090253">"ਬੰਦ"</item>
<item msgid="675719912558941285">"ਨੀਲੇ ਵਿੱਚ ਗ਼ੈਰ-ਆਇਤਾਕਾਰ ਕਲਿਪ ਖੇਤਰ ਡ੍ਰਾ ਕਰੋ"</item>
- <item msgid="1064373276095698656">"ਹਾਈਲਾਈਟ ਜਾਂਚ ਕੀਤੀਆਂ ਡ੍ਰਾਇੰਗ ਕਮਾਂਡਾਂ ਹਰੇ ਵਿੱਚ ਹਨ"</item>
+ <item msgid="1064373276095698656">"ਜਾਂਚ ਕੀਤੀਆਂ ਡ੍ਰਾਇੰਗ ਕਮਾਂਡਾਂ ਹਰੇ ਵਿੱਚ ਉਜਾਗਰ ਕਰੋ"</item>
</string-array>
<string-array name="track_frame_time_entries">
<item msgid="2193584639058893150">"ਬੰਦ"</item>
@@ -233,7 +251,7 @@
<item msgid="5220695614993094977">"MTP (ਮੀਡੀਆ ਟ੍ਰਾਂਸਫਰ ਪ੍ਰੋਟੋਕੋਲ)"</item>
<item msgid="2086000968159047375">"PTP (ਤਸਵੀਰ ਟ੍ਰਾਂਸਫਰ ਪ੍ਰੋਟੋਕੋਲ)"</item>
<item msgid="7398830860950841822">"RNDIS (USB ਈਥਰਨੈਟ)"</item>
- <item msgid="1718924214939774352">"ਔਡੀਓ ਸਰੋਤ"</item>
+ <item msgid="1718924214939774352">" ਆਡੀਓ ਸਰੋਤ"</item>
<item msgid="8126315616613006284">"MIDI"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 95a9cce..10a1b0d 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -30,7 +30,7 @@
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ਪ੍ਰਮਾਣੀਕਰਨ ਸਮੱਸਿਆ"</string>
<string name="wifi_cant_connect" msgid="5410016875644565884">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\' ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
- <string name="wifi_check_password_try_again" msgid="516958988102584767">"ਪਾਸਵਰਡ ਜਾਂਚੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
+ <string name="wifi_check_password_try_again" msgid="516958988102584767">"ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"ਰੇਂਜ ਵਿੱਚ ਨਹੀਂ ਹੈ"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ"</string>
@@ -39,8 +39,8 @@
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ਨੈੱਟਵਰਕ ਰੇਟਿੰਗ ਪ੍ਰਦਾਨਕ ਰਾਹੀਂ ਆਪਣੇ-ਆਪ ਕਨੈਕਟ ਹੋਇਆ"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
- <string name="wifi_connected_no_internet" msgid="3149853966840874992">"ਕਨੈਕਟ ਕੀਤਾ, ਕੋਈ ਇੰਟਰਨੈਟ ਨਹੀਂ"</string>
- <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ਪਹੁੰਚ ਪੁਆਇੰਟ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਸੰਪੂਰਨ ਰੁਝੇਂਵੇਂ ਵਿੱਚ ਹੈ"</string>
+ <string name="wifi_connected_no_internet" msgid="3149853966840874992">"ਕਨੈਕਟ ਕੀਤਾ, ਕੋਈ ਇੰਟਰਨੈੱਟ ਨਹੀਂ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ਐਕਸੈੱਸ ਪੁਆਇੰਟ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਸੰਪੂਰਨ ਰੁਝੇਂਵੇਂ ਵਿੱਚ ਹੈ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ਬਹੁਤ ਹੌਲੀ"</string>
@@ -55,48 +55,48 @@
<string name="bluetooth_connecting" msgid="8555009514614320497">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ…"</string>
<string name="bluetooth_connected" msgid="6038755206916626419">"ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"ਪੇਅਰ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫੋਨ ਨਹੀਂ)"</string>
+ <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ)"</string>
<string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ)"</string>
<string name="bluetooth_connected_no_map" msgid="6504436917057479986">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਸੁਨੇਹਾ ਪਹੁੰਚ ਨਹੀਂ)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ)"</string>
<string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ, ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ਮੀਡੀਆ ਔਡੀਓ"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ਮੀਡੀਆ ਆਡੀਓ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ਫ਼ੋਨ ਕਾਲਾਂ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ"</string>
<string name="bluetooth_profile_hid" msgid="3680729023366986480">"ਇਨਪੁੱਟ ਡੀਵਾਈਸ"</string>
- <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ"</string>
+ <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ"</string>
<string name="bluetooth_profile_pbap" msgid="5372051906968576809">"ਸੰਪਰਕ ਸ਼ੇਅਰਿੰਗ"</string>
<string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"ਸੰਪਰਕ ਸ਼ੇਅਰਿੰਗ ਲਈ ਵਰਤੋ"</string>
- <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਸ਼ੇਅਰਿੰਗ"</string>
+ <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਸਾਂਝਾਕਰਨ"</string>
<string name="bluetooth_profile_map" msgid="1019763341565580450">"ਲਿਖਤ ਸੁਨੇਹੇ"</string>
- <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ਪਹੁੰਚ"</string>
+ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"ਸਿਮ ਪਹੁੰਚ"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ਆਡੀਓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ਆਡੀਓ"</string>
- <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ਮੀਡੀਆ ਔਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
- <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ਫੋਨ ਔਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
- <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ਮੀਡੀਆ ਆਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
+ <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ਫ਼ੋਨ ਔਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
+ <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ਫਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"ਨਕਸ਼ੇ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
- <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ"</string>
+ <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ਫਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ"</string>
<string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ਇਨਪੁੱਟ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਲਈ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"ਡੀਵਾਈਸ ਨਾਲ ਸਥਾਨਕ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਸਾਂਝਾ ਕਰ ਰਿਹਾ ਹੈ"</string>
- <string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string>
+ <string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string>
<string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"ਨਕਸ਼ੇ ਲਈ ਵਰਤੋ"</string>
- <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string>
- <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"ਮੀਡੀਆ ਔਡੀਓ ਲਈ ਵਰਤੋ"</string>
- <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ਫੋਨ ਔਡੀਓ ਲਈ ਵਰਤੋ"</string>
+ <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"ਸਿਮ ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"ਮੀਡੀਆ ਆਡੀਓ ਲਈ ਵਰਤੋ"</string>
+ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ਫ਼ੋਨ ਔਡੀਓ ਲਈ ਵਰਤੋ"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਲਈ ਵਰਤੋ"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ਇਨਪੁਟ ਲਈ ਵਰਤੋ"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ਪੇਅਰ ਕਰੋ"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ਪੇਅਰ ਕਰੋ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ਰੱਦ ਕਰੋ"</string>
- <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ਪੇਅਰ ਕਰਨਾ ਕਨੈਕਟ ਕੀਤੇ ਜਾਣ ਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਅਤੇ ਕਾਲ ਇਤਿਹਾਸ ਤੱਕ ਪਹੁੰਚ ਦੀ ਅਨੁਮਤੀ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ਜੋੜਾਬੱਧ ਕਰਨਾ ਕਨੈਕਟ ਕੀਤੇ ਜਾਣ ਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਅਤੇ ਕਾਲ ਇਤਿਹਾਸ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਪੇਅਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string>
- <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ਇੱਕ ਗ਼ਲਤ ਪਿੰਨ ਜਾਂ ਪਾਸਕੁੰਜੀ ਦੇ ਕਾਰਨ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਜੋੜਾਬੱਧ ਨਹੀਂ ਹੋ ਸਕਿਆ।"</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ਇੱਕ ਗਲਤ ਪਿੰਨ ਜਾਂ ਪਾਸਕੁੰਜੀ ਦੇ ਕਾਰਨ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਜੋੜਾਬੱਧ ਨਹੀਂ ਹੋ ਸਕਿਆ।"</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਸੰਚਾਰ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"ਪੇਅਰਿੰਗ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਰੱਦ ਕੀਤੀ ਗਈ।"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ਬੰਦ।"</string>
@@ -112,17 +112,17 @@
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ਹਟਾਏ ਗਏ ਐਪਸ ਅਤੇ ਉਪਭੋਗਤਾ"</string>
<string name="tether_settings_title_usb" msgid="6688416425801386511">"USB ਟੈਦਰਿੰਗ"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"ਪੋਰਟੇਬਲ ਹੌਟਸਪੌਟ"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth ਟੈਦਰਿੰਗ"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"ਟੀਥਰਿੰਗ"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"ਟੀਥਰਿੰਗ & ਪੋਰਟੇਬਲ ਹੌਟਸਪੌਟ"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ਬਲੂਟੁੱਥ ਟੈਦਰਿੰਗ"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"ਟੈਦਰਿੰਗ"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"ਟੈਦਰਿੰਗ & ਪੋਰਟੇਬਲ ਹੌਟਸਪੌਟ"</string>
<string name="managed_user_title" msgid="8109605045406748842">"ਸਾਰੀਆਂ ਕੰਮ ਐਪਾਂ"</string>
<string name="user_guest" msgid="8475274842845401871">"ਮਹਿਮਾਨ"</string>
<string name="unknown" msgid="1592123443519355854">"ਅਗਿਆਤ"</string>
<string name="running_process_item_user_label" msgid="3129887865552025943">"ਵਰਤੋਂਕਾਰ: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
- <string name="launch_defaults_some" msgid="313159469856372621">"ਕੁਝ ਡਿਫੌਲਟਸ ਸੈਟ ਕੀਤੇ"</string>
+ <string name="launch_defaults_some" msgid="313159469856372621">"ਕੁਝ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈੱਟ ਕੀਤੇ"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"ਕੋਈ ਡਿਫੌਲਟਸ ਸੈਟ ਨਹੀਂ ਕੀਤੇ"</string>
- <string name="tts_settings" msgid="8186971894801348327">"ਟੈਕਸਟ-ਟੂ-ਸਪੀਚ ਸੈਟਿੰਗਾਂ"</string>
- <string name="tts_settings_title" msgid="1237820681016639683">"ਲਿਖਤ-ਤੋਂ-ਬੋਲੀ ਆਊਟਪੁਟ"</string>
+ <string name="tts_settings" msgid="8186971894801348327">"ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਆਊਟਪੁਟ"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"ਸਪੀਚ ਰੇਟ"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"ਸਪੀਡ ਜਿਸਤੇ ਟੈਕਸਟ ਬੋਲਿਆ ਜਾਂਦਾ ਹੈ"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"ਪਿਚ"</string>
@@ -133,10 +133,10 @@
<string name="tts_default_lang_summary" msgid="5219362163902707785">"ਬੋਲੇ ਗਏ ਟੈਕਸਟ ਲਈ ਭਾਸ਼ਾ-ਵਿਸ਼ੇਸ਼ ਵੌਇਸ ਸੈਟ ਕਰਦਾ ਹੈ"</string>
<string name="tts_play_example_title" msgid="7094780383253097230">"ਇੱਕ ਉਦਾਹਰਨ ਲਈ ਸੁਣੋ"</string>
<string name="tts_play_example_summary" msgid="8029071615047894486">"ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਦਾ ਇੱਕ ਛੋਟਾ ਪ੍ਰਦਰਸ਼ਨ ਪਲੇ ਕਰੋ"</string>
- <string name="tts_install_data_title" msgid="4264378440508149986">"ਵੌਇਸ ਡੈਟਾ ਇੰਸਟੌਲ ਕਰੋ"</string>
- <string name="tts_install_data_summary" msgid="5742135732511822589">"ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਲਈ ਲੁੜੀਂਦਾ ਵੌਇਸ ਡੈਟਾ ਇੰਸਟੌਲ ਕਰੋ"</string>
- <string name="tts_engine_security_warning" msgid="8786238102020223650">"ਇਹ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਉਹ ਸਾਰੀ ਲਿਖਤ ਇਕੱਤਰ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੋ ਸਕਦਾ ਹੈ, ਜੋ ਬੋਲੀ ਜਾਏ, ਨਿੱਜੀ ਡਾਟਾ ਸਮੇਤ ਜਿਵੇਂ ਪਾਸਵਰਡ ਅਤੇ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ। ਇਹ <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ਇੰਜਣ ਤੋਂ ਆਉਂਦਾ ਹੈ। ਕੀ ਇਸ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string>
- <string name="tts_engine_network_required" msgid="1190837151485314743">"ਇਸ ਭਾਸ਼ਾ ਲਈ ਟੈਕਸਟ-ਟੂ-ਸਪੀਚ ਆਊਟਪੁਟ ਲਈ ਇੱਕ ਚਾਲੂ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦੀ ਲੋੜ ਹੈ।"</string>
+ <string name="tts_install_data_title" msgid="4264378440508149986">"ਵੌਇਸ ਡਾਟਾ ਸਥਾਪਤ ਕਰੋ"</string>
+ <string name="tts_install_data_summary" msgid="5742135732511822589">"ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਲਈ ਲੋੜੀਂਦਾ ਵੌਇਸ ਡਾਟਾ ਸਥਾਪਤ ਕਰੋ"</string>
+ <string name="tts_engine_security_warning" msgid="8786238102020223650">"ਇਹ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਉਹ ਸਭ ਲਿਖਤ ਇਕੱਤਰ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੋ ਸਕਦਾ ਹੈ, ਜੋ ਬੋਲਿਆ ਜਾਏਗਾ, ਨਿੱਜੀ ਡਾਟਾ ਸਮੇਤ ਜਿਵੇਂ ਪਾਸਵਰਡ ਅਤੇ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ। ਇਹ <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ਇੰਜਣ ਤੋਂ ਆਉਂਦਾ ਹੈ। ਕੀ ਇਸ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਦੀ ਵਰਤੋਂ ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈੈ?"</string>
+ <string name="tts_engine_network_required" msgid="1190837151485314743">"ਇਸ ਭਾਸ਼ਾ ਲਈ ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਆਊਟਪੁੱਟ ਲਈ ਇੱਕ ਚਾਲੂ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦੀ ਲੋੜ ਹੈ।"</string>
<string name="tts_default_sample_string" msgid="4040835213373086322">"ਇਹ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਦਾ ਇੱਕ ਉਦਾਹਰਨ ਹੈ"</string>
<string name="tts_status_title" msgid="7268566550242584413">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਭਾਸ਼ਾ ਸਥਿਤੀ"</string>
<string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਮਰਥਿਤ ਹੈ"</string>
@@ -144,7 +144,7 @@
<string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ"</string>
<string name="tts_status_checking" msgid="5339150797940483592">"ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..."</string>
<string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> ਲਈ ਸੈਟਿੰਗਾਂ"</string>
- <string name="tts_engine_settings_button" msgid="1030512042040722285">"ਇੰਜਨ ਸੈਟਿੰਗਾਂ ਲਾਂਚ ਕਰੋ"</string>
+ <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>
@@ -163,59 +163,58 @@
<string name="choose_profile" msgid="6921016979430278661">"ਪ੍ਰੋਫਾਈਲ ਚੁਣੋ"</string>
<string name="category_personal" msgid="1299663247844969448">"ਨਿੱਜੀ"</string>
<string name="category_work" msgid="8699184680584175622">"ਦਫ਼ਤਰ"</string>
- <string name="development_settings_title" msgid="215179176067683667">"ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ"</string>
- <string name="development_settings_enable" msgid="542530994778109538">"ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ ਨੂੰ ਯੋਗ ਬਣਾਓ"</string>
+ <string name="development_settings_title" msgid="215179176067683667">"ਵਿਕਾਸਕਾਰ ਵਿਕਲਪ"</string>
+ <string name="development_settings_enable" msgid="542530994778109538">"ਵਿਕਾਸਕਾਰ ਵਿਕਲਪਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<string name="development_settings_summary" msgid="1815795401632854041">"ਐਪ ਵਿਕਾਸ ਲਈ ਚੋਣਾਂ ਸੈੱਟ ਕਰੋ"</string>
- <string name="development_settings_not_available" msgid="4308569041701535607">"ਇਸ ਉਪਭੋਗਤਾ ਲਈ ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
- <string name="vpn_settings_not_available" msgid="956841430176985598">"ਇਸ ਉਪਭੋਗਤਾ ਲਈ VPN ਸੈਟਿੰਗਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"ਇਸ ਉਪਭੋਗਤਾ ਲਈ ਟੀਥਰਿੰਗ ਸੈਟਿੰਗਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
- <string name="apn_settings_not_available" msgid="7873729032165324000">"ਪਹੁੰਚ ਬਿੰਦੂ ਨਾਮ ਸੈਟਿੰਗਾਂ ਇਸ ਉਪਭੋਗਤਾ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
+ <string name="development_settings_not_available" msgid="4308569041701535607">"ਇਸ ਵਰਤੋਂਕਾਰ ਲਈ ਵਿਕਾਸਕਾਰ ਵਿਕਲਪ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
+ <string name="vpn_settings_not_available" msgid="956841430176985598">"ਇਸ ਵਰਤੋਂਕਾਰ ਲਈ VPN ਸੈਟਿੰਗਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"ਇਸ ਵਰਤੋਂਕਾਰ ਲਈ ਟੈਦਰਿੰਗ ਸੈਟਿੰਗਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
+ <string name="apn_settings_not_available" msgid="7873729032165324000">"ਐਕਸੈੱਸ ਪੁਆਇੰਟ ਨਾਮ ਸੈਟਿੰਗਾਂ ਇਸ ਵਰਤੋਂਕਾਰ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
<string name="enable_adb" msgid="7982306934419797485">"USB ਡੀਬਗਿੰਗ"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"ਡੀਬਗ ਮੋਡ ਜਦੋਂ USB ਕਨੈਕਟ ਕੀਤੀ ਜਾਏ"</string>
<string name="clear_adb_keys" msgid="4038889221503122743">"USB ਡੀਬਗਿੰਗ ਅਧਿਕਾਰ ਰੱਦ ਕਰੋ"</string>
- <string name="bugreport_in_power" msgid="7923901846375587241">"ਬਗ ਰਿਪੋਰਟ ਸ਼ਾਰਟਕੱਟ"</string>
+ <string name="bugreport_in_power" msgid="7923901846375587241">"ਬੱਗ ਰਿਪੋਰਟ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="bugreport_in_power_summary" msgid="1778455732762984579">"ਇੱਕ ਬੱਗ ਰਿਪੋਰਟ ਲੈਣ ਲਈ ਪਾਵਰ ਮੀਨੂ ਵਿੱਚ ਇੱਕ ਬਟਨ ਦਿਖਾਓ"</string>
<string name="keep_screen_on" msgid="1146389631208760344">"ਸਕਿਰਿਆ ਰੱਖੋ"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ਸਕ੍ਰੀਨ ਚਾਰਜਿੰਗ ਦੇ ਸਮੇਂ ਕਦੇ ਵੀ ਸਲੀਪ ਨਹੀਂ ਹੋਵੇਗੀ"</string>
- <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI ਸਨੂਪ ਲੌਗ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ"</string>
+ <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ਬਲੂਟੁੱਥ HCI ਸਨੂਪ ਲੌਗ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ਇੱਕ ਫਾਈਲ ਵਿੱਚ ਸਾਰੇ bluetooth HCI ਪੈਕੇਟ ਕੈਪਚਰ ਕਰੋ"</string>
- <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ਅਨਲੌਕ ਕਰਨਾ"</string>
+ <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ਅਣਲਾਕ ਕਰਨਾ"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ਬੂਟਲੋਡਰ ਨੂੰ ਅਨਲੌਕ ਕੀਤੇ ਜਾਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
- <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ਕੀ OEM ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
- <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ਚਿਤਾਵਨੀ: ਉਦੋਂ ਇਸ ਡੀਵਾਈਸ ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਇਹ ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇਗੀ।"</string>
+ <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ਕੀ OEM ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ਚਿਤਾਵਨੀ: ਡੀਵਾਈਸ ਸੁਰੱਖਿਆ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਉਦੋਂ ਇਸ ਡੀਵਾਈਸ ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਇਹ ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇਗੀ।"</string>
<string name="mock_location_app" msgid="7966220972812881854">"ਮੌਕ ਸਥਾਨ ਐਪ ਚੁਣੋ"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"ਕੋਈ ਵੀ ਮੌਕ ਸਥਾਨ ਐਪ ਸੈੱਟ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"ਮੌਕ ਸਥਾਨ ਐਪ: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="debug_networking_category" msgid="7044075693643009662">"ਨੈੱਟਵਰਕਿੰਗ"</string>
- <string name="wifi_display_certification" msgid="8611569543791307533">"ਵਾਇਰਲੈਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ"</string>
- <string name="wifi_verbose_logging" msgid="4203729756047242344">"ਵਾਈ‑ਫਾਈ ਵਰਬੋਸ ਲੌਗਿੰਗ ਸਮਰੱਥ ਬਣਾਓ"</string>
+ <string name="wifi_display_certification" msgid="8611569543791307533">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ"</string>
+ <string name="wifi_verbose_logging" msgid="4203729756047242344">"ਵਾਈ-ਫਾਈ ਵਰਬੋਸ ਲੌਗਿੰਗ ਚਾਲੂ ਕਰੋ"</string>
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"ਆਕਰਮਣਸ਼ੀਲ ਵਾਈ‑ਫਾਈ ਤੋਂ ਮੋਬਾਈਲ ਹੈਂਡਓਵਰ"</string>
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ਹਮੇਸ਼ਾਂ ਵਾਈ‑ਫਾਈ ਰੋਮ ਸਕੈਨਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"ਮੋਬਾਈਲ ਡਾਟਾ ਹਮੇਸ਼ਾਂ ਕਿਰਿਆਸ਼ੀਲ"</string>
- <string name="tethering_hardware_offload" msgid="7470077827090325814">"ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੇਲਰੇਸ਼ਨ"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੈੱਲਰੇਸ਼ਨ"</string>
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਓ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ਪੂਰਨ ਵੌਲਿਊਮ ਨੂੰ ਅਯੋਗ ਬਣਾਓ"</string>
- <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ਇਨ-ਬੈਂਡ ਘੰਟੀ ਵੱਜਣ ਨੂੰ ਯੋਗ ਬਣਾਓ"</string>
- <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ਬਲੂਟੁੱਥ AVRCP ਰੂਪ"</string>
- <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ਬਲੂਟੁੱਥ AVRCP ਰੂਪ ਚੁਣੋ"</string>
+ <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ਇਨ-ਬੈਂਡ ਘੰਟੀ ਵੱਜਣ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ਬਲੂਟੁੱਥ AVRCP ਵਰਜਨ"</string>
+ <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ਬਲੂਟੁੱਥ AVRCP ਵਰਜਨ ਚੁਣੋ"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ"</string>
<string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਨਮੂਨਾ ਦਰ"</string>
+ <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ਬਲੂਟੁੱਥ ਆਡੀਓ ਨਮੂਨਾ ਦਰ"</string>
<string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ:\nਸੈਂਪਲ ਰੇਟ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ਪ੍ਰਤੀ ਨਮੂਨਾ ਬਲੂਟੁੱਥ ਔਡੀਓ ਬਿਟਾਂ"</string>
+ <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ਪ੍ਰਤੀ ਨਮੂਨਾ ਬਲੂਟੁੱਥ ਆਡੀਓ ਬਿਟਾਂ"</string>
<string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ:\nਬਿਟਾਂ ਪ੍ਰਤੀ ਨਮੂਨਾ"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਚੈਨਲ ਮੋਡ"</string>
+ <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ਬਲੂਟੁੱਥ ਆਡੀਓ ਚੈਨਲ ਮੋਡ"</string>
<string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ:\nਚੈਨਲ ਮੋਡ"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ਬਲੂਟੁੱਥ ਔਡੀਓ LDAC ਕੋਡੇਕ: ਪਲੇਬੈਕ ਗੁਣਵੱਤਾ"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ਬਲੂਟੁੱਥ ਔਡੀਓ LDAC ਕੋਡੇਕ ਚੁਣੋ:\nਪਲੇਬੈਕ ਗੁਣਵੱਤਾ"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ਸਟ੍ਰੀਮਿੰਗ: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
- <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ਵਾਇਰਲੈਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਦਿਖਾਓ"</string>
+ <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ਵਾਈ‑ਫਾਈ ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, ਵਾਈ‑ਫਾਈ Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string>
- <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"ਜਦੋਂ ਚਾਲੂ ਕੀਤਾ ਹੋਵੇ, ਤਾਂ ਵਾਈ‑ਫਾਈ ਸਿਗਨਲ ਘੱਟ ਹੋਣ \'ਤੇ ਵਾਈ‑ਫਾਈ ਡਾਟਾ ਕਨੈਕਸ਼ਨ ਮੋਬਾਈਲ ਨੂੰ ਹੈਂਡਓਵਰ ਕਰਨ ਵਿੱਚ ਵੱਧ ਆਕਰਮਣਸ਼ੀਲ ਹੋਵੇਗਾ।"</string>
- <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ਇੰਟਰਫੇਸ ਤੇ ਮੌਜੂਦ ਡਾਟਾ ਟ੍ਰੈਫਿਕ ਦੀ ਮਾਤਰਾ ਦੇ ਆਧਾਰ ਤੇ ਵਾਈ‑ਫਾਈ ਰੋਮ ਸਕੈਨ ਦੀ ਆਗਿਆ ਦਿਓ/ਨਾ ਦਿਓ"</string>
- <string name="select_logd_size_title" msgid="7433137108348553508">"ਲੌਗਰ ਬਫਰ ਆਕਾਰ"</string>
- <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ ਲੌਗਰ ਆਕਾਰ ਚੁਣੋ"</string>
+ <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"ਜਦੋਂ ਯੋਗ ਬਣਾਇਆ ਹੋਵੇ, ਤਾਂ ਵਾਈ‑ਫਾਈ ਸਿਗਨਲ ਘੱਟ ਹੋਣ \'ਤੇ ਵਾਈ‑ਫਾਈ ਡਾਟਾ ਕਨੈਕਸ਼ਨ ਮੋਬਾਈਲ ਨੂੰ ਹੈਂਡ ਓਵਰ ਕਰਨ ਵਿੱਚ ਵੱਧ ਆਕਰਮਣਸ਼ੀਲ ਹੋਵੇਗਾ।"</string>
+ <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ਇੰਟਰਫੇਸ ਤੇ ਮੌਜੂਦ ਡਾਟਾ ਟ੍ਰੈਫਿਕ ਦੀ ਮਾਤਰਾ ਦੇ ਆਧਾਰ ਤੇ ਵਾਈ-ਫਾਈ ਰੋਮ ਸਕੈਨ ਦੀ ਆਗਿਆ ਦਿਓ/ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="select_logd_size_title" msgid="7433137108348553508">"ਲੌਗਰ ਬਫ਼ਰ ਆਕਾਰ"</string>
+ <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ਪ੍ਰਤੀ ਲੌਗ ਬਫ਼ਰ ਲੌਗਰ ਆਕਾਰ ਚੁਣੋ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ਕੀ ਲੌਗਰ ਪ੍ਰਸਿੱਸਟੈਂਟ ਸਟੋਰੇਜ ਨੂੰ ਸਾਫ਼ ਕਰਨਾ ਹੈ?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"ਜਦੋਂ ਅਸੀਂ ਪ੍ਰਸਿੱਸਟੈਂਟ ਲੌਗਰ ਨਾਲ ਨਿਗਰਾਨੀ ਨਹੀਂ ਕਰ ਰਹੇ ਹੁੰਦੇ ਹਾਂ, ਤਾਂ ਸਾਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਮੌਜੂਦ ਲੌਗਰ ਡਾਟੇ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਲੋੜ ਪੈਂਦੀ ਹੈ।"</string>
<string name="select_logpersist_title" msgid="7530031344550073166">"ਡੀਵਾਈਸ \'ਤੇ ਲੌਗ ਬਫ਼ਰਾਂ ਨੂੰ ਸਥਾਈ ਤੌਰ \'ਤੇ ਸਟੋਰ ਕਰੋ"</string>
@@ -224,22 +223,21 @@
<string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB ਕੌਂਫਿਗਰੇਸ਼ਨ ਚੁਣੋ"</string>
<string name="allow_mock_location" msgid="2787962564578664888">"ਨਕਲੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="allow_mock_location_summary" msgid="317615105156345626">"ਨਕਲੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
- <string name="debug_view_attributes" msgid="6485448367803310384">"ਗੁਣ ਛਾਣਬੀਣ ਦੇਖੋ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ"</string>
- <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ਹਮੇਸ਼ਾਂ ਮੋਬਾਈਲ ਡਾਟਾ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ, ਭਾਵੇਂ ਵਾਈ‑ਫਾਈ ਕਿਰਿਆਸ਼ੀਲ ਹੋਵੇ (ਤੇਜ਼ ਨੈੱਟਵਰਕ ਸਵਿੱਚਿੰਗ ਲਈ)।"</string>
- <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੇਲਰੇਸ਼ਨ ਵਰਤੋ"</string>
+ <string name="debug_view_attributes" msgid="6485448367803310384">"ਗੁਣ ਛਾਣਬੀਣ ਦੇਖੋ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ਹਮੇਸ਼ਾਂ ਮੋਬਾਈਲ ਡਾਟਾ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ ਭਾਵੇਂ ਵਾਈ‑ਫਾਈ ਕਿਰਿਆਸ਼ੀਲ ਹੋਵੇ (ਤੇਜ਼ ਨੈੱਟਵਰਕ ਸਵਿੱਚਿੰਗ ਲਈ)।"</string>
+ <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੈੱਲਰੇਸ਼ਨ ਵਰਤੋ"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"USB ਡੀਬਗਿੰਗ ਕੇਵਲ ਵਿਕਾਸ ਮੰਤਵਾਂ ਲਈ ਹੁੰਦੀ ਹੈ। ਇਸਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ ਅਤੇ ਆਪਣੇ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਡਾਟਾ ਕਾਪੀ ਕਰਨ ਲਈ ਵਰਤੋ, ਸੂਚਨਾ ਦੇ ਬਿਨਾਂ ਆਪਣੇ ਡੀਵਾਈਸ ਤੇ ਐਪਾਂ ਸਥਾਪਤ ਕਰੋ ਅਤੇ ਲੌਗ ਡਾਟਾ ਪੜ੍ਹੋ।"</string>
- <string name="adb_keys_warning_message" msgid="5659849457135841625">"ਕੀ ਉਹਨਾਂ ਸਾਰੇ ਕੰਪਿਊਟਰਾਂ ਤੋਂ USB ਡੀਬਗਿੰਗ ਤੱਕ ਪਹੁੰਚ ਰੱਦ ਕਰਨੀ ਹੈ, ਜਿਹਨਾਂ ਲਈ ਪਹਿਲਾਂ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਕੀਤਾ ਹੈ?"</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"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>
- <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ADB/ADT ਰਾਹੀਂ ਇੰਸਟੌਲ ਕੀਤੇ ਐਪਸ ਦੀ ਜਾਂਚ ਕਰੋ।"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ਤੇ ਐਪਾਂ ਦੀ ਜਾਂਚ ਕਰੋ"</string>
+ <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ADB/ADT ਰਾਹੀਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਦੀ ਜਾਂਚ ਕਰੋ।"</string>
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਈਆਂ ਜਾਣਗੀਆਂ (ਸਿਰਫ਼ MAC ਪਤੇ)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ਰਿਮੋਟ ਡੀਵਾਈਸਾਂ ਨਾਲ ਵੌਲਿਊਮ ਸਮੱਸਿਆਵਾਂ ਜਿਵੇਂ ਕਿ ਨਾ ਪਸੰਦ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਉੱਚੀ ਵੌਲਿਊਮ ਜਾਂ ਕੰਟਰੋਲ ਦੀ ਕਮੀ ਵਰਗੀ ਹਾਲਤ ਵਿੱਚ ਬਲੂਟੁੱਥ ਪੂਰਨ ਵੌਲਿਊਮ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਅਯੋਗ ਬਣਾਉਂਦਾ ਹੈ।"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੀਆਂ ਰਿੰਗਟੋਨਾਂ ਨੂੰ ਬਲੂਟੁੱਥ ਹੈੱਡਸੈੱਟਾਂ \'ਤੇ ਚਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"ਸਥਾਨਕ ਟਰਮੀਨਲ"</string>
- <string name="enable_terminal_summary" msgid="67667852659359206">"ਟਰਮੀਨਲ ਐਪ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ ਜੋ ਸਥਾਨਕ ਸ਼ੈਲ ਪਹੁੰਚ ਆੱਫਰ ਕਰਦਾ ਹੈ"</string>
+ <string name="enable_terminal_summary" msgid="67667852659359206">"ਟਰਮੀਨਲ ਐਪ ਨੂੰ ਚਾਲੂ ਕਰੋ ਜੋ ਸਥਾਨਕ ਸ਼ੈਲ ਪਹੁੰਚ ਪੇਸ਼ਕਸ਼ ਕਰਦਾ ਹੈ"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP ਜਾਂਚ"</string>
<string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP ਜਾਂਚ ਵਿਵਹਾਰ ਸੈੱਟ ਕਰੋ"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"ਡੀਬਗਿੰਗ"</string>
@@ -260,31 +258,31 @@
<string name="strict_mode" msgid="1938795874357830695">"ਸਟ੍ਰਿਕਟ ਮੋਡ ਸਮਰਥਿਤ"</string>
<string name="strict_mode_summary" msgid="142834318897332338">"ਜਦੋਂ ਐਪਸ ਮੇਨ ਥ੍ਰੈਡ ਤੇ ਲੰਮੇ ਓਪਰੇਸ਼ਨ ਕਰਨ ਤਾਂ ਸਕ੍ਰੀਨ ਫਲੈਸ਼ ਕਰੋ"</string>
<string name="pointer_location" msgid="6084434787496938001">"ਪੌਇੰਟਰ ਟਿਕਾਣਾ"</string>
- <string name="pointer_location_summary" msgid="840819275172753713">"ਸਕ੍ਰੀਨ ਓਵਰਲੇ ਮੌਜੂਦਾ ਟਚ ਡੈਟਾ ਦਿਖਾ ਰਿਹਾ ਹੈ"</string>
- <string name="show_touches" msgid="2642976305235070316">"ਟੈਪਾਂ ਵਿਖਾਓ"</string>
- <string name="show_touches_summary" msgid="6101183132903926324">"ਟੈਪਾਂ ਲਈ ਨਜ਼ਰ ਸਬੰਧੀ ਪ੍ਰਤੀਕਰਮ ਵਿਖਾਓ"</string>
+ <string name="pointer_location_summary" msgid="840819275172753713">"ਸਕ੍ਰੀਨ ਓਵਰਲੇ ਮੌਜੂਦਾ ਟਚ ਡਾਟਾ ਦਿਖਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="show_touches" msgid="2642976305235070316">"ਟੈਪਾਂ ਦਿਖਾਓ"</string>
+ <string name="show_touches_summary" msgid="6101183132903926324">"ਟੈਪਾਂ ਲਈ ਨਜ਼ਰ ਸਬੰਧੀ ਪ੍ਰਤੀਕਰਮ ਦਿਖਾਓ"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"ਸਰਫਸ ਅਪਡੇਟਾਂ ਦਿਖਾਓ"</string>
- <string name="show_screen_updates_summary" msgid="2569622766672785529">"ਸਮੁੱਚੀ ਵਿੰਡੋ ਸਰਫੇਸਾਂ ਫਲੈਸ਼ ਕਰੋ ਜਦੋਂ ਉਹ ਅਪਡੇਟ ਹੁੰਦੀਆਂ ਹਨ"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ਦ੍ਰਿਸ਼ ਅਪਡੇਟਾਂ ਦਿਖਾਓ"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"ਜਦੋਂ GPU ਨਾਲ ਡ੍ਰਾ ਕੀਤਾ ਜਾਏ ਤਾਂ ਵਿੰਡੋਜ ਦੇ ਅੰਦਰ ਦ੍ਰਿਸ਼ ਫਲੈਸ਼ ਕਰੋ"</string>
+ <string name="show_screen_updates_summary" msgid="2569622766672785529">"ਵਿੰਡੋ ਦੇ ਸਮੁੱਚੇ ਤਲਾਂ ਦੇ ਅੱਪਡੇਟ ਹੋਣ \'ਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਰੌਸ਼ਨ ਕਰੋ"</string>
+ <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ਦ੍ਰਿਸ਼ ਅੱਪਡੇਟਾਂ ਦਿਖਾਓ"</string>
+ <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"ਜਦੋਂ GPU ਨਾਲ ਡ੍ਰਾ ਕੀਤਾ ਜਾਏ ਤਾਂ ਵਿੰਡੋਜ਼ ਦੇ ਅੰਦਰ ਦ੍ਰਿਸ਼ ਫਲੈਸ਼ ਕਰੋ"</string>
<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>
+ <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ਹਾਰਡਵੇਅਰ ਲੇਅਰਾਂ ਅੱਪਡੇਟ ਹੋਣ \'ਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਹਰਾ ਕਰੋ"</string>
+ <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ਓਵਰਡ੍ਰਾ ਡੀਬੱਗ ਕਰੋ"</string>
<string name="debug_hw_renderer" msgid="7568529019431785816">"GPU ਰੈਂਡਰਰ ਸੈੱਟ ਕਰੋ"</string>
<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>
- <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ਟ੍ਰੇਸਿਜ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ"</string>
- <string name="usb_audio_disable_routing" msgid="8114498436003102671">"USB ਔਡੀਓ ਰੂਟਿੰਗ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
- <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"USB ਔਡੀਓ ਪੈਰੀਫਰਲ ਲਈ ਆਟੋਮੈਟਿਕ ਰੂਟਿੰਗ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
+ <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ਟ੍ਰੇਸਿਜ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="usb_audio_disable_routing" msgid="8114498436003102671">"USB ਆਡੀਓ ਰੂਟਿੰਗ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
+ <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"USB ਆਡੀਓ ਪੈਰੀਫਰਲ ਲਈ ਆਟੋਮੈਟਿਕ ਰੂਟਿੰਗ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="debug_layout" msgid="5981361776594526155">"ਲੇਆਉਟ ਬਾਊਂਡਸ ਦਿਖਾਓ"</string>
<string name="debug_layout_summary" msgid="2001775315258637682">"ਕਲਿਪ ਬਾਊਂਡਸ, ਮਾਰਜਿਨ ਆਦਿ ਦਿਖਾਓ"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL ਲੇਆਉਟ ਦਿਸ਼ਾ ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ਸਾਰੇ ਸਥਾਨਾਂ ਲਈ RTL ਵੱਲ ਸਕ੍ਰੀਨ ਲੇਆਉਟ ਦਿਸ਼ਾ ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU ਪ੍ਰਗਟਾਅ ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
+ <string name="force_hw_ui" msgid="6426383462520888732">"GPU ਰੈਂਡਰਿੰਗ ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
<string name="force_hw_ui_summary" msgid="5535991166074861515">"2d ਡ੍ਰਾਇੰਗ ਲਈ GPU ਦੀ ਵਰਤੋਂ ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
- <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ਐਪਸ ਵਿੱਚ 4x MSAA ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ"</string>
+ <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ਐਪਾਂ ਵਿੱਚ 4x MSAA ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"ਗ਼ੈਰ-ਆਇਤਾਕਾਰ ਕਲਿਪ ਓਪਰੇਸ਼ਨ ਡੀਬਗ ਕਰੋ"</string>
<string name="track_frame_time" msgid="6146354853663863443">"ਪ੍ਰੋਫਾਈਲ GPU ਰੈਂਡਰਿੰਗ"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ਵਿੰਡੋ ਐਨੀਮੇਸ਼ਨ ਸਕੇਲ"</string>
@@ -297,20 +295,20 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆ ਸੀਮਾ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ਸਾਰੇ ANR ਦਿਖਾਓ"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ਬੈਕਗਰਾਊਂਡ ਐਪਾਂ ਲਈ ਐਪ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੇ ਡਾਇਲੌਗ ਦਿਖਾਓ"</string>
- <string name="show_notification_channel_warnings" msgid="1399948193466922683">"ਸੂਚਨਾ ਚੈਨਲ ਚੇਤਾਵਨੀਆਂ ਦਿਖਾਓ"</string>
- <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"ਐਪ ਵੱਲੋਂ ਵੈਧ ਚੈਨਲ ਤੋਂ ਬਿਨਾਂ ਸੂਚਨਾ ਪੋਸਟ ਕਰਨ \'ਤੇ ਸਕ੍ਰੀਨ \'ਤੇ ਚੇਤਾਵਨੀ ਦਿਖਾਉਂਦੀ ਹੈ"</string>
+ <string name="show_notification_channel_warnings" msgid="1399948193466922683">"ਸੂਚਨਾ ਚੈਨਲ ਚਿਤਾਵਨੀਆਂ ਦਿਖਾਓ"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"ਐਪ ਵੱਲੋਂ ਵੈਧ ਚੈਨਲ ਤੋਂ ਬਿਨਾਂ ਸੂਚਨਾ ਪੋਸਟ ਕਰਨ \'ਤੇ ਸਕ੍ਰੀਨ \'ਤੇ ਚਿਤਾਵਨੀ ਦਿਖਾਉਂਦੀ ਹੈ"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"ਐਪਸ ਨੂੰ ਬਾਹਰਲੇ ਤੇ ਜ਼ਬਰਦਸਤੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ਮੁੜ-ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string>
- <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਮਲਟੀ-ਵਿੰਡੋ ਲਈ ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ ਨੂੰ ਆਕਾਰ ਬਦਲਣਯੋਗ ਬਣਾਓ।"</string>
- <string name="enable_freeform_support" msgid="1461893351278940416">"freeform windows ਨੂੰ ਯੋਗ ਬਣਾਓ"</string>
- <string name="enable_freeform_support_summary" msgid="8247310463288834487">"ਪ੍ਰਯੋਗਮਈ ਫ੍ਰੀਫਾਰਮ ਵਿੰਡੋਜ਼ ਲਈ ਸਮਰਥਨ ਨੂੰ ਯੋਗ ਬਣਾਓ।"</string>
- <string name="local_backup_password_title" msgid="3860471654439418822">"ਡੈਸਕਟੌਪ ਬੈਕਅਪ ਪਾਸਵਰਡ"</string>
- <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ਡੈਸਕਟੌਪ ਪੂਰੇ ਬੈਕਅਪਸ ਇਸ ਵੇਲੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਹਨ"</string>
+ <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ਮੈਨੀਫ਼ੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਮਲਟੀ-ਵਿੰਡੋ ਲਈ ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ ਨੂੰ ਆਕਾਰ ਬਦਲਣਯੋਗ ਬਣਾਓ।"</string>
+ <string name="enable_freeform_support" msgid="1461893351278940416">"freeform windows ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="enable_freeform_support_summary" msgid="8247310463288834487">"ਪ੍ਰਯੋਗਮਈ ਫ੍ਰੀਫਾਰਮ ਵਿੰਡੋਜ਼ ਲਈ ਸਮਰਥਨ ਨੂੰ ਚਾਲੂ ਕਰੋ।"</string>
+ <string name="local_backup_password_title" msgid="3860471654439418822">"ਡੈਸਕਟਾਪ ਬੈਕਅੱਪ ਪਾਸਵਰਡ"</string>
+ <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ਡੈਸਕਟਾਪ ਪੂਰੇ ਬੈਕਅੱਪ ਇਸ ਵੇਲੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਹਨ"</string>
<string name="local_backup_password_summary_change" msgid="5376206246809190364">"ਡੈਸਕਟਾਪ ਦੇ ਮੁਕੰਮਲ ਬੈਕਅੱਪਾਂ ਲਈ ਪਾਸਵਰਡ ਨੂੰ ਬਦਲਣ ਜਾਂ ਹਟਾਉਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="local_backup_password_toast_success" msgid="582016086228434290">"ਨਵਾਂ ਬੈਕਅਪ ਪਾਸਵਰਡ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="local_backup_password_toast_success" msgid="582016086228434290">"ਨਵਾਂ ਬੈਕਅੱਪ ਪਾਸਵਰਡ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ਨਵਾਂ ਪਾਸਵਰਡ ਅਤੇ ਪੁਸ਼ਟੀ ਮੇਲ ਨਹੀਂ ਖਾਂਦੀ"</string>
- <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ਬੈਕਅਪ ਪਾਸਵਰਡ ਸੈਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ"</string>
+ <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ਬੈਕਅੱਪ ਪਾਸਵਰਡ ਸੈੱਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"ਚਮਕੀਲਾ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
<item msgid="8446070607501413455">"ਕੁਦਰਤੀ"</item>
@@ -333,7 +331,7 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"ਤਬਦੀਲ ਕਰੋ ..."</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ਫ਼ਾਈਲ ਪਹਿਲਾਂ ਤੋਂ ਇਨਕ੍ਰਿਪਟਡ ਹੈ"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"ਫ਼ਾਈਲ ਆਧਾਰਿਤ ਇਨਕ੍ਰਿਪਸ਼ਨ ਵਿੱਚ ਤਬਦੀਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"ਡੈਟਾ ਪਾਰਟੀਸ਼ਨ ਦਾ ਫ਼ਾਈਲ ਆਧਾਰਿਤ ਇਨਕ੍ਰਿਪਸ਼ਨ ਵਿੱਚ ਰੁਪਾਂਤਰਣ ਕਰੋ\n !!ਚੇਤਾਵਨੀ!! ਇਹ ਤੁਹਾਡੇ ਸਾਰੇ ਡੈਟੇ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗਾ\n ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਪ੍ਰਯੋਗਿਕ ਹੈ, ਅਤੇ ਸ਼ਾਇਦ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।\n ਜਾਰੀ ਰੱਖਣ ਲਈ \'ਮਿਟਾਓ ਅਤੇ ਰੁਪਾਂਤਰਣ ਕਰੋ...\' ਨੂੰ ਦਬਾਓ।"</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">" ਡਾਟਾ ਪਾਰਟੀਸ਼ਨ ਦਾ ਫ਼ਾਈਲ ਆਧਾਰਿਤ ਇਨਕ੍ਰਿਪਸ਼ਨ ਵਿੱਚ ਰੁਪਾਂਤਰਣ ਕਰੋ\n !! ਚਿਤਾਵਨੀ !! ਇਹ ਤੁਹਾਡੇ ਸਾਰੇ ਡੈਟੇ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗਾ\n ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਪ੍ਰਯੋਗਿਕ ਹੈ, ਅਤੇ ਸ਼ਾਇਦ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।\n ਜਾਰੀ ਰੱਖਣ ਲਈ \'ਮਿਟਾਓ ਅਤੇ ਰੁਪਾਂਤਰਣ ਕਰੋ...\' ਨੂੰ ਦਬਾਓ।"</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"ਮਿਟਾਓ ਅਤੇ ਰੁਪਾਂਤਰਣ ਕਰੋ..."</string>
<string name="picture_color_mode" msgid="4560755008730283695">"ਤਸਵੀਰ ਰੰਗ ਮੋਡ"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"sRGB ਵਰਤੋਂ ਕਰੋ"</string>
@@ -356,7 +354,7 @@
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਤੱਕ <xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"ਅਗਿਆਤ"</string>
- <string name="battery_info_status_charging" msgid="1705179948350365604">"ਚਾਰਜਿੰਗ"</string>
+ <string name="battery_info_status_charging" msgid="1705179948350365604">"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="battery_info_status_discharging" msgid="310932812698268588">"ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ"</string>
<string name="battery_info_status_not_charging" msgid="8523453668342598579">"ਪਲੱਗ ਲੱਗਾ ਹੋਇਆ ਹੈ, ਇਸ ਸਮੇਂ ਚਾਰਜ ਨਹੀਂ ਹੋ ਸਕਦੀ"</string>
@@ -367,7 +365,7 @@
<string name="disabled" msgid="9206776641295849915">"ਅਯੋਗ ਬਣਾਇਆ"</string>
<string name="external_source_trusted" msgid="2707996266575928037">"ਇਜਾਜ਼ਤ ਹੈ"</string>
<string name="external_source_untrusted" msgid="2677442511837596726">"ਇਜਾਜ਼ਤ ਨਹੀਂ"</string>
- <string name="install_other_apps" msgid="6986686991775883017">"ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਿਤ ਕਰੋ"</string>
+ <string name="install_other_apps" msgid="6986686991775883017">"ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰੋ"</string>
<string name="home" msgid="3256884684164448244">"ਸੈਟਿੰਗਾਂ ਮੁੱਖ ਪੰਨਾ"</string>
<string-array name="battery_labels">
<item msgid="8494684293649631252">"0%"</item>
@@ -381,8 +379,8 @@
<string name="screen_zoom_summary_large" msgid="4835294730065424084">"ਵੱਡੀ"</string>
<string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"ਥੋੜ੍ਹਾ ਵੱਡੀ"</string>
<string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ਸਭ ਤੋਂ ਵੱਡੀ"</string>
- <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
- <string name="help_feedback_label" msgid="6815040660801785649">"ਮਦਦ ਅਤੇ ਪ੍ਰਤੀਕਰਮ"</string>
+ <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ਵਿਉਂਂਤੀ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
+ <string name="help_feedback_label" msgid="6815040660801785649">"ਮਦਦ & ਫੀਡਬੈਕ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ਮੀਨੂ"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ਡੈਮੋ ਮੋਡ \'ਚ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਲਈ ਪਾਸਵਰਡ ਦਿਓ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ਅੱਗੇ"</string>
@@ -390,6 +388,6 @@
<string name="active_input_method_subtypes" msgid="3596398805424733238">"ਸਰਗਰਮ ਇਨਪੁਟ ਵਿਧੀਆਂ"</string>
<string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ਸਿਸਟਮ ਭਾਸ਼ਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> ਲਈ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਵਿੱਚ ਅਸਫਲ"</string>
- <string name="ime_security_warning" msgid="4135828934735934248">"ਇਹ ਇਨਪੁੱਟ ਵਿਧੀ ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤੇ ਜਾਣ ਵਾਲੀ ਸਾਰੀ ਲਿਖਤ ਇਕੱਤਰ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੋ ਸਕਦੀ ਹੈ, ਨਿੱਜੀ ਡਾਟਾ ਸਮੇਤ ਜਿਵੇਂ ਪਾਸਵਰਡ ਅਤੇ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ। ਇਹ <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>ਐਪ ਤੋਂ ਆਉਂਦਾ ਹੈ। ਕੀ ਇਸ ਇਨਪੁੱਟ ਵਿਧੀ ਨੂੰ ਵਰਤਣਾ ਹੈ?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"ਨੋਟ ਕਰੋ: ਰੀਬੂਟ ਤੋਂ ਬਾਅਦ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਆਪਣਾ ਫ਼ੋਨ ਅਨਲੌਕ ਨਹੀਂ ਕਰਦੇ ਤਦ ਤੱਕ ਇਹ ਐਪ ਚਾਲੂ ਨਹੀਂ ਹੋ ਸਕਦੀ"</string>
+ <string name="ime_security_warning" msgid="4135828934735934248">"ਇਹ ਇਨਪੁੱਟ ਵਿਧੀ ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤਾ ਜਾਣ ਵਾਲੀ ਸਾਰੀ ਲਿਖਤ ਇਕੱਤਰ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੋ ਸਕਦੀ ਹੈ, ਨਿੱਜੀ ਡਾਟਾ ਸਮੇਤ ਜਿਵੇਂ ਪਾਸਵਰਡ ਅਤੇ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ। ਇਹ <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> ਐਪ ਤੋਂ ਆਉਂਦਾ ਹੈ। ਕੀ ਇਹ ਸਪੈੱਲ ਚੈਕਰ ਵਰਤਣਾ ਹੈ?"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"ਨੋਟ ਕਰੋ: ਰੀਬੂਟ ਤੋਂ ਬਾਅਦ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਆਪਣਾ ਫ਼ੋਨ ਅਣਲਾਕ ਨਹੀਂ ਕਰਦੇ ਤਦ ਤੱਕ ਇਹ ਐਪ ਚਾਲੂ ਨਹੀਂ ਹੋ ਸਕਦੀ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index 94f497c..c0427c8 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (domyślna)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Użyj wyboru systemu (domyślnie)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Włącz opcjonalne kodeki"</item>
+ <item msgid="3304843301758635896">"Wyłącz opcjonalne kodeki"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Użyj wyboru systemu (domyślnie)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Audio <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Włączenie opcjonalnych kodeków"</item>
+ <item msgid="741805482892725657">"Wyłączenie opcjonalnych kodeków"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Użyj wyboru systemu (domyślnie)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 43cec53..59d4724 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Zawsze szukaj Wi-Fi w roamingu"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilna transmisja danych zawsze aktywna"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Akceleracja sprzętowa tetheringu"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Pokaż urządzenia Bluetooth bez nazw"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Wyłącz głośność bezwzględną"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Włącz dzwonek w kanale dźwiękowym"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Wersja AVRCP Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Te ustawienia są przeznaczone wyłącznie dla programistów. Ich użycie może spowodować uszkodzenie lub nieprawidłowe działanie urządzenia i zainstalowanych na nim aplikacji."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Zweryfikuj aplikacje przez USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Sprawdź, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Zostaną wyświetlone urządzenia Bluetooth bez nazw (tylko adresy MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Wyłącza funkcję Głośność bezwzględna Bluetooth, jeśli występują problemy z urządzeniami zdalnymi, np. zbyt duża głośność lub brak kontroli."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Zezwala na odtwarzanie dzwonków telefonu w zestawach słuchawkowych Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal lokalny"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index a5f5f5c..4695829 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (padrão)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Usar seleção do sistema (padrão)"</item>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 5262993..4e85684 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sempre permitir verif. de roaming de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Dados móveis sempre ativos"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleração de hardware de tethering"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostrar dispositivos Bluetooth sem nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desativar volume absoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Ativar o toque em banda"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versão do Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Essas configurações são destinadas apenas para o uso de desenvolvedores. Elas podem causar a desativação ou mau funcionamento do dispositivo e dos apps contidos nele."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar apps por USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificar comportamento nocivo em apps instalados via ADB/ADT."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Dispositivos Bluetooth sem nomes (somente endereços MAC) serão exibidos"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Desativa o recurso Bluetooth de volume absoluto em caso de problemas com o volume em dispositivos remotos, como volume excessivamente alto ou falta de controle."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permitir que os toques no smartphone sejam reproduzidos em fones de ouvido Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index 87dbe75..78a24c4 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (predefinição)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Utilizar seleção do sistema (predef.)"</item>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 9ad38e1e..44035d4 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir sempre a deteção de Wi-Fi em roaming"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Dados móveis sempre ativos"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleração de hardware para ligação (à Internet) via telemóvel"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostrar dispositivos Bluetooth sem nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desativar volume absoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Ativar toque dentro da banda"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versão de Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Estas definições destinam-se apenas a programação. Podem fazer com que o seu aparelho e as aplicações nele existentes falhem ou funcionem mal."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicações de USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificar as aplicações instaladas via ADB/ADT para detetar comportamento perigoso."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"São apresentados os dispositivos Bluetooth sem nomes (apenas endereços MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Desativa a funcionalidade de volume absoluto do Bluetooth caso existam problemas de volume com dispositivos remotos, como um volume insuportavelmente alto ou a ausência de controlo."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permitir que os toques no telemóvel sejam reproduzidos em auscultadores com microfone integrado Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index a5f5f5c..4695829 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (padrão)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Usar seleção do sistema (padrão)"</item>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 5262993..4e85684 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sempre permitir verif. de roaming de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Dados móveis sempre ativos"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleração de hardware de tethering"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostrar dispositivos Bluetooth sem nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desativar volume absoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Ativar o toque em banda"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versão do Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Essas configurações são destinadas apenas para o uso de desenvolvedores. Elas podem causar a desativação ou mau funcionamento do dispositivo e dos apps contidos nele."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar apps por USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificar comportamento nocivo em apps instalados via ADB/ADT."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Dispositivos Bluetooth sem nomes (somente endereços MAC) serão exibidos"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Desativa o recurso Bluetooth de volume absoluto em caso de problemas com o volume em dispositivos remotos, como volume excessivamente alto ou falta de controle."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permitir que os toques no smartphone sejam reproduzidos em fones de ouvido Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index 3877bc9..b62014e 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (prestabilit)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Folosiți selectarea sist. (prestabilit)"</item>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 717d690..09bcc8f 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -170,9 +170,9 @@
<string name="vpn_settings_not_available" msgid="956841430176985598">"Setările VPN nu sunt disponibile pentru acest utilizator"</string>
<string name="tethering_settings_not_available" msgid="6765770438438291012">"Setările pentru tethering nu sunt disponibile pentru acest utilizator"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Setările pentru „Nume puncte de acces” nu sunt disponibile pentru acest utilizator"</string>
- <string name="enable_adb" msgid="7982306934419797485">"Depanare USB"</string>
+ <string name="enable_adb" msgid="7982306934419797485">"Remedierea erorilor prin USB"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"Mod de depanare când este conectat USB"</string>
- <string name="clear_adb_keys" msgid="4038889221503122743">"Revoc autorizații depanare USB"</string>
+ <string name="clear_adb_keys" msgid="4038889221503122743">"Revoc autorizații remediere a erorilor prin USB"</string>
<string name="bugreport_in_power" msgid="7923901846375587241">"Comandă rapidă pentru raportul de erori"</string>
<string name="bugreport_in_power_summary" msgid="1778455732762984579">"Afișați un buton în meniul de pornire pentru a realiza un raport de erori"</string>
<string name="keep_screen_on" msgid="1146389631208760344">"Activ permanent"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Se permite întotdeauna scanarea traficului Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Date mobile permanent active"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Accelerare hardware pentru tethering"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Afișați dispozitivele Bluetooth fără nume"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Dezactivați volumul absolut"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activați soneria în căști"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versiunea AVRCP pentru Bluetooth"</string>
@@ -227,15 +226,14 @@
<string name="debug_view_attributes" msgid="6485448367803310384">"Activați inspectarea atributelor de vizualizare"</string>
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Păstrați întotdeauna conexiunea de date mobile activată, chiar și atunci când funcția Wi‑Fi este activată (pentru comutarea rapidă între rețele)."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Folosiți accelerarea hardware pentru tethering, dacă este disponibilă"</string>
- <string name="adb_warning_title" msgid="6234463310896563253">"Permiteți depanarea USB?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"Depanarea USB are exclusiv scopuri de dezvoltare. Utilizați-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale."</string>
+ <string name="adb_warning_title" msgid="6234463310896563253">"Permiteți remedierea erorilor prin USB?"</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"Remedierea erorilor prin USB are exclusiv scopuri de dezvoltare. Utilizați-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"Revocați accesul la remedierea erorilor prin USB de pe toate computerele pe care le-ați autorizat anterior?"</string>
<string name="dev_settings_warning_title" msgid="7244607768088540165">"Permiteți setările pentru dezvoltare?"</string>
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Aceste setări sunt destinate exclusiv utilizării pentru dezvoltare. Din cauza lor, este posibil ca dispozitivul dvs. și aplicațiile de pe acesta să nu mai funcționeze sau să funcționeze necorespunzător."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificați aplicațiile prin USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificați aplicațiile instalate utilizând ADB/ADT, pentru a detecta un comportament dăunător."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Vor fi afișate dispozitivele Bluetooth fără nume (numai adresele MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Dezactivează funcția Bluetooth de volum absolut în cazul problemelor de volum apărute la dispozitivele la distanță, cum ar fi volumul mult prea ridicat sau lipsa de control asupra acestuia."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Permiteți ca tonurile de sonerie de pe telefon să fie redate prin căștile Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Aplicație terminal locală"</string>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index abebbe7..05ccc80 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (по умолчанию)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Выбор системы (по умолчанию)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Аудиокодек: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Аудиокодек: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Включить дополнительные кодеки"</item>
+ <item msgid="3304843301758635896">"Отключить дополнительные кодеки"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Выбор системы (по умолчанию)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Аудиокодек: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Аудиокодек: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Включить дополнительные кодеки"</item>
+ <item msgid="741805482892725657">"Отключить дополнительные кодеки"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Выбор системы (по умолчанию)"</item>
<item msgid="8895532488906185219">"44,1 кГц"</item>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index c51295d..6563ac1 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Всегда включать поиск сетей Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Не отключать мобильный Интернет"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Аппаратное ускорение в режиме модема"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Показывать Bluetooth-устройства без названий"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Отключить абсолютный уровень громкости"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Включить внутриполосное воспроизведение"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версия Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Только для разработчиков. Изменение этих настроек может привести к сбоям или неправильной работе устройства и приложений."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Проверять приложения при установке"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Выполнять проверку безопасности приложений при установке через ADB/ADT"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Показывать Bluetooth-устройства без названий (только с MAC-адресами)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Отключить абсолютный уровень громкости Bluetooth при возникновении проблем на удаленных устройствах, например при слишком громком звучании или невозможности контролировать настройку."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Разрешить воспроизведение рингтонов на телефоне через Bluetooth-гарнитуру"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Локальный терминальный доступ"</string>
diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml
index 60f951e..2808ba3 100644
--- a/packages/SettingsLib/res/values-si/arrays.xml
+++ b/packages/SettingsLib/res/values-si/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (පෙරනිමි)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"පද්ධති තේරීම භාවිත කරන්න (පෙරනිමි)"</item>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 794272b..3fb05b0 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi රෝම් පරිලෝකන වෙතට සැමවිට අවසර දෙන්න"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"ජංගම දත්ත සැමවිට ක්රියාකාරීය"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ටෙදරින් දෘඪාංග ත්වරණය"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"නම් නොමැති බ්ලූටූත් උපාංග පෙන්වන්න"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"නිරපේක්ෂ හඩ පරිමාව අබල කරන්න"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"කලාපය තුළ නාද වීම සබල කරන්න"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"බ්ලූටූත් AVRCP අනුවාදය"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"මෙම සැකසීම් වර්ධක භාවිතය සඳහා පමණි. ඔබගේ උපාංගයේ සහ යෙදුම්වල අක්රිය වීමට හෝ වැරදි ක්රියා කෙරුමකට ඒවා බලපෑ හැක."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ඔස්සේ යෙදුම් සත්යාපනය කරගන්න"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT හරහා ස්ථාපනය වූ යෙදුම්, විනාශකාරී ක්රියාවන් ඇත්දැයි පරික්ෂාකර බලන්න."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"නම් නොමැති බ්ලූටූත් උපාංග (MAC ලිපින පමණි) සංදර්ශනය කරනු ඇත"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"පිළිගත නොහැකි ලෙස වැඩි හඩ පරිමාව හෝ පාලනය නොමැති වීම යනාදී දුරස්ථ උපාංග සමගින් වන හඬ පරිමා ගැටලුවලදී බ්ලූටූත් නිරපේක්ෂ හඬ පරිමා විශේෂාංගය අබල කරයි."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"දුරකථනයේ නාද රටාවලට බ්ලූටූත් මත වාදනය වීමට ඉඩ දෙන්න"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"අභ්යන්තර අන්තය"</string>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index d28e530..f3c25b4 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (predvolené)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Použiť voľbu systému (predvolené)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Zvuk: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Zvuk: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Povoliť voliteľné kodeky"</item>
+ <item msgid="3304843301758635896">"Zakázať voliteľné kodeky"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Použiť voľbu systému (predvolené)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Zvuk: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Zvuk: <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Povoliť voliteľné kodeky"</item>
+ <item msgid="741805482892725657">"Zakázať voliteľné kodeky"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Použiť voľbu systému (predvolené)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index fd9b449..1ccfda6 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -26,7 +26,7 @@
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Vypnuté"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Zlyhanie konfigurácie adresy IP"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"Nepripojené z dôvodu siete nízkej kvality"</string>
- <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Zlyhanie pripojenia Wi-Fi"</string>
+ <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_cant_connect" msgid="5410016875644565884">"Nedá sa pripojiť"</string>
<string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"K sieti <xliff:g id="AP_NAME">%1$s</xliff:g> sa nedá pripojiť"</string>
@@ -99,12 +99,12 @@
<string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Nepodarilo sa spárovať so zariadením <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, pretože ste zadali nesprávny kód PIN alebo prístupový kľúč."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"So zariadením <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nie je možné komunikovať."</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"Párovanie odmietnuté zariadením <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
- <string name="accessibility_wifi_off" msgid="1166761729660614716">"Sieť Wi-Fi je vypnutá."</string>
- <string name="accessibility_no_wifi" msgid="8834610636137374508">"Sieť Wi-Fi je odpojená."</string>
- <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Jedna čiarka signálu Wi-Fi."</string>
- <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dve čiarky signálu Wi-Fi."</string>
- <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tri čiarky signálu Wi-Fi."</string>
- <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Plný signál Wi-Fi."</string>
+ <string name="accessibility_wifi_off" msgid="1166761729660614716">"Sieť Wi‑Fi je vypnutá."</string>
+ <string name="accessibility_no_wifi" msgid="8834610636137374508">"Sieť Wi‑Fi je odpojená."</string>
+ <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Jedna čiarka signálu Wi‑Fi."</string>
+ <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dve čiarky signálu Wi‑Fi."</string>
+ <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tri čiarky signálu Wi‑Fi."</string>
+ <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Plný signál Wi‑Fi."</string>
<string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Otvorená sieť"</string>
<string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Zabezpečená sieť"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"OS Android"</string>
@@ -188,13 +188,12 @@
<string name="mock_location_app_set" msgid="8966420655295102685">"Aplikácia so simulovanou polohou: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="debug_networking_category" msgid="7044075693643009662">"Siete"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"Certifikácia bezdrôtového zobrazenia"</string>
- <string name="wifi_verbose_logging" msgid="4203729756047242344">"Podrobné denníky Wi-Fi"</string>
- <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Agres. odovzdávať Wi-Fi na mobilnú sieť"</string>
- <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vždy povoliť funkciu Wi-Fi Roam Scans"</string>
+ <string name="wifi_verbose_logging" msgid="4203729756047242344">"Podrobné denníky Wi‑Fi"</string>
+ <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Agres. odovzdávať Wi‑Fi na mobilnú sieť"</string>
+ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vždy povoliť funkciu Wi‑Fi Roam Scans"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilné dáta ponechať vždy aktívne"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardvérovú akcelerácia pre tethering"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Zobrazovať zariadenia Bluetooth bez názvov"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Zakázať absolútnu hlasitosť"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Povoliť zvonenie v hovorovom pásme"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verzia rozhrania Bluetooth AVRCP"</string>
@@ -211,8 +210,8 @@
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Vybrať kodek LDAC Bluetooth Audio:\nKvalita prehrávania"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streamovanie: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Zobraziť možnosti certifikácie bezdrôtového zobrazenia"</string>
- <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšiť úroveň denníkov Wi-Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi-Fi"</string>
- <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"Keď túto možnosť zapnete, Wi-Fi bude agresívnejšie odovzdávať dátové pripojenie na mobilnú sieť vtedy, keď bude slabý signál Wi-Fi"</string>
+ <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšiť úroveň denníkov Wi‑Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi‑Fi"</string>
+ <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"Keď túto možnosť zapnete, Wi‑Fi bude agresívnejšie odovzdávať dátové pripojenie na mobilnú sieť vtedy, keď bude slabý signál Wi‑Fi"</string>
<string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"Povoliť alebo zakázať funkciu Wifi Roam Scans na základe objemu prenosu údajov v rozhraní"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Vyrovnávacia pamäť nástroja denníkov"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Veľkosť vyrovnávacej pamäte nástroja denníkov"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Tieto nastavenia sú určené len pre vývojárov. Môžu spôsobiť poruchu alebo nesprávne fungovanie zariadenia a nainštalovaných aplikácií."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Overovať aplikácie z USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrolovať škodlivosť aplikácií nainštalovaných pomocou nástroja ADB alebo ADT"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Zariadenia Bluetooth sa budú zobrazovať bez názvov (iba adresy MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Umožňuje zakázať funkciu absolútnej hlasitosti rozhrania Bluetooth v prípade problémov s hlasitosťou na vzdialených zariadeniach, ako je napríklad neprijateľne vysoká hlasitosť alebo absencia ovládacích prvkov."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Umožňuje prehrávať tóny zvonenia na telefóne v náhlavných súpravách Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Miestny terminál"</string>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index e095240..a924bdb 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (privzeto)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Uporabi sistemsko izbiro (privzeto)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Zvok <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Zvok <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Omogoči izbirne kodeke"</item>
+ <item msgid="3304843301758635896">"Onemogoči izbirne kodeke"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Uporabi sistemsko izbiro (privzeto)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Zvok <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Zvok <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Omogoči izbirne kodeke"</item>
+ <item msgid="741805482892725657">"Onemogoči izbirne kodeke"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Uporabi sistemsko izbiro (privzeto)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 0fbbfac..de13147 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vedno omogoči iskanje omrežij Wi-Fi za gostovanje"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Prenos podatkov v mobilnem omrežju je vedno aktiven"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Strojno pospeševanje za internetno povezavo prek mobilnega telefona"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Naprave Bluetooth prikaži brez imen"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogočanje absolutnega praga glasnosti"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Omogoči zvonjenje iz telefona"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Različica profila AVRCP za Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Te nastavitve so namenjene samo za razvijanje in lahko povzročijo prekinitev ali napačno delovanje naprave in aplikacij v njej."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Preveri aplikacije prek USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Preveri, ali so aplikacije, nameščene prek ADB/ADT, škodljive."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Naprave Bluetooth bodo prikazane brez imen (samo z naslovi MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Onemogoči funkcijo absolutnega praga glasnosti za Bluetooth, če pride do težav z glasnostjo z oddaljenimi napravami, kot je nesprejemljivo visoka glasnost ali pomanjkanje nadzora."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Omogoči, da se toni zvonjenja v telefonu predvajajo v slušalkah z mikrofonom Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string>
diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml
index 7fa2622..244a534 100644
--- a/packages/SettingsLib/res/values-sq/arrays.xml
+++ b/packages/SettingsLib/res/values-sq/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (I parazgjedhur)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Përdor përzgjedhjen e sistemit (e parazgjedhur)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Audioja e <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Audioja e <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Aktivizo kodekët opsionalë"</item>
+ <item msgid="3304843301758635896">"Çaktivizo kodekët opsionalë"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Përdor përzgjedhjen e sistemit (e parazgjedhur)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Audioja e <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Audioja e <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Aktivizo kodekët opsionalë"</item>
+ <item msgid="741805482892725657">"Çaktivizo kodekët opsionalë"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Përdor përzgjedhjen e sistemit (e parazgjedhur)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 48e0506..f77818d 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Lejo gjithmonë skanimet për Wi-Fi edhe kur je në lëvizje"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Të dhënat celulare gjithmonë aktive"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Përshpejtimi i harduerit për ndarjen"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Shfaq pajisjet me Bluetooth pa emra"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Çaktivizo volumin absolut"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Aktivizo zilen brenda të njëjtit brez"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versioni AVRCP i Bluetooth-it"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Këto cilësime janë të projektuara vetëm për përdorim në programim. Ato mund të shkaktojnë që pajisja dhe aplikacionet në të, të mos punojnë ose të veprojnë në mënyrë të gabuar."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifiko apl. përmes USB-së"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrollo aplikacionet e instaluara nëpërmjet ADB/ADT për sjellje të dëmshme."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Pajisjet me Bluetooth do të shfaqen pa emra (vetëm adresat MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Çaktivizon funksionin e volumit absolut të Bluetooth në rast të problemeve të volumit me pajisjet në largësi, si p.sh. një volum i lartë i papranueshëm ose mungesa e kontrollit."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Lejo që zilet në telefon të luhen në kufjet me \"Bluetooth\""</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Terminali lokal"</string>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 4e2d102..4486bf1 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (подразумевано)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Користи избор система (подразумевано)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Омогући опционалне кодеке"</item>
+ <item msgid="3304843301758635896">"Онемогући опционалне кодеке"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Користи избор система (подразумевано)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> аудио"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> аудио"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Омогући опционалне кодеке"</item>
+ <item msgid="741805482892725657">"Онемогући опционалне кодеке"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Користи избор система (подразумевано)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index cb105f4..2b59fee 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Увек дозволи скенирање Wi‑Fi-ја у ромингу"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Мобилни подаци су увек активни"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Хардверско убрзање привезивања"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Прикажи Bluetooth уређаје без назива"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Онемогући главно подешавање јачине звука"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Омогућавање звоњаве на истом каналу"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Верзија Bluetooth AVRCP-а"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ова подешавања су намењена само за програмирање. Могу да изазову престанак функционисања или неочекивано понашање уређаја и апликација на њему."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Верификуј апликације преко USB-а"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Проверава да ли су апликације инсталиране преко ADB-а/ADT-а штетне."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Биће приказани Bluetooth уређаји без назива (само са MAC адресама)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Онемогућава главно подешавање јачине звука на Bluetooth уређају у случају проблема са јачином звука на даљинским уређајима, као што су изузетно велика јачина звука или недостатак контроле."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Омогућите да се мелодија звона на телефону пушта преко Bluetooth слушалица"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Локални терминал"</string>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index b9b30be..cc7bcc8 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (standard)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Använd systemval (standardinställning)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-ljud"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-ljud"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Aktivera valfria kodekar"</item>
+ <item msgid="3304843301758635896">"Inaktivera valfria kodekar"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Använd systemval (standardinställning)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>-ljud"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>-ljud"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Aktivera valfria kodekar"</item>
+ <item msgid="741805482892725657">"Inaktivera valfria kodekar"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Använd systemval (standardinställning)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
@@ -155,31 +173,31 @@
<item msgid="8489661142527693381">"endast buffert av kernellogg"</item>
</string-array>
<string-array name="window_animation_scale_entries">
- <item msgid="8134156599370824081">"Animering avstängd"</item>
- <item msgid="6624864048416710414">"Animering i skala 0,5x"</item>
- <item msgid="2219332261255416635">"Animering i skala 1x"</item>
- <item msgid="3544428804137048509">"Animering i skala 1,5x"</item>
- <item msgid="3110710404225974514">"Animering i skala 2x"</item>
- <item msgid="4402738611528318731">"Animering i skala 5x"</item>
- <item msgid="6189539267968330656">"Animering i skala 10x"</item>
+ <item msgid="8134156599370824081">"Animation avstängd"</item>
+ <item msgid="6624864048416710414">"Animation i skala 0,5x"</item>
+ <item msgid="2219332261255416635">"Animation i skala 1x"</item>
+ <item msgid="3544428804137048509">"Animation i skala 1,5x"</item>
+ <item msgid="3110710404225974514">"Animation i skala 2x"</item>
+ <item msgid="4402738611528318731">"Animation i skala 5x"</item>
+ <item msgid="6189539267968330656">"Animation i skala 10x"</item>
</string-array>
<string-array name="transition_animation_scale_entries">
- <item msgid="8464255836173039442">"Animering avstängd"</item>
- <item msgid="3375781541913316411">"Animering i skala 0,5x"</item>
- <item msgid="1991041427801869945">"Animering i skala 1x"</item>
- <item msgid="4012689927622382874">"Animering i skala 1,5x"</item>
- <item msgid="3289156759925947169">"Animering i skala 2x"</item>
- <item msgid="7705857441213621835">"Animering i skala 5x"</item>
- <item msgid="6660750935954853365">"Animering i skala 10x"</item>
+ <item msgid="8464255836173039442">"Animation avstängd"</item>
+ <item msgid="3375781541913316411">"Animation i skala 0,5x"</item>
+ <item msgid="1991041427801869945">"Animation i skala 1x"</item>
+ <item msgid="4012689927622382874">"Animation i skala 1,5x"</item>
+ <item msgid="3289156759925947169">"Animation i skala 2x"</item>
+ <item msgid="7705857441213621835">"Animation i skala 5x"</item>
+ <item msgid="6660750935954853365">"Animation i skala 10x"</item>
</string-array>
<string-array name="animator_duration_scale_entries">
- <item msgid="6039901060648228241">"Animering avstängd"</item>
- <item msgid="1138649021950863198">"Animering i skala 0,5x"</item>
- <item msgid="4394388961370833040">"Animering i skala 1x"</item>
- <item msgid="8125427921655194973">"Animering i skala 1,5x"</item>
- <item msgid="3334024790739189573">"Animering i skala 2x"</item>
- <item msgid="3170120558236848008">"Animering i skala 5x"</item>
- <item msgid="1069584980746680398">"Animering i skala 10x"</item>
+ <item msgid="6039901060648228241">"Animation avstängd"</item>
+ <item msgid="1138649021950863198">"Animation i skala 0,5x"</item>
+ <item msgid="4394388961370833040">"Animation i skala 1x"</item>
+ <item msgid="8125427921655194973">"Animation i skala 1,5x"</item>
+ <item msgid="3334024790739189573">"Animation i skala 2x"</item>
+ <item msgid="3170120558236848008">"Animation i skala 5x"</item>
+ <item msgid="1069584980746680398">"Animation i skala 10x"</item>
</string-array>
<string-array name="overlay_display_devices_entries">
<item msgid="1606809880904982133">"Inga"</item>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index defbee9..6ab3799 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -92,7 +92,7 @@
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Använd för filöverföring"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Använd för inmatning"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parkoppling"</string>
- <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"KOPPLA"</string>
+ <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PARKOPPLA"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Avbryt"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Om du kopplar enheten får du tillgång till dina kontakter och din samtalshistorik när du är ansluten."</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Det gick inte att koppla till <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
@@ -111,10 +111,10 @@
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Borttagna appar"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Borttagna appar och användare"</string>
<string name="tether_settings_title_usb" msgid="6688416425801386511">"Internetdelning via USB"</string>
- <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Mobil surfpunkt"</string>
+ <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Mobil surfzon"</string>
<string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Delning via Bluetooth"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Internetdelning"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Internetdelning och surfpunkt"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Internetdelning och surfzon"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Alla jobbappar"</string>
<string name="user_guest" msgid="8475274842845401871">"Gäst"</string>
<string name="unknown" msgid="1592123443519355854">"Okänd"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillåt alltid sökning efter Wi-Fi-roaming"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobildata alltid aktiverad"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Maskinvaruacceleration för internetdelning"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Visa namnlösa Bluetooth-enheter"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inaktivera Absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Aktivera samtal inom nätverket"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"AVRCP-version för Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Inställningarna är endast avsedda att användas för utvecklingsändamål. De kan orsaka problem med enheten eller apparna som finns installerade på den."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifiera appar via USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrollera om appar som installeras via ADB/ADT kan vara skadliga."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth-enheter utan namn (enbart MAC-adresser) visas"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Inaktivera Bluetooth-funktionen Absolute volume om det skulle uppstå problem med volymen på fjärrenheter, t.ex. alldeles för hög volym eller brist på kontroll."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Tillåt att ringsignaler på mobilen kan spelas upp i Bluetooth-headset"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokal terminal"</string>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index 97b560a..b694687 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Chaguo-msingi)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index a7fba53..e5aa83f 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -122,7 +122,7 @@
<string name="launch_defaults_some" msgid="313159469856372621">"Baadhi ya chaguo-msingi zimewekwa"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Hakuna chaguo-misingi zilizowekwa"</string>
<string name="tts_settings" msgid="8186971894801348327">"Mipangilio ya kusoma maandishi kwa sauti"</string>
- <string name="tts_settings_title" msgid="1237820681016639683">"Kipengele cha kusoma maandishi kwa sauti"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"Kusoma maandishi kwa sauti"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"Kasi ya kutamka"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Kasi ya kutamkwa kwa maneno"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"Uzito wa sauti"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Ruhusu Uchanganuzi wa Matumizi ya Mitandao mingine"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Iendelee kutumia data ya simu"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Kuongeza kasi kwa kutumia maunzi ili kusambaza mtandao"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Onyesha vifaa vya Bluetooth visivyo na majina"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Zima sauti kamili"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Washa kipengele cha mlio wa simu katika kituo hicho hicho"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Toleo la Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Mipangilio hii imekusudiwa kwa matumizi ya usanidi tu. Inaweza kusababisha kifaa chako na programu zilizoko kuvunjika au kutofanya kazi vizuri."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Thibitisha programu kupitia USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kagua programu zilizosakinishwa kupitia ADB/ADT kwa tabia ya kudhuru."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Itaonyesha vifaa vya Bluetooth bila majina (anwani za MAC pekee)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Huzima kipengele cha Bluetooth cha sauti kamili kunapotokea matatizo ya sauti katika vifaa vya mbali kama vile sauti ya juu mno au inaposhindikana kuidhibiti."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Ruhusu milio ya simu kwenye simu ichezwe kwenye Vifaa vya sauti vya Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Kituo cha karibu"</string>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index 1c28912..2d75c01 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (இயல்பு)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"சாதனத் தேர்வைப் பயன்படுத்து (இயல்பு)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ஆடியோ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ஆடியோ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"கட்டாயமில்லா கோடெக்குகளை இயக்கு"</item>
+ <item msgid="3304843301758635896">"கட்டாயமில்லா கோடெக்குகளை முடக்கு"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"சாதனத் தேர்வைப் பயன்படுத்து (இயல்பு)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ஆடியோ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ஆடியோ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"கட்டாயமில்லா கோடெக்குகளை இயக்கு"</item>
+ <item msgid="741805482892725657">"கட்டாயமில்லா கோடெக்குகளை முடக்கு"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"சாதனத் தேர்வைப் பயன்படுத்து (இயல்பு)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
@@ -121,7 +139,7 @@
<item msgid="364670732877872677">"சிறந்த முறை (அடாப்டிவ் பிட் வீதம்)"</item>
</string-array>
<string-array name="select_logd_size_titles">
- <item msgid="8665206199209698501">"முடக்கு"</item>
+ <item msgid="8665206199209698501">"ஆஃப்"</item>
<item msgid="1593289376502312923">"64K"</item>
<item msgid="487545340236145324">"256K"</item>
<item msgid="2423528675294333831">"1M"</item>
@@ -129,13 +147,13 @@
<item msgid="2803199102589126938">"16M"</item>
</string-array>
<string-array name="select_logd_size_lowram_titles">
- <item msgid="6089470720451068364">"முடக்கு"</item>
+ <item msgid="6089470720451068364">"ஆஃப்"</item>
<item msgid="4622460333038586791">"64K"</item>
<item msgid="2212125625169582330">"256K"</item>
<item msgid="1704946766699242653">"1M"</item>
</string-array>
<string-array name="select_logd_size_summaries">
- <item msgid="6921048829791179331">"முடக்கத்தில்"</item>
+ <item msgid="6921048829791179331">"ஆஃப்"</item>
<item msgid="2969458029344750262">"64K / லாக் பஃபர்"</item>
<item msgid="1342285115665698168">"256K / லாக் பஃபர்"</item>
<item msgid="1314234299552254621">"1M / லாக் பஃபர்"</item>
@@ -143,13 +161,13 @@
<item msgid="5431354956856655120">"16M / லாக் பஃபர்"</item>
</string-array>
<string-array name="select_logpersist_titles">
- <item msgid="1744840221860799971">"முடக்கத்தில்"</item>
+ <item msgid="1744840221860799971">"ஆஃப்"</item>
<item msgid="3054662377365844197">"எல்லாம்"</item>
<item msgid="688870735111627832">"எல்லாம் (ரேடியோ தவிர்த்து)"</item>
<item msgid="2850427388488887328">"கெர்னல் மட்டும்"</item>
</string-array>
<string-array name="select_logpersist_summaries">
- <item msgid="2216470072500521830">"முடக்கத்தில்"</item>
+ <item msgid="2216470072500521830">"ஆஃப்"</item>
<item msgid="172978079776521897">"தற்காலிகமாகச் சேமித்த எல்லா பதிவுகளும்"</item>
<item msgid="3873873912383879240">"எல்லாம் (தற்காலிகமாகச் சேமித்த ரேடியோ பதிவுகள் தவிர்த்து)"</item>
<item msgid="8489661142527693381">"கெர்னல் லாக் பஃபர் மட்டும்"</item>
@@ -202,17 +220,17 @@
<item msgid="1340692776955662664">"glGetError இல் அழைப்பின் அடுக்கு"</item>
</string-array>
<string-array name="show_non_rect_clip_entries">
- <item msgid="993742912147090253">"முடக்கத்தில்"</item>
+ <item msgid="993742912147090253">"ஆஃப்"</item>
<item msgid="675719912558941285">"செவ்வகம் அல்லாத கிளிப் பகுதியை நீல நிறத்தில் வரையவும்"</item>
<item msgid="1064373276095698656">"சோதிக்கப்பட்ட வரைதல் கட்டளைகளைப் பச்சை நிறத்தில் தனிப்படுத்தவும்"</item>
</string-array>
<string-array name="track_frame_time_entries">
- <item msgid="2193584639058893150">"முடக்கத்தில்"</item>
+ <item msgid="2193584639058893150">"ஆஃப்"</item>
<item msgid="2751513398307949636">"திரையில் பட்டிகளாக"</item>
<item msgid="2355151170975410323">"<xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g> இல்"</item>
</string-array>
<string-array name="debug_hw_overdraw_entries">
- <item msgid="8190572633763871652">"முடக்கத்தில்"</item>
+ <item msgid="8190572633763871652">"ஆஃப்"</item>
<item msgid="7688197031296835369">"ஓவர்டிரா பகுதிகளைக் காட்டு"</item>
<item msgid="2290859360633824369">"நிறக்குருடின் பகுதிகளைக் காட்டு"</item>
</string-array>
@@ -229,7 +247,7 @@
<item msgid="7899496259191969307">"அதிகபட்சமாக 4 செயல்முறைகள்"</item>
</string-array>
<string-array name="usb_configuration_titles">
- <item msgid="488237561639712799">"சார்ஜ் ஏறுகிறது"</item>
+ <item msgid="488237561639712799">"சார்ஜ் ஆகிறது"</item>
<item msgid="5220695614993094977">"MTP (மீடியா பரிமாற்ற நெறிமுறை)"</item>
<item msgid="2086000968159047375">"PTP (படப் பரிமாற்ற நெறிமுறை)"</item>
<item msgid="7398830860950841822">"RNDIS (USB ஈத்தர்நெட்)"</item>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index c2fc83e..75420bd 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -116,7 +116,7 @@
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"டெதெரிங்"</string>
<string name="tether_settings_title_all" msgid="8356136101061143841">"டெதெரிங் & போர்டபிள் ஹாட்ஸ்பாட்"</string>
<string name="managed_user_title" msgid="8109605045406748842">"எல்லா பணிப் பயன்பாடுகளும்"</string>
- <string name="user_guest" msgid="8475274842845401871">"கெஸ்ட்"</string>
+ <string name="user_guest" msgid="8475274842845401871">"வேறொருவர்"</string>
<string name="unknown" msgid="1592123443519355854">"அறியப்படாத"</string>
<string name="running_process_item_user_label" msgid="3129887865552025943">"பயனர்: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="launch_defaults_some" msgid="313159469856372621">"சில இயல்புநிலைகள் அமைக்கப்பட்டன"</string>
@@ -191,10 +191,9 @@
<string name="wifi_verbose_logging" msgid="4203729756047242344">"வைஃபை அதிவிவர நுழைவை இயக்கு"</string>
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"ஒத்துழைக்காத வைஃபையிலிருந்து மொபைல் தரவிற்கு மாறு"</string>
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"எப்போதும் வைஃபை ரோமிங் ஸ்கேன்களை அனுமதி"</string>
- <string name="mobile_data_always_on" msgid="8774857027458200434">"மொபைல் தரவை எப்போதும் இயக்கத்திலேயே வை"</string>
+ <string name="mobile_data_always_on" msgid="8774857027458200434">"மொபைல் டேட்டாவை எப்போதும் இயக்கத்திலேயே வை"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"வன்பொருள் விரைவுப்படுத்துதல் இணைப்பு முறை"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"பெயர்கள் இல்லாத புளூடூத் சாதனங்களைக் காட்டு"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கு"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"இன்-பேண்ட் ரிங் செய்வதை இயக்கு"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"புளூடூத் AVRCP பதிப்பு"</string>
@@ -225,7 +224,7 @@
<string name="allow_mock_location" msgid="2787962564578664888">"போலி இருப்பிடங்களை அனுமதி"</string>
<string name="allow_mock_location_summary" msgid="317615105156345626">"போலி இருப்பிடங்களை அனுமதி"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"காட்சி பண்புக்கூறு சோதனையை இயக்கு"</string>
- <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"வைஃபை இயங்கும் போதும் (வேகமான நெட்வொர்க் மாற்றத்திற்கு), மொபைல் தரவை எப்போதும் இயக்கத்தில் வைக்கும்."</string>
+ <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"வைஃபை இயங்கும் போதும் (வேகமான நெட்வொர்க் மாற்றத்திற்கு), மொபைல் டேட்டாவை எப்போதும் இயக்கத்தில் வைக்கும்."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"வன்பொருள் விரைவுப்படுத்துதல் இணைப்பு முறை கிடைக்கும் போது, அதைப் பயன்படுத்தும்"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB பிழைத்திருத்தத்தை அனுமதிக்கவா?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"USB பிழைத்திருத்தம் மேம்படுத்தல் நோக்கங்களுக்காக மட்டுமே. அதை உங்கள் கணினி மற்றும் சாதனத்திற்கு இடையில் தரவை நகலெடுக்கவும், அறிவிப்பு இல்லாமல் உங்கள் சாதனத்தில் பயன்பாடுகளை நிறுவவும், பதிவு தரவைப் படிக்கவும் பயன்படுத்தவும்."</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"இந்த அமைப்பு மேம்பட்டப் பயன்பாட்டிற்காக மட்டுமே. உங்கள் சாதனம் மற்றும் அதில் உள்ள பயன்பாடுகளைச் சிதைக்கும் அல்லது தவறாகச் செயல்படும் வகையில் பாதிப்பை ஏற்படுத்தும்."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB பயன்பாடுகளை சரிபார்"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"தீங்கு விளைவிக்கும் செயல்பாட்டை அறிய ADB/ADT மூலம் நிறுவப்பட்டப் பயன்பாடுகளைச் சரிபார்."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"பெயர்கள் இல்லாத புளூடூத் சாதனங்கள் (MAC முகவரிகள் மட்டும்) காட்டப்படும்"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"மிகவும் அதிகமான ஒலியளவு அல்லது கட்டுப்பாடு இழப்பு போன்ற தொலைநிலைச் சாதனங்களில் ஏற்படும் ஒலி தொடர்பான சிக்கல்கள் இருக்கும் சமயங்களில், புளூடூத் அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கும்."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ஃபோனில் இருக்கும் ரிங்டோன்களை, புளூடூத் ஹெட்செட்களில் இயக்க அனுமதி"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"அக முனையம்"</string>
@@ -291,7 +289,7 @@
<string name="transition_animation_scale_title" msgid="387527540523595875">"அனிமேஷன் மாற்றத்தின் அளவு"</string>
<string name="animator_duration_scale_title" msgid="3406722410819934083">"அனிமேட்டர் கால அளவு"</string>
<string name="overlay_display_devices_title" msgid="5364176287998398539">"இரண்டாம்நிலைக் காட்சிகளை உருவகப்படுத்து"</string>
- <string name="debug_applications_category" msgid="4206913653849771549">"பயன்பாடுகள்"</string>
+ <string name="debug_applications_category" msgid="4206913653849771549">"ஆப்ஸ்"</string>
<string name="immediately_destroy_activities" msgid="1579659389568133959">"செயல்பாடுகளை வைத்திருக்காதே"</string>
<string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"பயனர் வெளியேறியதும் செயல்பாடுகளை நீக்கு"</string>
<string name="app_process_limit_title" msgid="4280600650253107163">"பின்புலச் செயல்முறை வரம்பு"</string>
@@ -356,18 +354,18 @@
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - முழு சார்ஜாக <xliff:g id="TIME">^2</xliff:g> ஆகும்"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"அறியப்படாத"</string>
- <string name="battery_info_status_charging" msgid="1705179948350365604">"சார்ஜ் ஏற்றப்படுகிறது"</string>
- <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"சார்ஜாகிறது"</string>
+ <string name="battery_info_status_charging" msgid="1705179948350365604">"சார்ஜ் ஆகிறது"</string>
+ <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"சார்ஜ் ஆகிறது"</string>
<string name="battery_info_status_discharging" msgid="310932812698268588">"சார்ஜ் செய்யப்படவில்லை"</string>
<string name="battery_info_status_not_charging" msgid="8523453668342598579">"செருகப்பட்டது, ஆனால் இப்போது சார்ஜ் செய்ய முடியவில்லை"</string>
- <string name="battery_info_status_full" msgid="2824614753861462808">"முழுமை"</string>
+ <string name="battery_info_status_full" msgid="2824614753861462808">"முழுவதும் சார்ஜ் ஆனது"</string>
<string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"நிர்வாகி கட்டுப்படுத்துகிறார்"</string>
<string name="enabled_by_admin" msgid="5302986023578399263">"நிர்வாகி இயக்கியுள்ளார்"</string>
<string name="disabled_by_admin" msgid="8505398946020816620">"நிர்வாகி முடக்கியுள்ளார்"</string>
<string name="disabled" msgid="9206776641295849915">"முடக்கப்பட்டது"</string>
<string name="external_source_trusted" msgid="2707996266575928037">"அனுமதிக்கப்பட்டது"</string>
<string name="external_source_untrusted" msgid="2677442511837596726">"அனுமதிக்கப்படவில்லை"</string>
- <string name="install_other_apps" msgid="6986686991775883017">"அறியப்படாத பயன்பாடுகளை நிறுவு"</string>
+ <string name="install_other_apps" msgid="6986686991775883017">"நிறுவுதல் (அறியாதவை)"</string>
<string name="home" msgid="3256884684164448244">"அமைப்புகள் முகப்பு"</string>
<string-array name="battery_labels">
<item msgid="8494684293649631252">"0%"</item>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index fbdfbe1..39d84dd 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (డిఫాల్ట్)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ఆడియో"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ఆడియో"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"ఐచ్ఛిక కోడెక్లను ప్రారంభించు"</item>
+ <item msgid="3304843301758635896">"ఐచ్ఛిక కోడెక్లను నిలిపివేయి"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ఆడియో"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ఆడియో"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"ఐచ్ఛిక కోడెక్లను ప్రారంభించు"</item>
+ <item msgid="741805482892725657">"ఐచ్ఛిక కోడెక్లను నిలిపివేయి"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 2b8795ae..23a98c2 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -192,12 +192,11 @@
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"మొబైల్కి మార్చేలా చురుకైన Wi‑Fi"</string>
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi సంచార స్కాన్లను ఎల్లప్పుడూ అనుమతించు"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"మొబైల్ డేటాని ఎల్లప్పుడూ సక్రియంగా ఉంచు"</string>
- <string name="tethering_hardware_offload" msgid="7470077827090325814">"టీథెరింగ్ హార్డ్వేర్ వేగవృద్ధి"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"టెథెరింగ్ హార్డ్వేర్ వేగవృద్ధి"</string>
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"పేర్లు లేని బ్లూటూత్ పరికరాలు చూపించు"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"సంపూర్ణ వాల్యూమ్ను నిలిపివేయి"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ఇన్-బ్యాండ్ రింగింగ్ని ప్రారంభించండి"</string>
- <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"బ్లూటూత్ AVRCP సంస్కరణ"</string>
+ <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"బ్లూటూత్ AVRCP వెర్షన్"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"బ్లూటూత్ AVRCP సంస్కరణను ఎంచుకోండి"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"బ్లూటూత్ ఆడియో కోడెక్"</string>
<string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"బ్లూటూత్ ఆడియో కోడెక్ని ఎంచుకోండి"</string>
@@ -210,7 +209,7 @@
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"బ్లూటూత్ ఆడియో LDAC కోడెక్: ప్లేబ్యాక్ నాణ్యత"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"బ్లూటూత్ ఆడియో LDAC కోడెక్ని ఎంచుకోండి:\nప్లేబ్యాక్ నాణ్యత"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ప్రసారం చేస్తోంది: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
- <string name="wifi_display_certification_summary" msgid="1155182309166746973">"వైర్లెస్ ప్రదర్శన ప్రమాణపత్రం కోసం ఎంపికలను చూపు"</string>
+ <string name="wifi_display_certification_summary" msgid="1155182309166746973">"వైర్లెస్ ప్రదర్శన సర్టిఫికెట్ కోసం ఎంపికలను చూపు"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string>
<string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"ప్రారంభించబడినప్పుడు, Wi‑Fi సిగ్నల్ బలహీనంగా ఉంటే డేటా కనెక్షన్ను మొబైల్కి మార్చేలా Wi‑Fi చురుగ్గా వ్యవహరిస్తుంది"</string>
<string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ఇంటర్ఫేస్లో ఉండే డేటా ట్రాఫిక్ పరిమాణం ఆధారంగా Wi‑Fi సంచార స్కాన్లను అనుమతించు/నిరాకరించు"</string>
@@ -226,7 +225,7 @@
<string name="allow_mock_location_summary" msgid="317615105156345626">"అనుకృత స్థానాలను అనుమతించు"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"వీక్షణ లక్షణ పర్యవేక్షణను ప్రారంభించు"</string>
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ఎల్లప్పుడూ మొబైల్ డేటాను సక్రియంగా ఉంచు, Wi‑Fi సక్రియంగా ఉన్నా కూడా (వేగవంతమైన నెట్వర్క్ మార్పు కోసం)."</string>
- <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"అందుబాటులో ఉంటే టీథెరింగ్ హార్డ్వేర్ వేగవృద్ధిని ఉపయోగించండి"</string>
+ <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"అందుబాటులో ఉంటే టెథెరింగ్ హార్డ్వేర్ వేగవృద్ధిని ఉపయోగించండి"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB డీబగ్గింగ్ను అనుమతించాలా?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"USB డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్ మరియు మీ పరికరం మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో అనువర్తనాలను ఇన్స్టాల్ చేయడానికి మరియు లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"మీరు గతంలో ప్రామాణీకరించిన అన్ని కంప్యూటర్ల నుండి USB డీబగ్గింగ్కు ప్రాప్యతను ఉపసంహరించాలా?"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ఈ సెట్టింగ్లు అభివృద్ధి వినియోగం కోసం మాత్రమే ఉద్దేశించబడినవి. వీటి వలన మీ పరికరం మరియు దీనిలోని యాప్లు విచ్ఛిన్నం కావచ్చు లేదా తప్పుగా ప్రవర్తించవచ్చు."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ద్వారా అనువర్తనాలను ధృవీకరించు"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"హానికరమైన ప్రవర్తన కోసం ADB/ADT ద్వారా ఇన్స్టాల్ చేయబడిన అనువర్తనాలను తనిఖీ చేయి."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"పేర్లు (MAC చిరునామాలు మాత్రమే) లేని బ్లూటూత్ పరికరాలు ప్రదర్శించబడతాయి"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"రిమోట్ పరికరాల్లో ఆమోదించలేని స్థాయిలో అధిక వాల్యూమ్ ఉండటం లేదా వాల్యూమ్ నియంత్రణ లేకపోవడం వంటి సమస్యలు ఉంటే బ్లూటూత్ సంపూర్ణ వాల్యూమ్ లక్షణాన్ని నిలిపివేస్తుంది."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"బ్లూటూత్ హెడ్సెట్లలో ప్లే చేయడానికి ఫోన్లో రింగ్టోన్లను అనుమతించండి"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"స్థానిక టెర్మినల్"</string>
@@ -385,7 +383,7 @@
<string name="help_feedback_label" msgid="6815040660801785649">"సహాయం & అభిప్రాయం"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"మెను"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"డెమో మోడ్లో ఫ్యాక్టరీ రీసెట్ను నిర్వహించడానికి పాస్వర్డ్ను నమోదు చేయండి"</string>
- <string name="retail_demo_reset_next" msgid="8356731459226304963">"తదుపరి"</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>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 201db5b..6d1c5d7 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ค่าเริ่มต้น)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"ใช้การเลือกระบบ (ค่าเริ่มต้น)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"เสียง <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"เสียง <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"เปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item>
+ <item msgid="3304843301758635896">"ปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"ใช้การเลือกระบบ (ค่าเริ่มต้น)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"เสียง <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"เสียง <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"เปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item>
+ <item msgid="741805482892725657">"ปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"ใช้การเลือกระบบ (ค่าเริ่มต้น)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 8b49036..8608ac4 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ใช้การสแกน Wi-Fi ข้ามเครือข่ายเสมอ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"เปิดใช้อินเทอร์เน็ตมือถือเสมอ"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"การเร่งฮาร์ดแวร์การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"แสดงอุปกรณ์บลูทูธที่ไม่มีชื่อ"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ปิดใช้การควบคุมระดับเสียงของอุปกรณ์อื่น"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"เปิดใช้การส่งเสียงในช่องสัญญาณเดียวกัน"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"เวอร์ชันของบลูทูธ AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"การตั้งค่านี้มีไว้เพื่อการพัฒนาเท่านั้น จึงอาจทำให้อุปกรณ์และแอปพลิเคชันที่มีอยู่เสียหายหรือทำงานผิดพลาดได้"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"ยืนยันแอปพลิเคชันผ่าน USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ตรวจสอบแอปพลิเคชันที่ติดตั้งผ่าน ADB/ADT เพื่อตรวจดูพฤติกรรมที่เป็นอันตราย"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"ระบบจะแสดงอุปกรณ์บลูทูธที่ไม่มีชื่อ (มีเฉพาะที่อยู่ MAC)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ปิดใช้ฟีเจอร์การควบคุมระดับเสียงของอุปกรณ์อื่นผ่านบลูทูธในกรณีที่มีปัญหาเกี่ยวกับระดับเสียงของอุปกรณ์ระยะไกล เช่น ระดับเสียงที่ดังเกินไปหรือระดับเสียงที่ไม่มีการควบคุม"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ให้เสียงเรียกเข้าในโทรศัพท์เล่นในชุดหูฟังบลูทูธ"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"เทอร์มินัลในตัวเครื่อง"</string>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index f913bc4..7a3fd30 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Gamitin ang Pagpili ng System (Default)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> na audio"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> na audio"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"I-enable ang Mga Opsyonal na Codec"</item>
+ <item msgid="3304843301758635896">"I-disable ang Mga Opsyonal na Codec"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Gamitin ang Pagpili ng System (Default)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> na audio"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> na audio"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"I-enable ang Mga Opsyonal na Codec"</item>
+ <item msgid="741805482892725657">"I-disable ang Mga Opsyonal na Codec"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Gamitin ang Pagpili ng System (Default)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index c054248..cc6121e 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_not_in_range" msgid="1136191511238508967">"Wala sa sakop"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Hindi awtomatikong kokonekta"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"Walang access sa Internet"</string>
- <string name="saved_network" msgid="4352716707126620811">"Na-save ni <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="saved_network" msgid="4352716707126620811">"Na-save ng <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Awtomatikong nakakonekta sa pamamagitan ng %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Awtomatikong nakakonekta sa pamamagitan ng provider ng rating ng network"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Nakakonekta sa pamamagitan ng %1$s"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Palaging payagan ang Mga Pag-scan sa Roaming ng Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Palaging aktibo ang mobile data"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardware acceleration para sa pag-tether"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Ipakita ang mga Bluetooth device na walang pangalan"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"I-disable ang absolute volume"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"I-enable ang pag-ring na nasa band"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bersyon ng AVRCP ng Bluetooth"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Nilalayon ang mga setting na ito para sa paggamit sa pag-develop lamang. Maaaring magsanhi ang mga ito ng pagkasira o hindi paggana nang maayos ng iyong device at mga application na nandito."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"I-verify ang mga app sa USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Tingnan kung may nakakahamak na pagkilos sa apps na na-install sa pamamagitan ng ADB/ADT."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Ipapakita ang mga Bluetooth device na walang pangalan (mga MAC address lang)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Dini-disable ang absolute volume feature ng Bluetooth kung may mga isyu sa volume ang mga malayong device gaya ng hindi katanggap-tanggap na malakas na volume o kawalan ng kontrol."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Payagan ang pag-play ng mga ringtone sa telepono sa mga headset na gumagamit ng Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Lokal na terminal"</string>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index 30c44ca..2a70fda 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Varsayılan)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Sistem Seçimini Kullan (Varsayılan)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ses"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ses"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"İsteğe Bağlı Codec\'leri Etkinleştir"</item>
+ <item msgid="3304843301758635896">"İsteğe Bağlı Codec\'leri Devre Dışı Bırak"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Sistem Seçimini Kullan (Varsayılan)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ses"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ses"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"İsteğe Bağlı Codec\'leri Etkinleştir"</item>
+ <item msgid="741805482892725657">"İsteğe Bağlı Codec\'leri Devre Dışı Bırak"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Sistem Seçimini Kullan (Varsayılan)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 69dd6be..fda52ef 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Kablosuz Dolaşım Taramalarına daima izin ver"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobil veri her zaman etkin"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering donanım hızlandırıcısı"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Adsız Bluetooth cihazlarını göster"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Mutlak sesi iptal et"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Bant içi zil çaldırmayı etkinleştir"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Sürümü"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Bu ayarlar yalnızca geliştirme amaçlıdır. Cihazınızın veya cihazdaki uygulamaların bozulmasına veya hatalı çalışmasına neden olabilir."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB\'den yüklenen uygulamaları doğrula"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT üzerinden yüklenen uygulamaları zararlı davranışlara karşı denetle."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Adsız Bluetooth cihazları (yalnızca MAC adresleri) gösterilecek"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Uzak cihazda sesin aşırı yüksek olması veya kontrol edilememesi gibi ses sorunları olması ihtimaline karşı Bluetooh mutlak ses özelliğini iptal eder."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Telefondaki zil seslerinin Bluetooth kulaklıklarda çalınmasına olanak tanır"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Yerel terminal"</string>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index 76b1b16..e3f21ad 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -60,13 +60,15 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (за умовчанням)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"acrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
<item msgid="7065842274271279580">"Використовувати вибір системи (за умовчанням)"</item>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 6b6e245..6d86a8d 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Завжди шукати мережі Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Не вимикати мобільне передавання даних"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Апаратне прискорення під час використання телефона в режимі модема"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Показувати пристрої Bluetooth без назв"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Вимкнути абсолютну гучність"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Увімкнути внутрішньосмугові сигнали"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версія Bluetooth AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Ці налаштування застосовуються лише з метою розробки. Вони можуть спричиняти вихід з ладу або неправильне функціонування вашого пристрою чи програм у ньому."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Встановлення через USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Перевіряти безпеку додатків, установлених через ADB/ADT."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Пристрої Bluetooth відображатимуться без назв (лише MAC-адреси)"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Функція абсолютної гучності Bluetooth вимикається, якщо на віддалених пристроях виникають проблеми, як-от надто висока гучність або втрата контролю."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Дозволити відтворювати сигнали дзвінка на телефоні через гарнітуру Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Локальний термінал"</string>
diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml
index d922361..8d46582 100644
--- a/packages/SettingsLib/res/values-ur/arrays.xml
+++ b/packages/SettingsLib/res/values-ur/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (ڈیفالٹ)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"سسٹم انتخاب کا استعمال کریں (ڈیفالٹ)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> آڈیو"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> آڈیو"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"اختیاری کوڈیکز کو فعال کریں"</item>
+ <item msgid="3304843301758635896">"اختیاری کوڈیکز کو غیر فعال کریں"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"سسٹم انتخاب کا استعمال کریں (ڈیفالٹ)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> آڈیو"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> آڈیو"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"اختیاری کوڈیکز کو فعال کریں"</item>
+ <item msgid="741805482892725657">"اختیاری کوڈیکز کو غیر فعال کریں"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"سسٹم انتخاب کا استعمال کریں (ڈیفالٹ)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 09e8318..3dd1b3e 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ہمیشہ Wi‑Fi روم اسکینز کی اجازت دیں"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"موبائل ڈیٹا ہمیشہ فعال رکھیں"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"ہارڈویئر کی سرعت کاری میں ربط بنایا جا رہا ہے"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"بغیر نام والے بلوٹوتھ آلات دکھائیں"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"مطلق والیوم کو غیر فعال کریں"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"ان بینڈ رنگنگ فعال کریں"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"بلوٹوتھ AVRCP ورژن"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"یہ ترتیبات صرف ڈویلپمنٹ استعمال کے ارادے سے ہیں۔ ان سے آپ کا آلہ اور اس پر موجود ایپلیکیشنز بریک ہو سکتی یا غلط برتاؤ کر سکتی ہیں۔"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB پر ایپس کی توثیق کریں"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"نقصان دہ رویے کے مدنظر ADB/ADT کی معرفت انسٹال شدہ ایپس کی جانچ کریں۔"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"بغیر نام والے بلوٹوتھ آلات (صرف MAC پتے) ڈسپلے کئے جائیں گے"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ریموٹ آلات کے ساتھ والیوم کے مسائل مثلاً نا قابل قبول حد تک بلند والیوم یا کنٹرول نہ ہونے کی صورت میں بلو ٹوتھ مطلق والیوم والی خصوصیت کو غیر فعال کریں۔"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"فون پر موجود رنگ ٹونز کو بلوٹوتھ ہیڈ سیٹز پر چلنے دیں"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"مقامی ٹرمینل"</string>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index 9d75b51..16d325fe 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (asosiy)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Tizim tanlovi (birlamchi)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audiokodeki"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audiokodeki"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Boshqa kodeklarni yoqish"</item>
+ <item msgid="3304843301758635896">"Boshqa kodeklarni o‘chirib qo‘yish"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Tizim tanlovi (birlamchi)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audiokodeki"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audiokodeki"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Boshqa kodeklarni yoqish"</item>
+ <item msgid="741805482892725657">"Boshqa kodeklarni o‘chirib qo‘yish"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Tizim tanlovi (birlamchi)"</item>
<item msgid="8895532488906185219">"44.1 kGs"</item>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 981b67e..dbdcb1c 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -65,7 +65,7 @@
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Ulangan (HSP/HFP/A2DP dan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon chaqiruvlari"</string>
- <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fayl o‘tkazish"</string>
+ <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fayl uzatish"</string>
<string name="bluetooth_profile_hid" msgid="3680729023366986480">"Kiritish qurilmasi"</string>
<string name="bluetooth_profile_pan" msgid="3391606497945147673">"Internetga kirish"</string>
<string name="bluetooth_profile_pbap" msgid="5372051906968576809">"Kontaktlarni ulashish"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi tarmoqlarini qidirishga doim ruxsat"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobil internet doim yoniq tursin"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Modem rejimida apparatli tezlashtirish"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth qurilmalarini nomlarisiz ko‘rsatish"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Ovoz balangligining mutlaq darajasini o‘chirib qo‘yish"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Bitta liniyada jiringlashni yoqish"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP versiyasi"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Bu sozlamalar faqat dasturlash maqsadlariga mo‘ljallangan. Shuning uchun, ular qurilmangizga va undagi ilovalariga shikast yetkazib, noto‘g‘ri ishlashiga sabab bo‘lishi mumkin."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB orqali o‘rnatish"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT orqali o‘rnatilgan ilovalar xavfsizligini tekshiring"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth qurilmalari nomsiz (faqat MAC manzillari) ko‘rsatiladi"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Masofadan ulanadigan qurilmalar bilan muammolar yuz berganda, jumladan, juda baland ovoz yoki sozlamalarni boshqarib bo‘lmaydigan holatlarda Bluetooth ovozi balandligining mutlaq darajasini o‘chirib qo‘yadi."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Bluetooth quloqliklarda ijro etish uchun telefonda ringtonlarga ruxsat bering"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Mahalliy terminal"</string>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index b87bd62..57e749f 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (Mặc định)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Sử dụng lựa chọn hệ thống (Mặc định)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"Âm thanh <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="2091430979086738145">"Âm thanh <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"Bật codec tùy chọn"</item>
+ <item msgid="3304843301758635896">"Tắt codec tùy chọn"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Sử dụng lựa chọn hệ thống (Mặc định)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"Âm thanh <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
+ <item msgid="298198075927343893">"Âm thanh <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g>"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"Bật codec tùy chọn"</item>
+ <item msgid="741805482892725657">"Tắt codec tùy chọn"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Sử dụng lựa chọn hệ thống (Mặc định)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index d5ee216..e6d4eb7 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Luôn cho phép quét chuyển vùng Wi‑Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Dữ liệu di động luôn hiện hoạt"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Tăng tốc phần cứng cho chia sẻ kết nối"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Hiển thị các thiết bị Bluetooth không có tên"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Vô hiệu hóa âm lượng tuyệt đối"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Bật đổ chuông trong dải"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth phiên bản AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Những cài đặt này chỉ dành cho mục đích phát triển. Chúng có thể làm cho thiết bị và ứng dụng trên thiết bị của bạn bị lỗi và hoạt động sai."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Xác minh ứng dụng qua USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kiểm tra các ứng dụng được cài đặt qua ADB/ADT để xem có hoạt động gây hại hay không."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Các thiết bị Bluetooth không có tên (chỉ có địa chỉ MAC) sẽ được hiển thị"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Vô hiệu hóa tính năng âm lượng tuyệt đối qua Bluetooth trong trường hợp xảy ra sự cố về âm lượng với các thiết bị từ xa, chẳng hạn như âm lượng lớn không thể chấp nhận được hoặc thiếu kiểm soát."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Cho phép nhạc chuông trên điện thoại được phát trên tai nghe Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Dòng lệnh cục bộ"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index ec59158..3a80e7b 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4(默认)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"使用系统选择(默认)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 音频"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 音频"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"启用可选编解码器"</item>
+ <item msgid="3304843301758635896">"停用可选编解码器"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"使用系统选择(默认)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 音频"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 音频"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"启用可选编解码器"</item>
+ <item msgid="741805482892725657">"停用可选编解码器"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"使用系统选择(默认)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index c6f9061..45d9835 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"一律允许WLAN漫游扫描"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"始终开启移动数据网络"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"网络共享硬件加速"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"显示没有名称的蓝牙设备"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"停用绝对音量功能"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"启用手机默认铃声"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"蓝牙 AVRCP 版本"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"这些设置仅适用于开发工作。一旦启用,会导致您的设备以及设备上的应用崩溃或出现异常。"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"通过USB验证应用"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"通过 ADB/ADT 检查安装的应用是否存在有害行为。"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"系统将显示没有名称(只有 MAC 地址)的蓝牙设备"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"停用蓝牙绝对音量功能,即可避免在连接到远程设备时出现音量问题(例如音量高得让人无法接受或无法控制音量等)。"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"允许手机铃声通过蓝牙耳机播放"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"本地终端"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 60d2a95..85c151e 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -22,7 +22,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="wifi_status">
<item msgid="1922181315419294640"></item>
- <item msgid="8934131797783724664">"掃瞄中…"</item>
+ <item msgid="8934131797783724664">"掃描中…"</item>
<item msgid="8513729475867537913">"正在連線..."</item>
<item msgid="515055375277271756">"正在驗證…"</item>
<item msgid="1943354004029184381">"正在取得 IP 位址…"</item>
@@ -36,7 +36,7 @@
</string-array>
<string-array name="wifi_status_with_ssid">
<item msgid="7714855332363650812"></item>
- <item msgid="8878186979715711006">"掃瞄中…"</item>
+ <item msgid="8878186979715711006">"掃描中…"</item>
<item msgid="355508996603873860">"正在連線到 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
<item msgid="554971459996405634">"正在取得 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 的授權…"</item>
<item msgid="7928343808033020343">"正在從 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 取得 IP 位址…"</item>
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (預設)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"使用系統選擇 (預設)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 音訊"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 音訊"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"啟用選用的編解碼器"</item>
+ <item msgid="3304843301758635896">"停用選用的編解碼器"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"使用系統選擇 (預設)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 音訊"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 音訊"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"啟用選用的編解碼器"</item>
+ <item msgid="741805482892725657">"停用選用的編解碼器"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"使用系統選擇 (預設)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index af9ba24..a47e1e8 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="wifi_fail_to_scan" msgid="1265540342578081461">"無法掃瞄網絡"</string>
+ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"無法掃描網絡"</string>
<string name="wifi_security_none" msgid="7985461072596594400">"無"</string>
<string name="wifi_remembered" msgid="4955746899347821096">"已儲存"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"已停用"</string>
@@ -190,11 +190,10 @@
<string name="wifi_display_certification" msgid="8611569543791307533">"無線螢幕分享認證"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"啟用 Wi‑Fi 詳細記錄"</string>
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"加強 Wi-Fi 至流動數據轉換"</string>
- <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"永遠允許 Wi-Fi 漫遊掃瞄"</string>
+ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"永遠允許 Wi-Fi 漫遊掃描"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"一律保持啟用流動數據"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"網絡共享硬件加速"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"顯示沒有名稱的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"停用絕對音量功能"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"啟用頻內鈴聲"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"藍牙 AVRCP 版本"</string>
@@ -213,7 +212,7 @@
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"顯示無線螢幕分享認證的選項"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string>
<string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"啟用後,Wi-Fi 連線會在訊號不穩定的情況下更積極轉換成流動數據連線"</string>
- <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"根據介面中目前的數據流量允許/禁止 WiFi 漫遊掃瞄"</string>
+ <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"根據介面中目前的數據流量允許/禁止 WiFi 漫遊掃描"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"記錄器緩衝區空間"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"選取每個記錄緩衝區的記錄器空間"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"要清除記錄器的持久儲存空間嗎?"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"這些設定僅供開發用途,可能會導致您的裝置及應用程式損毀或運作不正常。"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"透過 USB 驗證應用程式"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"透過 ADB/ADT 檢查安裝的應用程式有否有害的行為。"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"系統將顯示沒有名稱 (只有 MAC 位址) 的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"連線至遠端裝置時,如發生音量過大或無法控制音量等問題,請停用藍牙絕對音量功能。"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"允許藍牙耳機播放手機鈴聲"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"本機終端機"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index 482b871..ce2e89fd 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"AVRCP 1.4 (預設)"</item>
- <item msgid="2089555299377409443">"AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"avrcp14"</item>
- <item msgid="1913619118958233129">"avrcp15"</item>
- <item msgid="7142710449249088270">"avrcp16"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"使用系統選擇 (預設)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 音訊"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 音訊"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"啟用選用的轉碼器"</item>
+ <item msgid="3304843301758635896">"停用選用的轉碼器"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"使用系統選擇 (預設)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> 音訊"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> 音訊"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"啟用選用的轉碼器"</item>
+ <item msgid="741805482892725657">"停用選用的轉碼器"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"使用系統選擇 (預設)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 9e8d1ca..d13a4f6 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_not_in_range" msgid="1136191511238508967">"不在有效範圍內"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"無法自動連線"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"沒有可用的網際網路連線"</string>
- <string name="saved_network" msgid="4352716707126620811">"由<xliff:g id="NAME">%1$s</xliff:g>儲存"</string>
+ <string name="saved_network" msgid="4352716707126620811">"由「<xliff:g id="NAME">%1$s</xliff:g>」儲存"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"已透過 %1$s 自動連線"</string>
<string name="connected_via_network_scorer_default" msgid="7867260222020343104">"已透過網路評分供應商自動連線"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"一律允許 Wi-Fi 漫遊掃描"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"行動數據連線一律保持啟用狀態"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"數據連線硬體加速"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"顯示沒有名稱的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"停用絕對音量功能"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"啟用藍牙同步鈴聲功能"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"藍牙 AVRCP 版本"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"這些設定僅供開發之用,可能導致你的裝置及裝置中的應用程式毀損或運作異常。"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"透過 USB 驗證應用程式"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"檢查透過 ADB/ADT 安裝的應用程式是否具有有害行為。"</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"系統會顯示沒有名稱 (僅具有 MAC 位址) 的藍牙裝置"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"只要停用藍牙絕對音量功能,即可避免在連線到遠端裝置時,發生音量過大或無法控制音量等問題。"</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"允許手機鈴聲透過藍牙耳機播放"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"本機終端機"</string>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index 6ad5a45..3d0de36 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -60,18 +60,36 @@
</string-array>
<string-array name="bluetooth_avrcp_versions">
<item msgid="5347678900838034763">"I-AVRCP 1.4 (Okuzenzakalelayo)"</item>
- <item msgid="2089555299377409443">"I-AVRCP 1.5"</item>
- <item msgid="2895327394279434278">"I-AVRCP 1.6"</item>
+ <item msgid="2809759619990248160">"I-AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"I-AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"I-AVRCP 1.6"</item>
</string-array>
<string-array name="bluetooth_avrcp_version_values">
<item msgid="2838624067805073303">"I-avrcp14"</item>
- <item msgid="1913619118958233129">"I-avrcp15"</item>
- <item msgid="7142710449249088270">"I-avrcp16"</item>
+ <item msgid="3011533352527449572">"I-avrcp13"</item>
+ <item msgid="8837606198371920819">"I-avrcp15"</item>
+ <item msgid="3422726142222090896">"I-avrcp16"</item>
</string-array>
- <!-- no translation found for bluetooth_a2dp_codec_titles:3 (5254942598247222737) -->
- <!-- no translation found for bluetooth_a2dp_codec_titles:4 (2091430979086738145) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (7848030269621918608) -->
- <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (298198075927343893) -->
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"Sebenzisa ukukhetha kwesistimu (Okuzenzakalelayo)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"I-AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> umsindo"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> umsindo"</item>
+ <item msgid="6751080638867012696">"I-LDAC"</item>
+ <item msgid="723675059572222462">"Nika amandla amakhodekhi akhethekayo"</item>
+ <item msgid="3304843301758635896">"Khubaza amakhodekhi akhethekayo"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"Sebenzisa ukukhetha kwesistimu (Okuzenzakalelayo)"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"I-AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> umsindo"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> umsindo"</item>
+ <item msgid="7950781694447359344">"I-LDAC"</item>
+ <item msgid="2209680154067241740">"Nika amandla amakhodekhi akhethekayo"</item>
+ <item msgid="741805482892725657">"Khubaza amakhodekhi akhethekayo"</item>
+ </string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
<item msgid="3093023430402746802">"Sebenzisa ukukhetha kwesistimu (Okuzenzakalelayo)"</item>
<item msgid="8895532488906185219">"44.1 kHz"</item>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 5be0b8e..35d84a2 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -193,8 +193,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vumela njalo ukuskena kokuzula kwe-Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Idatha yeselula ihlala isebenza"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"I-Tethering hardware acceleration"</string>
- <!-- no translation found for bluetooth_show_devices_without_names (4708446092962060176) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bonisa amadivayisi e-Bluetooth ngaphandle kwamagama"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Khubaza ivolumu ngokuphelele"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Nika amandla ukukhala okuphakathi nomkhiqizo"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Inguqulo ye-Bluetooth ye-AVRCP"</string>
@@ -234,8 +233,7 @@
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Lezi zilungiselelo zenzelwe ukusetshenziswa ukuthuthukisa kuphela. Zingadala ukuthi idivayisi yakho kanye nensiza ekuyona ukuthi iphuke noma iziphathe kabi."</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Qiniseka izinhlelo zokusebenza nge-USB"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Hlola izinhlelo zokusebenza ezifakiwe nge-ADB/ADT ngokuziphatha okuyingozi."</string>
- <!-- no translation found for bluetooth_show_devices_without_names_summary (2351196058115755520) -->
- <skip />
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Amadivayisi e-Bluetooth anganawo amagama (Amakheli e-MAC kuphela) azoboniswa"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Ikhubaza isici esiphelele sevolumu ye-Bluetooth uma kuba nezinkinga zevolumu ngamadivayisi esilawuli kude ezifana nevolumu ephezulu noma eshoda ngokulawuleka."</string>
<string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Vumela amathoni okukhala efonini ukuthi adlalwe kuma-earphone e-Bluetooth"</string>
<string name="enable_terminal_title" msgid="95572094356054120">"Itheminali yasendaweni"</string>
diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml
index 1e35cbc..e261570 100644
--- a/packages/SettingsLib/res/values/dimens.xml
+++ b/packages/SettingsLib/res/values/dimens.xml
@@ -61,10 +61,13 @@
<fraction name="battery_button_height_fraction">10.5%</fraction>
<!-- Ratio between height of button part and height of total -->
- <fraction name="bt_battery_button_height_fraction">7.5%</fraction>
+ <fraction name="bt_battery_button_height_fraction">7.8%</fraction>
<!-- Ratio between width and height -->
- <fraction name="bt_battery_ratio_fraction">45%</fraction>
+ <fraction name="bt_battery_ratio_fraction">35%</fraction>
+
+ <!-- Ratio of height between battery icon and bluetooth icon -->
+ <fraction name="bt_battery_scale_fraction">75%</fraction>
<!-- Fraction value to smooth the edges of the battery icon. The path will be inset by this
fraction of a pixel.-->
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 87bf0de..40c2b1f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -339,26 +339,35 @@
synchronized (mEntriesMap) {
AppEntry entry = mEntriesMap.get(userId).get(packageName);
if (entry != null && (entry.info.flags & ApplicationInfo.FLAG_INSTALLED) != 0) {
- mBackgroundHandler.post(() -> {
- try {
- final StorageStats stats = mStats.queryStatsForPackage(
- entry.info.storageUuid, packageName, UserHandle.of(userId));
- final PackageStats legacy = new PackageStats(packageName, userId);
- legacy.codeSize = stats.getCodeBytes();
- legacy.dataSize = stats.getDataBytes();
- legacy.cacheSize = stats.getCacheBytes();
- try {
- mBackgroundHandler.mStatsObserver.onGetStatsCompleted(legacy, true);
- } catch (RemoteException ignored) {
- }
- } catch (NameNotFoundException | IOException e) {
- Log.w(TAG, "Failed to query stats: " + e);
- try {
- mBackgroundHandler.mStatsObserver.onGetStatsCompleted(null, false);
- } catch (RemoteException ignored) {
- }
- }
- });
+ mBackgroundHandler.post(
+ () -> {
+ try {
+ final StorageStats stats =
+ mStats.queryStatsForPackage(
+ entry.info.storageUuid,
+ packageName,
+ UserHandle.of(userId));
+ final long cacheQuota =
+ mStats.getCacheQuotaBytes(
+ entry.info.storageUuid.toString(), entry.info.uid);
+ final PackageStats legacy = new PackageStats(packageName, userId);
+ legacy.codeSize = stats.getCodeBytes();
+ legacy.dataSize = stats.getDataBytes();
+ legacy.cacheSize = Math.min(stats.getCacheBytes(), cacheQuota);
+ try {
+ mBackgroundHandler.mStatsObserver.onGetStatsCompleted(
+ legacy, true);
+ } catch (RemoteException ignored) {
+ }
+ } catch (NameNotFoundException | IOException e) {
+ Log.w(TAG, "Failed to query stats: " + e);
+ try {
+ mBackgroundHandler.mStatsObserver.onGetStatsCompleted(
+ null, false);
+ } catch (RemoteException ignored) {
+ }
+ }
+ });
}
if (DEBUG_LOCKING) Log.v(TAG, "...requestSize releasing lock");
}
@@ -1665,7 +1674,8 @@
isCategorized =
FILTER_AUDIO.filterApp(entry)
|| FILTER_GAMES.filterApp(entry)
- || FILTER_MOVIES.filterApp(entry);
+ || FILTER_MOVIES.filterApp(entry)
+ || FILTER_PHOTOS.filterApp(entry);
}
return !isCategorized;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/PackageManagerWrapper.java b/packages/SettingsLib/src/com/android/settingslib/applications/PackageManagerWrapper.java
deleted file mode 100644
index 6c79a61..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/applications/PackageManagerWrapper.java
+++ /dev/null
@@ -1,131 +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.settingslib.applications;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-
-import java.util.List;
-
-/**
- * This interface replicates a subset of the android.content.pm.PackageManager (PM). The interface
- * exists so that we can use a thin wrapper around the PM in production code and a mock in tests.
- * We cannot directly mock or shadow the PM, because some of the methods we rely on are newer than
- * the API version supported by Robolectric.
- */
-public interface PackageManagerWrapper {
-
- /**
- * Returns the real {@code PackageManager} object.
- */
- PackageManager getPackageManager();
-
- /**
- * Calls {@code PackageManager.getInstalledApplicationsAsUser()}.
- *
- * @see android.content.pm.PackageManager#getInstalledApplicationsAsUser
- */
- List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId);
-
- /**
- * Calls {@code PackageManager.hasSystemFeature()}.
- *
- * @see android.content.pm.PackageManager#hasSystemFeature
- */
- boolean hasSystemFeature(String name);
-
- /**
- * Calls {@code PackageManager.queryIntentActivitiesAsUser()}.
- *
- * @see android.content.pm.PackageManager#queryIntentActivitiesAsUser
- */
- List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId);
-
- /**
- * Calls {@code PackageManager.getInstallReason()}.
- *
- * @see android.content.pm.PackageManager#getInstallReason
- */
- int getInstallReason(String packageName, UserHandle user);
-
- /**
- * Calls {@code PackageManager.getApplicationInfoAsUser}
- */
- ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
- throws PackageManager.NameNotFoundException;
-
- /**
- * Calls {@code PackageManager.setDefaultBrowserPackageNameAsUser}
- */
- boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId);
-
- /**
- * Calls {@code PackageManager.getDefaultBrowserPackageNameAsUser}
- */
- String getDefaultBrowserPackageNameAsUser(int userId);
-
- /**
- * Calls {@code PackageManager.getHomeActivities}
- */
- ComponentName getHomeActivities(List<ResolveInfo> homeActivities);
-
- /**
- * Calls {@code PackageManager.queryIntentServicesAsUser}
- */
- List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user);
-
- /**
- * Calls {@code PackageManager.replacePreferredActivity}
- */
- void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
- ComponentName[] componentNames, ComponentName component);
-
- /**
- * Gets information about a particular package from the package manager.
- * @param packageName The name of the package we would like information about.
- * @param i additional options flags. see javadoc for {@link PackageManager#getPackageInfo(String, int)}
- * @return The PackageInfo for the requested package
- * @throws NameNotFoundException
- */
- PackageInfo getPackageInfo(String packageName, int i) throws NameNotFoundException;
-
- /**
- * Retrieves the icon associated with this particular set of ApplicationInfo
- * @param info The ApplicationInfo to retrieve the icon for
- * @return The icon as a drawable.
- */
- Drawable getUserBadgedIcon(ApplicationInfo info);
-
- /**
- * Retrieves the label associated with the particular set of ApplicationInfo
- * @param app The ApplicationInfo to retrieve the label for
- * @return the label as a CharSequence
- */
- CharSequence loadLabel(ApplicationInfo app);
-
- /**
- * Retrieve all activities that can be performed for the given intent.
- */
- List<ResolveInfo> queryIntentActivities(Intent intent, int flags);
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/PackageManagerWrapperImpl.java b/packages/SettingsLib/src/com/android/settingslib/applications/PackageManagerWrapperImpl.java
deleted file mode 100644
index dcb40b2..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/applications/PackageManagerWrapperImpl.java
+++ /dev/null
@@ -1,121 +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.settingslib.applications;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-
-import java.util.List;
-
-/**
- * A thin wrapper class that simplifies testing by putting a mockable layer between the application
- * and the PackageManager. This class only provides access to the minimum number of functions from
- * the PackageManager needed for DeletionHelper to work.
- */
-public class PackageManagerWrapperImpl implements PackageManagerWrapper {
-
- private final PackageManager mPm;
-
- public PackageManagerWrapperImpl(PackageManager pm) {
- mPm = pm;
- }
-
- @Override
- public PackageManager getPackageManager() {
- return mPm;
- }
-
- @Override
- public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
- return mPm.getInstalledApplicationsAsUser(flags, userId);
- }
-
- @Override
- public boolean hasSystemFeature(String name) {
- return mPm.hasSystemFeature(name);
- }
-
- @Override
- public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
- return mPm.queryIntentActivitiesAsUser(intent, flags, userId);
- }
-
- @Override
- public int getInstallReason(String packageName, UserHandle user) {
- return mPm.getInstallReason(packageName, user);
- }
-
- @Override
- public ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
- throws PackageManager.NameNotFoundException {
- return mPm.getApplicationInfoAsUser(packageName, i, userId);
- }
-
- @Override
- public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
- return mPm.setDefaultBrowserPackageNameAsUser(packageName, userId);
- }
-
- @Override
- public String getDefaultBrowserPackageNameAsUser(int userId) {
- return mPm.getDefaultBrowserPackageNameAsUser(userId);
- }
-
- @Override
- public ComponentName getHomeActivities(List<ResolveInfo> homeActivities) {
- return mPm.getHomeActivities(homeActivities);
- }
-
- @Override
- public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user) {
- return mPm.queryIntentServicesAsUser(intent, i, user);
- }
-
- @Override
- public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
- ComponentName[] componentNames, ComponentName component) {
- mPm.replacePreferredActivity(homeFilter, matchCategoryEmpty, componentNames, component);
- }
-
- @Override
- public PackageInfo getPackageInfo(String packageName, int i) throws NameNotFoundException {
- return mPm.getPackageInfo(packageName, i);
- }
-
- @Override
- public Drawable getUserBadgedIcon(ApplicationInfo info) {
- return mPm.getUserBadgedIcon(mPm.loadUnbadgedItemIcon(info, info),
- new UserHandle(UserHandle.getUserId(info.uid)));
- }
-
- @Override
- public CharSequence loadLabel(ApplicationInfo app) {
- return app.loadLabel(mPm);
- }
-
- @Override
- public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
- return mPm.queryIntentActivities(intent, flags);
- }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 109446d..2873fb6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -335,8 +335,7 @@
}
public int getProfileConnectionState(LocalBluetoothProfile profile) {
- if (mProfileConnectionState == null ||
- mProfileConnectionState.get(profile) == null) {
+ if (mProfileConnectionState.get(profile) == null) {
// If cache is empty make the binder call to get the state
int state = profile.getConnectionStatus(mDevice);
mProfileConnectionState.put(profile, state);
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
index fc0a444..9b75c00 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
@@ -26,6 +26,7 @@
import android.content.res.Resources;
import android.graphics.drawable.Icon;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -428,15 +429,6 @@
if (metaData.containsKey(META_DATA_PREFERENCE_CUSTOM_VIEW)) {
int layoutId = metaData.getInt(META_DATA_PREFERENCE_CUSTOM_VIEW);
remoteViews = new RemoteViews(applicationInfo.packageName, layoutId);
- if (metaData.containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) {
- String uriString = metaData.getString(
- META_DATA_PREFERENCE_SUMMARY_URI);
- String overrideSummary = getTextFromUri(context, uriString, providerMap,
- META_DATA_PREFERENCE_SUMMARY);
- if (overrideSummary != null) {
- remoteViews.setTextViewText(android.R.id.summary, overrideSummary);
- }
- }
}
}
} catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) {
@@ -543,6 +535,41 @@
}
}
+ public static void updateTileUsingSummaryUri(Context context, final Tile tile) {
+ if (tile == null || tile.metaData == null ||
+ !tile.metaData.containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) {
+ return;
+ }
+
+ new AsyncTask<Void, Void, Bundle>() {
+ @Override
+ protected Bundle doInBackground(Void... params) {
+ return getBundleFromUri(context,
+ tile.metaData.getString(META_DATA_PREFERENCE_SUMMARY_URI), new HashMap<>());
+ }
+
+ @Override
+ protected void onPostExecute(Bundle bundle) {
+ if (bundle == null) {
+ return;
+ }
+ final String overrideSummary = getString(bundle, META_DATA_PREFERENCE_SUMMARY);
+ final String overrideTitle = getString(bundle, META_DATA_PREFERENCE_TITLE);
+
+ if (overrideSummary != null) {
+ tile.remoteViews.setTextViewText(android.R.id.summary, overrideSummary);
+ }
+ if (overrideTitle != null) {
+ tile.remoteViews.setTextViewText(android.R.id.title, overrideTitle);
+ }
+ }
+ }.execute();
+ }
+
+ private static String getString(Bundle bundle, String key) {
+ return bundle == null ? null : bundle.getString(key);
+ }
+
private static IContentProvider getProviderFromUri(Context context, Uri uri,
Map<String, IContentProvider> providerMap) {
if (uri == null) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
index d588a66..817989a 100755
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
@@ -292,6 +292,7 @@
@Override
public void draw(Canvas c) {
final int level = mLevel;
+ final Rect bounds = getBounds();
if (level == -1) return;
@@ -300,8 +301,10 @@
final int width = (int) (getAspectRatio() * mHeight);
final int px = (mWidth - width) / 2;
final int buttonHeight = Math.round(height * mButtonHeightFraction);
+ final int left = mPadding.left + bounds.left;
+ final int top = bounds.bottom - mPadding.bottom - height;
- mFrame.set(mPadding.left, mPadding.top, width + mPadding.left, height + mPadding.top);
+ mFrame.set(left, top, width + left, height + top);
mFrame.offset(px, 0);
// button-frame: area above the battery body
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
index 61790b9..b7fd404 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
@@ -24,6 +24,7 @@
import android.graphics.Matrix;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
+import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
@@ -47,7 +48,7 @@
/**
* Create the {@link LayerDrawable} that contains bluetooth device icon and battery icon.
- * This is a vertical layout drawable while bluetooth icon at top and battery icon at bottom.
+ * This is a horizontal layout drawable while bluetooth icon at start and battery icon at end.
*
* @param context used to get the spec for icon
* @param resId represents the bluetooth device drawable
@@ -55,55 +56,44 @@
*/
public static BluetoothDeviceLayerDrawable createLayerDrawable(Context context, int resId,
int batteryLevel) {
+ return createLayerDrawable(context, resId, batteryLevel, 1 /*iconScale*/);
+ }
+
+ /**
+ * Create the {@link LayerDrawable} that contains bluetooth device icon and battery icon.
+ * This is a horizontal layout drawable while bluetooth icon at start and battery icon at end.
+ *
+ * @param context used to get the spec for icon
+ * @param resId represents the bluetooth device drawable
+ * @param batteryLevel the battery level for bluetooth device
+ * @param iconScale the ratio of height between battery icon and bluetooth icon
+ */
+ public static BluetoothDeviceLayerDrawable createLayerDrawable(Context context, int resId,
+ int batteryLevel, float iconScale) {
final Drawable deviceDrawable = context.getDrawable(resId);
final BatteryMeterDrawable batteryDrawable = new BatteryMeterDrawable(context,
R.color.meter_background_color, batteryLevel);
- final int pad = context.getResources()
- .getDimensionPixelSize(R.dimen.bt_battery_padding);
- batteryDrawable.setPadding(0, pad, 0, pad);
+ final int pad = context.getResources().getDimensionPixelSize(R.dimen.bt_battery_padding);
+ batteryDrawable.setPadding(pad, pad, pad, pad);
final BluetoothDeviceLayerDrawable drawable = new BluetoothDeviceLayerDrawable(
- new Drawable[]{deviceDrawable,
- rotateDrawable(context.getResources(), batteryDrawable)});
- // Set the bluetooth icon at the top
- drawable.setLayerGravity(0 /* index of deviceDrawable */, Gravity.TOP);
- // Set battery icon right below the bluetooth icon
- drawable.setLayerInset(1 /* index of batteryDrawable */, 0,
- deviceDrawable.getIntrinsicHeight(), 0, 0);
+ new Drawable[]{deviceDrawable, batteryDrawable});
+ // Set the bluetooth icon at the left
+ drawable.setLayerGravity(0 /* index of deviceDrawable */, Gravity.START);
+ // Set battery icon to the right of the bluetooth icon
+ drawable.setLayerInsetStart(1 /* index of batteryDrawable */,
+ deviceDrawable.getIntrinsicWidth());
+ drawable.setLayerInsetTop(1 /* index of batteryDrawable */,
+ (int) (deviceDrawable.getIntrinsicHeight() * (1 - iconScale)));
- drawable.setConstantState(context, resId, batteryLevel);
+ drawable.setConstantState(context, resId, batteryLevel, iconScale);
return drawable;
}
- /**
- * Rotate the {@code drawable} by 90 degree clockwise and return rotated {@link Drawable}
- */
- private static Drawable rotateDrawable(Resources res, Drawable drawable) {
- // Get the bitmap from drawable
- final Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(bitmap);
- drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
- drawable.draw(canvas);
-
- // Create rotate matrix
- final Matrix matrix = new Matrix();
- matrix.postRotate(
- res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_LTR
- ? 90 : 270);
-
- // Create new bitmap with rotate matrix
- final Bitmap rotateBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
- bitmap.getHeight(), matrix, true);
- bitmap.recycle();
-
- return new BitmapDrawable(res, rotateBitmap);
- }
-
- public void setConstantState(Context context, int resId, int batteryLevel) {
- mState = new BluetoothDeviceLayerDrawableState(context, resId, batteryLevel);
+ public void setConstantState(Context context, int resId, int batteryLevel, float iconScale) {
+ mState = new BluetoothDeviceLayerDrawableState(context, resId, batteryLevel, iconScale);
}
@Override
@@ -149,17 +139,19 @@
Context context;
int resId;
int batteryLevel;
+ float iconScale;
public BluetoothDeviceLayerDrawableState(Context context, int resId,
- int batteryLevel) {
+ int batteryLevel, float iconScale) {
this.context = context;
this.resId = resId;
this.batteryLevel = batteryLevel;
+ this.iconScale = iconScale;
}
@Override
public Drawable newDrawable() {
- return createLayerDrawable(context, resId, batteryLevel);
+ return createLayerDrawable(context, resId, batteryLevel, iconScale);
}
@Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 37969e0..58f1226 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -51,7 +51,6 @@
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
-import android.text.format.DateUtils;
import android.text.style.TtsSpan;
import android.util.Log;
@@ -134,12 +133,8 @@
*/
private final Map<String, TimestampedScoredNetwork> mScoredNetworkCache = new HashMap<>();
- /** Maximum age in millis of cached scored networks in {@link #mScoredNetworkCache}. */
- @VisibleForTesting static final long MAX_CACHED_SCORE_AGE_MILLIS =
- 24 * DateUtils.DAY_IN_MILLIS;
-
/** Maximum age of scan results to hold onto while actively scanning. **/
- private static final long MAX_SCAN_RESULT_AGE_MILLIS = 15000;
+ private static final long MAX_SCAN_RESULT_AGE_MILLIS = 25000;
static final String KEY_NETWORKINFO = "key_networkinfo";
static final String KEY_WIFIINFO = "key_wifiinfo";
@@ -429,6 +424,11 @@
}
builder.append(",metered=").append(isMetered());
+ if (WifiTracker.sVerboseLogging) {
+ builder.append(",rssi=").append(mRssi);
+ builder.append(",scan cache size=").append(mScanResultCache.size());
+ }
+
return builder.append(')').toString();
}
@@ -436,13 +436,18 @@
* Updates the AccessPoint rankingScore, metering, and speed, returning true if the data has
* changed.
*
- * @param scoreCache The score cache to use to retrieve scores.
- * @param scoringUiEnabled Whether to show scoring and badging UI.
+ * @param scoreCache The score cache to use to retrieve scores
+ * @param scoringUiEnabled Whether to show scoring and badging UI
+ * @param maxScoreCacheAgeMillis the maximum age in milliseconds of scores to consider when
+ * generating speed labels
*/
- boolean update(WifiNetworkScoreCache scoreCache, boolean scoringUiEnabled) {
+ boolean update(
+ WifiNetworkScoreCache scoreCache,
+ boolean scoringUiEnabled,
+ long maxScoreCacheAgeMillis) {
boolean scoreChanged = false;
if (scoringUiEnabled) {
- scoreChanged = updateScores(scoreCache);
+ scoreChanged = updateScores(scoreCache, maxScoreCacheAgeMillis);
}
return updateMetered(scoreCache) || scoreChanged;
}
@@ -450,15 +455,18 @@
/**
* Updates the AccessPoint rankingScore and speed, returning true if the data has changed.
*
- * <p>Any cached {@link TimestampedScoredNetwork} objects older than
- * {@link #MAX_CACHED_SCORE_AGE_MILLIS} will be removed when this method is invoked.
+ * <p>Any cached {@link TimestampedScoredNetwork} objects older than the given max age in millis
+ * will be removed when this method is invoked.
*
* <p>Precondition: {@link #mRssi} is up to date before invoking this method.
*
- * @param scoreCache The score cache to use to retrieve scores.
+ * @param scoreCache The score cache to use to retrieve scores
+ * @param maxScoreCacheAgeMillis the maximum age in milliseconds of scores to consider when
+ * generating speed labels
+ *
* @return true if the set speed has changed
*/
- private boolean updateScores(WifiNetworkScoreCache scoreCache) {
+ private boolean updateScores(WifiNetworkScoreCache scoreCache, long maxScoreCacheAgeMillis) {
long nowMillis = SystemClock.elapsedRealtime();
for (ScanResult result : mScanResultCache.values()) {
ScoredNetwork score = scoreCache.getScoredNetwork(result);
@@ -476,7 +484,7 @@
}
// Remove old cached networks
- long evictionCutoff = nowMillis - MAX_CACHED_SCORE_AGE_MILLIS;
+ long evictionCutoff = nowMillis - maxScoreCacheAgeMillis;
Iterator<TimestampedScoredNetwork> iterator = mScoredNetworkCache.values().iterator();
iterator.forEachRemaining(timestampedScoredNetwork -> {
if (timestampedScoredNetwork.getUpdatedTimestampMillis() < evictionCutoff) {
@@ -494,23 +502,6 @@
int oldSpeed = mSpeed;
mSpeed = generateAverageSpeedForSsid();
- // set speed to the connected ScanResult if the AccessPoint is the active network
- if (isActive() && mInfo != null) {
- TimestampedScoredNetwork timedScore = mScoredNetworkCache.get(mInfo.getBSSID());
- if (timedScore != null) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Set score using specific access point curve for connected AP: "
- + getSsidStr());
- }
- // TODO(b/63073866): Map using getLevel rather than specific rssi value so score
- // doesn't change without a visible wifi bar change.
- int speed = timedScore.getScore().calculateBadge(mInfo.getRssi());
- if (speed != Speed.NONE) {
- mSpeed = speed;
- }
- }
- }
-
boolean changed = oldSpeed != mSpeed;
if(WifiTracker.sVerboseLogging && changed) {
Log.i(TAG, String.format("%s: Set speed to %d", ssid, mSpeed));
@@ -529,6 +520,10 @@
getSsidStr(), mScoredNetworkCache));
}
+ // TODO(b/63073866): If flickering issues persist, consider mapping using getLevel rather
+ // than specific rssi value so score doesn't change without a visible wifi bar change. This
+ // issue is likely to be more evident for the active AP whose RSSI value is not half-lifed.
+
int count = 0;
int totalSpeed = 0;
for (TimestampedScoredNetwork timedScore : mScoredNetworkCache.values()) {
@@ -943,6 +938,7 @@
evictOldScanResults();
// TODO: sort list by RSSI or age
+ long nowMs = SystemClock.elapsedRealtime();
for (ScanResult result : mScanResultCache.values()) {
if (result.frequency >= LOWER_FREQ_5GHZ
&& result.frequency <= HIGHER_FREQ_5GHZ) {
@@ -953,7 +949,7 @@
maxRssi5 = result.level;
}
if (num5 <= maxDisplayedScans) {
- scans5GHz.append(verboseScanResultSummary(result, bssid));
+ scans5GHz.append(verboseScanResultSummary(result, bssid, nowMs));
}
} else if (result.frequency >= LOWER_FREQ_24GHZ
&& result.frequency <= HIGHER_FREQ_24GHZ) {
@@ -964,7 +960,7 @@
maxRssi24 = result.level;
}
if (num24 <= maxDisplayedScans) {
- scans24GHz.append(verboseScanResultSummary(result, bssid));
+ scans24GHz.append(verboseScanResultSummary(result, bssid, nowMs));
}
}
}
@@ -992,7 +988,7 @@
}
@VisibleForTesting
- /* package */ String verboseScanResultSummary(ScanResult result, String bssid) {
+ /* package */ String verboseScanResultSummary(ScanResult result, String bssid, long nowMs) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(" \n{").append(result.BSSID);
if (result.BSSID.equals(bssid)) {
@@ -1005,6 +1001,8 @@
stringBuilder.append(",")
.append(getSpeedLabel(speed));
}
+ int ageSeconds = (int) (nowMs - result.timestamp / 1000) / 1000;
+ stringBuilder.append(",").append(ageSeconds).append("s");
stringBuilder.append("}");
return stringBuilder.toString();
}
@@ -1199,6 +1197,7 @@
/** Attempt to update the AccessPoint and return true if an update occurred. */
public boolean update(
@Nullable WifiConfiguration config, WifiInfo info, NetworkInfo networkInfo) {
+
boolean updated = false;
final int oldLevel = getLevel();
if (info != null && isInfoForThisAccessPoint(config, info)) {
@@ -1230,6 +1229,7 @@
mAccessPointListener.onLevelChanged(this);
}
}
+
return updated;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index 2f0b51b..fdbbf14 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -155,7 +155,7 @@
drawable.setLevel(mLevel);
}
- mTitleView = (TextView) view.findViewById(com.android.internal.R.id.title);
+ mTitleView = (TextView) view.findViewById(android.R.id.title);
if (mTitleView != null) {
// Attach to the end of the title view
mTitleView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, mBadge, null);
@@ -224,12 +224,7 @@
* Updates the title and summary; may indirectly call notifyChanged().
*/
public void refresh() {
- if (mForSavedNetworks) {
- setTitle(mAccessPoint.getConfigName());
- } else {
- setTitle(mAccessPoint.getSsid());
- }
-
+ setTitle(this, mAccessPoint, mForSavedNetworks);
final Context context = getContext();
int level = mAccessPoint.getLevel();
int wifiSpeed = mAccessPoint.getSpeed();
@@ -258,6 +253,15 @@
}
}
+ @VisibleForTesting
+ static void setTitle(AccessPointPreference preference, AccessPoint ap, boolean savedNetworks) {
+ if (savedNetworks) {
+ preference.setTitle(ap.getConfigName());
+ } else {
+ preference.setTitle(ap.getSsidStr());
+ }
+ }
+
/**
* Helper method to generate content description string.
*/
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TimestampedScoredNetwork.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TimestampedScoredNetwork.java
index cb15a79..1286d57 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/TimestampedScoredNetwork.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TimestampedScoredNetwork.java
@@ -33,7 +33,7 @@
}
protected TimestampedScoredNetwork(Parcel in) {
- mScore = ScoredNetwork.CREATOR.createFromParcel(in);
+ mScore = in.readParcelable(ScoredNetwork.class.getClassLoader());
mUpdatedTimestampMillis = in.readLong();
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 8ef6a0d..664dcfc 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -20,7 +20,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.database.ContentObserver;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
@@ -41,6 +40,7 @@
import android.os.Message;
import android.provider.Settings;
import android.support.annotation.GuardedBy;
+import android.text.format.DateUtils;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
@@ -65,7 +65,11 @@
* Tracks saved or available wifi networks and their state.
*/
public class WifiTracker {
- // TODO(b/36733768): Remove flag includeSaved and includePasspoints.
+ /**
+ * Default maximum age in millis of cached scored networks in
+ * {@link AccessPoint#mScoredNetworkCache} to be used for speed label generation.
+ */
+ private static final long DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS = 20 * DateUtils.MINUTE_IN_MILLIS;
private static final String TAG = "WifiTracker";
private static final boolean DBG() {
@@ -76,6 +80,8 @@
* and used so as to assist with in-the-field WiFi connectivity debugging */
public static boolean sVerboseLogging;
+ // TODO(b/36733768): Remove flag includeSaved and includePasspoints.
+
// TODO: Allow control of this?
// Combo scans can take 5-6s to complete - set to 10s.
private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
@@ -138,7 +144,7 @@
private final NetworkScoreManager mNetworkScoreManager;
private final WifiNetworkScoreCache mScoreCache;
private boolean mNetworkScoringUiEnabled;
- private final ContentObserver mObserver;
+ private long mMaxSpeedLabelScoreCacheAge;
@GuardedBy("mLock")
private final Set<NetworkKey> mRequestedScores = new ArraySet<>();
@@ -236,16 +242,6 @@
updateNetworkScores();
}
});
-
- mObserver = new ContentObserver(mWorkHandler) {
- @Override
- public void onChange(boolean selfChange) {
- mNetworkScoringUiEnabled =
- Settings.Global.getInt(
- mContext.getContentResolver(),
- Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
- }
- };
}
/** Synchronously update the list of access points with the latest information. */
@@ -321,11 +317,16 @@
synchronized (mLock) {
registerScoreCache();
- mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED),
- false /* notifyForDescendants */,
- mObserver);
- mObserver.onChange(false /* selfChange */); // Set mScoringUiEnabled
+ mNetworkScoringUiEnabled =
+ Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
+
+ mMaxSpeedLabelScoreCacheAge =
+ Settings.Global.getLong(
+ mContext.getContentResolver(),
+ Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
+ DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS);
resumeScanning();
if (!mRegistered) {
@@ -377,7 +378,6 @@
}
unregisterScoreCache();
pauseScanning();
- mContext.getContentResolver().unregisterContentObserver(mObserver);
mWorkHandler.removePendingMessages();
mMainHandler.removePendingMessages();
@@ -616,7 +616,7 @@
requestScoresForNetworkKeys(scoresToRequest);
for (AccessPoint ap : accessPoints) {
- ap.update(mScoreCache, mNetworkScoringUiEnabled);
+ ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge);
}
// Pre-sort accessPoints to speed preference insertion
@@ -631,7 +631,7 @@
String prevSsid = prevAccessPoint.getSsidStr();
boolean found = false;
for (AccessPoint newAccessPoint : accessPoints) {
- if (newAccessPoint.getSsid() != null && newAccessPoint.getSsid()
+ if (newAccessPoint.getSsidStr() != null && newAccessPoint.getSsidStr()
.equals(prevSsid)) {
found = true;
break;
@@ -683,24 +683,23 @@
private void updateNetworkInfo(NetworkInfo networkInfo) {
/* sticky broadcasts can call this when wifi is disabled */
if (!mWifiManager.isWifiEnabled()) {
- mMainHandler.sendEmptyMessage(MainHandler.MSG_PAUSE_SCANNING);
clearAccessPointsAndConditionallyUpdate();
return;
}
- if (networkInfo != null &&
- networkInfo.getDetailedState() == DetailedState.OBTAINING_IPADDR) {
- mMainHandler.sendEmptyMessage(MainHandler.MSG_PAUSE_SCANNING);
- } else {
- mMainHandler.sendEmptyMessage(MainHandler.MSG_RESUME_SCANNING);
- }
-
if (networkInfo != null) {
mLastNetworkInfo = networkInfo;
+ if (DBG()) {
+ Log.d(TAG, "mLastNetworkInfo set: " + mLastNetworkInfo);
+ }
}
WifiConfiguration connectionConfig = null;
+
mLastInfo = mWifiManager.getConnectionInfo();
+ if (DBG()) {
+ Log.d(TAG, "mLastInfo set as: " + mLastInfo);
+ }
if (mLastInfo != null) {
connectionConfig = getWifiConfigurationForNetworkId(mLastInfo.getNetworkId(),
mWifiManager.getConfiguredNetworks());
@@ -717,14 +716,13 @@
updated = true;
if (previouslyConnected != ap.isActive()) reorder = true;
}
- if (ap.update(mScoreCache, mNetworkScoringUiEnabled)) {
+ if (ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge)) {
reorder = true;
updated = true;
}
}
if (reorder) Collections.sort(mInternalAccessPoints);
-
if (updated) mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED);
}
}
@@ -751,7 +749,8 @@
synchronized (mLock) {
boolean updated = false;
for (int i = 0; i < mInternalAccessPoints.size(); i++) {
- if (mInternalAccessPoints.get(i).update(mScoreCache, mNetworkScoringUiEnabled)) {
+ if (mInternalAccessPoints.get(i).update(
+ mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge)) {
updated = true;
}
}
@@ -872,6 +871,9 @@
if (mScanner != null) {
mScanner.pause();
}
+ synchronized (mLock) {
+ mStaleScanResults = true;
+ }
break;
}
}
@@ -934,6 +936,9 @@
if (mScanner != null) {
mScanner.pause();
}
+ synchronized (mLock) {
+ mStaleScanResults = true;
+ }
}
mMainHandler.obtainMessage(MainHandler.MSG_WIFI_STATE_CHANGED, msg.arg1, 0)
.sendToTarget();
@@ -988,7 +993,7 @@
}
return;
}
- sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
+ sendEmptyMessageDelayed(MSG_SCAN, WIFI_RESCAN_INTERVAL_MS);
}
}
@@ -1081,10 +1086,12 @@
oldAccessPoints.put(accessPoint.mId, accessPoint);
}
- if (DBG()) {
- Log.d(TAG, "Starting to copy AP items on the MainHandler");
- }
synchronized (mLock) {
+ if (DBG()) {
+ Log.d(TAG, "Starting to copy AP items on the MainHandler. Internal APs: "
+ + mInternalAccessPoints);
+ }
+
if (notifyListeners) {
notificationMap = mAccessPointListenerAdapter.mPendingNotifications.clone();
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java b/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java
new file mode 100644
index 0000000..cd62bc3
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.wrapper;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageDeleteObserver;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.os.storage.VolumeInfo;
+
+import java.util.List;
+
+/**
+ * A thin wrapper class that simplifies testing by putting a mockable layer between the application
+ * and the PackageManager. This class only provides access to the minimum number of functions from
+ * the PackageManager needed for DeletionHelper to work.
+ */
+public class PackageManagerWrapper {
+
+ private final PackageManager mPm;
+
+ public PackageManagerWrapper(PackageManager pm) {
+ mPm = pm;
+ }
+
+ /**
+ * Returns the real {@code PackageManager} object.
+ */
+ public PackageManager getPackageManager() {
+ return mPm;
+ }
+
+ /**
+ * Calls {@code PackageManager.getInstalledApplicationsAsUser()}.
+ *
+ * @see android.content.pm.PackageManager#getInstalledApplicationsAsUser
+ */
+ public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
+ return mPm.getInstalledApplicationsAsUser(flags, userId);
+ }
+
+ /**
+ * Calls {@code PackageManager.hasSystemFeature()}.
+ *
+ * @see android.content.pm.PackageManager#hasSystemFeature
+ */
+ public boolean hasSystemFeature(String name) {
+ return mPm.hasSystemFeature(name);
+ }
+
+ /**
+ * Calls {@code PackageManager.queryIntentActivitiesAsUser()}.
+ *
+ * @see android.content.pm.PackageManager#queryIntentActivitiesAsUser
+ */
+ public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
+ return mPm.queryIntentActivitiesAsUser(intent, flags, userId);
+ }
+
+ /**
+ * Calls {@code PackageManager.getInstallReason()}.
+ *
+ * @see android.content.pm.PackageManager#getInstallReason
+ */
+ public int getInstallReason(String packageName, UserHandle user) {
+ return mPm.getInstallReason(packageName, user);
+ }
+
+ /**
+ * Calls {@code PackageManager.getApplicationInfoAsUser}
+ */
+ public ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
+ throws PackageManager.NameNotFoundException {
+ return mPm.getApplicationInfoAsUser(packageName, i, userId);
+ }
+
+ /**
+ * Calls {@code PackageManager.setDefaultBrowserPackageNameAsUser}
+ */
+ public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
+ return mPm.setDefaultBrowserPackageNameAsUser(packageName, userId);
+ }
+
+ /**
+ * Calls {@code PackageManager.getDefaultBrowserPackageNameAsUser}
+ */
+ public String getDefaultBrowserPackageNameAsUser(int userId) {
+ return mPm.getDefaultBrowserPackageNameAsUser(userId);
+ }
+
+ /**
+ * Calls {@code PackageManager.getHomeActivities}
+ */
+ public ComponentName getHomeActivities(List<ResolveInfo> homeActivities) {
+ return mPm.getHomeActivities(homeActivities);
+ }
+
+ /**
+ * Calls {@code PackageManager.queryIntentServicesAsUser}
+ */
+ public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user) {
+ return mPm.queryIntentServicesAsUser(intent, i, user);
+ }
+
+ /**
+ * Calls {@code PackageManager.replacePreferredActivity}
+ */
+ public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
+ ComponentName[] componentNames, ComponentName component) {
+ mPm.replacePreferredActivity(homeFilter, matchCategoryEmpty, componentNames, component);
+ }
+
+ /**
+ * Gets information about a particular package from the package manager.
+ * @param packageName The name of the package we would like information about.
+ * @param i additional options flags. see javadoc for
+ * {@link PackageManager#getPackageInfo(String, int)}
+ * @return The PackageInfo for the requested package
+ * @throws NameNotFoundException
+ */
+ public PackageInfo getPackageInfo(String packageName, int i) throws NameNotFoundException {
+ return mPm.getPackageInfo(packageName, i);
+ }
+
+ /**
+ * Retrieves the icon associated with this particular set of ApplicationInfo
+ * @param info The ApplicationInfo to retrieve the icon for
+ * @return The icon as a drawable.
+ */
+ public Drawable getUserBadgedIcon(ApplicationInfo info) {
+ return mPm.getUserBadgedIcon(mPm.loadUnbadgedItemIcon(info, info),
+ new UserHandle(UserHandle.getUserId(info.uid)));
+ }
+
+ /**
+ * Retrieves the label associated with the particular set of ApplicationInfo
+ * @param app The ApplicationInfo to retrieve the label for
+ * @return the label as a CharSequence
+ */
+ public CharSequence loadLabel(ApplicationInfo app) {
+ return app.loadLabel(mPm);
+ }
+
+ /**
+ * Retrieve all activities that can be performed for the given intent.
+ */
+ public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
+ return mPm.queryIntentActivities(intent, flags);
+ }
+
+ /**
+ * Calls {@code PackageManager.getPrimaryStorageCurrentVolume}
+ */
+ public VolumeInfo getPrimaryStorageCurrentVolume() {
+ return mPm.getPrimaryStorageCurrentVolume();
+ }
+
+ /**
+ * Calls {@code PackageManager.deletePackageAsUser}
+ */
+ public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
+ int userId) {
+ mPm.deletePackageAsUser(packageName, observer, flags, userId);
+ }
+
+ /**
+ * Calls {@code PackageManager.getPackageUidAsUser}
+ */
+ public int getPackageUidAsUser(String pkg, int userId)
+ throws PackageManager.NameNotFoundException {
+ return mPm.getPackageUidAsUser(pkg, userId);
+ }
+}
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 751b4ba..d9ac262 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
@@ -103,6 +103,13 @@
}
@Test
+ public void testOtherAppsRejectsImageApp() {
+ mEntry.info.category = ApplicationInfo.CATEGORY_IMAGE;
+
+ assertThat(ApplicationsState.FILTER_OTHER_APPS.filterApp(mEntry)).isFalse();
+ }
+
+ @Test
public void testOtherAppsAcceptsDefaultCategory() {
mEntry.info.category = ApplicationInfo.CATEGORY_UNDEFINED;
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 6f1b25f..66f4a01 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
@@ -45,6 +45,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.text.SpannableString;
+import android.text.format.DateUtils;
import android.text.style.TtsSpan;
import com.android.settingslib.R;
@@ -72,6 +73,8 @@
private static final RssiCurve FAST_BADGE_CURVE =
new RssiCurve(-150, 10, new byte[]{Speed.FAST});
public static final String TEST_BSSID = "00:00:00:00:00:00";
+ private static final long MAX_SCORE_CACHE_AGE_MILLIS =
+ 20 * DateUtils.MINUTE_IN_MILLIS;;
private Context mContext;
@Mock private RssiCurve mockBadgeCurve;
@@ -335,7 +338,8 @@
null /* NetworkKey */,
null /* rssiCurve */,
true /* metered */));
- ap.update(mockWifiNetworkScoreCache, false /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, false /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.isMetered()).isTrue();
}
@@ -364,7 +368,8 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.VERY_FAST);
assertThat(ap.getSpeedLabel())
@@ -379,7 +384,8 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.FAST);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.FAST);
assertThat(ap.getSpeedLabel())
@@ -394,7 +400,8 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.MODERATE);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.MODERATE);
assertThat(ap.getSpeedLabel())
@@ -409,7 +416,8 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.SLOW);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.SLOW);
assertThat(ap.getSpeedLabel())
@@ -417,56 +425,6 @@
}
@Test
- public void testSpeedLabel_isDerivedFromConnectedBssidWhenScoreAvailable() {
- int rssi = -55;
- String bssid = "00:00:00:00:00:00";
- int networkId = 123;
-
- WifiInfo info = new WifiInfo();
- info.setRssi(rssi);
- info.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
- info.setBSSID(bssid);
- info.setNetworkId(networkId);
-
- ArrayList<ScanResult> scanResults = new ArrayList<>();
- ScanResult scanResultUnconnected = createScanResult(TEST_SSID, "11:11:11:11:11:11", rssi);
- scanResults.add(scanResultUnconnected);
-
- ScanResult scanResultConnected = createScanResult(TEST_SSID, bssid, rssi);
- scanResults.add(scanResultConnected);
-
- AccessPoint ap =
- new TestAccessPointBuilder(mContext)
- .setActive(true)
- .setNetworkId(networkId)
- .setSsid(TEST_SSID)
- .setScanResultCache(scanResults)
- .setWifiInfo(info)
- .build();
-
- when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultUnconnected))
- .thenReturn(buildScoredNetworkWithMockBadgeCurve());
- when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) Speed.SLOW);
-
- int connectedSpeed = Speed.VERY_FAST;
- RssiCurve connectedBadgeCurve = mock(RssiCurve.class);
- Bundle attr1 = new Bundle();
- attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, connectedBadgeCurve);
- ScoredNetwork connectedScore = new ScoredNetwork(
- NetworkKey.createFromScanResult(scanResultConnected),
- connectedBadgeCurve,
- false /* meteredHint */,
- attr1);
- when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultConnected))
- .thenReturn(connectedScore);
- when(connectedBadgeCurve.lookupScore(anyInt())).thenReturn((byte) connectedSpeed);
-
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
-
- assertThat(ap.getSpeed()).isEqualTo(connectedSpeed);
- }
-
- @Test
public void testSummaryString_showsSpeedLabel() {
AccessPoint ap = createAccessPointWithScanResultCache();
@@ -474,7 +432,8 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSummary()).isEqualTo(mContext.getString(R.string.speed_label_very_fast));
}
@@ -492,8 +451,9 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
- String summary = ap.verboseScanResultSummary(scanResults.get(0), null);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
+ String summary = ap.verboseScanResultSummary(scanResults.get(0), null, 0);
assertThat(summary.contains(mContext.getString(R.string.speed_label_very_fast))).isTrue();
}
@@ -507,7 +467,8 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
String expectedString = mContext.getString(R.string.speed_label_very_fast) + " / "
+ mContext.getString(R.string.wifi_remembered);
@@ -914,7 +875,8 @@
int expectedSpeed = (speed1 + speed2) / 2;
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(expectedSpeed);
}
@@ -934,13 +896,14 @@
when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(1)))
.thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve2));
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(
+ mockWifiNetworkScoreCache, true /* scoringUiEnabled */, MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(speed1);
}
@Test
- public void testSpeedLabelUsesFallbackScoreWhenConnectedAccessPointScoreUnavailable() {
+ public void testSpeedLabelFallbackScoreIgnoresNullCurves() {
int rssi = -55;
String bssid = "00:00:00:00:00:00";
int networkId = 123;
@@ -975,7 +938,8 @@
when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultConnected))
.thenReturn(null);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(fallbackSpeed);
}
@@ -1002,7 +966,8 @@
AccessPoint ap =
createApWithFastTimestampedScoredNetworkCache(SystemClock.elapsedRealtime());
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(Speed.FAST);
}
@@ -1010,11 +975,12 @@
@Test
public void testNetworkScoresAreUsedForSpeedLabelGenerationWhenWithinAgeRange() {
long withinRangeTimeMillis =
- SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS - 10000);
+ SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS - 10000);
AccessPoint ap =
createApWithFastTimestampedScoredNetworkCache(withinRangeTimeMillis);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(Speed.FAST);
}
@@ -1022,11 +988,12 @@
@Test
public void testOldNetworkScoresAreNotUsedForSpeedLabelGeneration() {
long tooOldTimeMillis =
- SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1);
+ SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS + 1);
AccessPoint ap =
createApWithFastTimestampedScoredNetworkCache(tooOldTimeMillis);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(Speed.NONE);
}
@@ -1034,7 +1001,7 @@
@Test
public void testUpdateScoresRefreshesScoredNetworkCacheTimestamps () {
long tooOldTimeMillis =
- SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1);
+ SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS + 1);
ScoredNetwork scoredNetwork = buildScoredNetworkWithGivenBadgeCurve(FAST_BADGE_CURVE);
TimestampedScoredNetwork recentScore = new TimestampedScoredNetwork(
@@ -1052,7 +1019,8 @@
when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
.thenReturn(scoredNetwork);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
// Fast should still be returned since cache was updated with recent time
assertThat(ap.getSpeed()).isEqualTo(Speed.FAST);
@@ -1061,7 +1029,7 @@
@Test
public void testUpdateScoresRefreshesScoredNetworkCacheWithNewSpeed () {
long tooOldTimeMillis =
- SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1);
+ SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS + 1);
ScoredNetwork scoredNetwork = buildScoredNetworkWithGivenBadgeCurve(FAST_BADGE_CURVE);
TimestampedScoredNetwork recentScore = new TimestampedScoredNetwork(
@@ -1081,7 +1049,8 @@
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) newSpeed);
- ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
+ MAX_SCORE_CACHE_AGE_MILLIS);
// Fast should still be returned since cache was updated with recent time
assertThat(ap.getSpeed()).isEqualTo(newSpeed);
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 3d01f6b..f25bb28 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
@@ -106,15 +106,30 @@
private static final byte SCORE_2 = 15;
private static final int BADGE_2 = AccessPoint.Speed.FAST;
- private static final int CONNECTED_NETWORK_ID = 123;
+ // TODO(b/65594609): Convert mutable Data objects to instance variables / builder pattern
+ private static final int NETWORK_ID_1 = 123;
private static final int CONNECTED_RSSI = -50;
private static final WifiInfo CONNECTED_AP_1_INFO = new WifiInfo();
static {
CONNECTED_AP_1_INFO.setSSID(WifiSsid.createFromAsciiEncoded(SSID_1));
CONNECTED_AP_1_INFO.setBSSID(BSSID_1);
- CONNECTED_AP_1_INFO.setNetworkId(CONNECTED_NETWORK_ID);
+ CONNECTED_AP_1_INFO.setNetworkId(NETWORK_ID_1);
CONNECTED_AP_1_INFO.setRssi(CONNECTED_RSSI);
}
+ private static final WifiConfiguration CONFIGURATION_1 = new WifiConfiguration();
+ static {
+ CONFIGURATION_1.SSID = SSID_1;
+ CONFIGURATION_1.BSSID = BSSID_1;
+ CONFIGURATION_1.networkId = NETWORK_ID_1;
+ }
+
+ private static final int NETWORK_ID_2 = 2;
+ private static final WifiConfiguration CONFIGURATION_2 = new WifiConfiguration();
+ static {
+ CONFIGURATION_2.SSID = SSID_2;
+ CONFIGURATION_2.BSSID = BSSID_2;
+ CONFIGURATION_2.networkId = NETWORK_ID_2;
+ }
@Captor ArgumentCaptor<WifiNetworkScoreCache> mScoreCacheCaptor;
@Mock private ConnectivityManager mockConnectivityManager;
@@ -160,6 +175,8 @@
when(mockWifiManager.isWifiEnabled()).thenReturn(true);
when(mockWifiManager.getScanResults())
.thenReturn(Arrays.asList(buildScanResult1(), buildScanResult2()));
+ when(mockWifiManager.getConfiguredNetworks())
+ .thenReturn(Arrays.asList(CONFIGURATION_1, CONFIGURATION_2));
when(mockCurve1.lookupScore(RSSI_1)).thenReturn(SCORE_1);
@@ -331,8 +348,7 @@
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = SSID_1;
configuration.BSSID = BSSID_1;
- configuration.networkId = CONNECTED_NETWORK_ID;
- when(mockWifiManager.getConfiguredNetworks()).thenReturn(Arrays.asList(configuration));
+ configuration.networkId = NETWORK_ID_1;
NetworkInfo networkInfo = new NetworkInfo(
ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
@@ -363,6 +379,24 @@
mainLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
}
+ private void switchToNetwork2(WifiTracker tracker) throws InterruptedException {
+ NetworkInfo networkInfo = new NetworkInfo(
+ ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
+ networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "connecting", "test");
+
+ WifiInfo info = new WifiInfo();
+ info.setSSID(WifiSsid.createFromAsciiEncoded(SSID_2));
+ info.setBSSID(BSSID_2);
+ info.setRssi(CONNECTED_RSSI);
+ info.setNetworkId(NETWORK_ID_2);
+ when(mockWifiManager.getConnectionInfo()).thenReturn(info);
+
+ Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
+ tracker.mReceiver.onReceive(mContext, intent);
+ waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
+ }
+
@Test
public void testAccessPointListenerSetWhenLookingUpUsingScanResults() {
ScanResult scanResult = new ScanResult();
@@ -720,12 +754,6 @@
when(mockWifiManager.getConnectionInfo()).thenReturn(CONNECTED_AP_1_INFO);
- WifiConfiguration configuration = new WifiConfiguration();
- configuration.SSID = SSID_1;
- configuration.BSSID = BSSID_1;
- configuration.networkId = CONNECTED_NETWORK_ID;
- 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");
@@ -879,4 +907,17 @@
assertThat(tracker.isConnected()).isFalse();
verify(mockWifiListener, times(2)).onConnectedChanged();
}
+
+ @Test
+ public void updateNetworkInfoWithNewConnectedNetwork_switchesNetworks() throws Exception {
+ WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
+
+ switchToNetwork2(tracker);
+
+ List<AccessPoint> aps = tracker.getAccessPoints();
+ assertThat(aps.get(0).getSsidStr()).isEqualTo(SSID_2);
+
+ assertThat(aps.get(0).isReachable()).isTrue();
+ assertThat(aps.get(1).isReachable()).isTrue();
+ }
}
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 3e90435..76f6a20 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
@@ -22,10 +22,12 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.RuntimeEnvironment.application;
@@ -64,9 +66,7 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.internal.ShadowExtractor;
+import org.robolectric.shadows.ShadowApplication;
import java.util.ArrayList;
import java.util.Collections;
@@ -75,8 +75,7 @@
@RunWith(RobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH,
- sdk = TestConfig.SDK_VERSION,
- shadows = {TileUtilsTest.TileUtilsShadowRemoteViews.class})
+ sdk = TestConfig.SDK_VERSION)
public class TileUtilsTest {
@Mock
@@ -421,24 +420,12 @@
}
@Test
- public void getTilesForIntent_summaryUriSpecified_shouldOverrideRemoteViewSummary()
+ public void updateTileUsingSummaryUri_summaryUriSpecified_shouldOverrideRemoteViewSummary()
throws RemoteException {
- Intent intent = new Intent();
- Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
- List<Tile> outTiles = new ArrayList<>();
- List<ResolveInfo> info = new ArrayList<>();
- ResolveInfo resolveInfo = newInfo(true, null /* category */, null,
- null, URI_GET_SUMMARY);
- resolveInfo.activityInfo.metaData.putInt("com.android.settings.custom_view",
- R.layout.user_preference);
- info.add(resolveInfo);
-
- when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
- .thenReturn(info);
-
// Mock the content provider interaction.
Bundle bundle = new Bundle();
- bundle.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY, "new summary text");
+ String expectedSummary = "new summary text";
+ bundle.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY, expectedSummary);
when(mIContentProvider.call(anyString(),
eq(TileUtils.getMethodFromUri(Uri.parse(URI_GET_SUMMARY))), eq(URI_GET_SUMMARY),
any())).thenReturn(bundle);
@@ -447,57 +434,14 @@
when(mContentResolver.acquireUnstableProvider(any(Uri.class)))
.thenReturn(mIContentProvider);
- TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
- null /* defaultCategory */, outTiles, false /* usePriority */,
- false /* checkCategory */, true /* forceTintExternalIcon */);
+ Tile tile = new Tile();
+ tile.metaData = new Bundle();
+ tile.metaData.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY_URI, URI_GET_SUMMARY);
+ tile.remoteViews = mock(RemoteViews.class);
+ TileUtils.updateTileUsingSummaryUri(mContext, tile);
+ ShadowApplication.runBackgroundTasks();
- assertThat(outTiles.size()).isEqualTo(1);
- Tile tile = outTiles.get(0);
- assertThat(tile.remoteViews).isNotNull();
- assertThat(tile.remoteViews.getLayoutId()).isEqualTo(R.layout.user_preference);
- // Make sure the summary TextView got a new text string.
- TileUtilsShadowRemoteViews shadowRemoteViews =
- (TileUtilsShadowRemoteViews) ShadowExtractor.extract(tile.remoteViews);
- assertThat(shadowRemoteViews.overrideViewId).isEqualTo(android.R.id.summary);
- assertThat(shadowRemoteViews.overrideText).isEqualTo("new summary text");
- }
-
- @Test
- public void getTilesForIntent_providerUnavailable_shouldNotOverrideRemoteViewSummary()
- throws RemoteException {
- Intent intent = new Intent();
- Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
- List<Tile> outTiles = new ArrayList<>();
- List<ResolveInfo> info = new ArrayList<>();
- ResolveInfo resolveInfo = newInfo(true, null /* category */, null,
- null, URI_GET_SUMMARY);
- resolveInfo.activityInfo.metaData.putInt("com.android.settings.custom_view",
- R.layout.user_preference);
- info.add(resolveInfo);
-
- when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
- .thenReturn(info);
-
- // Mock the content provider interaction.
- Bundle bundle = new Bundle();
- bundle.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY, "new summary text");
- when(mIContentProvider.call(anyString(),
- eq(TileUtils.getMethodFromUri(Uri.parse(URI_GET_SUMMARY))), eq(URI_GET_SUMMARY),
- any())).thenReturn(bundle);
-
- TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
- null /* defaultCategory */, outTiles, false /* usePriority */,
- false /* checkCategory */, true /* forceTintExternalIcon */);
-
- assertThat(outTiles.size()).isEqualTo(1);
- Tile tile = outTiles.get(0);
- assertThat(tile.remoteViews).isNotNull();
- assertThat(tile.remoteViews.getLayoutId()).isEqualTo(R.layout.user_preference);
- // Make sure the summary TextView didn't get any text view updates.
- TileUtilsShadowRemoteViews shadowRemoteViews =
- (TileUtilsShadowRemoteViews) ShadowExtractor.extract(tile.remoteViews);
- assertThat(shadowRemoteViews.overrideViewId).isNull();
- assertThat(shadowRemoteViews.overrideText).isNull();
+ verify(tile.remoteViews, times(1)).setTextViewText(anyInt(), eq(expectedSummary));
}
public static ResolveInfo newInfo(boolean systemApp, String category) {
@@ -558,16 +502,4 @@
}
}
- @Implements(RemoteViews.class)
- public static class TileUtilsShadowRemoteViews {
-
- private Integer overrideViewId;
- private CharSequence overrideText;
-
- @Implementation
- public void setTextViewText(int viewId, CharSequence text) {
- overrideViewId = viewId;
- overrideText = text;
- }
- }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
index f6fe158..1e65a0a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
@@ -39,6 +39,8 @@
public class BluetoothDeviceLayerDrawableTest {
private static final int RES_ID = R.drawable.ic_bt_cellphone;
private static final int BATTERY_LEVEL = 15;
+ private static final float BATTERY_ICON_SCALE = 0.75f;
+ private static final int BATTERY_ICON_PADDING_TOP = 6;
private static final float TOLERANCE = 0.001f;
private Context mContext;
@@ -54,9 +56,24 @@
mContext, RES_ID, BATTERY_LEVEL);
assertThat(drawable.getDrawable(0)).isInstanceOf(VectorDrawable.class);
- assertThat(drawable.getDrawable(1)).isInstanceOf(BitmapDrawable.class);
- assertThat(drawable.getLayerInsetTop(1)).isEqualTo(
- drawable.getDrawable(0).getIntrinsicHeight());
+ assertThat(drawable.getDrawable(1)).isInstanceOf(
+ BluetoothDeviceLayerDrawable.BatteryMeterDrawable.class);
+ assertThat(drawable.getLayerInsetStart(1)).isEqualTo(
+ drawable.getDrawable(0).getIntrinsicWidth());
+ assertThat(drawable.getLayerInsetTop(1)).isEqualTo(0);
+ }
+
+ @Test
+ public void testCreateLayerDrawable_withIconScale_configCorrect() {
+ BluetoothDeviceLayerDrawable drawable = BluetoothDeviceLayerDrawable.createLayerDrawable(
+ mContext, RES_ID, BATTERY_LEVEL, BATTERY_ICON_SCALE);
+
+ assertThat(drawable.getDrawable(0)).isInstanceOf(VectorDrawable.class);
+ assertThat(drawable.getDrawable(1)).isInstanceOf(
+ BluetoothDeviceLayerDrawable.BatteryMeterDrawable.class);
+ assertThat(drawable.getLayerInsetStart(1)).isEqualTo(
+ drawable.getDrawable(0).getIntrinsicWidth());
+ assertThat(drawable.getLayerInsetTop(1)).isEqualTo(BATTERY_ICON_PADDING_TOP);
}
@Test
@@ -65,7 +82,7 @@
new BluetoothDeviceLayerDrawable.BatteryMeterDrawable(mContext,
R.color.meter_background_color, BATTERY_LEVEL);
- assertThat(batteryDrawable.getAspectRatio()).isWithin(TOLERANCE).of(0.45f);
+ assertThat(batteryDrawable.getAspectRatio()).isWithin(TOLERANCE).of(0.35f);
assertThat(batteryDrawable.getRadiusRatio()).isWithin(TOLERANCE).of(0f);
assertThat(batteryDrawable.getBatteryLevel()).isEqualTo(BATTERY_LEVEL);
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
index 5c99194..a4c821f 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
@@ -18,13 +18,12 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.content.Context;
-
import android.graphics.drawable.ColorDrawable;
+
import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.TestConfig;
@@ -42,9 +41,12 @@
private Context mContext = RuntimeEnvironment.application;
- @Mock private AccessPoint mockAccessPoint;
- @Mock private AccessPointPreference.UserBadgeCache mockUserBadgeCache;
- @Mock private AccessPointPreference.IconInjector mockIconInjector;
+ @Mock
+ private AccessPoint mockAccessPoint;
+ @Mock
+ private AccessPointPreference.UserBadgeCache mockUserBadgeCache;
+ @Mock
+ private AccessPointPreference.IconInjector mockIconInjector;
private AccessPointPreference createWithAccessPoint(AccessPoint accessPoint) {
return new AccessPointPreference(accessPoint, mContext, mockUserBadgeCache,
@@ -115,4 +117,19 @@
verify(mockIconInjector).getIcon(level);
}
+
+ @Test
+ public void refresh_setTitle_shouldUseSsidString() {
+ final String ssid = "ssid";
+ final String summary = "connected";
+ final int security = AccessPoint.SECURITY_WEP;
+ final AccessPoint ap = new TestAccessPointBuilder(mContext)
+ .setSsid(ssid)
+ .setSecurity(security)
+ .build();
+ final AccessPointPreference preference = mock(AccessPointPreference.class);
+
+ AccessPointPreference.setTitle(preference, ap, false /* savedNetwork */);
+ verify(preference).setTitle(ssid);
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/TimestampedScoredNetworkTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/TimestampedScoredNetworkTest.java
new file mode 100644
index 0000000..b2d9d67b
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/TimestampedScoredNetworkTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.settingslib.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.net.NetworkKey;
+import android.net.ScoredNetwork;
+import android.net.WifiKey;
+import android.os.Parcel;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+import com.android.settingslib.TestConfig;
+import java.util.Date;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class TimestampedScoredNetworkTest {
+ private TimestampedScoredNetwork impl;
+
+ private ScoredNetwork createTestScoredNetwork(String ssid) {
+ return new ScoredNetwork(
+ new NetworkKey(new WifiKey("\"" + ssid + "\"", "00:00:00:00:00:00")), null);
+ }
+
+ @Before
+ public void setUp() {
+ impl = new TimestampedScoredNetwork(createTestScoredNetwork("test"),
+ 0 /* updatedTimestampMillis */);
+ }
+
+ @Test
+ public void testUpdate() {
+ long time = new Date().getTime();
+ ScoredNetwork updated = createTestScoredNetwork("updated");
+ impl.update(updated, time);
+
+ assertThat(impl.getScore()).isEqualTo(updated);
+ assertThat(impl.getUpdatedTimestampMillis()).isEqualTo(time);
+ }
+
+ @Test
+ public void testParcel() {
+ Parcel parcel = Parcel.obtain();
+ impl.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+
+ TimestampedScoredNetwork fromParcel = TimestampedScoredNetwork.CREATOR.createFromParcel(parcel);
+
+ assertThat(fromParcel.getScore()).isEqualTo(impl.getScore());
+ assertThat(fromParcel.getUpdatedTimestampMillis()).isEqualTo(impl.getUpdatedTimestampMillis());
+ }
+}
diff --git a/packages/SettingsProvider/res/values-bn/strings.xml b/packages/SettingsProvider/res/values-bn/strings.xml
index 95cb73a..7e72dfb 100644
--- a/packages/SettingsProvider/res/values-bn/strings.xml
+++ b/packages/SettingsProvider/res/values-bn/strings.xml
@@ -19,5 +19,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="4567566098528588863">"সেটিংস সঞ্চয়স্থান"</string>
+ <string name="app_label" msgid="4567566098528588863">"সেটিংস স্টোরেজ"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 4007cc9..6da67df 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -190,4 +190,7 @@
<!-- default setting for Settings.Global.DEFAULT_RESTRICT_BACKGROUND_DATA -->
<bool name="def_restrict_background_data">false</bool>
+
+ <!-- Default for Settings.Secure.BACKUP_MANAGER_CONSTANTS -->
+ <string name="def_backup_manager_constants"></string>
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 502b254..ec6f831 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1443,6 +1443,9 @@
dumpSetting(s, p,
Settings.Secure.NOTIFICATION_BADGING,
SecureSettingsProto.NOTIFICATION_BADGING);
+ dumpSetting(s, p,
+ Settings.Secure.BACKUP_MANAGER_CONSTANTS,
+ SecureSettingsProto.BACKUP_MANAGER_CONSTANTS);
}
private static void dumpProtoSystemSettingsLocked(
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 7d7f9ae7..a463db6 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -2896,7 +2896,7 @@
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 148;
+ private static final int SETTINGS_VERSION = 149;
private final int mUserId;
@@ -3456,6 +3456,23 @@
currentVersion = 148;
}
+ if (currentVersion == 148) {
+ // Version 149: Set the default value for BACKUP_MANAGER_CONSTANTS.
+ final SettingsState systemSecureSettings = getSecureSettingsLocked(userId);
+ final String oldValue = systemSecureSettings.getSettingLocked(
+ Settings.Secure.BACKUP_MANAGER_CONSTANTS).getValue();
+ if (TextUtils.equals(null, oldValue)) {
+ final String defaultValue = getContext().getResources().getString(
+ R.string.def_backup_manager_constants);
+ if (!TextUtils.isEmpty(defaultValue)) {
+ systemSecureSettings.insertSettingLocked(
+ Settings.Secure.BACKUP_MANAGER_CONSTANTS, defaultValue, null,
+ true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+ }
+
+ currentVersion = 149;
+ }
// vXXX: Add new settings above this point.
if (currentVersion != newVersion) {
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index bd1ebb9..b758e7f5 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -62,6 +62,7 @@
<!-- Internal permissions granted to the shell. -->
<uses-permission android:name="android.permission.FORCE_BACK" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
+ <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
<uses-permission android:name="android.permission.INJECT_EVENTS" />
<uses-permission android:name="android.permission.RETRIEVE_WINDOW_CONTENT" />
diff --git a/packages/Shell/res/values-bn/strings.xml b/packages/Shell/res/values-bn/strings.xml
index 07a9df3..56a608d 100644
--- a/packages/Shell/res/values-bn/strings.xml
+++ b/packages/Shell/res/values-bn/strings.xml
@@ -26,8 +26,8 @@
<string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"ত্রুটির প্রতিবেদনটি শেয়ার করতে এটি বেছে নিন"</string>
<string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"আপনার ত্রুটির প্রতিবেদন শেয়ার করতে আলতো চাপ দিন"</string>
<string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"কোনো স্ক্রিনশট ছাড়াই ত্রুটির প্রতিবেদনটি শেয়ার করতে এটি বেছে নিন, বা স্ক্রিনশটের জন্য অপেক্ষা করুন"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"কোনো স্ক্রীনশট ছাড়াই ত্রুটির প্রতিবেদন শেয়ার করতে আলতো চাপ দিন বা সম্পন্ন করতে স্ক্রীনশটের জন্য অপেক্ষা করুন"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"কোনো স্ক্রীনশট ছাড়াই ত্রুটির প্রতিবেদন শেয়ার করতে আলতো চাপ দিন বা সম্পন্ন করতে স্ক্রীনশটের জন্য অপেক্ষা করুন"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"কোনও স্ক্রিনশট ছাড়াই ত্রুটির প্রতিবেদন শেয়ার করতে আলতো চাপ দিন বা সম্পন্ন করতে স্ক্রিনশটের জন্য অপেক্ষা করুন"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"কোনও স্ক্রিনশট ছাড়াই ত্রুটির প্রতিবেদন শেয়ার করতে আলতো চাপ দিন বা সম্পন্ন করতে স্ক্রিনশটের জন্য অপেক্ষা করুন"</string>
<string name="bugreport_confirm" msgid="5917407234515812495">"ত্রুটির প্রতিবেদনগুলিতে থাকা ডেটা, সিস্টেমের বিভিন্ন লগ ফাইলগুলি থেকে আসে, যাতে আপনার বিবেচনা অনুযায়ী সংবেদনশীল ডেটা (যেমন, অ্যাপ্লিকেশানের ব্যবহার এবং অবস্থান ডেটা) থাকতে পারে৷ আপনি বিশ্বাস করেন শুধুমাত্র এমন অ্যাপ্লিকেশান এবং ব্যক্তিদের সাথেই ত্রুটির প্রতিবেদনগুলিকে শেয়ার করুন৷"</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"আর দেখাবেন না"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"ত্রুটির প্রতিবেদনগুলি"</string>
@@ -35,13 +35,13 @@
<string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"জিপ ফাইলে ত্রুটি প্রতিবেদনের বিশদ বিবরণ যোগ করা যায়নি"</string>
<string name="bugreport_unnamed" msgid="2800582406842092709">"নামবিহীন"</string>
<string name="bugreport_info_action" msgid="2158204228510576227">"বিশদ বিবরণ"</string>
- <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্রীনশট"</string>
- <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"স্ক্রীনশট সফলভাবে নেওয়া হয়েছে৷"</string>
- <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্রীনশট নেওয়া যায়নি৷"</string>
+ <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্রিনশট"</string>
+ <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"স্ক্রিনশট সফলভাবে নেওয়া হয়েছে৷"</string>
+ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্রিনশট নেওয়া যায়নি৷"</string>
<string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ত্রুটির প্রতিবেদন <xliff:g id="ID">#%d</xliff:g> এর বিশদ বিবরণ"</string>
<string name="bugreport_info_name" msgid="4414036021935139527">"ফাইলের নাম"</string>
<string name="bugreport_info_title" msgid="2306030793918239804">"ত্রুটির শীর্ষক"</string>
<string name="bugreport_info_description" msgid="5072835127481627722">"ত্রুটির সারাংশ"</string>
- <string name="save" msgid="4781509040564835759">"সংরক্ষণ করুন"</string>
+ <string name="save" msgid="4781509040564835759">"সেভ করুন"</string>
<string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"ত্রুটির প্রতিবেদন শেয়ার করুন"</string>
</resources>
diff --git a/packages/Shell/res/values-hi/strings.xml b/packages/Shell/res/values-hi/strings.xml
index c82284c..666d254 100644
--- a/packages/Shell/res/values-hi/strings.xml
+++ b/packages/Shell/res/values-hi/strings.xml
@@ -28,7 +28,7 @@
<string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"स्क्रीनशॉट के बिना अपनी गड़बड़ी की रिपोर्ट शेयर करना चुनें या स्क्रीनशॉट पूरा होने तक इंतज़ार करें"</string>
<string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"अपनी गड़बड़ी की रिपोर्ट को बिना स्क्रीनशॉट के शेयर करने के लिए टैप करें या स्क्रीनशॉट पूरा होने की इंतज़ार करें"</string>
<string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"अपनी गड़बड़ी की रिपोर्ट को बिना स्क्रीनशॉट के शेयर करने के लिए टैप करें या स्क्रीनशॉट पूरा होने की इंतज़ार करें"</string>
- <string name="bugreport_confirm" msgid="5917407234515812495">"गड़बड़ी की रिपोर्ट में सिस्टम की अलग-अलग लॉग फ़ाइलों का डेटा शामिल होता है, जिसमें ऐसा डेटा शामिल हो सकता है जिसे आप संवेदनशील मानते हैं (जैसे कि ऐप्लिकेशन का उपयोग और स्थान डेटा). गड़बड़ी की रिपोर्ट केवल अपने भरोसेमंद लोगों और ऐप्लिकेशन से साझा करें."</string>
+ <string name="bugreport_confirm" msgid="5917407234515812495">"गड़बड़ी की रिपोर्ट में सिस्टम की अलग-अलग लॉग फ़ाइलों का डेटा शामिल होता है, जिसमें ऐसा डेटा शामिल हो सकता है जिसे आप संवेदनशील मानते हैं (जैसे कि ऐप्लिकेशन का उपयोग और जगह डेटा). गड़बड़ी की रिपोर्ट केवल अपने भरोसेमंद लोगों और ऐप्लिकेशन से शेयर करें."</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"फिर से ना दिखाएं"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"गड़बड़ी की रिपोर्ट"</string>
<string name="bugreport_unreadable_text" msgid="586517851044535486">"गड़बड़ी की रिपोर्ट फ़ाइल नहीं पढ़ी जा सकी"</string>
@@ -42,6 +42,6 @@
<string name="bugreport_info_name" msgid="4414036021935139527">"फ़ाइल नाम"</string>
<string name="bugreport_info_title" msgid="2306030793918239804">"गड़बड़ी का शीर्षक"</string>
<string name="bugreport_info_description" msgid="5072835127481627722">"गड़बड़ी का सारांश"</string>
- <string name="save" msgid="4781509040564835759">"सहेजें"</string>
+ <string name="save" msgid="4781509040564835759">"सेव करें"</string>
<string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"गड़बड़ी की रिपोर्ट शेयर करें"</string>
</resources>
diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml
index 5accb77..c99e69e 100644
--- a/packages/Shell/res/values-iw/strings.xml
+++ b/packages/Shell/res/values-iw/strings.xml
@@ -42,6 +42,6 @@
<string name="bugreport_info_name" msgid="4414036021935139527">"שם קובץ"</string>
<string name="bugreport_info_title" msgid="2306030793918239804">"כותרת הבאג"</string>
<string name="bugreport_info_description" msgid="5072835127481627722">"סיכום הבאג"</string>
- <string name="save" msgid="4781509040564835759">"שמור"</string>
+ <string name="save" msgid="4781509040564835759">"שמירה"</string>
<string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"שיתוף דוח על באג"</string>
</resources>
diff --git a/packages/Shell/res/values-pa/strings.xml b/packages/Shell/res/values-pa/strings.xml
index 56a2bea..de29ff1 100644
--- a/packages/Shell/res/values-pa/strings.xml
+++ b/packages/Shell/res/values-pa/strings.xml
@@ -22,14 +22,14 @@
<string name="bugreport_finished_title" msgid="4429132808670114081">"ਬੱਗ ਰਿਪੋਰਟ <xliff:g id="ID">#%d</xliff:g> ਕੈਪਚਰ ਕੀਤੀ ਗਈ"</string>
<string name="bugreport_updating_title" msgid="4423539949559634214">"ਬੱਗ ਰਿਪੋਰਟ ਵਿੱਚ ਵੇਰਵਿਆਂ ਨੂੰ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="bugreport_updating_wait" msgid="3322151947853929470">"ਕਿਰਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ..."</string>
- <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"ਬੱਗ ਰਿਪੋਰਟ ਜਲਦ ਹੀ ਫ਼ੋਨ \'ਤੇ ਵਿਖਾਈ ਦੇਵੇਗੀ"</string>
+ <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"ਬੱਗ ਰਿਪੋਰਟ ਜਲਦ ਹੀ ਫ਼ੋਨ \'ਤੇ ਦਿਖਾਈ ਦੇਵੇਗੀ"</string>
<string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"ਆਪਣੀ ਬੱਗ ਰਿਪੋਰਟ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਲਈ ਚੁਣੋ"</string>
<string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"ਆਪਣੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਬਿਨਾਂ ਆਪਣੀ ਬੱਗ ਰਿਪੋਰਟ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਲਈ ਚੁਣੋ ਜਾਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਪੂਰੇ ਹੋਣ ਦੀ ਉਡੀਕ ਕਰੋ"</string>
<string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਬਿਨਾਂ ਆਪਣੀ ਬੱਗ ਰਿਪੋਰਟ ਨੂੰ ਸਾਂਝੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਜਾਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਪੂਰੇ ਹੋਣ ਦੀ ਉਡੀਕ ਕਰੋ"</string>
<string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਬਿਨਾਂ ਆਪਣੀ ਬੱਗ ਰਿਪੋਰਟ ਨੂੰ ਸਾਂਝੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਜਾਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਪੂਰੇ ਹੋਣ ਦੀ ਉਡੀਕ ਕਰੋ"</string>
- <string name="bugreport_confirm" msgid="5917407234515812495">"ਬੱਗ ਰਿਪੋਰਟਾਂ ਵਿੱਚ ਸਿਸਟਮ ਦੀਆਂ ਵੱਖ-ਵੱਖ ਲੌਗ ਫ਼ਾਈਲਾਂ ਦਾ ਡੈਟਾ ਸ਼ਾਮਲ ਹੁੰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਉਹ ਡੈਟਾ ਸ਼ਾਮਲ ਹੋ ਸਕਦਾ ਹੈ ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਸੰਵੇਦਨਸ਼ੀਲ ਮੰਨਦੇ ਹੋ (ਜਿਵੇਂ ਕਿ ਐਪ-ਵਰਤੋਂ ਅਤੇ ਟਿਕਾਣਾ ਡੈਟਾ)। ਬੱਗ ਰਿਪੋਰਟਾਂ ਨੂੰ ਸਿਰਫ਼ ਆਪਣੇ ਭਰੋਸੇਯੋਗ ਲੋਕਾਂ ਅਤੇ ਐਪਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ।"</string>
- <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"ਦੁਬਾਰਾ ਨਾ ਵਿਖਾਓ"</string>
+ <string name="bugreport_confirm" msgid="5917407234515812495">"ਬੱਗ ਰਿਪੋਰਟਾਂ ਵਿੱਚ ਸਿਸਟਮ ਦੀਆਂ ਵੱਖ-ਵੱਖ ਲੌਗ ਫ਼ਾਈਲਾਂ ਦਾ ਡਾਟਾ ਸ਼ਾਮਲ ਹੁੰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਉਹ ਡਾਟਾ ਸ਼ਾਮਲ ਹੋ ਸਕਦਾ ਹੈ ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਸੰਵੇਦਨਸ਼ੀਲ ਮੰਨਦੇ ਹੋ (ਜਿਵੇਂ ਕਿ ਐਪ-ਵਰਤੋਂ ਅਤੇ ਟਿਕਾਣਾ ਡਾਟਾ )। ਬੱਗ ਰਿਪੋਰਟਾਂ ਨੂੰ ਸਿਰਫ਼ ਆਪਣੇ ਭਰੋਸੇਯੋਗ ਲੋਕਾਂ ਅਤੇ ਐਪਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ।"</string>
+ <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"ਬਗ ਰਿਪੋਰਟਾਂ"</string>
<string name="bugreport_unreadable_text" msgid="586517851044535486">"ਬਗ ਰਿਪੋਰਟ ਫ਼ਾਈਲ ਪੜ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ"</string>
<string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"ਬੱਗ ਰਿਪੋਰਟ ਵੇਰਵਿਆਂ ਨੂੰ ਜ਼ਿਪ ਫ਼ਾਈਲ ਵਿੱਚ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 75e9199..87971cb 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -318,15 +318,20 @@
android:exported="false">
</activity>
+ <!-- Springboard for launching the share activity -->
+ <receiver android:name=".screenshot.GlobalScreenshot$ShareReceiver"
+ android:process=":screenshot"
+ android:exported="false" />
+
<!-- Callback for dismissing screenshot notification after a share target is picked -->
<receiver android:name=".screenshot.GlobalScreenshot$TargetChosenReceiver"
- android:process=":screenshot"
- android:exported="false" />
+ android:process=":screenshot"
+ android:exported="false" />
<!-- Callback for deleting screenshot notification -->
<receiver android:name=".screenshot.GlobalScreenshot$DeleteScreenshotReceiver"
- android:process=":screenshot"
- android:exported="false" />
+ android:process=":screenshot"
+ android:exported="false" />
<!-- started from UsbDeviceSettingsManager -->
<activity android:name=".usb.UsbConfirmActivity"
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 5af5f9b..b68566f 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Probeer oor <xliff:g id="NUMBER">%d</xliff:g> sekondes weer.</item>
+ <item quantity="one">Probeer oor 1 sekonde weer.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Teken jou patroon"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Voer SIM se PIN in."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Voer SIM se PIN vir \"<xliff:g id="CARRIER">%1$s</xliff:g>\" in."</string>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index 7a937de..21815e1 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
+ <item quantity="other">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ስርዓተ ጥለትዎን ይሳሉ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"የሲም ፒን ያስገቡ።"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"የ«<xliff:g id="CARRIER">%1$s</xliff:g>» ሲም ፒን ያስገቡ።"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index 7aab70f..f33fa9a 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -57,7 +57,14 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="zero">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
+ <item quantity="two">حاول مرة أخرى خلال ثانيتين (<xliff:g id="NUMBER">%d</xliff:g>).</item>
+ <item quantity="few">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثوانٍ.</item>
+ <item quantity="many">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
+ <item quantity="other">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
+ <item quantity="one">حاول مرة أخرى خلال ثانية واحدة.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ارسم نقشك"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"أدخل رقم التعريف الشخصي لشريحة SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"أدخل رقم التعريف الشخصي لشريحة SIM التابعة للمشغّل \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index 73887ed..1b802fb 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniyə ərzində yenidən cəhd edin.</item>
+ <item quantity="one">1 saniyə ərzində yenidən cəhd edin.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Modeli çəkin"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN\'ni daxil edin."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" üçün SIM PIN\'ni daxil edin."</string>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 7952b7a..efd5631 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -57,7 +57,11 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
+ <item quantity="few">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte šablon"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN za SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN za SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 3b9a9bb..3288971 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ <item quantity="many">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
+ <item quantity="other">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Намалюйце ўзор"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Увядзіце PIN-код SIM-карты."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Увядзіце PIN-код SIM-карты для \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 6dd7ab9..f12967f 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Опитайте отново след <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ <item quantity="one">Опитайте отново след 1 секунда.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Начертайте фигурата си"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Въведете ПИН кода за SIM картата."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Въведете ПИН кода на SIM картата за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 2c58f77..06175eb 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"আপনার প্যাটার্ন আঁকুন"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"সিমের পিন লিখুন।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" এর জন্য সিমের পিন লিখুন।"</string>
@@ -77,20 +80,20 @@
<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_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_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_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_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>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 0ec4ad5..c49dd4f 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -57,7 +57,11 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
+ <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte uzorak"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN kôd SIM kartice."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN kôd SIM kartice operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 3d364e9..6eaa1b9 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Torna-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons.</item>
+ <item quantity="one">Torna-ho a provar d\'aquí a 1 segon.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuixa el patró"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introdueix el PIN de la SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introdueix el PIN de la SIM de: <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index 0a23d90..92e4e82 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="few">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="other">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ <item quantity="one">Zkuste to znovu za 1 sekundu.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Zadejte gesto"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Zadejte kód PIN SIM karty."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Zadejte kód PIN SIM karty <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index e55d996..2f9b9a8 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ <item quantity="other">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Tegn dit mønster"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Angiv pinkoden til SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Angiv pinkoden til SIM-kortet fra \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 41bc9a9..f350671 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">In <xliff:g id="NUMBER">%d</xliff:g> Sekunden noch einmal versuchen.</item>
+ <item quantity="one">In 1 Sekunde noch einmal versuchen.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Muster zeichnen"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Gib die SIM-PIN ein"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Gib die SIM-PIN für \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ein."</string>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index d195c87..5a21c2e 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -56,8 +56,11 @@
<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_wrong_pin" msgid="4785660766909463466">"Λανθασμένο PIN"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Δοκιμάστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα.</item>
+ <item quantity="one">Δοκιμάστε ξανά σε 1 δευτερόλεπτο.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Σχεδιάστε το μοτίβο σας"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Εισαγωγή αριθμού PIN κάρτας SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Εισαγάγετε τον αριθμό PIN της κάρτας SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -108,13 +111,13 @@
<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_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_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_pin" msgid="7426368139226961699">"Απαιτείται PIN κατά την εναλλαγή προφίλ"</string>
<string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Απαιτείται κωδικός πρόσβασης κατά την εναλλαγή προφίλ"</string>
<string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"Η συσκευή κλειδώθηκε από τον διαχειριστή"</string>
<string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Η συσκευή κλειδώθηκε με μη αυτόματο τρόπο"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index 35bae2e..d0d905b 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 35bae2e..d0d905b 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index 35bae2e..d0d905b 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index 35bae2e..d0d905b 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index 2ae7212..57a15fe 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
+ <item quantity="one">Try again in 1 second.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 219c813..66e3507 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuja tu patrón"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ingresa el PIN de la tarjeta SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ingresa el PIN de la tarjeta SIM de \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 14df1e5..bc52f66 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuja tu patrón"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduce el PIN de la tarjeta SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduce el PIN de la tarjeta SIM de <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index a6d8e20..44691b6 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Proovige uuesti <xliff:g id="NUMBER">%d</xliff:g> sekundi pärast.</item>
+ <item quantity="one">Proovige uuesti 1 sekundi pärast.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Joonistage oma muster"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Sisestage SIM-kaardi PIN-kood."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Sisestage operaatori „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kaardi PIN-kood."</string>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index 4b66213c..985006d 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Saiatu berriro <xliff:g id="NUMBER">%d</xliff:g> segundo igarotakoan.</item>
+ <item quantity="one">Saiatu berriro segundo bat igarotakoan.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Marraztu eredua"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Idatzi SIM txartelaren PIN kodea."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Idatzi \"<xliff:g id="CARRIER">%1$s</xliff:g>\" operadorearen SIM txartelaren PIN kodea."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index 2fe7bfb..ffb3621 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"الگوی خود را رسم کنید"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"پین سیمکارت را وارد کنید."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"پین سیمکارت «<xliff:g id="CARRIER">%1$s</xliff:g>» را وارد کنید."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 23139e3..b9e280a 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua.</item>
+ <item quantity="one">Yritä uudelleen 1 sekunnin kuluttua.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Piirrä kuvio"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Anna SIM-kortin PIN-koodi."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Anna operaattorin <xliff:g id="CARRIER">%1$s</xliff:g> SIM-kortin PIN-koodi."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 1c15724..53fb15c 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
+ <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dessinez votre schéma"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Entrez le NIP de la carte SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Entrez le NIP de la carte SIM pour « <xliff:g id="CARRIER">%1$s</xliff:g> »."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 00ee573..c8ace66 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
+ <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dessinez votre schéma"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Saisissez le code PIN de la carte SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Saisissez le code PIN de la carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 4f37570..25ed7bf 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Téntao de novo dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ <item quantity="one">Téntao de novo dentro de 1 segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Debuxa o teu padrón"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduce o PIN da SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduce o PIN da SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 8e5a7d29..dbbd57a 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -23,7 +23,7 @@
<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">"SIM 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>
@@ -48,7 +48,7 @@
<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">"SIM PUK ક્ષેત્ર"</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="disable_carrier_button_text" msgid="6914341927421916114">"eSIMને અક્ષમ કરો"</string>
@@ -57,21 +57,24 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"તમારી પૅટર્ન દોરો"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"સિમ પિન દાખલ કરો"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" માટે સિમ પિન દાખલ કરો."</string>
<string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"મોબાઇલ સેવા વગર ઉપકરણનો ઉપયોગ કરવા eSIMને અક્ષમ કરો."</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_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 કોડ ફરીથી દાખલ કરો. પુનરાવર્તિત પ્રયાસો SIM ને કાયમી રીતે અક્ષમ કરશે."</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>
@@ -96,13 +99,13 @@
<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">"SIM અનુપયોગી છે. તમારા કૅરિઅરનો સંપર્ક કરો."</string>
+ <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">ખોટો 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>
+ <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">"SIM PUK ઓપરેશન નિષ્ફળ થયું!"</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>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index 5e9bf3c..c5a31d8 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -42,7 +42,7 @@
<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_permanent_disabled_sim_instructions" msgid="4683178224791318347">"आपका सिम कार्ड हमेशा के लिए बंद कर दिया गया है.\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>
@@ -50,14 +50,17 @@
<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_delete" msgid="6883116827512721630">"मिटाएं"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM अक्षम करें"</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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"अपना पैटर्न बनाएं"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन डालें."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" के लिए सिम पिन डालें"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 0fb5ba0..d4ec34c 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -57,7 +57,11 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu</item>
+ <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde</item>
+ <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Iscrtajte svoj uzorak"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN za SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN za SIM mobilnog operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 3a2013d..9246510 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Próbálja újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva.</item>
+ <item quantity="one">Próbálja újra 1 másodperc múlva.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Rajzolja le a mintát"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Adja meg a SIM-kártya PIN-kódját."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Adja meg a(z) „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kártya PIN-kódját."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 3fdffbb..b9536c0 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
+ <item quantity="other">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Մուտքագրեք նախշը"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Մուտքագրեք SIM քարտի PIN կոդը։"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Մուտքագրեք SIM քարտի PIN կոդը «<xliff:g id="CARRIER">%1$s</xliff:g>»-ի համար:"</string>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 0c615a4..586cd7e 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Coba <xliff:g id="NUMBER">%d</xliff:g> detik lagi.</item>
+ <item quantity="one">Coba 1 detik lagi.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Gambar pola Anda"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Masukkan PIN SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Masukkan PIN SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index 3340093..d3760ff 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndu.</item>
+ <item quantity="other">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndur.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Teiknaðu mynstrið þitt"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Sláðu inn PIN-númer SIM-kortsins."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Sláðu inn PIN-númer SIM-korts fyrir „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 70fae42..5392220 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi.</item>
+ <item quantity="one">Riprova fra 1 secondo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Inserisci la sequenza"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Inserisci il PIN della SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Inserisci il PIN della SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 6b06966..518c1c2 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="two">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
+ <item quantity="many">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
+ <item quantity="other">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
+ <item quantity="one">אפשר יהיה לנסות שוב בעוד שנייה אחת.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"שרטט את קו ביטול הנעילה"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"הזן את קוד הגישה של כרטיס ה-SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"הזן את קוד הגישה של כרטיס ה-SIM של <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index ecd27de..3c76c2f 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> 秒後にもう一度お試しください。</item>
+ <item quantity="one">1 秒後にもう一度お試しください。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"パターンを入力してください"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN を入力してください。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"「<xliff:g id="CARRIER">%1$s</xliff:g>」の SIM PIN を入力してください。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index 38eed79..e342fcc 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">ცადეთ ხელახლა <xliff:g id="NUMBER">%d</xliff:g> წამში.</item>
+ <item quantity="one">ცადეთ ხელახლა 1 წამში.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"დახატეთ თქვენი ნიმუში"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"შეიყვანეთ SIM ბარათის PIN-კოდი."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"შეიყვანეთ SIM ბარათის PIN-კოდი „<xliff:g id="CARRIER">%1$s</xliff:g>“-ისთვის."</string>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index 137926e..e1dda1b 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"> <xliff:g id="NUMBER">%d</xliff:g> секундтан кейін қайталап көріңіз.</item>
+ <item quantity="one">1 секундтан кейін қайталап көріңіз.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Өрнекті енгізіңіз"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN кодын енгізіңіз."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" үшін SIM PIN кодын енгізіңіз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 21d1d2b..400edbe8 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">ព្យាយាមម្តងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER">%d</xliff:g> វិនាទី។</item>
+ <item quantity="one">ព្យាយាមម្តងទៀតក្នុងរយៈពេល 1 វិនាទី។</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"គូរលំនាំរបស់អ្នក"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"បញ្ចូលកូដ PIN របស់ស៊ីម។"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"បញ្ចូលកូដ PIN របស់ស៊ីមសម្រាប់ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"។"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index c16dcb9..8c69b48 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ಚಿತ್ರಿಸಿ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ಗಾಗಿ ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index a402a97..0d3603b 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요.</item>
+ <item quantity="one">1초 후에 다시 시도하세요.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"패턴 그리기"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN을 입력하세요."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\'<xliff:g id="CARRIER">%1$s</xliff:g>\'의 SIM PIN을 입력하세요."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index d9e033c..c61945c 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайталаңыз.</item>
+ <item quantity="one">1 секунддан кийин кайталаңыз.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Графикалык ачкычты тартыңыз"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM-картанын PIN-кодун киргизиңиз."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" SIM-картасынын PIN-кодун киргизиңиз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index f253386..11823a3 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">ລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ.</item>
+ <item quantity="one">ລອງໃໝ່ໃນອີກ 1 ວິນາທີ.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ໃສ່ລະຫັດ PIN ຂອງຊິມ."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"ໃສ່ລະຫັດ PIN ຂອງຊິມສຳລັບ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 11de6e2..993a6b7 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
+ <item quantity="few">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
+ <item quantity="many">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
+ <item quantity="other">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nupieškite atrakinimo piešinį"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Įveskite SIM kortelės PIN kodą."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Įveskite „<xliff:g id="CARRIER">%1$s</xliff:g>“ SIM kortelės PIN kodą"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index 51df25f9..7bd1cfd 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -57,7 +57,11 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="zero">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
+ <item quantity="one">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundes.</item>
+ <item quantity="other">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Zīmējiet savu kombināciju."</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ievadiet SIM kartes PIN kodu."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ievadiet SIM kartes “<xliff:g id="CARRIER">%1$s</xliff:g>” PIN kodu."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index eb1eaa5..c4405e0 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунда.</item>
+ <item quantity="other">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Нацртајте ја шемата"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Внесете PIN на SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Внесете PIN на SIM за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 043e7c2..bf72bcc 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> സെക്കൻഡുകൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
+ <item quantity="one">ഒരു സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"നിങ്ങളുടെ പാറ്റേൺ വരയ്ക്കുക"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"സിം പിൻ നൽകുക."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" എന്ന കാരിയർക്കുള്ള സിം പിൻ നൽകുക."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 360b09e..d440124 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу.</item>
+ <item quantity="one">1 секундын дараа дахин оролдоно уу.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Загварыг оруулна уу"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM-н ПИН-г оруулна уу."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"-н SIM-н ПИН-г оруулна уу."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 7fcc7b6..160ed65 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> सेकंदात पुन्हा प्रयत्न करा.</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंदांत पुन्हा प्रयत्न करा.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"तुमचा पॅटर्न काढा"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन एंटर करा"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" साठी सिम पिन एंटर करा"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 144e507..23295d3 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Cuba lagi dalam masa <xliff:g id="NUMBER">%d</xliff:g> saat.</item>
+ <item quantity="one">Cuba lagi dalam masa 1 saat.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Lukis corak anda"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Masukkan PIN SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Masukkan PIN SIM untuk \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index d3e22b4..4789688 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
+ <item quantity="one">၁ စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ပုံစံကို ဆွဲပါ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ဆင်းမ်ကဒ် ပင်နံပါတ်ကို ထည့်ပါ။"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" အတွက် ဆင်းမ်ကဒ်ပင်နံပါတ်ကို ထည့်ပါ။"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 7e61e6f..d3187f3 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Prøv på nytt om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
+ <item quantity="one">Prøv på nytt om ett sekund.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Tegn mønsteret ditt"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Skriv inn PIN-koden for SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Skriv inn PIN-koden for SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>»."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 4750163..b8dc313 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
+ <item quantity="one">१ सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"आफ्नो ढाँचा कोर्नुहोस्"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM को PIN प्रविष्टि गर्नुहोस्।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" को SIM को PIN प्रविष्ट गर्नुहोस्।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index eb27c2b..d1615aa 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw.</item>
+ <item quantity="one">Probeer het over één seconde opnieuw.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Teken je patroon"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Geef de pincode van de simkaart op."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Geef de pincode voor de simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' op."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 358d022..82f7227 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -23,26 +23,26 @@
<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">"SIM 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_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_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_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">"ਇੱਕ 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_permanent_disabled_sim_instructions" msgid="4683178224791318347">"ਤੁਹਾਡਾ ਸਿਮ ਕਾਰਡ ਸਥਾਈ ਤੌਰ \'ਤੇ ਅਯੋਗ ਬਣਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।\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>
@@ -56,56 +56,59 @@
<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_wrong_pin" msgid="4785660766909463466">"ਗਲਤ ਪਿੰਨ"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ਆਪਣਾ ਪੈਟਰਨ ਉਲੀਕੋ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ਲਈ ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ਮੋਬਾਈਲ ਸੇਵਾ ਤੋਂ ਬਿਨਾਂ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ eSIM ਅਯੋਗ ਬਣਾਓ।"</string>
+ <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ਮੋਬਾਈਲ ਸੇਵਾ ਤੋਂ ਬਿਨਾਂ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ eSIM ਬੰਦ ਕਰੋ।"</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_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">"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_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_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>
+ <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>
+ <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">"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>
+ <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">"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="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>
@@ -113,22 +116,22 @@
<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_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="3452168247888906179">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਡੀਵਾਈਸ ਨੂੰ ਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
- <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
- <item quantity="one">ਡੀਵਾਈਸ <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_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>
+ <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>
+ <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 71a2ce6..7597802 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="few">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ <item quantity="other">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="one">Spróbuj ponownie za sekundę</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Narysuj wzór"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Wpisz kod PIN karty SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Wpisz kod PIN karty SIM „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 0d1f9d0..8d5e097 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
+ <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe seu padrão"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Informe o PIN do cartão SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Informe o PIN do cartão SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 6bdf2d9..4d1a721 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Tente novamente dentro de 1 segundo.</item>
+ <item quantity="other">Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe o seu padrão"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduza o PIN do cartão SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduza o PIN do cartão SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 0d1f9d0..8d5e097 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
+ <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe seu padrão"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Informe o PIN do cartão SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Informe o PIN do cartão SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 3e57bec..c772a86 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -57,7 +57,11 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="few">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> secunde.</item>
+ <item quantity="other">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> de secunde.</item>
+ <item quantity="one">Încercați din nou într-o secundă.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenați modelul"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduceți codul PIN al cardului SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduceți codul PIN al cardului SIM pentru „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index ef637b4..25691d3 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ <item quantity="many">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
+ <item quantity="other">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Введите графический ключ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Введите PIN-код SIM-карты."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Введите PIN-код SIM-карты \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index d60b50e..807d54f 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
+ <item quantity="other">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ඔබගේ රටාව අඳින්න"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN ඇතුළු කරන්න"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" සඳහා SIM PIN ඇතුළු කරන්න"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index 4b3a7f7..5b433ce 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="few">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
+ <item quantity="other">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekúnd.</item>
+ <item quantity="one">Skúste to znova o 1 sekundu.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nakreslite svoj vzor"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Zadajte PIN pre SIM kartu"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Zadajte kód PIN pre SIM kartu operátora <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index a523625..243b0be 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundo.</item>
+ <item quantity="two">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
+ <item quantity="few">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Narišite vzorec"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Vnesite kodo PIN kartice SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Vnesite kodo PIN kartice SIM operaterja »<xliff:g id="CARRIER">%1$s</xliff:g>«."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index d65a800..74f822b 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Provo sërish për <xliff:g id="NUMBER">%d</xliff:g> sekonda.</item>
+ <item quantity="one">Provo sërish për 1 sekondë.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Vizato motivin tënd"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Fut kodin PIN të kartës SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Fut kodin PIN të kartës SIM për \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index bd610c5..c1cf1d2 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -57,7 +57,11 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде.</item>
+ <item quantity="other">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Нацртајте шаблон"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Унесите PIN за SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Унесите PIN за SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index f7eec5c..1d6dcbdd 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
+ <item quantity="one">Försök igen om 1 sekund.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Rita ditt grafiska lösenord"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ange pinkod för SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ange pinkod för SIM-kortet för <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index 9a10266..0ba106d 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Jaribu tena baada ya sekunde <xliff:g id="NUMBER">%d</xliff:g>.</item>
+ <item quantity="one">Jaribu tena baada ya sekunde 1.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Chora mchoro wako"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Weka PIN ya SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Weka PIN ya SIM ya \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 5f2db2c..2c403f0 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -30,7 +30,7 @@
<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" 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>
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> வினாடிகளுக்குப் பிறகு முயலவும்.</item>
+ <item quantity="one">1 வினாடிக்குப் பிறகு முயலவும்.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"பேட்டர்னை வரையவும்"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"சிம் பின்னை உள்ளிடவும்."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"க்கான சிம் பின்னை உள்ளிடவும்."</string>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index e2d3af2..23349ae 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -49,7 +49,7 @@
<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="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"తర్వాత అలారం <xliff:g id="ALARM">%1$s</xliff:g>కి సెట్ చేయబడింది"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"తొలగించు"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMని నిలిపివేయండి"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి.</item>
+ <item quantity="one">1 సెకనులో మళ్లీ ప్రయత్నించండి.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"మీ నమూనాను గీయండి"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM పిన్ని నమోదు చేయండి."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" కోసం SIM పిన్ని నమోదు చేయండి."</string>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index 8d69e61..b4a54ce 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">ลองอีกครั้งใน <xliff:g id="NUMBER">%d</xliff:g> วินาที</item>
+ <item quantity="one">ลองอีกครั้งใน 1 วินาที</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"วาดรูปแบบของคุณ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ป้อน PIN ของซิม"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"ป้อน PIN ของซิมสำหรับ \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index f34718e..18e12ee 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
+ <item quantity="other">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> na segundo.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Iguhit ang iyong pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ilagay ang PIN ng SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ilagay ang PIN ng SIM para sa \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index 183af79..7cc7650 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniye içinde tekrar deneyin.</item>
+ <item quantity="one">1 saniye içinde tekrar deneyin.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Deseninizi çizin"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN kodunu girin."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" için SIM PIN kodunu girin."</string>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index a2f6743..fa56d3b 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -57,7 +57,12 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
+ <item quantity="few">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ <item quantity="many">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
+ <item quantity="other">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Намалюйте ключ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Введіть PIN-код SIM-карти."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Введіть PIN-код SIM-карти для оператора \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 1b20118..320e545 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> سیکنڈز میں دوبارہ کوشش کریں۔</item>
+ <item quantity="one">1 سیکنڈ میں دوبارہ کوشش کریں۔</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"اپنا پیٹرن ڈرا کریں"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN درج کریں۔"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں۔"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 0011c26..062eb82 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> soniyadan keyin qaytadan urining.</item>
+ <item quantity="one">1 soniyadan keyin qaytadan urining.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Grafik kalit chizing"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM karta PIN kodini kiriting."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"“<xliff:g id="CARRIER">%1$s</xliff:g>” SIM kartasi PIN kodini kiriting."</string>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 4fdddb2..348f77e 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">Hãy thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây.</item>
+ <item quantity="one">Hãy thử lại sau 1 giây.</item>
+ </plurals>
<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="6389000973113699187">"Nhập mã PIN của SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Nhập mã PIN của SIM dành cho \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index ad92979..3dd328e 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">请在 <xliff:g id="NUMBER">%d</xliff:g> 秒后重试。</item>
+ <item quantity="one">请在 1 秒后重试。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"绘制您的图案"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"请输入 SIM 卡 PIN 码。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"请输入“<xliff:g id="CARRIER">%1$s</xliff:g>”的 SIM 卡 PIN 码。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 5cf4ac5..9d7b7ce 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">請在 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
+ <item quantity="one">請在 1 秒後再試一次。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出上鎖圖案"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"輸入 SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index 6b7435a..db97648 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other">請於 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
+ <item quantity="one">請於 1 秒後再試一次。</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出解鎖圖案"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"輸入 SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 8008ce4..6156e8a 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -57,7 +57,10 @@
<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>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
+ <item quantity="other">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dweba iphethini yakho"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Faka i-PIN ye-SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Faka i-PIN ye-SIM ye-\"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
diff --git a/packages/SystemUI/res/color/qs_background_dark.xml b/packages/SystemUI/res/color/qs_background_dark.xml
index 62e4959..c19fa08 100644
--- a/packages/SystemUI/res/color/qs_background_dark.xml
+++ b/packages/SystemUI/res/color/qs_background_dark.xml
@@ -15,6 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:alpha="0.93"
+ <item android:alpha="0.87"
android:color="?android:attr/colorBackgroundFloating"/>
</selector>
diff --git a/packages/SystemUI/res/color/qs_detail_progress_track.xml b/packages/SystemUI/res/color/qs_detail_progress_track.xml
index c56382e..d86119f 100644
--- a/packages/SystemUI/res/color/qs_detail_progress_track.xml
+++ b/packages/SystemUI/res/color/qs_detail_progress_track.xml
@@ -16,5 +16,5 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- I really don't want to define this, but the View that uses this asset uses both the
light and dark accent colors. -->
- <item android:alpha="0.6" android:drawable="@*android:color/accent_device_default_light" />
+ <item android:alpha="0.6" android:drawable="@*android:color/accent_device_default_dark" />
</selector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml
index 3eb81f8..b673e4f 100644
--- a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml
@@ -14,8 +14,8 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="64dp"
- android:height="64dp"
+ android:width="24dp"
+ android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal" >
diff --git a/packages/SystemUI/res/drawable/ic_qs_no_sim.xml b/packages/SystemUI/res/drawable/ic_qs_no_sim.xml
index 69869fe..5dcd9f7 100644
--- a/packages/SystemUI/res/drawable/ic_qs_no_sim.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_no_sim.xml
@@ -1,5 +1,5 @@
<!--
-Copyright (C) 2014 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.
@@ -16,10 +16,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportWidth="18.4"
+ android:viewportHeight="18.4">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M19.0,5.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0l-7.0,0.0L7.7,5.3L19.0,16.7L19.0,5.0zM3.7,3.9L2.4,5.2L5.0,7.8L5.0,19.0c0.0,1.1 0.9,2.0 2.0,2.0l10.0,0.0c0.4,0.0 0.7,-0.1 1.0,-0.3l1.9,1.9l1.3,-1.3L3.7,3.9z"/>
+ <group
+ android:translateX="0.7"
+ android:translateY="1.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.91,11.84L5.14,3.08l1.81,-1.81h5.41c0.85,0 1.54,0.69 1.54,1.54l0.01,9.03zM15.06,14.95L2.54,2.44c-0.28,-0.28 -0.71,-0.28 -0.99,0s-0.28,0.71 0,0.98l1.53,1.53v8.67c0,0.85 0.69,1.54 1.54,1.54h7.74c0.27,0 0.52,-0.07 0.74,-0.2l0.96,0.96c0.28,0.28 0.71,0.28 0.99,0 0.28,-0.26 0.28,-0.69 0.01,-0.97z"/>
+ </group>
</vector>
diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml b/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml
index dde2db2..2f16516 100644
--- a/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml
+++ b/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml
@@ -30,7 +30,8 @@
<TextView android:id="@+id/user_name"
android:layout_width="@dimen/car_fullscreen_user_pod_width"
android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/car_fullscreen_user_pod_margin_above_text"
+ android:layout_marginTop="@dimen/car_fullscreen_user_pod_margin_name_top"
+ android:layout_marginBottom="@dimen/car_fullscreen_user_pod_margin_name_bottom"
android:textSize="@dimen/car_fullscreen_user_pod_text_size"
android:textColor="@color/qs_user_detail_name"
android:ellipsize="end"
diff --git a/packages/SystemUI/res/layout/car_qs_footer.xml b/packages/SystemUI/res/layout/car_qs_footer.xml
index 96f34fc..044090b 100644
--- a/packages/SystemUI/res/layout/car_qs_footer.xml
+++ b/packages/SystemUI/res/layout/car_qs_footer.xml
@@ -18,23 +18,24 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/qs_footer"
android:layout_width="match_parent"
- android:layout_height="@dimen/qs_footer_height"
+ android:layout_height="@dimen/car_qs_footer_height"
android:baselineAligned="false"
android:clickable="false"
android:clipChildren="false"
android:clipToPadding="false"
- android:paddingBottom="16dp"
- android:paddingTop="16dp"
- android:paddingEnd="32dp"
- android:paddingStart="32dp"
+ android:paddingBottom="@dimen/car_qs_footer_padding_bottom"
+ android:paddingTop="@dimen/car_qs_footer_padding_top"
+ android:paddingEnd="@dimen/car_qs_footer_padding_end"
+ android:paddingStart="@dimen/car_qs_footer_padding_start"
android:gravity="center_vertical">
<com.android.systemui.statusbar.phone.MultiUserSwitch
android:id="@+id/multi_user_switch"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
- android:layout_width="48dp"
- android:layout_height="48dp"
+ android:layout_width="@dimen/car_qs_footer_icon_width"
+ android:layout_height="@dimen/car_qs_footer_icon_height"
+ android:layout_marginRight="@dimen/car_qs_footer_user_switch_margin_right"
android:background="@drawable/ripple_drawable"
android:focusable="true">
@@ -43,15 +44,24 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
- android:scaleType="centerInside"/>
+ android:scaleType="fitCenter"/>
</com.android.systemui.statusbar.phone.MultiUserSwitch>
+ <TextView android:id="@+id/user_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="@dimen/car_qs_footer_user_name_text_size"
+ android:textColor="@color/car_qs_footer_user_name_color"
+ android:gravity="start|center_vertical"
+ android:layout_centerVertical="true"
+ android:layout_toEndOf="@id/multi_user_switch" />
+
<com.android.systemui.statusbar.phone.SettingsButton
android:id="@+id/settings_button"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
- android:layout_width="48dp"
- android:layout_height="48dp"
+ android:layout_width="@dimen/car_qs_footer_icon_width"
+ android:layout_height="@dimen/car_qs_footer_icon_height"
android:background="@drawable/ripple_drawable"
android:contentDescription="@string/accessibility_quick_settings_settings"
android:scaleType="centerCrop"
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index bbd315e..6df1657 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -62,7 +62,9 @@
android:layout_height="wrap_content"
android:textAppearance="@*android:style/TextAppearance.Material.Notification.Info"
android:layout_marginStart="2dp"
- android:layout_marginEnd="2dp"/>
+ android:layout_marginEnd="2dp"
+ android:ellipsize="end"
+ android:maxLines="1"/>
</LinearLayout>
<!-- Channel Info Block -->
diff --git a/packages/SystemUI/res/layout/qs_detail_item.xml b/packages/SystemUI/res/layout/qs_detail_item.xml
index 97e82ff..0844bb4 100644
--- a/packages/SystemUI/res/layout/qs_detail_item.xml
+++ b/packages/SystemUI/res/layout/qs_detail_item.xml
@@ -26,7 +26,7 @@
<ImageView
android:id="@android:id/icon"
- android:layout_width="@dimen/qs_detail_item_icon_size"
+ android:layout_width="@dimen/qs_detail_item_icon_width"
android:layout_height="@dimen/qs_detail_item_icon_size"
android:layout_marginStart="@dimen/qs_detail_item_icon_marginStart"
android:layout_marginEnd="@dimen/qs_detail_item_icon_marginEnd"
diff --git a/packages/SystemUI/res/layout/volume_zen_footer.xml b/packages/SystemUI/res/layout/volume_zen_footer.xml
index 7ffcb1e..df79c5f 100644
--- a/packages/SystemUI/res/layout/volume_zen_footer.xml
+++ b/packages/SystemUI/res/layout/volume_zen_footer.xml
@@ -25,18 +25,15 @@
android:id="@+id/zen_embedded_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
- android:layout_marginBottom="12dp"
android:layout_marginTop="8dp"
android:background="@color/qs_tile_divider" />
-
<RelativeLayout
android:id="@+id/zen_introduction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
- android:paddingTop="8dp"
android:paddingBottom="8dp"
android:background="@drawable/zen_introduction_message_background"
android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent.Light">
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index a256ac2..324c9ff 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -298,7 +298,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ጠፍቷል"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi በርቷል"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ምንም የWi-Fi አውታረ መረቦች የሉም"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ውሰድ"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"በመውሰድ ላይ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ያልተሰየመ መሳሪያ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ለመውሰድ ዝግጁ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index bcf58d4..520df00 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -156,7 +156,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ليست هناك شريحة SIM."</string>
- <string name="accessibility_cell_data" msgid="5326139158682385073">"بيانات الجوال"</string>
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"بيانات الجوّال"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"تشغيل بيانات الجوال"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"إيقاف بيانات الجوال"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ربط البلوتوث."</string>
@@ -244,7 +244,7 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"جارٍ الشحن"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"بيانات شبكات الجيل الثاني والثالث متوقفة مؤقتًا"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"تم إيقاف بيانات شبكة الجيل الرابع مؤقتًا"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"تم إيقاف بيانات الجوال مؤقتًا"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"تم إيقاف بيانات الجوّال مؤقتًا"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"تم إيقاف البيانات مؤقتًا"</string>
<string name="data_usage_disabled_dialog" msgid="4919541636934603816">"تم الوصول إلى حد البيانات الذي عيَّنته. لم يُعد بإمكانك استخدام بيانات الجوال.\n\nفي حالة الاستئناف، قد يتم تطبيق الرسوم لاستخدام البيانات."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"استئناف"</string>
@@ -328,7 +328,7 @@
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"استخدام البيانات"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"البيانات المتبقية"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"فوق القيد"</string>
- <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> مستخدم"</string>
+ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> مستخدَمة"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"قيد <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"تحذير <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_work_mode_label" msgid="6244915274350490429">"وضع العمل"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index e64354d..c79b527 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -354,7 +354,7 @@
<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="1149025108714420281">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници, напомняния, събития и обаждания от посочени от вас контакти. Пак ще чувате всичко, което изберете да се пусне, включително музика, видеоклипове и игри."</string>
- <string name="zen_alarms_introduction" msgid="4934328096749380201">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници. Пак ще чувате всичко, което изберете да се пусне, включително музика, видеоклипове и игри."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници. Ще чувате обаче всичко, което изберете пуснете, включително музика, видеоклипове и игри."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Персонализиране"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Този режим блокира ВСИЧКИ звуци и вибрирания, включително от будилници, музика, видеоклипове и игри. Пак ще можете да извършвате телефонни обаждания."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Този режим блокира ВСИЧКИ звуци и вибрирания, включително от будилници, музика, видеоклипове и игри."</string>
diff --git a/packages/SystemUI/res/values-bn-land/strings.xml b/packages/SystemUI/res/values-bn-land/strings.xml
index ac873fa..bf53a77 100644
--- a/packages/SystemUI/res/values-bn-land/strings.xml
+++ b/packages/SystemUI/res/values-bn-land/strings.xml
@@ -19,5 +19,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="toast_rotation_locked" msgid="7609673011431556092">"এখন ভূদৃশ্য সজ্জাতে স্ক্রীণ লক করা হয়েছে৷"</string>
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"এখন ল্যান্ডস্কেপ সজ্জাতে স্ক্রিন লক করা হয়েছে৷"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index b97a648..44b01e8 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -22,7 +22,7 @@
<string name="app_label" msgid="7164937344850004466">"সিস্টেম UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"সাফ করুন"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"তালিকা থেকে সরান"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"অ্যাপ্লিকেশানের তথ্য"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"অ্যাপের তথ্য"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"আপনার সাম্প্রতিক স্ক্রীনগুলো এখানে দেখা যাবে"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"সাম্প্রতিক অ্যাপ্লিকেশানগুলি খারিজ করুন"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -55,7 +55,7 @@
<string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"এই <xliff:g id="APPLICATION">%1$s</xliff:g> অ্যাপ্লিকেশানটিকে কি USB যন্ত্রাংশ অ্যাক্সেস করার অনুমতি দেবেন?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"যখন এই USB ডিভাইসটি সংযুক্ত থাকে তখন কি <xliff:g id="ACTIVITY">%1$s</xliff:g> খুলবেন?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"যখন এই USB যন্ত্রাংশটি সংযুক্ত থাকে তখন কি <xliff:g id="ACTIVITY">%1$s</xliff:g> খুলবেন?"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ইনস্টল থাকা কোনো অ্যাপ্লিকেশান এই USB যন্ত্রাংশের সাথে কাজ করে না৷ <xliff:g id="URL">%1$s</xliff:g> এ এই যন্ত্রাংশের সম্পর্কে আরো জানুন৷"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ইনস্টল থাকা কোনো অ্যাপ্লিকেশান এই USB যন্ত্রাংশের সাথে কাজ করে না৷ <xliff:g id="URL">%1$s</xliff:g> এ এই যন্ত্রাংশের সম্পর্কে আরও জানুন৷"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"USB যন্ত্রাংশ"</string>
<string name="label_view" msgid="6304565553218192990">"দেখুন"</string>
<string name="always_use_device" msgid="1450287437017315906">"এই USB ডিভাইসের জন্য এটি ডিফল্টরুপে ব্যবহার করুন"</string>
@@ -67,14 +67,14 @@
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"স্ক্রীণ পূরণ করতে জুম করুন"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ফুল স্ক্রিন করুন"</string>
- <string name="screenshot_saving_ticker" msgid="7403652894056693515">"স্ক্রীনশট সংরক্ষণ করা হচ্ছে..."</string>
- <string name="screenshot_saving_title" msgid="8242282144535555697">"স্ক্রীনশট সংরক্ষণ করা হচ্ছে..."</string>
- <string name="screenshot_saving_text" msgid="2419718443411738818">"স্ক্রীনশট সংরক্ষণ করা হচ্ছে৷"</string>
- <string name="screenshot_saved_title" msgid="6461865960961414961">"স্ক্রীনশট নেওয়া হযেছে৷"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"স্ক্রিনশট সেভ করা হচ্ছে..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"স্ক্রিনশট সেভ করা হচ্ছে..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"স্ক্রিনশট সেভ করা হচ্ছে৷"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"স্ক্রিনশট নেওয়া হযেছে৷"</string>
<string name="screenshot_saved_text" msgid="2685605830386712477">"আপনার স্ক্রিনশট দেখতে আলতো চাপ দিন৷"</string>
- <string name="screenshot_failed_title" msgid="705781116746922771">"স্ক্রীনশট নেওয়া যায়নি৷"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"স্ক্রীনশট সংরক্ষণের সময়ে সমস্যা হয়েছে৷"</string>
- <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"সঞ্চয়স্থান সীমিত থাকায় স্ক্রীনশটটি সংরক্ষণ করা যাবে না৷"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"স্ক্রিনশট নেওয়া যায়নি৷"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"স্ক্রিনশট সেভের সময়ে সমস্যা হয়েছে৷"</string>
+ <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"স্টোরেজ সীমিত থাকায় স্ক্রিনশটটি সেভ করা যাবে না৷"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"এই অ্যাপ বা আপনার প্রতিষ্ঠান স্ক্রিনশট নেওয়ার অনুমতি দেয়নি"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ফাইল স্থানান্তরের বিকল্পগুলি"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"একটি মিডিয়া প্লেয়ার হিসেবে মাউন্ট করুন (MTP)"</string>
@@ -85,7 +85,7 @@
<string name="accessibility_menu" msgid="316839303324695949">"মেনু"</string>
<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_search_light" msgid="1103867596330271848">"খুঁজুন"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ক্যামেরা"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ফোন"</string>
<string name="accessibility_voice_assist_button" msgid="487611083884852965">"ভয়েস সহায়তা"</string>
@@ -96,7 +96,7 @@
<string name="phone_label" msgid="2320074140205331708">"ফোন খুলুন"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ভয়েস সহায়তা খুলুন"</string>
<string name="camera_label" msgid="7261107956054836961">"ক্যামেরা খুলুন"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট নির্বাচন করুন"</string>
+ <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট বেছে নিন"</string>
<string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"সামঞ্জস্যের জুম বোতাম৷"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ছোট থেকে বৃহৎ স্ক্রীণে জুম করুন৷"</string>
@@ -258,13 +258,13 @@
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"বিজ্ঞপ্তির সেটিংস"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> সেটিংস"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"স্ক্রীন স্বয়ংক্রিয়ভাবে ঘুরে যাবে৷"</string>
- <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ভূদৃশ্য সজ্জাতে স্ক্রিন লক করা আছে৷"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ল্যান্ডস্কেপ সজ্জাতে স্ক্রিন লক করা আছে৷"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"পোর্ট্রেট অবস্থায় স্ক্রিন লক করা আছে৷"</string>
<string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"স্ক্রিন এখন স্বয়ংক্রিয়ভাবে ঘুরবে।"</string>
- <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"এখন ভূদৃশ্য সজ্জাতে স্ক্রিন লক হয়েছে।"</string>
+ <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"এখন ল্যান্ডস্কেপ সজ্জাতে স্ক্রিন লক হয়েছে।"</string>
<string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"এখন পোর্ট্রেট অবস্থায় স্ক্রিন লক হয়েছে।"</string>
<string name="dessert_case" msgid="1295161776223959221">"ডেজার্ট কেস"</string>
- <string name="start_dreams" msgid="5640361424498338327">"স্ক্রীন সেভার"</string>
+ <string name="start_dreams" msgid="5640361424498338327">"স্ক্রিন সেভার"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ইথারনেট"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"বিরক্ত করবেন না"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"শুধুমাত্র অগ্রাধিকার"</string>
@@ -280,7 +280,7 @@
<string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"<xliff:g id="ID_1">%s</xliff:g> মোড"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ঘূর্ণন লক করা হয়েছে"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"পোর্ট্রেট"</string>
- <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ভূদৃশ্য"</string>
+ <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ল্যান্ডস্কেপ"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"ইনপুট পদ্ধতি"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"অবস্থান"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"অবস্থান বন্ধ করা আছে"</string>
@@ -307,7 +307,7 @@
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"স্বয়ং"</string>
<string name="quick_settings_inversion_label" msgid="8790919884718619648">"বিপরীত কোনো রং দিন"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"রঙ সংশোধন মোড"</string>
- <string name="quick_settings_more_settings" msgid="326112621462813682">"আরো সেটিংস"</string>
+ <string name="quick_settings_more_settings" msgid="326112621462813682">"আরও সেটিংস"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"সম্পন্ন হয়েছে"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"সংযুক্ত হয়েছে"</string>
<string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"সংযুক্ত হয়েছে, ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
@@ -350,7 +350,7 @@
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"পূর্ণ হতে <xliff:g id="CHARGING_TIME">%s</xliff:g> সময় লাগবে"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"চার্জ হচ্ছে না"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"নেটওয়ার্ক নিরীক্ষণ\nকরা হতে পারে"</string>
- <string name="description_target_search" msgid="3091587249776033139">"অনুসন্ধান করুন"</string>
+ <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="1149025108714420281">"অ্যালার্ম, রিমাইন্ডার, ইভেন্ট, এবং আপনার নির্দিষ্ট করে দেওয়া ব্যক্তিদের কল ছাড়া অন্য কোনও আওয়াজ বা ভাইব্রেশন হবে না। তবে সঙ্গীত, ভিডিও, এবং গেম সহ আপনি যা কিছু চালাবেন তার আওয়াজ শুনতে পাবেন।"</string>
@@ -397,7 +397,7 @@
<string name="guest_notification_text" msgid="335747957734796689">"অ্যাপ্লিকেশান এবং ডেটা মুছে ফেলার জন্য অতিথি ব্যবহারকারী সরান।"</string>
<string name="guest_notification_remove_action" msgid="8820670703892101990">"অতিথি সরান"</string>
<string name="user_logout_notification_title" msgid="1453960926437240727">"ব্যবহারকারীকে লগ-আউট করুন"</string>
- <string name="user_logout_notification_text" msgid="3350262809611876284">"বর্তমান ব্যবহারকারীকে লগ আউট করুন"</string>
+ <string name="user_logout_notification_text" msgid="3350262809611876284">"বর্তমান ব্যবহারকারীকে লগ-আউট করুন"</string>
<string name="user_logout_notification_action" msgid="1195428991423425062">"ব্যবহারকারীকে লগ-আউট করুন"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যবহারকারীকে যোগ করবেন?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷"</string>
@@ -435,15 +435,15 @@
<string name="monitoring_title" msgid="169206259253048106">"নেটওয়ার্ক নিরীক্ষণ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
<string name="monitoring_subtitle_network_logging" msgid="3341264304793193386">"নেটওয়ার্ক লগিং"</string>
- <string name="monitoring_subtitle_ca_certificate" msgid="3874151893894355988">"CA শংসাপত্র"</string>
+ <string name="monitoring_subtitle_ca_certificate" msgid="3874151893894355988">"CA সার্টিফিকেট"</string>
<string name="disable_vpn" msgid="4435534311510272506">"VPN অক্ষম করুন"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN এর সংযোগ বিচ্ছিন্ন করুন"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"নীতিগুলি দেখুন"</string>
<string name="monitoring_description_named_management" msgid="5281789135578986303">"আপনার ডিভাইসটি <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> এর দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ, ডিভাইসের সাথে সম্পর্কিত ডেটা এবং ডিভাইসের অবস্থান তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।"</string>
<string name="monitoring_description_management" msgid="4573721970278370790">"আপনার ডিভাইসটি আপনার প্রতিষ্ঠানের দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ, ডিভাইসের সাথে সম্পর্কিত ডেটা এবং ডিভাইসের অবস্থান তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।"</string>
- <string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"আপনার প্রতিষ্ঠান আপনার কর্মস্থলের প্রোফাইলে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করেছে।আপনার সুরক্ষিত নেটওয়ার্ক ট্রাফিক নিরীক্ষণ বা পরিবর্তন করা হতে পারে।"</string>
- <string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"আপনার প্রতিষ্ঠান আপনার কর্মস্থলের প্রোফাইলে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করেছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
- <string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"এই ডিভাইসে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করা আছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
+ <string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"আপনার প্রতিষ্ঠান আপনার অফিস প্রোফাইলে একটি সার্টিফিকেট কর্তৃপক্ষ ইনস্টল করেছে।আপনার সুরক্ষিত নেটওয়ার্ক ট্রাফিক নিরীক্ষণ বা পরিবর্তন করা হতে পারে।"</string>
+ <string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"আপনার প্রতিষ্ঠান আপনার অফিস প্রোফাইলে একটি সার্টিফিকেট কর্তৃপক্ষ ইনস্টল করেছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
+ <string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"এই ডিভাইসে একটি সার্টিফিকেট কর্তৃপক্ষ ইনস্টল করা আছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিকের উপরে নজর রাখে।"</string>
<string name="monitoring_description_named_vpn" msgid="7403457334088909254">"আপনি <xliff:g id="VPN_APP">%1$s</xliff:g> এ সংযুক্ত রয়েছেন, যা আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।"</string>
<string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"আপনি <xliff:g id="VPN_APP_0">%1$s</xliff:g> এবং <xliff:g id="VPN_APP_1">%2$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন, যেগুলি আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।"</string>
@@ -453,25 +453,25 @@
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> আপনার ডিভাইস পরিচালনা করার জন্য <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> ব্যবহার করে৷"</string>
<string name="monitoring_description_do_body" msgid="3639594537660975895">"আপনার প্রশাসক আপনার ডিভাইসের অবস্থান তথ্য সহ এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্স, ডেটা নিরীক্ষণ ও পরিচালনা করতে পারেন।"</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
- <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"আরো জানুন"</string>
+ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"আরও জানুন"</string>
<string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"আপনি <xliff:g id="VPN_APP">%1$s</xliff:g> এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করবে৷"</string>
<string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
<string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN সেটিংস খুলুন"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"বিশ্বস্ত শংসাপত্রগুলি খুলুন"</string>
- <string name="monitoring_description_network_logging" msgid="7223505523384076027">"আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিক নিরীক্ষণ করে।\n\nআরো তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।"</string>
+ <string name="monitoring_description_network_logging" msgid="7223505523384076027">"আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিক নিরীক্ষণ করে।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।"</string>
<string name="monitoring_description_vpn" msgid="4445150119515393526">"আপনি VPN সংযোগ সেট আপ করার জন্য একটি অ্যাপ্লিকেশানকে অনুমতি দিন৷\n\nএই অ্যাপ্লিকেশানটি ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার ডিভাইস এবং নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে।"</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"আপনার কর্মস্থলের প্রোফাইলটি <xliff:g id="ORGANIZATION">%1$s</xliff:g> দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ইমেল, অ্যাপ্স ও ওয়েবসাইট সহ কর্মস্থলের নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারেন।\n\nআরো তথ্যের জন্য আপনার প্রশাসকের সঙ্গে যোগাযোগ করুন।\n\nএছাড়া আপনি একটি VPN এর সাথেও সংযুক্ত যা আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে।"</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"আপনার কর্মস্থলের প্রোফাইলটি <xliff:g id="ORGANIZATION">%1$s</xliff:g> দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ইমেল, অ্যাপ্স ও ওয়েবসাইট সহ কর্মস্থলের নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সঙ্গে যোগাযোগ করুন।\n\nএছাড়া আপনি একটি VPN এর সাথেও সংযুক্ত যা আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে।"</string>
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
<string name="monitoring_description_app" msgid="1828472472674709532">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে৷"</string>
<string name="monitoring_description_app_personal" msgid="484599052118316268">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার ব্যক্তিগত নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string>
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এর সাথে সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করবে৷"</string>
- <string name="monitoring_description_app_work" msgid="4612997849787922906">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি <xliff:g id="APPLICATION">%2$s</xliff:g> এর সাথে সংযুক্ত, যেটি ইমেল, অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক কার্যকলাপের উপরে নজর রাখতে পারে।\n\nআরো তথ্যের জন্য প্রশাসকের সাথে যোগাযোগ করুন।"</string>
+ <string name="monitoring_description_app_work" msgid="4612997849787922906">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি <xliff:g id="APPLICATION">%2$s</xliff:g> এর সাথে সংযুক্ত, যেটি ইমেল, অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক কার্যকলাপের উপরে নজর রাখতে পারে।\n\nআরও তথ্যের জন্য প্রশাসকের সাথে যোগাযোগ করুন।"</string>
<string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> এর সাথে সংযুক্ত, যেটি ইমেল অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক কার্যকলাপের উপরে নজর রাখতে পারে।\n\n এ ছাড়াও আপনি <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> এর সাথে সংযুক্ত, যেটি আপনার ব্যক্তিগত নেটওয়ার্কে নজর রাখে।"</string>
<string name="keyguard_indication_trust_granted" msgid="4985003749105182372">"<xliff:g id="USER_NAME">%1$s</xliff:g> এর জন্য আনলক করা হয়েছে"</string>
<string name="keyguard_indication_trust_managed" msgid="8319646760022357585">"<xliff:g id="TRUST_AGENT">%1$s</xliff:g> চালু আছে"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"আপনি নিজে আনলক না করা পর্যন্ত ডিভাইসটি লক হয়ে থাকবে"</string>
- <string name="hidden_notifications_title" msgid="7139628534207443290">"বিজ্ঞপ্তিগুলি আরো দ্রুত পান"</string>
+ <string name="hidden_notifications_title" msgid="7139628534207443290">"বিজ্ঞপ্তিগুলি আরও দ্রুত পান"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"আপনি আনলক করার আগে ওগুলো দেখুন"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"না থাক"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"সেট আপ"</string>
@@ -561,14 +561,14 @@
</plurals>
<string name="notification_channels_list_desc_2" msgid="6214732715833946441">"<xliff:g id="CHANNEL_NAME_1">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2">%2$s</xliff:g>"</string>
<plurals name="notification_channels_list_desc_2_and_others" formatted="false" msgid="2747813553355336157">
- <item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, এবং আরো <xliff:g id="NUMBER_5">%3$d</xliff:g>টি</item>
- <item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, এবং আরো <xliff:g id="NUMBER_5">%3$d</xliff:g>টি</item>
+ <item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, এবং আরও <xliff:g id="NUMBER_5">%3$d</xliff:g>টি</item>
+ <item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, এবং আরও <xliff:g id="NUMBER_5">%3$d</xliff:g>টি</item>
</plurals>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> খোলা থাকলে বিজ্ঞপ্তি নিয়ন্ত্রণ"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> বন্ধ থাকলে বিজ্ঞপ্তি নিয়ন্ত্রণ"</string>
<string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"এই চ্যানেল থেকে বিজ্ঞপ্তি আসতে দেয়"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"সকল বিভাগ"</string>
- <string name="notification_more_settings" msgid="816306283396553571">"আরো সেটিংস"</string>
+ <string name="notification_more_settings" msgid="816306283396553571">"আরও সেটিংস"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"কাস্টমাইজ করুন: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</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>
@@ -662,11 +662,11 @@
<item msgid="586019486955594690">"ডানদিক ঘেঁষা"</item>
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"কিবোর্ড স্যুইচার"</string>
- <string name="save" msgid="2311877285724540644">"সংরক্ষণ করুন"</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="accessibility_key" msgid="5701989859305675896">"কাস্টম নেভিগেশন বোতাম"</string>
<string name="left_keycode" msgid="2010948862498918135">"বাঁদিকের কিকোড"</string>
<string name="right_keycode" msgid="708447961000848163">"ডানদিকের কিকোড"</string>
<string name="left_icon" msgid="3096287125959387541">"বাঁ দিকের আইকন"</string>
@@ -753,14 +753,14 @@
<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_alerts" msgid="4496839309318519037">"সতর্কতা"</string>
<string name="notification_channel_battery" msgid="5786118169182888462">"ব্যাটারি"</string>
<string name="notification_channel_screenshot" msgid="6314080179230000938">"স্ক্রীনশটস"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"সাধারণ বার্তাগুলি"</string>
- <string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়স্থান"</string>
+ <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>
+ <string name="app_info" msgid="6856026610594615344">"অ্যাপের তথ্য"</string>
<string name="go_to_web" msgid="1106022723459948514">"ওয়েবে যান"</string>
<string name="mobile_data" msgid="7094582042819250762">"মোবাইল ডেটা"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"ওয়াই ফাই বন্ধ আছে"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 697eda8..38ac499 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -22,7 +22,7 @@
<string name="app_label" msgid="7164937344850004466">"UI systému"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odebrat ze seznamu"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informace o aplikaci"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"O aplikaci"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Zde budou zobrazeny vaše poslední obrazovky"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zavřít nové aplikace"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -774,7 +774,7 @@
<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>
+ <string name="app_info" msgid="6856026610594615344">"O aplikaci"</string>
<string name="go_to_web" msgid="1106022723459948514">"Přejít na web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilní data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je vypnuta"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 2f7ffdf..24d2976 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -22,7 +22,7 @@
<string name="app_label" msgid="7164937344850004466">"System-UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern fra listen"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Oplysninger om appen"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Appinfo"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Dine seneste skærme vises her"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Luk de seneste apps"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -279,7 +279,7 @@
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Roter skærmen automatisk"</string>
<string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"Tilstanden <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Rotationen er låst"</string>
- <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"Stående format"</string>
+ <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"Stående"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"Liggende"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Inputmetode"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"Placering"</string>
@@ -760,7 +760,7 @@
<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>
+ <string name="app_info" msgid="6856026610594615344">"Appinfo"</string>
<string name="go_to_web" msgid="1106022723459948514">"Gå til website"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi er slået fra"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 0ce8e9a..6eabfc0 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -777,5 +777,5 @@
<string name="running_foreground_services_title" msgid="381024150898615683">"Aplicaciones que se están ejecutando en segundo plano"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Toca para ver información detallada sobre el uso de datos y de la batería"</string>
<string name="data_usage_disable_mobile" msgid="5116269981510015864">"¿Desactivar los datos móviles?"</string>
- <string name="touch_filtered_warning" msgid="8671693809204767551">"Una aplicación está bloqueando una solicitud de permiso, por lo que Ajustes no puede verificar tu respuesta."</string>
+ <string name="touch_filtered_warning" msgid="8671693809204767551">"Una aplicación impide ver una solicitud de permiso, por lo que Ajustes no puede verificar tu respuesta."</string>
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index efb8365..2fc49ff 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -229,8 +229,8 @@
<string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Taskulamp on sisse lülitatud."</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"Värvi ümberpööramine on välja lülitatud."</string>
<string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"Värvi ümberpööramine on sisse lülitatud."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiilside leviala on välja lülitatud."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiilside leviala on sisse lülitatud."</string>
+ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiilside kuumkoht on välja lülitatud."</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiilside kuumkoht on sisse lülitatud."</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekraanikuva ülekandmine on peatatud."</string>
<string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Töörežiim on väljas."</string>
<string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Töörežiim on sees."</string>
@@ -315,7 +315,7 @@
<string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Ühendatud, aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Ühenduse loomine ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jagamine"</string>
- <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Leviala"</string>
+ <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Kuumkoht"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Märguanded"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Taskulamp"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiilne andmeside"</string>
@@ -355,8 +355,8 @@
<string name="description_target_search" msgid="3091587249776033139">"Otsing"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Lohistage üles: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="1149025108714420281">"Helid ja vibratsioonid ei sega teid. Kuulete siiski enda määratud alarme, meeldetuletusi, sündmusi ja helistajaid. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
- <string name="zen_alarms_introduction" msgid="4934328096749380201">"Helid ja vibratsioonid ei sega teid. Kuulete siiski alarme. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Helid ja värinad ei sega teid. Kuulete siiski enda määratud äratusi, meeldetuletusi, sündmusi ja helistajaid. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Helid ja värinad ei sega teid. Kuulete siiski äratusi. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Kohanda"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"See blokeerib KÕIK helid ja vibratsioonid, sh alarmid, muusika, videod ja mängud. Siiski saate helistada."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"See blokeerib KÕIK – sealhulgas alarmide, muusika, videote ja mängude – helid ja vibratsioonid."</string>
@@ -383,7 +383,7 @@
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Kasutaja vahetamine, praegune kasutaja: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Praegune kasutaja <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"Kuva profiil"</string>
- <string name="user_add_user" msgid="5110251524486079492">"Kasutaja lisamine"</string>
+ <string name="user_add_user" msgid="5110251524486079492">"Lisa kasutaja"</string>
<string name="user_new_user_name" msgid="426540612051178753">"Uus kasutaja"</string>
<string name="guest_nickname" msgid="8059989128963789678">"Külaline"</string>
<string name="guest_new_guest" msgid="600537543078847803">"Lisa külaline"</string>
@@ -526,7 +526,7 @@
<string name="alarm_template" msgid="3980063409350522735">"kell <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="4242179982586714810">"kell <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Kiirseaded, <xliff:g id="TITLE">%s</xliff:g>."</string>
- <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Leviala"</string>
+ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Kuumkoht"</string>
<string name="accessibility_managed_profile" msgid="6613641363112584120">"Tööprofiil"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"Kõik ei pruugi sellest rõõmu tunda"</string>
<string name="tuner_warning" msgid="8730648121973575701">"Süsteemi kasutajaliidese tuuner pakub täiendavaid võimalusi Androidi kasutajaliidese muutmiseks ja kohandamiseks. Need katselised funktsioonid võivad muutuda, rikki minna või tulevastest versioonidest kaduda. Olge jätkamisel ettevaatlik."</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index b922f1a4..cd0e9a8 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -242,7 +242,7 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Kargatzen"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G datuen erabilera eten da"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G datuen erabilera eten da"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Datu mugikorrak pausatu egin dira"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Datu-konexioa pausatu egin da"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Datuen erabilera eten da"</string>
<string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Iritsi zara ezarri zenuen datu-mugara. Datu mugikorrak erabiltzeari utzi diozu.\n\nDatu mugikorrak erabiltzeari berrekiten badiozu, datuen erabileragatiko gastuak izango dituzu."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Jarraitu erabiltzen"</string>
@@ -300,7 +300,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi konexioa desaktibatuta"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Aktibatuta dago Wi-Fi konexioa"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ez dago Wi-Fi sarerik erabilgarri"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Igorri"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Igortzen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Izenik gabeko gailua"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Igortzeko prest"</string>
@@ -342,9 +342,9 @@
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Zatitze horizontala"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Zatitze bertikala"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Zatitze pertsonalizatua"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Banandu pantaila eta ezarri goian"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Banandu pantaila eta ezarri ezkerrean"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Banandu pantaila eta ezarri eskuinean"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Zatitu pantaila eta ezarri goian"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Zatitu pantaila eta ezarri ezkerrean"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Zatitu pantaila eta ezarri eskuinean"</string>
<string-array name="recents_blacklist_array">
</string-array>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kargatuta"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 61f03b5..2dc96d6 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -240,7 +240,7 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Ladataan"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G-tiedonsiirto keskeytettiin"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-tiedonsiirto keskeytettiin"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobiilidatan käyttö on keskeytetty."</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobiilidatan käyttö on keskeytetty"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Tiedonsiirto keskeytettiin"</string>
<string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Asettamasi dataraja on saavutettu. Et enää käytä mobiilidataa.\n\nJos jatkat käyttöä, datan käytöstä saatetaan periä maksuja."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Jatka"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 8c384f3..6cab2ec 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -352,7 +352,7 @@
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Chargée dans <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"N\'est pas en charge"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Le réseau peut\nêtre surveillé."</string>
- <string name="description_target_search" msgid="3091587249776033139">"Recherche"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Rechercher"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Faire glisser le doigt vers le haut : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_priority_introduction" msgid="1149025108714420281">"Vous ne serez pas dérangé par les sons et les vibrations, sauf pour les alarmes, les rappels, les événements et les appelants que vous sélectionnez. Vous entendrez tout ce que vous choisissez d\'écouter, y compris la musique, les vidéos et les jeux."</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 3e91072..e14f8be 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -355,8 +355,8 @@
<string name="description_target_search" msgid="3091587249776033139">"Rechercher"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Faites glisser vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="1149025108714420281">"Vous ne serez pas dérangé par des sons ou des vibrations, hormis ceux des alarmes, des rappels, des événements et des appelants de votre choix. Vous entendrez encore les sons que vous choisirez de jouer, notamment la musique, les vidéos et les jeux."</string>
- <string name="zen_alarms_introduction" msgid="4934328096749380201">"Vous ne serez pas dérangé par des sons ou des vibrations, hormis ceux des alarmes. Vous entendrez encore les sons que vous choisirez de jouer, notamment la musique, les vidéos et les jeux."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Vous ne serez dérangé par aucun son ni aucune vibration, hormis ceux des alarmes, des rappels, des événements et des appels des contacts de votre choix. Le son continuera de fonctionner notamment pour la musique, les vidéos et les jeux."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Vous ne serez dérangé par aucun son ni aucune vibration, hormis ceux des alarmes. Le son continuera de fonctionner notamment pour la musique, les vidéos et les jeux."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez encore passer des appels téléphoniques."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux."</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 431f75c..c04da24 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -31,7 +31,7 @@
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"કોઈ સૂચનાઓ નથી"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ચાલુ"</string>
- <string name="status_bar_latest_events_title" msgid="6594767438577593172">"સૂચનાઓ"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"નોટિફિકેશનો"</string>
<string name="battery_low_title" msgid="6456385927409742437">"બૅટરી ઓછી છે"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> બાકી"</string>
<string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"<xliff:g id="PERCENTAGE">%s</xliff:g> બાકી. બૅટરી સેવર ચાલુ છે."</string>
@@ -47,7 +47,7 @@
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"સ્ક્રીનને આપમેળે ફેરવો"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"મ્યૂટ કરો"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"સ્વતઃ"</string>
- <string name="status_bar_settings_notifications" msgid="397146176280905137">"સૂચનાઓ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"નોટિફિકેશનો"</string>
<string name="bluetooth_tethered" msgid="7094101612161133267">"બ્લૂટૂથ ટિથર કર્યું"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ઇનપુટ પદ્ધતિઓ સેટ કરો"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ભૌતિક કીબોર્ડ"</string>
@@ -151,7 +151,7 @@
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"રોમિંગ"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"વાઇ-ફાઇ"</string>
- <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM નથી."</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"સિમ નથી."</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"મોબાઇલ ડેટા"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"મોબાઇલ ડેટા ચાલુ છે"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"મોબાઇલ ડેટા બંધ છે"</string>
@@ -164,7 +164,7 @@
<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>
<string name="accessibility_settings_button" msgid="799583911231893380">"સિસ્ટમ સેટિંગ્સ."</string>
- <string name="accessibility_notifications_button" msgid="4498000369779421892">"સૂચનાઓ."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"નોટિફિકેશનો."</string>
<string name="accessibility_overflow_action" msgid="5681882033274783311">"બધી સૂચના જુઓ"</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"સૂચના સાફ કરો."</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS સક્ષમ."</string>
@@ -242,7 +242,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ડેટા થોભાવ્યો છે"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"મોબાઇલ ડેટા થોભાવ્યો છે"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ડેટા થોભાવ્યો છે"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"તમે સેટ કરેલી ડેટા મર્યાદા પહોંચી ગઇ છે. તમે હવે મોબાઇલ ડેટાનો ઉપયોગ નથી કરી રહ્યાં.\n\nજો હવે તમે ફરી શરૂ કરો, તો ડેટા વપરાશ માટે શુલ્ક લાગુ થઇ શકે છે."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"તમારા દ્વારા સેટ કરેલ ડેટા મર્યાદા પર તમે પહોંચી ગયાં છો. તમે હવે મોબાઇલ ડેટાનો ઉપયોગ કરી રહ્યાં નથી.\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">"વાઇ-ફાઇ કનેક્ટ કર્યું"</string>
@@ -314,7 +314,7 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"કનેક્ટ કરી રહ્યું છે..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ટિથરિંગ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"હૉટસ્પૉટ"</string>
- <string name="quick_settings_notifications_label" msgid="4818156442169154523">"સૂચનાઓ"</string>
+ <string name="quick_settings_notifications_label" msgid="4818156442169154523">"નોટિફિકેશનો"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ફ્લેશલાઇટ"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"મોબાઇલ ડેટા"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ડેટા વપરાશ"</string>
@@ -353,7 +353,7 @@
<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="1149025108714420281">"અલાર્મ, સ્મૃતિપત્રો, ઇવેન્ટ અને તમે ઉલ્લેખ કરો તે કૉલર સિવાય તમને ધ્વનિ કે વાઇબ્રેશન દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં. સંગીત, વીડિઓ અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરશો તે સંભળાતું રહેશે."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"અલાર્મ, રિમાઇન્ડર, ઇવેન્ટ અને તમે ઉલ્લેખ કરો તે કૉલર સિવાય તમને ધ્વનિ કે વાઇબ્રેશન દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં. સંગીત, વીડિઓ અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરશો તે સંભળાતું રહેશે."</string>
<string name="zen_alarms_introduction" msgid="4934328096749380201">"અલાર્મ સિવાય તમને ધ્વનિ કે વાઇબ્રેશન દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં. સંગીત, વીડિઓ અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરશો તે સંભળાતું રહેશે."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"કસ્ટમાઇઝ કરો"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"આ અલાર્મ, સંગીત, વીડિઓ અને રમતો સહિત બધા ધ્વનિ કે વાઇબ્રેશનને અવરોધિત કરે છે. ફોન કૉલ કરવા માટે તમે હજી પણ સમર્થ રહેશો."</string>
@@ -473,7 +473,7 @@
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"તમે ઉપકરણને મેન્યુઅલી અનલૉક કરશો નહીં ત્યાં સુધી તે લૉક રહેશે"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"વધુ ઝડપથી સૂચનાઓ મેળવો"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"તમે અનલૉક કરો તે પહેલાં તેમને જુઓ"</string>
- <string name="hidden_notifications_cancel" msgid="3690709735122344913">"નહીં આભાર"</string>
+ <string name="hidden_notifications_cancel" msgid="3690709735122344913">"ના, આભાર"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"સેટ અપ"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"હમણાં બંધ કરો"</string>
@@ -483,7 +483,7 @@
<string name="screen_pinning_description" msgid="8909878447196419623">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને ઝલકને સ્પર્શ કરી રાખો."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે ઝલકને સ્પર્શ કરી રાખો."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"સમજાઈ ગયું"</string>
- <string name="screen_pinning_negative" msgid="3741602308343880268">"નહીં આભાર"</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_button" msgid="2660339101868367515">"છુપાવો"</string>
@@ -493,7 +493,7 @@
<string name="stream_ring" msgid="8213049469184048338">"રિંગ વગાડો"</string>
<string name="stream_music" msgid="9086982948697544342">"મીડિયા"</string>
<string name="stream_alarm" msgid="5209444229227197703">"એલાર્મ"</string>
- <string name="stream_notification" msgid="2563720670905665031">"સૂચના"</string>
+ <string name="stream_notification" msgid="2563720670905665031">"નોટિફિકેશન"</string>
<string name="stream_bluetooth_sco" msgid="2055645746402746292">"બ્લૂટૂથ"</string>
<string name="stream_dtmf" msgid="2447177903892477915">"દ્વિ બહુ ટોન આવર્તન"</string>
<string name="stream_accessibility" msgid="301136219144385106">"ઍક્સેસિબિલિટી"</string>
@@ -550,7 +550,7 @@
<string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"ચાલુ"</string>
<string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"બંધ"</string>
<string name="power_notification_controls_description" msgid="4372459941671353358">"પાવર સૂચના નિયંત્રણો સાથે, તમે ઍપની સૂચનાઓ માટે 0 થી 5 સુધીના મહત્વના સ્તરને સેટ કરી શકો છો. \n\n"<b>"સ્તર 5"</b>" \n- સૂચના સૂચિની ટોચ પર બતાવો \n- પૂર્ણ સ્ક્રીન અવરોધની મંજૂરી આપો \n- હંમેશાં ત્વરિત દૃષ્ટિ કરો \n\n"<b>"સ્તર 4"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધ અટકાવો \n- હંમેશાં ત્વરિત દૃષ્ટિ કરો \n\n"<b>"સ્તર 3"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધ અટકાવો \n- ક્યારેય ત્વરિત દૃષ્ટિ કરશો નહીં \n\n"<b>"સ્તર 2"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધ અટકાવો \n- ક્યારેય ત્વરિત દૃષ્ટિ કરશો નહીં \n- ક્યારેય અવાજ અથવા વાઇબ્રેટ કરશો નહીં \n\n"<b>"સ્તર 1"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધની મંજૂરી આપો \n- ક્યારેય ત્વરિત દૃષ્ટિ કરશો નહીં \n- ક્યારેય અવાજ અથવા વાઇબ્રેટ કરશો નહીં \n- લૉક સ્ક્રીન અને સ્ટેટસ બારથી છુપાવો \n- સૂચના સૂચિના તળિયા પર બતાવો \n\n"<b>"સ્તર 0"</b>" \n- ઍપની તમામ સૂચનાઓને બ્લૉક કરો"</string>
- <string name="notification_header_default_channel" msgid="7506845022070889909">"સૂચનાઓ"</string>
+ <string name="notification_header_default_channel" msgid="7506845022070889909">"નોટિફિકેશનો"</string>
<string name="notification_channel_disabled" msgid="2139193533791840539">"તમને હવે આ સૂચનાઓ મળશે નહીં"</string>
<string name="notification_num_channels" msgid="2048144408999179471">"<xliff:g id="NUMBER">%d</xliff:g> સૂચના કૅટેગરીઓ"</string>
<string name="notification_default_channel_desc" msgid="2506053815870808359">"આ ઍપ્લિકેશનમાં સૂચના કૅટેગરી નથી"</string>
@@ -618,7 +618,7 @@
<string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"હોમ"</string>
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"તાજેતરના"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"પાછળ"</string>
- <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"સૂચનાઓ"</string>
+ <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"નોટિફિકેશનો"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"કીબોર્ડ શૉર્ટકટ્સ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ઇનપુટ પદ્ધતિ સ્વિચ કરો"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ઍપ્લિકેશનો"</string>
@@ -676,7 +676,7 @@
<string name="qs_edit" msgid="2232596095725105230">"સંપાદિત કરો"</string>
<string name="tuner_time" msgid="6572217313285536011">"સમય"</string>
<string-array name="clock_options">
- <item msgid="5965318737560463480">"કલાક, મિનિટ અને સેકંડ બતાવો"</item>
+ <item msgid="5965318737560463480">"કલાક, મિનિટ અને સેકન્ડ બતાવો"</item>
<item msgid="1427801730816895300">"કલાક અને મિનિટ બતાવો (ડિફોલ્ટ)"</item>
<item msgid="3830170141562534721">"આ આઇકન બતાવશો નહીં"</item>
</string-array>
@@ -706,7 +706,7 @@
<string name="accessibility_qs_edit_tile_removed" msgid="8584304916627913440">"<xliff:g id="TILE_NAME">%1$s</xliff:g> દૂર કરવામાં આવ્યું છે"</string>
<string name="accessibility_qs_edit_tile_moved" msgid="4343693412689365038">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ને <xliff:g id="POSITION">%2$d</xliff:g> સ્થિતિ પર ખસેડ્યું"</string>
<string name="accessibility_desc_quick_settings_edit" msgid="8073587401747016103">"ઝડપી સેટિંગ્સ સંપાદક."</string>
- <string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> સૂચના: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+ <string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> નોટિફિકેશન: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"વિભાજિત-સ્ક્રીન સાથે ઍપ્લિકેશન કદાચ કામ ન કરે."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ઍપ્લિકેશન સ્ક્રીન-વિભાજનનું સમર્થન કરતી નથી."</string>
<string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર કદાચ કામ ન કરે."</string>
@@ -735,7 +735,7 @@
<string name="pip_skip_to_prev" msgid="1955311326688637914">"પહેલાંના પર જાઓ"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ફોન વધુ પડતી ગરમીને લીધે બંધ થઇ ગયો છે"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે"</string>
- <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા આપમેળે બંધ થઇ ગયો છે. તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઇ શકે છે, જો તમે:\n • એવી ઍપ્લિકેશન વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વિડિઓ, અથવા નેવિગેટ કરતી ઍપ્લિકેશનો)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string>
+ <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા આપમેળે બંધ થઇ ગયો છે. તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઇ શકે છે, જો તમે:\n • એવી ઍપ્લિકેશન વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વીડિઓ, અથવા નેવિગેટ કરતી ઍપ્લિકેશનો)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string>
<string name="high_temp_title" msgid="4589508026407318374">"ફોન ગરમ થઈ રહ્યો છે"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ફોન ઠંડો થાય ત્યાં સુધી કેટલીક સુવિધાઓ મર્યાદિત હોય છે"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"તમારો ફોન આપમેળે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nતમારો ફોન ઠંડો થઈ જવા પર, તે સામાન્ય રીતે ચાલશે."</string>
diff --git a/packages/SystemUI/res/values-h600dp/dimens_car.xml b/packages/SystemUI/res/values-h600dp/dimens_car.xml
new file mode 100644
index 0000000..c3e62c8
--- /dev/null
+++ b/packages/SystemUI/res/values-h600dp/dimens_car.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.
+*/
+-->
+<resources>
+ <dimen name="car_body2_size">32sp</dimen> <!-- B2 -->
+</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 9c6d7c4..25baf20 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -74,7 +74,7 @@
<string name="screenshot_saved_text" msgid="2685605830386712477">"अपना स्क्रीनशॉट देखने के लिए टैप करें."</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"स्क्रीनशॉट को कैप्चर नहीं किया जा सका."</string>
<string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"स्क्रीनशॉट सहेजने में समस्या आई"</string>
- <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"सीमित मेमोरी स्थान के कारण स्क्रीनशॉट सहेजा नहीं जा सकता."</string>
+ <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"मेमोरी में जगह कम होने की वजह से स्क्रीनशॉट सेव नहीं किया जा सकता."</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ऐप्लिकेशन या आपका संगठन स्क्रीनशॉट लेने की अनुमति नहीं देता"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB फ़ाइल स्थानांतरण विकल्प"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"मीडिया प्लेयर के रूप में माउंट करें (MTP)"</string>
@@ -83,7 +83,7 @@
<string name="accessibility_back" msgid="567011538994429120">"वापस जाएं"</string>
<string name="accessibility_home" msgid="8217216074895377641">"होम"</string>
<string name="accessibility_menu" msgid="316839303324695949">"मेन्यू"</string>
- <string name="accessibility_accessibility_button" msgid="7601252764577607915">"एक्सेस-योग्यता"</string>
+ <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>
@@ -155,7 +155,7 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"मोबाइल डेटा"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"मोबाइल डेटा चालू है"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"मोबाइल डेटा बंद है"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब्लूटूथ टेदरिंग."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब्लूटूथ से इंटरनेट पर शेयर करें."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"हवाई जहाज मोड."</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN चालू."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"कोई सिम कार्ड नहीं है."</string>
@@ -198,9 +198,9 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"हवाई जहाज़ मोड चालू है."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"हवाई जहाज़ मोड को बंद किया गया."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"हवाई जहाज़ मोड को चालू किया गया."</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"परेशान ना करें चालू, केवल प्राथमिकता."</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"परेशान ना करें चालू, सिर्फ़ प्राथमिकता."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"परेशान ना करें चालू है, पूरी तरह शांत."</string>
- <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"परेशान ना करें चालू, केवल अलार्म."</string>
+ <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"परेशान ना करें चालू, सिर्फ़ अलार्म."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"परेशान ना करें."</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"परेशान ना करें बंद."</string>
<string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"परेशान ना करें बंद किया गया."</string>
@@ -212,10 +212,10 @@
<string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ब्लूटूथ कनेक्ट है."</string>
<string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ब्लूटूथ को बंद किया गया."</string>
<string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ब्लूटूथ को चालू किया गया."</string>
- <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"स्थान रिपोर्टिंग बंद है."</string>
- <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"स्थान रिपोर्टिंग चालू है."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"स्थान रिपोर्टिंग को बंद किया गया."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"स्थान रिपोर्टिंग को चालू किया गया."</string>
+ <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"जगह की रिपोर्ट बंद है."</string>
+ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"जगह की रिपोर्ट चालू है."</string>
+ <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"जगह की रिपोर्ट को बंद किया गया."</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"जगह की रिपोर्ट को चालू किया गया."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g> के लिए अलार्म सेट किया गया."</string>
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"पैनल बंद करें."</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"अधिक समय."</string>
@@ -247,8 +247,8 @@
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"कोई इंटरनेट कनेक्शन नहीं"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"वाई-फ़ाई कनेक्ट किया गया"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS को खोजा जा रहा है"</string>
- <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS द्वारा सेट किया गया स्थान"</string>
- <string name="accessibility_location_active" msgid="2427290146138169014">"स्थान का अनुरोध किया जा रहा है"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"जीपीएस ने यह जगह सेट की है"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"जगह का अनुरोध किया जा रहा है"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"सभी सूचनाएं साफ़ करें."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
@@ -267,8 +267,8 @@
<string name="start_dreams" msgid="5640361424498338327">"स्क्रीन सेवर"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ईथरनेट"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"परेशान ना करें"</string>
- <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"केवल प्राथमिकता"</string>
- <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"केवल अलार्म"</string>
+ <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"सिर्फ़ प्राथमिकता"</string>
+ <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"सिर्फ़ अलार्म"</string>
<string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"पूरी तरह शांत"</string>
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ब्लूटूथ"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ब्लूटूथ (<xliff:g id="NUMBER">%d</xliff:g> डिवाइस)"</string>
@@ -282,8 +282,8 @@
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"पोर्ट्रेट"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"लैंडस्केप"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"इनपुट विधि"</string>
- <string name="quick_settings_location_label" msgid="5011327048748762257">"स्थान"</string>
- <string name="quick_settings_location_off_label" msgid="7464544086507331459">"स्थान बंद"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"जगह"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"जगह की जानकारी बंद है"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"मीडिया डिवाइस"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"केवल आपातकालीन कॉल"</string>
@@ -339,7 +339,7 @@
<string name="recents_drag_hint_message" msgid="2649739267073203985">"स्क्रीन के दो हिस्से में बंट जाने, स्पिल्ट स्क्रीन, का इस्तेमाल करने के लिए यहां खींचें और छोडें"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज रूप से विभाजित करें"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"लम्बवत रूप से विभाजित करें"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"कस्टम रूप से विभाजित करें"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"अपने मुताबिक बांटें"</string>
<string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ऊपर की ओर दो स्क्रीन बनाएं"</string>
<string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"बाईं ओर दो स्क्रीन बनाएं"</string>
<string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"दाईं ओर दो स्क्रीन बनाएं"</string>
@@ -369,8 +369,8 @@
<string name="camera_hint" msgid="7939688436797157483">"कैमरे के लिए आइकॉन से स्वाइप करें"</string>
<string name="interruption_level_none_with_warning" msgid="5114872171614161084">"संपूर्ण मौन. इससे स्क्रीन रीडर भी मौन हो जाएंगे."</string>
<string name="interruption_level_none" msgid="6000083681244492992">"पूरी तरह शांत"</string>
- <string name="interruption_level_priority" msgid="6426766465363855505">"केवल प्राथमिकता"</string>
- <string name="interruption_level_alarms" msgid="5226306993448328896">"केवल अलार्म"</string>
+ <string name="interruption_level_priority" msgid="6426766465363855505">"सिर्फ़ प्राथमिकता"</string>
+ <string name="interruption_level_alarms" msgid="5226306993448328896">"सिर्फ़ अलार्म"</string>
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"पूरी तरह\nशांत"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"केवल\nप्राथमिकता"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"केवल\nअलार्म"</string>
@@ -400,16 +400,16 @@
<string name="user_logout_notification_text" msgid="3350262809611876284">"मौजूदा उपयोगकर्ता से प्रस्थान करें"</string>
<string name="user_logout_notification_action" msgid="1195428991423425062">"उपयोगकर्ता को प्रस्थान करवाएं"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"नया उपयोगकर्ता जोड़ें?"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उस व्यक्ति को अपना स्थान सेट करना होता है.\n\nकोई भी उपयोगकर्ता बाकी सभी उपयोगकर्ताओं के लिए ऐप अपडेट कर सकता है."</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उस व्यक्ति को अपनी जगह सेट करनी होती है.\n\nकोई भी उपयोगकर्ता बाकी सभी उपयोगकर्ताओं के लिए ऐप अपडेट कर सकता है."</string>
<string name="user_remove_user_title" msgid="4681256956076895559">"उपयोगकर्ता निकालें?"</string>
<string name="user_remove_user_message" msgid="1453218013959498039">"इस उपयोगकर्ता के सभी ऐप और डेटा को हटा दिया जाएगा."</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"निकालें"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"बैटरी सेवर चालू है"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"निष्पादन और पृष्ठभूमि डेटा को कम करता है"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"बैटरी बचतकर्ता को बंद करें"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपके स्क्रीन पर प्रदर्शित प्रत्येक सामग्री को कैप्चर करना प्रारंभ कर देगी."</string>
+ <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपके स्क्रीन पर दिखाई देने वाली हर सामग्री को कैप्चर करना शुरू कर देगी."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"फिर से न दिखाएं"</string>
- <string name="clear_all_notifications_text" msgid="814192889771462828">"सभी साफ करें"</string>
+ <string name="clear_all_notifications_text" msgid="814192889771462828">"सभी साफ़ करें"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"अब शुरू करें"</string>
<string name="empty_shade_text" msgid="708135716272867002">"कोई सूचना नहीं मिली"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफ़ाइल को मॉनीटर किया जा सकता है"</string>
@@ -439,8 +439,8 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN अक्षम करें"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN डिस्कनेक्ट करें"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"नीतियां देखें"</string>
- <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपके डिवाइस का प्रबंधन करता है.\n\nआपका एडमिन सेटिंग, कॉर्पोरेट पहुंच, ऐप्लिकेशन, आपके डिवाइस से जुड़े डेटा और आपके डिवाइस की स्थान की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\nअधिक जानकारी के लिए, अपने एडमिन से संपर्क करें."</string>
- <string name="monitoring_description_management" msgid="4573721970278370790">"आपका संगठन आपके डिवाइस का प्रबंधन करता है.\n\nआपका एडमिन सेटिंग, कॉर्पोरेट पहुंच, ऐप्लिकेशन, आपके डिवाइस से जुड़े डेटा और आपके डिवाइस की स्थान (लोकेशन) की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\nअधिक जानकारी के लिए, अपने एडमिन से संपर्क करें."</string>
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपके डिवाइस का प्रबंधन करता है.\n\nआपका एडमिन सेटिंग, कॉर्पोरेट पहुंच, ऐप्लिकेशन, आपके डिवाइस से जुड़े डेटा और आपके डिवाइस की जगह की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\n और जानकारी के लिए, अपने एडमिन से संपर्क करें."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"आपका संगठन आपके डिवाइस का प्रबंधन करता है.\n\nआपका एडमिन सेटिंग, कॉर्पोरेट पहुंच, ऐप्लिकेशन, आपके डिवाइस से जुड़े डेटा और आपके डिवाइस की जगह की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\nऔर जानकारी के लिए, अपने एडमिन से संपर्क करें."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"आपके संगठन ने इस डिवाइस पर एक प्रमाणपत्र अनुमति इंस्टॉल की है. आपके सुरक्षित नेटवर्क पर ट्रेफ़िक की निगरानी या उसमें बदलाव किया जा सकता है."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"आपके संगठन ने आपकी कार्य प्रोफ़ाइल में एक प्रमाणपत्र अनुमति इंस्टॉल की है. आपके सुरक्षित नेटवर्क ट्रैफ़िक की निगरानी या उसमें बदलाव किया जा सकता है."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"इस डिवाइस पर एक प्रमाणपत्र अनुमति इंस्टॉल की है. आपके सुरक्षित नेटवर्क ट्रैफ़िक की निगरानी या उसमें बदलाव किया जा सकता है."</string>
@@ -451,14 +451,14 @@
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"आपकी व्यक्तिगत प्रोफ़ाइल <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> आपका डिवाइस प्रबंधित करता है."</string>
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपका डिवाइस प्रबंधित करने के लिए <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> का उपयोग करता है."</string>
- <string name="monitoring_description_do_body" msgid="3639594537660975895">"आपका एडमिन आपके डिवाइस से जुड़ी सेटिंग, कॉर्पोरेट पहुंच, ऐप्लिकेशन, डेटा और आपके डिवाइस की स्थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है."</string>
+ <string name="monitoring_description_do_body" msgid="3639594537660975895">"आपका एडमिन आपके डिवाइस से जुड़ी सेटिंग, कॉर्पोरेट पहुंच, ऐप्लिकेशन, डेटा और आपके डिवाइस की जगह की जानकारी की निगरानी और उसका प्रबंधन कर सकता है."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
<string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"ज़्यादा जानें"</string>
<string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"आप <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी नेटवर्क गतिविधि को मॉनिटर कर सकता है."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
<string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN सेटिंग खोलें"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
- <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"विश्वसनीय क्रेडेंशियल खोलें"</string>
+ <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"भरोसेमंद क्रेडेंशियल खोलें"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"आपके एडमिन ने नेटवर्क लॉग करना चालू कर दिया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है.\n\nअधिक जानकारी के लिए अपने एडमिन से संपर्क करें."</string>
<string name="monitoring_description_vpn" msgid="4445150119515393526">"आपने किसी ऐप को VPN कनेक्शन सेट करने की अनुमति दी है.\n\nयह ऐप ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपके डिवाइस और नेटवर्क की गतिविधि की निगरानी कर सकता है."</string>
<string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> आपकी वर्क प्रोफ़ाइल को प्रबंधित करता है.\n\n आपका एडमिन ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nऔर जानकारी के लिए अपने एडमिन से संपर्क करें.\n\nआप ऐसे VPN से भी कनेक्ट हैं, जो आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string>
@@ -477,12 +477,12 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट करें"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"अभी बंद करें"</string>
- <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तृत करें"</string>
- <string name="accessibility_volume_collapse" msgid="3609549593031810875">"संक्षिप्त करें"</string>
+ <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तार करें"</string>
+ <string name="accessibility_volume_collapse" msgid="3609549593031810875">"छोटा करें"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन कर दी गई है"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' को दबाकर रखें."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'खास जानकारी\' को दबाकर रखें."</string>
- <string name="screen_pinning_positive" msgid="3783985798366751226">"समझ लिया"</string>
+ <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>
@@ -496,10 +496,10 @@
<string name="stream_notification" msgid="2563720670905665031">"सूचना"</string>
<string name="stream_bluetooth_sco" msgid="2055645746402746292">"ब्लूटूथ"</string>
<string name="stream_dtmf" msgid="2447177903892477915">"दोहरी बहु टोन आवृत्ति"</string>
- <string name="stream_accessibility" msgid="301136219144385106">"एक्सेस-योग्यता"</string>
+ <string name="stream_accessibility" msgid="301136219144385106">"सुलभता"</string>
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. अनम्यूट करने के लिए टैप करें."</string>
- <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. कंपन (वाइब्रेशन) पर सेट करने के लिए छूएं. सुलभता सेवाएं म्यूट हो सकती हैं."</string>
- <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. म्यूट करने के लिए टैप करें. एक्सेस-योग्यता सेवाएं म्यूट हो सकती हैं."</string>
+ <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. कंपन पर सेट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string>
+ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. म्यूट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. कंपन (वाइब्रेशन) पर सेट करने के लिए छूएं."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. म्यूट करने के लिए टैप करें."</string>
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s वॉल्यूम नियंत्रण दिखाए गए हैं. खारिज करने के लिए स्वाइप करें."</string>
@@ -511,7 +511,7 @@
<string name="status_bar" msgid="4877645476959324760">"स्टेटस बार"</string>
<string name="overview" msgid="4018602013895926956">"खास जानकारी"</string>
<string name="demo_mode" msgid="2532177350215638026">"सिस्टम यूज़र इंटरफ़ेस (यूआई) डेमो मोड"</string>
- <string name="enable_demo_mode" msgid="4844205668718636518">"डेमो मोड सक्षम करें"</string>
+ <string name="enable_demo_mode" msgid="4844205668718636518">"डेमो मोड चालू करें"</string>
<string name="show_demo_mode" msgid="2018336697782464029">"डेमो मोड दिखाएं"</string>
<string name="status_bar_ethernet" msgid="5044290963549500128">"ईथरनेट"</string>
<string name="status_bar_alarm" msgid="8536256753575881818">"अलार्म"</string>
@@ -529,7 +529,7 @@
<string name="tuner_warning_title" msgid="7094689930793031682">"कुछ के लिए मज़ेदार लेकिन सबके लिए नहीं"</string>
<string name="tuner_warning" msgid="8730648121973575701">"सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर, आपको Android यूज़र इंटरफ़ेस में सुधार लाने और उसे अपनी पसंद के हिसाब से बदलने के कुछ और तरीके देता है. प्रयोग के तौर पर इस्तेमाल हो रहीं ये सुविधाएं आगे चल कर रिलीज़ की जा सकती हैं, रोकी जा सकती हैं या दिखाई देना बंद हो सकती हैं. सावधानी से आगे बढ़ें."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"ये प्रयोगात्मक सुविधाएं आगामी रिलीज़ में बदल सकती हैं, रुक सकती हैं या दिखाई देना बंद हो सकती हैं. सावधानी से आगे बढ़ें."</string>
- <string name="got_it" msgid="2239653834387972602">"समझ लिया"</string>
+ <string name="got_it" msgid="2239653834387972602">"ठीक है"</string>
<string name="tuner_toast" msgid="603429811084428439">"बधाई हो! सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर को सेटिंग में जोड़ दिया गया है"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"सेटिंग से निकालें"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"सेटिंग से सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर निकालें और इसकी सभी सुविधाओं का इस्तेमाल रोक दें?"</string>
@@ -615,10 +615,10 @@
<string name="keyboard_key_num_lock" msgid="5052537581246772117">"Num Lock"</string>
<string name="keyboard_key_numpad_template" msgid="8729216555174634026">"Numpad <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"सिस्टम"</string>
- <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"होम"</string>
+ <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"होम पेज"</string>
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"हाल ही के"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"वापस जाएं"</string>
- <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"सूचना"</string>
+ <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"सूचनाएं"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"कीबोर्ड शॉर्टकट"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"इनपुट का तरीका बदलें"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ऐप्लिकेशन"</string>
@@ -662,18 +662,18 @@
<item msgid="586019486955594690">"दाएं झुका हुआ"</item>
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"कीबोर्ड स्विचर"</string>
- <string name="save" msgid="2311877285724540644">"सहेजें"</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="accessibility_key" msgid="5701989859305675896">"आपके मुताबिक नेविगेट करने के लिए बटन"</string>
<string name="left_keycode" msgid="2010948862498918135">"बायां कुंजी कोड"</string>
<string name="right_keycode" msgid="708447961000848163">"दायां कुंजी कोड"</string>
<string name="left_icon" msgid="3096287125959387541">"बायां आइकॉन"</string>
<string name="right_icon" msgid="3952104823293824311">"दायां आइकॉन"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"टाइलों को जोड़ने के लिए खींचें और छोड़ें"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"हटाने के लिए यहां खींचें और छोड़ें"</string>
- <string name="qs_edit" msgid="2232596095725105230">"संपादित करें"</string>
+ <string name="qs_edit" msgid="2232596095725105230">"बदलाव करें"</string>
<string name="tuner_time" msgid="6572217313285536011">"समय"</string>
<string-array name="clock_options">
<item msgid="5965318737560463480">"घंटे, मिनट और सेकंड दिखाएं"</item>
@@ -719,10 +719,10 @@
<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_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_expand" msgid="5889780005575693909">"विस्तार करें"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"छोटा करें"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"बंद करें"</string>
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"खारिज करने के लिए नीचे खींचें और छोड़ें"</string>
@@ -775,5 +775,5 @@
<string name="running_foreground_services_title" msgid="381024150898615683">"बैकग्राउंड में चल रहे ऐप्लिकेशन"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"बैटरी और डेटा खर्च की जानकारी के लिए छूएं"</string>
<string name="data_usage_disable_mobile" msgid="5116269981510015864">"मोबाइल डेटा बंद करना चाहते हैं?"</string>
- <string name="touch_filtered_warning" msgid="8671693809204767551">"चूंकि ऐप की वजह से अनुमति के अनुरोध को समझने में दिक्कत हो रही है, इसलिए सेटिंग से आपके जवाब की पुष्टि नहीं हो पा रही है."</string>
+ <string name="touch_filtered_warning" msgid="8671693809204767551">"ऐप की वजह से मंज़ूरी के अनुरोध को समझने में दिक्कत हो रही है, इसलिए सेटिंग से आपके जवाब की पुष्टि नहीं हो पा रही है."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 858e694..adb41b3 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -235,8 +235,8 @@
<string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Način rada uključen."</string>
<string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Način rada isključen."</string>
<string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Način rada uključen."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Ušteda podataka isključena."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Ušteda podataka uključena."</string>
+ <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Štednja podatkovnog prometa isključena."</string>
+ <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Štednja podatkovnog prometa uključena."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Svjetlina zaslona"</string>
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Punjenje"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G – 3G podaci pauzirani"</string>
@@ -645,9 +645,9 @@
<string name="headset" msgid="4534219457597457353">"Slušalice"</string>
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Slušalice su povezane"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Slušalice su povezane"</string>
- <string name="data_saver" msgid="5037565123367048522">"Ušteda podataka"</string>
- <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Ušteda podataka je uključena"</string>
- <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Ušteda podataka je isključena"</string>
+ <string name="data_saver" msgid="5037565123367048522">"Štednja podatkovnog prometa"</string>
+ <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Štednja podatkovnog prometa je uključena"</string>
+ <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Štednja podatkovnog prometa je isključena"</string>
<string name="switch_bar_on" msgid="1142437840752794229">"Uključeno"</string>
<string name="switch_bar_off" msgid="8803270596930432874">"Isključeno"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigacijska traka"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 6856735..0022f7b 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -290,7 +290,7 @@
<string name="quick_settings_settings_label" msgid="5326556592578065401">"Կարգավորումներ"</string>
<string name="quick_settings_time_label" msgid="4635969182239736408">"Ժամանակը"</string>
<string name="quick_settings_user_label" msgid="5238995632130897840">"Ես"</string>
- <string name="quick_settings_user_title" msgid="4467690427642392403">"Օտատեր"</string>
+ <string name="quick_settings_user_title" msgid="4467690427642392403">"Օգտատեր"</string>
<string name="quick_settings_user_new_user" msgid="9030521362023479778">"Նոր օգտատեր"</string>
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Միացված չէ"</string>
@@ -384,7 +384,7 @@
<string name="user_add_user" msgid="5110251524486079492">"Ավելացնել օգտատեր"</string>
<string name="user_new_user_name" msgid="426540612051178753">"Նոր օգտատեր"</string>
<string name="guest_nickname" msgid="8059989128963789678">"Հյուր"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"Հյուր ավելացնել"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"Ավելացնել հյուր"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"Հեռացնել հյուրին"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"Հեռացնե՞լ հյուրին:"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Այս աշխատաշրջանի բոլոր ծրագրերն ու տվյալները կջնջվեն:"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index aaf95fb..0411fa9 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -298,7 +298,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Mati"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktif"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tidak ada jaringan Wi-Fi yang tersedia"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmisi"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Melakukan transmisi"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Perangkat tanpa nama"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Siap melakukan transmisi"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 11c246d..c51c025 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ממשק משתמש של המערכת"</string>
- <string name="status_bar_clear_all_button" msgid="7774721344716731603">"נקה"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ניקוי"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"הסר מהרשימה"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"פרטי אפליקציה"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"המסכים האחרונים מופיעים כאן"</string>
@@ -388,7 +388,7 @@
<string name="user_add_user" msgid="5110251524486079492">"הוספת משתמש"</string>
<string name="user_new_user_name" msgid="426540612051178753">"משתמש חדש"</string>
<string name="guest_nickname" msgid="8059989128963789678">"אורח"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"הוסף אורח"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"הוספת אורח"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"הסר אורח"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"להסיר אורח?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"כל האפליקציות והנתונים בפעילות זו באתר יימחקו."</string>
@@ -674,7 +674,7 @@
<item msgid="586019486955594690">"נטייה ימינה"</item>
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"מחליף מקלדת"</string>
- <string name="save" msgid="2311877285724540644">"שמור"</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>
@@ -685,7 +685,7 @@
<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>
+ <string name="qs_edit" msgid="2232596095725105230">"עריכה"</string>
<string name="tuner_time" msgid="6572217313285536011">"שעה"</string>
<string-array name="clock_options">
<item msgid="5965318737560463480">"הצג שעות, דקות ושניות"</item>
@@ -782,7 +782,7 @@
<string name="qs_dnd_prompt_app" msgid="7978037419334156034">"מצב \'נא לא להפריע\' הופעל על ידי אפליקציה (<xliff:g id="ID_1">%s</xliff:g>)."</string>
<string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"מצב \'נא לא להפריע להפריע\' הופעל על ידי אפליקציה או על ידי כלל אוטומטי."</string>
<string name="qs_dnd_until" msgid="3469471136280079874">"עד <xliff:g id="ID_1">%s</xliff:g>"</string>
- <string name="qs_dnd_keep" msgid="1825009164681928736">"שמור"</string>
+ <string name="qs_dnd_keep" msgid="1825009164681928736">"שמירה"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"החלף"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"אפליקציות שפועלות ברקע"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"הקש לקבלת פרטים על צריכה של נתונים וסוללה"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 6aa1502..55a0b5f 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -155,7 +155,7 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"მობილური ინტერნეტი"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"მობილური ინტერნეტი ჩართულია"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"მობილური ინტერნეტი გამორთულია"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ის ჩართვა"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth ტეტერინგის ჩართვა"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"თვითმფრინავის რეჟიმი"</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ჩართულია."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM ბარათი არ არის."</string>
@@ -312,7 +312,7 @@
<string name="quick_settings_connected" msgid="1722253542984847487">"დაკავშირებულია"</string>
<string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"დაკავშირებულია. ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"დაკავშირება..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"მოდემის რეჟიმი"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ტეტერინგი"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"წვდომის წერტილი"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"შეტყობინებები"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ფანარი"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index dba2add..8937b7f 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -298,7 +298,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi өшірулі"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi қосулы"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Қолжетімді Wi-Fi желілері жоқ"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляциялау"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляциялануда"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Атаусыз құрылғы"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Трансляциялауға дайын"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 8adf154..f50003c 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -150,7 +150,7 @@
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"រ៉ូមីង"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
- <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"វ៉ាយហ្វាយ"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"គ្មានស៊ីមកាត។"</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"ទិន្នន័យទូរសព្ទចល័ត"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"ទិន្នន័យទូរសព្ទចល័តបានបើក"</string>
@@ -762,7 +762,7 @@
<string name="instant_apps_message" msgid="8116608994995104836">"កម្មវិធីប្រើភ្លាមៗមិនតម្រូវឲ្យមានការដំឡើងទេ។"</string>
<string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string>
<string name="go_to_web" msgid="1106022723459948514">"ចូលទៅកាន់បណ្តាញ"</string>
- <string name="mobile_data" msgid="7094582042819250762">"ទិន្នន័យចល័ត"</string>
+ <string name="mobile_data" msgid="7094582042819250762">"ទិន្នន័យទូរសព្ទចល័ត"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi បានបិទ"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ប៊្លូធូសបានបិទ"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"មុខងារកុំរំខានបានបិទ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 092b6bf..ff3100b 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -242,9 +242,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"충전 중"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 데이터 사용 중지됨"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 데이터 사용 중지됨"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"모바일 데이터가 일시 중지됨"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"모바일 데이터가 일시중지됨"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"데이터 사용 중지됨"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"설정한 데이터 한도에 도달했습니다. 더 이상 모바일 데이터를 사용하지 않습니다.\n\n계속하면 데이터 사용량에 따른 요금이 부과될 수 있습니다."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"설정한 데이터 한도에 도달했습니다. 더 이상 모바일 데이터를 사용하지 않습니다.\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>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index ac6e708..8a41051 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -193,7 +193,7 @@
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi өчүрүлдү."</string>
<string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wifi күйгүзүлдү."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Мобилдик түйүн <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
- <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Батарей: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Батарея: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Учак режими өчүк."</string>
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Учак режими күйүк."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Учак режими өчүрүлдү."</string>
diff --git a/packages/SystemUI/res/values-ldrtl/config.xml b/packages/SystemUI/res/values-ldrtl/config.xml
index 40604c1..884c95f 100644
--- a/packages/SystemUI/res/values-ldrtl/config.xml
+++ b/packages/SystemUI/res/values-ldrtl/config.xml
@@ -17,5 +17,5 @@
<resources>
<!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows,
when the PIP menu is shown with settings. -->
- <string translatable="false" name="pip_settings_bounds">"778 54 1258 324"</string>
+ <string translatable="false" name="pip_settings_bounds">"778 756 1258 1026"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index d003d29..ee627d7 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -385,7 +385,7 @@
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Perjungti naudotoją, dabartinis naudotojas <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Dabartinis naudotojas <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"Rodyti profilį"</string>
- <string name="user_add_user" msgid="5110251524486079492">"Naudotojo pridėjimas"</string>
+ <string name="user_add_user" msgid="5110251524486079492">"Pridėti naudotoją"</string>
<string name="user_new_user_name" msgid="426540612051178753">"Naujas naudotojas"</string>
<string name="guest_nickname" msgid="8059989128963789678">"Svečias"</string>
<string name="guest_new_guest" msgid="600537543078847803">"Pridėti svečią"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index f299c44..11673fd 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -353,8 +353,8 @@
<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="1149025108714420281">"Нема да ве вознемируваат звуци и вибрации, освен од аларми, потсетници, настани и повикувачи што ќе ги наведете. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, заедно со музика, видеа и игри."</string>
- <string name="zen_alarms_introduction" msgid="4934328096749380201">"Нема да ве вознемируваат звуци и вибрации, освен од аларми. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, заедно со музика, видеа и игри."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Нема да ве вознемируваат звуци и вибрации, освен од аларми, потсетници, настани и повикувачи што ќе ги наведете. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, како музика, видеа и игри."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Нема да ве вознемируваат звуци и вибрации, освен од аларми. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, како музика, видеа и игри."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Приспособи"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ова ги блокира СИТЕ звуци и вибрации, заедно со алармите, музиката, видеата и игрите. Сѐ уште ќе може да воспоставувате телефонски повици."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ова ги блокира СИТЕ звуци и вибрации, вклучувајќи ги и оние од алармите, музиката, видеата и игрите."</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 6a0c8cd..fd78108 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -293,7 +293,7 @@
<string name="quick_settings_user_title" msgid="4467690427642392403">"ഉപയോക്താവ്"</string>
<string name="quick_settings_user_new_user" msgid="9030521362023479778">"പുതിയ ഉപയോക്താവ്"</string>
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"വൈഫൈ"</string>
- <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"കണക്റ്റുചെയ്തിട്ടില്ല"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"കണക്റ്റ് ചെയ്തിട്ടില്ല"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"നെറ്റ്വർക്ക് ഒന്നുമില്ല"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"വൈഫൈ ഓഫുചെയ്യുക"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"വൈഫൈ ഓണാണ്"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 89749af..fe00639 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -473,7 +473,7 @@
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"तुम्ही मॅन्युअली अनलॉक करेपर्यंत डीव्हाइस लॉक राहील"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"सूचना अधिक जलद मिळवा"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"आपण अनलॉक करण्यापूर्वी त्यांना पहा"</string>
- <string name="hidden_notifications_cancel" msgid="3690709735122344913">"नाही धन्यवाद"</string>
+ <string name="hidden_notifications_cancel" msgid="3690709735122344913">"नाही, नको"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट अप"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"आता बंद करा"</string>
@@ -483,7 +483,7 @@
<string name="screen_pinning_description" msgid="8909878447196419623">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"समजले"</string>
- <string name="screen_pinning_negative" msgid="3741602308343880268">"नाही धन्यवाद"</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_button" msgid="2660339101868367515">"लपवा"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 384daa3..89ea9f1 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -308,14 +308,14 @@
<string name="quick_settings_inversion_label" msgid="8790919884718619648">"အရောင်များ ပြောင်းပြန်လုပ်ရန်"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"အရောင် မှန်ကန်စေခြင်း အခြေအနေ"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"နောက်ထပ် ဆက်တင်များ"</string>
- <string name="quick_settings_done" msgid="3402999958839153376">"လုပ်ပြီး"</string>
+ <string name="quick_settings_done" msgid="3402999958839153376">"ပြီးပါပြီ"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"ချိတ်ဆက်ထား"</string>
<string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"ချိတ်ဆက်ပြီးပါပြီ၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"ဆက်သွယ်နေ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"တွဲချီပေးခြင်း"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ဟော့စပေါ့"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"အကြောင်းကြားချက်များ"</string>
- <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ဖလက်ရှမီး"</string>
+ <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ဖလက်ရှ်မီး"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"မိုဘိုင်းဒေတာ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ဒေတာ သုံးစွဲမှု"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ကျန်ရှိ ဒေတာ"</string>
@@ -381,10 +381,10 @@
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"အသုံးပြုသူကို ပြောင်းရန်၊ လက်ရှိ အသုံးပြုသူ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"လတ်တလော သုံးစွဲသူ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ပရိုဖိုင်ကို ပြရန်"</string>
- <string name="user_add_user" msgid="5110251524486079492">"သုံးသူ ထပ်ထည့်ရန်"</string>
+ <string name="user_add_user" msgid="5110251524486079492">"အသုံးပြုသူ ထည့်ရန်"</string>
<string name="user_new_user_name" msgid="426540612051178753">"အသုံးပြုသူ အသစ်"</string>
<string name="guest_nickname" msgid="8059989128963789678">"ဧည့်သည်"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"ဧည့်သည့်ကို ထည့်ပေးရန်"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"ဧည့်သည့် ထည့်ရန်"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ဧည့်သည်ကို ဖယ်ထုတ်လိုက်ရမလား?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ဒီချိတ်ဆက်မှု ထဲက အက်ပ်များ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 3af4e02..87c71bc 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -240,7 +240,7 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Lader"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G- og 3G-data er satt på pause"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data er satt på pause"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobildata er satt på pause"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobildatabruk er satt på pause"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Data er satt på pause"</string>
<string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Datagrensen du har angitt, er nådd. Du bruker ikke lenger mobildata.\n\nHvis du fortsetter, kan avgifter for databruk påløpe."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Gjenoppta"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 12101eb..b746182 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -52,34 +52,34 @@
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ਇਨਪੁਟ ਵਿਧੀਆਂ ਸੈਟ ਅਪ ਕਰੋ"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ਫਿਜੀਕਲ ਕੀ-ਬੋਰਡ"</string>
<string name="usb_device_permission_prompt" msgid="834698001271562057">"ਕੀ ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨੂੰ USB ਡੀਵਾਈਸ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ਕੀ ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨੂੰ USB ਐਕਸੈਸਰੀ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ਕੀ ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨੂੰ USB ਐਕਸੈੱਸਰੀ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"ਕੀ ਜਦੋਂ ਇਹ USB ਡੀਵਾਈਸ ਕਨੈਕਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਤਾਂ <xliff:g id="ACTIVITY">%1$s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"ਕੀ ਜਦੋਂ ਇਹ USB ਐਕਸੈਸਰੀ ਕਨੈਕਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਤਾਂ <xliff:g id="ACTIVITY">%1$s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ਕੋਈ ਇੰਸਟੌਲ ਕੀਤੇ ਐਪਸ ਇਸ USB ਐਕਸੈਸਰੀ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦੇ। <xliff:g id="URL">%1$s</xliff:g> ਤੇ ਇਸ ਐਕਸੈਸਰੀ ਬਾਰੇ ਹੋਰ ਜਾਣੋ"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"USB ਐਕਸੈਸਰੀ"</string>
<string name="label_view" msgid="6304565553218192990">"ਦੇਖੋ"</string>
<string name="always_use_device" msgid="1450287437017315906">"ਇਸ USB ਡੀਵਾਈਸ ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ \'ਤੇ ਵਰਤੋ"</string>
- <string name="always_use_accessory" msgid="1210954576979621596">"ਇਸ USB ਐਕਸਸੈਰੀ ਲਈ ਬਾਇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਵਰਤੋ"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"ਇਸ USB ਐਕਸਸੈਰੀ ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ \'ਤੇ ਵਰਤੋ"</string>
<string name="usb_debugging_title" msgid="4513918393387141949">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
- <string name="usb_debugging_message" msgid="2220143855912376496">"ਕੰਪਿਊਟਰ ਦਾ RSA ਕੁੰਜੀ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹੈ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_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="6067122453571699801">"ਵਰਤਮਾਨ ਵਿੱਚ ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਵਰਤੋਂਕਾਰ USB ਡਿਬੱਗਿੰਗ ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ। ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ, ਮੁੱਖ ਵਰਤੋਂਕਾਰ ਸੰਬੰਧੀ ਖਾਤਾ ਵਰਤੋ।"</string>
+ <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</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>
- <string name="screenshot_saving_title" msgid="8242282144535555697">"ਸਕ੍ਰੀਨਸ਼ੌਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="screenshot_saving_text" msgid="2419718443411738818">"ਸਕ੍ਰੀਨਸ਼ੌਟ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਕੈਪਚਰ ਕੀਤਾ।"</string>
- <string name="screenshot_saved_text" msgid="2685605830386712477">"ਆਪਣਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਵੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="screenshot_failed_title" msgid="705781116746922771">"ਸਕ੍ਰੀਨਸ਼ੌਟ ਕੈਪਚਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string>
+ <string name="screenshot_saved_text" msgid="2685605830386712477">"ਆਪਣਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਕੈਪਚਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string>
<string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ ਆਈ।"</string>
- <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"ਸੀਮਿਤ ਸਟੋਰੇਜ ਥਾਂ ਦੇ ਕਾਰਨ ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਸਕਦਾ।"</string>
+ <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"ਸਟੋਰੇਜ ਦੀ ਸੀਮਿਤ ਜਗ੍ਹਾ ਹੋਣ ਕਾਰਨ ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਸਕਦਾ।"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਚੋਣਾਂ"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"ਇੱਕ ਮੀਡੀਆ ਪਲੇਅਰ (MTP) ਦੇ ਤੌਰ ਤੇ ਮਾਊਂਟ ਕਰੋ"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"ਇੱਕ ਕੈਮਰੇ (PTP) ਦੇ ਤੌਰ ਤੇ ਮਾਊਂਟ ਕਰੋ"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac ਲਈ Android ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਐਪ ਇੰਸਟੌਲ ਕਰੋ"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac ਲਈ Android ਫ਼ਾਈਲ ਟ੍ਰਾਂਸਫਰ ਐਪ ਸਥਾਪਤ ਕਰੋ"</string>
<string name="accessibility_back" msgid="567011538994429120">"ਪਿੱਛੇ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ਘਰ"</string>
<string name="accessibility_menu" msgid="316839303324695949">"ਮੀਨੂ"</string>
@@ -87,18 +87,18 @@
<string name="accessibility_recent" msgid="5208608566793607626">"ਰੂਪ-ਰੇਖਾ"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ਖੋਜੋ"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ਕੈਮਰਾ"</string>
- <string name="accessibility_phone_button" msgid="6738112589538563574">"ਫੋਨ"</string>
+ <string name="accessibility_phone_button" msgid="6738112589538563574">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="accessibility_voice_assist_button" msgid="487611083884852965">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ"</string>
- <string name="accessibility_unlock_button" msgid="128158454631118828">"ਅਨਲੌਕ ਕਰੋ"</string>
+ <string name="accessibility_unlock_button" msgid="128158454631118828">"ਅਣਲਾਕ ਕਰੋ"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="4808860050517462885">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ"</string>
- <string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"ਆਪਣਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੇ ਬਿਨਾਂ ਅਨਲੌਕ ਕਰੋ"</string>
- <string name="unlock_label" msgid="8779712358041029439">"ਅਨਲੌਕ ਕਰੋ"</string>
- <string name="phone_label" msgid="2320074140205331708">"ਫੋਨ ਖੋਲ੍ਹੋ"</string>
+ <string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"ਆਪਣਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੇ ਬਿਨਾਂ ਅਣਲਾਕ ਕਰੋ"</string>
+ <string name="unlock_label" msgid="8779712358041029439">"ਅਣਲਾਕ ਕਰੋ"</string>
+ <string name="phone_label" msgid="2320074140205331708">"ਫ਼ੋਨ ਖੋਲ੍ਹੋ"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ ਖੋਲ੍ਹੋ"</string>
<string name="camera_label" msgid="7261107956054836961">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"ਨਵਾਂ ਕੰਮ ਲੇਆਉਟ ਚੁਣੋ"</string>
<string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string>
- <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ਅਨੁਕੂਲਤਾ ਜ਼ੂਮ ਬਟਨ।"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ਅਨੁਰੂਪਤਾ ਜ਼ੂਮ ਬਟਨ।"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ਵੱਡੀ ਸਕ੍ਰੀਨ ਤੇ ਛੋਟਾ ਜ਼ੂਮ ਕਰੋ।"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ਕਨੈਕਟ ਕੀਤੀ।"</string>
<string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth ਡਿਸਕਨੈਕਟ ਕੀਤਾ।"</string>
@@ -107,16 +107,16 @@
<string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ਬੈਟਰੀ ਦੋ ਬਾਰਸ।"</string>
<string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ਬੈਟਰੀ ਤਿੰਨ ਬਾਰਸ।"</string>
<string name="accessibility_battery_full" msgid="8909122401720158582">"ਬੈਟਰੀ ਪੂਰੀ।"</string>
- <string name="accessibility_no_phone" msgid="4894708937052611281">"ਕੋਈ ਫੋਨ ਨਹੀਂ।"</string>
- <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ਫੋਨ ਇੱਕ ਬਾਰ।"</string>
- <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ਫੋਨ ਦੋ ਬਾਰਸ।"</string>
- <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ਫੋਨ ਤਿੰਨ ਬਾਰਸ।"</string>
- <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ਫੋਨ ਸਿਗਨਲ ਪੂਰਾ।"</string>
- <string name="accessibility_no_data" msgid="4791966295096867555">"ਕੋਈ ਡੈਟਾ ਨਹੀਂ।"</string>
- <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ਡੈਟਾ ਇੱਕ ਬਾਰ।"</string>
- <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ਡੈਟਾ ਦੋ ਬਾਰਸ।"</string>
- <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ਡੈਟਾ ਤਿੰਨ ਬਾਰ।"</string>
- <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ਡੈਟਾ ਸਿਗਨਲ ਪੂਰਾ।"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ।"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ਫ਼ੋਨ ਇੱਕ ਬਾਰ।"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ਫ਼ੋਨ ਦੋ ਬਾਰਸ।"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ਫ਼ੋਨ ਤਿੰਨ ਬਾਰਸ।"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ਫ਼ੋਨ ਸਿਗਨਲ ਪੂਰਾ।"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"ਕੋਈ ਡਾਟਾ ਨਹੀਂ।"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">" ਡਾਟਾ ਇੱਕ ਬਾਰ।"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">" ਡਾਟਾ ਦੋ ਬਾਰਸ।"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">" ਡਾਟਾ ਤਿੰਨ ਬਾਰ।"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">" ਡਾਟਾ ਸਿਗਨਲ ਪੂਰਾ।"</string>
<string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string>
<string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string>
<string name="accessibility_cast_name" msgid="4026393061247081201">"<xliff:g id="CAST">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ।"</string>
@@ -155,10 +155,10 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"ਮੋਬਾਈਲ ਡਾਟਾ"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"ਮੋਬਾਈਲ ਡਾਟਾ ਚਾਲੂ"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth ਟੈਦਰਿੰਗ।"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ਬਲੂਟੁੱਥ ਟੈਦਰਿੰਗ।"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ਏਅਰਪਲੇਨ ਮੋਡ।"</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ਚਾਲੂ ਹੈ।"</string>
- <string name="accessibility_no_sims" msgid="3957997018324995781">"ਕੋਈ SIM ਕਾਰਡ ਨਹੀਂ।"</string>
+ <string name="accessibility_no_sims" msgid="3957997018324995781">"ਕੋਈ ਸਿਮ ਕਾਰਡ ਨਹੀਂ।"</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>
@@ -199,7 +199,7 @@
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਹੈ।"</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ਏਅਰਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੋਇਆ"</string>
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ, ਕੇਵਲ ਤਰਜੀਹੀ।"</string>
- <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ ਕਰੋ, ਕੁਲ ਚੁੱਪੀ।"</string>
+ <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ ਕਰੋ, ਪੂਰਾ ਸ਼ਾਂਤ।"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ, ਕੇਵਲ ਅਲਾਰਮ।"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ।"</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਬੰਦ।"</string>
@@ -227,8 +227,8 @@
<string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ਫਲੈਸ਼ਲਾਈਟ ਚਾਲੂ ਕੀਤੀ।"</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"ਰੰਗ ਦੀ ਉਲਟੀ ਤਰਤੀਬ ਬੰਦ ਕੀਤੀ।"</string>
<string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"ਰੰਗ ਦੀ ਉਲਟੀ ਤਰਤੀਬ ਚਾਲੂ ਕੀਤੀ।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਬੰਦ ਕੀਤੀ।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਚਾਲੂ ਕੀਤੀ।"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਬੰਦ ਕੀਤਾ।"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਚਾਲੂ ਕੀਤਾ।"</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ਸਕ੍ਰੀਨ ਜੋੜਨਾ ਬੰਦ ਹੋਇਆ।"</string>
<string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"ਕੰਮ ਮੋਡ ਬੰਦ ਹੈ।"</string>
<string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"ਕੰਮ ਮੋਡ ਚਾਲੂ ਹੈ।"</string>
@@ -238,13 +238,13 @@
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ।"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ਡਿਸਪਲੇ ਚਮਕ"</string>
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
- <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
- <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ਮੋਬਾਈਲ ਡਾਟਾ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
- <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">" ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
<string name="data_usage_disabled_dialog" msgid="4919541636934603816">"ਤੁਸੀਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਗਈ ਡਾਟਾ ਸੀਮਾ \'ਤੇ ਪਹੁੰਚ ਚੁੱਕੇ ਹੋ। ਤੁਸੀਂ ਹੁਣ ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਰਹੇ ਹੋ।\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_disconnected" msgid="1940231521274147771">"ਕੋਈ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਨਹੀਂ"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ਵਾਈ-ਫਾਈ ਕਨੈਕਟ ਹੈ"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS ਵੱਲੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਟਿਕਾਣਾ"</string>
@@ -259,18 +259,18 @@
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ਸੈਟਿੰਗਾਂ"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ਸਕ੍ਰੀਨ ਆਟੋਮੈਟਿਕਲੀ ਰੋਟੇਟ ਕਰੇਗੀ।"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ਸਕ੍ਰੀਨ ਲੈਂਡਸਕੇਪ ਅਨੁਕੂਲਨ ਵਿੱਚ ਲੌਕ ਕੀਤੀ ਹੈ।"</string>
- <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ਸਕ੍ਰੀਨ ਤਸਵੀਰ ਅਨੁਕੂਲਨ ਵਿੱਚ ਲੌਕ ਕੀਤੀ ਗਈ ਹੈ।"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ਸਕ੍ਰੀਨ ਪੋਰਟਰੇਟ ਅਨੁਕੂਲਨ ਵਿੱਚ ਲੌਕ ਕੀਤੀ ਗਈ ਹੈ।"</string>
<string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"ਸਕ੍ਰੀਨ ਹੁਣ ਆਟੋਮੈਟਿਕਲੀ ਰੋਟੇਟ ਕਰੇਗੀ।"</string>
<string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"ਸਕ੍ਰੀਨ ਹੁਣ ਲੈਂਡਸਕੇਪ ਅਨੁਕੂਲਨ ਵਿੱਚ ਲੌਕ ਕੀਤੀ ਗਈ ਹੈ।"</string>
- <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"ਸਕ੍ਰੀਨ ਹੁਣ ਤਸਵੀਰ ਅਨੁਕੂਲਨ ਵਿੱਚ ਲੌਕ ਕੀਤੀ ਗਈ ਹੈ।"</string>
+ <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"ਸਕ੍ਰੀਨ ਹੁਣ ਪੋਰਟਰੇਟ ਅਨੁਕੂਲਨ ਵਿੱਚ ਲੌਕ ਕੀਤੀ ਗਈ ਹੈ।"</string>
<string name="dessert_case" msgid="1295161776223959221">"ਡੈਜ਼ਰਟ ਕੇਸ"</string>
<string name="start_dreams" msgid="5640361424498338327">"ਸਕ੍ਰੀਨ ਸੇਵਰ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ਈਥਰਨੈਟ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ਕੇਵਲ ਤਰਜੀਹੀ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ਕੇਵਲ ਅਲਾਰਮ"</string>
- <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"ਸੰਪੂਰਨ ਖਾਮੋਸ਼ੀ"</string>
- <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"ਪੂਰਾ ਸ਼ਾਂਤ"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ਬਲੂਟੁੱਥ"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> ਡਿਵਾਈਸਾਂ)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth ਬੰਦ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ਕੋਈ ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ ਉਪਲਬਧ ਨਹੀਂ"</string>
@@ -279,9 +279,9 @@
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"ਸਕ੍ਰੀਨ ਨੂੰ ਆਪਣੇ ਆਪ ਘੁੰਮਾਓ"</string>
<string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"<xliff:g id="ID_1">%s</xliff:g> ਮੋਡ"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ਰੋਟੇਸ਼ਨ ਲੌਕ ਕੀਤੀ"</string>
- <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ਤਸਵੀਰ"</string>
+ <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ਪੋਰਟਰੇਟ"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ਲੈਂਡਸਕੇਪ"</string>
- <string name="quick_settings_ime_label" msgid="7073463064369468429">"ਇਨਪੁਟ ਵਿਧੀ"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"ਟਿਕਾਣਾ"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਬੰਦ"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"ਮੀਡੀਆ ਡੀਵਾਈਸ"</string>
@@ -312,13 +312,13 @@
<string name="quick_settings_connected" msgid="1722253542984847487">"ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ, ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ਟੀਥਰਿੰਗ"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ਟੈਦਰਿੰਗ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ਹੌਟਸਪੌਟ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ਸੂਚਨਾਵਾਂ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ਫਲੈਸ਼ਲਾਈਟ"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ਮੋਬਾਈਲ ਡਾਟਾ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ਡਾਟਾ ਵਰਤੋਂ"</string>
- <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ਬਾਕੀ ਡੈਟਾ"</string>
+ <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ਬਾਕੀ ਡਾਟਾ"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ਸੀਮਾ ਤੋਂ ਵੱਧ"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ਵਰਤਿਆ"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ਸੀਮਾ"</string>
@@ -339,7 +339,7 @@
<string name="recents_drag_hint_message" msgid="2649739267073203985">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ਹੌਰੀਜ਼ੌਂਟਲ ਸਪਲਿਟ"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ਵਰਟੀਕਲ ਸਪਲਿਟ"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ਕਸਟਮ ਸਪਲਿਟ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ਵਿਉਂਂਤੀ ਸਪਲਿਟ"</string>
<string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ਸਕ੍ਰੀਨ ਨੂੰ ਉੱਪਰ ਵੱਲ ਵਿਭਾਜਿਤ ਕਰੋ"</string>
<string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"ਸਕ੍ਰੀਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਵਿਭਾਜਿਤ ਕਰੋ"</string>
<string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"ਸਕ੍ਰੀਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਵਿਭਾਜਿਤ ਕਰੋ"</string>
@@ -355,20 +355,20 @@
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਖੱਬੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string>
<string name="zen_priority_introduction" msgid="1149025108714420281">"ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਤੁਹਾਨੂੰ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕਰਨਗੀਆਂ, ਸਿਵਾਏ ਅਲਾਰਮਾਂ, ਯਾਦ-ਦਹਾਨੀਆਂ, ਵਰਤਾਰਿਆਂ, ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਿਰਧਾਰਤ ਕੀਤੇ ਕਾਲਰਾਂ ਦੀ ਸੂਰਤ ਵਿੱਚ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ ਆਪਣੀ ਚੋਣ ਅਨੁਸਾਰ ਕੁਝ ਵੀ ਸੁਣ ਸਕਦੇ ਹੋ।"</string>
<string name="zen_alarms_introduction" msgid="4934328096749380201">"ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਤੁਹਾਨੂੰ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕਰਨਗੀਆਂ, ਸਿਵਾਏ ਅਲਾਰਮਾਂ ਦੀ ਸੂਰਤ ਵਿੱਚ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ ਆਪਣੀ ਚੋਣ ਅਨੁਸਾਰ ਕੁਝ ਵੀ ਸੁਣ ਸਕਦੇ ਹੋ।"</string>
- <string name="zen_priority_customize_button" msgid="7948043278226955063">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ"</string>
- <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓ, ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੋਂਗੇ।"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"ਵਿਉਂਤਬੱਧ ਕਰੋ"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓ, ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਨੂੰ ਬਲਾਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੋਂਗੇ।"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓਜ਼, ਅਤੇ ਗੇਮਸ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ਹੇਠਾਂ ਘੱਟ ਲਾਜ਼ਮੀ ਸੂਚਨਾਵਾਂ"</string>
<string name="notification_tap_again" msgid="7590196980943943842">"ਖੋਲ੍ਹਣ ਲਈ ਦੁਬਾਰਾ ਟੈਪ ਕਰੋ"</string>
- <string name="keyguard_unlock" msgid="8043466894212841998">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।"</string>
+ <string name="keyguard_unlock" msgid="8043466894212841998">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।"</string>
<string name="do_disclosure_generic" msgid="5615898451805157556">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਸੰਗਠਨ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
<string name="do_disclosure_with_name" msgid="5640615509915445501">"ਇਹ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
- <string name="phone_hint" msgid="4872890986869209950">"ਫ਼ੋਨ ਲਈ ਆਈਕਨ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string>
- <string name="voice_hint" msgid="8939888732119726665">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ ਲਈ ਆਈਕਨ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string>
- <string name="camera_hint" msgid="7939688436797157483">"ਕੈਮਰੇ ਲਈ ਆਈਕਨ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string>
- <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"ਕੁੱਲ ਸਾਈਲੈਂਟ। ਇਹ ਸਕ੍ਰੀਨ ਰੀਡਰਾਂ ਨੂੰ ਵੀ ਸਾਈਲੈਂਸ ਕਰ ਦੇਵੇਗਾ।"</string>
- <string name="interruption_level_none" msgid="6000083681244492992">"ਸੰਪੂਰਨ ਖਾਮੋਸ਼ੀ"</string>
+ <string name="phone_hint" msgid="4872890986869209950">"ਫ਼ੋਨ ਲਈ ਪ੍ਰਤੀਕ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string>
+ <string name="voice_hint" msgid="8939888732119726665">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ ਲਈ ਪ੍ਰਤੀਕ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string>
+ <string name="camera_hint" msgid="7939688436797157483">"ਕੈਮਰੇ ਲਈ ਪ੍ਰਤੀਕ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string>
+ <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"ਪੂਰਾ ਸ਼ਾਂਤ। ਇਹ ਸਕ੍ਰੀਨ ਰੀਡਰਾਂ ਨੂੰ ਵੀ ਸ਼ਾਂਤ ਕਰ ਦੇਵੇਗਾ।"</string>
+ <string name="interruption_level_none" msgid="6000083681244492992">"ਪੂਰਾ ਸ਼ਾਂਤ"</string>
<string name="interruption_level_priority" msgid="6426766465363855505">"ਕੇਵਲ ਤਰਜੀਹੀ"</string>
<string name="interruption_level_alarms" msgid="5226306993448328896">"ਕੇਵਲ ਅਲਾਰਮ"</string>
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"ਕੁਲ \n ਚੁੱਪੀ"</string>
@@ -377,35 +377,35 @@
<string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ਚਾਰਜਿੰਗ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ਪੂਰਾ ਹੋਣ ਤੱਕ)"</string>
<string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"ਤੇਜ਼ੀ ਨਾਲ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ਪੂਰੀ ਹੋਣ ਤੱਕ)"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"ਹੌਲੀ-ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ਪੂਰੀ ਹੋਣ ਤੱਕ)"</string>
- <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ਉਪਭੋਗਤਾ ਸਵਿਚ ਕਰੋ"</string>
- <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ਉਪਭੋਗਤਾ, ਵਰਤਮਾਨ ਉਪਭੋਗਤਾ ਸਵਿਚ ਕਰੋ<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
+ <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ਵਰਤੋਂਕਾਰ, ਵਰਤਮਾਨ ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"ਮੌਜੂਦਾ ਉਪਭੋਗਤਾ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ਪ੍ਰੋਫਾਈਲ ਦਿਖਾਓ"</string>
<string name="user_add_user" msgid="5110251524486079492">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="user_new_user_name" msgid="426540612051178753">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
<string name="guest_nickname" msgid="8059989128963789678">"ਮਹਿਮਾਨ"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"ਮਹਿਮਾਨ ਜੋੜੋ"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"ਮਹਿਮਾਨ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"ਮਹਿਮਾਨ ਹਟਾਓ"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ਕੀ ਮਹਿਮਾਨ ਹਟਾਉਣਾ ਹੈ?"</string>
- <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ਇਸ ਸੈਸ਼ਨ ਵਿੱਚ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡੈਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
+ <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_wipe" msgid="5065558566939858884">"ਸ਼ੁਰੂ ਕਰੋ"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ਹਾਂ, ਜਾਰੀ ਰੱਖੋ"</string>
<string name="guest_notification_title" msgid="1585278533840603063">"ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ"</string>
- <string name="guest_notification_text" msgid="335747957734796689">"ਐਪਸ ਅਤੇ ਡੈਟਾ ਮਿਟਾਉਣ ਲਈ, ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ ਹਟਾਓ"</string>
- <string name="guest_notification_remove_action" msgid="8820670703892101990">"ਮਹਿਮਾਨ ਨੂੰ ਹਟਾਓ"</string>
+ <string name="guest_notification_text" msgid="335747957734796689">"ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਮਿਟਾਉਣ ਲਈ, ਮਹਿਮਾਨ ਵਰਤੋਂਕਾਰ ਹਟਾਓ"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ਮਹਿਮਾਨ ਹਟਾਓ"</string>
<string name="user_logout_notification_title" msgid="1453960926437240727">"ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗ ਆਉਟ ਕਰੋ"</string>
<string name="user_logout_notification_text" msgid="3350262809611876284">"ਵਰਤਮਾਨ ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗਆਉਟ ਕਰੋ"</string>
<string name="user_logout_notification_action" msgid="1195428991423425062">"ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗ ਆਉਟ ਕਰੋ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ਕੀ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸਥਾਪਤ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।\n\nਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
<string name="user_remove_user_title" msgid="4681256956076895559">"ਕੀ ਵਰਤੋਂਕਾਰ ਹਟਾਉਣਾ ਹੈ?"</string>
- <string name="user_remove_user_message" msgid="1453218013959498039">"ਇਸ ਉਪਭੋਗਤਾ ਦੇ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡੈਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ਇਸ ਉਪਭੋਗਤਾ ਦੇ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"ਹਟਾਓ"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string>
- <string name="battery_saver_notification_text" msgid="820318788126672692">"ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡੈਟਾ ਘੱਟ ਕਰਦਾ ਹੈ"</string>
+ <string name="battery_saver_notification_text" msgid="820318788126672692">"ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡਾਟਾ ਘੱਟ ਕਰਦਾ ਹੈ"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਉਹ ਸਭ ਕੁਝ ਕੈਪਚਰ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੇਗਾ, ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਤੇ ਡਿਸਪਲੇ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
@@ -438,17 +438,17 @@
<string name="monitoring_subtitle_ca_certificate" msgid="3874151893894355988">"CA ਪ੍ਰਮਾਣ-ਪੱਤਰ"</string>
<string name="disable_vpn" msgid="4435534311510272506">"VPN ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
- <string name="monitoring_button_view_policies" msgid="100913612638514424">"ਨੀਤੀਆਂ ਵੇਖੋ"</string>
- <string name="monitoring_description_named_management" msgid="5281789135578986303">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
- <string name="monitoring_description_management" msgid="4573721970278370790">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="monitoring_button_view_policies" msgid="100913612638514424">"ਨੀਤੀਆਂ ਦੇਖੋ"</string>
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਸਥਾਪਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਨੈੱਟਵਰਕ ਲੌਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ, ਜੋ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦਾ ਹੈ।"</string>
<string name="monitoring_description_named_vpn" msgid="7403457334088909254">"ਤੁਸੀਂ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"ਤੁਸੀਂ <xliff:g id="VPN_APP_0">%1$s</xliff:g> ਅਤੇ <xliff:g id="VPN_APP_1">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
- <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
- <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"ਤੁਹਾਡਾ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"ਤੁਹਾਡੀ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਬੰਧਨ ਲਈ <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ।"</string>
<string name="monitoring_description_do_body" msgid="3639594537660975895">"ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਜੁੜੇ ਡਾਟੇ ਅਤੇ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।"</string>
@@ -459,20 +459,20 @@
<string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"ਭਰੋਸੇਯੋਗ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਖੋਲ੍ਹੋ"</string>
- <string name="monitoring_description_network_logging" msgid="7223505523384076027">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਨੈੱਟਵਰਕ ਲੌਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ, ਜੋ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
- <string name="monitoring_description_vpn" msgid="4445150119515393526">"ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਇੱਕ VPN ਕਨੈਕਸ਼ਨ ਸੈੱਟ ਅੱਪ ਕਰਨ ਦੀ ਅਨੁਮਤੀ ਦਿੱਤੀ ਹੈ।\n\nਇਹ ਐਪ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਅਤੇ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ, ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ।"</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"ਤੁਹਾਡੇ ਕਾਰਜ-ਸਥਾਨ ਪ੍ਰੋਫ਼ਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਈਮੇਲ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੇ ਸਮਰੱਥ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋਂ, ਜੋ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="monitoring_description_network_logging" msgid="7223505523384076027">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਨੈੱਟਵਰਕ ਲੌਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ, ਜੋ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="monitoring_description_vpn" msgid="4445150119515393526">"ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਇੱਕ VPN ਕਨੈਕਸ਼ਨ ਸੈੱਟ ਅੱਪ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਹੈ।\n\nਇਹ ਐਪ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਅਤੇ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ, ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ।"</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਈਮੇਲ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੇ ਸਮਰੱਥ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋਂ, ਜੋ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।"</string>
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
<string name="monitoring_description_app" msgid="1828472472674709532">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="monitoring_description_app_personal" msgid="484599052118316268">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
- <string name="monitoring_description_app_work" msgid="4612997849787922906">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਹ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="monitoring_description_app_work" msgid="4612997849787922906">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਹ ਪ੍ਰੋਫਾਈਲ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਪ੍ਰੋਫਾਈਲ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋਂ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="keyguard_indication_trust_granted" msgid="4985003749105182372">"<xliff:g id="USER_NAME">%1$s</xliff:g> ਲਈ ਅਨਲੌਕ ਕੀਤੀ ਗਈ"</string>
<string name="keyguard_indication_trust_managed" msgid="8319646760022357585">"<xliff:g id="TRUST_AGENT">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string>
- <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"ਡੀਵਾਈਸ ਲੌਕ ਰਹੇਗਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮੈਨੂਅਲੀ ਅਨਲੌਕ ਨਹੀਂ ਕਰਦੇ"</string>
+ <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"ਡੀਵਾਈਸ ਲਾਕ ਰਹੇਗਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮੈਨੂਅਲੀ ਅਣਲਾਕ ਨਹੀਂ ਕਰਦੇ"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"ਤੇਜ਼ੀ ਨਾਲ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
- <string name="hidden_notifications_text" msgid="2326409389088668981">"ਅਨਲੌਕ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਉਹਨਾਂ ਨੂੰ ਦੇਖੋ"</string>
+ <string name="hidden_notifications_text" msgid="2326409389088668981">"ਅਣਲਾਕ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਉਹਨਾਂ ਨੂੰ ਦੇਖੋ"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"ਸਥਾਪਤ ਕਰੋ"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -487,8 +487,8 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ਕੀ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ਨੂੰ ਲੁਕਾਉਣਾ ਹੈ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ਇਹ ਅਗਲੀ ਵਾਰ ਮੁੜ ਪ੍ਰਗਟ ਹੋਵੇਗਾ ਜਦੋਂ ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰਦੇ ਹੋ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ਲੁਕਾਓ"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ਤੁਸੀਂ ਆਪਣੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਵਰਤ ਰਹੇ ਹੋ"</string>
- <string name="stream_voice_call" msgid="4410002696470423714">"ਕਾਲ"</string>
+ <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ਤੁਸੀਂ ਆਪਣੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਰਤ ਰਹੇ ਹੋ"</string>
+ <string name="stream_voice_call" msgid="4410002696470423714">"ਕਾਲ ਕਰੋ"</string>
<string name="stream_system" msgid="7493299064422163147">"ਸਿਸਟਮ"</string>
<string name="stream_ring" msgid="8213049469184048338">"ਘੰਟੀ ਵਜਾਓ"</string>
<string name="stream_music" msgid="9086982948697544342">"ਮੀਡੀਆ"</string>
@@ -506,18 +506,18 @@
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ਵੌਲਿਊਮ ਕੰਟਰੋਲ ਲੁਕਾਏ ਗਏ ਹਨ"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI ਟਿਊਨਰ"</string>
<string name="show_battery_percentage" msgid="5444136600512968798">"ਜੋਡ਼ੀ ਗਈ ਬੈਟਰੀ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string>
- <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ਜਦੋਂ ਚਾਰਜ ਨਾ ਹੋ ਰਹੀ ਹੋਵੇ ਤਾਂ ਸਥਿਤੀ ਬਾਰ ਦੇ ਅੰਦਰ ਬੈਟਰੀ ਪੱਧਰ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string>
- <string name="quick_settings" msgid="10042998191725428">"ਤਤਕਾਲ ਸੈੱਟਿੰਗਜ਼"</string>
+ <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ਜਦੋਂ ਚਾਰਜ ਨਾ ਹੋ ਰਹੀ ਹੋਵੇ ਤਾਂ ਸਥਿਤੀ ਪੱਟੀ ਪ੍ਰਤੀਕ ਦੇ ਅੰਦਰ ਬੈਟਰੀ ਪੱਧਰ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string>
+ <string name="quick_settings" msgid="10042998191725428">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ"</string>
<string name="status_bar" msgid="4877645476959324760">"ਸਥਿਤੀ ਬਾਰ"</string>
<string name="overview" msgid="4018602013895926956">"ਰੂਪ-ਰੇਖਾ"</string>
<string name="demo_mode" msgid="2532177350215638026">"ਸਿਸਟਮ UI ਡੈਮੋ ਮੋਡ"</string>
- <string name="enable_demo_mode" msgid="4844205668718636518">"ਡੈਮੋ ਮੋਡ ਸਮਰੱਥ ਬਣਾਓ"</string>
+ <string name="enable_demo_mode" msgid="4844205668718636518">"ਡੈਮੋ ਮੋਡ ਚਾਲੂ ਕਰੋ"</string>
<string name="show_demo_mode" msgid="2018336697782464029">"ਡੈਮੋ ਮੋਡ ਦੇਖੋ"</string>
<string name="status_bar_ethernet" msgid="5044290963549500128">"ਈਥਰਨੈਟ"</string>
<string name="status_bar_alarm" msgid="8536256753575881818">"ਅਲਾਰਮ"</string>
- <string name="status_bar_work" msgid="6022553324802866373">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ"</string>
+ <string name="status_bar_work" msgid="6022553324802866373">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="status_bar_airplane" msgid="7057575501472249002">"ਜਹਾਜ਼ ਮੋਡ"</string>
- <string name="add_tile" msgid="2995389510240786221">"ਟਾਇਲ ਜੋੜੋ"</string>
+ <string name="add_tile" msgid="2995389510240786221">"ਟਾਇਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="broadcast_tile" msgid="3894036511763289383">"ਪ੍ਰਸਾਰਨ ਟਾਇਲ"</string>
<string name="zen_alarm_warning_indef" msgid="3482966345578319605">"ਤੁਸੀਂ <xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ ਆਪਣਾ ਅਗਲਾ ਅਲਾਰਮ ਨਹੀਂ ਸੁਣੋਗੇ ਜਦੋਂ ਤੱਕ ਉਸਤੋਂ ਪਹਿਲਾਂ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
<string name="zen_alarm_warning" msgid="444533119582244293">"ਤੁਸੀਂ <xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ ਆਪਣਾ ਅਗਲਾ ਅਲਾਰਮ ਨਹੀਂ ਸੁਣੋਗੇ"</string>
@@ -525,14 +525,14 @@
<string name="alarm_template_far" msgid="4242179982586714810">"<xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ"</string>
<string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ, <xliff:g id="TITLE">%s</xliff:g>।"</string>
<string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ਹੌਟਸਪੌਟ"</string>
- <string name="accessibility_managed_profile" msgid="6613641363112584120">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ"</string>
+ <string name="accessibility_managed_profile" msgid="6613641363112584120">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"ਕੁਝ ਵਾਸਤੇ ਤਾਂ ਮਜ਼ੇਦਾਰ ਹੈ ਲੇਕਿਨ ਸਾਰਿਆਂ ਵਾਸਤੇ ਨਹੀਂ"</string>
<string name="tuner_warning" msgid="8730648121973575701">"ਸਿਸਟਮ UI ਟਿਊਨਰ ਤੁਹਾਨੂੰ Android ਵਰਤੋਂਕਾਰ ਇੰਟਰਫੇਸ ਤਬਦੀਲ ਕਰਨ ਅਤੇ ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਵਾਧੂ ਤਰੀਕੇ ਦਿੰਦਾ ਹੈ। ਇਹ ਪ੍ਰਯੋਗਾਤਮਿਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਭਵਿੱਖ ਦੀ ਰੀਲੀਜ਼ ਵਿੱਚ ਬਦਲ ਸਕਦੀਆਂ ਹਨ, ਟੁੱਟ ਸਕਦੀਆਂ ਹਨ, ਜਾਂ ਅਲੋਪ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਸਾਵਧਾਨੀ ਨਾਲ ਅੱਗੇ ਵੱਧੋ।"</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"ਇਹ ਪ੍ਰਯੋਗਾਤਮਿਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਭਵਿੱਖ ਦੀ ਰੀਲੀਜ਼ ਵਿੱਚ ਬਦਲ ਸਕਦੀਆਂ ਹਨ, ਟੁੱਟ ਸਕਦੀਆਂ ਹਨ, ਜਾਂ ਅਲੋਪ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਸਾਵਧਾਨੀ ਨਾਲ ਅੱਗੇ ਵੱਧੋ।"</string>
<string name="got_it" msgid="2239653834387972602">"ਸਮਝ ਲਿਆ"</string>
<string name="tuner_toast" msgid="603429811084428439">"ਵਧਾਈਆਂ! ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ ਹੈ"</string>
- <string name="remove_from_settings" msgid="8389591916603406378">"ਸੈਟਿੰਗਜ਼ ਤੋਂ ਹਟਾਓ"</string>
- <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ਕੀ ਸੈਟਿੰਗਾਂ ਤੋਂ ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਹਟਾਉਣਾ ਹੈ ਅਤੇ ਇਸਦੀਆਂ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਉਪਯੋਗ ਕਰਨ ਤੋਂ ਰੋਕਣਾ ਹੈ?"</string>
+ <string name="remove_from_settings" msgid="8389591916603406378">"ਸੈਟਿੰਗਾਂ ਤੋਂ ਹਟਾਓ"</string>
+ <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ਕੀ ਸੈਟਿੰਗਾਂ ਤੋਂ ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਹਟਾਉਣਾ ਹੈ ਅਤੇ ਇਸਦੀਆਂ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਵਰਤੋਂ ਕਰਨ ਤੋਂ ਰੋਕਣਾ ਹੈ?"</string>
<string name="activity_not_found" msgid="348423244327799974">"ਐਪਲੀਕੇਸ਼ਨ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੇ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ"</string>
<string name="clock_seconds" msgid="7689554147579179507">"ਘੜੀ ਸਕਿੰਟ ਦਿਖਾਓ"</string>
<string name="clock_seconds_desc" msgid="6282693067130470675">"ਸਥਿਤੀ ਬਾਰ ਵਿੱਚ ਘੜੀ ਸਕਿੰਟ ਦਿਖਾਓ। ਬੈਟਰੀ ਸਮਰੱਥਾ ਤੇ ਅਸਰ ਪੈ ਸਕਦਾ ਹੈ।"</string>
@@ -540,9 +540,9 @@
<string name="show_brightness" msgid="6613930842805942519">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਮਕ ਦਿਖਾਓ"</string>
<string name="experimental" msgid="6198182315536726162">"ਪ੍ਰਯੋਗਾਤਮਿਕ"</string>
<string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth ਚਾਲੂ ਕਰੋ?"</string>
- <string name="enable_bluetooth_message" msgid="9106595990708985385">"ਆਪਣੇ ਟੈਬਲੇਟ ਨਾਲ ਆਪਣਾ ਕੀ-ਬੋਰਡ ਕਨੈਕਟ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ Bluetooth ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ।"</string>
+ <string name="enable_bluetooth_message" msgid="9106595990708985385">"ਆਪਣੇ ਟੈਬਲੈੱਟ ਨਾਲ ਆਪਣਾ ਕੀ-ਬੋਰਡ ਕਨੈਕਟ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਬਲੂਟੁੱਥ ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ਚਾਲੂ ਕਰੋ"</string>
- <string name="show_silently" msgid="6841966539811264192">"ਸੂਚਨਾਵਾਂ ਚੁੱਪਚਾਪ ਢੰਗ ਨਾਲ ਵਿਖਾਓ"</string>
+ <string name="show_silently" msgid="6841966539811264192">"ਸੂਚਨਾਵਾਂ ਚੁੱਪਚਾਪ ਢੰਗ ਨਾਲ ਦਿਖਾਓ"</string>
<string name="block" msgid="2734508760962682611">"ਸਾਰੀਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ"</string>
<string name="do_not_silence" msgid="6878060322594892441">"ਚੁੱਪ ਨਾ ਕਰਵਾਓ"</string>
<string name="do_not_silence_block" msgid="4070647971382232311">"ਚੁੱਪ ਨਾ ਕਰਵਾਓ ਜਾਂ ਬਲੌਕ ਨਾ ਕਰੋ"</string>
@@ -557,7 +557,7 @@
<string name="notification_unblockable_desc" msgid="3561016061737896906">"ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<plurals name="notification_num_channels_desc" formatted="false" msgid="5492793452274077663">
<item quantity="one">ਇਸ ਐਪ ਤੋਂ <xliff:g id="NUMBER_1">%s</xliff:g> ਸੂਚਨਾ ਸ਼੍ਰੇਣੀ ਵਿੱਚੋਂ 1</item>
- <item quantity="other">ਇਸ ਐਪ ਤੋਂ <xliff:g id="NUMBER_1">%s</xliff:g> ਸੂਚਨਾ ਸ਼੍ਰੇਣੀਆਂ ਵਿੱਚੋਂ 1</item>
+ <item quantity="other">ਇਸ ਐਪ ਤੋਂ <xliff:g id="NUMBER_1">%s</xliff:g> ਸੂਚਨਾ ਸ਼੍ਰੇਣੀ ਵਿੱਚੋਂ 1</item>
</plurals>
<string name="notification_channels_list_desc_2" msgid="6214732715833946441">"<xliff:g id="CHANNEL_NAME_1">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2">%2$s</xliff:g>"</string>
<plurals name="notification_channels_list_desc_2_and_others" formatted="false" msgid="2747813553355336157">
@@ -569,7 +569,7 @@
<string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ਇਸ ਚੈਨਲ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"ਸਭ ਸ਼੍ਰੇਣੀਆਂ"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string>
- <string name="notification_app_settings" msgid="3743278649182392015">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
+ <string name="notification_app_settings" msgid="3743278649182392015">"ਵਿਉਂਤਬੱਧ ਕਰੋ: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</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>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ਸੂਚਨਾ ਕੰਟਰੋਲ"</string>
@@ -596,31 +596,31 @@
<string name="keyboard_key_dpad_left" msgid="1346446024676962251">"Left"</string>
<string name="keyboard_key_dpad_right" msgid="3317323247127515341">"Right"</string>
<string name="keyboard_key_dpad_center" msgid="2566737770049304658">"Center"</string>
- <string name="keyboard_key_tab" msgid="3871485650463164476">"Tab"</string>
+ <string name="keyboard_key_tab" msgid="3871485650463164476">"ਟੈਬ"</string>
<string name="keyboard_key_space" msgid="2499861316311153293">"Space"</string>
<string name="keyboard_key_enter" msgid="5739632123216118137">"Enter"</string>
<string name="keyboard_key_backspace" msgid="1559580097512385854">"Backspace"</string>
<string name="keyboard_key_media_play_pause" msgid="3861975717393887428">"Play/Pause"</string>
<string name="keyboard_key_media_stop" msgid="2859963958595908962">"Stop"</string>
- <string name="keyboard_key_media_next" msgid="1894394911630345607">"Next"</string>
- <string name="keyboard_key_media_previous" msgid="4256072387192967261">"Previous"</string>
+ <string name="keyboard_key_media_next" msgid="1894394911630345607">"ਅੱਗੇ"</string>
+ <string name="keyboard_key_media_previous" msgid="4256072387192967261">"ਪਿਛਲਾ"</string>
<string name="keyboard_key_media_rewind" msgid="2654808213360820186">"Rewind"</string>
<string name="keyboard_key_media_fast_forward" msgid="3849417047738200605">"Fast Forward"</string>
<string name="keyboard_key_page_up" msgid="5654098530106845603">"Page Up"</string>
<string name="keyboard_key_page_down" msgid="8720502083731906136">"Page Down"</string>
- <string name="keyboard_key_forward_del" msgid="1391451334716490176">"Delete"</string>
+ <string name="keyboard_key_forward_del" msgid="1391451334716490176">"ਮਿਟਾਓ"</string>
<string name="keyboard_key_move_home" msgid="2765693292069487486">"Home"</string>
<string name="keyboard_key_move_end" msgid="5901174332047975247">"End"</string>
<string name="keyboard_key_insert" msgid="8530501581636082614">"Insert"</string>
<string name="keyboard_key_num_lock" msgid="5052537581246772117">"Num Lock"</string>
<string name="keyboard_key_numpad_template" msgid="8729216555174634026">"Numpad <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"ਸਿਸਟਮ"</string>
- <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"ਮੁੱਖ ਸਕ੍ਰੀਨ"</string>
+ <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"ਹੋਮ ਸਕ੍ਰੀਨ"</string>
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"ਹਾਲੀਆ"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ਪਿੱਛੇ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ਸੂਚਨਾਵਾਂ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ਇਨਪੁੱਟ ਵਿਧੀ ਬਦਲੋ"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ਇਨਪੁੱਟ ਵਿਧੀ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ਐਪਲੀਕੇਸ਼ਨਾਂ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ਸਹਾਇਕ"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ਬ੍ਰਾਊਜ਼ਰ"</string>
@@ -630,14 +630,14 @@
<string name="keyboard_shortcut_group_applications_music" msgid="4775559515850922780">"ਸੰਗੀਤ"</string>
<string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"ਕੈਲੰਡਰ"</string>
- <string name="tuner_full_zen_title" msgid="4540823317772234308">"ਵੌਲਿਊਮ ਕੰਟਰੋਲਾਂ ਨਾਲ ਵਿਖਾਓ"</string>
+ <string name="tuner_full_zen_title" msgid="4540823317772234308">"ਵੌਲਿਊਮ ਕੰਟਰੋਲਾਂ ਨਾਲ ਦਿਖਾਓ"</string>
<string name="volume_and_do_not_disturb" msgid="3373784330208603030">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="volume_dnd_silent" msgid="4363882330723050727">"ਵੌਲਿਊਮ ਬਟਨ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="volume_up_silent" msgid="7141255269783588286">"ਅਵਾਜ਼ ਉੱਚੀ ਹੋਣ \'ਤੇ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਤੋਂ ਬਾਹਰ ਜਾਓ"</string>
<string name="battery" msgid="7498329822413202973">"ਬੈਟਰੀ"</string>
<string name="clock" msgid="7416090374234785905">"ਘੜੀ"</string>
<string name="headset" msgid="4534219457597457353">"ਹੈੱਡਸੈੱਟ"</string>
- <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ਹੈੱਡਫੋਨਾਂ ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ਹੈੱਡਫ਼ੋਨ ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ਹੈੱਡਸੈੱਟ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="data_saver" msgid="5037565123367048522">"ਡਾਟਾ ਸੇਵਰ"</string>
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string>
@@ -657,7 +657,7 @@
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ਸਧਾਰਨ"</item>
- <item msgid="8256205964297588988">"ਸੰਖੇਪ"</item>
+ <item msgid="8256205964297588988">"ਸੰਖਿਪਤ"</item>
<item msgid="8719936228094005878">"ਖੱਬੇ-ਉਲਾਰ"</item>
<item msgid="586019486955594690">"ਸੱਜੇ-ਉਲਾਰ"</item>
</string-array>
@@ -666,7 +666,7 @@
<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="accessibility_key" msgid="5701989859305675896">"ਵਿਉਂਂਤੀ ਨੈਵੀਗੇਟ ਬਟਨ"</string>
<string name="left_keycode" msgid="2010948862498918135">"ਖੱਬਾ ਕੀ-ਕੋਡ"</string>
<string name="right_keycode" msgid="708447961000848163">"ਸੱਜਾ ਕੀ-ਕੋਡ"</string>
<string name="left_icon" msgid="3096287125959387541">"ਖੱਬਾ ਪ੍ਰਤੀਕ"</string>
@@ -676,14 +676,14 @@
<string name="qs_edit" msgid="2232596095725105230">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="tuner_time" msgid="6572217313285536011">"ਸਮਾਂ"</string>
<string-array name="clock_options">
- <item msgid="5965318737560463480">"ਘੰਟੇ, ਮਿੰਟ, ਅਤੇ ਸਕਿੰਟ ਵਿਖਾਓ"</item>
- <item msgid="1427801730816895300">"ਘੰਟੇ ਅਤੇ ਮਿੰਟ ਵਿਖਾਓ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
- <item msgid="3830170141562534721">"ਇਸ ਚਿੰਨ੍ਹ ਨੂੰ ਨਾ ਵਿਖਾਓ"</item>
+ <item msgid="5965318737560463480">"ਘੰਟੇ, ਮਿੰਟ, ਅਤੇ ਸਕਿੰਟ ਦਿਖਾਓ"</item>
+ <item msgid="1427801730816895300">"ਘੰਟੇ ਅਤੇ ਮਿੰਟ ਦਿਖਾਓ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
+ <item msgid="3830170141562534721">"ਇਸ ਪ੍ਰਤੀਕ ਨੂੰ ਨਾ ਦਿਖਾਓ"</item>
</string-array>
<string-array name="battery_options">
- <item msgid="3160236755818672034">"ਹਮੇਸ਼ਾਂ ਪ੍ਰਤੀਸ਼ਤਤਾ ਵਿਖਾਓ"</item>
- <item msgid="2139628951880142927">"ਚਾਰਜਿੰਗ ਦੌਰਾਨ ਪ੍ਰਤੀਸ਼ਤਤਾ ਵਿਖਾਓ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
- <item msgid="3327323682209964956">"ਇਸ ਚਿੰਨ੍ਹ ਨੂੰ ਨਾ ਵਿਖਾਓ"</item>
+ <item msgid="3160236755818672034">"ਹਮੇਸ਼ਾਂ ਪ੍ਰਤੀਸ਼ਤਤਾ ਦਿਖਾਓ"</item>
+ <item msgid="2139628951880142927">"ਚਾਰਜਿੰਗ ਦੌਰਾਨ ਪ੍ਰਤੀਸ਼ਤਤਾ ਦਿਖਾਓ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
+ <item msgid="3327323682209964956">"ਇਸ ਪ੍ਰਤੀਕ ਨੂੰ ਨਾ ਦਿਖਾਓ"</item>
</string-array>
<string name="other" msgid="4060683095962566764">"ਹੋਰ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਡਿਵਾਈਡਰ"</string>
@@ -699,7 +699,7 @@
<string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"ਹੇਠਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
<string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"ਸਥਿਤੀ <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>। ਸੰਪਾਦਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ।"</string>
<string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>। ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ।"</string>
- <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"ਸਥਿਤੀ <xliff:g id="POSITION">%1$d</xliff:g>। ਚੁਣਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ।"</string>
+ <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"ਸਥਿਤੀ <xliff:g id="POSITION">%1$d</xliff:g>। ਚੁਣਨ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ।"</string>
<string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ਨੂੰ ਤਬਦੀਲ ਕਰੋ"</string>
<string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ਹਟਾਓ"</string>
<string name="accessibility_qs_edit_tile_added" msgid="8050200862063548309">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ਨੂੰ <xliff:g id="POSITION">%2$d</xliff:g> ਸਥਿਤੀ \'ਤੇ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ"</string>
@@ -710,7 +710,7 @@
<string name="dock_forced_resizable" msgid="5914261505436217520">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string>
<string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ \'ਤੇ ਕੰਮ ਨਾ ਕਰੇ।"</string>
- <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਆਂ \'ਤੇ ਲਾਂਚ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਆਂ \'ਤੇ ਲਾਂਚ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ।"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਖੋਲ੍ਹੋ।"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬੰਦ ਕਰੋ।"</string>
@@ -728,21 +728,21 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ਖਾਰਜ ਕਰਨ ਲਈ ਹੇਠਾਂ ਘਸੀਟੋ"</string>
<string name="pip_menu_title" msgid="4707292089961887657">"ਮੀਨੂ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ \'ਚ ਹੈ"</string>
- <string name="pip_notification_message" msgid="5619512781514343311">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"ਜੇਕਰ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
<string name="pip_play" msgid="1417176722760265888">"ਚਲਾਓ"</string>
<string name="pip_pause" msgid="8881063404466476571">"ਵਿਰਾਮ ਦਿਓ"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ਅਗਲੇ \'ਤੇ ਜਾਓ"</string>
<string name="pip_skip_to_prev" msgid="1955311326688637914">"ਪਿਛਲੇ \'ਤੇ ਜਾਓ"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ਗਰਮ ਹੋਣ ਕਾਰਨ ਫ਼ੋਨ ਬੰਦ ਹੋ ਗਿਆ"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ"</string>
- <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ \n • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ"</string>
+ <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">\n"ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ"</string>
<string name="high_temp_title" msgid="4589508026407318374">"ਫ਼ੋਨ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ਫ਼ੋਨ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਿਤ ਹੁੰਦੀਆਂ ਹਨ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਵੈਚਲਿਤ ਰੂਪ ਵਿੱਚ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰੰਤੂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਵਧੇਰੇ ਹੌਲੀ ਚੱਲੇ।\n\nਇੱਕ ਵਾਰ ਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਧਾਰਨ ਤੌਰ \'ਤੇ ਚੱਲੇਗਾ।"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ਖੱਬਾ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ਸੱਜਾ ਸ਼ਾਰਟਕੱਟ"</string>
- <string name="lockscreen_unlock_left" msgid="2043092136246951985">"ਖੱਬੇ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਵੀ ਅਨਲੌਕ ਹੁੰਦੀ ਹੈ"</string>
- <string name="lockscreen_unlock_right" msgid="1529992940510318775">"ਸੱਜੇ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਵੀ ਅਨਲੌਕ ਹੁੰਦੀ ਹੈ"</string>
+ <string name="lockscreen_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>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index ac938e5..08f5a38 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -22,7 +22,7 @@
<string name="app_label" msgid="7164937344850004466">"Interf sist"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações do app"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inform. do app"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Suas telas recentes aparecem aqui"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar apps recentes"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -478,7 +478,7 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Não, obrigado"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <string name="volume_zen_end_now" msgid="6930243045593601084">"Desligar agora"</string>
+ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desativar agora"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Recolher"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index ac938e5..08f5a38 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -22,7 +22,7 @@
<string name="app_label" msgid="7164937344850004466">"Interf sist"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações do app"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inform. do app"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Suas telas recentes aparecem aqui"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar apps recentes"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -478,7 +478,7 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Não, obrigado"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <string name="volume_zen_end_now" msgid="6930243045593601084">"Desligar agora"</string>
+ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desativar agora"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Recolher"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 0bcb182..47771366 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -22,7 +22,7 @@
<string name="app_label" msgid="7164937344850004466">"UI sistem"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ștergeți"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminați din listă"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informații despre aplicație"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info aplicație"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ecranele dvs. recente apar aici"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Renunțați la aplicațiile recente"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -61,7 +61,7 @@
<string name="label_view" msgid="6304565553218192990">"Afișați"</string>
<string name="always_use_device" msgid="1450287437017315906">"Utilizați în mod prestabilit pt. acest dispoz. USB"</string>
<string name="always_use_accessory" msgid="1210954576979621596">"Utiliz. în mod prestabilit pt. acest accesoriu USB"</string>
- <string name="usb_debugging_title" msgid="4513918393387141949">"Permiteți depanarea USB?"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Permiteți remedierea erorilor prin USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Amprenta digitală din cheia RSA a computerului este:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Permiteți întotdeauna de pe acest computer"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Remedierea erorilor prin USB nu este permisă"</string>
@@ -388,7 +388,7 @@
<string name="user_add_user" msgid="5110251524486079492">"Adăugați un utilizator"</string>
<string name="user_new_user_name" msgid="426540612051178753">"Utilizator nou"</string>
<string name="guest_nickname" msgid="8059989128963789678">"Invitat"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"Adăugați un oaspete"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"Adăugați un invitat"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"Eliminați invitatul"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"Ștergeți invitatul?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Toate aplicațiile și datele din această sesiune vor fi șterse."</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 101d3e8..8465844 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -244,9 +244,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Зарядка батареи"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Передача данных 2G и 3G приостановлена"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Передача данных 4G приостановлена"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Передача данных по моб. сети приостановлена"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Передача данных остановлена"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Передача данных приостановлена"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Достигнут лимит мобильного трафика, и вы больше его не расходуете.\n\nЕсли вы продолжите, возможно, начнет взиматься плата за передачу данных."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Достигнут лимит мобильного трафика, и передача данных остановлена.\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>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 3e69ce1..a4b45e5 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -45,7 +45,7 @@
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Zapnúť"</string>
<string name="battery_saver_start_action" msgid="5576697451677486320">"Zapnúť šetrič batérie"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavenia"</string>
- <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi‑Fi"</string>
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatické otočenie obrazovky"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"STLMIŤ"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
@@ -152,7 +152,7 @@
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
- <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi‑Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Žiadna SIM karta."</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"Mobilné dáta"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobilné dáta sú zapnuté"</string>
@@ -194,8 +194,8 @@
<string name="accessibility_desc_work_lock" msgid="4288774420752813383">"Uzamknutá obrazovka pracovného profilu"</string>
<string name="accessibility_desc_close" msgid="7479755364962766729">"Zavrieť"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Pripojenie Wi-Fi je vypnuté."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Pripojenie Wi-Fi je zapnuté."</string>
+ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Pripojenie Wi‑Fi je vypnuté."</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Pripojenie Wi‑Fi je zapnuté."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobil: <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batéria: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Režim v lietadle je vypnutý."</string>
@@ -246,10 +246,10 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dátové prenosy 4G sú pozastavené"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobilné dáta sú pozastavené"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Dáta sú pozastavené"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Dosiahli ste nastavený dátový limit. Už nepoužívate mobilné dáta.\n\nAk budete pokračovať, môžu vám byť účtované poplatky za spotrebu dát."</string>
- <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Znova spustiť"</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Dosiahli ste nastavený dátový limit. Už nepoužívate mobilné dátové pripojenie.\n\nAk ho znovu zapnete, môžu vám byť účtované poplatky za spotrebu dát."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Znova zapnúť"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Bez prip. na Internet"</string>
- <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: pripojené"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi‑Fi: pripojené"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Vyhľadávanie satelitov GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Poloha nastavená pomocou GPS"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"Žiadosti o polohu sú aktívne"</string>
@@ -298,12 +298,12 @@
<string name="quick_settings_user_label" msgid="5238995632130897840">"Ja"</string>
<string name="quick_settings_user_title" msgid="4467690427642392403">"Používateľ"</string>
<string name="quick_settings_user_new_user" msgid="9030521362023479778">"Nový používateľ"</string>
- <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi‑Fi"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Nepripojené"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Žiadna sieť"</string>
- <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Sieť Wi-Fi je vypnutá"</string>
- <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je zapnuté"</string>
- <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"K dispozícii nie sú žiadne siete Wi-Fi"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Sieť Wi‑Fi je vypnutá"</string>
+ <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi‑Fi je zapnuté"</string>
+ <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"K dispozícii nie sú žiadne siete Wi‑Fi"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Prenos"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prenáša sa"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepomenované zariadenie"</string>
@@ -311,7 +311,7 @@
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Nie sú k dispozícii žiadne zariadenia"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jas"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATICKY"</string>
- <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Invertovať farby"</string>
+ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Inverzia farieb"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"Režim korekcie farieb"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"Ďalšie nastavenia"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Hotovo"</string>
@@ -777,7 +777,7 @@
<string name="app_info" msgid="6856026610594615344">"Info o aplikácii"</string>
<string name="go_to_web" msgid="1106022723459948514">"Prejsť na internet"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilné dáta"</string>
- <string name="wifi_is_off" msgid="1838559392210456893">"Pripojenie Wi-Fi je vypnuté"</string>
+ <string name="wifi_is_off" msgid="1838559392210456893">"Pripojenie Wi‑Fi je vypnuté"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Rozhranie Bluetooth je vypnuté"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"Nastavenie Nerušiť je vypnuté"</string>
<string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"Režim Nerušiť bol zapnutý automatickým pravidlom (<xliff:g id="ID_1">%s</xliff:g>)."</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 74c6aaf..86b5c0c 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -227,8 +227,8 @@
<string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Ficklampan har aktiverats."</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"Färginverteringen har inaktiverats."</string>
<string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"Färginverteringen har aktiverats."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Den mobila trådlösa surfzonen har inaktiverats."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Den mobila trådlösa surfzonen har aktiverats."</string>
+ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Den mobila surfzonen har inaktiverats."</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Den mobila surfzonen har aktiverats."</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Castningen av skärmen har stoppats."</string>
<string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Arbetsläget är inaktiverat."</string>
<string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Arbetsläget aktiverat."</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index f640896..b8878f5 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -77,7 +77,7 @@
<string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Haina nafasi ya kutosha kuhifadhi picha ya skrini."</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Programu au shirika lako halikuruhusu kupiga picha za skrini"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Machaguo ya uhamisho wa faili la USB"</string>
- <string name="use_mtp_button_title" msgid="4333504413563023626">"Angika kama kichezeshi cha midia (MTP)"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Angika kama kichezaji cha maudhui (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Angika kama kamera (PTP)"</string>
<string name="installer_cd_button_title" msgid="2312667578562201583">"Sakinisha programu ya Kuhamisha Faili ya Android ya Mac"</string>
<string name="accessibility_back" msgid="567011538994429120">"Nyuma"</string>
@@ -284,7 +284,7 @@
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Mbinu ya uingizaji"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"Kutambua Eneo"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"Kitambua eneo kimezimwa"</string>
- <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Kifaa cha midia"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Kifaa cha faili"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Simu za Dharura Pekee"</string>
<string name="quick_settings_settings_label" msgid="5326556592578065401">"Mipangilio"</string>
@@ -353,8 +353,8 @@
<string name="description_target_search" msgid="3091587249776033139">"Tafuta"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Sogeza juu kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Sogeza kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="zen_priority_introduction" msgid="1149025108714420281">"Hutasumbuliwa na sauti na mitetemo, isipokuwa inayotokana na kengele, vikumbusho, matukio na simu zinazopigwa na watu uliobainisha. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
- <string name="zen_alarms_introduction" msgid="4934328096749380201">"Hutasumbuliwa na sauti na mitetemo, isipokuwa inayotokana na kengele. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele, vikumbusho, matukio na simu zinazopigwa na watu uliobainisha. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Badilisha upendavyo"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Hatua hii huzuia mitetemo na sauti ZOTE, ikiwa ni pamoja na inayotokana na kengele, muziki video na michezo. Bado utaweza kupiga simu."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa ni pamoja na ile inayotokana na kengele, muziki, video na michezo."</string>
@@ -384,7 +384,7 @@
<string name="user_add_user" msgid="5110251524486079492">"Ongeza mtumiaji"</string>
<string name="user_new_user_name" msgid="426540612051178753">"Mtumiaji mpya"</string>
<string name="guest_nickname" msgid="8059989128963789678">"Aliyealikwa"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"Ongeza aliyealikwa"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"Ongeza mgeni"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"Ondoa aliyealikwa"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"Ungependa kumwondoa aliyealikwa?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Data na programu zote katika kipindi hiki zitafutwa."</string>
@@ -476,7 +476,7 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Hapana, asante"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Sanidi"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <string name="volume_zen_end_now" msgid="6930243045593601084">"Zima sasa"</string>
+ <string name="volume_zen_end_now" msgid="6930243045593601084">"Izime sasa"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Panua"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Kunja"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Skrini imebandikwa"</string>
@@ -596,8 +596,8 @@
<string name="keyboard_key_dpad_left" msgid="1346446024676962251">"Kushoto"</string>
<string name="keyboard_key_dpad_right" msgid="3317323247127515341">"Kulia"</string>
<string name="keyboard_key_dpad_center" msgid="2566737770049304658">"Katikati"</string>
- <string name="keyboard_key_tab" msgid="3871485650463164476">"Sogeza"</string>
- <string name="keyboard_key_space" msgid="2499861316311153293">"Nafasi"</string>
+ <string name="keyboard_key_tab" msgid="3871485650463164476">"Tab"</string>
+ <string name="keyboard_key_space" msgid="2499861316311153293">"Space"</string>
<string name="keyboard_key_enter" msgid="5739632123216118137">"Enter"</string>
<string name="keyboard_key_backspace" msgid="1559580097512385854">"Nafasinyuma"</string>
<string name="keyboard_key_media_play_pause" msgid="3861975717393887428">"Cheza/Sitisha"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 2d4b6d0..a46facf 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -19,10 +19,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="7164937344850004466">"UI அமைப்பு"</string>
+ <string name="app_label" msgid="7164937344850004466">"சாதனத்தின் UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"அழி"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"பட்டியலில் இருந்து அகற்று"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"பயன்பாட்டுத் தகவல்"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ஆப்ஸ் தகவல்"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"சமீபத்திய திரைகள் இங்கு தோன்றும்"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"சமீபத்திய பயன்பாடுகளை நிராகரி"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -152,9 +152,9 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"வைஃபை"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"சிம் இல்லை."</string>
- <string name="accessibility_cell_data" msgid="5326139158682385073">"மொபைல் தரவு"</string>
- <string name="accessibility_cell_data_on" msgid="5927098403452994422">"மொபைல் தரவு இயக்கப்பட்டது"</string>
- <string name="accessibility_cell_data_off" msgid="443267573897409704">"மொபைல் தரவு முடக்கப்பட்டது"</string>
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"மொபைல் டேட்டா"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"மொபைல் டேட்டா இயக்கப்பட்டது"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"மொபைல் டேட்டா முடக்கப்பட்டது"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"புளூடூத் டெதெரிங்."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"விமானப் பயன்முறை."</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN இயக்கத்தில் உள்ளது."</string>
@@ -184,10 +184,10 @@
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"அறிவிப்பு நிராகரிக்கப்பட்டது."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"அறிவிப்பு விவரம்."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"உடனடி அமைப்பு."</string>
- <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"பூட்டுத் திரை."</string>
+ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"லாக் ஸ்கிரீன்."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"அமைப்பு"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"மேலோட்டப் பார்வை."</string>
- <string name="accessibility_desc_work_lock" msgid="4288774420752813383">"பணிப் பூட்டுத் திரை"</string>
+ <string name="accessibility_desc_work_lock" msgid="4288774420752813383">"பணி லாக் ஸ்கிரீன்"</string>
<string name="accessibility_desc_close" msgid="7479755364962766729">"மூடு"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"வைஃபை முடக்கப்பட்டது."</string>
@@ -201,7 +201,7 @@
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது, முதன்மை மட்டும்."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது, அறிவிப்புகள் வேண்டாம்."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது, அலாரங்கள் மட்டும்."</string>
- <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"தொந்தரவு செய்ய வேண்டாம்."</string>
+ <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"தொந்தரவு செய்யாதே."</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"தொந்தரவு செய்ய வேண்டாம் என்பது முடக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"தொந்தரவு செய்ய வேண்டாம் என்பது முடக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது."</string>
@@ -234,15 +234,15 @@
<string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"பணிப் பயன்முறை இயக்கப்பட்டுள்ளது."</string>
<string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"பணிப் பயன்முறை முடக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"பணிப் பயன்முறை இயக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"தரவுச் சேமிப்பான் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"தரவுச் சேமிப்பான் இயக்கப்பட்டது."</string>
+ <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"டேட்டா சேமிப்பான் முடக்கப்பட்டது."</string>
+ <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"டேட்டா சேமிப்பான் இயக்கப்பட்டது."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"திரை பிரகாசம்"</string>
- <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"சார்ஜ் ஏறுகிறது"</string>
+ <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"சார்ஜ் ஆகிறது"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G டேட்டா இடைநிறுத்தப்பட்டது"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G டேட்டா இடைநிறுத்தப்பட்டது"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"மொபைல் தரவு இடைநிறுத்தப்பட்டுள்ளது"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"மொபைல் டேட்டா இடைநிறுத்தப்பட்டுள்ளது"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"தரவு இடைநிறுத்தப்பட்டது"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"நீங்கள் அமைத்த தரவு வரம்பை அடைந்துவிட்டீர்கள். இப்போது மொபைல் தரவைப் பயன்படுத்தவில்லை.\n\nபயன்படுத்தத் தொடங்கினால், தரவு உபயோகத்திற்குக் கட்டணங்கள் விதிக்கப்படலாம்."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"நீங்கள் அமைத்த டேட்டா வரம்பை அடைந்துவிட்டீர்கள். இப்போது மொபைல் டேட்டாவைப் பயன்படுத்தவில்லை.\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">"வைஃபை இணைக்கப்பட்டது"</string>
@@ -266,7 +266,7 @@
<string name="dessert_case" msgid="1295161776223959221">"இனிப்பு வடிவங்கள்"</string>
<string name="start_dreams" msgid="5640361424498338327">"ஸ்கிரீன் சேவர்"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ஈதர்நெட்"</string>
- <string name="quick_settings_dnd_label" msgid="8735855737575028208">"தொந்தரவு செய்ய வேண்டாம்"</string>
+ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"தொந்தரவு செய்யாதே"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"முதன்மை மட்டும்"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"அலாரங்கள் மட்டும்"</string>
<string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"அறிவிப்புகள் வேண்டாம்"</string>
@@ -298,7 +298,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"வைஃபையை முடக்கு"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"வைஃபை இயக்கத்தில்"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"வைஃபை நெட்வொர்க்குகள் இல்லை"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"திரையிடு"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"அனுப்புகிறது"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"பெயரிடப்படாத சாதனம்"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"திரையிடத் தயார்"</string>
@@ -316,8 +316,8 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ஹாட்ஸ்பாட்"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"அறிவிப்புகள்"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"டார்ச் லைட்"</string>
- <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"மொபைல் தரவு"</string>
- <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"தரவுப் பயன்பாடு"</string>
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"மொபைல் டேட்டா"</string>
+ <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"டேட்டா பயன்பாடு"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"மீதமுள்ள தரவு"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"வரம்பைக் கடந்தது"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"பயன்படுத்தியது - <xliff:g id="DATA_USED">%s</xliff:g>"</string>
@@ -346,18 +346,18 @@
<string-array name="recents_blacklist_array">
</string-array>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"சார்ஜ் செய்யப்பட்டது"</string>
- <string name="expanded_header_battery_charging" msgid="205623198487189724">"சார்ஜாகிறது"</string>
+ <string name="expanded_header_battery_charging" msgid="205623198487189724">"சார்ஜ் ஆகிறது"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"முழுவதும் சார்ஜாக <xliff:g id="CHARGING_TIME">%s</xliff:g> ஆகும்"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"சார்ஜ் ஏறவில்லை"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"பிணையம்\nகண்காணிக்கப்படலாம்"</string>
<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="1149025108714420281">"அலாரங்கள், நினைவூட்டல்கள், நிகழ்வுகள் மற்றும் குறிப்பிட்ட அழைப்பாளர்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள், கேம்கள் போன்றவை) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
- <string name="zen_alarms_introduction" msgid="4934328096749380201">"அலாரங்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள், கேம்கள் போன்றவை) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"அலாரங்கள், நினைவூட்டல்கள், நிகழ்வுகள் மற்றும் குறிப்பிட்ட அழைப்பாளர்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள், கேம்ஸ் போன்றவை) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"அலாரங்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள், கேம்ஸ் போன்றவை) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"தனிப்பயனாக்கு"</string>
- <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும். எனினும், உங்களால் ஃபோன் அழைப்புகளைச் செய்ய முடியும்."</string>
- <string name="zen_silence_introduction" msgid="3137882381093271568">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும்."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்ஸ் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும். எனினும், உங்களால் ஃபோன் அழைப்புகளைச் செய்ய முடியும்."</string>
+ <string name="zen_silence_introduction" msgid="3137882381093271568">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்ஸ் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும்."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"அவசர நிலைக் குறைவான அறிவிப்புகள் கீழே உள்ளன"</string>
<string name="notification_tap_again" msgid="7590196980943943842">"திறக்க, மீண்டும் தட்டவும்"</string>
@@ -383,8 +383,8 @@
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"சுயவிவரத்தைக் காட்டு"</string>
<string name="user_add_user" msgid="5110251524486079492">"பயனரைச் சேர்"</string>
<string name="user_new_user_name" msgid="426540612051178753">"புதியவர்"</string>
- <string name="guest_nickname" msgid="8059989128963789678">"கெஸ்ட்"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"அழைக்கப்பட்டவரைச் சேர்"</string>
+ <string name="guest_nickname" msgid="8059989128963789678">"வேறொருவர்"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"வேறொருவரைச் சேர்"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"அழைக்கப்பட்டவரை அகற்று"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"அழைக்கப்பட்டவரை அகற்றவா?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"இந்த அமர்வின் எல்லா பயன்பாடுகளும், தரவும் நீக்கப்படும்."</string>
@@ -393,7 +393,7 @@
<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>
+ <string name="guest_notification_title" msgid="1585278533840603063">"வேறொருவர்"</string>
<string name="guest_notification_text" msgid="335747957734796689">"பயன்பாடுகளையும் தரவையும் நீக்க, விருந்தினர் பயனரை அகற்றவும்"</string>
<string name="guest_notification_remove_action" msgid="8820670703892101990">"அழைக்கப்பட்டவரை அகற்றவா?"</string>
<string name="user_logout_notification_title" msgid="1453960926437240727">"பயனரை வெளியேற்று"</string>
@@ -439,8 +439,8 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPNஐ முடக்கு"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPNஐத் துண்டி"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"கொள்கைகளைக் காட்டு"</string>
- <string name="monitoring_description_named_management" msgid="5281789135578986303">"சாதனத்தை <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
- <string name="monitoring_description_management" msgid="4573721970278370790">"சாதனத்தை உங்கள் நிறுவனம் நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"சாதனத்தை <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், ஆப்ஸ், உங்கள் சாதனத்துடன் தொடர்புடைய டேட்டா, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"சாதனத்தை உங்கள் நிறுவனம் நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், ஆப்ஸ், உங்கள் சாதனத்துடன் தொடர்புடைய டேட்டா, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"உங்கள் நிறுவனம் இந்தச் சாதனத்தில் சான்றிதழ் அங்கீகாரத்தை நிறுவியுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"உங்கள் நிறுவனம், பணி விவரத்தில் சான்றிதழ் அங்கீகாரத்தை நிறுவியுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"இந்தச் சாதனத்தில் சான்றிதழ் அங்கீகாரம் நிறுவப்பட்டுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்."</string>
@@ -451,7 +451,7 @@
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் உங்களின் தனிப்பட்ட சுயவிவரம் இணைக்கப்பட்டுள்ளது."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"உங்கள் சாதனத்தை நிர்வகிப்பது: <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"உங்கள் சாதனத்தை நிர்வகிக்க, <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> பயன்பாட்டை <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> பயன்படுத்தும்."</string>
- <string name="monitoring_description_do_body" msgid="3639594537660975895">"உங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு, சாதன இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்."</string>
+ <string name="monitoring_description_do_body" msgid="3639594537660975895">"உங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், ஆப்ஸ், சாதனத்துடன் தொடர்புடைய டேட்டா, சாதன இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
<string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"மேலும் அறிக"</string>
<string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"<xliff:g id="VPN_APP">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string>
@@ -489,7 +489,7 @@
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"மறை"</string>
<string name="managed_profile_foreground_toast" msgid="5421487114739245972">"பணி சுயவிவரத்தைப் பயன்படுத்துகிறீர்கள்"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"அழைப்பு"</string>
- <string name="stream_system" msgid="7493299064422163147">"அமைப்பு"</string>
+ <string name="stream_system" msgid="7493299064422163147">"சிஸ்டம்"</string>
<string name="stream_ring" msgid="8213049469184048338">"ரிங் செய்"</string>
<string name="stream_music" msgid="9086982948697544342">"மீடியா"</string>
<string name="stream_alarm" msgid="5209444229227197703">"அலாரம்"</string>
@@ -547,8 +547,8 @@
<string name="do_not_silence" msgid="6878060322594892441">"ஒலியை அனுமதி"</string>
<string name="do_not_silence_block" msgid="4070647971382232311">"ஒலி அல்லது அறிவிப்பைத் தடுக்காதே"</string>
<string name="tuner_full_importance_settings" msgid="3207312268609236827">"ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள்"</string>
- <string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"இயக்கத்தில்"</string>
- <string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"முடக்கத்தில்"</string>
+ <string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"ஆன்"</string>
+ <string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"ஆஃப்"</string>
<string name="power_notification_controls_description" msgid="4372459941671353358">"ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள் மூலம், பயன்பாட்டின் அறிவிப்புகளுக்கு முக்கியத்துவ நிலையை (0-5) அமைக்கலாம். \n\n"<b>"நிலை 5"</b>" \n- அறிவிப்புப் பட்டியலின் மேலே காட்டும் \n- முழுத் திரைக் குறுக்கீட்டை அனுமதிக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n"<b>"நிலை 4"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n"<b>"நிலை 3"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n\n"<b>"நிலை 2"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது, அதிர்வுறாது \n\n"<b>"நிலை 1"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது அல்லது அதிர்வுறாது \n- பூட்டுத்திரை மற்றும் நிலைப்பட்டியிலிருந்து மறைக்கும் \n- அறிவிப்புகள் பட்டியலின் கீழே காட்டும் \n\n"<b>"நிலை 0"</b>" \n- பயன்பாட்டின் எல்லா அறிவிப்புகளையும் தடுக்கும்"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"அறிவிப்புகள்"</string>
<string name="notification_channel_disabled" msgid="2139193533791840539">"இந்த அறிவிப்புகளை இனி பெறமாட்டீர்கள்"</string>
@@ -584,7 +584,7 @@
<item quantity="other">%d நிமிடங்கள்</item>
<item quantity="one">%d நிமிடம்</item>
</plurals>
- <string name="battery_panel_title" msgid="7944156115535366613">"பேட்டரி உபயோகம்"</string>
+ <string name="battery_panel_title" msgid="7944156115535366613">"பேட்டரி பயன்பாடு"</string>
<string name="battery_detail_charging_summary" msgid="4055327085770378335">"சார்ஜ் செய்யும் போது பேட்டரி சேமிப்பானைப் பயன்படுத்த முடியாது"</string>
<string name="battery_detail_switch_title" msgid="8763441006881907058">"பேட்டரி சேமிப்பான்"</string>
<string name="battery_detail_switch_summary" msgid="9049111149407626804">"செயல்திறனையும் பின்புலத்தில் தரவு செயலாக்கப்படுவதையும் குறைக்கும்"</string>
@@ -614,7 +614,7 @@
<string name="keyboard_key_insert" msgid="8530501581636082614">"இன்சர்ட்"</string>
<string name="keyboard_key_num_lock" msgid="5052537581246772117">"நம்பர் லாக்"</string>
<string name="keyboard_key_numpad_template" msgid="8729216555174634026">"நம்பர் பேடு <xliff:g id="NAME">%1$s</xliff:g>"</string>
- <string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"முறைமை"</string>
+ <string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"சிஸ்டம்"</string>
<string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"முகப்பு"</string>
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"சமீபத்தியவை"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"முந்தையது"</string>
@@ -631,7 +631,7 @@
<string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"கேலெண்டர்"</string>
<string name="tuner_full_zen_title" msgid="4540823317772234308">"ஒலிக் கட்டுப்பாடுகளுடன் காட்டு"</string>
- <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"தொந்தரவு செய்ய வேண்டாம்"</string>
+ <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"தொந்தரவு செய்யாதே"</string>
<string name="volume_dnd_silent" msgid="4363882330723050727">"ஒலியளவுப் பொத்தான்களுக்கான குறுக்குவழி"</string>
<string name="volume_up_silent" msgid="7141255269783588286">"ஒலியைக் கூட்டும் போது தொந்தரவு செய்ய வேண்டாம் என்பதை முடக்கு"</string>
<string name="battery" msgid="7498329822413202973">"பேட்டரி"</string>
@@ -639,11 +639,11 @@
<string name="headset" msgid="4534219457597457353">"ஹெட்செட்"</string>
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ஹெட்ஃபோன்கள் இணைக்கப்பட்டன"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ஹெட்செட் இணைக்கப்பட்டது"</string>
- <string name="data_saver" msgid="5037565123367048522">"தரவுச்சேமிப்பான்"</string>
- <string name="accessibility_data_saver_on" msgid="8454111686783887148">"தரவு சேமிப்பான் இயக்கப்பட்டது"</string>
- <string name="accessibility_data_saver_off" msgid="8841582529453005337">"தரவு சேமிப்பான் முடக்கப்பட்டது"</string>
- <string name="switch_bar_on" msgid="1142437840752794229">"இயக்கு"</string>
- <string name="switch_bar_off" msgid="8803270596930432874">"முடக்கு"</string>
+ <string name="data_saver" msgid="5037565123367048522">"டேட்டா சேமிப்பான்"</string>
+ <string name="accessibility_data_saver_on" msgid="8454111686783887148">"டேட்டா சேமிப்பான் இயக்கப்பட்டது"</string>
+ <string name="accessibility_data_saver_off" msgid="8841582529453005337">"டேட்டா சேமிப்பான் முடக்கப்பட்டது"</string>
+ <string name="switch_bar_on" msgid="1142437840752794229">"ஆன்"</string>
+ <string name="switch_bar_off" msgid="8803270596930432874">"ஆஃப்"</string>
<string name="nav_bar" msgid="1993221402773877607">"வழிசெலுத்தல் பட்டி"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"தளவமைப்பு"</string>
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"கூடுதல் இடப்புறப் பொத்தான் வகை"</string>
@@ -721,7 +721,7 @@
<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="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>
@@ -745,7 +745,7 @@
<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_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>
@@ -760,9 +760,9 @@
<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>
+ <string name="app_info" msgid="6856026610594615344">"ஆப்ஸ் தகவல்"</string>
<string name="go_to_web" msgid="1106022723459948514">"இணையத்திற்குச் செல்"</string>
- <string name="mobile_data" msgid="7094582042819250762">"மொபைல் தரவு"</string>
+ <string name="mobile_data" msgid="7094582042819250762">"மொபைல் டேட்டா"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"வைஃபை முடக்கத்தில் உள்ளது"</string>
<string name="bt_is_off" msgid="2640685272289706392">"புளூடூத் முடக்கத்தில் உள்ளது"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"\"தொந்தரவு செய்ய வேண்டாம்\" முடக்கத்தில் உள்ளது"</string>
@@ -774,6 +774,6 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"மாற்று"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"பின்னணியில் இயங்கும் பயன்பாடுகள்"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"பேட்டரி மற்றும் தரவு உபயோக விவரங்களைக் காண, தட்டவும்"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"மொபைல் தரவை முடக்கவா?"</string>
+ <string name="data_usage_disable_mobile" msgid="5116269981510015864">"மொபைல் டேட்டாவை முடக்கவா?"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"அனுமதிக் கோரிக்கையைப் பயன்பாடு மறைப்பதால், அமைப்புகளால் உங்கள் பதிலைச் சரிபார்க்க முடியாது."</string>
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index ce00a96..2c32fab 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -97,7 +97,7 @@
<string name="voice_assist_label" msgid="3956854378310019854">"వాయిస్ అసిస్టెంట్ను తెరువు"</string>
<string name="camera_label" msgid="7261107956054836961">"కెమెరాను తెరువు"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"కొత్త విధి లేఅవుట్ను ఎంచుకోండి"</string>
- <string name="cancel" msgid="6442560571259935130">"రద్దు చేయండి"</string>
+ <string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"అనుకూలత జూమ్ బటన్."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"చిన్న స్క్రీన్ నుండి పెద్దదానికి జూమ్ చేయండి."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"బ్లూటూత్ కనెక్ట్ చేయబడింది."</string>
@@ -194,10 +194,10 @@
<string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"వైఫై ఆన్ చేయబడింది."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"మొబైల్ <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"బ్యాటరీ <xliff:g id="STATE">%s</xliff:g>."</string>
- <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"ఎయిర్ప్లైన్ మోడ్ ఆఫ్లో ఉంది."</string>
- <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"ఎయిర్ప్లైన్ మోడ్ ఆన్లో ఉంది."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"ఎయిర్ప్లైన్ మోడ్ ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ఎయిర్ప్లైన్ మోడ్ ఆన్ చేయబడింది."</string>
+ <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"ఎయిర్ప్లేన్ మోడ్ ఆఫ్లో ఉంది."</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"ఎయిర్ప్లేన్ మోడ్ ఆన్లో ఉంది."</string>
+ <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"ఎయిర్ప్లేన్ మోడ్ ఆఫ్ చేయబడింది."</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ఎయిర్ప్లేన్ మోడ్ ఆన్ చేయబడింది."</string>
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"అంతరాయం కలిగించవద్దు ఆన్లో ఉంది, ప్రాధాన్యత మాత్రమే."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"అంతరాయం కలిగించవద్దు ఆన్లో ఉంది, మొత్తం నిశ్శబ్దం."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"అంతరాయం కలిగించవద్దు ఆన్లో ఉంది, అలారాలు మాత్రమే."</string>
@@ -516,11 +516,11 @@
<string name="status_bar_ethernet" msgid="5044290963549500128">"ఈథర్నెట్"</string>
<string name="status_bar_alarm" msgid="8536256753575881818">"అలారం"</string>
<string name="status_bar_work" msgid="6022553324802866373">"కార్యాలయ ప్రొఫైల్"</string>
- <string name="status_bar_airplane" msgid="7057575501472249002">"ఎయిర్ప్లైన్ మోడ్"</string>
+ <string name="status_bar_airplane" msgid="7057575501472249002">"ఎయిర్ప్లేన్ మోడ్"</string>
<string name="add_tile" msgid="2995389510240786221">"టైల్ను జోడించండి"</string>
<string name="broadcast_tile" msgid="3894036511763289383">"ప్రసార టైల్"</string>
- <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"మీరు <xliff:g id="WHEN">%1$s</xliff:g> సెట్ చేసిన మీ తదుపరి అలారం మీరు ఆ లోపల దీన్ని ఆఫ్ చేయకుంటే వినిపించదు"</string>
- <string name="zen_alarm_warning" msgid="444533119582244293">"మీరు <xliff:g id="WHEN">%1$s</xliff:g> సెట్ చేసిన మీ తదుపరి అలారం మీకు వినిపించదు"</string>
+ <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"మీరు <xliff:g id="WHEN">%1$s</xliff:g> సెట్ చేసిన మీ తర్వాత అలారం మీరు ఆ లోపల దీన్ని ఆఫ్ చేయకుంటే వినిపించదు"</string>
+ <string name="zen_alarm_warning" msgid="444533119582244293">"మీరు <xliff:g id="WHEN">%1$s</xliff:g> సెట్ చేసిన మీ తర్వాత అలారం మీకు వినిపించదు"</string>
<string name="alarm_template" msgid="3980063409350522735">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
<string name="alarm_template_far" msgid="4242179982586714810">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
<string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"శీఘ్ర సెట్టింగ్లు, <xliff:g id="TITLE">%s</xliff:g>."</string>
@@ -602,7 +602,7 @@
<string name="keyboard_key_backspace" msgid="1559580097512385854">"Backspace"</string>
<string name="keyboard_key_media_play_pause" msgid="3861975717393887428">"ప్లే చేయి/పాజ్ చేయి"</string>
<string name="keyboard_key_media_stop" msgid="2859963958595908962">"ఆపివేయి"</string>
- <string name="keyboard_key_media_next" msgid="1894394911630345607">"తదుపరి"</string>
+ <string name="keyboard_key_media_next" msgid="1894394911630345607">"తర్వాత"</string>
<string name="keyboard_key_media_previous" msgid="4256072387192967261">"మునుపటి"</string>
<string name="keyboard_key_media_rewind" msgid="2654808213360820186">"రివైండ్ చేయి"</string>
<string name="keyboard_key_media_fast_forward" msgid="3849417047738200605">"వేగంగా ఫార్వార్డ్ చేయి"</string>
@@ -731,7 +731,7 @@
<string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string>
<string name="pip_play" msgid="1417176722760265888">"ప్లే చేయి"</string>
<string name="pip_pause" msgid="8881063404466476571">"పాజ్ చేయి"</string>
- <string name="pip_skip_to_next" msgid="1948440006726306284">"దాటవేసి తదుపరి దానికి వెళ్లు"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"దాటవేసి తర్వాత దానికి వెళ్లు"</string>
<string name="pip_skip_to_prev" msgid="1955311326688637914">"దాటవేసి మునుపటి దానికి వెళ్లు"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది"</string>
@@ -745,7 +745,7 @@
<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_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>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 450d61b..261bccf 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -242,7 +242,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Naka-pause ang 4G data"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Naka-pause ang mobile data"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Naka-pause ang data"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Naabot na ang itinakda mong limitasyon sa data. Hindi ka na gumagamit ng mobile data.\n\nKung magpapatuloy ka, maaaring may mga singil sa paggamit ng data."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Naabot na ang itinakda mong limitasyon ng data. Hindi ka na gumagamit ng mobile data.\n\nKung magpapatuloy ka, maaaring may mga singil sa paggamit ng data."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Ipagpatuloy"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Walang koneksyon sa Internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"nakakonekta ang Wi-Fi"</string>
@@ -354,7 +354,7 @@
<string name="description_direction_up" msgid="7169032478259485180">"Mag-slide pataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_priority_introduction" msgid="1149025108714420281">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban mula sa mga alarm, paalala, kaganapan, at tumatawag na tutukuyin mo. Maririnig mo pa rin ang kahit na anong piliin mong i-play kabilang ang mga musika, video, at laro."</string>
- <string name="zen_alarms_introduction" msgid="4934328096749380201">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban mula sa mga alarm. Maririnig mo pa rin ang kahit na anong piliin mong i-play kabilang ang mga musika, video, at laro."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban sa mga alarm. Maririnig mo pa rin ang anumang pipiliin mong i-play kabilang ang mga musika, video, at laro."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"I-customize"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Bina-block nito ang LAHAT ng tunog at pag-vibrate, kabilang ang mula sa mga alarm, musika, video, at laro. Makakatawag ka pa rin."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Bina-block nito ang LAHAT ng tunog at pag-vibrate, kabilang ang mula sa mga alarm, musika, video at laro."</string>
@@ -762,7 +762,7 @@
<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>
<string name="go_to_web" msgid="1106022723459948514">"Pumunta sa web"</string>
- <string name="mobile_data" msgid="7094582042819250762">"Data ng mobile"</string>
+ <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Naka-off ang Wi-Fi"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Naka-off ang Bluetooth"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"Naka-off ang Huwag Istorbohin"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 94c70cc..cc14af6 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -246,7 +246,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Передавання даних 4G призупинено"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Мобільне передавання даних призупинено"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Передавання даних призупинено"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Досягнуто вказаного обмеження обсягу даних. Мобільне передавання даних вимкнено.\n\nЯкщо ввімкнути його, може стягуватися плата за використання трафіку."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Досягнуто ліміту мобільного трафіку. Ви його більше не витрачаєте.\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>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 6d7ae3c..b8cf046 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -242,7 +242,7 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Quvvat olmoqda"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G internet to‘xtatib qo‘yildi"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G internet to‘xtatib qo‘yildi"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobil internet pauza qilingan"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobil internet pauza qilindi"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Internetdan foydalanish to‘xtatib qo‘yildi"</string>
<string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Belgilangan trafik sarflab bo‘lindi. Endi mobil internetdan foydalana olmaysiz.\n\nDavom ettiradigan bo‘lsangiz, trafik uchun to‘lov olinishi mumkin."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Davom etish"</string>
@@ -383,10 +383,10 @@
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Foydalanuvchini o‘zgartirish. Joriy foydalanuvchi – <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Joriy foydalanuvchi <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"Profilni ko‘rsatish"</string>
- <string name="user_add_user" msgid="5110251524486079492">"Foydalanuvchi qo‘shish"</string>
+ <string name="user_add_user" msgid="5110251524486079492">"Foydalanuvchi"</string>
<string name="user_new_user_name" msgid="426540612051178753">"Yangi foydalanuvchi"</string>
<string name="guest_nickname" msgid="8059989128963789678">"Mehmon"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"Mehmon qo‘shish"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"Mehmon"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"Mehmon rejimini o‘chirish"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"Mehmon hisobi o‘chirib tashlansinmi?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Ushbu seansdagi barcha ilovalar va ma’lumotlar o‘chirib tashlanadi."</string>
@@ -673,7 +673,7 @@
<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_add_tiles" msgid="7058945779098711293">"Keraklisini tepaga torting"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"O‘chirish uchun bu yerga torting"</string>
<string name="qs_edit" msgid="2232596095725105230">"Tahrirlash"</string>
<string name="tuner_time" msgid="6572217313285536011">"Vaqt"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 278fb9a..5b5cc61 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -240,9 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Đang sạc"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Đã tạm dừng dữ liệu 2G-3G"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Đã tạm dừng dữ liệu 4G"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Dữ liệu di động bị tạm dừng"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Dữ liệu di động đã bị tạm dừng"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Đã tạm dừng dữ liệu"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Đã đạt đến giới hạn dữ liệu mà bạn đặt. Bạn hiện không còn sử dụng dữ liệu di động.\n\nNếu tiếp tục, bạn có thể phải trả phí sử dụng dữ liệu."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Dữ liệu đã đạt đến mức giới hạn mà bạn đã đặt. Bạn hiện không sử dụng dữ liệu di động nữa.\n\nNếu tiếp tục, bạn có thể bị tính phí sử dụng dữ liệu."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Tiếp tục"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Ko có k.nối Internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Đã kết nối Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 8d83ada..38c501b 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -240,9 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"正在充电"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 数据网络已暂停使用"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 数据网络已暂停使用"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"移动数据已暂停使用"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"已暂停使用移动数据网络"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"数据网络已暂停使用"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"您的数据用量已达到所设置的用量上限,因此系统已停用移动数据。\n\n如果您要继续使用移动数据,则可能需要支付相应的数据流量费用。"</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"您的数据流量消耗已达到所设置的上限,因此已停用移动数据网络。\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">"已连接到WLAN网络"</string>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index 745d6015..a923f0b 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -34,6 +34,7 @@
<attr name="recentItemLayout" format="reference" />
<!-- Style for the "Clear all" button. -->
<attr name="clearAllStyle" format="reference" />
+ <attr name="clearAllBackgroundColor" format="reference" />
</declare-styleable>
<declare-styleable name="DeadZone">
<attr name="minSize" format="dimension" />
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index f72f379..f244d88 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -60,6 +60,11 @@
<!-- The background color for the freeform workspace. -->
<color name="recents_freeform_workspace_bg_color">#33FFFFFF</color>
+ <!-- The background color for clear all button on light backgrounds if not transparent. -->
+ <color name="recents_clear_all_button_bg_light_color">#CCFFFFFF</color>
+ <!-- The background color for clear all button on dark backgrounds if not transparent. -->
+ <color name="recents_clear_all_button_bg_dark_color">#CC000000</color>
+
<color name="keyguard_affordance">#ffffffff</color>
<!-- The color of the legacy notification background -->
diff --git a/packages/SystemUI/res/values/colors_car.xml b/packages/SystemUI/res/values/colors_car.xml
index 1b8c2fa..710b3e0 100644
--- a/packages/SystemUI/res/values/colors_car.xml
+++ b/packages/SystemUI/res/values/colors_car.xml
@@ -20,8 +20,12 @@
<color name="car_qs_background_primary">#263238</color> <!-- Blue Gray 900 -->
<color name="car_user_switcher_progress_bgcolor">#00000000</color> <!-- Transparent -->
<color name="car_user_switcher_progress_fgcolor">#80CBC4</color> <!-- Teal 200 -->
- <color name="car_user_switcher_no_user_image_bgcolor">#FAFAFA</color> <!-- Grey 50 -->
- <color name="car_user_switcher_no_user_image_fgcolor">#212121</color> <!-- Grey 900 -->
- <color name="car_start_driving_background">#FAFAFA</color> <!-- Grey 50 -->
- <color name="car_start_driving_text">#212121</color> <!-- Grey 900 -->
+ <color name="car_user_switcher_no_user_image_bgcolor">@color/car_grey_50</color>
+ <color name="car_user_switcher_no_user_image_fgcolor">@color/car_grey_900</color>
+ <color name="car_start_driving_background">@color/car_grey_50</color>
+ <color name="car_start_driving_text">@color/car_grey_900</color>
+ <color name="car_qs_footer_user_name_color">@color/car_grey_50</color>
+
+ <color name="car_grey_50">#FAFAFA</color>
+ <color name="car_grey_900">#212121</color>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index bcaafcc..9901f6f 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -298,6 +298,7 @@
<dimen name="qs_detail_padding_start">16dp</dimen>
<dimen name="qs_detail_items_padding_top">4dp</dimen>
<dimen name="qs_detail_item_icon_size">24dp</dimen>
+ <dimen name="qs_detail_item_icon_width">32dp</dimen>
<dimen name="qs_detail_item_icon_marginStart">0dp</dimen>
<dimen name="qs_detail_item_icon_marginEnd">20dp</dimen>
<dimen name="qs_footer_padding_start">16dp</dimen>
diff --git a/packages/SystemUI/res/values/dimens_car.xml b/packages/SystemUI/res/values/dimens_car.xml
index 5f56c4e..8853587 100644
--- a/packages/SystemUI/res/values/dimens_car.xml
+++ b/packages/SystemUI/res/values/dimens_car.xml
@@ -18,7 +18,8 @@
<resources>
<dimen name="car_margin">148dp</dimen>
- <dimen name="car_fullscreen_user_pod_margin_above_text">24dp</dimen>
+ <dimen name="car_fullscreen_user_pod_margin_name_top">24dp</dimen>
+ <dimen name="car_fullscreen_user_pod_margin_name_bottom">64dp</dimen>
<dimen name="car_fullscreen_user_pod_margin_between">24dp</dimen>
<dimen name="car_fullscreen_user_pod_icon_text_size">96dp</dimen>
<dimen name="car_fullscreen_user_pod_image_avatar_width">192dp</dimen>
@@ -37,5 +38,17 @@
<dimen name="car_start_driving_corner_radius">16dp</dimen>
<dimen name="car_start_driving_padding_side">30dp</dimen>
<dimen name="car_start_driving_height">80dp</dimen>
- <dimen name="car_start_driving_text_size">32sp</dimen> <!-- B2 -->
+ <dimen name="car_start_driving_text_size">@dimen/car_body2_size</dimen>
+
+ <dimen name="car_qs_footer_height">112dp</dimen>
+ <dimen name="car_qs_footer_padding_bottom">16dp</dimen>
+ <dimen name="car_qs_footer_padding_top">16dp</dimen>
+ <dimen name="car_qs_footer_padding_end">46dp</dimen>
+ <dimen name="car_qs_footer_padding_start">46dp</dimen>
+ <dimen name="car_qs_footer_icon_width">56dp</dimen>
+ <dimen name="car_qs_footer_icon_height">56dp</dimen>
+ <dimen name="car_qs_footer_user_switch_margin_right">46dp</dimen>
+ <dimen name="car_qs_footer_user_name_text_size">@dimen/car_body2_size</dimen>
+
+ <dimen name="car_body2_size">26sp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index b27dedd..2148c80 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -59,6 +59,7 @@
<item type="id" name="transformation_start_y_tag"/>
<item type="id" name="transformation_start_scale_x_tag"/>
<item type="id" name="transformation_start_scale_y_tag"/>
+ <item type="id" name="continuous_clipping_tag"/>
<!-- Whether the icon is from a notification for which targetSdk < L -->
<item type="id" name="icon_is_pre_L"/>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 2199fff..90c5977 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -34,11 +34,13 @@
<item name="android:windowShowWallpaper">true</item>
<item name="android:windowDisablePreview">true</item>
<item name="clearAllStyle">@style/ClearAllButtonDefaultMargins</item>
+ <item name="clearAllBackgroundColor">@color/recents_clear_all_button_bg_dark_color</item>
<item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item>
<item name="wallpaperTextColorSecondary">@*android:color/secondary_text_material_dark</item>
</style>
<style name="RecentsTheme.Wallpaper.Light">
+ <item name="clearAllBackgroundColor">@color/recents_clear_all_button_bg_light_color</item>
<item name="wallpaperTextColor">@*android:color/primary_text_material_light</item>
<item name="wallpaperTextColorSecondary">@*android:color/secondary_text_material_light</item>
</style>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index bb6213b..d95402c 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -38,6 +38,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.ContentObserver;
@@ -49,13 +50,17 @@
import android.os.BatteryManager;
import android.os.CancellationSignal;
import android.os.Handler;
+import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.Message;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
+import android.service.dreams.DreamService;
+import android.service.dreams.IDreamManager;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -65,8 +70,6 @@
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
-import com.google.android.collect.Lists;
-
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.PhoneConstants;
@@ -75,6 +78,8 @@
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
+import com.google.android.collect.Lists;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
@@ -157,6 +162,21 @@
private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName(
"com.android.settings", "com.android.settings.FallbackHome");
+
+ /**
+ * If true, the system is in the half-boot-to-decryption-screen state.
+ * Prudently disable lockscreen.
+ */
+ public static final boolean CORE_APPS_ONLY;
+ static {
+ try {
+ CORE_APPS_ONLY = IPackageManager.Stub.asInterface(
+ ServiceManager.getService("package")).isOnlyCoreApps();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
private static KeyguardUpdateMonitor sInstance;
private final Context mContext;
@@ -200,6 +220,8 @@
private UserManager mUserManager;
private int mFingerprintRunningState = FINGERPRINT_STATE_STOPPED;
private LockPatternUtils mLockPatternUtils;
+ private final IDreamManager mDreamManager;
+ private boolean mIsDreaming;
/**
* Short delay before restarting fingerprint authentication after a successful try
@@ -441,6 +463,26 @@
updateFingerprintListeningState();
}
+ /**
+ * @return a cached version of DreamManager.isDreaming()
+ */
+ public boolean isDreaming() {
+ return mIsDreaming;
+ }
+
+ /**
+ * If the device is dreaming, awakens the device
+ */
+ public void awakenFromDream() {
+ if (mIsDreaming && mDreamManager != null) {
+ try {
+ mDreamManager.awaken();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to awaken from dream");
+ }
+ }
+ }
+
private void onFingerprintAuthenticated(int userId) {
Trace.beginSection("KeyGuardUpdateMonitor#onFingerPrintAuthenticated");
mUserFingerprintAuthenticated.put(userId, true);
@@ -1020,11 +1062,11 @@
private void handleDreamingStateChanged(int dreamStart) {
final int count = mCallbacks.size();
- boolean showingDream = dreamStart == 1;
+ mIsDreaming = dreamStart == 1;
for (int i = 0; i < count; i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onDreamingStateChanged(showingDream);
+ cb.onDreamingStateChanged(mIsDreaming);
}
}
}
@@ -1129,6 +1171,9 @@
mLockPatternUtils = new LockPatternUtils(context);
mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker);
+ mDreamManager = IDreamManager.Stub.asInterface(
+ ServiceManager.getService(DreamService.DREAM_SERVICE));
+
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
}
@@ -1166,7 +1211,7 @@
private boolean shouldListenForFingerprint() {
return (mKeyguardIsVisible || !mDeviceInteractive ||
(mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
- shouldListenForFingerprintAssistant())
+ shouldListenForFingerprintAssistant() || (mKeyguardOccluded && mIsDreaming))
&& !mSwitchingUser && !isFingerprintDisabled(getCurrentUser())
&& !mKeyguardGoingAway;
}
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index fd2447b..2b31967 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -49,6 +49,7 @@
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.policy.IconLogger;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -150,7 +151,9 @@
public void onTuningChanged(String key, String newValue) {
if (StatusBarIconController.ICON_BLACKLIST.equals(key)) {
ArraySet<String> icons = StatusBarIconController.getIconBlacklist(newValue);
- setVisibility(icons.contains(mSlotBattery) ? View.GONE : View.VISIBLE);
+ boolean hidden = icons.contains(mSlotBattery);
+ Dependency.get(IconLogger.class).onIconVisibility(mSlotBattery, !hidden);
+ setVisibility(hidden ? View.GONE : View.VISIBLE);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 49253ec..2937a25 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -42,6 +42,7 @@
import com.android.systemui.power.PowerUI;
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl;
+import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -66,6 +67,8 @@
import com.android.systemui.statusbar.policy.FlashlightControllerImpl;
import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.HotspotControllerImpl;
+import com.android.systemui.statusbar.policy.IconLogger;
+import com.android.systemui.statusbar.policy.IconLoggerImpl;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
import com.android.systemui.statusbar.policy.LocationController;
@@ -294,9 +297,13 @@
mProviders.put(UiOffloadThread.class, UiOffloadThread::new);
-
mProviders.put(PowerUI.WarningsUI.class, () -> new PowerNotificationWarnings(mContext));
+ mProviders.put(IconLogger.class, () -> new IconLoggerImpl(mContext,
+ getDependency(BG_LOOPER), getDependency(MetricsLogger.class)));
+
+ mProviders.put(LightBarController.class, () -> new LightBarController(mContext));
+
// Put all dependencies above here so the factory can override them if it wants.
SystemUIFactory.getInstance().injectDependencies(mProviders, mContext);
}
@@ -341,7 +348,8 @@
@SuppressWarnings("unchecked")
DependencyProvider<T> provider = mProviders.get(cls);
if (provider == null) {
- throw new IllegalArgumentException("Unsupported dependency " + cls);
+ throw new IllegalArgumentException("Unsupported dependency " + cls
+ + ". " + mProviders.size() + " providers known.");
}
return provider.createDependency();
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index 9b1842a..6f8bcff 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -58,22 +58,20 @@
params);
DozeMachine machine = new DozeMachine(wrappedService, config, wakeLock);
- DozeScreenBrightness screenBrightness = createDozeScreenBrightness(
- context, wrappedService, sensorManager, host, handler);
machine.setParts(new DozeMachine.Part[]{
new DozePauser(handler, machine, alarmManager, new AlwaysOnDisplayPolicy(context)),
new DozeFalsingManagerAdapter(FalsingManager.getInstance(context)),
createDozeTriggers(context, sensorManager, host, alarmManager, config, params,
- handler, screenBrightness, wakeLock, machine),
+ handler, wakeLock, machine),
createDozeUi(context, host, wakeLock, machine, handler, alarmManager),
new DozeScreenState(wrappedService, handler),
- screenBrightness,
+ createDozeScreenBrightness(context, wrappedService, sensorManager, host, handler),
});
return machine;
}
- private DozeScreenBrightness createDozeScreenBrightness(Context context,
+ private DozeMachine.Part createDozeScreenBrightness(Context context,
DozeMachine.Service service, SensorManager sensorManager, DozeHost host,
Handler handler) {
Sensor sensor = DozeSensors.findSensorWithType(sensorManager,
@@ -84,11 +82,10 @@
private DozeTriggers createDozeTriggers(Context context, SensorManager sensorManager,
DozeHost host, AlarmManager alarmManager, AmbientDisplayConfiguration config,
- DozeParameters params, Handler handler, DozeScreenBrightness screenBrightness,
- WakeLock wakeLock, DozeMachine machine) {
+ DozeParameters params, Handler handler, WakeLock wakeLock, DozeMachine machine) {
boolean allowPulseTriggers = true;
return new DozeTriggers(context, machine, host, alarmManager, config, params,
- sensorManager, handler, screenBrightness, wakeLock, allowPulseTriggers);
+ sensorManager, handler, wakeLock, allowPulseTriggers);
}
private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index 92f8d8c..03407e2 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -37,10 +37,11 @@
private final Sensor mLightSensor;
private final int[] mSensorToBrightness;
private final int[] mSensorToScrimOpacity;
+
private boolean mRegistered;
- private boolean mReady = true;
- private ReadyListener mReadyListener;
private int mDefaultDozeBrightness;
+ private boolean mPaused = false;
+ private int mLastSensorValue = -1;
public DozeScreenBrightness(Context context, DozeMachine.Service service,
SensorManager sensorManager, Sensor lightSensor, DozeHost host,
@@ -86,22 +87,38 @@
setLightSensorEnabled(false);
break;
}
+ if (newState != DozeMachine.State.FINISH) {
+ setPaused(newState == DozeMachine.State.DOZE_AOD_PAUSED);
+ }
}
@Override
public void onSensorChanged(SensorEvent event) {
if (mRegistered) {
- int sensorValue = (int) event.values[0];
- int brightness = computeBrightness(sensorValue);
- if (brightness > 0) {
+ mLastSensorValue = (int) event.values[0];
+ updateBrightnessAndReady();
+ }
+ }
+
+ private void updateBrightnessAndReady() {
+ if (mRegistered) {
+ int brightness = computeBrightness(mLastSensorValue);
+ boolean brightnessReady = brightness > 0;
+ if (brightnessReady) {
mDozeService.setDozeScreenBrightness(brightness);
}
- // If the brightness is zero or negative, this indicates that the brightness sensor is
- // covered or reports that the screen should be off, therefore we're not ready to turn
- // on the screen yet.
- setReady(brightness > 0);
- int scrimOpacity = computeScrimOpacity(sensorValue);
+ int scrimOpacity = -1;
+ if (mPaused) {
+ // If AOD is paused, force the screen black until the
+ // sensor reports a new brightness. This ensures that when the screen comes on
+ // again, it will only show after the brightness sensor has stabilized,
+ // avoiding a potential flicker.
+ scrimOpacity = 255;
+ } else if (brightnessReady) {
+ // Only unblank scrim once brightness is ready.
+ scrimOpacity = computeScrimOpacity(mLastSensorValue);
+ }
if (scrimOpacity >= 0) {
mDozeHost.setAodDimmingScrim(scrimOpacity / 255f);
}
@@ -128,47 +145,28 @@
private void resetBrightnessToDefault() {
mDozeService.setDozeScreenBrightness(mDefaultDozeBrightness);
+ mDozeHost.setAodDimmingScrim(0f);
}
private void setLightSensorEnabled(boolean enabled) {
if (enabled && !mRegistered && mLightSensor != null) {
// Wait until we get an event from the sensor until indicating ready.
- setReady(false);
mRegistered = mSensorManager.registerListener(this, mLightSensor,
SensorManager.SENSOR_DELAY_NORMAL, mHandler);
+ mLastSensorValue = -1;
} else if (!enabled && mRegistered) {
mSensorManager.unregisterListener(this);
mRegistered = false;
+ mLastSensorValue = -1;
// Sensor is not enabled, hence we use the default brightness and are always ready.
- setReady(true);
}
}
- private void setReady(boolean ready) {
- if (ready != mReady) {
- mReady = ready;
- if (mReadyListener != null) {
- mReadyListener.onBrightnessReadyChanged(mReady);
- }
+ private void setPaused(boolean paused) {
+ if (mPaused != paused) {
+ mPaused = paused;
+ updateBrightnessAndReady();
}
}
- public void setBrightnessReadyListener(ReadyListener l) {
- mReadyListener = l;
- l.onBrightnessReadyChanged(mReady);
- }
-
- /**
- * @return true if the screen brightness is properly calculated.
- *
- * Can be used to wait for transitioning out of the paused state, such that we don't turn the
- * display on before the display brightness is properly calculated.
- */
- public boolean isReady() {
- return mReady;
- }
-
- public interface ReadyListener {
- void onBrightnessReadyChanged(boolean ready);
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 8d8c55c..f7a258a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -33,7 +33,6 @@
import android.text.format.Formatter;
import android.util.Log;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.util.Preconditions;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -66,7 +65,6 @@
private final boolean mAllowPulseTriggers;
private final UiModeManager mUiModeManager;
private final TriggerReceiver mBroadcastReceiver = new TriggerReceiver();
- private final DozeScreenBrightness mDozeScreenBrightness;
private long mNotificationPulseTime;
private boolean mPulsePending;
@@ -75,7 +73,7 @@
public DozeTriggers(Context context, DozeMachine machine, DozeHost dozeHost,
AlarmManager alarmManager, AmbientDisplayConfiguration config,
DozeParameters dozeParameters, SensorManager sensorManager, Handler handler,
- DozeScreenBrightness brightness, WakeLock wakeLock, boolean allowPulseTriggers) {
+ WakeLock wakeLock, boolean allowPulseTriggers) {
mContext = context;
mMachine = machine;
mDozeHost = dozeHost;
@@ -89,7 +87,6 @@
config, wakeLock, this::onSensor, this::onProximityFar,
new AlwaysOnDisplayPolicy(context));
mUiModeManager = mContext.getSystemService(UiModeManager.class);
- mDozeScreenBrightness = brightness;
}
private void onNotification() {
@@ -162,41 +159,16 @@
private void onProximityFar(boolean far) {
final boolean near = !far;
final DozeMachine.State state = mMachine.getState();
+ final boolean paused = (state == DozeMachine.State.DOZE_AOD_PAUSED);
+ final boolean pausing = (state == DozeMachine.State.DOZE_AOD_PAUSING);
+ final boolean aod = (state == DozeMachine.State.DOZE_AOD);
if (state == DozeMachine.State.DOZE_PULSING) {
boolean ignoreTouch = near;
if (DEBUG) Log.i(TAG, "Prox changed, ignore touch = " + ignoreTouch);
mDozeHost.onIgnoreTouchWhilePulsing(ignoreTouch);
}
-
- recalculatePausing();
- }
-
- private void onBrightnessReady(boolean brightnessReady) {
- // Post because this is sometimes called during state transitions and we cannot query
- // the machine's state while it's transitioning.
- mHandler.post(this::recalculatePausing);
- }
-
- private void recalculatePausing() {
- boolean brightnessReady = mDozeScreenBrightness.isReady();
- Boolean proxCurrentlyFar = mDozeSensors.isProximityCurrentlyFar();
-
- // Treat UNKNOWN the same as FAR, such that we don't pause the display just because
- // the prox has unknown state.
- boolean proximityFar = proxCurrentlyFar == null || proxCurrentlyFar;
- recalculatePausing(proximityFar, brightnessReady);
- }
-
- @VisibleForTesting
- void recalculatePausing(boolean proximityFar, boolean brightnessReady) {
- final boolean near = !proximityFar;
- final DozeMachine.State state = mMachine.getState();
- final boolean paused = (state == DozeMachine.State.DOZE_AOD_PAUSED);
- final boolean pausing = (state == DozeMachine.State.DOZE_AOD_PAUSING);
- final boolean aod = (state == DozeMachine.State.DOZE_AOD);
-
- if (proximityFar && (pausing || paused && brightnessReady)) {
+ if (far && (paused || pausing)) {
if (DEBUG) Log.i(TAG, "Prox FAR, unpausing AOD");
mMachine.requestState(DozeMachine.State.DOZE_AOD);
} else if (near && aod) {
@@ -211,7 +183,6 @@
case INITIALIZED:
mBroadcastReceiver.register(mContext);
mDozeHost.addCallback(mHostCallback);
- mDozeScreenBrightness.setBrightnessReadyListener(this::onBrightnessReady);
checkTriggersAtInit();
break;
case DOZE:
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 33d5617..4cbbbd6 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -14,6 +14,8 @@
package com.android.systemui.globalactions;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
+
import com.android.internal.R;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
@@ -310,7 +312,10 @@
} else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {
mItems.add(getSettingsAction());
} else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {
- mItems.add(getLockdownAction());
+ if (Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0) != 0) {
+ mItems.add(getLockdownAction());
+ }
} else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {
mItems.add(getVoiceAssistAction());
} else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {
@@ -575,7 +580,9 @@
@Override
public void onPress() {
- new LockPatternUtils(mContext).requireCredentialEntry(UserHandle.USER_ALL);
+ new LockPatternUtils(mContext)
+ .requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN,
+ UserHandle.USER_ALL);
try {
WindowManagerGlobal.getWindowManagerService().lockNow(null);
} catch (RemoteException e) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 4733008..3eb68f5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -1228,6 +1228,12 @@
* Enable the keyguard if the settings are appropriate.
*/
private void doKeyguardLocked(Bundle options) {
+ if (KeyguardUpdateMonitor.CORE_APPS_ONLY) {
+ // Don't show keyguard during half-booted cryptkeeper stage.
+ if (DEBUG) Log.d(TAG, "doKeyguard: not showing because booting to cryptkeeper");
+ return;
+ }
+
// if another app is disabling us, don't show
if (!mExternallyEnabled) {
if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled");
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 901b0b0..90f7b8d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -55,6 +55,7 @@
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
+import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.WindowManager.LayoutParams;
@@ -119,6 +120,7 @@
}
};
+ private PipTouchState mTouchState;
private PointF mDownPosition = new PointF();
private PointF mDownDelta = new PointF();
private ViewConfiguration mViewConfig;
@@ -175,6 +177,13 @@
// Set the flags to allow us to watch for outside touches and also hide the menu and start
// manipulating the PIP in the same touch gesture
mViewConfig = ViewConfiguration.get(this);
+ mTouchState = new PipTouchState(mViewConfig, mHandler, () -> {
+ if (mMenuState == MENU_STATE_CLOSE) {
+ showPipMenu();
+ } else {
+ expandPip();
+ }
+ });
getWindow().addFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | LayoutParams.FLAG_SLIPPERY);
super.onCreate(savedInstanceState);
@@ -186,12 +195,28 @@
mViewRoot.setBackground(mBackgroundDrawable);
mMenuContainer = findViewById(R.id.menu_container);
mMenuContainer.setAlpha(0);
- mMenuContainer.setOnClickListener((v) -> {
- if (mMenuState == MENU_STATE_CLOSE) {
- showPipMenu();
- } else {
- expandPip();
+ mMenuContainer.setOnTouchListener((v, event) -> {
+ mTouchState.onTouchEvent(event);
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_UP:
+ if (mTouchState.isDoubleTap() || mMenuState == MENU_STATE_FULL) {
+ // Expand to fullscreen if this is a double tap or we are already expanded
+ expandPip();
+ } else if (!mTouchState.isWaitingForDoubleTap()) {
+ // User has stalled long enough for this not to be a drag or a double tap,
+ // just expand the menu if necessary
+ if (mMenuState == MENU_STATE_CLOSE) {
+ showPipMenu();
+ }
+ } else {
+ // Next touch event _may_ be the second tap for the double-tap, schedule a
+ // fallback runnable to trigger the menu if no touch event occurs before the
+ // next tap
+ mTouchState.scheduleDoubleTapTimeoutCallback();
+ }
+ break;
}
+ return true;
});
mDismissButton = findViewById(R.id.dismiss);
mDismissButton.setAlpha(0);
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
index e898a51..34666fb 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
@@ -211,6 +211,10 @@
EventBus.getDefault().register(this);
}
+ public boolean isMenuActivityVisible() {
+ return mToActivityMessenger != null;
+ }
+
public void onActivityPinned() {
if (mMenuState == MENU_STATE_NONE) {
// If the menu is not visible, then re-register the input consumer if it is not already
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 3181481..2b48e0f 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -187,13 +187,15 @@
mMenuController.addListener(mMenuListener);
mDismissViewController = new PipDismissViewController(context);
mSnapAlgorithm = new PipSnapAlgorithm(mContext);
- mTouchState = new PipTouchState(mViewConfig);
mFlingAnimationUtils = new FlingAnimationUtils(context, 2.5f);
mGestures = new PipTouchGesture[] {
mDefaultMovementGesture
};
mMotionHelper = new PipMotionHelper(mContext, mActivityManager, mMenuController,
mSnapAlgorithm, mFlingAnimationUtils);
+ mTouchState = new PipTouchState(mViewConfig, mHandler,
+ () -> mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(),
+ mMovementBounds, true /* allowMenuTimeout */, willResizeMenu()));
Resources res = context.getResources();
mExpandedShortestEdgeSize = res.getDimensionPixelSize(
@@ -429,7 +431,7 @@
final float distance = bounds.bottom - target;
fraction = Math.min(distance / bounds.height(), 1f);
}
- if (Float.compare(fraction, 0f) != 0 || mMenuState != MENU_STATE_NONE) {
+ if (Float.compare(fraction, 0f) != 0 || mMenuController.isMenuActivityVisible()) {
// Update if the fraction > 0, or if fraction == 0 and the menu was already visible
mMenuController.setDismissFraction(fraction);
}
@@ -730,8 +732,20 @@
null /* animatorListener */);
setMinimizedStateInternal(false);
} else if (mMenuState != MENU_STATE_FULL) {
- mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(),
- mMovementBounds, true /* allowMenuTimeout */, willResizeMenu());
+ if (mTouchState.isDoubleTap()) {
+ // Expand to fullscreen if this is a double tap
+ mMotionHelper.expandPip();
+ } else if (!mTouchState.isWaitingForDoubleTap()) {
+ // User has stalled long enough for this not to be a drag or a double tap, just
+ // expand the menu
+ mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(),
+ mMovementBounds, true /* allowMenuTimeout */, willResizeMenu());
+ } else {
+ // Next touch event _may_ be the second tap for the double-tap, schedule a
+ // fallback runnable to trigger the menu if no touch event occurs before the
+ // next tap
+ mTouchState.scheduleDoubleTapTimeoutCallback();
+ }
} else {
mMenuController.hideMenu();
mMotionHelper.expandPip();
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java
index 686b3bb..b9369d3 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java
@@ -17,11 +17,15 @@
package com.android.systemui.pip.phone;
import android.graphics.PointF;
+import android.os.Handler;
+import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.ViewConfiguration;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.io.PrintWriter;
/**
@@ -31,9 +35,17 @@
private static final String TAG = "PipTouchHandler";
private static final boolean DEBUG = false;
- private ViewConfiguration mViewConfig;
+ @VisibleForTesting
+ static final long DOUBLE_TAP_TIMEOUT = 200;
+
+ private final Handler mHandler;
+ private final ViewConfiguration mViewConfig;
+ private final Runnable mDoubleTapTimeoutCallback;
private VelocityTracker mVelocityTracker;
+ private long mDownTouchTime = 0;
+ private long mLastDownTouchTime = 0;
+ private long mUpTouchTime = 0;
private final PointF mDownTouch = new PointF();
private final PointF mDownDelta = new PointF();
private final PointF mLastTouch = new PointF();
@@ -41,13 +53,22 @@
private final PointF mVelocity = new PointF();
private boolean mAllowTouches = true;
private boolean mIsUserInteracting = false;
+ // Set to true only if the multiple taps occur within the double tap timeout
+ private boolean mIsDoubleTap = false;
+ // Set to true only if a gesture
+ private boolean mIsWaitingForDoubleTap = false;
private boolean mIsDragging = false;
+ // The previous gesture was a drag
+ private boolean mPreviouslyDragging = false;
private boolean mStartedDragging = false;
private boolean mAllowDraggingOffscreen = false;
private int mActivePointerId;
- public PipTouchState(ViewConfiguration viewConfig) {
+ public PipTouchState(ViewConfiguration viewConfig, Handler handler,
+ Runnable doubleTapTimeoutCallback) {
mViewConfig = viewConfig;
+ mHandler = handler;
+ mDoubleTapTimeoutCallback = doubleTapTimeoutCallback;
}
/**
@@ -81,6 +102,14 @@
mDownTouch.set(mLastTouch);
mAllowDraggingOffscreen = true;
mIsUserInteracting = true;
+ mDownTouchTime = ev.getEventTime();
+ mIsDoubleTap = !mPreviouslyDragging &&
+ (mDownTouchTime - mLastDownTouchTime) < DOUBLE_TAP_TIMEOUT;
+ mIsWaitingForDoubleTap = false;
+ mLastDownTouchTime = mDownTouchTime;
+ if (mDoubleTapTimeoutCallback != null) {
+ mHandler.removeCallbacks(mDoubleTapTimeoutCallback);
+ }
break;
}
case MotionEvent.ACTION_MOVE: {
@@ -155,7 +184,11 @@
break;
}
+ mUpTouchTime = ev.getEventTime();
mLastTouch.set(ev.getX(pointerIndex), ev.getY(pointerIndex));
+ mPreviouslyDragging = mIsDragging;
+ mIsWaitingForDoubleTap = !mIsDoubleTap && !mIsDragging &&
+ (mUpTouchTime - mDownTouchTime) < DOUBLE_TAP_TIMEOUT;
// Fall through to clean up
}
@@ -251,6 +284,39 @@
return mAllowDraggingOffscreen;
}
+ /**
+ * @return whether this gesture is a double-tap.
+ */
+ public boolean isDoubleTap() {
+ return mIsDoubleTap;
+ }
+
+ /**
+ * @return whether this gesture will potentially lead to a following double-tap.
+ */
+ public boolean isWaitingForDoubleTap() {
+ return mIsWaitingForDoubleTap;
+ }
+
+ /**
+ * Schedules the callback to run if the next double tap does not occur. Only runs if
+ * isWaitingForDoubleTap() is true.
+ */
+ public void scheduleDoubleTapTimeoutCallback() {
+ if (mIsWaitingForDoubleTap) {
+ long delay = getDoubleTapTimeoutCallbackDelay();
+ mHandler.removeCallbacks(mDoubleTapTimeoutCallback);
+ mHandler.postDelayed(mDoubleTapTimeoutCallback, delay);
+ }
+ }
+
+ @VisibleForTesting long getDoubleTapTimeoutCallbackDelay() {
+ if (mIsWaitingForDoubleTap) {
+ return Math.max(0, DOUBLE_TAP_TIMEOUT - (mUpTouchTime - mDownTouchTime));
+ }
+ return -1;
+ }
+
private void initOrResetVelocityTracker() {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java b/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java
index 3d8f9ff..5f26093 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java
@@ -44,7 +44,10 @@
}
protected void updateIcon(ImageView iv, State state) {
- if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag))) {
+ if (!(state.icon instanceof SignalIcon)) {
+ super.updateIcon(iv, state);
+ return;
+ } else if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag))) {
mSignalDrawable.setLevel(((SignalIcon) state.icon).getState());
iv.setImageDrawable(mSignalDrawable);
iv.setTag(R.id.qs_icon_tag, state.icon);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
index d42b87b..142aab2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
@@ -22,6 +22,7 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
+import android.widget.TextView;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -44,6 +45,7 @@
private UserInfoController mUserInfoController;
private MultiUserSwitch mMultiUserSwitch;
+ private TextView mUserName;
private ImageView mMultiUserAvatar;
private UserGridView mUserGridView;
@@ -56,6 +58,7 @@
super.onFinishInflate();
mMultiUserSwitch = findViewById(R.id.multi_user_switch);
mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
+ mUserName = findViewById(R.id.user_name);
mUserInfoController = Dependency.get(UserInfoController.class);
@@ -89,6 +92,7 @@
@Override
public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
mMultiUserAvatar.setImageDrawable(picture);
+ mUserName.setText(name);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 6c95a80..5a3081c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -18,6 +18,7 @@
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
+import android.app.AlertDialog;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
@@ -35,6 +36,8 @@
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams;
import android.widget.LinearLayout;
import android.widget.Toolbar;
import android.widget.Toolbar.OnMenuItemClickListener;
@@ -48,7 +51,9 @@
import com.android.systemui.qs.QSContainerImpl;
import com.android.systemui.qs.QSDetailClipper;
import com.android.systemui.qs.QSTileHost;
+import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.KeyguardMonitor.Callback;
@@ -67,6 +72,7 @@
private static final String EXTRA_QS_CUSTOMIZING = "qs_customizing";
private final QSDetailClipper mClipper;
+ private final LightBarController mLightBarController;
private boolean isShown;
private QSTileHost mHost;
@@ -80,6 +86,7 @@
private int mX;
private int mY;
private boolean mOpening;
+ private boolean mIsShowingNavBackdrop;
public QSCustomizer(Context context, AttributeSet attrs) {
super(new ContextThemeWrapper(context, R.style.edit_theme), attrs);
@@ -114,6 +121,7 @@
DefaultItemAnimator animator = new DefaultItemAnimator();
animator.setMoveDuration(TileAdapter.MOVE_DURATION);
mRecyclerView.setItemAnimator(animator);
+ mLightBarController = Dependency.get(LightBarController.class);
updateNavBackDrop(getResources().getConfiguration());
}
@@ -125,11 +133,16 @@
private void updateNavBackDrop(Configuration newConfig) {
View navBackdrop = findViewById(R.id.nav_bar_background);
+ mIsShowingNavBackdrop = newConfig.smallestScreenWidthDp >= 600
+ || newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE;
if (navBackdrop != null) {
- boolean shouldShow = newConfig.smallestScreenWidthDp >= 600
- || newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE;
- navBackdrop.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
+ navBackdrop.setVisibility(mIsShowingNavBackdrop ? View.VISIBLE : View.GONE);
}
+ updateNavColors();
+ }
+
+ private void updateNavColors() {
+ mLightBarController.setQsCustomizing(mIsShowingNavBackdrop && isShown);
}
public void setHost(QSTileHost host) {
@@ -161,6 +174,7 @@
announceForAccessibility(mContext.getString(
R.string.accessibility_desc_quick_settings_edit));
Dependency.get(KeyguardMonitor.class).addCallback(mKeyguardCallback);
+ updateNavColors();
}
}
@@ -176,6 +190,7 @@
mNotifQsContainer.setCustomizerAnimating(false);
mNotifQsContainer.setCustomizerShowing(true);
Dependency.get(KeyguardMonitor.class).addCallback(mKeyguardCallback);
+ updateNavColors();
}
}
@@ -201,6 +216,7 @@
announceForAccessibility(mContext.getString(
R.string.accessibility_desc_quick_settings));
Dependency.get(KeyguardMonitor.class).removeCallback(mKeyguardCallback);
+ updateNavColors();
}
}
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 017365f..176112b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -31,6 +31,7 @@
import android.service.quicksettings.IQSTileService;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
+import android.text.format.DateUtils;
import android.util.Log;
import android.view.IWindowManager;
import android.view.WindowManagerGlobal;
@@ -51,6 +52,8 @@
public class CustomTile extends QSTileImpl<State> implements TileChangeListener {
public static final String PREFIX = "custom(";
+ private static final long CUSTOM_STALE_TIMEOUT = DateUtils.HOUR_IN_MILLIS;
+
private static final boolean DEBUG = false;
// We don't want to thrash binding and unbinding if the user opens and closes the panel a lot.
@@ -83,6 +86,11 @@
mUser = ActivityManager.getCurrentUser();
}
+ @Override
+ protected long getStaleTimeout() {
+ return CUSTOM_STALE_TIMEOUT + DateUtils.MINUTE_IN_MILLIS * mHost.indexOf(getTileSpec());
+ }
+
private void setTileIcon() {
try {
PackageManager pm = mContext.getPackageManager();
@@ -186,7 +194,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (mListening == listening) return;
mListening = listening;
try {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 672f2c2..576a447 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -17,12 +17,12 @@
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_CLICK;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_LONG_PRESS;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_SECONDARY_CLICK;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CONTEXT;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_POSITION;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-import android.R.attr;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
@@ -32,10 +32,12 @@
import android.os.Looper;
import android.os.Message;
import android.service.quicksettings.Tile;
+import android.text.format.DateUtils;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.Utils;
@@ -45,6 +47,7 @@
import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.plugins.qs.QSTile.State;
+import com.android.systemui.qs.PagedTileLayout.TilePage;
import com.android.systemui.qs.QSHost;
import java.util.ArrayList;
@@ -60,14 +63,18 @@
protected final String TAG = "Tile." + getClass().getSimpleName();
protected static final boolean DEBUG = Log.isLoggable("Tile", Log.DEBUG);
+ private static final long DEFAULT_STALE_TIMEOUT = 10 * DateUtils.MINUTE_IN_MILLIS;
+
protected final QSHost mHost;
protected final Context mContext;
- protected final H mHandler = new H(Dependency.get(Dependency.BG_LOOPER));
+ // @NonFinalForTesting
+ protected H mHandler = new H(Dependency.get(Dependency.BG_LOOPER));
protected final Handler mUiHandler = new Handler(Looper.getMainLooper());
private final ArraySet<Object> mListeners = new ArraySet<>();
private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
private final ArrayList<Callback> mCallbacks = new ArrayList<>();
+ private final Object mStaleListener = new Object();
protected TState mState = newTileState();
private TState mTmpState = newTileState();
private boolean mAnnounceNextStateChange;
@@ -93,6 +100,7 @@
protected QSTileImpl(QSHost host) {
mHost = host;
mContext = host.getContext();
+ handleStale(); // Tile was just created, must be stale.
}
/**
@@ -104,6 +112,7 @@
if (mListeners.add(listener) && mListeners.size() == 1) {
if (DEBUG) Log.d(TAG, "setListening " + true);
mHandler.obtainMessage(H.SET_LISTENING, 1, 0).sendToTarget();
+ refreshState(); // Ensure we get at least one refresh after listening.
}
} else {
if (mListeners.remove(listener) && mListeners.size() == 0) {
@@ -113,6 +122,15 @@
}
}
+ protected long getStaleTimeout() {
+ return DEFAULT_STALE_TIMEOUT;
+ }
+
+ @VisibleForTesting
+ protected void handleStale() {
+ setListening(mStaleListener, true);
+ }
+
public String getTileSpec() {
return mTileSpec;
}
@@ -180,9 +198,19 @@
logMaker.addTaggedData(FIELD_QS_VALUE, ((BooleanState) mState).value ? 1 : 0);
}
return logMaker.setSubtype(getMetricsCategory())
+ .addTaggedData(FIELD_CONTEXT, isFullQs())
.addTaggedData(FIELD_QS_POSITION, mHost.indexOf(mTileSpec));
}
+ private int isFullQs() {
+ for (Object listener : mListeners) {
+ if (TilePage.class.equals(listener.getClass())) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+
public void showDetail(boolean show) {
mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0).sendToTarget();
}
@@ -261,6 +289,9 @@
if (changed) {
handleStateChanged();
}
+ mHandler.removeMessages(H.STALE);
+ mHandler.sendEmptyMessageDelayed(H.STALE, getStaleTimeout());
+ setListening(mStaleListener, false);
}
private void handleStateChanged() {
@@ -314,11 +345,11 @@
handleRefreshState(null);
}
- protected abstract void setListening(boolean listening);
+ protected abstract void handleSetListening(boolean listening);
protected void handleDestroy() {
if (mListeners.size() != 0) {
- setListening(false);
+ handleSetListening(false);
}
mCallbacks.clear();
}
@@ -368,8 +399,10 @@
private static final int REMOVE_CALLBACKS = 12;
private static final int REMOVE_CALLBACK = 13;
private static final int SET_LISTENING = 14;
+ private static final int STALE = 15;
- private H(Looper looper) {
+ @VisibleForTesting
+ protected H(Looper looper) {
super(looper);
}
@@ -424,8 +457,11 @@
name = "handleClearState";
handleClearState();
} else if (msg.what == SET_LISTENING) {
- name = "setListening";
- setListening(msg.arg1 != 0);
+ name = "handleSetListening";
+ handleSetListening(msg.arg1 != 0);
+ } else if (msg.what == STALE) {
+ name = "handleStale";
+ handleStale();
} else {
throw new IllegalArgumentException("Unknown msg: " + msg.what);
}
@@ -439,15 +475,22 @@
public static class DrawableIcon extends Icon {
protected final Drawable mDrawable;
+ protected final Drawable mInvisibleDrawable;
public DrawableIcon(Drawable drawable) {
mDrawable = drawable;
+ mInvisibleDrawable = drawable.getConstantState().newDrawable();
}
@Override
public Drawable getDrawable(Context context) {
return mDrawable;
}
+
+ @Override
+ public Drawable getInvisibleDrawable(Context context) {
+ return mInvisibleDrawable;
+ }
}
public static class DrawableIconWithRes extends DrawableIcon {
@@ -503,7 +546,7 @@
}
}
- protected class AnimationIcon extends ResourceIcon {
+ protected static class AnimationIcon extends ResourceIcon {
private final int mAnimatedResId;
public AnimationIcon(int resId, int staticResId) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
index 13912fe..97e9c3d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
@@ -48,6 +48,7 @@
mSlash = null;
super.setImageDrawable(null);
} else if (mSlash == null) {
+ setImageLevel(drawable.getLevel());
super.setImageDrawable(drawable);
} else {
mSlash.setAnimationEnabled(mAnimationEnabled);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
index 2e7012e..bef1aff 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
@@ -110,7 +110,7 @@
}
}
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (mListening == listening) return;
mListening = listening;
if (listening) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
index 3f419a8..95504ed 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
@@ -55,7 +55,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mBatteryController.addCallback(this);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index bc6233d..8d62f2a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -76,7 +76,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mController.addCallback(mCallback);
} else {
@@ -136,7 +136,9 @@
int batteryLevel = lastDevice.getBatteryLevel();
if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
BluetoothDeviceLayerDrawable drawable = createLayerDrawable(mContext,
- R.drawable.ic_qs_bluetooth_connected, batteryLevel);
+ R.drawable.ic_qs_bluetooth_connected, batteryLevel,
+ mContext.getResources().getFraction(
+ R.fraction.bt_battery_scale_fraction, 1, 1));
state.icon = new DrawableIcon(drawable);
}
}
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 2fc9fc7..fb396b9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -91,9 +91,9 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (mController == null) return;
- if (DEBUG) Log.d(TAG, "setListening " + listening);
+ if (DEBUG) Log.d(TAG, "handleSetListening " + listening);
if (listening) {
mController.addCallback(mCallback);
mKeyguard.addCallback(mCallback);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 0e0f949..2e389ba 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -92,7 +92,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mController.addCallback(mSignalCallback);
} else {
@@ -112,6 +112,9 @@
@Override
protected void handleClick() {
+ if (getState().state == Tile.STATE_UNAVAILABLE) {
+ return;
+ }
if (mDataController.isMobileDataEnabled()) {
if (mKeyguardMonitor.isSecure() && !mKeyguardMonitor.canSkipBouncer()) {
mActivityStarter.postQSRunnableDismissingKeyguard(this::showDisableDialog);
@@ -183,9 +186,14 @@
state.value = mDataController.isMobileDataSupported()
&& mDataController.isMobileDataEnabled();
- state.icon = new SignalIcon(cb.mobileSignalIconId);
- if (cb.airplaneModeEnabled) {
- state.state = Tile.STATE_INACTIVE;
+ if (cb.noSim) {
+ state.icon = ResourceIcon.get(R.drawable.ic_qs_no_sim);
+ } else {
+ state.icon = new SignalIcon(cb.mobileSignalIconId);
+ }
+
+ if (cb.airplaneModeEnabled | cb.noSim) {
+ state.state = Tile.STATE_UNAVAILABLE;
} else {
state.state = Tile.STATE_ACTIVE;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
index 40fe484..b93f1c2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
@@ -63,7 +63,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
mSetting.setListening(listening);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
index 8b62beb..a102696 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
@@ -45,7 +45,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mDataSaverController.addCallback(this);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 5938749..9e265e22 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -232,7 +232,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (mListening == listening) return;
mListening = listening;
if (mListening) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
index e6ac908..f2ead1c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
@@ -54,7 +54,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mFlashlightController.addCallback(this);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index c17573d..910b6b1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -74,7 +74,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (mListening == listening) return;
mListening = listening;
if (listening) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
index 00cfbfa..4f4004c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
@@ -76,7 +76,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
index 5e66334..c35f591 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
@@ -55,7 +55,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mController.addCallback(mCallback);
mKeyguard.addCallback(mCallback);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
index 6500740..b3ff4e5b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
@@ -51,7 +51,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
mListening = listening;
if (mListening) {
mContext.registerReceiver(mNfcReceiver,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
index 2a12769..4c20361 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -95,7 +95,7 @@
}
@Override
- protected void setListening(boolean listening) {
+ protected void handleSetListening(boolean listening) {
mIsListening = listening;
if (listening) {
mController.setListener(this);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
index fb937bd..1e00894 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
@@ -62,7 +62,7 @@
return new BooleanState();
}
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (mController == null) return;
if (listening) {
mController.addCallback(mCallback);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
index d6043f4..bde1c98 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
@@ -69,7 +69,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mUserInfoController.addCallback(this);
} else {
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 136cf21..33b1512 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -75,7 +75,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mController.addCallback(mSignalCallback);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
index 38821f6..5f7d6fb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
@@ -48,7 +48,7 @@
}
@Override
- public void setListening(boolean listening) {
+ public void handleSetListening(boolean listening) {
if (listening) {
mProfileController.addCallback(this);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index 3e1522d..406bcac 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -567,9 +567,11 @@
@Override
public void appTransitionFinished() {
- // Fallback, reset the flag once an app transition ends
- EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(
- false /* waitingForTransitionStart */));
+ if (!Recents.getConfiguration().isLowRamDevice) {
+ // Fallback, reset the flag once an app transition ends
+ EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(
+ false /* waitingForTransitionStart */));
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index f844866..f545556 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -65,6 +65,7 @@
import com.android.systemui.recents.events.activity.LaunchTaskFailedEvent;
import com.android.systemui.recents.events.activity.LaunchTaskSucceededEvent;
import com.android.systemui.recents.events.activity.MultiWindowStateChangedEvent;
+import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
import com.android.systemui.recents.events.activity.ToggleRecentsEvent;
import com.android.systemui.recents.events.component.ActivityUnpinnedEvent;
import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
@@ -119,6 +120,7 @@
private boolean mFinishedOnStartup;
private boolean mIgnoreAltTabRelease;
private boolean mIsVisible;
+ private boolean mRecentsStartRequested;
private Configuration mLastConfig;
// Top level views
@@ -416,6 +418,7 @@
launchState.launchedFromHome = false;
onEnterAnimationComplete();
}
+ mRecentsStartRequested = false;
}
@Override
@@ -449,7 +452,6 @@
* Reloads the stack views upon launching Recents.
*/
private void reloadStackView() {
-
// If the Recents component has preloaded a load plan, then use that to prevent
// reconstructing the task stack
RecentsTaskLoader loader = Recents.getTaskLoader();
@@ -572,7 +574,9 @@
MetricsLogger.hidden(this, MetricsEvent.OVERVIEW_ACTIVITY);
Recents.getTaskLoader().getHighResThumbnailLoader().setVisible(false);
- if (!isChangingConfigurations()) {
+ // When recents starts again before onStop, do not reset launch flags so entrance animation
+ // can run
+ if (!isChangingConfigurations() && !mRecentsStartRequested) {
// Workaround for b/22542869, if the RecentsActivity is started again, but without going
// through SystemUI, we need to reset the config launch flags to ensure that we do not
// wait on the system to send a signal that was never queued.
@@ -718,6 +722,10 @@
MetricsLogger.action(this, MetricsEvent.ACTION_OVERVIEW_PAGE);
}
+ public final void onBusEvent(RecentsActivityStartingEvent event) {
+ mRecentsStartRequested = true;
+ }
+
public final void onBusEvent(UserInteractionEvent event) {
// Stop the fast-toggle dozer
mIterateTrigger.stopDozing();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 71f06cb..c44cd72 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -205,6 +205,10 @@
mStackButtonShadowDistance.x, mStackButtonShadowDistance.y,
mStackButtonShadowColor);
}
+ if (Recents.getConfiguration().isLowRamDevice) {
+ int bgColor = Utils.getColorAttr(mContext, R.attr.clearAllBackgroundColor);
+ mStackActionButton.setBackgroundColor(bgColor);
+ }
}
// Let's also require dark status and nav bars if the text is dark
@@ -955,8 +959,8 @@
int left, top;
if (Recents.getConfiguration().isLowRamDevice) {
Rect windowRect = Recents.getSystemServices().getWindowRect();
- left = (windowRect.width() - mSystemInsets.left - mSystemInsets.right
- - mStackActionButton.getMeasuredWidth()) / 2;
+ int spaceLeft = windowRect.width() - mSystemInsets.left - mSystemInsets.right;
+ left = (spaceLeft - mStackActionButton.getMeasuredWidth()) / 2 + mSystemInsets.left;
top = windowRect.height() - (mStackActionButton.getMeasuredHeight()
+ mSystemInsets.bottom + mStackActionButton.getPaddingBottom() / 2);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index a633a3e..8899e30 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -2396,10 +2396,14 @@
}
private void updateStackActionButtonVisibility() {
+ if (Recents.getConfiguration().isLowRamDevice) {
+ return;
+ }
+
// Always show the button in grid layout.
if (useGridLayout() ||
(mStackScroller.getStackScroll() < SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD &&
- mStack.getTaskCount() > 0 && !Recents.getConfiguration().isLowRamDevice)) {
+ mStack.getTaskCount() > 0)) {
EventBus.getDefault().send(new ShowStackActionButtonEvent(false /* translate */));
} else {
EventBus.getDefault().send(new HideStackActionButtonEvent());
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/lowram/TaskStackLowRamLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/lowram/TaskStackLowRamLayoutAlgorithm.java
index 52fa7b5..17e6b9e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/lowram/TaskStackLowRamLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/lowram/TaskStackLowRamLayoutAlgorithm.java
@@ -126,7 +126,6 @@
return transformOut;
}
boolean visible = true;
- int x = mPaddingLeftRight;
int y;
if (taskCount > 1) {
y = getTaskTopFromIndex(taskIndex) - percentageToScroll(stackScroll);
@@ -255,7 +254,7 @@
transformOut.dimAlpha = 0f;
transformOut.viewOutlineAlpha = 1f;
transformOut.rect.set(getTaskRect());
- transformOut.rect.offset(mPaddingLeftRight, y);
+ transformOut.rect.offset(mPaddingLeftRight + mSystemInsets.left, y);
Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale);
transformOut.visible = visible;
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index a35310f..991c3c8 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -16,11 +16,16 @@
package com.android.systemui.screenshot;
+import static com.android.systemui.screenshot.GlobalScreenshot.SHARING_INTENT;
+import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_SCREENSHOT;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.app.ActivityManager;
+import android.app.ActivityOptions;
import android.app.admin.DevicePolicyManager;
import android.app.Notification;
import android.app.Notification.BigPictureStyle;
@@ -48,6 +53,7 @@
import android.os.Environment;
import android.os.PowerManager;
import android.os.Process;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
@@ -277,14 +283,13 @@
sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
- // Create a share action for the notification
- PendingIntent chooseAction = PendingIntent.getBroadcast(context, 0,
- new Intent(context, GlobalScreenshot.TargetChosenReceiver.class),
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
- Intent chooserIntent = Intent.createChooser(sharingIntent, null,
- chooseAction.getIntentSender())
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
- PendingIntent shareAction = PendingIntent.getActivity(context, 0, chooserIntent,
+ // Create a share action for the notification. Note, we proxy the call to ShareReceiver
+ // because RemoteViews currently forces an activity options on the PendingIntent being
+ // launched, and since we don't want to trigger the share sheet in this case, we will
+ // start the chooser activitiy directly in ShareReceiver.
+ PendingIntent shareAction = PendingIntent.getBroadcast(context, 0,
+ new Intent(context, GlobalScreenshot.ShareReceiver.class)
+ .putExtra(SHARING_INTENT, sharingIntent),
PendingIntent.FLAG_CANCEL_CURRENT);
Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder(
R.drawable.ic_screenshot_share,
@@ -292,7 +297,7 @@
mNotificationBuilder.addAction(shareActionBuilder.build());
// Create a delete action for the notification
- PendingIntent deleteAction = PendingIntent.getBroadcast(context, 0,
+ PendingIntent deleteAction = PendingIntent.getBroadcast(context, 0,
new Intent(context, GlobalScreenshot.DeleteScreenshotReceiver.class)
.putExtra(GlobalScreenshot.SCREENSHOT_URI_ID, uri.toString()),
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
@@ -403,6 +408,7 @@
class GlobalScreenshot {
static final String SCREENSHOT_URI_ID = "android:screenshot_uri_id";
+ static final String SHARING_INTENT = "android:screenshot_sharing_intent";
private static final int SCREENSHOT_FLASH_TO_PEAK_DURATION = 130;
private static final int SCREENSHOT_DROP_IN_DURATION = 430;
@@ -897,6 +903,30 @@
}
/**
+ * Receiver to proxy the share intent.
+ */
+ public static class ShareReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ try {
+ ActivityManager.getService().closeSystemDialogs(SYSTEM_DIALOG_REASON_SCREENSHOT);
+ } catch (RemoteException e) {
+ }
+
+ Intent sharingIntent = intent.getParcelableExtra(SHARING_INTENT);
+ PendingIntent chooseAction = PendingIntent.getBroadcast(context, 0,
+ new Intent(context, GlobalScreenshot.TargetChosenReceiver.class),
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
+ Intent chooserIntent = Intent.createChooser(sharingIntent, null,
+ chooseAction.getIntentSender())
+ .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
+ ActivityOptions opts = ActivityOptions.makeBasic();
+ opts.setDisallowEnterPictureInPictureWhileLaunching(true);
+ context.startActivityAsUser(chooserIntent, opts.toBundle(), UserHandle.CURRENT);
+ }
+ }
+
+ /**
* Removes the notification for a screenshot after a share target is chosen.
*/
public static class TargetChosenReceiver extends BroadcastReceiver {
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index bf98a83..6bfef20 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -66,9 +66,7 @@
import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.events.activity.DockedTopTaskEvent;
import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
-import com.android.systemui.recents.events.activity.ToggleRecentsEvent;
import com.android.systemui.recents.events.activity.UndockingTaskEvent;
-import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
import com.android.systemui.recents.events.ui.RecentsGrowingEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.stackdivider.events.StartedDragingEvent;
@@ -124,7 +122,7 @@
private int mTouchSlop;
private boolean mBackgroundLifted;
private boolean mIsInMinimizeInteraction;
- private int mDividerPositionBeforeMinimized;
+ private SnapTarget mSnapTargetBeforeMinimized;
private int mDividerInsets;
private int mDisplayWidth;
@@ -318,6 +316,12 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
EventBus.getDefault().register(this);
+
+ // Save the current target if not minimized once attached to window
+ if (mHomeStackResizable && mDockSide != WindowManager.DOCKED_INVALID
+ && !mIsInMinimizeInteraction) {
+ saveSnapTargetBeforeMinimized(mSnapTargetBeforeMinimized);
+ }
}
@Override
@@ -381,8 +385,10 @@
(isHorizontalDivision() ? mDisplayHeight : mDisplayWidth));
mSnapAlgorithm = null;
initializeSnapAlgorithm();
- mDividerPositionBeforeMinimized = mSnapAlgorithm.calculateNonDismissingSnapTarget(position)
- .position;
+
+ // Set the snap target before minimized but do not save until divider is attached and not
+ // minimized because it does not know its minimized state yet.
+ mSnapTargetBeforeMinimized = mSnapAlgorithm.calculateNonDismissingSnapTarget(position);
}
public WindowManagerProxy getWindowManagerProxy() {
@@ -601,6 +607,11 @@
mEntranceAnimationRunning = false;
mExitAnimationRunning = false;
EventBus.getDefault().send(new StoppedDragingEvent());
+
+ // Record last snap target the divider moved to
+ if (mHomeStackResizable && !mIsInMinimizeInteraction) {
+ saveSnapTargetBeforeMinimized(snapTarget);
+ }
};
Runnable notCancelledEndAction = () -> {
// Reset minimized divider position after unminimized state animation finishes
@@ -629,15 +640,15 @@
delay = mSfChoreographer.getSurfaceFlingerOffsetMs();
}
if (delay == 0) {
- endAction.run();
if (!mCancelled) {
notCancelledEndAction.run();
}
+ endAction.run();
} else {
- mHandler.postDelayed(endAction, delay);
if (!mCancelled) {
mHandler.postDelayed(notCancelledEndAction, delay);
}
+ mHandler.postDelayed(endAction, delay);
}
}
});
@@ -744,12 +755,9 @@
if (mIsInMinimizeInteraction != minimized) {
if (minimized) {
mIsInMinimizeInteraction = true;
- int position = mMinimizedSnapAlgorithm.getMiddleTarget().position;
- resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget());
+ resizeStack(mMinimizedSnapAlgorithm.getMiddleTarget());
} else {
- resizeStack(mDividerPositionBeforeMinimized, mDividerPositionBeforeMinimized,
- mSnapAlgorithm.calculateNonDismissingSnapTarget(
- mDividerPositionBeforeMinimized));
+ resizeStack(mSnapTargetBeforeMinimized);
mIsInMinimizeInteraction = false;
}
}
@@ -786,20 +794,15 @@
mDockedStackMinimized = minimized;
} else if (mDockedStackMinimized != minimized) {
mIsInMinimizeInteraction = true;
- if (minimized && (mCurrentAnimator == null || !mCurrentAnimator.isRunning())
- && (mDividerPositionBeforeMinimized <= 0 || !mAdjustedForIme)) {
- savePositionBeforeMinimized();
- }
mMinimizedSnapAlgorithm = null;
mDockedStackMinimized = minimized;
initializeSnapAlgorithm();
stopDragging(minimized
- ? mDividerPositionBeforeMinimized
+ ? mSnapTargetBeforeMinimized.position
: getCurrentPosition(),
minimized
? mMinimizedSnapAlgorithm.getMiddleTarget()
- : mSnapAlgorithm.calculateNonDismissingSnapTarget(
- mDividerPositionBeforeMinimized),
+ : mSnapTargetBeforeMinimized,
animDuration, Interpolators.FAST_OUT_SLOW_IN, 0);
setAdjustedForIme(false, animDuration);
}
@@ -844,17 +847,11 @@
.setDuration(animDuration)
.start();
mAdjustedForIme = adjustedForIme;
-
- // Only get new position if home stack is resizable, ime is open and not minimized
- // (including the animation)
- if (mHomeStackResizable && adjustedForIme && !mIsInMinimizeInteraction) {
- savePositionBeforeMinimized();
- }
}
- private void savePositionBeforeMinimized() {
- mDividerPositionBeforeMinimized = getCurrentPosition();
- mState.mRatioPositionBeforeMinimized = (float) mDividerPositionBeforeMinimized /
+ private void saveSnapTargetBeforeMinimized(SnapTarget target) {
+ mSnapTargetBeforeMinimized = target;
+ mState.mRatioPositionBeforeMinimized = (float) target.position /
(isHorizontalDivision() ? mDisplayHeight : mDisplayWidth);
}
@@ -872,7 +869,6 @@
updateDisplayInfo();
}
-
public void notifyDockSideChanged(int newDockSide) {
mDockSide = newDockSide;
mMinimizedShadow.setDockSide(mDockSide);
@@ -934,6 +930,10 @@
mSfChoreographer.scheduleAtSfVsync(mHandler, message);
}
+ private void resizeStack(SnapTarget taskSnapTarget) {
+ resizeStack(taskSnapTarget.position, taskSnapTarget.position, taskSnapTarget);
+ }
+
public void resizeStack(int position, int taskPosition, SnapTarget taskSnapTarget) {
if (mRemoved) {
// This divider view has been removed so shouldn't have any additional influence.
@@ -952,8 +952,9 @@
mLastResizeRect.set(mDockedRect);
if (mHomeStackResizable && mIsInMinimizeInteraction) {
- calculateBoundsForPosition(mDividerPositionBeforeMinimized, mDockSide, mDockedTaskRect);
- calculateBoundsForPosition(mDividerPositionBeforeMinimized,
+ calculateBoundsForPosition(mSnapTargetBeforeMinimized.position, mDockSide,
+ mDockedTaskRect);
+ calculateBoundsForPosition(mSnapTargetBeforeMinimized.position,
DockedDividerUtils.invertDockSide(mDockSide), mOtherTaskRect);
mWindowManagerProxy.resizeDockedStack(mDockedRect, mDockedTaskRect, mDockedTaskRect,
mOtherTaskRect, null);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 7bc1a39..7067bc1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -80,6 +80,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.function.BooleanSupplier;
public class ExpandableNotificationRow extends ActivatableNotificationView
implements PluginListener<NotificationMenuRowPlugin> {
@@ -93,6 +94,7 @@
}
private LayoutListener mLayoutListener;
+ private boolean mDark;
private boolean mLowPriorityStateUpdated;
private final NotificationInflater mNotificationInflater;
private int mIconTransformContentShift;
@@ -175,6 +177,11 @@
private boolean mGroupExpansionChanging;
/**
+ * A supplier that returns true if keyguard is secure.
+ */
+ private BooleanSupplier mSecureStateProvider;
+
+ /**
* Whether or not a notification that is not part of a group of notifications can be manually
* expanded by the user.
*/
@@ -395,6 +402,14 @@
mAboveShelfChangedListener = aboveShelfChangedListener;
}
+ /**
+ * Sets a supplier that can determine whether the keyguard is secure or not.
+ * @param secureStateProvider A function that returns true if keyguard is secure.
+ */
+ public void setSecureStateProvider(BooleanSupplier secureStateProvider) {
+ mSecureStateProvider = secureStateProvider;
+ }
+
@Override
public boolean isDimmable() {
if (!getShowingLayout().isDimmable()) {
@@ -1454,6 +1469,7 @@
@Override
public void setDark(boolean dark, boolean fade, long delay) {
super.setDark(dark, fade, delay);
+ mDark = dark;
if (!mIsHeadsUp) {
// Only fade the showing view of the pulsing notification.
fade = false;
@@ -1468,6 +1484,17 @@
updateShelfIconColor();
}
+ /**
+ * Tap sounds should not be played when we're unlocking.
+ * Doing so would cause audio collision and the system would feel unpolished.
+ */
+ @Override
+ public boolean isSoundEffectsEnabled() {
+ final boolean mute = mDark && mSecureStateProvider != null &&
+ !mSecureStateProvider.getAsBoolean();
+ return !mute && super.isSoundEffectsEnabled();
+ }
+
public boolean isExpandable() {
if (mIsSummaryWithChildren && !mShowingPublic) {
return !mChildrenExpanded;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 1ffb3b5..3b23a0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -126,7 +126,7 @@
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE
| PackageManager.MATCH_DIRECT_BOOT_AWARE);
if (info != null) {
- mAppUid = info.uid;
+ mAppUid = sbn.getUid();
mAppName = String.valueOf(pm.getApplicationLabel(info));
pkgicon = pm.getApplicationIcon(info);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 5eefe9a..5557dde 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -22,10 +22,12 @@
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.graphics.Rect;
import android.os.SystemProperties;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityNodeInfo;
import com.android.systemui.Interpolators;
@@ -53,6 +55,7 @@
SystemProperties.getBoolean("debug.icon_opening_animations", true);
private static final boolean ICON_ANMATIONS_WHILE_SCROLLING
= SystemProperties.getBoolean("debug.icon_scroll_animations", true);
+ private static final int TAG_CONTINUOUS_CLIPPING = R.id.continuous_clipping_tag;
private ViewInvertHelper mViewInvertHelper;
private boolean mDark;
private NotificationIconContainer mShelfIcons;
@@ -305,6 +308,16 @@
mShelfIcons.setSpeedBumpIndex(mAmbientState.getSpeedBumpIndex());
mShelfIcons.calculateIconTranslations();
mShelfIcons.applyIconStates();
+ for (int i = 0; i < mHostLayout.getChildCount(); i++) {
+ View child = mHostLayout.getChildAt(i);
+ if (!(child instanceof ExpandableNotificationRow)
+ || child.getVisibility() == GONE) {
+ continue;
+ }
+ ExpandableNotificationRow row = (ExpandableNotificationRow) child;
+ updateIconClipAmount(row);
+ updateContinuousClipping(row);
+ }
boolean hideBackground = numViewsInShelf < 1.0f;
setHideBackground(hideBackground || backgroundForceHidden);
if (mNotGoneIndex == -1) {
@@ -312,6 +325,43 @@
}
}
+ private void updateIconClipAmount(ExpandableNotificationRow row) {
+ float maxTop = row.getTranslationY();
+ StatusBarIconView icon = row.getEntry().expandedIcon;
+ float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY();
+ if (shelfIconPosition < maxTop) {
+ int top = (int) (maxTop - shelfIconPosition);
+ Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight()));
+ icon.setClipBounds(clipRect);
+ } else {
+ icon.setClipBounds(null);
+ }
+ }
+
+ private void updateContinuousClipping(final ExpandableNotificationRow row) {
+ StatusBarIconView icon = row.getEntry().expandedIcon;
+ boolean needsContinuousClipping = ViewState.isAnimatingY(icon);
+ boolean isContinuousClipping = icon.getTag(TAG_CONTINUOUS_CLIPPING) != null;
+ if (needsContinuousClipping && !isContinuousClipping) {
+ ViewTreeObserver.OnPreDrawListener predrawListener =
+ new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ boolean animatingY = ViewState.isAnimatingY(icon);
+ if (!animatingY || !icon.isAttachedToWindow()) {
+ icon.getViewTreeObserver().removeOnPreDrawListener(this);
+ icon.setTag(TAG_CONTINUOUS_CLIPPING, null);
+ return true;
+ }
+ updateIconClipAmount(row);
+ return true;
+ }
+ };
+ icon.getViewTreeObserver().addOnPreDrawListener(predrawListener);
+ icon.setTag(TAG_CONTINUOUS_CLIPPING, predrawListener);
+ }
+ }
+
private void updateNotificationClipHeight(ExpandableNotificationRow row,
float notificationClipEnd) {
float viewEnd = row.getTranslationY() + row.getActualHeight();
@@ -330,6 +380,15 @@
}
}
+ @Override
+ public void setFakeShadowIntensity(float shadowIntensity, float outlineAlpha, int shadowYEnd,
+ int outlineTranslation) {
+ if (!mHasItemsInStableShelf) {
+ shadowIntensity = 0.0f;
+ }
+ super.setFakeShadowIntensity(shadowIntensity, outlineAlpha, shadowYEnd, outlineTranslation);
+ }
+
/**
* @return the icon amount how much this notification is in the shelf;
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 25f3e25..759d2cf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -43,6 +43,7 @@
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.policy.IconLogger;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;
@@ -65,6 +66,7 @@
private static final String SLOT_MOBILE = "mobile";
private static final String SLOT_WIFI = "wifi";
private static final String SLOT_ETHERNET = "ethernet";
+ private static final String SLOT_VPN = "vpn";
private final NetworkController mNetworkController;
private final SecurityController mSecurityController;
@@ -117,6 +119,8 @@
private boolean mActivityEnabled;
private boolean mForceBlockWifi;
+ private final IconLogger mIconLogger = Dependency.get(IconLogger.class);
+
public SignalClusterView(Context context) {
this(context, null);
}
@@ -447,14 +451,15 @@
private void apply() {
if (mWifiGroup == null) return;
- mVpn.setVisibility(mVpnVisible ? View.VISIBLE : View.GONE);
if (mVpnVisible) {
if (mLastVpnIconId != mVpnIconId) {
setIconForView(mVpn, mVpnIconId);
mLastVpnIconId = mVpnIconId;
}
+ mIconLogger.onIconShown(SLOT_VPN);
mVpn.setVisibility(View.VISIBLE);
} else {
+ mIconLogger.onIconHidden(SLOT_VPN);
mVpn.setVisibility(View.GONE);
}
if (DEBUG) Log.d(TAG, String.format("vpn: %s", mVpnVisible ? "VISIBLE" : "GONE"));
@@ -466,8 +471,10 @@
mLastEthernetIconId = mEthernetIconId;
}
mEthernetGroup.setContentDescription(mEthernetDescription);
+ mIconLogger.onIconShown(SLOT_ETHERNET);
mEthernetGroup.setVisibility(View.VISIBLE);
} else {
+ mIconLogger.onIconHidden(SLOT_ETHERNET);
mEthernetGroup.setVisibility(View.GONE);
}
@@ -481,9 +488,11 @@
setIconForView(mWifiDark, mWifiStrengthId);
mLastWifiStrengthId = mWifiStrengthId;
}
+ mIconLogger.onIconShown(SLOT_WIFI);
mWifiGroup.setContentDescription(mWifiDescription);
mWifiGroup.setVisibility(View.VISIBLE);
} else {
+ mIconLogger.onIconHidden(SLOT_WIFI);
mWifiGroup.setVisibility(View.GONE);
}
@@ -505,6 +514,11 @@
}
}
}
+ if (anyMobileVisible) {
+ mIconLogger.onIconShown(SLOT_MOBILE);
+ } else {
+ mIconLogger.onIconHidden(SLOT_MOBILE);
+ }
if (mIsAirplaneMode) {
if (mLastAirplaneIconId != mAirplaneIconId) {
@@ -512,8 +526,10 @@
mLastAirplaneIconId = mAirplaneIconId;
}
mAirplane.setContentDescription(mAirplaneContentDescription);
+ mIconLogger.onIconShown(SLOT_AIRPLANE);
mAirplane.setVisibility(View.VISIBLE);
} else {
+ mIconLogger.onIconHidden(SLOT_AIRPLANE);
mAirplane.setVisibility(View.GONE);
}
@@ -529,7 +545,13 @@
mWifiSignalSpacer.setVisibility(View.GONE);
}
- mNoSimsCombo.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE);
+ if (mNoSimsVisible) {
+ mIconLogger.onIconShown(SLOT_MOBILE);
+ mNoSimsCombo.setVisibility(View.VISIBLE);
+ } else {
+ mIconLogger.onIconHidden(SLOT_MOBILE);
+ mNoSimsCombo.setVisibility(View.GONE);
+ }
boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode
|| anyMobileVisible || mVpnVisible || mEthernetVisible;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
index fcc982ea..b95b8a3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
@@ -114,7 +114,6 @@
mIcon = mView.findViewById(com.android.internal.R.id.icon);
mHeaderText = mView.findViewById(com.android.internal.R.id.header_text);
mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button);
- mExpandButton.setLabeledBy(mRow);
mWorkProfileImage = mView.findViewById(com.android.internal.R.id.profile_badge);
mColor = resolveColor(mExpandButton);
mNotificationHeader = mView.findViewById(com.android.internal.R.id.notification_header);
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 f379a46..1f44abe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -41,8 +41,6 @@
private static final boolean DEBUG = false;
private static final boolean DEBUG_COLORS = false;
- public static final boolean HIGH_END = ActivityManager.isHighEndGfx();
-
public static final int MODE_OPAQUE = 0;
public static final int MODE_SEMI_TRANSPARENT = 1;
public static final int MODE_TRANSLUCENT = 2;
@@ -66,9 +64,7 @@
mTag = "BarTransitions." + view.getClass().getSimpleName();
mView = view;
mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId);
- if (HIGH_END) {
- mView.setBackground(mBarBackground);
- }
+ mView.setBackground(mBarBackground);
}
public int getMode() {
@@ -89,7 +85,7 @@
public boolean isAlwaysOpaque() {
// Low-end devices do not support translucent modes, fallback to opaque
- return !HIGH_END || mAlwaysOpaque;
+ return mAlwaysOpaque;
}
public void transitionTo(int mode, boolean animate) {
@@ -109,9 +105,7 @@
}
protected void onTransition(int oldMode, int newMode, boolean animate) {
- if (HIGH_END) {
- applyModeBackground(oldMode, newMode, animate);
- }
+ applyModeBackground(oldMode, newMode, animate);
}
protected void applyModeBackground(int oldMode, int newMode, boolean animate) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index 8c923cb..2c3f452 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -161,10 +161,6 @@
showNotificationIconArea(animate);
}
}
- if (!BarTransitions.HIGH_END) {
- int mask = DISABLE_NOTIFICATION_ICONS | DISABLE_SYSTEM_INFO;
- getView().setVisibility((mDisabled1 & mask) == mask ? View.GONE : View.VISIBLE);
- }
}
protected int adjustDisableFlags(int state) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
index 316d229..91369db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -85,6 +85,11 @@
public static final int MODE_DISMISS_BOUNCER = 6;
/**
+ * Mode in which fingerprint wakes and unlocks the device from a dream.
+ */
+ public static final int MODE_WAKE_AND_UNLOCK_FROM_DREAM = 7;
+
+ /**
* How much faster we collapse the lockscreen when authenticating with fingerprint.
*/
private static final float FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR = 1.1f;
@@ -193,6 +198,8 @@
}
public void startWakeAndUnlock(int mode) {
+ // TODO(b/62444020): remove when this bug is fixed
+ Log.v(TAG, "startWakeAndUnlock(" + mode + ")");
boolean wasDeviceInteractive = mUpdateMonitor.isDeviceInteractive();
mMode = mode;
mHasScreenTurnedOnSinceAuthenticating = false;
@@ -230,16 +237,19 @@
}
Trace.endSection();
break;
+ case MODE_WAKE_AND_UNLOCK_FROM_DREAM:
case MODE_WAKE_AND_UNLOCK_PULSING:
case MODE_WAKE_AND_UNLOCK:
if (mMode == MODE_WAKE_AND_UNLOCK_PULSING) {
Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING");
mStatusBar.updateMediaMetaData(false /* metaDataChanged */,
true /* allowEnterAnimation */);
- } else {
+ } else if (mMode == MODE_WAKE_AND_UNLOCK){
Trace.beginSection("MODE_WAKE_AND_UNLOCK");
-
mDozeScrimController.abortDoze();
+ } else {
+ Trace.beginSection("MODE_WAKE_AND_UNLOCK_FROM_DREAM");
+ mUpdateMonitor.awakenFromDream();
}
mStatusBarWindowManager.setStatusBarFocusable(false);
mKeyguardViewMediator.onWakeAndUnlocking();
@@ -299,6 +309,7 @@
private int calculateMode() {
boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithFingerprintAllowed();
+ boolean deviceDreaming = mUpdateMonitor.isDreaming();
if (!mUpdateMonitor.isDeviceInteractive()) {
if (!mStatusBarKeyguardViewManager.isShowing()) {
@@ -311,6 +322,9 @@
return MODE_SHOW_BOUNCER;
}
}
+ if (unlockingAllowed && deviceDreaming) {
+ return MODE_WAKE_AND_UNLOCK_FROM_DREAM;
+ }
if (mStatusBarKeyguardViewManager.isShowing()) {
if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) {
return MODE_DISMISS_BOUNCER;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index fd95cc4..99debee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -27,6 +27,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
+import android.view.WindowInsets;
import android.view.accessibility.AccessibilityEvent;
import com.android.internal.widget.LockPatternUtils;
@@ -69,6 +70,7 @@
}
};
private final Runnable mRemoveViewRunnable = this::removeView;
+ private int mStatusBarHeight;
public KeyguardBouncer(Context context, ViewMediatorCallback callback,
LockPatternUtils lockPatternUtils, ViewGroup container,
@@ -128,7 +130,9 @@
mRoot.setVisibility(View.VISIBLE);
mKeyguardView.onResume();
showPromptReason(mBouncerPromptReason);
- if (mKeyguardView.getHeight() != 0) {
+ // We might still be collapsed and the view didn't have time to layout yet or still
+ // be small, let's wait on the predraw to do the animation in that case.
+ if (mKeyguardView.getHeight() != 0 && mKeyguardView.getHeight() != mStatusBarHeight) {
mKeyguardView.startAppearAnimation();
} else {
mKeyguardView.getViewTreeObserver().addOnPreDrawListener(
@@ -247,12 +251,18 @@
removeView();
mHandler.removeCallbacks(mRemoveViewRunnable);
mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null);
- mKeyguardView = (KeyguardHostView) mRoot.findViewById(R.id.keyguard_host_view);
+ mKeyguardView = mRoot.findViewById(R.id.keyguard_host_view);
mKeyguardView.setLockPatternUtils(mLockPatternUtils);
mKeyguardView.setViewMediatorCallback(mCallback);
mContainer.addView(mRoot, mContainer.getChildCount());
+ mStatusBarHeight = mRoot.getResources().getDimensionPixelOffset(
+ com.android.systemui.R.dimen.status_bar_height);
mRoot.setVisibility(View.INVISIBLE);
- mRoot.dispatchApplyWindowInsets(mRoot.getRootWindowInsets());
+
+ final WindowInsets rootInsets = mRoot.getRootWindowInsets();
+ if (rootInsets != null) {
+ mRoot.dispatchApplyWindowInsets(rootInsets);
+ }
}
protected void removeView() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index 917a56f..533771a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -72,6 +72,7 @@
private final Rect mLastFullscreenBounds = new Rect();
private final Rect mLastDockedBounds = new Rect();
+ private boolean mQsCustomizing;
public LightBarController(Context ctx) {
mDarkModeColor = Color.valueOf(ctx.getColor(R.color.dark_mode_icon_color_single_tone));
@@ -129,7 +130,8 @@
mHasLightNavigationBar = isLight(vis, navigationBarMode,
View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
mNavigationLight = mHasLightNavigationBar
- && (mScrimAlphaBelowThreshold || !mInvertLightNavBarWithScrim);
+ && (mScrimAlphaBelowThreshold || !mInvertLightNavBarWithScrim)
+ && !mQsCustomizing;
if (mNavigationLight != last) {
updateNavigation();
}
@@ -146,6 +148,12 @@
mLastNavigationBarMode);
}
+ public void setQsCustomizing(boolean customizing) {
+ if (mQsCustomizing == customizing) return;
+ mQsCustomizing = customizing;
+ reevaluate();
+ }
+
public void setScrimAlpha(float alpha) {
mScrimAlpha = alpha;
boolean belowThresholdBefore = mScrimAlphaBelowThreshold;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
index d3a6280..b0ac6ec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
@@ -127,11 +127,6 @@
}
public void setIconsDark(boolean dark, boolean animate) {
- if (!BarTransitions.HIGH_END) {
- setIconTintInternal(0.0f);
- mNextDarkIntensity = 0.0f;
- return;
- }
if (!animate) {
setIconTintInternal(dark ? 1.0f : 0.0f);
mNextDarkIntensity = dark ? 1.0f : 0.0f;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
index 004a604..1452e0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
@@ -87,7 +87,8 @@
if (mTouchingChild != null) {
event.offsetLocation(mTouchingChild.getWidth() / 2 - event.getX(),
mTouchingChild.getHeight() / 2 - event.getY());
- return mTouchingChild.dispatchTouchEvent(event);
+ return mTouchingChild.getVisibility() == VISIBLE
+ && mTouchingChild.dispatchTouchEvent(event);
}
}
return super.onTouchEvent(event);
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 88a5626..0f246c6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -25,10 +25,8 @@
import android.graphics.Paint;
import android.graphics.drawable.Icon;
import android.os.AsyncTask;
-import android.os.UserHandle;
import android.os.VibrationEffect;
import android.os.Vibrator;
-import android.provider.Settings;
import android.support.v4.util.ArrayMap;
import android.support.v4.util.ArraySet;
import android.util.AttributeSet;
@@ -39,10 +37,8 @@
import com.android.systemui.R;
import com.android.systemui.statusbar.AlphaOptimizedFrameLayout;
import com.android.systemui.statusbar.StatusBarIconView;
-import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.stack.AnimationFilter;
import com.android.systemui.statusbar.stack.AnimationProperties;
-import com.android.systemui.statusbar.stack.StackStateAnimator;
import com.android.systemui.statusbar.stack.ViewState;
import java.util.ArrayList;
@@ -84,7 +80,10 @@
}.setDuration(CANNED_ANIMATION_DURATION)
.setCustomInterpolator(View.TRANSLATION_Y, Interpolators.ICON_OVERSHOT);
- private static final AnimationProperties mTempProperties = new AnimationProperties() {
+ /**
+ * Temporary AnimationProperties to avoid unnecessary allocations.
+ */
+ private static final AnimationProperties sTempProperties = new AnimationProperties() {
private AnimationFilter mAnimationFilter = new AnimationFilter();
@Override
@@ -102,15 +101,6 @@
}
}.setDuration(200).setDelay(50);
- private static final AnimationProperties UNDARK_PROPERTIES = new AnimationProperties() {
- private AnimationFilter mAnimationFilter = new AnimationFilter()
- .animateX();
-
- @Override
- public AnimationFilter getAnimationFilter() {
- return mAnimationFilter;
- }
- }.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
public static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5;
private boolean mShowAllIcons = true;
@@ -478,9 +468,6 @@
View view = getChildAt(i);
if (view instanceof StatusBarIconView) {
((StatusBarIconView) view).setDark(dark, fade, delay);
- if (!dark && fade) {
- getIconState((StatusBarIconView) view).justUndarkened = true;
- }
}
}
}
@@ -551,7 +538,6 @@
public boolean useFullTransitionAmount;
public boolean useLinearTransitionAmount;
public boolean translateContent;
- public boolean justUndarkened;
public int iconColor = StatusBarIconView.NO_COLOR;
public boolean noAnimations;
public boolean isLastExpandIcon;
@@ -563,8 +549,7 @@
StatusBarIconView icon = (StatusBarIconView) view;
boolean animate = false;
AnimationProperties animationProperties = null;
- boolean animationsAllowed = (mAnimationsEnabled || justUndarkened)
- && !mDisallowNextAnimation
+ boolean animationsAllowed = mAnimationsEnabled && !mDisallowNextAnimation
&& !noAnimations;
if (animationsAllowed) {
if (justAdded || justReplaced) {
@@ -576,9 +561,6 @@
animationProperties = ADD_ICON_PROPERTIES;
animate = true;
}
- } else if (justUndarkened) {
- animationProperties = UNDARK_PROPERTIES;
- animate = true;
} else if (visibleState != icon.getVisibleState()) {
animationProperties = DOT_ANIMATION_PROPERTIES;
animate = true;
@@ -591,17 +573,17 @@
animate = true;
}
if (needsCannedAnimation) {
- AnimationFilter animationFilter = mTempProperties.getAnimationFilter();
+ AnimationFilter animationFilter = sTempProperties.getAnimationFilter();
animationFilter.reset();
animationFilter.combineFilter(
ICON_ANIMATION_PROPERTIES.getAnimationFilter());
- mTempProperties.resetCustomInterpolators();
- mTempProperties.combineCustomInterpolators(ICON_ANIMATION_PROPERTIES);
+ sTempProperties.resetCustomInterpolators();
+ sTempProperties.combineCustomInterpolators(ICON_ANIMATION_PROPERTIES);
if (animationProperties != null) {
animationFilter.combineFilter(animationProperties.getAnimationFilter());
- mTempProperties.combineCustomInterpolators(animationProperties);
+ sTempProperties.combineCustomInterpolators(animationProperties);
}
- animationProperties = mTempProperties;
+ animationProperties = sTempProperties;
animationProperties.setDuration(CANNED_ANIMATION_DURATION);
animate = true;
mCannedAnimationStartIndex = indexOfChild(view);
@@ -610,11 +592,11 @@
&& indexOfChild(view) > mCannedAnimationStartIndex
&& (icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN
|| visibleState != StatusBarIconView.STATE_HIDDEN)) {
- AnimationFilter animationFilter = mTempProperties.getAnimationFilter();
+ AnimationFilter animationFilter = sTempProperties.getAnimationFilter();
animationFilter.reset();
animationFilter.animateX();
- mTempProperties.resetCustomInterpolators();
- animationProperties = mTempProperties;
+ sTempProperties.resetCustomInterpolators();
+ animationProperties = sTempProperties;
animationProperties.setDuration(CANNED_ANIMATION_DURATION);
animate = true;
}
@@ -638,7 +620,6 @@
justAdded = false;
justReplaced = false;
needsCannedAnimation = false;
- justUndarkened = false;
}
private boolean shouldVibrateChange(boolean inShelfChanged) {
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 7aebfdc..efc8d8b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -300,6 +300,7 @@
// Should match the values in PhoneWindowManager
public static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
public static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
+ static public final String SYSTEM_DIALOG_REASON_SCREENSHOT = "screenshot";
private static final String BANNER_ACTION_CANCEL =
"com.android.systemui.statusbar.banner_action_cancel";
@@ -1124,7 +1125,7 @@
}
});
- mLightBarController = new LightBarController(context);
+ mLightBarController = Dependency.get(LightBarController.class);
if (mNavigationBar != null) {
mNavigationBar.setLightBarController(mLightBarController);
}
@@ -4787,7 +4788,7 @@
animateCollapsePanels();
return true;
}
- if (mKeyguardUserSwitcher.hideIfNotSimple(true)) {
+ if (mKeyguardUserSwitcher != null && mKeyguardUserSwitcher.hideIfNotSimple(true)) {
return true;
}
return false;
@@ -6808,6 +6809,7 @@
row.setOnExpandClickListener(this);
row.setRemoteViewClickHandler(mOnClickHandler);
row.setInflationCallback(this);
+ row.setSecureStateProvider(this::isKeyguardCurrentlySecure);
// Get the app name.
// Note that Notification.Builder#bindHeaderAppName has similar logic
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index 70b92ad..68f8e06 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -20,12 +20,8 @@
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.UserHandle;
-import android.text.TextUtils;
import android.util.ArraySet;
-import android.view.Gravity;
-import android.view.View;
import android.view.ViewGroup;
-import android.widget.ImageView;
import android.widget.LinearLayout;
import com.android.internal.statusbar.StatusBarIcon;
@@ -38,6 +34,7 @@
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
+import com.android.systemui.statusbar.policy.IconLogger;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -61,6 +58,7 @@
private final ArrayList<IconManager> mIconGroups = new ArrayList<>();
private final ArraySet<String> mIconBlacklist = new ArraySet<>();
+ private final IconLogger mIconLogger = Dependency.get(IconLogger.class);
public StatusBarIconControllerImpl(Context context) {
super(context.getResources().getStringArray(
@@ -122,6 +120,7 @@
int viewIndex = getViewIndex(index);
boolean blocked = mIconBlacklist.contains(slot);
+ mIconLogger.onIconVisibility(getSlot(index), icon.visible);
mIconGroups.forEach(l -> l.onIconAdded(viewIndex, slot, blocked, icon));
}
@@ -174,6 +173,7 @@
if (getIcon(index) == null) {
return;
}
+ mIconLogger.onIconHidden(getSlot(index));
super.removeIcon(index);
int viewIndex = getViewIndex(index);
mIconGroups.forEach(l -> l.onRemoveIcon(viewIndex));
@@ -196,6 +196,7 @@
private void handleSet(int index, StatusBarIcon icon) {
int viewIndex = getViewIndex(index);
+ mIconLogger.onIconVisibility(getSlot(index), icon.visible);
mIconGroups.forEach(l -> l.onSetIcon(viewIndex, icon));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
index 1411a54..f9c2130 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
@@ -159,6 +159,11 @@
public void onScreenTurnedOff() {
update(false /* updateAlways */);
}
+
+ @Override
+ public void onKeyguardVisibilityChanged(boolean showing) {
+ update(false /* updateAlways */);
+ }
};
public boolean isTrustManaged() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index f0af77d..4c92d01 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -24,7 +24,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.os.Bundle;
@@ -193,8 +192,9 @@
}
private void updateClockVisibility() {
- int visibility = (mClockVisibleByPolicy && mClockVisibleByUser)
- ? View.VISIBLE : View.GONE;
+ boolean visible = mClockVisibleByPolicy && mClockVisibleByUser;
+ Dependency.get(IconLogger.class).onIconVisibility("clock", visible);
+ int visibility = visible ? View.VISIBLE : View.GONE;
setVisibility(visibility);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLogger.java
new file mode 100644
index 0000000..710e1df
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLogger.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.statusbar.policy;
+
+public interface IconLogger {
+
+ void onIconShown(String tag);
+ void onIconHidden(String tag);
+
+ default void onIconVisibility(String tag, boolean visible) {
+ if (visible) {
+ onIconShown(tag);
+ } else {
+ onIconHidden(tag);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java
new file mode 100644
index 0000000..0c201c3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT 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 com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_NUM_STATUS_ICONS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_STATUS_ICONS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.STATUS_BAR_ICONS_CHANGED;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION;
+
+import android.content.Context;
+import android.metrics.LogMaker;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.VisibleForTesting;
+import android.util.ArraySet;
+
+import com.android.internal.logging.MetricsLogger;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class IconLoggerImpl implements IconLogger {
+
+ // Minimum ms between log statements.
+ // NonFinalForTesting
+ @VisibleForTesting
+ protected static long MIN_LOG_INTERVAL = 1000;
+
+ private final Context mContext;
+ private final Handler mHandler;
+ private final MetricsLogger mLogger;
+ private final ArraySet<String> mIcons = new ArraySet<>();
+ private final List<String> mIconIndex;
+ private long mLastLog = System.currentTimeMillis();
+
+ public IconLoggerImpl(Context context, Looper bgLooper, MetricsLogger logger) {
+ mContext = context;
+ mHandler = new Handler(bgLooper);
+ mLogger = logger;
+ String[] icons = mContext.getResources().getStringArray(
+ com.android.internal.R.array.config_statusBarIcons);
+ mIconIndex = Arrays.asList(icons);
+ doLog();
+ }
+
+ @Override
+ public void onIconShown(String tag) {
+ synchronized (mIcons) {
+ if (mIcons.contains(tag)) return;
+ mIcons.add(tag);
+ }
+ if (!mHandler.hasCallbacks(mLog)) {
+ mHandler.postDelayed(mLog, MIN_LOG_INTERVAL);
+ }
+ }
+
+ @Override
+ public void onIconHidden(String tag) {
+ synchronized (mIcons) {
+ if (!mIcons.contains(tag)) return;
+ mIcons.remove(tag);
+ }
+ if (!mHandler.hasCallbacks(mLog)) {
+ mHandler.postDelayed(mLog, MIN_LOG_INTERVAL);
+ }
+ }
+
+ private void doLog() {
+ long time = System.currentTimeMillis();
+ long timeSinceLastLog = time - mLastLog;
+ mLastLog = time;
+
+ ArraySet<String> icons;
+ synchronized (mIcons) {
+ icons = new ArraySet<>(mIcons);
+ }
+ mLogger.write(new LogMaker(STATUS_BAR_ICONS_CHANGED)
+ .setType(TYPE_ACTION)
+ .setLatency(timeSinceLastLog)
+ .addTaggedData(FIELD_NUM_STATUS_ICONS, icons.size())
+ .addTaggedData(FIELD_STATUS_ICONS, getBitField(icons)));
+ }
+
+ private int getBitField(ArraySet<String> icons) {
+ int iconsVisible = 0;
+ for (String icon : icons) {
+ int index = mIconIndex.indexOf(icon);
+ if (index >= 0) {
+ iconsVisible |= (1 << index);
+ }
+ }
+ return iconsVisible;
+ }
+
+ private final Runnable mLog = this::doLog;
+}
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 34a03bf..652f8bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -182,6 +182,7 @@
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyIcons.THREE_G);
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyIcons.THREE_G);
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UMTS, TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_TD_SCDMA, TelephonyIcons.THREE_G);
if (!mConfig.showAtLeast3G) {
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN,
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 4e592db..75532d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -23,14 +23,12 @@
import android.animation.TimeAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.annotation.ColorInt;
import android.annotation.FloatRange;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Canvas;
-import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.PorterDuff;
@@ -1083,6 +1081,20 @@
@Override
public ExpandableView getChildAtPosition(float touchX, float touchY) {
+ return getChildAtPosition(touchX, touchY, true /* requireMinHeight */);
+
+ }
+
+ /**
+ * Get the child at a certain screen location.
+ *
+ * @param touchX the x coordinate
+ * @param touchY the y coordinate
+ * @param requireMinHeight Whether a minimum height is required for a child to be returned.
+ * @return the child at the given location.
+ */
+ private ExpandableView getChildAtPosition(float touchX, float touchY,
+ boolean requireMinHeight) {
// find the view under the pointer, accounting for GONE views
final int count = getChildCount();
for (int childIdx = 0; childIdx < count; childIdx++) {
@@ -1101,7 +1113,7 @@
int left = 0;
int right = getWidth();
- if (bottom - top >= mMinInteractionHeight
+ if ((bottom - top >= mMinInteractionHeight || !requireMinHeight)
&& touchY >= top && touchY <= bottom && touchX >= left && touchX <= right) {
if (slidingChild instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) slidingChild;
@@ -3220,7 +3232,7 @@
case MotionEvent.ACTION_DOWN: {
final int y = (int) ev.getY();
mScrolledToTopOnFirstDown = isScrolledToTop();
- if (getChildAtPosition(ev.getX(), y) == null) {
+ if (getChildAtPosition(ev.getX(), y, false /* requireMinHeight */) == null) {
setIsBeingDragged(false);
recycleVelocityTracker();
break;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
index 7c98e13..b3c86c6 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
@@ -154,7 +154,15 @@
getContext().sendBroadcast(intent);
intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_CLOCK);
- intent.putExtra("hhmm", "0700");
+
+ String demoTime = "1010"; // 10:10, a classic choice of horologists
+ try {
+ String[] versionParts = android.os.Build.VERSION.RELEASE.split("\\.");
+ int majorVersion = Integer.valueOf(versionParts[0]);
+ demoTime = String.format("%02d00", majorVersion % 24);
+ } catch (IllegalArgumentException ex) {
+ }
+ intent.putExtra("hhmm", demoTime);
getContext().sendBroadcast(intent);
intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_NETWORK);
diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
index 3ebefbb..66d5ee1 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
@@ -29,6 +29,7 @@
import android.os.IBinder;
import android.os.ServiceManager;
import android.os.SystemProperties;
+import android.util.EventLog;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -95,6 +96,7 @@
if (((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0)
|| ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0)) {
if (event.getAction() == MotionEvent.ACTION_UP) {
+ EventLog.writeEvent(0x534e4554, "62187985"); // safety net logging
Toast.makeText(v.getContext(),
R.string.touch_filtered_warning,
Toast.LENGTH_SHORT).show();
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 0fd6c74..761e979 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -75,6 +75,7 @@
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
+import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialogController;
@@ -515,6 +516,9 @@
if (mSafetyWarning != null) return 5000;
if (mExpanded || mExpandButtonAnimationRunning) return 5000;
if (mActiveStream == AudioManager.STREAM_MUSIC) return 1500;
+ if (mZenFooter.shouldShowIntroduction()) {
+ return 6000;
+ }
return 3000;
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java
index 7464212..80e1629 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java
@@ -152,6 +152,7 @@
mController.getCurrentUser(), true /*shortVersion*/);
Util.setText(mSummaryLine2, line2);
}
+
public boolean shouldShowIntroduction() {
final boolean confirmed = Prefs.getBoolean(mContext,
Prefs.Key.DND_CONFIRMED_ALARM_INTRODUCTION, false);
diff --git a/packages/SystemUI/tests/AndroidTest.xml b/packages/SystemUI/tests/AndroidTest.xml
index 6ca42e8..53839a9b 100644
--- a/packages/SystemUI/tests/AndroidTest.xml
+++ b/packages/SystemUI/tests/AndroidTest.xml
@@ -23,6 +23,6 @@
<option name="test-tag" value="SystemUITests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.systemui.tests" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="android.testing.TestableInstrumentation" />
</test>
</configuration>
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index 66d00dd..65d9699 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -54,6 +54,7 @@
@Before
public void SysuiSetup() throws Exception {
System.setProperty("dexmaker.share_classloader", "true");
+ mContext.setTheme(R.style.Theme_SystemUI);
SystemUIFactory.createFromConfig(mContext);
mRealInstrumentation = InstrumentationRegistry.getInstrumentation();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java
index 333e73d..b0c9f328 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java
@@ -30,6 +30,7 @@
boolean dozing;
float doubleTapX;
float doubleTapY;
+ float aodDimmingScrimOpacity;
@Override
public void addCallback(@NonNull Callback callback) {
@@ -114,4 +115,9 @@
@Override
public void setDozeScreenBrightness(int value) {
}
+
+ @Override
+ public void setAodDimmingScrim(float scrimOpacity) {
+ aodDimmingScrimOpacity = scrimOpacity;
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
index 4f59fc4..5e12781 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
@@ -30,6 +30,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import android.os.PowerManager;
@@ -149,8 +150,6 @@
mScreen.transitionTo(INITIALIZED, DOZE_AOD);
mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING);
mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED);
-
- assertTrue(mScreen.isReady());
}
@Test
@@ -165,87 +164,77 @@
}
@Test
- public void testNonPositiveBrightness_keepsPreviousBrightness() throws Exception {
+ public void testNonPositiveBrightness_keepsPreviousBrightnessAndScrim() throws Exception {
+ mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
+ mScreen.transitionTo(INITIALIZED, DOZE_AOD);
+
+ mSensor.sendSensorEvent(1);
+ mSensor.sendSensorEvent(0);
+
+ assertEquals(1, mServiceFake.screenBrightness);
+ assertEquals(10/255f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */);
+ }
+
+ @Test
+ public void pausingAod_softBlanks() throws Exception {
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mScreen.transitionTo(INITIALIZED, DOZE_AOD);
mSensor.sendSensorEvent(2);
+
+ mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING);
+ mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED);
+
+ assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */);
+
mSensor.sendSensorEvent(0);
+ assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */);
- assertEquals(2, mServiceFake.screenBrightness);
+ mScreen.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD);
+ assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */);
}
@Test
- public void readyWhenNotInitialized() {
- assertTrue(mScreen.isReady());
- }
-
- @Test
- public void readyWhenNotRegistered() {
+ public void pausingAod_softBlanks_withSpuriousSensorDuringPause() throws Exception {
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
- mScreen.transitionTo(INITIALIZED, DOZE);
+ mScreen.transitionTo(INITIALIZED, DOZE_AOD);
+ mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING);
+ mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED);
- assertTrue(mScreen.isReady());
+ mSensor.sendSensorEvent(1);
+ assertEquals(1f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */);
}
@Test
- public void notReadyWhenRegistered_butNoEventYet() {
+ public void pausingAod_unblanksAfterSensor() throws Exception {
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mScreen.transitionTo(INITIALIZED, DOZE_AOD);
- assertFalse(mScreen.isReady());
- }
+ mSensor.sendSensorEvent(2);
- @Test
- public void notReady_afterZeroBrightness() {
- mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
- mScreen.transitionTo(INITIALIZED, DOZE_AOD);
+ mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING);
+ mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED);
mSensor.sendSensorEvent(0);
- assertFalse(mScreen.isReady());
+ mScreen.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD);
+
+ mSensor.sendSensorEvent(2);
+
+ assertEquals(0f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */);
}
@Test
- public void ready_afterNonZeroBrightness() {
+ public void pausingAod_unblanksIfSensorWasAlwaysReady() throws Exception {
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mScreen.transitionTo(INITIALIZED, DOZE_AOD);
- mSensor.sendSensorEvent(1);
+ mSensor.sendSensorEvent(2);
- assertTrue(mScreen.isReady());
- }
+ mScreen.transitionTo(DOZE_AOD, DOZE_AOD_PAUSING);
+ mScreen.transitionTo(DOZE_AOD_PAUSING, DOZE_AOD_PAUSED);
+ mScreen.transitionTo(DOZE_AOD_PAUSED, DOZE_AOD);
- @Test
- public void notReady_nonZeroThenZeroBrightness() {
- mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
- mScreen.transitionTo(INITIALIZED, DOZE_AOD);
-
- mSensor.sendSensorEvent(1);
- mSensor.sendSensorEvent(0);
-
- assertFalse(mScreen.isReady());
- }
-
- @Test
- public void readyListener_getsCalled_whenRegistering() throws Exception {
- Boolean[] ready = new Boolean[1];
-
- mScreen.setBrightnessReadyListener((x) -> ready[0] = true);
-
- assertTrue(ready[0]);
- }
-
- @Test
- public void readyListener_getsCalled_whenReadyChanges() throws Exception {
- Boolean[] ready = new Boolean[1];
- mScreen.setBrightnessReadyListener((x) -> ready[0] = true);
-
- mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
- mScreen.transitionTo(INITIALIZED, DOZE_AOD);
-
- ready[0] = null;
- mSensor.sendSensorEvent(1);
- assertTrue(ready[0]);
+ assertEquals(0f, mHostFake.aodDimmingScrimOpacity, 0.001f /* delta */);
}
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 6a9dac4..a8ea1c0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -58,7 +58,6 @@
private WakeLock mWakeLock;
private Instrumentation mInstrumentation;
private AlarmManager mAlarmManager;
- private DozeScreenBrightness mDozeScreenBrightness;
@BeforeClass
public static void setupSuite() {
@@ -77,12 +76,10 @@
mSensors = new FakeSensorManager(mContext);
mHandler = new Handler(Looper.getMainLooper());
mWakeLock = new WakeLockFake();
- mDozeScreenBrightness = mock(DozeScreenBrightness.class);
mInstrumentation.runOnMainSync(() -> {
mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager,
- mConfig, mParameters, mSensors, mHandler, mDozeScreenBrightness,
- mWakeLock, true);
+ mConfig, mParameters, mSensors, mHandler, mWakeLock, true);
});
}
@@ -115,22 +112,4 @@
verify(mMachine).requestPulse(anyInt());
}
- @Test
- public void unpausing_fromPaused_waitsForBrightnessReady() throws Exception {
- when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE_AOD_PAUSED);
-
- mTriggers.recalculatePausing(true /* proxFar */, false /* brightnessReady */);
- verify(mMachine, never()).requestState(any());
-
- mTriggers.recalculatePausing(true /* proxFar */, true /* brightnessReady */);
- verify(mMachine).requestState(DozeMachine.State.DOZE_AOD);
- }
-
- @Test
- public void unpausing_fromPausing_doesntWaitForBrightnessReady() throws Exception {
- when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE_AOD_PAUSED);
-
- mTriggers.recalculatePausing(true /* proxFar */, false /* brightnessReady */);
- verify(mMachine).requestState(DozeMachine.State.DOZE_AOD);
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java
new file mode 100644
index 0000000..b8c946d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.pip.phone;
+
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_MOVE;
+import static android.view.MotionEvent.ACTION_UP;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.MotionEvent;
+import android.view.ViewConfiguration;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.pip.phone.PipTouchState;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PipTouchStateTest extends SysuiTestCase {
+
+ private Handler mHandler;
+ private HandlerThread mHandlerThread;
+ private PipTouchState mTouchState;
+ private CountDownLatch mDoubleTapCallbackTriggeredLatch;
+
+ @Before
+ public void setUp() throws Exception {
+ mHandlerThread = new HandlerThread("PipTouchStateTestThread");
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+
+ mDoubleTapCallbackTriggeredLatch = new CountDownLatch(1);
+ mTouchState = new PipTouchState(ViewConfiguration.get(getContext()),
+ mHandler, () -> {
+ mDoubleTapCallbackTriggeredLatch.countDown();
+ });
+ assertFalse(mTouchState.isDoubleTap());
+ assertFalse(mTouchState.isWaitingForDoubleTap());
+ }
+
+ @Test
+ public void testDoubleTapLongSingleTap_notDoubleTapAndNotWaiting() {
+ final long currentTime = SystemClock.uptimeMillis();
+
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_DOWN, currentTime, 0, 0));
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_UP,
+ currentTime + PipTouchState.DOUBLE_TAP_TIMEOUT + 10, 0, 0));
+ assertFalse(mTouchState.isDoubleTap());
+ assertFalse(mTouchState.isWaitingForDoubleTap());
+ assertTrue(mTouchState.getDoubleTapTimeoutCallbackDelay() == -1);
+ }
+
+ @Test
+ public void testDoubleTapTimeout_timeoutCallbackCalled() throws Exception {
+ final long currentTime = SystemClock.uptimeMillis();
+
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_DOWN, currentTime, 0, 0));
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_UP,
+ currentTime + PipTouchState.DOUBLE_TAP_TIMEOUT - 10, 0, 0));
+ assertFalse(mTouchState.isDoubleTap());
+ assertTrue(mTouchState.isWaitingForDoubleTap());
+
+ assertTrue(mTouchState.getDoubleTapTimeoutCallbackDelay() == 10);
+ mTouchState.scheduleDoubleTapTimeoutCallback();
+ mDoubleTapCallbackTriggeredLatch.await(1, TimeUnit.SECONDS);
+ assertTrue(mDoubleTapCallbackTriggeredLatch.getCount() == 0);
+ }
+
+ @Test
+ public void testDoubleTapDrag_doubleTapCanceled() {
+ final long currentTime = SystemClock.uptimeMillis();
+
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_DOWN, currentTime, 0, 0));
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_MOVE, currentTime + 10, 500, 500));
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_UP, currentTime + 20, 500, 500));
+ assertTrue(mTouchState.isDragging());
+ assertFalse(mTouchState.isDoubleTap());
+ assertFalse(mTouchState.isWaitingForDoubleTap());
+ assertTrue(mTouchState.getDoubleTapTimeoutCallbackDelay() == -1);
+ }
+
+ @Test
+ public void testDoubleTap_doubleTapRegistered() {
+ final long currentTime = SystemClock.uptimeMillis();
+
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_DOWN, currentTime, 0, 0));
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_UP, currentTime + 10, 0, 0));
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_DOWN,
+ currentTime + PipTouchState.DOUBLE_TAP_TIMEOUT - 20, 0, 0));
+ mTouchState.onTouchEvent(createMotionEvent(ACTION_UP,
+ currentTime + PipTouchState.DOUBLE_TAP_TIMEOUT - 10, 0, 0));
+ assertTrue(mTouchState.isDoubleTap());
+ assertFalse(mTouchState.isWaitingForDoubleTap());
+ assertTrue(mTouchState.getDoubleTapTimeoutCallbackDelay() == -1);
+ }
+
+ private MotionEvent createMotionEvent(int action, long eventTime, float x, float y) {
+ return MotionEvent.obtain(0, eventTime, action, x, y, 0);
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
index 9fe3e10..98ca1b4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
@@ -76,6 +76,19 @@
assertTrue(mSlashView.getSlashDrawable() == null);
}
+ @Test
+ public void testSetImageDrawableUsesDrawableLevel() {
+ SlashImageView iv = new SlashImageView(mContext);
+ Drawable mockDrawable = mock(Drawable.class);
+ mockDrawable.setLevel(2);
+ assertTrue(mockDrawable.getLevel() == 2);
+
+ iv.setImageDrawable(mockDrawable);
+
+ // Make sure setting the drawable didn't reset its level to 0
+ assertTrue(mockDrawable.getLevel() == 2);
+ }
+
// Expose getSlashDrawable
private static class TestableSlashImageView extends SlashImageView {
TestableSlashImageView(Context c) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
index 0500a54..004ff29 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
@@ -21,13 +21,19 @@
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.argThat;
+import static org.mockito.Mockito.clearInvocations;
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;
+import static java.lang.Thread.sleep;
+
import android.content.Intent;
import android.metrics.LogMaker;
import android.support.test.filters.SmallTest;
@@ -66,10 +72,10 @@
mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class);
mHost = mock(QSTileHost.class);
when(mHost.indexOf(spec)).thenReturn(POSITION);
- mTestableLooper.runWithLooper(() -> {
- mTile = new TileImpl(mHost);
- mTile.setTileSpec(spec);
- });
+
+ mTile = spy(new TileImpl(mHost));
+ mTile.mHandler = mTile.new H(mTestableLooper.getLooper());
+ mTile.setTileSpec(spec);
}
@Test
@@ -94,12 +100,38 @@
public void testPopulate() {
LogMaker maker = mock(LogMaker.class);
when(maker.setSubtype(anyInt())).thenReturn(maker);
+ when(maker.addTaggedData(anyInt(), any())).thenReturn(maker);
mTile.getState().value = true;
mTile.populate(maker);
verify(maker).addTaggedData(eq(FIELD_QS_VALUE), eq(1));
verify(maker).addTaggedData(eq(FIELD_QS_POSITION), eq(POSITION));
}
+ @Test
+ public void testStaleTimeout() throws InterruptedException {
+ when(mTile.getStaleTimeout()).thenReturn(5l);
+ clearInvocations(mTile);
+
+ mTile.handleRefreshState(null);
+ mTestableLooper.processAllMessages();
+ verify(mTile, never()).handleStale();
+
+ sleep(10);
+ mTestableLooper.processAllMessages();
+ verify(mTile).handleStale();
+ }
+
+ @Test
+ public void testStaleListening() {
+ mTile.handleStale();
+ mTestableLooper.processAllMessages();
+ verify(mTile).handleSetListening(eq(true));
+
+ mTile.handleRefreshState(null);
+ mTestableLooper.processAllMessages();
+ verify(mTile).handleSetListening(eq(false));
+ }
+
private class TileLogMatcher implements ArgumentMatcher<LogMaker> {
private final int mCategory;
@@ -164,7 +196,7 @@
}
@Override
- protected void setListening(boolean listening) {
+ protected void handleSetListening(boolean listening) {
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index 2f6511c..58ff46a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -134,4 +134,16 @@
row.setAboveShelf(false);
verify(listener).onAboveShelfStateChanged(false);
}
+
+ @Test
+ public void testClickSound() throws Exception {
+ Assert.assertTrue("Should play sounds by default.", mGroup.isSoundEffectsEnabled());
+ mGroup.setDark(true /* dark */, false /* fade */, 0 /* delay */);
+ mGroup.setSecureStateProvider(()-> false);
+ Assert.assertFalse("Shouldn't play sounds when dark and trusted.",
+ mGroup.isSoundEffectsEnabled());
+ mGroup.setSecureStateProvider(()-> true);
+ Assert.assertTrue("Should always play sounds when not trusted.",
+ mGroup.isSoundEffectsEnabled());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index b6827ea..88fa659 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -121,7 +121,7 @@
mDefaultNotificationChannel = new NotificationChannel(
NotificationChannel.DEFAULT_CHANNEL_ID, TEST_CHANNEL_NAME,
NotificationManager.IMPORTANCE_LOW);
- mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, 0, 0,
+ mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0,
new Notification(), UserHandle.CURRENT, null, 0);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
index 54a96cd..83a2883 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
@@ -184,7 +184,9 @@
countDownLatch.await();
}
+ /* Cancelling requires us to be on the UI thread otherwise we might have a race */
@Test
+ @UiThreadTest
public void testSupersedesExistingTask() throws Exception {
mNotificationInflater.inflateNotificationViews();
mNotificationInflater.setIsLowPriority(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
new file mode 100644
index 0000000..4051220
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.UiThreadTest;
+import android.view.ContextThemeWrapper;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.keyguard.DismissCallbackRegistry;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class KeyguardBouncerTest extends SysuiTestCase {
+
+ @UiThreadTest
+ @Test
+ public void inflateDetached() {
+ final ViewGroup container = new FrameLayout(getContext());
+ final KeyguardBouncer bouncer = new KeyguardBouncer(getContext(),
+ mock(ViewMediatorCallback.class), mock(LockPatternUtils.class), container, mock(
+ DismissCallbackRegistry.class));
+
+ // Detached bouncer should still be able to be inflated
+ bouncer.inflateView();
+ }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
index ed1491d3..500d620 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
@@ -71,6 +71,24 @@
}
@Test
+ public void testInvisibleViews() {
+ View left = mockViewAt(0, 0, 10, 10);
+ View right = mockViewAt(20, 0, 10, 10);
+ when(left.getVisibility()).thenReturn(View.INVISIBLE);
+
+ mNearestTouchFrame.addView(left);
+ mNearestTouchFrame.addView(right);
+ mNearestTouchFrame.onMeasure(0, 0);
+
+ MotionEvent ev = MotionEvent.obtain(0, 0, 0,
+ 12 /* x */, 5 /* y */, 0);
+ mNearestTouchFrame.onTouchEvent(ev);
+ verify(left, never()).onTouchEvent(eq(ev));
+ verify(right, never()).onTouchEvent(eq(ev));
+ ev.recycle();
+ }
+
+ @Test
public void testHorizontalSelection_Left() {
View left = mockViewAt(0, 0, 10, 10);
View right = mockViewAt(20, 0, 10, 10);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java
index a915cb2..b22a646 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java
@@ -27,7 +27,6 @@
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
-import android.util.Log;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
@@ -145,7 +144,6 @@
@Test
@RunWithLooper
public void testSortOrder() {
- Log.d("TestTest", "Config " + mContext.getResources().getConfiguration().uiMode);
Object def = new Object();
Object uiMode = new Object();
Object tuner = new Object();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/IconLoggerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/IconLoggerImplTest.java
new file mode 100644
index 0000000..ec994a1
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/IconLoggerImplTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT 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 com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_NUM_STATUS_ICONS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_STATUS_ICONS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent
+ .NOTIFICATION_SINCE_CREATE_MILLIS;
+
+import static org.junit.Assert.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import static java.lang.Thread.sleep;
+
+import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableLooper.MessageHandler;
+import android.testing.TestableLooper.RunWithLooper;
+import android.util.Log;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+@SmallTest
+public class IconLoggerImplTest extends SysuiTestCase {
+
+ private MetricsLogger mMetricsLogger;
+ private IconLoggerImpl mIconLogger;
+ private TestableLooper mTestableLooper;
+ private MessageHandler mMessageHandler;
+
+ @Before
+ public void setup() {
+ IconLoggerImpl.MIN_LOG_INTERVAL = 5; // Low interval for testing
+ mMetricsLogger = mock(MetricsLogger.class);
+ mTestableLooper = TestableLooper.get(this);
+ mMessageHandler = mock(MessageHandler.class);
+ mTestableLooper.setMessageHandler(mMessageHandler);
+ String[] iconArray = new String[] {
+ "test_icon_1",
+ "test_icon_2",
+ };
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.array.config_statusBarIcons, iconArray);
+ mIconLogger = new IconLoggerImpl(mContext, mTestableLooper.getLooper(), mMetricsLogger);
+ when(mMessageHandler.onMessageHandled(any())).thenReturn(true);
+ clearInvocations(mMetricsLogger);
+ }
+
+ @Test
+ public void testIconShown() throws InterruptedException {
+ // Should only get one message, for the same icon shown twice.
+ mIconLogger.onIconShown("test_icon_2");
+ mIconLogger.onIconShown("test_icon_2");
+
+ // There should be some delay before execute.
+ mTestableLooper.processAllMessages();
+ verify(mMessageHandler, never()).onMessageHandled(any());
+
+ sleep(10);
+ mTestableLooper.processAllMessages();
+ verify(mMessageHandler, times(1)).onMessageHandled(any());
+ }
+
+ @Test
+ public void testIconHidden() throws InterruptedException {
+ // Add the icon so that it can be removed.
+ mIconLogger.onIconShown("test_icon_2");
+ sleep(10);
+ mTestableLooper.processAllMessages();
+ clearInvocations(mMessageHandler);
+
+ // Should only get one message, for the same icon shown twice.
+ mIconLogger.onIconHidden("test_icon_2");
+ mIconLogger.onIconHidden("test_icon_2");
+
+ // There should be some delay before execute.
+ mTestableLooper.processAllMessages();
+ verify(mMessageHandler, never()).onMessageHandled(any());
+
+ sleep(10);
+ mTestableLooper.processAllMessages();
+ verify(mMessageHandler, times(1)).onMessageHandled(any());
+ }
+
+ @Test
+ public void testLog() throws InterruptedException {
+ mIconLogger.onIconShown("test_icon_2");
+ sleep(10);
+ mTestableLooper.processAllMessages();
+
+ verify(mMetricsLogger).write(argThat(maker -> {
+ if (IconLoggerImpl.MIN_LOG_INTERVAL >
+ (long) maker.getTaggedData(NOTIFICATION_SINCE_CREATE_MILLIS)) {
+ Log.e("IconLoggerImplTest", "Invalid latency "
+ + maker.getTaggedData(NOTIFICATION_SINCE_CREATE_MILLIS));
+ return false;
+ }
+ if (1 != (int) maker.getTaggedData(FIELD_NUM_STATUS_ICONS)) {
+ Log.e("IconLoggerImplTest", "Invalid icon count "
+ + maker.getTaggedData(FIELD_NUM_STATUS_ICONS));
+ return false;
+ }
+ return true;
+ }));
+ }
+
+ @Test
+ public void testBitField() throws InterruptedException {
+ mIconLogger.onIconShown("test_icon_2");
+ sleep(10);
+ mTestableLooper.processAllMessages();
+
+ verify(mMetricsLogger).write(argThat(maker -> {
+ if ((1 << 1) != (int) maker.getTaggedData(FIELD_STATUS_ICONS)) {
+ Log.e("IconLoggerImplTest", "Invalid bitfield " + Integer.toHexString(
+ (Integer) maker.getTaggedData(FIELD_NUM_STATUS_ICONS)));
+ return false;
+ }
+ return true;
+ }));
+
+ mIconLogger.onIconShown("test_icon_1");
+ sleep(10);
+ mTestableLooper.processAllMessages();
+
+ verify(mMetricsLogger).write(argThat(maker -> {
+ if ((1 << 1 | 1 << 0) != (int) maker.getTaggedData(FIELD_STATUS_ICONS)) {
+ Log.e("IconLoggerImplTest", "Invalid bitfield " + Integer.toHexString(
+ (Integer) maker.getTaggedData(FIELD_NUM_STATUS_ICONS)));
+ return false;
+ }
+ return true;
+ }));
+
+ mIconLogger.onIconHidden("test_icon_2");
+ sleep(10);
+ mTestableLooper.processAllMessages();
+
+ verify(mMetricsLogger).write(argThat(maker -> {
+ if ((1 << 0) != (int) maker.getTaggedData(FIELD_STATUS_ICONS)) {
+ Log.e("IconLoggerImplTest", "Invalid bitfield " + Integer.toHexString(
+ (Integer) maker.getTaggedData(FIELD_STATUS_ICONS)));
+ return false;
+ }
+ return true;
+ }));
+ }
+}
diff --git a/packages/VpnDialogs/res/values-hi/strings.xml b/packages/VpnDialogs/res/values-hi/strings.xml
index ebfcf9b..7091ce7 100644
--- a/packages/VpnDialogs/res/values-hi/strings.xml
+++ b/packages/VpnDialogs/res/values-hi/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"कनेक्शन अनुरोध"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> VPN कनेक्शन सेट करना चाहता है जो उसे नेटवर्क ट्रैफ़िक मॉनीटर करने देता है. केवल तभी स्वीकार करें, जबकि आप स्रोत पर विश्वास करते हों. VPN सक्रिय होने पर आपकी स्क्रीन पर ऊपर <br /> <br /> <img src=vpn_icon /> दिखाई देता है."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> VPN कनेक्शन सेट करना चाहता है जो उसे नेटवर्क ट्रैफ़िक मॉनीटर करने देता है. केवल तभी स्वीकार करें, जबकि आप स्रोत पर भरोसा करते हों. VPN सक्रिय होने पर आपकी स्क्रीन पर ऊपर <br /> <br /> <img src=vpn_icon /> दिखाई देता है."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN कनेक्ट है"</string>
<string name="session" msgid="6470628549473641030">"सत्र:"</string>
<string name="duration" msgid="3584782459928719435">"अवधि:"</string>
diff --git a/packages/VpnDialogs/res/values-pa/strings.xml b/packages/VpnDialogs/res/values-pa/strings.xml
index c7159d2..1815f4f 100644
--- a/packages/VpnDialogs/res/values-pa/strings.xml
+++ b/packages/VpnDialogs/res/values-pa/strings.xml
@@ -28,8 +28,8 @@
<string name="always_on_disconnected_message" msgid="555634519845992917">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> ਨੂੰ ਹਰ ਸਮੇਂ ਕਨੈਕਟ ਰਹਿਣ ਲਈ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ ਹੈ, ਪਰ ਇਹ ਫਿਲਹਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੋ ਸਕਦੀ। ਤੁਹਾਡਾ ਫ਼ੋਨ <xliff:g id="VPN_APP_1">%1$s</xliff:g> ਨਾਲ ਮੁੜ-ਕਨੈਕਟ ਹੋਣ ਤੱਕ ਕਿਸੇ ਜਨਤਕ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੇਗਾ।"</string>
<string name="always_on_disconnected_message_lockdown" msgid="4232225539869452120">"<xliff:g id="VPN_APP">%1$s</xliff:g> ਨੂੰ ਹਰ ਸਮੇਂ ਕਨੈਕਟ ਰਹਿਣ ਲਈ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ ਹੈ, ਪਰ ਇਹ ਫਿਲਹਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੋ ਸਕਦੀ। VPN ਨਾਲ ਮੁੜ-ਕਨੈਕਟ ਹੋਣ ਤੱਕ ਤੁਸੀਂ ਕਨੈਕਟ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string>
<string name="always_on_disconnected_message_separator" msgid="3310614409322581371">" "</string>
- <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"VPN ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string>
- <string name="configure" msgid="4905518375574791375">"ਕੌਂਫਿਗਰ ਕਰੋ"</string>
+ <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"Change VPN settings"</string>
+ <string name="configure" msgid="4905518375574791375">"ਰੂਪ-ਰੇਖਾ ਬਦਲੋ"</string>
<string name="disconnect" msgid="971412338304200056">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
<string name="open_app" msgid="3717639178595958667">"ਐਪ ਖੋਲ੍ਹੋ"</string>
<string name="dismiss" msgid="6192859333764711227">"ਖਾਰਜ ਕਰੋ"</string>
diff --git a/packages/VpnDialogs/res/values-vi/strings.xml b/packages/VpnDialogs/res/values-vi/strings.xml
index 7201683..fa5e114 100644
--- a/packages/VpnDialogs/res/values-vi/strings.xml
+++ b/packages/VpnDialogs/res/values-vi/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"Yêu cầu kết nối"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> muốn thiết lập kết nối VPN cho phép ứng dụng giám sát lưu lượng truy cập mạng. Chỉ chấp nhận nếu bạn tin tưởng nguồn. <br /> <br /> <img src=vpn_icon /> xuất hiện ở đầu màn hình của bạn khi VPN đang hoạt động."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> muốn thiết lập kết nối VPN cho phép ứng dụng giám sát lưu lượng truy cập mạng. Chỉ chấp nhận nếu bạn tin tưởng nguồn. Biểu tượng <br /> <br /> <img src=vpn_icon /> xuất hiện ở đầu màn hình của bạn khi VPN đang hoạt động."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN được kết nối"</string>
<string name="session" msgid="6470628549473641030">"Phiên"</string>
<string name="duration" msgid="3584782459928719435">"Thời lượng:"</string>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/color/qs_detail_progress_track.xml b/packages/overlays/SysuiDarkThemeOverlay/res/color/qs_detail_progress_track.xml
new file mode 100644
index 0000000..c56382e
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/color/qs_detail_progress_track.xml
@@ -0,0 +1,20 @@
+<?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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- I really don't want to define this, but the View that uses this asset uses both the
+ light and dark accent colors. -->
+ <item android:alpha="0.6" android:drawable="@*android:color/accent_device_default_light" />
+</selector>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml
index 0c1b0ef..ddac106 100644
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml
@@ -6,6 +6,6 @@
<item name="android:colorSecondary">@*android:color/secondary_device_default_settings</item>
<item name="android:colorAccent">@*android:color/accent_device_default_dark</item>
<item name="android:colorControlNormal">?android:attr/textColorPrimary</item>
- <item name="android:colorBackgroundFloating">#000</item>
+ <item name="android:colorBackgroundFloating">@*android:color/material_grey_900</item>
</style>
</resources>
\ No newline at end of file
diff --git a/proto/src/ipconnectivity.proto b/proto/src/ipconnectivity.proto
index 885896f..777468a 100644
--- a/proto/src/ipconnectivity.proto
+++ b/proto/src/ipconnectivity.proto
@@ -473,6 +473,38 @@
repeated Pair validation_states = 8;
}
+// Represents statistics from NFLOG wakeup events due to ingress packets.
+// Since oc-mr1.
+// Next tag: 8.
+message WakeupStats {
+ // The time duration in seconds covered by these stats, for deriving
+ // exact wakeup rates.
+ optional int64 duration_sec = 1;
+
+ // The total number of ingress packets waking up the device.
+ optional int64 total_wakeups = 2;
+
+ // The total number of wakeup packets routed to a socket belonging to
+ // the root uid (uid 0).
+ optional int64 root_wakeups = 3;
+
+ // The total number of wakeup packets routed to a socket belonging to
+ // the system server (uid 1000).
+ optional int64 system_wakeups = 4;
+
+ // The total number of wakeup packets routed to a socket belonging to
+ // an application (uid > 9999).
+ optional int64 application_wakeups = 5;
+
+ // The total number of wakeup packets routed to a socket belonging to another
+ // uid than the root uid, system uid, or an application uid (any uid in
+ // between [1001, 9999]. See android.os.Process for possible uids.
+ optional int64 non_application_wakeups = 6;
+
+ // The total number of wakeup packets with no associated sockets.
+ optional int64 unrouted_wakeups = 7;
+}
+
// Represents one of the IP connectivity event defined in this file.
// Next tag: 20
message IpConnectivityEvent {
@@ -547,6 +579,9 @@
// Network statistics.
NetworkStats network_stats = 19;
+
+ // Ingress packet wakeup statistics.
+ WakeupStats wakeup_stats = 20;
};
};
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 8e782c0..aa4217c 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -33,7 +33,7 @@
// The view became hidden.
TYPE_CLOSE = 2;
- // The view switched to detail mode (most relevant for quick settings tiles)
+ // The view switched to detail mode (most relevant for quick settings tiles and notifications)
TYPE_DETAIL = 3;
// The view or control was activated.
@@ -70,6 +70,9 @@
// Type for APP_TRANSITION_REPORTED_DRAWN event: The activity was started with restoring from
// a bundle.
TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE = 13;
+
+ // The view switched to summary mode (most relevant for notifications)
+ TYPE_COLLAPSE = 14;
}
// Types of alerts, as bit field values
@@ -158,6 +161,16 @@
CAMERA_EXTERNAL_USED = 2;
}
+ // TextClassifier entity types.
+ enum TextClassifierEntityType {
+ TEXT_CLASSIFIER_TYPE_UNKNOWN = 1;
+ TEXT_CLASSIFIER_TYPE_OTHER = 2;
+ TEXT_CLASSIFIER_TYPE_EMAIL = 3;
+ TEXT_CLASSIFIER_TYPE_PHONE = 4;
+ TEXT_CLASSIFIER_TYPE_ADDRESS = 5;
+ TEXT_CLASSIFIER_TYPE_URL = 6;
+ }
+
// Known visual elements: views or controls.
enum View {
// Unknown view
@@ -3527,6 +3540,7 @@
NOTIFICATION_SNOOZED_CRITERIA = 832;
// FIELD - The context (source) from which an action is performed
+ // For QS, this is a boolean of whether the panel is expanded
FIELD_CONTEXT = 833;
// ACTION: Settings advanced button is expanded
@@ -4287,6 +4301,156 @@
// OS: O MR
APPLICATIONS_STORAGE_PHOTOS = 1092;
+ // ACTION: Logged when the status bar icons change.
+ // OS: O MR
+ STATUS_BAR_ICONS_CHANGED = 1093;
+
+ // FIELD: Bitfield indicating which icons are shown.
+ // OS: O MR
+ FIELD_STATUS_ICONS = 1094;
+
+ // FIELD: Number of status icons currently shown.
+ // OS: O MR
+ FIELD_NUM_STATUS_ICONS = 1095;
+
+ // ACTION: Logged when user tries to pair a Bluetooth device without name from Settings app
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ ACTION_SETTINGS_BLUETOOTH_PAIR_DEVICES_WITHOUT_NAMES = 1096;
+
+ // FIELD - Whether smart suggestion ranking was enabled or not
+ // Type: int encoded boolean
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED = 1097;
+
+ // ACTION: The device boots
+ ACTION_BOOT = 1098;
+
+ // FIELD: A string value representing some state of the platform, e.g., boot reason
+ FIELD_PLATFORM_REASON = 1099;
+
+ // CATEGORY: The category for all actions relating to selection session logging.
+ // OS: O MR
+ TEXT_SELECTION_SESSION = 1100;
+
+ // ACTION: A selection session started (i.e. the selection handles appeared)
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_START = 1101;
+
+ // ACTION: The user modified the selection (e.g. by dragging the handles)
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_MODIFY = 1102;
+
+ // ACTION: The user modified the selection by pressing the "select all" button.
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_SELECT_ALL = 1103;
+
+ // ACTION: The user modified the selection by pressing on a word in a multi word selection
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_RESET = 1104;
+
+ // ACTION: Smart selection made a single word prediction
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_SMART_SINGLE = 1105;
+
+ // ACTION: Smart selection made a multi word prediction
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_SMART_MULTI = 1106;
+
+ // ACTION: The app made an automatic selection on the user's behalf (not smart selection)
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_AUTO = 1107;
+
+ // ACTION: A selection session ended with the user typing over the text
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_OVERTYPE = 1108;
+
+ // ACTION: A selection session ended with the user copying the text
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_COPY = 1109;
+
+ // ACTION: A selection session ended with the user pasting over the text
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_PASTE = 1110;
+
+ // ACTION: A selection session ended with the user cutting the text
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_CUT = 1111;
+
+ // ACTION: A selection session ended with the user pressing the share button
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_SHARE = 1112;
+
+ // ACTION: A selection session ended with the user pressing the smart share button
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_SMART_SHARE = 1113;
+
+ // ACTION: A selection session ended with the user dragging the text
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_DRAG = 1114;
+
+ // ACTION: A selection session ended with the user abandoning the selection
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_ABANDON = 1115;
+
+ // ACTION: A selection session ended with the user picking an unhandled action bar item
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ ACTION_TEXT_SELECTION_OTHER = 1116;
+
+ // FIELD: Time in milliseconds from the start of the session to this event
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ FIELD_SELECTION_SINCE_START = 1117;
+
+ // FIELD: time in milliseconds between the last event in the session and this one
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ FIELD_SELECTION_SINCE_PREVIOUS = 1118;
+
+ // FIELD: a random uid for a selection session (lasting from select start to end)
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ FIELD_SELECTION_SESSION_ID = 1119;
+
+ // FIELD: the sequence number of the event in the session
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ FIELD_SELECTION_SESSION_INDEX = 1120;
+
+ // FIELD: a concatenation of the widget type and ML model version.
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ FIELD_SELECTION_VERSION_TAG = 1121;
+
+ // FIELD: text select start offset in words (as defined by the ICU BreakIterator), stored as two
+ // packed 16bit integers. (start in MSBs, end in LSBs)
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ FIELD_SELECTION_RANGE = 1122;
+
+ // FIELD: smart text selection start offset in words (as defined by the ICU BreakIterator),
+ // stored as two packed 16bit integers. (start in MSBs, end in LSBs)
+ // CATEGORY: TEXT_SELECTION_SESSION
+ // OS: O MR
+ FIELD_SELECTION_SMART_RANGE = 1123;
+
// ---- End O-MR1 Constants, all O-MR1 constants go above this line ----
// OPEN: Settings > Network & Internet > Mobile network
@@ -4365,6 +4529,11 @@
// OS: P
NOTIFICATION_CHANNEL_GROUP = 1157;
+ // OPEN: Settings > Developer options > Enable > Info dialog
+ // CATEGORY: SETTINGS
+ // OS: P
+ DIALOG_ENABLE_DEVELOPMENT_OPTIONS = 1158;
+
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
}
diff --git a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
index 3a1de98..a6b81ff 100644
--- a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
@@ -47,7 +47,7 @@
private int mUiAutomationFlags;
private IBinder mUiAutomationServiceOwner;
- private final DeathRecipient mUiAutomationSerivceOwnerDeathRecipient =
+ private final DeathRecipient mUiAutomationServiceOwnerDeathRecipient =
new DeathRecipient() {
@Override
public void binderDied() {
@@ -85,7 +85,7 @@
}
try {
- owner.linkToDeath(mUiAutomationSerivceOwnerDeathRecipient, 0);
+ owner.linkToDeath(mUiAutomationServiceOwnerDeathRecipient, 0);
} catch (RemoteException re) {
Slog.e(LOG_TAG, "Couldn't register for the death of a UiTestAutomationService!", re);
return;
@@ -165,12 +165,14 @@
mUiAutomationService = null;
mUiAutomationFlags = 0;
if (mUiAutomationServiceOwner != null) {
- mUiAutomationServiceOwner.unlinkToDeath(mUiAutomationSerivceOwnerDeathRecipient, 0);
+ mUiAutomationServiceOwner.unlinkToDeath(mUiAutomationServiceOwnerDeathRecipient, 0);
mUiAutomationServiceOwner = null;
}
}
private class UiAutomationService extends AccessibilityClientConnection {
+ private final Handler mMainHandler;
+
UiAutomationService(Context context, AccessibilityServiceInfo accessibilityServiceInfo,
int id, Handler mainHandler, Object lock,
AccessibilityManagerService.SecurityPolicy securityPolicy,
@@ -178,15 +180,26 @@
GlobalActionPerformer globalActionPerfomer) {
super(context, COMPONENT_NAME, accessibilityServiceInfo, id, mainHandler, lock,
securityPolicy, systemSupport, windowManagerInternal, globalActionPerfomer);
+ mMainHandler = mainHandler;
}
void connectServiceUnknownThread() {
// This needs to be done on the main thread
- mEventDispatchHandler.post(() -> {
+ mMainHandler.post(() -> {
try {
- mService = mServiceInterface.asBinder();
- mService.linkToDeath(this, 0);
- mServiceInterface.init(this, mId, mOverlayWindowToken);
+ final IAccessibilityServiceClient serviceInterface;
+ final IBinder service;
+ synchronized (mLock) {
+ serviceInterface = mServiceInterface;
+ mService = (serviceInterface == null) ? null : mServiceInterface.asBinder();
+ service = mService;
+ }
+ // If the serviceInterface is null, the UiAutomation has been shut down on
+ // another thread.
+ if (serviceInterface != null) {
+ service.linkToDeath(this, 0);
+ serviceInterface.init(this, mId, mOverlayWindowToken);
+ }
} catch (RemoteException re) {
Slog.w(LOG_TAG, "Error initialized connection", re);
destroyUiAutomationService();
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 2b8b25e..f2f96f8 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -34,6 +34,7 @@
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Bundle;
@@ -481,10 +482,16 @@
sendStateToClients(true);
}
+ @NonNull
CharSequence getServiceLabel() {
return mInfo.getServiceInfo().loadLabel(mContext.getPackageManager());
}
+ @NonNull
+ Drawable getServiceIcon() {
+ return mInfo.getServiceInfo().loadIcon(mContext.getPackageManager());
+ }
+
/**
* Initializes the last fill selection after an autofill service returned a new
* {@link FillResponse}.
@@ -534,10 +541,10 @@
/**
* Updates the last fill selection when an dataset authentication was selected.
*/
- void setDatasetAuthenticationSelected(@Nullable String selectedDataset, int sessionId,
+ void logDatasetAuthenticationSelected(@Nullable String selectedDataset, int sessionId,
@Nullable Bundle clientState) {
synchronized (mLock) {
- if (isValidEventLocked("setDatasetAuthenticationSelected()", sessionId)) {
+ if (isValidEventLocked("logDatasetAuthenticationSelected()", sessionId)) {
mEventHistory.addEvent(
new Event(Event.TYPE_DATASET_AUTHENTICATION_SELECTED, selectedDataset,
clientState));
@@ -548,9 +555,9 @@
/**
* Updates the last fill selection when an save Ui is shown.
*/
- void setSaveShown(int sessionId, @Nullable Bundle clientState) {
+ void logSaveShown(int sessionId, @Nullable Bundle clientState) {
synchronized (mLock) {
- if (isValidEventLocked("setSaveShown()", sessionId)) {
+ if (isValidEventLocked("logSaveShown()", sessionId)) {
mEventHistory.addEvent(new Event(Event.TYPE_SAVE_SHOWN, null, clientState));
}
}
@@ -559,10 +566,10 @@
/**
* Updates the last fill response when a dataset was selected.
*/
- void setDatasetSelected(@Nullable String selectedDataset, int sessionId,
+ void logDatasetSelected(@Nullable String selectedDataset, int sessionId,
@Nullable Bundle clientState) {
synchronized (mLock) {
- if (isValidEventLocked("setDatasetSelected()", sessionId)) {
+ if (isValidEventLocked("logDatasetSelected()", sessionId)) {
mEventHistory.addEvent(
new Event(Event.TYPE_DATASET_SELECTED, selectedDataset, clientState));
}
@@ -629,7 +636,7 @@
void destroySessionsLocked() {
if (mSessions.size() == 0) {
- mUi.destroyAll(AutofillManager.NO_SESSION, null, null);
+ mUi.destroyAll(null, null);
return;
}
while (mSessions.size() > 0) {
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index dd98053..f315148 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -387,8 +387,10 @@
@Override
public void executeMessage(Message message) {
if (mDestroyed) {
- Slog.w(LOG_TAG, "Not handling " + message + " as service for "
- + mComponentName + " is already destroyed");
+ if (sVerbose) {
+ Slog.v(LOG_TAG, "Not handling " + message + " as service for "
+ + mComponentName + " is already destroyed");
+ }
return;
}
switch (message.what) {
@@ -574,6 +576,13 @@
@Override
public void run() {
+ synchronized (mLock) {
+ if (isCancelledLocked()) {
+ // TODO(b/653742740): we should probably return here, but for now we're justing
+ // logging to confirm this is the problem if it happens again.
+ Slog.e(LOG_TAG, "run() called after canceled: " + mRequest);
+ }
+ }
final RemoteFillService remoteService = getService();
if (remoteService != null) {
try {
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 8d9f0aa2..171053f 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -177,6 +177,12 @@
private PendingUi mPendingSaveUi;
/**
+ * List of dataset ids selected by the user.
+ */
+ @GuardedBy("mLock")
+ private ArrayList<String> mSelectedDatasetIds;
+
+ /**
* Receiver of assist data from the app's {@link Activity}.
*/
private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() {
@@ -268,7 +274,7 @@
value = state.getCurrentValue();
if (value == null) {
if (sDebug) Slog.d(TAG, "getValue(): no current value for " + id);
- value = getValueFromContexts(id);
+ value = getValueFromContextsLocked(id);
}
}
if (value != null) {
@@ -276,7 +282,7 @@
return value.getTextValue().toString();
}
if (value.isList()) {
- final CharSequence[] options = getAutofillOptionsFromContexts(id);
+ final CharSequence[] options = getAutofillOptionsFromContextsLocked(id);
if (options != null) {
final int index = value.getListValue();
final CharSequence option = options[index];
@@ -339,21 +345,21 @@
* Cancels the last request sent to the {@link #mRemoteFillService}.
*/
private void cancelCurrentRequestLocked() {
- int canceledRequest = mRemoteFillService.cancelCurrentRequest();
+ final int canceledRequest = mRemoteFillService.cancelCurrentRequest();
// Remove the FillContext as there will never be a response for the service
if (canceledRequest != INVALID_REQUEST_ID && mContexts != null) {
- int numContexts = mContexts.size();
+ final int numContexts = mContexts.size();
// It is most likely the last context, hence search backwards
for (int i = numContexts - 1; i >= 0; i--) {
if (mContexts.get(i).getRequestId() == canceledRequest) {
+ if (sDebug) Slog.d(TAG, "cancelCurrentRequest(): id = " + canceledRequest);
mContexts.remove(i);
break;
}
}
}
-
}
/**
@@ -456,14 +462,7 @@
}
}
if (response == null) {
- if (sVerbose) Slog.v(TAG, "canceling session " + id + " when server returned null");
- if ((requestFlags & FLAG_MANUAL_REQUEST) != 0) {
- getUiForShowing().showError(R.string.autofill_error_cannot_autofill, this);
- }
- mService.resetLastResponse();
- // Nothing to be done, but need to notify client.
- notifyUnavailableToClient();
- removeSelf();
+ processNullResponseLocked(requestFlags);
return;
}
@@ -586,15 +585,12 @@
public void authenticate(int requestId, int datasetIndex, IntentSender intent, Bundle extras) {
final Intent fillInIntent;
synchronized (mLock) {
- synchronized (mLock) {
- if (mDestroyed) {
- Slog.w(TAG, "Call to Session#authenticate() rejected - session: "
- + id + " destroyed");
- return;
- }
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#authenticate() rejected - session: "
+ + id + " destroyed");
+ return;
}
- fillInIntent = createAuthFillInIntent(
- getFillContextByRequestIdLocked(requestId).getStructure(), extras);
+ fillInIntent = createAuthFillInIntentLocked(requestId, extras);
}
mService.setAuthenticationSelected(id, mClientState);
@@ -620,7 +616,7 @@
return;
}
}
- mHandlerCaller.getHandler().post(() -> autoFill(requestId, datasetIndex, dataset));
+ mHandlerCaller.getHandler().post(() -> autoFill(requestId, datasetIndex, dataset, true));
}
// AutoFillUiCallback
@@ -748,16 +744,24 @@
}
final Parcelable result = data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT);
+ if (sDebug) Slog.d(TAG, "setAuthenticationResultLocked(): result=" + result);
if (result instanceof FillResponse) {
final FillResponse response = (FillResponse) result;
mMetricsLogger.action(MetricsEvent.AUTOFILL_AUTHENTICATED, mPackageName);
replaceResponseLocked(authenticatedResponse, response);
} else if (result instanceof Dataset) {
+ // TODO: add proper metric
if (datasetIdx != AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED) {
final Dataset dataset = (Dataset) result;
authenticatedResponse.getDatasets().set(datasetIdx, dataset);
- autoFill(requestId, datasetIdx, dataset);
+ autoFill(requestId, datasetIdx, dataset, false);
}
+ } else {
+ if (result != null) {
+ Slog.w(TAG, "service returned invalid auth type: " + result);
+ }
+ // TODO: add proper metric (on else)
+ processNullResponseLocked(0);
}
}
@@ -845,7 +849,7 @@
AutofillValue value = viewState.getCurrentValue();
if (value == null || value.isEmpty()) {
- final AutofillValue initialValue = getValueFromContexts(id);
+ final AutofillValue initialValue = getValueFromContextsLocked(id);
if (initialValue != null) {
if (sDebug) {
Slog.d(TAG, "Value of required field " + id + " didn't change; "
@@ -899,7 +903,7 @@
}
} else {
// Update current values cache based on initial value
- final AutofillValue initialValue = getValueFromContexts(id);
+ final AutofillValue initialValue = getValueFromContextsLocked(id);
if (sDebug) {
Slog.d(TAG, "no current value for " + id + "; initial value is "
+ initialValue);
@@ -970,11 +974,11 @@
}
if (sDebug) Slog.d(TAG, "Good news, everyone! All checks passed, show save UI!");
- mService.setSaveShown(id, mClientState);
+ mService.logSaveShown(id, mClientState);
final IAutoFillManagerClient client = getClient();
- mPendingSaveUi = new PendingUi(mActivityToken);
- getUiForShowing().showSaveUi(mService.getServiceLabel(), saveInfo,
- valueFinder, mPackageName, this, mPendingSaveUi, id, client);
+ mPendingSaveUi = new PendingUi(mActivityToken, id, client);
+ getUiForShowing().showSaveUi(mService.getServiceLabel(), mService.getServiceIcon(),
+ saveInfo, valueFinder, mPackageName, this, mPendingSaveUi);
if (client != null) {
try {
client.setSaveUiState(id, true);
@@ -1006,7 +1010,7 @@
* Gets the latest non-empty value for the given id in the autofill contexts.
*/
@Nullable
- private AutofillValue getValueFromContexts(AutofillId id) {
+ private AutofillValue getValueFromContextsLocked(AutofillId id) {
final int numContexts = mContexts.size();
for (int i = numContexts - 1; i >= 0; i--) {
final FillContext context = mContexts.get(i);
@@ -1028,7 +1032,7 @@
* Gets the latest autofill options for the given id in the autofill contexts.
*/
@Nullable
- private CharSequence[] getAutofillOptionsFromContexts(AutofillId id) {
+ private CharSequence[] getAutofillOptionsFromContextsLocked(AutofillId id) {
final int numContexts = mContexts.size();
for (int i = numContexts - 1; i >= 0; i--) {
@@ -1053,6 +1057,11 @@
if (sVerbose) Slog.v(TAG, "callSaveLocked(): mViewStates=" + mViewStates);
+ if (mContexts == null) {
+ Slog.w(TAG, "callSaveLocked(): no contexts");
+ return;
+ }
+
final int numContexts = mContexts.size();
for (int contextNum = 0; contextNum < numContexts; contextNum++) {
@@ -1098,7 +1107,8 @@
// until the dispatch happens. The items in the list don't need to be cloned
// since we don't hold on them anywhere else. The client state is not touched
// by us, so no need to copy.
- final SaveRequest saveRequest = new SaveRequest(new ArrayList<>(mContexts), mClientState);
+ final SaveRequest saveRequest = new SaveRequest(new ArrayList<>(mContexts), mClientState,
+ mSelectedDatasetIds);
mRemoteFillService.onSaveRequest(saveRequest);
}
@@ -1409,6 +1419,17 @@
processResponseLocked(newResponse, 0);
}
+ private void processNullResponseLocked(int flags) {
+ if (sVerbose) Slog.v(TAG, "canceling session " + id + " when server returned null");
+ if ((flags & FLAG_MANUAL_REQUEST) != 0) {
+ getUiForShowing().showError(R.string.autofill_error_cannot_autofill, this);
+ }
+ mService.resetLastResponse();
+ // Nothing to be done, but need to notify client.
+ notifyUnavailableToClient();
+ removeSelf();
+ }
+
private void processResponseLocked(@NonNull FillResponse newResponse, int flags) {
// Make sure we are hiding the UI which will be shown
// only if handling the current response requires it.
@@ -1523,7 +1544,7 @@
return viewState;
}
- void autoFill(int requestId, int datasetIndex, Dataset dataset) {
+ void autoFill(int requestId, int datasetIndex, Dataset dataset, boolean generateEvent) {
synchronized (mLock) {
if (mDestroyed) {
Slog.w(TAG, "Call to Session#autoFill() rejected - session: "
@@ -1532,17 +1553,18 @@
}
// Autofill it directly...
if (dataset.getAuthentication() == null) {
- mService.setDatasetSelected(dataset.getId(), id, mClientState);
+ if (generateEvent) {
+ mService.logDatasetSelected(dataset.getId(), id, mClientState);
+ }
autoFillApp(dataset);
return;
}
// ...or handle authentication.
- mService.setDatasetAuthenticationSelected(dataset.getId(), id, mClientState);
+ mService.logDatasetAuthenticationSelected(dataset.getId(), id, mClientState);
setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH, false);
- final Intent fillInIntent = createAuthFillInIntent(
- getFillContextByRequestIdLocked(requestId).getStructure(), mClientState);
+ final Intent fillInIntent = createAuthFillInIntentLocked(requestId, mClientState);
final int authenticationId = AutofillManager.makeAuthenticationId(requestId,
datasetIndex);
@@ -1556,9 +1578,16 @@
}
}
- private Intent createAuthFillInIntent(AssistStructure structure, Bundle extras) {
+ private Intent createAuthFillInIntentLocked(int requestId, Bundle extras) {
final Intent fillInIntent = new Intent();
- fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, structure);
+
+ final FillContext context = getFillContextByRequestIdLocked(requestId);
+ if (context == null) {
+ // TODO(b/653742740): this will crash system_server. We need to handle it, but we're
+ // keeping it crashing for now so we can diagnose when it happens again
+ Slog.wtf(TAG, "no FillContext for requestId" + requestId + "; mContexts= " + mContexts);
+ }
+ fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, context.getStructure());
fillInIntent.putExtra(AutofillManager.EXTRA_CLIENT_STATE, extras);
return fillInIntent;
}
@@ -1626,6 +1655,7 @@
pw.print(prefix); pw.print("mHasCallback: "); pw.println(mHasCallback);
pw.print(prefix); pw.print("mClientState: "); pw.println(
Helper.bundleToString(mClientState));
+ pw.print(prefix); pw.print("mSelectedDatasetIds: "); pw.println(mSelectedDatasetIds);
mRemoteFillService.dump(prefix, pw);
}
@@ -1666,6 +1696,12 @@
if (sDebug) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
mClient.autofill(id, ids, values);
+ if (dataset.getId() != null) {
+ if (mSelectedDatasetIds == null) {
+ mSelectedDatasetIds = new ArrayList<>();
+ }
+ mSelectedDatasetIds.add(dataset.getId());
+ }
setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
}
} catch (RemoteException e) {
@@ -1696,7 +1732,7 @@
if (mDestroyed) {
return null;
}
- mUi.destroyAll(id, getClient(), this);
+ mUi.destroyAll(mPendingSaveUi, this);
mUi.clearCallback(this);
mDestroyed = true;
mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_FINISHED, mPackageName);
@@ -1712,7 +1748,7 @@
mPendingSaveUi = null;
removeSelfLocked();
- mUi.destroyAll(id, getClient(), this);
+ mUi.destroyAll(mPendingSaveUi, this);
}
/**
@@ -1753,7 +1789,8 @@
/**
* Checks whether this session is hiding the Save UI to handle a custom description link for
- * a specific {@code token} created by {@link PendingUi#PendingUi(IBinder)}.
+ * a specific {@code token} created by
+ * {@link PendingUi#PendingUi(IBinder, int, IAutoFillManagerClient)}.
*/
boolean isSaveUiPendingForToken(@NonNull IBinder token) {
return isSaveUiPending() && token.equals(mPendingSaveUi.getToken());
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index 7febf83..cac2bff 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -22,6 +22,7 @@
import android.annotation.Nullable;
import android.content.Context;
import android.content.IntentSender;
+import android.graphics.drawable.Drawable;
import android.metrics.LogMaker;
import android.os.Bundle;
import android.os.Handler;
@@ -35,7 +36,6 @@
import android.util.Slog;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
-import android.view.autofill.IAutoFillManagerClient;
import android.view.autofill.IAutofillWindowPresenter;
import android.widget.Toast;
@@ -245,10 +245,9 @@
/**
* Shows the UI asking the user to save for autofill.
*/
- public void showSaveUi(@NonNull CharSequence providerLabel, @NonNull SaveInfo info,
- @NonNull ValueFinder valueFinder, @NonNull String packageName,
- @NonNull AutoFillUiCallback callback, @NonNull PendingUi pendingUi,
- int sessionId, @Nullable IAutoFillManagerClient client) {
+ public void showSaveUi(@NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon,
+ @NonNull SaveInfo info,@NonNull ValueFinder valueFinder, @NonNull String packageName,
+ @NonNull AutoFillUiCallback callback, @NonNull PendingUi pendingSaveUi) {
if (sVerbose) Slog.v(TAG, "showSaveUi() for " + packageName + ": " + info);
int numIds = 0;
numIds += info.getRequiredIds() == null ? 0 : info.getRequiredIds().length;
@@ -263,8 +262,8 @@
return;
}
hideAllUiThread(callback);
- mSaveUi = new SaveUi(mContext, pendingUi, providerLabel, info, valueFinder,
- mOverlayControl, client, new SaveUi.OnSaveListener() {
+ mSaveUi = new SaveUi(mContext, pendingSaveUi, serviceLabel, serviceIcon, info,
+ valueFinder, mOverlayControl, new SaveUi.OnSaveListener() {
@Override
public void onSave() {
log.setType(MetricsProto.MetricsEvent.TYPE_ACTION);
@@ -272,7 +271,7 @@
if (mCallback != null) {
mCallback.save();
}
- destroySaveUiUiThread(sessionId, client);
+ destroySaveUiUiThread(pendingSaveUi);
}
@Override
@@ -290,7 +289,7 @@
if (mCallback != null) {
mCallback.cancelSave();
}
- destroySaveUiUiThread(sessionId, client);
+ destroySaveUiUiThread(pendingSaveUi);
}
@Override
@@ -331,9 +330,9 @@
/**
* Destroy all UI affordances.
*/
- public void destroyAll(int sessionId, @Nullable IAutoFillManagerClient client,
+ public void destroyAll(@Nullable PendingUi pendingSaveUi,
@Nullable AutoFillUiCallback callback) {
- mHandler.post(() -> destroyAllUiThread(sessionId, client, callback));
+ mHandler.post(() -> destroyAllUiThread(pendingSaveUi, callback));
}
public void dump(PrintWriter pw) {
@@ -363,18 +362,20 @@
}
@android.annotation.UiThread
- private void hideSaveUiUiThread(@Nullable AutoFillUiCallback callback) {
+ @Nullable
+ private PendingUi hideSaveUiUiThread(@Nullable AutoFillUiCallback callback) {
if (sVerbose) {
Slog.v(TAG, "hideSaveUiUiThread(): mSaveUi=" + mSaveUi + ", callback=" + callback
+ ", mCallback=" + mCallback);
}
if (mSaveUi != null && (callback == null || callback == mCallback)) {
- mSaveUi.hide();
+ return mSaveUi.hide();
}
+ return null;
}
@android.annotation.UiThread
- private void destroySaveUiUiThread(int sessionId, @Nullable IAutoFillManagerClient client) {
+ private void destroySaveUiUiThread(@Nullable PendingUi pendingSaveUi) {
if (mSaveUi == null) {
// Calling destroySaveUiUiThread() twice is normal - it usually happens when the
// first call is made after the SaveUI is hidden and the second when the session is
@@ -383,13 +384,13 @@
return;
}
- if (sDebug) Slog.d(TAG, "destroySaveUiUiThread(): id=" + sessionId);
+ if (sDebug) Slog.d(TAG, "destroySaveUiUiThread(): " + pendingSaveUi);
mSaveUi.destroy();
mSaveUi = null;
- if (client != null) {
+ if (pendingSaveUi != null) {
try {
if (sDebug) Slog.d(TAG, "destroySaveUiUiThread(): notifying client");
- client.setSaveUiState(sessionId, false);
+ pendingSaveUi.client.setSaveUiState(pendingSaveUi.id, false);
} catch (RemoteException e) {
Slog.e(TAG, "Error notifying client to set save UI state to hidden: " + e);
}
@@ -397,15 +398,22 @@
}
@android.annotation.UiThread
- private void destroyAllUiThread(int sessionId, @Nullable IAutoFillManagerClient client,
+ private void destroyAllUiThread(@Nullable PendingUi pendingSaveUi,
@Nullable AutoFillUiCallback callback) {
hideFillUiUiThread(callback);
- destroySaveUiUiThread(sessionId, client);
+ destroySaveUiUiThread(pendingSaveUi);
}
@android.annotation.UiThread
private void hideAllUiThread(@Nullable AutoFillUiCallback callback) {
hideFillUiUiThread(callback);
- hideSaveUiUiThread(callback);
+ final PendingUi pendingSaveUi = hideSaveUiUiThread(callback);
+ if (pendingSaveUi != null && pendingSaveUi.getState() == PendingUi.STATE_FINISHED) {
+ if (sDebug) {
+ Slog.d(TAG, "hideAllUiThread(): "
+ + "destroying Save UI because pending restoration is finished");
+ }
+ destroySaveUiUiThread(pendingSaveUi);
+ }
}
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index 24f3b33..371e74d 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -229,6 +229,13 @@
public void setFilterText(@Nullable String filterText) {
throwIfDestroyed();
if (mAdapter == null) {
+ // ViewState doesn't not support filtering - typically when it's for an authenticated
+ // FillResponse.
+ if (TextUtils.isEmpty(filterText)) {
+ mCallback.requestShowFillUi(mContentWidth, mContentHeight, mWindowPresenter);
+ } else {
+ mCallback.requestHideFillUi();
+ }
return;
}
@@ -510,8 +517,9 @@
final ViewItem item = mAllItems.get(i);
final String value = item.getValue();
// No value, i.e. null, matches any filter
- if (value == null
- || value.toLowerCase().startsWith(constraintLowerCase)) {
+ if ((value == null && item.mDataset.getAuthentication() == null)
+ || (value != null
+ && value.toLowerCase().startsWith(constraintLowerCase))) {
filteredItems.add(item);
}
}
@@ -525,9 +533,11 @@
final boolean resultCountChanged;
final int oldItemCount = mFilteredItems.size();
mFilteredItems.clear();
- @SuppressWarnings("unchecked")
- final List<ViewItem> items = (List<ViewItem>) results.values;
- mFilteredItems.addAll(items);
+ if (results.count > 0) {
+ @SuppressWarnings("unchecked")
+ final List<ViewItem> items = (List<ViewItem>) results.values;
+ mFilteredItems.addAll(items);
+ }
resultCountChanged = (oldItemCount != mFilteredItems.size());
if (resultCountChanged) {
announceSearchResultIfNeeded();
diff --git a/services/autofill/java/com/android/server/autofill/ui/PendingUi.java b/services/autofill/java/com/android/server/autofill/ui/PendingUi.java
index 87263ed..0851d3b 100644
--- a/services/autofill/java/com/android/server/autofill/ui/PendingUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/PendingUi.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.os.IBinder;
import android.util.DebugUtils;
+import android.view.autofill.IAutoFillManagerClient;
/**
* Helper class used to handle a pending Autofill affordance such as the Save UI.
@@ -34,15 +35,19 @@
private final IBinder mToken;
private int mState;
+ public final int id;
+ public final IAutoFillManagerClient client;
/**
* Default constructor.
*
* @param token token used to identify this pending UI.
*/
- public PendingUi(@NonNull IBinder token) {
+ public PendingUi(@NonNull IBinder token, int id, @NonNull IAutoFillManagerClient client) {
mToken = token;
mState = STATE_CREATED;
+ this.id = id;
+ this.client = client;
}
/**
@@ -76,7 +81,7 @@
@Override
public String toString() {
- return "PendingUi: [token=" + mToken + ", state="
+ return "PendingUi: [token=" + mToken + ", id=" + id + ", state="
+ DebugUtils.flagsToString(PendingUi.class, "STATE_", mState) + "]";
}
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index 67c1b8c..d0b2e92 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -22,10 +22,14 @@
import android.annotation.NonNull;
import android.app.Dialog;
import android.app.PendingIntent;
-import android.app.PendingIntent.CanceledException;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
@@ -43,7 +47,7 @@
import android.view.Window;
import android.view.WindowManager;
import android.view.autofill.AutofillManager;
-import android.view.autofill.IAutoFillManagerClient;
+import android.widget.ImageView;
import android.widget.RemoteViews;
import android.widget.ScrollView;
import android.widget.TextView;
@@ -121,9 +125,9 @@
private boolean mDestroyed;
SaveUi(@NonNull Context context, @NonNull PendingUi pendingUi,
- @NonNull CharSequence providerLabel, @NonNull SaveInfo info,
- @NonNull ValueFinder valueFinder, @NonNull OverlayControl overlayControl,
- @NonNull IAutoFillManagerClient client, @NonNull OnSaveListener listener) {
+ @NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon,
+ @NonNull SaveInfo info, @NonNull ValueFinder valueFinder,
+ @NonNull OverlayControl overlayControl, @NonNull OnSaveListener listener) {
mPendingUi= pendingUi;
mListener = new OneTimeListener(listener);
mOverlayControl = overlayControl;
@@ -155,24 +159,25 @@
switch (types.size()) {
case 1:
mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_type,
- types.valueAt(0), providerLabel), 0);
+ types.valueAt(0), serviceLabel), 0);
break;
case 2:
mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_2types,
- types.valueAt(0), types.valueAt(1), providerLabel), 0);
+ types.valueAt(0), types.valueAt(1), serviceLabel), 0);
break;
case 3:
mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_3types,
- types.valueAt(0), types.valueAt(1), types.valueAt(2), providerLabel), 0);
+ types.valueAt(0), types.valueAt(1), types.valueAt(2), serviceLabel), 0);
break;
default:
// Use generic if more than 3 or invalid type (size 0).
mTitle = Html.fromHtml(
- context.getString(R.string.autofill_save_title, providerLabel), 0);
+ context.getString(R.string.autofill_save_title, serviceLabel), 0);
}
-
titleView.setText(mTitle);
+ setServiceIcon(context, view, serviceIcon);
+
ScrollView subtitleContainer = null;
final CustomDescription customDescription = info.getCustomDescription();
if (customDescription != null) {
@@ -206,7 +211,7 @@
final IBinder token = mPendingUi.getToken();
intent.putExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN, token);
try {
- client.startIntentSender(pendingIntent.getIntentSender(),
+ pendingUi.client.startIntentSender(pendingIntent.getIntentSender(),
intent);
mPendingUi.setState(PendingUi.STATE_PENDING);
if (sDebug) {
@@ -284,6 +289,30 @@
show();
}
+ private void setServiceIcon(Context context, View view, Drawable serviceIcon) {
+ final ImageView iconView = view.findViewById(R.id.autofill_save_icon);
+ final Resources res = context.getResources();
+
+ final int maxWidth = res.getDimensionPixelSize(R.dimen.autofill_save_icon_max_size);
+ final int maxHeight = maxWidth;
+ final int actualWidth = serviceIcon.getMinimumWidth();
+ final int actualHeight = serviceIcon.getMinimumHeight();
+
+ if (actualWidth <= maxWidth && actualHeight <= maxHeight) {
+ if (sDebug) {
+ Slog.d(TAG, "Addingservice icon "
+ + "(" + actualWidth + "x" + actualHeight + ") as it's less than maximum "
+ + "(" + maxWidth + "x" + maxHeight + ").");
+ }
+ iconView.setImageDrawable(serviceIcon);
+ } else {
+ Slog.w(TAG, "Not adding service icon of size "
+ + "(" + actualWidth + "x" + actualHeight + ") because maximum is "
+ + "(" + maxWidth + "x" + maxHeight + ").");
+ iconView.setVisibility(View.INVISIBLE);
+ }
+ }
+
/**
* Update the pending UI, if any.
*
@@ -318,13 +347,14 @@
mOverlayControl.hideOverlays();
}
- void hide() {
+ PendingUi hide() {
if (sVerbose) Slog.v(TAG, "Hiding save dialog.");
try {
mDialog.hide();
} finally {
mOverlayControl.showOverlays();
}
+ return mPendingUi;
}
void destroy() {
diff --git a/services/backup/java/com/android/server/backup/BackupManagerConstants.java b/services/backup/java/com/android/server/backup/BackupManagerConstants.java
new file mode 100644
index 0000000..cd60182
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/BackupManagerConstants.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup;
+
+import android.app.AlarmManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.KeyValueListParser;
+import android.util.Slog;
+
+/**
+ * Class to access backup manager constants.
+ *
+ * The backup manager constants are encoded as a key value list separated by commas
+ * and stored as a Settings.Secure.
+ */
+class BackupManagerConstants extends ContentObserver {
+ private static final String TAG = "BackupManagerConstants";
+
+ // Key names stored in the secure settings value.
+ private static final String KEY_VALUE_BACKUP_INTERVAL_MILLISECONDS =
+ "key_value_backup_interval_milliseconds";
+ private static final String KEY_VALUE_BACKUP_FUZZ_MILLISECONDS =
+ "key_value_backup_fuzz_milliseconds";
+ private static final String KEY_VALUE_BACKUP_REQUIRE_CHARGING =
+ "key_value_backup_require_charging";
+ private static final String KEY_VALUE_BACKUP_REQUIRED_NETWORK_TYPE =
+ "key_value_backup_required_network_type";
+ private static final String FULL_BACKUP_INTERVAL_MILLISECONDS =
+ "full_backup_interval_milliseconds";
+ private static final String FULL_BACKUP_REQUIRE_CHARGING =
+ "full_backup_require_charging";
+ private static final String FULL_BACKUP_REQUIRED_NETWORK_TYPE =
+ "full_backup_required_network_type";
+
+ // Hard coded default values.
+ private static final long DEFAULT_KEY_VALUE_BACKUP_INTERVAL_MILLISECONDS =
+ 4 * AlarmManager.INTERVAL_HOUR;
+ private static final long DEFAULT_KEY_VALUE_BACKUP_FUZZ_MILLISECONDS =
+ 10 * 60 * 1000;
+ private static final boolean DEFAULT_KEY_VALUE_BACKUP_REQUIRE_CHARGING = true;
+ private static final int DEFAULT_KEY_VALUE_BACKUP_REQUIRED_NETWORK_TYPE = 1;
+ private static final long DEFAULT_FULL_BACKUP_INTERVAL_MILLISECONDS =
+ 24 * AlarmManager.INTERVAL_HOUR;
+ private static final boolean DEFAULT_FULL_BACKUP_REQUIRE_CHARGING = true;
+ private static final int DEFAULT_FULL_BACKUP_REQUIRED_NETWORK_TYPE = 2;
+
+ // Backup manager constants.
+ private long mKeyValueBackupIntervalMilliseconds;
+ private long mKeyValueBackupFuzzMilliseconds;
+ private boolean mKeyValueBackupRequireCharging;
+ private int mKeyValueBackupRequiredNetworkType;
+ private long mFullBackupIntervalMilliseconds;
+ private boolean mFullBackupRequireCharging;
+ private int mFullBackupRequiredNetworkType;
+
+ private ContentResolver mResolver;
+ private final KeyValueListParser mParser = new KeyValueListParser(',');
+
+ public BackupManagerConstants(Handler handler, ContentResolver resolver) {
+ super(handler);
+ mResolver = resolver;
+ updateSettings();
+ }
+
+ public void start() {
+ mResolver.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.BACKUP_MANAGER_CONSTANTS), false, this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updateSettings();
+ }
+
+ private synchronized void updateSettings() {
+ try {
+ mParser.setString(Settings.Secure.getString(mResolver,
+ Settings.Secure.BACKUP_MANAGER_CONSTANTS));
+ } catch (IllegalArgumentException e) {
+ // Failed to parse the settings string. Use defaults.
+ Slog.e(TAG, "Bad backup manager constants: " + e.getMessage());
+ }
+
+ mKeyValueBackupIntervalMilliseconds = mParser.getLong(
+ KEY_VALUE_BACKUP_INTERVAL_MILLISECONDS,
+ DEFAULT_KEY_VALUE_BACKUP_INTERVAL_MILLISECONDS);
+ mKeyValueBackupFuzzMilliseconds = mParser.getLong(KEY_VALUE_BACKUP_FUZZ_MILLISECONDS,
+ DEFAULT_KEY_VALUE_BACKUP_FUZZ_MILLISECONDS);
+ mKeyValueBackupRequireCharging = mParser.getBoolean(KEY_VALUE_BACKUP_REQUIRE_CHARGING,
+ DEFAULT_KEY_VALUE_BACKUP_REQUIRE_CHARGING);
+ mKeyValueBackupRequiredNetworkType = mParser.getInt(KEY_VALUE_BACKUP_REQUIRED_NETWORK_TYPE,
+ DEFAULT_KEY_VALUE_BACKUP_REQUIRED_NETWORK_TYPE);
+ mFullBackupIntervalMilliseconds = mParser.getLong(FULL_BACKUP_INTERVAL_MILLISECONDS,
+ DEFAULT_FULL_BACKUP_INTERVAL_MILLISECONDS);
+ mFullBackupRequireCharging = mParser.getBoolean(FULL_BACKUP_REQUIRE_CHARGING,
+ DEFAULT_FULL_BACKUP_REQUIRE_CHARGING);
+ mFullBackupRequiredNetworkType = mParser.getInt(FULL_BACKUP_REQUIRED_NETWORK_TYPE,
+ DEFAULT_FULL_BACKUP_REQUIRED_NETWORK_TYPE);
+ }
+
+ // The following are access methods for the individual parameters.
+ // To be sure to retrieve values from the same set of settings,
+ // group the calls of these methods in a block syncrhonized on
+ // a reference of this object.
+ public synchronized long getKeyValueBackupIntervalMilliseconds() {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getKeyValueBackupIntervalMilliseconds(...) returns "
+ + mKeyValueBackupIntervalMilliseconds);
+ }
+ return mKeyValueBackupIntervalMilliseconds;
+ }
+
+ public synchronized long getKeyValueBackupFuzzMilliseconds() {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getKeyValueBackupFuzzMilliseconds(...) returns "
+ + mKeyValueBackupFuzzMilliseconds);
+ }
+ return mKeyValueBackupFuzzMilliseconds;
+ }
+
+ public synchronized boolean getKeyValueBackupRequireCharging() {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getKeyValueBackupRequireCharging(...) returns "
+ + mKeyValueBackupRequireCharging);
+ }
+ return mKeyValueBackupRequireCharging;
+ }
+
+ public synchronized int getKeyValueBackupRequiredNetworkType() {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getKeyValueBackupRequiredNetworkType(...) returns "
+ + mKeyValueBackupRequiredNetworkType);
+ }
+ return mKeyValueBackupRequiredNetworkType;
+ }
+
+ public synchronized long getFullBackupIntervalMilliseconds() {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getFullBackupIntervalMilliseconds(...) returns "
+ + mFullBackupIntervalMilliseconds);
+ }
+ return mFullBackupIntervalMilliseconds;
+ }
+
+ public synchronized boolean getFullBackupRequireCharging() {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getFullBackupRequireCharging(...) returns " + mFullBackupRequireCharging);
+ }
+ return mFullBackupRequireCharging;
+
+ }
+
+ public synchronized int getFullBackupRequiredNetworkType() {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getFullBackupRequiredNetworkType(...) returns "
+ + mFullBackupRequiredNetworkType);
+ }
+ return mFullBackupRequiredNetworkType;
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index d2f8bac..2a2e1fb 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -4535,7 +4535,7 @@
}
mOutputFile.close();
} catch (IOException e) {
- /* nothing we can do about this */
+ Slog.e(TAG, "IO error closing adb backup file: " + e.getMessage());
}
synchronized (mLatch) {
mLatch.set(true);
@@ -10112,7 +10112,7 @@
try {
fd.close();
} catch (IOException e) {
- // just eat it
+ Slog.e(TAG, "IO error closing output for adb backup: " + e.getMessage());
}
Binder.restoreCallingIdentity(oldId);
Slog.d(TAG, "Adb backup processing complete.");
diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
index b6e3f0f..9e8ec64 100644
--- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
@@ -2396,7 +2396,7 @@
try {
fd.close();
} catch (IOException e) {
- // just eat it
+ Slog.e(TAG, "IO error closing output for adb backup: " + e.getMessage());
}
Binder.restoreCallingIdentity(oldId);
Slog.d(TAG, "Adb backup processing complete.");
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
index 804e92c..4085f63 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
@@ -459,7 +459,7 @@
}
mOutputFile.close();
} catch (IOException e) {
- /* nothing we can do about this */
+ Slog.e(TAG, "IO error closing adb backup file: " + e.getMessage());
}
synchronized (mLatch) {
mLatch.set(true);
diff --git a/services/core/Android.mk b/services/core/Android.mk
index 5ec5370..7776346 100644
--- a/services/core/Android.mk
+++ b/services/core/Android.mk
@@ -6,8 +6,8 @@
LOCAL_AIDL_INCLUDES := \
frameworks/native/aidl/binder \
- system/netd/server/binder
-
+ system/netd/server/binder \
+ system/vold/binder
LOCAL_SRC_FILES += \
$(call all-java-files-under,java) \
@@ -15,6 +15,8 @@
java/com/android/server/am/EventLogTags.logtags \
../../../../system/netd/server/binder/android/net/INetd.aidl \
../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl \
+ ../../../../system/vold/binder/android/os/IVold.aidl \
+ ../../../../system/vold/binder/android/os/IVoldListener.aidl \
../../../native/cmds/installd/binder/android/os/IInstalld.aidl \
LOCAL_AIDL_INCLUDES += \
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index cab6ecf..4c08f62 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -245,8 +245,6 @@
private static final long DEFAULT_LISTENER_TIMEOUT = 5 * 1000;
- private static final boolean DEFAULT_BACKGROUND_RESTRICTIONS_ENABLED = false;
-
// Minimum futurity of a new alarm
public long MIN_FUTURITY = DEFAULT_MIN_FUTURITY;
@@ -266,8 +264,6 @@
// Direct alarm listener callback timeout
public long LISTENER_TIMEOUT = DEFAULT_LISTENER_TIMEOUT;
- public boolean BACKGROUND_ALARMS_BLOCKED = DEFAULT_BACKGROUND_RESTRICTIONS_ENABLED;
-
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
private long mLastAllowWhileIdleWhitelistDuration = -1;
@@ -326,21 +322,6 @@
DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION);
LISTENER_TIMEOUT = mParser.getLong(KEY_LISTENER_TIMEOUT,
DEFAULT_LISTENER_TIMEOUT);
- BACKGROUND_ALARMS_BLOCKED = mParser.getBoolean(KEY_BG_RESTRICTIONS_ENABLED,
- DEFAULT_BACKGROUND_RESTRICTIONS_ENABLED);
- if (!BACKGROUND_ALARMS_BLOCKED) {
- // TODO: remove this code and constant when feature is turned on
- // deliver all blocked alarms
- final ArrayList<Alarm> allBlockedAlarms = new ArrayList<>();
- for (int i = mPendingBackgroundAlarms.size() - 1; i >=0; i--) {
- allBlockedAlarms.addAll(mPendingBackgroundAlarms.valueAt(i));
- }
- mPendingBackgroundAlarms = new SparseArray<>();
- deliverPendingBackgroundAlarmsLocked(allBlockedAlarms,
- SystemClock.elapsedRealtime());
- } else if (DEBUG_BG_LIMIT) {
- Slog.d(TAG, "Background limiting enabled");
- }
updateAllowWhileIdleMinTimeLocked();
updateAllowWhileIdleWhitelistDurationLocked();
@@ -2392,9 +2373,6 @@
}
private boolean isBackgroundRestricted(Alarm alarm) {
- if (!mConstants.BACKGROUND_ALARMS_BLOCKED) {
- return false;
- }
if (alarm.alarmClock != null) {
// Don't block alarm clocks
return false;
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 04b2112..bfe5040 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -4343,11 +4343,13 @@
int currentScore, NetworkMisc networkMisc) {
enforceConnectivityInternalPermission();
+ LinkProperties lp = new LinkProperties(linkProperties);
+ lp.ensureDirectlyConnectedRoutes();
// TODO: Instead of passing mDefaultRequest, provide an API to determine whether a Network
// satisfies mDefaultRequest.
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
- new Network(reserveNetId()), new NetworkInfo(networkInfo), new LinkProperties(
- linkProperties), new NetworkCapabilities(networkCapabilities), currentScore,
+ new Network(reserveNetId()), new NetworkInfo(networkInfo), lp,
+ new NetworkCapabilities(networkCapabilities), currentScore,
mContext, mTrackerHandler, new NetworkMisc(networkMisc), mDefaultRequest, this);
synchronized (this) {
nai.networkMonitor.systemReady = mSystemReady;
@@ -4441,12 +4443,9 @@
private void updateInterfaces(LinkProperties newLp, LinkProperties oldLp, int netId,
NetworkCapabilities caps) {
- CompareResult<String> interfaceDiff = new CompareResult<String>();
- if (oldLp != null) {
- interfaceDiff = oldLp.compareAllInterfaceNames(newLp);
- } else if (newLp != null) {
- interfaceDiff.added = newLp.getAllInterfaceNames();
- }
+ CompareResult<String> interfaceDiff = new CompareResult<String>(
+ oldLp != null ? oldLp.getAllInterfaceNames() : null,
+ newLp != null ? newLp.getAllInterfaceNames() : null);
for (String iface : interfaceDiff.added) {
try {
if (DBG) log("Adding iface " + iface + " to network " + netId);
@@ -4472,12 +4471,10 @@
* @return true if routes changed between oldLp and newLp
*/
private boolean updateRoutes(LinkProperties newLp, LinkProperties oldLp, int netId) {
- CompareResult<RouteInfo> routeDiff = new CompareResult<RouteInfo>();
- if (oldLp != null) {
- routeDiff = oldLp.compareAllRoutes(newLp);
- } else if (newLp != null) {
- routeDiff.added = newLp.getAllRoutes();
- }
+ // Compare the route diff to determine which routes should be added and removed.
+ CompareResult<RouteInfo> routeDiff = new CompareResult<RouteInfo>(
+ oldLp != null ? oldLp.getAllRoutes() : null,
+ newLp != null ? newLp.getAllRoutes() : null);
// add routes before removing old in case it helps with continuous connectivity
@@ -4647,7 +4644,8 @@
// Ignore updates for disconnected networks
return;
}
-
+ // newLp is already a defensive copy.
+ newLp.ensureDirectlyConnectedRoutes();
if (VDBG) {
log("Update of LinkProperties for " + nai.name() +
"; created=" + nai.created +
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index 7fdbc82..abbc89e 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -401,7 +401,9 @@
private final BroadcastReceiver mInteractivityReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- updateInteractivityLocked();
+ synchronized (DeviceIdleController.this) {
+ updateInteractivityLocked();
+ }
}
};
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 966e553..340d672 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1542,18 +1542,7 @@
*/
@Override
public List<String> getAllProviders() {
- ArrayList<String> out;
- synchronized (mLock) {
- out = new ArrayList<>(mProviders.size());
- for (LocationProviderInterface provider : mProviders) {
- String name = provider.getName();
- if (LocationManager.FUSED_PROVIDER.equals(name)) {
- continue;
- }
- out.add(name);
- }
- }
-
+ List<String> out = getProviders(null /*criteria*/, false /*enabledOnly*/);
if (D) Log.d(TAG, "getAllProviders()=" + out);
return out;
}
diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java
index f5f7732..b5a8332 100644
--- a/services/core/java/com/android/server/NativeDaemonConnector.java
+++ b/services/core/java/com/android/server/NativeDaemonConnector.java
@@ -24,11 +24,13 @@
import android.os.Message;
import android.os.PowerManager;
import android.os.SystemClock;
+import android.os.SystemProperties;
import android.util.LocalLog;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
+import com.android.server.power.ShutdownThread;
import com.google.android.collect.Lists;
import java.io.FileDescriptor;
@@ -136,6 +138,12 @@
listenToSocket();
} catch (Exception e) {
loge("Error in NativeDaemonConnector: " + e);
+ String shutdownAct = SystemProperties.get(
+ ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
+ if (shutdownAct != null && shutdownAct.length() > 0) {
+ // The device is in middle of shutdown.
+ break;
+ }
SystemClock.sleep(5000);
}
}
diff --git a/services/core/java/com/android/server/RecoverySystemService.java b/services/core/java/com/android/server/RecoverySystemService.java
index 3c8c699..1517887 100644
--- a/services/core/java/com/android/server/RecoverySystemService.java
+++ b/services/core/java/com/android/server/RecoverySystemService.java
@@ -285,8 +285,9 @@
// Send the BCB commands if it's to setup BCB.
if (isSetup) {
- dos.writeInt(command.length());
- dos.writeBytes(command);
+ byte[] cmdUtf8 = command.getBytes("UTF-8");
+ dos.writeInt(cmdUtf8.length);
+ dos.write(cmdUtf8, 0, cmdUtf8.length);
dos.flush();
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 1ca0112..e2c0e32 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -56,6 +56,8 @@
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
+import android.os.IVold;
+import android.os.IVoldListener;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
@@ -96,6 +98,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IMediaContainerService;
import com.android.internal.os.AppFuseMount;
+import com.android.internal.os.BackgroundThread;
import com.android.internal.os.FuseUnavailableMountException;
import com.android.internal.os.SomeArgs;
import com.android.internal.os.Zygote;
@@ -108,7 +111,6 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.server.NativeDaemonConnector.Command;
import com.android.server.NativeDaemonConnector.SensitiveArg;
-import com.android.server.pm.PackageManagerException;
import com.android.server.pm.PackageManagerService;
import com.android.server.storage.AppFuseBridge;
@@ -201,12 +203,18 @@
}
}
+ /** Flag to enable binder-based interface to vold */
+ private static final boolean ENABLE_BINDER = true;
+
private static final boolean DEBUG_EVENTS = false;
private static final boolean DEBUG_OBB = false;
// Disable this since it messes up long-running cryptfs operations.
private static final boolean WATCHDOG_ENABLE = false;
+ /** Flag to enable ASECs */
+ private static final boolean ASEC_ENABLE = false;
+
/**
* Our goal is for all Android devices to be usable as development devices,
* which includes the new Direct Boot mode added in N. For devices that
@@ -471,6 +479,8 @@
private final Thread mConnectorThread;
private final Thread mCryptConnectorThread;
+ private volatile IVold mVold;
+
private volatile boolean mSystemReady = false;
private volatile boolean mBootCompleted = false;
private volatile boolean mDaemonConnected = false;
@@ -521,13 +531,13 @@
class ObbState implements IBinder.DeathRecipient {
public ObbState(String rawPath, String canonicalPath, int callingUid,
- IObbActionListener token, int nonce) {
+ IObbActionListener token, int nonce, String volId) {
this.rawPath = rawPath;
this.canonicalPath = canonicalPath;
-
this.ownerGid = UserHandle.getSharedAppGid(callingUid);
this.token = token;
this.nonce = nonce;
+ this.volId = volId;
}
final String rawPath;
@@ -541,6 +551,8 @@
// Identifier to pass back to the token
final int nonce;
+ String volId;
+
public IBinder getBinder() {
return token.asBinder();
}
@@ -567,6 +579,7 @@
sb.append(",ownerGid=").append(ownerGid);
sb.append(",token=").append(token);
sb.append(",binder=").append(getBinder());
+ sb.append(",volId=").append(volId);
sb.append('}');
return sb.toString();
}
@@ -675,13 +688,19 @@
final IStorageShutdownObserver obs = (IStorageShutdownObserver) msg.obj;
boolean success = false;
try {
- success = mConnector.execute("volume", "shutdown").isClassOk();
- } catch (NativeDaemonConnectorException ignored) {
+ if (ENABLE_BINDER) {
+ mVold.shutdown();
+ success = true;
+ } else {
+ success = mConnector.execute("volume", "shutdown").isClassOk();
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
if (obs != null) {
try {
obs.onShutDownComplete(success ? 0 : -1);
- } catch (RemoteException ignored) {
+ } catch (Exception ignored) {
}
}
break;
@@ -693,9 +712,14 @@
break;
}
try {
- mConnector.execute("volume", "mount", vol.id, vol.mountFlags,
- vol.mountUserId);
- } catch (NativeDaemonConnectorException ignored) {
+ if (ENABLE_BINDER) {
+ mVold.mount(vol.id, vol.mountFlags, vol.mountUserId);
+ } else {
+ mConnector.execute("volume", "mount", vol.id, vol.mountFlags,
+ vol.mountUserId);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
break;
}
@@ -755,7 +779,11 @@
if (Intent.ACTION_USER_ADDED.equals(action)) {
final UserManager um = mContext.getSystemService(UserManager.class);
final int userSerialNumber = um.getUserSerialNumber(userId);
- mConnector.execute("volume", "user_added", userId, userSerialNumber);
+ if (ENABLE_BINDER) {
+ mVold.onUserAdded(userId, userSerialNumber);
+ } else {
+ mConnector.execute("volume", "user_added", userId, userSerialNumber);
+ }
} else if (Intent.ACTION_USER_REMOVED.equals(action)) {
synchronized (mVolumes) {
final int size = mVolumes.size();
@@ -767,10 +795,14 @@
}
}
}
- mConnector.execute("volume", "user_removed", userId);
+ if (ENABLE_BINDER) {
+ mVold.onUserRemoved(userId);
+ } else {
+ mConnector.execute("volume", "user_removed", userId);
+ }
}
- } catch (NativeDaemonConnectorException e) {
- Slog.w(TAG, "Failed to send user details to vold", e);
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
};
@@ -886,13 +918,22 @@
for (UserInfo user : users) {
try {
if (initLocked) {
- mCryptConnector.execute("cryptfs", "lock_user_key", user.id);
+ if (ENABLE_BINDER) {
+ mVold.lockUserKey(user.id);
+ } else {
+ mCryptConnector.execute("cryptfs", "lock_user_key", user.id);
+ }
} else {
- mCryptConnector.execute("cryptfs", "unlock_user_key", user.id,
- user.serialNumber, "!", "!");
+ if (ENABLE_BINDER) {
+ mVold.unlockUserKey(user.id, user.serialNumber, encodeBytes(null),
+ encodeBytes(null));
+ } else {
+ mCryptConnector.execute("cryptfs", "unlock_user_key", user.id,
+ user.serialNumber, "!", "!");
+ }
}
- } catch (NativeDaemonConnectorException e) {
- Slog.w(TAG, "Failed to init vold", e);
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
}
@@ -916,17 +957,29 @@
}
try {
- mConnector.execute("volume", "reset");
+ if (ENABLE_BINDER) {
+ mVold.reset();
+ } else {
+ mConnector.execute("volume", "reset");
+ }
// Tell vold about all existing and started users
for (UserInfo user : users) {
- mConnector.execute("volume", "user_added", user.id, user.serialNumber);
+ if (ENABLE_BINDER) {
+ mVold.onUserAdded(user.id, user.serialNumber);
+ } else {
+ mConnector.execute("volume", "user_added", user.id, user.serialNumber);
+ }
}
for (int userId : systemUnlockedUsers) {
- mConnector.execute("volume", "user_started", userId);
+ if (ENABLE_BINDER) {
+ mVold.onUserStarted(userId);
+ } else {
+ mConnector.execute("volume", "user_started", userId);
+ }
}
- } catch (NativeDaemonConnectorException e) {
- Slog.w(TAG, "Failed to reset vold", e);
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
}
@@ -938,8 +991,13 @@
// staging area is ready so it's ready for zygote-forked apps to
// bind mount against.
try {
- mConnector.execute("volume", "user_started", userId);
- } catch (NativeDaemonConnectorException ignored) {
+ if (ENABLE_BINDER) {
+ mVold.onUserStarted(userId);
+ } else {
+ mConnector.execute("volume", "user_started", userId);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
// Record user as started so newly mounted volumes kick off events
@@ -963,8 +1021,13 @@
Slog.d(TAG, "onCleanupUser " + userId);
try {
- mConnector.execute("volume", "user_stopped", userId);
- } catch (NativeDaemonConnectorException ignored) {
+ if (ENABLE_BINDER) {
+ mVold.onUserStopped(userId);
+ } else {
+ mConnector.execute("volume", "user_stopped", userId);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
synchronized (mLock) {
@@ -1018,7 +1081,9 @@
}
// Let package manager load internal ASECs.
- mPms.scanAvailableAsecs();
+ if (ASEC_ENABLE) {
+ mPms.scanAvailableAsecs();
+ }
// Notify people waiting for ASECs to be scanned that it's done.
mAsecsScanned.countDown();
@@ -1064,26 +1129,21 @@
@Override
public boolean onEvent(int code, String raw, String[] cooked) {
synchronized (mLock) {
- return onEventLocked(code, raw, cooked);
+ try {
+ return onEventLocked(code, raw, cooked);
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
}
}
- private boolean onEventLocked(int code, String raw, String[] cooked) {
+ private boolean onEventLocked(int code, String raw, String[] cooked) throws RemoteException {
switch (code) {
case VoldResponseCode.DISK_CREATED: {
if (cooked.length != 3) break;
- final String id = cooked[1];
- int flags = Integer.parseInt(cooked[2]);
- if (SystemProperties.getBoolean(StorageManager.PROP_FORCE_ADOPTABLE, false)
- || mForceAdoptable) {
- flags |= DiskInfo.FLAG_ADOPTABLE;
- }
- // Adoptable storage isn't currently supported on FBE devices
- if (StorageManager.isFileEncryptedNativeOnly()
- && !SystemProperties.getBoolean(StorageManager.PROP_ADOPTABLE_FBE, false)) {
- flags &= ~DiskInfo.FLAG_ADOPTABLE;
- }
- mDisks.put(id, new DiskInfo(id, flags));
+ final String diskId = cooked[1];
+ final int flags = Integer.parseInt(cooked[2]);
+ mListener.onDiskCreated(diskId, flags);
break;
}
case VoldResponseCode.DISK_SIZE_CHANGED: {
@@ -1107,10 +1167,8 @@
}
case VoldResponseCode.DISK_SCANNED: {
if (cooked.length != 2) break;
- final DiskInfo disk = mDisks.get(cooked[1]);
- if (disk != null) {
- onDiskScannedLocked(disk);
- }
+ final String diskId = cooked[1];
+ mListener.onDiskScanned(diskId);
break;
}
case VoldResponseCode.DISK_SYS_PATH_CHANGED: {
@@ -1123,34 +1181,24 @@
}
case VoldResponseCode.DISK_DESTROYED: {
if (cooked.length != 2) break;
- final DiskInfo disk = mDisks.remove(cooked[1]);
- if (disk != null) {
- mCallbacks.notifyDiskDestroyed(disk);
- }
+ final String diskId = cooked[1];
+ mListener.onDiskDestroyed(diskId);
break;
}
case VoldResponseCode.VOLUME_CREATED: {
- final String id = cooked[1];
+ final String volId = cooked[1];
final int type = Integer.parseInt(cooked[2]);
final String diskId = TextUtils.nullIfEmpty(cooked[3]);
final String partGuid = TextUtils.nullIfEmpty(cooked[4]);
-
- final DiskInfo disk = mDisks.get(diskId);
- final VolumeInfo vol = new VolumeInfo(id, type, disk, partGuid);
- mVolumes.put(id, vol);
- onVolumeCreatedLocked(vol);
+ mListener.onVolumeCreated(volId, type, diskId, partGuid);
break;
}
case VoldResponseCode.VOLUME_STATE_CHANGED: {
if (cooked.length != 3) break;
- final VolumeInfo vol = mVolumes.get(cooked[1]);
- if (vol != null) {
- final int oldState = vol.state;
- final int newState = Integer.parseInt(cooked[2]);
- vol.state = newState;
- onVolumeStateChangedLocked(vol, oldState, newState);
- }
+ final String volId = cooked[1];
+ final int state = Integer.parseInt(cooked[2]);
+ mListener.onVolumeStateChanged(volId, state);
break;
}
case VoldResponseCode.VOLUME_FS_TYPE_CHANGED: {
@@ -1183,23 +1231,22 @@
}
case VoldResponseCode.VOLUME_PATH_CHANGED: {
if (cooked.length != 3) break;
- final VolumeInfo vol = mVolumes.get(cooked[1]);
- if (vol != null) {
- vol.path = cooked[2];
- }
+ final String volId = cooked[1];
+ final String path = cooked[2];
+ mListener.onVolumePathChanged(volId, path);
break;
}
case VoldResponseCode.VOLUME_INTERNAL_PATH_CHANGED: {
if (cooked.length != 3) break;
- final VolumeInfo vol = mVolumes.get(cooked[1]);
- if (vol != null) {
- vol.internalPath = cooked[2];
- }
+ final String volId = cooked[1];
+ final String internalPath = cooked[2];
+ mListener.onVolumeInternalPathChanged(volId, internalPath);
break;
}
case VoldResponseCode.VOLUME_DESTROYED: {
if (cooked.length != 2) break;
- mVolumes.remove(cooked[1]);
+ final String volId = cooked[1];
+ mListener.onVolumeDestroyed(volId);
break;
}
@@ -1256,6 +1303,120 @@
return true;
}
+ private final IVoldListener mListener = new IVoldListener.Stub() {
+ @Override
+ public void onDiskCreated(String diskId, int flags) {
+ synchronized (mLock) {
+ if (SystemProperties.getBoolean(StorageManager.PROP_FORCE_ADOPTABLE, false)
+ || mForceAdoptable) {
+ flags |= DiskInfo.FLAG_ADOPTABLE;
+ }
+ // Adoptable storage isn't currently supported on FBE devices
+ if (StorageManager.isFileEncryptedNativeOnly()
+ && !SystemProperties.getBoolean(StorageManager.PROP_ADOPTABLE_FBE, false)) {
+ flags &= ~DiskInfo.FLAG_ADOPTABLE;
+ }
+ mDisks.put(diskId, new DiskInfo(diskId, flags));
+ }
+ }
+
+ @Override
+ public void onDiskScanned(String diskId) {
+ synchronized (mLock) {
+ final DiskInfo disk = mDisks.get(diskId);
+ if (disk != null) {
+ onDiskScannedLocked(disk);
+ }
+ }
+ }
+
+ @Override
+ public void onDiskMetadataChanged(String diskId, long sizeBytes, String label,
+ String sysPath) {
+ synchronized (mLock) {
+ final DiskInfo disk = mDisks.get(diskId);
+ if (disk != null) {
+ disk.size = sizeBytes;
+ disk.label = label;
+ disk.sysPath = sysPath;
+ }
+ }
+ }
+
+ @Override
+ public void onDiskDestroyed(String diskId) {
+ synchronized (mLock) {
+ final DiskInfo disk = mDisks.remove(diskId);
+ if (disk != null) {
+ mCallbacks.notifyDiskDestroyed(disk);
+ }
+ }
+ }
+
+ @Override
+ public void onVolumeCreated(String volId, int type, String diskId, String partGuid) {
+ synchronized (mLock) {
+ final DiskInfo disk = mDisks.get(diskId);
+ final VolumeInfo vol = new VolumeInfo(volId, type, disk, partGuid);
+ mVolumes.put(volId, vol);
+ onVolumeCreatedLocked(vol);
+ }
+ }
+
+ @Override
+ public void onVolumeStateChanged(String volId, int state) {
+ synchronized (mLock) {
+ final VolumeInfo vol = mVolumes.get(volId);
+ if (vol != null) {
+ final int oldState = vol.state;
+ final int newState = state;
+ vol.state = newState;
+ onVolumeStateChangedLocked(vol, oldState, newState);
+ }
+ }
+ }
+
+ @Override
+ public void onVolumeMetadataChanged(String volId, String fsType, String fsUuid,
+ String fsLabel) {
+ synchronized (mLock) {
+ final VolumeInfo vol = mVolumes.get(volId);
+ if (vol != null) {
+ vol.fsType = fsType;
+ vol.fsUuid = fsUuid;
+ vol.fsLabel = fsLabel;
+ }
+ }
+ }
+
+ @Override
+ public void onVolumePathChanged(String volId, String path) {
+ synchronized (mLock) {
+ final VolumeInfo vol = mVolumes.get(volId);
+ if (vol != null) {
+ vol.path = path;
+ }
+ }
+ }
+
+ @Override
+ public void onVolumeInternalPathChanged(String volId, String internalPath) {
+ synchronized (mLock) {
+ final VolumeInfo vol = mVolumes.get(volId);
+ if (vol != null) {
+ vol.internalPath = internalPath;
+ }
+ }
+ }
+
+ @Override
+ public void onVolumeDestroyed(String volId) {
+ synchronized (mLock) {
+ mVolumes.remove(volId);
+ }
+ }
+ };
+
private void onDiskScannedLocked(DiskInfo disk) {
int volumeCount = 0;
for (int i = 0; i < mVolumes.size(); i++) {
@@ -1574,10 +1735,44 @@
}
private void start() {
+ connect();
mConnectorThread.start();
mCryptConnectorThread.start();
}
+ private void connect() {
+ IBinder binder = ServiceManager.getService("vold");
+ if (binder != null) {
+ try {
+ binder.linkToDeath(new DeathRecipient() {
+ @Override
+ public void binderDied() {
+ Slog.w(TAG, "vold died; reconnecting");
+ connect();
+ }
+ }, 0);
+ } catch (RemoteException e) {
+ binder = null;
+ }
+ }
+
+ if (binder != null) {
+ mVold = IVold.Stub.asInterface(binder);
+ try {
+ mVold.setListener(mListener);
+ return;
+ } catch (RemoteException e) {
+ Slog.w(TAG, "vold listener rejected; trying again", e);
+ }
+ } else {
+ Slog.w(TAG, "vold not found; trying again");
+ }
+
+ BackgroundThread.getHandler().postDelayed(() -> {
+ connect();
+ }, DateUtils.SECOND_IN_MILLIS);
+ }
+
private void systemReady() {
mSystemReady = true;
mHandler.obtainMessage(H_SYSTEM_READY).sendToTarget();
@@ -1767,9 +1962,13 @@
throw new SecurityException("Mounting " + volId + " restricted by policy");
}
try {
- mConnector.execute("volume", "mount", vol.id, vol.mountFlags, vol.mountUserId);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.mount(vol.id, vol.mountFlags, vol.mountUserId);
+ } else {
+ mConnector.execute("volume", "mount", vol.id, vol.mountFlags, vol.mountUserId);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1796,9 +1995,13 @@
}
try {
- mConnector.execute("volume", "unmount", vol.id);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.unmount(vol.id);
+ } else {
+ mConnector.execute("volume", "unmount", vol.id);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1809,9 +2012,13 @@
final VolumeInfo vol = findVolumeByIdOrThrow(volId);
try {
- mConnector.execute("volume", "format", vol.id, "auto");
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.format(vol.id, "auto");
+ } else {
+ mConnector.execute("volume", "format", vol.id, "auto");
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1822,13 +2029,16 @@
try {
// TODO: make benchmark async so we don't block other commands
- final NativeDaemonEvent res = mConnector.execute(3 * DateUtils.MINUTE_IN_MILLIS,
- "volume", "benchmark", volId);
- return Long.parseLong(res.getMessage());
- } catch (NativeDaemonTimeoutException e) {
+ if (ENABLE_BINDER) {
+ return mVold.benchmark(volId);
+ } else {
+ final NativeDaemonEvent res = mConnector.execute(3 * DateUtils.MINUTE_IN_MILLIS,
+ "volume", "benchmark", volId);
+ return Long.parseLong(res.getMessage());
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
return Long.MAX_VALUE;
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
}
}
@@ -1839,12 +2049,14 @@
final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
try {
- mConnector.execute("volume", "partition", diskId, "public");
+ if (ENABLE_BINDER) {
+ mVold.partition(diskId, IVold.PARTITION_TYPE_PUBLIC, -1);
+ } else {
+ mConnector.execute("volume", "partition", diskId, "public");
+ }
waitForLatch(latch, "partitionPublic", 3 * DateUtils.MINUTE_IN_MILLIS);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
- } catch (TimeoutException e) {
- throw new IllegalStateException(e);
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1856,12 +2068,14 @@
final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
try {
- mConnector.execute("volume", "partition", diskId, "private");
+ if (ENABLE_BINDER) {
+ mVold.partition(diskId, IVold.PARTITION_TYPE_PRIVATE, -1);
+ } else {
+ mConnector.execute("volume", "partition", diskId, "private");
+ }
waitForLatch(latch, "partitionPrivate", 3 * DateUtils.MINUTE_IN_MILLIS);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
- } catch (TimeoutException e) {
- throw new IllegalStateException(e);
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1873,12 +2087,14 @@
final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
try {
- mConnector.execute("volume", "partition", diskId, "mixed", ratio);
+ if (ENABLE_BINDER) {
+ mVold.partition(diskId, IVold.PARTITION_TYPE_MIXED, ratio);
+ } else {
+ mConnector.execute("volume", "partition", diskId, "mixed", ratio);
+ }
waitForLatch(latch, "partitionMixed", 3 * DateUtils.MINUTE_IN_MILLIS);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
- } catch (TimeoutException e) {
- throw new IllegalStateException(e);
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1962,9 +2178,13 @@
private void forgetPartition(String partGuid) {
try {
- mConnector.execute("volume", "forget_partition", partGuid);
- } catch (NativeDaemonConnectorException e) {
- Slog.w(TAG, "Failed to forget key for " + partGuid + ": " + e);
+ if (ENABLE_BINDER) {
+ mVold.forgetPartition(partGuid);
+ } else {
+ mConnector.execute("volume", "forget_partition", partGuid);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1984,9 +2204,13 @@
}
try {
- mConnector.execute("fstrim", cmd);
- } catch (NativeDaemonConnectorException e) {
- Slog.e(TAG, "Failed to run fstrim: " + e);
+ if (ENABLE_BINDER) {
+ mVold.fstrim(flags);
+ } else {
+ mConnector.execute("fstrim", cmd);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -1998,20 +2222,22 @@
case Zygote.MOUNT_EXTERNAL_DEFAULT: {
modeName = "default";
} break;
-
case Zygote.MOUNT_EXTERNAL_READ: {
modeName = "read";
} break;
-
case Zygote.MOUNT_EXTERNAL_WRITE: {
modeName = "write";
} break;
}
try {
- mConnector.execute("volume", "remount_uid", uid, modeName);
- } catch (NativeDaemonConnectorException e) {
- Slog.w(TAG, "Failed to remount UID " + uid + " as " + modeName + ": " + e);
+ if (ENABLE_BINDER) {
+ mVold.remountUid(uid, mode);
+ } else {
+ mConnector.execute("volume", "remount_uid", uid, modeName);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -2162,9 +2388,13 @@
}
try {
- mConnector.execute("volume", "move_storage", from.id, to.id);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.moveStorage(from.id, to.id);
+ } else {
+ mConnector.execute("volume", "move_storage", from.id, to.id);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -2210,6 +2440,7 @@
}
public String[] getSecureContainerList() {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_ACCESS);
waitForReady();
warnOnNotMounted();
@@ -2224,6 +2455,7 @@
public int createSecureContainer(String id, int sizeMb, String fstype, String key,
int ownerUid, boolean external) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_CREATE);
waitForReady();
warnOnNotMounted();
@@ -2246,6 +2478,7 @@
@Override
public int resizeSecureContainer(String id, int sizeMb, String key) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_CREATE);
waitForReady();
warnOnNotMounted();
@@ -2260,6 +2493,7 @@
}
public int finalizeSecureContainer(String id) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_CREATE);
warnOnNotMounted();
@@ -2277,6 +2511,7 @@
}
public int fixPermissionsSecureContainer(String id, int gid, String filename) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_CREATE);
warnOnNotMounted();
@@ -2294,6 +2529,7 @@
}
public int destroySecureContainer(String id, boolean force) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_DESTROY);
waitForReady();
warnOnNotMounted();
@@ -2334,6 +2570,7 @@
}
public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_MOUNT_UNMOUNT);
waitForReady();
warnOnNotMounted();
@@ -2364,6 +2601,7 @@
}
public int unmountSecureContainer(String id, boolean force) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_MOUNT_UNMOUNT);
waitForReady();
warnOnNotMounted();
@@ -2407,6 +2645,7 @@
}
public boolean isSecureContainerMounted(String id) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_ACCESS);
waitForReady();
warnOnNotMounted();
@@ -2417,6 +2656,7 @@
}
public int renameSecureContainer(String oldId, String newId) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_RENAME);
waitForReady();
warnOnNotMounted();
@@ -2442,6 +2682,7 @@
}
public String getSecureContainerPath(String id) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_ACCESS);
waitForReady();
warnOnNotMounted();
@@ -2463,6 +2704,7 @@
}
public String getSecureContainerFilesystemPath(String id) {
+ if (!ASEC_ENABLE) throw new UnsupportedOperationException();
enforcePermission(android.Manifest.permission.ASEC_ACCESS);
waitForReady();
warnOnNotMounted();
@@ -2530,6 +2772,10 @@
return null;
}
+ if (ENABLE_BINDER) {
+ return findVolumeByIdOrThrow(state.volId).getPath().getAbsolutePath();
+ }
+
final NativeDaemonEvent event;
try {
event = mConnector.execute("obb", "path", state.canonicalPath);
@@ -2561,7 +2807,8 @@
Preconditions.checkNotNull(token, "token cannot be null");
final int callingUid = Binder.getCallingUid();
- final ObbState obbState = new ObbState(rawPath, canonicalPath, callingUid, token, nonce);
+ final ObbState obbState = new ObbState(rawPath, canonicalPath,
+ callingUid, token, nonce, null);
final ObbAction action = new MountObbAction(obbState, key, callingUid);
mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(OBB_RUN_ACTION, action));
@@ -2581,8 +2828,8 @@
if (existingState != null) {
// TODO: separate state object from request data
final int callingUid = Binder.getCallingUid();
- final ObbState newState = new ObbState(
- rawPath, existingState.canonicalPath, callingUid, token, nonce);
+ final ObbState newState = new ObbState(rawPath, existingState.canonicalPath,
+ callingUid, token, nonce, existingState.volId);
final ObbAction action = new UnmountObbAction(newState, force);
mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(OBB_RUN_ACTION, action));
@@ -2600,6 +2847,15 @@
waitForReady();
+ if (ENABLE_BINDER) {
+ try {
+ return mVold.fdeComplete();
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return StorageManager.ENCRYPTION_STATE_ERROR_UNKNOWN;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "cryptocomplete");
@@ -2617,19 +2873,36 @@
@Override
public int decryptStorage(String password) {
- if (TextUtils.isEmpty(password)) {
- throw new IllegalArgumentException("password cannot be empty");
- }
-
mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER,
"no permission to access the crypt keeper");
waitForReady();
+ if (TextUtils.isEmpty(password)) {
+ throw new IllegalArgumentException("password cannot be empty");
+ }
+
if (DEBUG_EVENTS) {
Slog.i(TAG, "decrypting storage...");
}
+ if (ENABLE_BINDER) {
+ try {
+ mVold.fdeCheckPassword(password);
+ mHandler.postDelayed(() -> {
+ try {
+ mVold.fdeRestart();
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ }
+ }, DateUtils.SECOND_IN_MILLIS);
+ return 0;
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return StorageManager.ENCRYPTION_STATE_ERROR_UNKNOWN;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "checkpw", new SensitiveArg(password));
@@ -2657,30 +2930,36 @@
}
public int encryptStorage(int type, String password) {
- if (TextUtils.isEmpty(password) && type != StorageManager.CRYPT_TYPE_DEFAULT) {
- throw new IllegalArgumentException("password cannot be empty");
- }
-
mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER,
"no permission to access the crypt keeper");
waitForReady();
+ if (type == StorageManager.CRYPT_TYPE_DEFAULT) {
+ password = "";
+ } else if (TextUtils.isEmpty(password)) {
+ throw new IllegalArgumentException("password cannot be empty");
+ }
+
if (DEBUG_EVENTS) {
Slog.i(TAG, "encrypting storage...");
}
try {
- if (type == StorageManager.CRYPT_TYPE_DEFAULT) {
- mCryptConnector.execute("cryptfs", "enablecrypto", "inplace",
- CRYPTO_TYPES[type]);
+ if (ENABLE_BINDER) {
+ mVold.fdeEnable(type, password, IVold.ENCRYPTION_FLAG_IN_PLACE);
} else {
- mCryptConnector.execute("cryptfs", "enablecrypto", "inplace",
- CRYPTO_TYPES[type], new SensitiveArg(password));
+ if (type == StorageManager.CRYPT_TYPE_DEFAULT) {
+ mCryptConnector.execute("cryptfs", "enablecrypto", "inplace",
+ CRYPTO_TYPES[type]);
+ } else {
+ mCryptConnector.execute("cryptfs", "enablecrypto", "inplace",
+ CRYPTO_TYPES[type], new SensitiveArg(password));
+ }
}
- } catch (NativeDaemonConnectorException e) {
- // Encryption failed
- return e.getCode();
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return -1;
}
return 0;
@@ -2696,10 +2975,26 @@
waitForReady();
+ if (type == StorageManager.CRYPT_TYPE_DEFAULT) {
+ password = "";
+ } else if (TextUtils.isEmpty(password)) {
+ throw new IllegalArgumentException("password cannot be empty");
+ }
+
if (DEBUG_EVENTS) {
Slog.i(TAG, "changing encryption password...");
}
+ if (ENABLE_BINDER) {
+ try {
+ mVold.fdeChangePassword(type, password);
+ return 0;
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return -1;
+ }
+ }
+
try {
NativeDaemonEvent event = mCryptConnector.execute("cryptfs", "changepw", CRYPTO_TYPES[type],
new SensitiveArg(password));
@@ -2733,6 +3028,16 @@
Slog.i(TAG, "validating encryption password...");
}
+ if (ENABLE_BINDER) {
+ try {
+ mVold.fdeVerifyPassword(password);
+ return 0;
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return -1;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "verifypw", new SensitiveArg(password));
@@ -2755,6 +3060,15 @@
waitForReady();
+ if (ENABLE_BINDER) {
+ try {
+ return mVold.fdeGetPasswordType();
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return -1;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "getpwtype");
@@ -2781,6 +3095,16 @@
waitForReady();
+ if (ENABLE_BINDER) {
+ try {
+ mVold.fdeSetField(field, contents);
+ return;
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "setfield", field, contents);
@@ -2801,6 +3125,15 @@
waitForReady();
+ if (ENABLE_BINDER) {
+ try {
+ return mVold.fdeGetField(field);
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return null;
+ }
+ }
+
final NativeDaemonEvent event;
try {
final String[] contents = NativeDaemonEvent.filterMessageList(
@@ -2827,6 +3160,15 @@
waitForReady();
+ if (ENABLE_BINDER) {
+ try {
+ return mVold.isConvertibleToFbe();
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return false;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "isConvertibleToFBE");
@@ -2845,6 +3187,15 @@
return new String();
}
+ if (ENABLE_BINDER) {
+ try {
+ return mVold.fdeGetPassword();
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return null;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "getpw");
@@ -2870,6 +3221,16 @@
return;
}
+ if (ENABLE_BINDER) {
+ try {
+ mVold.fdeClearPassword();
+ return;
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return;
+ }
+ }
+
final NativeDaemonEvent event;
try {
event = mCryptConnector.execute("cryptfs", "clearpw");
@@ -2884,10 +3245,14 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "create_user_key", userId, serialNumber,
- ephemeral ? 1 : 0);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.createUserKey(userId, serialNumber, ephemeral);
+ } else {
+ mCryptConnector.execute("cryptfs", "create_user_key", userId, serialNumber,
+ ephemeral ? 1 : 0);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -2897,17 +3262,21 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "destroy_user_key", userId);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.destroyUserKey(userId);
+ } else {
+ mCryptConnector.execute("cryptfs", "destroy_user_key", userId);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
- private SensitiveArg encodeBytes(byte[] bytes) {
+ private String encodeBytes(byte[] bytes) {
if (ArrayUtils.isEmpty(bytes)) {
- return new SensitiveArg("!");
+ return "!";
} else {
- return new SensitiveArg(HexDump.toHexString(bytes));
+ return HexDump.toHexString(bytes);
}
}
@@ -2924,10 +3293,15 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "add_user_key_auth", userId, serialNumber,
- encodeBytes(token), encodeBytes(secret));
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.addUserKeyAuth(userId, serialNumber, encodeBytes(token), encodeBytes(secret));
+ } else {
+ mCryptConnector.execute("cryptfs", "add_user_key_auth", userId, serialNumber,
+ new SensitiveArg(encodeBytes(token)),
+ new SensitiveArg(encodeBytes(secret)));
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -2940,9 +3314,13 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "fixate_newest_user_key_auth", userId);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.fixateNewestUserKeyAuth(userId);
+ } else {
+ mCryptConnector.execute("cryptfs", "fixate_newest_user_key_auth", userId);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -2959,10 +3337,17 @@
}
try {
- mCryptConnector.execute("cryptfs", "unlock_user_key", userId, serialNumber,
- encodeBytes(token), encodeBytes(secret));
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.unlockUserKey(userId, serialNumber, encodeBytes(token),
+ encodeBytes(secret));
+ } else {
+ mCryptConnector.execute("cryptfs", "unlock_user_key", userId, serialNumber,
+ new SensitiveArg(encodeBytes(token)),
+ new SensitiveArg(encodeBytes(secret)));
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return;
}
}
@@ -2982,9 +3367,14 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "lock_user_key", userId);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.lockUserKey(userId);
+ } else {
+ mCryptConnector.execute("cryptfs", "lock_user_key", userId);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
+ return;
}
synchronized (mLock) {
@@ -3005,10 +3395,14 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "prepare_user_storage", escapeNull(volumeUuid),
- userId, serialNumber, flags);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.prepareUserStorage(volumeUuid, userId, serialNumber, flags);
+ } else {
+ mCryptConnector.execute("cryptfs", "prepare_user_storage", escapeNull(volumeUuid),
+ userId, serialNumber, flags);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -3018,10 +3412,14 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "destroy_user_storage", escapeNull(volumeUuid),
- userId, flags);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.destroyUserStorage(volumeUuid, userId, flags);
+ } else {
+ mCryptConnector.execute("cryptfs", "destroy_user_storage", escapeNull(volumeUuid),
+ userId, flags);
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -3031,9 +3429,13 @@
waitForReady();
try {
- mCryptConnector.execute("cryptfs", "secdiscard", escapeNull(path));
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ if (ENABLE_BINDER) {
+ mVold.secdiscard(path);
+ } else {
+ mCryptConnector.execute("cryptfs", "secdiscard", escapeNull(path));
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -3046,20 +3448,33 @@
@Override
public ParcelFileDescriptor open() throws NativeDaemonConnectorException {
- final NativeDaemonEvent event = StorageManagerService.this.mConnector.execute(
- "appfuse", "mount", uid, Process.myPid(), mountId);
- opened = true;
- if (event.getFileDescriptors() == null ||
- event.getFileDescriptors().length == 0) {
- throw new NativeDaemonConnectorException("Cannot obtain device FD");
+ if (ENABLE_BINDER) {
+ try {
+ return new ParcelFileDescriptor(
+ mVold.mountAppFuse(uid, Process.myPid(), mountId));
+ } catch (Exception e) {
+ throw new NativeDaemonConnectorException("Failed to mount", e);
+ }
+ } else {
+ final NativeDaemonEvent event = mConnector.execute(
+ "appfuse", "mount", uid, Process.myPid(), mountId);
+ opened = true;
+ if (event.getFileDescriptors() == null ||
+ event.getFileDescriptors().length == 0) {
+ throw new NativeDaemonConnectorException("Cannot obtain device FD");
+ }
+ return new ParcelFileDescriptor(event.getFileDescriptors()[0]);
}
- return new ParcelFileDescriptor(event.getFileDescriptors()[0]);
}
@Override
public void close() throws Exception {
if (opened) {
- mConnector.execute("appfuse", "unmount", uid, Process.myPid(), mountId);
+ if (ENABLE_BINDER) {
+ mVold.unmountAppFuse(uid, Process.myPid(), mountId);
+ } else {
+ mConnector.execute("appfuse", "unmount", uid, Process.myPid(), mountId);
+ }
opened = false;
}
}
@@ -3148,10 +3563,14 @@
}
try {
- mConnector.execute("volume", "mkdirs", appPath);
+ if (ENABLE_BINDER) {
+ mVold.mkdirs(appPath);
+ } else {
+ mConnector.execute("volume", "mkdirs", appPath);
+ }
return 0;
- } catch (NativeDaemonConnectorException e) {
- return e.getCode();
+ } catch (Exception e) {
+ Slog.wtf(TAG, e);
}
}
@@ -3723,8 +4142,10 @@
}
final String hashedKey;
+ final String binderKey;
if (mKey == null) {
hashedKey = "none";
+ binderKey = "";
} else {
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
@@ -3734,6 +4155,7 @@
SecretKey key = factory.generateSecret(ks);
BigInteger bi = new BigInteger(key.getEncoded());
hashedKey = bi.toString(16);
+ binderKey = hashedKey;
} catch (NoSuchAlgorithmException e) {
Slog.e(TAG, "Could not load PBKDF2 algorithm", e);
sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_INTERNAL);
@@ -3747,13 +4169,22 @@
int rc = StorageResultCode.OperationSucceeded;
try {
- mConnector.execute("obb", "mount", mObbState.canonicalPath, new SensitiveArg(hashedKey),
- mObbState.ownerGid);
+ if (ENABLE_BINDER) {
+ mObbState.volId = mVold.createObb(mObbState.canonicalPath, binderKey,
+ mObbState.ownerGid);
+ mVold.mount(mObbState.volId, 0, -1);
+ } else {
+ mConnector.execute("obb", "mount", mObbState.canonicalPath,
+ new SensitiveArg(hashedKey), mObbState.ownerGid);
+ }
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code != VoldResponseCode.OpFailedStorageBusy) {
rc = StorageResultCode.OperationFailedInternalError;
}
+ } catch (Exception e) {
+ Slog.w(TAG, e);
+ rc = StorageResultCode.OperationFailedInternalError;
}
if (rc == StorageResultCode.OperationSucceeded) {
@@ -3819,11 +4250,17 @@
int rc = StorageResultCode.OperationSucceeded;
try {
- final Command cmd = new Command("obb", "unmount", mObbState.canonicalPath);
- if (mForceUnmount) {
- cmd.appendArg("force");
+ if (ENABLE_BINDER) {
+ mVold.unmount(mObbState.volId);
+ mVold.destroyObb(mObbState.volId);
+ mObbState.volId = null;
+ } else {
+ final Command cmd = new Command("obb", "unmount", mObbState.canonicalPath);
+ if (mForceUnmount) {
+ cmd.appendArg("force");
+ }
+ mConnector.execute(cmd);
}
- mConnector.execute(cmd);
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code == VoldResponseCode.OpFailedStorageBusy) {
@@ -3834,6 +4271,9 @@
} else {
rc = StorageResultCode.OperationFailedInternalError;
}
+ } catch (Exception e) {
+ Slog.w(TAG, e);
+ rc = StorageResultCode.OperationFailedInternalError;
}
if (rc == StorageResultCode.OperationSucceeded) {
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 756e274..e0cde72 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1926,6 +1926,9 @@
if (r.restartDelay == 0) {
r.restartCount++;
r.restartDelay = minDuration;
+ } else if (r.crashCount > 1) {
+ r.restartDelay = mAm.mConstants.BOUND_SERVICE_CRASH_RESTART_DURATION
+ * (r.crashCount - 1);
} else {
// If it has been a "reasonably long time" since the service
// was started, then reset our restart duration back to
@@ -3129,8 +3132,9 @@
// Any services running in the application may need to be placed
// back in the pending list.
- if (allowRestart && sr.crashCount >= 2 && (sr.serviceInfo.applicationInfo.flags
- &ApplicationInfo.FLAG_PERSISTENT) == 0) {
+ if (allowRestart && sr.crashCount >= mAm.mConstants.BOUND_SERVICE_MAX_CRASH_RETRY
+ && (sr.serviceInfo.applicationInfo.flags
+ &ApplicationInfo.FLAG_PERSISTENT) == 0) {
Slog.w(TAG, "Service crashed " + sr.crashCount
+ " times, stopping: " + sr);
EventLog.writeEvent(EventLogTags.AM_SERVICE_CRASHED_TOO_MUCH,
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 2cd2603..b52db87 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -32,6 +32,7 @@
* Settings constants that can modify the activity manager's behavior.
*/
final class ActivityManagerConstants extends ContentObserver {
+
// Key names stored in the settings value.
private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
private static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
@@ -63,6 +64,8 @@
static final String KEY_SERVICE_MIN_RESTART_TIME_BETWEEN = "service_min_restart_time_between";
static final String KEY_MAX_SERVICE_INACTIVITY = "service_max_inactivity";
static final String KEY_BG_START_TIMEOUT = "service_bg_start_timeout";
+ static final String KEY_BOUND_SERVICE_CRASH_RESTART_DURATION = "service_crash_restart_duration";
+ static final String KEY_BOUND_SERVICE_CRASH_MAX_RETRY = "service_crash_max_retry";
private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
@@ -88,6 +91,9 @@
private static final long DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
private static final long DEFAULT_MAX_SERVICE_INACTIVITY = 30*60*1000;
private static final long DEFAULT_BG_START_TIMEOUT = 15*1000;
+ private static final long DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION = 30*60_000;
+ private static final int DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY = 16;
+
// Maximum number of cached processes we will allow.
public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
@@ -190,6 +196,12 @@
// allowing the next pending start to run.
public long BG_START_TIMEOUT = DEFAULT_BG_START_TIMEOUT;
+ // Initial backoff delay for retrying bound foreground services
+ public long BOUND_SERVICE_CRASH_RESTART_DURATION = DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION;
+
+ // Maximum number of retries for bound foreground services that crash soon after start
+ public long BOUND_SERVICE_MAX_CRASH_RETRY = DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY;
+
private final ActivityManagerService mService;
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -308,6 +320,12 @@
DEFAULT_MAX_SERVICE_INACTIVITY);
BG_START_TIMEOUT = mParser.getLong(KEY_BG_START_TIMEOUT,
DEFAULT_BG_START_TIMEOUT);
+ BOUND_SERVICE_CRASH_RESTART_DURATION = mParser.getLong(
+ KEY_BOUND_SERVICE_CRASH_RESTART_DURATION,
+ DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION);
+ BOUND_SERVICE_MAX_CRASH_RETRY = mParser.getInt(KEY_BOUND_SERVICE_CRASH_MAX_RETRY,
+ DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY);
+
updateMaxCachedProcesses();
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 853d095..02eb3b4 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -3839,38 +3839,38 @@
uid = 0;
}
}
- int debugFlags = 0;
+ int runtimeFlags = 0;
if ((app.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
- debugFlags |= Zygote.DEBUG_ENABLE_JDWP;
- debugFlags |= Zygote.DEBUG_JAVA_DEBUGGABLE;
+ runtimeFlags |= Zygote.DEBUG_ENABLE_JDWP;
+ runtimeFlags |= Zygote.DEBUG_JAVA_DEBUGGABLE;
// Also turn on CheckJNI for debuggable apps. It's quite
// awkward to turn on otherwise.
- debugFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
+ runtimeFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
}
// Run the app in safe mode if its manifest requests so or the
// system is booted in safe mode.
if ((app.info.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0 ||
mSafeMode == true) {
- debugFlags |= Zygote.DEBUG_ENABLE_SAFEMODE;
+ runtimeFlags |= Zygote.DEBUG_ENABLE_SAFEMODE;
}
if ("1".equals(SystemProperties.get("debug.checkjni"))) {
- debugFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
+ runtimeFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
}
String genDebugInfoProperty = SystemProperties.get("debug.generate-debug-info");
if ("true".equals(genDebugInfoProperty)) {
- debugFlags |= Zygote.DEBUG_GENERATE_DEBUG_INFO;
+ runtimeFlags |= Zygote.DEBUG_GENERATE_DEBUG_INFO;
}
if ("1".equals(SystemProperties.get("debug.jni.logging"))) {
- debugFlags |= Zygote.DEBUG_ENABLE_JNI_LOGGING;
+ runtimeFlags |= Zygote.DEBUG_ENABLE_JNI_LOGGING;
}
if ("1".equals(SystemProperties.get("debug.assert"))) {
- debugFlags |= Zygote.DEBUG_ENABLE_ASSERT;
+ runtimeFlags |= Zygote.DEBUG_ENABLE_ASSERT;
}
if (mNativeDebuggingApp != null && mNativeDebuggingApp.equals(app.processName)) {
// Enable all debug flags required by the native debugger.
- debugFlags |= Zygote.DEBUG_ALWAYS_JIT; // Don't interpret anything
- debugFlags |= Zygote.DEBUG_GENERATE_DEBUG_INFO; // Generate debug info
- debugFlags |= Zygote.DEBUG_NATIVE_DEBUGGABLE; // Disbale optimizations
+ runtimeFlags |= Zygote.DEBUG_ALWAYS_JIT; // Don't interpret anything
+ runtimeFlags |= Zygote.DEBUG_GENERATE_DEBUG_INFO; // Generate debug info
+ runtimeFlags |= Zygote.DEBUG_NATIVE_DEBUGGABLE; // Disbale optimizations
mNativeDebuggingApp = null;
}
@@ -3919,12 +3919,12 @@
ProcessStartResult startResult;
if (hostingType.equals("webview_service")) {
startResult = startWebView(entryPoint,
- app.processName, uid, uid, gids, debugFlags, mountExternal,
+ app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, null, null);
} else {
startResult = Process.start(entryPoint,
- app.processName, uid, uid, gids, debugFlags, mountExternal,
+ app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith, null);
}
@@ -7007,7 +7007,7 @@
mProfileProc = app;
profilerInfo = (mProfilerInfo != null && mProfilerInfo.profileFile != null) ?
new ProfilerInfo(mProfilerInfo) : null;
- agent = profilerInfo.agent;
+ agent = mProfilerInfo != null ? mProfilerInfo.agent : null;
} else if (app.instr != null && app.instr.mProfileFile != null) {
profilerInfo = new ProfilerInfo(app.instr.mProfileFile, null, 0, false, false,
null);
@@ -13167,7 +13167,6 @@
return;
}
}
-
// We are now ready to launch the assist activity.
IResultReceiver sendReceiver = null;
Bundle sendBundle = null;
@@ -13197,17 +13196,24 @@
return;
}
- long ident = Binder.clearCallingIdentity();
+ final long ident = Binder.clearCallingIdentity();
try {
- pae.intent.replaceExtras(pae.extras);
- pae.intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_SINGLE_TOP
- | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- closeSystemDialogs("assist");
- try {
- mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle));
- } catch (ActivityNotFoundException e) {
- Slog.w(TAG, "No activity to handle assist action.", e);
+ if (TextUtils.equals(pae.intent.getAction(),
+ android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) {
+ pae.intent.putExtras(pae.extras);
+ mContext.startServiceAsUser(pae.intent, new UserHandle(pae.userHandle));
+ } else {
+ pae.intent.replaceExtras(pae.extras);
+ pae.intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ closeSystemDialogs("assist");
+
+ try {
+ mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle));
+ } catch (ActivityNotFoundException e) {
+ Slog.w(TAG, "No activity to handle assist action.", e);
+ }
}
} finally {
Binder.restoreCallingIdentity(ident);
@@ -22812,6 +22818,8 @@
requestPssAllProcsLocked(now, false, mProcessStats.isMemFactorLowered());
}
+ ArrayList<UidRecord> becameIdle = null;
+
// Update from any uid changes.
if (mLocalPowerManager != null) {
mLocalPowerManager.startUidChanges();
@@ -22844,6 +22852,10 @@
}
if (uidRec.idle && !uidRec.setIdle) {
uidChange = UidRecord.CHANGE_IDLE;
+ if (becameIdle == null) {
+ becameIdle = new ArrayList<>();
+ }
+ becameIdle.add(uidRec);
}
} else {
if (uidRec.idle) {
@@ -22875,6 +22887,14 @@
mLocalPowerManager.finishUidChanges();
}
+ if (becameIdle != null) {
+ // If we have any new uids that became idle this time, we need to make sure
+ // they aren't left with running services.
+ for (int i = becameIdle.size() - 1; i >= 0; i--) {
+ mServices.stopInBackgroundLocked(becameIdle.get(i).uid);
+ }
+ }
+
if (mProcessStats.shouldWriteNowLocked(now)) {
mHandler.post(new Runnable() {
@Override public void run() {
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index aae98a6..0c8321d 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -6,10 +6,12 @@
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
-import static android.app.WindowConfiguration.WINDOWING_MODE_DOCKED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_BIND_APPLICATION_DELAY_MS;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_CALLING_PACKAGE_NAME;
@@ -111,31 +113,34 @@
}
mLastLogTimeSecs = now;
- ActivityStack stack = mSupervisor.getStack(DOCKED_STACK_ID);
- if (stack != null && stack.shouldBeVisible(null) != STACK_INVISIBLE) {
- mWindowState = WINDOW_STATE_SIDE_BY_SIDE;
+ mWindowState = WINDOW_STATE_INVALID;
+ ActivityStack stack = mSupervisor.getFocusedStack();
+ if (stack.isActivityTypeAssistant()) {
+ mWindowState = WINDOW_STATE_ASSISTANT;
return;
}
- mWindowState = WINDOW_STATE_INVALID;
- stack = mSupervisor.getFocusedStack();
+
int windowingMode = stack.getWindowingMode();
if (windowingMode == WINDOWING_MODE_PINNED) {
stack = mSupervisor.findStackBehind(stack);
windowingMode = stack.getWindowingMode();
}
- if (StackId.isHomeOrRecentsStack(stack.mStackId)
- || windowingMode == WINDOWING_MODE_FULLSCREEN) {
- mWindowState = WINDOW_STATE_STANDARD;
- } else if (windowingMode == WINDOWING_MODE_DOCKED) {
- Slog.wtf(TAG, "Docked stack shouldn't be the focused stack, because it reported not"
- + " being visible.");
- mWindowState = WINDOW_STATE_INVALID;
- } else if (windowingMode == WINDOWING_MODE_FREEFORM) {
- mWindowState = WINDOW_STATE_FREEFORM;
- } else if (stack.mStackId == ASSISTANT_STACK_ID) {
- mWindowState = WINDOW_STATE_ASSISTANT;
- } else if (StackId.isStaticStack(stack.mStackId)) {
- throw new IllegalStateException("Unknown stack=" + stack);
+ switch (windowingMode) {
+ case WINDOWING_MODE_FULLSCREEN:
+ mWindowState = WINDOW_STATE_STANDARD;
+ break;
+ case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY:
+ case WINDOWING_MODE_SPLIT_SCREEN_SECONDARY:
+ mWindowState = WINDOW_STATE_SIDE_BY_SIDE;
+ break;
+ case WINDOW_STATE_FREEFORM:
+ mWindowState = WINDOW_STATE_FREEFORM;
+ break;
+ default:
+ if (windowingMode != WINDOWING_MODE_UNDEFINED) {
+ throw new IllegalStateException("Unknown windowing mode for stack=" + stack
+ + " windowingMode=" + windowingMode);
+ }
}
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 651d3a6..0ccb45f 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -191,10 +191,8 @@
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityRecord" : TAG_AM;
private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
private static final String TAG_SAVED_STATE = TAG + POSTFIX_SAVED_STATE;
- private static final String TAG_SCREENSHOTS = TAG + POSTFIX_SCREENSHOTS;
private static final String TAG_STATES = TAG + POSTFIX_STATES;
private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
- private static final String TAG_THUMBNAILS = TAG + POSTFIX_THUMBNAILS;
private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
private static final boolean SHOW_ACTIVITY_START_TIME = true;
@@ -937,8 +935,7 @@
(info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0, info.configChanges,
task.voiceSession != null, mLaunchTaskBehind, isAlwaysFocusable(),
appInfo.targetSdkVersion, mRotationAnimationHint,
- ActivityManagerService.getInputDispatchingTimeoutLocked(this) * 1000000L,
- new Configuration(getOverrideConfiguration()), mBounds);
+ ActivityManagerService.getInputDispatchingTimeoutLocked(this) * 1000000L, mBounds);
task.addActivityToTop(this);
@@ -1122,7 +1119,7 @@
* @return whether this activity supports PiP multi-window and can be put in the pinned stack.
*/
boolean supportsPictureInPicture() {
- return service.mSupportsPictureInPicture && isActivityTypeStandard()
+ return service.mSupportsPictureInPicture && isActivityTypeStandardOrUndefined()
&& info.supportsPictureInPicture();
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 7ade0eb..8c9e399 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -70,6 +70,7 @@
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
import static com.android.server.am.ActivityStack.ActivityState.STOPPING;
import static com.android.server.am.ActivityStackSupervisor.FindTaskResult;
@@ -465,15 +466,13 @@
mTmpRect2.setEmpty();
updateOverrideConfiguration();
mWindowContainerController = createStackWindowController(display.mDisplayId, onTop,
- mTmpRect2, getOverrideConfiguration());
+ mTmpRect2);
mStackSupervisor.mStacks.put(mStackId, this);
postAddToDisplay(display, mTmpRect2.isEmpty() ? null : mTmpRect2, onTop);
}
- T createStackWindowController(int displayId, boolean onTop, Rect outBounds,
- Configuration overrideConfig) {
- return (T) new StackWindowController(mStackId, this, displayId, onTop, outBounds,
- overrideConfig);
+ T createStackWindowController(int displayId, boolean onTop, Rect outBounds) {
+ return (T) new StackWindowController(mStackId, this, displayId, onTop, outBounds);
}
T getWindowContainerController() {
@@ -483,7 +482,8 @@
// TODO: Not needed once we are no longer using stack ids as the override config. can be passed
// in.
private void updateOverrideConfiguration() {
- final int windowingMode = getWindowingModeForStackId(mStackId);
+ final int windowingMode = getWindowingModeForStackId(
+ mStackId, mStackSupervisor.getStack(DOCKED_STACK_ID) != null);
if (windowingMode != WINDOWING_MODE_UNDEFINED) {
setWindowingMode(windowingMode);
}
@@ -1199,6 +1199,7 @@
* process of going to sleep (checkReadyForSleep will be called when that process finishes).
*/
boolean goToSleepIfPossible(boolean shuttingDown) {
+ final ActivityRecord topActivity = topActivity();
boolean shouldSleep = true;
if (mResumedActivity != null) {
@@ -1223,6 +1224,11 @@
// Still waiting for something to pause; can't sleep yet.
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still waiting to pause " + mPausingActivity);
shouldSleep = false;
+ } else if (topActivity != null && topActivity.state == ActivityState.PAUSED) {
+ // Our top activity is currently paused, we need to ensure we move it to the stopped
+ // state.
+ stopActivityLocked(topActivity);
+ shouldSleep = false;
}
if (!shuttingDown) {
@@ -2061,10 +2067,15 @@
try {
final boolean canEnterPictureInPicture = r.checkEnterPictureInPictureState(
"makeInvisible", true /* beforeStopping */);
- // Defer telling the client it is hidden if it can enter Pip and isn't current stopped
- // or stopping. This gives it a chance to enter Pip in onPause().
+ // Defer telling the client it is hidden if it can enter Pip and isn't current paused,
+ // stopped or stopping. This gives it a chance to enter Pip in onPause().
+ // TODO: There is still a question surrounding activities in multi-window mode that want
+ // to enter Pip after they are paused, but are still visible. I they should be okay to
+ // enter Pip in those cases, but not "auto-Pip" which is what this condition covers and
+ // the current contract for "auto-Pip" is that the app should enter it before onPause
+ // returns. Just need to confirm this reasoning makes sense.
final boolean deferHidingClient = canEnterPictureInPicture
- && r.state != STOPPING && r.state != STOPPED;
+ && r.state != STOPPING && r.state != STOPPED && r.state != PAUSED;
r.setDeferHidingClient(deferHidingClient);
r.setVisible(false);
@@ -2990,13 +3001,6 @@
// Ensure the task/activity being brought forward is not the assistant
return false;
}
- final boolean isFullscreen = toFrontTask != null
- ? toFrontTask.containsOnlyFullscreenActivities()
- : toFrontActivity.fullscreen;
- if (!isFullscreen) {
- // Ensure the task/activity being brought forward is fullscreen
- return false;
- }
return true;
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index e4a2273..fe28956 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -36,6 +36,8 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
@@ -2279,15 +2281,6 @@
return null;
}
- /**
- * Returns if a stack should be treated as if it's docked. Returns true if the stack is
- * the docked stack itself, or if it's side-by-side to the docked stack.
- */
- boolean isStackDockedInEffect(int stackId) {
- return stackId == DOCKED_STACK_ID ||
- (StackId.isResizeableByDockedStack(stackId) && getStack(DOCKED_STACK_ID) != null);
- }
-
void resizeStackLocked(int stackId, Rect bounds, Rect tempTaskBounds, Rect tempTaskInsetBounds,
boolean preserveWindows, boolean allowResizeInDockedMode, boolean deferResume) {
if (stackId == DOCKED_STACK_ID) {
@@ -2301,9 +2294,9 @@
return;
}
+ final boolean splitScreenActive = getStack(DOCKED_STACK_ID) != null;
if (!allowResizeInDockedMode
- && !stack.getWindowConfiguration().tasksAreFloating()
- && getStack(DOCKED_STACK_ID) != null) {
+ && !stack.getWindowConfiguration().tasksAreFloating() && splitScreenActive) {
// If the docked stack exists, don't resize non-floating stacks independently of the
// size computed from the docked stack size (otherwise they will be out of sync)
return;
@@ -2312,6 +2305,16 @@
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizeStack_" + stackId);
mWindowManager.deferSurfaceLayout();
try {
+ if (stack.supportSplitScreenWindowingMode()) {
+ if (bounds == null && stack.inSplitScreenWindowingMode()) {
+ // null bounds = fullscreen windowing mode...at least for now.
+ stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ } else if (splitScreenActive) {
+ // If we are in split-screen mode and this stack support split-screen, then
+ // it should be split-screen secondary mode. i.e. adjacent to the docked stack.
+ stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+ }
+ }
stack.resize(bounds, tempTaskBounds, tempTaskInsetBounds);
if (!deferResume) {
stack.ensureVisibleActivitiesConfigurationLocked(
@@ -2323,14 +2326,14 @@
}
}
- void deferUpdateBounds(int stackId) {
+ private void deferUpdateBounds(int stackId) {
final ActivityStack stack = getStack(stackId);
if (stack != null) {
stack.deferUpdateBounds();
}
}
- void continueUpdateBounds(int stackId) {
+ private void continueUpdateBounds(int stackId) {
final ActivityStack stack = getStack(stackId);
if (stack != null) {
stack.continueUpdateBounds();
@@ -2365,13 +2368,15 @@
// which is dismissing the docked stack, so resize all other stacks to
// fullscreen here already so we don't end up with resize trashing.
for (int i = FIRST_STATIC_STACK_ID; i <= LAST_STATIC_STACK_ID; i++) {
- if (StackId.isResizeableByDockedStack(i)) {
- ActivityStack otherStack = getStack(i);
- if (otherStack != null) {
- resizeStackLocked(i, null, null, null, PRESERVE_WINDOWS,
- true /* allowResizeInDockedMode */, DEFER_RESUME);
- }
+ final ActivityStack otherStack = getStack(i);
+ if (otherStack == null) {
+ continue;
}
+ if (!otherStack.inSplitScreenSecondaryWindowingMode()) {
+ continue;
+ }
+ resizeStackLocked(i, null, null, null, PRESERVE_WINDOWS,
+ true /* allowResizeInDockedMode */, DEFER_RESUME);
}
// Also disable docked stack resizing since we have manually adjusted the
@@ -2485,18 +2490,24 @@
// screen controls and is also the same for all stacks.
final Rect otherTaskRect = new Rect();
for (int i = FIRST_STATIC_STACK_ID; i <= LAST_STATIC_STACK_ID; i++) {
- final ActivityStack current = getStack(i);
- if (current != null && StackId.isResizeableByDockedStack(i)) {
- current.getStackDockedModeBounds(
- tempOtherTaskBounds /* currentTempTaskBounds */,
- tempRect /* outStackBounds */,
- otherTaskRect /* outTempTaskBounds */, true /* ignoreVisibility */);
-
- resizeStackLocked(i, !tempRect.isEmpty() ? tempRect : null,
- !otherTaskRect.isEmpty() ? otherTaskRect : tempOtherTaskBounds,
- tempOtherTaskInsetBounds, preserveWindows,
- true /* allowResizeInDockedMode */, deferResume);
+ if (i == DOCKED_STACK_ID) {
+ continue;
}
+ final ActivityStack current = getStack(i);
+ if (current == null || !current.supportSplitScreenWindowingMode()) {
+ continue;
+ }
+ // Need to set windowing mode here before we try to get the dock bounds.
+ current.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+ current.getStackDockedModeBounds(
+ tempOtherTaskBounds /* currentTempTaskBounds */,
+ tempRect /* outStackBounds */,
+ otherTaskRect /* outTempTaskBounds */, true /* ignoreVisibility */);
+
+ resizeStackLocked(i, !tempRect.isEmpty() ? tempRect : null,
+ !otherTaskRect.isEmpty() ? otherTaskRect : tempOtherTaskBounds,
+ tempOtherTaskInsetBounds, preserveWindows,
+ true /* allowResizeInDockedMode */, deferResume);
}
}
if (!deferResume) {
@@ -4023,7 +4034,10 @@
final boolean isSecondaryDisplayPreferred =
(preferredDisplayId != DEFAULT_DISPLAY && preferredDisplayId != INVALID_DISPLAY)
|| StackId.isDynamicStack(preferredStackId);
- if (((!isStackDockedInEffect(actualStackId) && preferredStackId != DOCKED_STACK_ID)
+ final ActivityStack actualStack = getStack(actualStackId);
+ final boolean inSplitScreenMode = actualStack != null
+ && actualStack.inSplitScreenWindowingMode();
+ if (((!inSplitScreenMode && preferredStackId != DOCKED_STACK_ID)
&& !isSecondaryDisplayPreferred) || task.isActivityTypeHome()) {
return;
}
diff --git a/services/core/java/com/android/server/am/AppErrorDialog.java b/services/core/java/com/android/server/am/AppErrorDialog.java
index 51ce30e..5412266 100644
--- a/services/core/java/com/android/server/am/AppErrorDialog.java
+++ b/services/core/java/com/android/server/am/AppErrorDialog.java
@@ -40,7 +40,6 @@
private final ProcessRecord mProc;
private final boolean mRepeating;
private final boolean mIsRestartable;
-
private CharSequence mName;
static int CANT_SHOW = -1;
@@ -110,17 +109,16 @@
LayoutInflater.from(context).inflate(
com.android.internal.R.layout.app_error_dialog, frame, true);
- boolean hasRestart = !mRepeating && mIsRestartable;
final boolean hasReceiver = mProc.errorReportReceiver != null;
final TextView restart = findViewById(com.android.internal.R.id.aerr_restart);
restart.setOnClickListener(this);
- restart.setVisibility(hasRestart ? View.VISIBLE : View.GONE);
+ restart.setVisibility(mIsRestartable ? View.VISIBLE : View.GONE);
final TextView report = findViewById(com.android.internal.R.id.aerr_report);
report.setOnClickListener(this);
report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE);
final TextView close = findViewById(com.android.internal.R.id.aerr_close);
- close.setVisibility(!hasRestart ? View.VISIBLE : View.GONE);
+ close.setVisibility(mRepeating ? View.VISIBLE : View.GONE);
close.setOnClickListener(this);
boolean showMute = !Build.IS_USER && Settings.Global.getInt(context.getContentResolver(),
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index d1424c8..440b3d3b 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -592,20 +592,46 @@
boolean handleAppCrashLocked(ProcessRecord app, String reason,
String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data) {
- long now = SystemClock.uptimeMillis();
- boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
+ final long now = SystemClock.uptimeMillis();
+ final boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
+ final boolean procIsBoundForeground =
+ (app.curProcState == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
+
Long crashTime;
Long crashTimePersistent;
+ boolean tryAgain = false;
+
if (!app.isolated) {
crashTime = mProcessCrashTimes.get(app.info.processName, app.uid);
crashTimePersistent = mProcessCrashTimesPersistent.get(app.info.processName, app.uid);
} else {
crashTime = crashTimePersistent = null;
}
- if (crashTime != null && now < crashTime+ProcessList.MIN_CRASH_INTERVAL) {
- // This process loses!
+
+ // Bump up the crash count of any services currently running in the proc.
+ for (int i = app.services.size() - 1; i >= 0; i--) {
+ // Any services running in the application need to be placed
+ // back in the pending list.
+ ServiceRecord sr = app.services.valueAt(i);
+ // If the service was restarted a while ago, then reset crash count, else increment it.
+ if (now > sr.restartTime + ProcessList.MIN_CRASH_INTERVAL) {
+ sr.crashCount = 1;
+ } else {
+ sr.crashCount++;
+ }
+ // Allow restarting for started or bound foreground services that are crashing.
+ // This includes wallpapers.
+ if (sr.crashCount < mService.mConstants.BOUND_SERVICE_MAX_CRASH_RETRY
+ && (sr.isForeground || procIsBoundForeground)) {
+ tryAgain = true;
+ }
+ }
+
+ if (crashTime != null && now < crashTime + ProcessList.MIN_CRASH_INTERVAL) {
+ // The process crashed again very quickly. If it was a bound foreground service, let's
+ // try to restart again in a while, otherwise the process loses!
Slog.w(TAG, "Process " + app.info.processName
+ " has crashed too many times: killing!");
EventLog.writeEvent(EventLogTags.AM_PROCESS_CRASHED_TOO_MUCH,
@@ -630,7 +656,7 @@
// Don't let services in this process be restarted and potentially
// annoy the user repeatedly. Unless it is persistent, since those
// processes run critical code.
- mService.removeProcessLocked(app, false, false, "crash");
+ mService.removeProcessLocked(app, false, tryAgain, "crash");
mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
if (!showBackground) {
return false;
@@ -649,21 +675,8 @@
}
}
- boolean procIsBoundForeground =
- (app.curProcState == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
- // Bump up the crash count of any services currently running in the proc.
- for (int i=app.services.size()-1; i>=0; i--) {
- // Any services running in the application need to be placed
- // back in the pending list.
- ServiceRecord sr = app.services.valueAt(i);
- sr.crashCount++;
-
- // Allow restarting for started or bound foreground services that are crashing the
- // first time. This includes wallpapers.
- if ((data != null) && (sr.crashCount <= 1)
- && (sr.isForeground || procIsBoundForeground)) {
- data.isRestartableForService = true;
- }
+ if (data != null && tryAgain) {
+ data.isRestartableForService = true;
}
// If the crashing process is what we consider to be the "home process" and it has been
@@ -689,7 +702,7 @@
if (!app.isolated) {
// XXX Can't keep track of crash times for isolated processes,
- // because they don't have a perisistent identity.
+ // because they don't have a persistent identity.
mProcessCrashTimes.put(app.info.processName, app.uid, now);
mProcessCrashTimesPersistent.put(app.info.processName, app.uid, now);
}
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index 5fac397..f3ccba5 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -264,6 +264,10 @@
mStats.updateKernelMemoryBandwidthLocked();
}
+ if ((updateFlags & UPDATE_RPM) != 0) {
+ mStats.updateRpmStatsLocked();
+ }
+
if (bluetoothInfo != null) {
if (bluetoothInfo.isValid()) {
mStats.updateBluetoothStateLocked(bluetoothInfo);
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 33568cd..3105e37 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -49,9 +49,11 @@
import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.PowerProfile;
+import com.android.internal.os.RpmStats;
import com.android.internal.util.DumpUtils;
import com.android.server.LocalServices;
import com.android.server.power.BatterySaverPolicy.ServiceType;
+import android.util.StatsLog;
import java.io.File;
import java.io.FileDescriptor;
@@ -84,6 +86,7 @@
private final Context mContext;
private final BatteryExternalStatsWorker mWorker;
+ private native void getLowPowerStats(RpmStats rpmStats);
private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
@@ -95,6 +98,19 @@
private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
private static final int MAX_LOW_POWER_STATS_SIZE = 512;
+ /**
+ * Replaces the information in the given rpmStats with up-to-date information.
+ */
+ @Override
+ public void fillLowPowerStats(RpmStats rpmStats) {
+ if (DBG) Slog.d(TAG, "begin getLowPowerStats");
+ try {
+ getLowPowerStats(rpmStats);
+ } finally {
+ if (DBG) Slog.d(TAG, "end getLowPowerStats");
+ }
+ }
+
@Override
public String getPlatformLowPowerStats() {
if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
@@ -119,7 +135,7 @@
@Override
public String getSubsystemLowPowerStats() {
- Slog.d(TAG, "begin getSubsystemLowPowerStats");
+ if (DBG) Slog.d(TAG, "begin getSubsystemLowPowerStats");
try {
mUtf8BufferStat.clear();
mUtf16BufferStat.clear();
@@ -135,7 +151,7 @@
mUtf16BufferStat.flip();
return mUtf16BufferStat.toString();
} finally {
- Slog.d(TAG, "end getSubsystemLowPowerStats");
+ if (DBG) Slog.d(TAG, "end getSubsystemLowPowerStats");
}
}
@@ -281,12 +297,26 @@
void noteProcessStart(String name, int uid) {
synchronized (mStats) {
mStats.noteProcessStartLocked(name, uid);
+
+ // TODO: remove this once we figure out properly where and how
+ // PROCESS_EVENT = 1112
+ // EVENT SUBTYPE: START = 1
+ // KEY_NAME: 1
+ // KEY_UID: 2
+ StatsLog.writeArray(1112, 1, 1, name, 2, uid);
}
}
void noteProcessCrash(String name, int uid) {
synchronized (mStats) {
mStats.noteProcessCrashLocked(name, uid);
+
+ // TODO: remove this once we figure out properly where and how
+ // PROCESS_EVENT = 1112
+ // EVENT SUBTYPE: CRASH = 2
+ // KEY_NAME: 1
+ // KEY_UID: 2
+ StatsLog.writeArray(1112, 2, 1, name, 2, uid);
}
}
@@ -478,14 +508,14 @@
mStats.noteStartSensorLocked(uid, sensor);
}
}
-
+
public void noteStopSensor(int uid, int sensor) {
enforceCallingPermission();
synchronized (mStats) {
mStats.noteStopSensorLocked(uid, sensor);
}
}
-
+
public void noteVibratorOn(int uid, long durationMillis) {
enforceCallingPermission();
synchronized (mStats) {
@@ -506,23 +536,28 @@
mStats.noteStartGpsLocked(uid);
}
}
-
+
public void noteStopGps(int uid) {
enforceCallingPermission();
synchronized (mStats) {
mStats.noteStopGpsLocked(uid);
}
}
-
+
public void noteScreenState(int state) {
enforceCallingPermission();
if (DBG) Slog.d(TAG, "begin noteScreenState");
synchronized (mStats) {
mStats.noteScreenStateLocked(state);
+ // TODO: remove this once we figure out properly where and how
+ // SCREEN_EVENT = 1003
+ // State key: 1
+ // State value: state. We can change this to our own def later.
+ StatsLog.writeArray(1003, 1, state);
}
if (DBG) Slog.d(TAG, "end noteScreenState");
}
-
+
public void noteScreenBrightness(int brightness) {
enforceCallingPermission();
synchronized (mStats) {
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 86ee3f4..a601ee1 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -39,9 +39,8 @@
@Override
PinnedStackWindowController createStackWindowController(int displayId, boolean onTop,
- Rect outBounds, Configuration overrideConfig) {
- return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds,
- overrideConfig);
+ Rect outBounds) {
+ return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds);
}
Rect getDefaultPictureInPictureBounds(float aspectRatio) {
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index fc1c02f..0e651845 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -430,9 +430,8 @@
}
final Rect bounds = updateOverrideConfigurationFromLaunchBounds();
- final Configuration overrideConfig = getOverrideConfiguration();
setWindowContainerController(new TaskWindowContainerController(taskId, this,
- getStack().getWindowContainerController(), userId, bounds, overrideConfig,
+ getStack().getWindowContainerController(), userId, bounds,
mResizeMode, mSupportsPictureInPicture, onTop,
showForAllUsers, lastTaskDescription));
}
@@ -1017,19 +1016,6 @@
return intent != null ? intent : affinityIntent;
}
- /**
- * @return Whether there are only fullscreen activities in this task.
- */
- boolean containsOnlyFullscreenActivities() {
- for (int i = 0; i < mActivities.size(); i++) {
- final ActivityRecord r = mActivities.get(i);
- if (!r.finishing && !r.fullscreen) {
- return false;
- }
- }
- return true;
- }
-
/** Returns the first non-finishing activity from the root. */
ActivityRecord getRootActivity() {
for (int i = 0; i < mActivities.size(); i++) {
@@ -1175,9 +1161,6 @@
}
// Only set this based on the first activity
if (mActivities.isEmpty()) {
- // TODO: propagating this change to the WM side...Should probably be done by having
- // ConfigurationContainer change listener that the WindowContainerController registers
- // for.
if (r.getActivityType() == ACTIVITY_TYPE_UNDEFINED) {
// Normally non-standard activity type for the activity record will be set when the
// object is created, however we delay setting the standard application type until
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index 3e5eed3..d1a37af 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -171,7 +171,7 @@
}
}
if (change) {
- dispatchPlaybackChange();
+ dispatchPlaybackChange(false);
}
}
@@ -210,7 +210,7 @@
}
}
if (change) {
- dispatchPlaybackChange();
+ dispatchPlaybackChange(event == AudioPlaybackConfiguration.PLAYER_STATE_RELEASED);
}
}
@@ -228,6 +228,7 @@
"releasing player piid:" + piid));
mPlayers.remove(new Integer(piid));
mDuckingManager.removeReleased(apc);
+ apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED);
}
}
}
@@ -243,6 +244,14 @@
pw.println("\nPlaybackActivityMonitor dump time: "
+ DateFormat.getTimeInstance().format(new Date()));
synchronized(mPlayerLock) {
+ pw.println("\n playback listeners:");
+ synchronized(mClients) {
+ for (PlayMonitorClient pmc : mClients) {
+ pw.print(" " + (pmc.mIsPrivileged ? "(S)" : "(P)")
+ + pmc.toString());
+ }
+ }
+ pw.println("\n");
// all players
pw.println("\n players:");
final List<Integer> piidIntList = new ArrayList<Integer>(mPlayers.keySet());
@@ -267,7 +276,7 @@
for (int uid : mBannedUids) {
pw.print(" " + uid);
}
- pw.println();
+ pw.println("\n");
// log
mEventLogger.dump(pw);
}
@@ -292,7 +301,11 @@
return true;
}
- private void dispatchPlaybackChange() {
+ /**
+ * Sends new list after update of playback configurations
+ * @param iplayerReleased indicates if the change was due to a player being released
+ */
+ private void dispatchPlaybackChange(boolean iplayerReleased) {
synchronized (mClients) {
// typical use case, nobody is listening, don't do any work
if (mClients.isEmpty()) {
@@ -323,9 +336,12 @@
// do not spam the logs if there are problems communicating with this client
if (pmc.mErrorCount < PlayMonitorClient.MAX_ERRORS) {
if (pmc.mIsPrivileged) {
- pmc.mDispatcherCb.dispatchPlaybackConfigChange(configsSystem);
+ pmc.mDispatcherCb.dispatchPlaybackConfigChange(configsSystem,
+ iplayerReleased);
} else {
- pmc.mDispatcherCb.dispatchPlaybackConfigChange(configsPublic);
+ // non-system clients don't have the control interface IPlayer, so
+ // they don't need to flush commands when a player was released
+ pmc.mDispatcherCb.dispatchPlaybackConfigChange(configsPublic, false);
}
}
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/broadcastradio/Tuner.java b/services/core/java/com/android/server/broadcastradio/Tuner.java
index 06a5af5..e6ae320 100644
--- a/services/core/java/com/android/server/broadcastradio/Tuner.java
+++ b/services/core/java/com/android/server/broadcastradio/Tuner.java
@@ -77,6 +77,8 @@
@NonNull RadioManager.BandConfig config);
private native RadioManager.BandConfig nativeGetConfiguration(long nativeContext, int region);
+ private native void nativeSetMuted(long nativeContext, boolean mute);
+
private native void nativeStep(long nativeContext, boolean directionDown, boolean skipSubChannel);
private native void nativeScan(long nativeContext, boolean directionDown, boolean skipSubChannel);
private native void nativeTune(long nativeContext, @NonNull ProgramSelector selector);
@@ -148,8 +150,7 @@
if (mIsMuted == mute) return;
mIsMuted = mute;
- // TODO(b/62713378): notifify audio policy manager of media activity on radio audio
- // device. This task is pulled directly from previous implementation of native service.
+ nativeSetMuted(mNativeContext, mute);
}
}
diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java
index db72c5e..e6228d4 100644
--- a/services/core/java/com/android/server/clipboard/ClipboardService.java
+++ b/services/core/java/com/android/server/clipboard/ClipboardService.java
@@ -20,6 +20,7 @@
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.IActivityManager;
+import android.app.KeyguardManager;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.ContentProvider;
@@ -304,7 +305,7 @@
public ClipData getPrimaryClip(String pkg) {
synchronized (this) {
if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, pkg,
- Binder.getCallingUid())) {
+ Binder.getCallingUid()) || isDeviceLocked()) {
return null;
}
addActiveOwnerLocked(Binder.getCallingUid(), pkg);
@@ -316,7 +317,7 @@
public ClipDescription getPrimaryClipDescription(String callingPackage) {
synchronized (this) {
if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, callingPackage,
- Binder.getCallingUid())) {
+ Binder.getCallingUid()) || isDeviceLocked()) {
return null;
}
PerUserClipboard clipboard = getClipboard();
@@ -328,7 +329,7 @@
public boolean hasPrimaryClip(String callingPackage) {
synchronized (this) {
if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, callingPackage,
- Binder.getCallingUid())) {
+ Binder.getCallingUid()) || isDeviceLocked()) {
return false;
}
return getClipboard().primaryClip != null;
@@ -355,7 +356,7 @@
public boolean hasClipboardText(String callingPackage) {
synchronized (this) {
if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, callingPackage,
- Binder.getCallingUid())) {
+ Binder.getCallingUid()) || isDeviceLocked()) {
return false;
}
PerUserClipboard clipboard = getClipboard();
@@ -433,6 +434,17 @@
}
}
+ private boolean isDeviceLocked() {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ final KeyguardManager keyguardManager = getContext().getSystemService(
+ KeyguardManager.class);
+ return keyguardManager != null && keyguardManager.isDeviceLocked();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
private final void checkUriOwnerLocked(Uri uri, int uid) {
if (!"content".equals(uri.getScheme())) {
return;
diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java
index ee38219..22330e6 100644
--- a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java
+++ b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java
@@ -38,6 +38,7 @@
import android.net.metrics.NetworkEvent;
import android.net.metrics.RaEvent;
import android.net.metrics.ValidationProbeEvent;
+import android.net.metrics.WakeupStats;
import android.os.Parcelable;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -115,6 +116,22 @@
return out;
}
+ public static IpConnectivityEvent toProto(WakeupStats in) {
+ IpConnectivityLogClass.WakeupStats wakeupStats =
+ new IpConnectivityLogClass.WakeupStats();
+ in.updateDuration();
+ wakeupStats.durationSec = in.durationSec;
+ wakeupStats.totalWakeups = in.totalWakeups;
+ wakeupStats.rootWakeups = in.rootWakeups;
+ wakeupStats.systemWakeups = in.systemWakeups;
+ wakeupStats.nonApplicationWakeups = in.nonApplicationWakeups;
+ wakeupStats.applicationWakeups = in.applicationWakeups;
+ wakeupStats.unroutedWakeups = in.unroutedWakeups;
+ final IpConnectivityEvent out = buildEvent(0, 0, in.iface);
+ out.setWakeupStats(wakeupStats);
+ return out;
+ }
+
private static IpConnectivityEvent buildEvent(int netId, long transports, String ifname) {
final IpConnectivityEvent ev = new IpConnectivityEvent();
ev.networkId = netId;
diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
index 4094083..6f7ace2 100644
--- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
+++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
@@ -16,6 +16,8 @@
package com.android.server.connectivity;
+import static android.util.TimeUtils.NANOS_PER_MS;
+
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.INetdEventCallback;
@@ -25,9 +27,12 @@
import android.net.metrics.DnsEvent;
import android.net.metrics.INetdEventListener;
import android.net.metrics.IpConnectivityLog;
+import android.net.metrics.WakeupEvent;
+import android.net.metrics.WakeupStats;
import android.os.RemoteException;
import android.text.format.DateUtils;
import android.util.Log;
+import android.util.ArrayMap;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -59,12 +64,28 @@
private static final int CONNECT_LATENCY_FILL_RATE = 15 * (int) DateUtils.SECOND_IN_MILLIS;
private static final int CONNECT_LATENCY_MAXIMUM_RECORDS = 20000;
+ @VisibleForTesting
+ static final int WAKEUP_EVENT_BUFFER_LENGTH = 1024;
+ // TODO: dedup this String constant with the one used in
+ // ConnectivityService#wakeupModifyInterface().
+ @VisibleForTesting
+ static final String WAKEUP_EVENT_IFACE_PREFIX = "iface:";
+
// Sparse arrays of DNS and connect events, grouped by net id.
@GuardedBy("this")
private final SparseArray<DnsEvent> mDnsEvents = new SparseArray<>();
@GuardedBy("this")
private final SparseArray<ConnectStats> mConnectEvents = new SparseArray<>();
+ // Array of aggregated wakeup event stats, grouped by interface name.
+ @GuardedBy("this")
+ private final ArrayMap<String, WakeupStats> mWakeupStats = new ArrayMap<>();
+ // Ring buffer array for storing packet wake up events sent by Netd.
+ @GuardedBy("this")
+ private final WakeupEvent[] mWakeupEvents = new WakeupEvent[WAKEUP_EVENT_BUFFER_LENGTH];
+ @GuardedBy("this")
+ private long mWakeupEventCursor = 0;
+
private final ConnectivityManager mCm;
@GuardedBy("this")
@@ -137,11 +158,62 @@
@Override
public synchronized void onWakeupEvent(String prefix, int uid, int gid, long timestampNs) {
+ maybeVerboseLog("onWakeupEvent(%s, %d, %d, %sns)", prefix, uid, gid, timestampNs);
+
+ // TODO: add ip protocol and port
+
+ String iface = prefix.replaceFirst(WAKEUP_EVENT_IFACE_PREFIX, "");
+ final long timestampMs;
+ if (timestampNs > 0) {
+ timestampMs = timestampNs / NANOS_PER_MS;
+ } else {
+ timestampMs = System.currentTimeMillis();
+ }
+
+ addWakupEvent(iface, timestampMs, uid);
+ }
+
+ @GuardedBy("this")
+ private void addWakupEvent(String iface, long timestampMs, int uid) {
+ int index = wakeupEventIndex(mWakeupEventCursor);
+ mWakeupEventCursor++;
+ WakeupEvent event = new WakeupEvent();
+ event.iface = iface;
+ event.timestampMs = timestampMs;
+ event.uid = uid;
+ mWakeupEvents[index] = event;
+ WakeupStats stats = mWakeupStats.get(iface);
+ if (stats == null) {
+ stats = new WakeupStats(iface);
+ mWakeupStats.put(iface, stats);
+ }
+ stats.countEvent(event);
+ }
+
+ @GuardedBy("this")
+ private WakeupEvent[] getWakeupEvents() {
+ int length = (int) Math.min(mWakeupEventCursor, (long) mWakeupEvents.length);
+ WakeupEvent[] out = new WakeupEvent[length];
+ // Reverse iteration from youngest event to oldest event.
+ long inCursor = mWakeupEventCursor - 1;
+ int outIdx = out.length - 1;
+ while (outIdx >= 0) {
+ out[outIdx--] = mWakeupEvents[wakeupEventIndex(inCursor--)];
+ }
+ return out;
+ }
+
+ private static int wakeupEventIndex(long cursor) {
+ return (int) Math.abs(cursor % WAKEUP_EVENT_BUFFER_LENGTH);
}
public synchronized void flushStatistics(List<IpConnectivityEvent> events) {
flushProtos(events, mConnectEvents, IpConnectivityEventBuilder::toProto);
flushProtos(events, mDnsEvents, IpConnectivityEventBuilder::toProto);
+ for (int i = 0; i < mWakeupStats.size(); i++) {
+ events.add(IpConnectivityEventBuilder.toProto(mWakeupStats.valueAt(i)));
+ }
+ mWakeupStats.clear();
}
public synchronized void dump(PrintWriter writer) {
@@ -153,13 +225,22 @@
}
public synchronized void list(PrintWriter pw) {
- listEvents(pw, mConnectEvents, (x) -> x);
- listEvents(pw, mDnsEvents, (x) -> x);
+ listEvents(pw, mConnectEvents, (x) -> x, "\n");
+ listEvents(pw, mDnsEvents, (x) -> x, "\n");
+ for (int i = 0; i < mWakeupStats.size(); i++) {
+ pw.println(mWakeupStats.valueAt(i));
+ }
+ for (WakeupEvent wakeup : getWakeupEvents()) {
+ pw.println(wakeup);
+ }
}
public synchronized void listAsProtos(PrintWriter pw) {
- listEvents(pw, mConnectEvents, IpConnectivityEventBuilder::toProto);
- listEvents(pw, mDnsEvents, IpConnectivityEventBuilder::toProto);
+ listEvents(pw, mConnectEvents, IpConnectivityEventBuilder::toProto, "");
+ listEvents(pw, mDnsEvents, IpConnectivityEventBuilder::toProto, "");
+ for (int i = 0; i < mWakeupStats.size(); i++) {
+ pw.print(IpConnectivityEventBuilder.toProto(mWakeupStats.valueAt(i)));
+ }
}
private static <T> void flushProtos(List<IpConnectivityEvent> out, SparseArray<T> in,
@@ -170,10 +251,13 @@
in.clear();
}
- public static <T> void listEvents(
- PrintWriter pw, SparseArray<T> events, Function<T, Object> mapper) {
+ private static <T> void listEvents(
+ PrintWriter pw, SparseArray<T> events, Function<T, Object> mapper, String separator) {
+ // Proto derived Classes have toString method that adds a \n at the end.
+ // Let the caller control that by passing in the line separator explicitly.
for (int i = 0; i < events.size(); i++) {
- pw.println(mapper.apply(events.valueAt(i)).toString());
+ pw.print(mapper.apply(events.valueAt(i)));
+ pw.print(separator);
}
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index e96f4b0..a4d7242 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -278,6 +278,10 @@
return mHandler;
}
+ public Network network() {
+ return network;
+ }
+
// Functions for manipulating the requests satisfied by this network.
//
// These functions must only called on ConnectivityService's main thread.
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index d3a9354..8b886d6 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -20,7 +20,6 @@
import static android.net.CaptivePortal.APP_RETURN_UNWANTED;
import static android.net.CaptivePortal.APP_RETURN_WANTED_AS_IS;
-import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -229,6 +228,8 @@
// Delay between reevaluations once a captive portal has been found.
private static final int CAPTIVE_PORTAL_REEVALUATE_DELAY_MS = 10*60*1000;
+ private static final int NUM_VALIDATION_LOG_LINES = 20;
+
private final Context mContext;
private final Handler mConnectivityServiceHandler;
private final NetworkAgentInfo mNetworkAgentInfo;
@@ -236,9 +237,15 @@
private final int mNetId;
private final TelephonyManager mTelephonyManager;
private final WifiManager mWifiManager;
- private final AlarmManager mAlarmManager;
private final NetworkRequest mDefaultRequest;
private final IpConnectivityLog mMetricsLog;
+ private final NetworkMonitorSettings mSettings;
+
+ // Configuration values for captive portal detection probes.
+ private final String mCaptivePortalUserAgent;
+ private final URL mCaptivePortalHttpsUrl;
+ private final URL mCaptivePortalHttpUrl;
+ private final URL[] mCaptivePortalFallbackUrls;
@VisibleForTesting
protected boolean mIsCaptivePortalCheckEnabled;
@@ -262,40 +269,37 @@
private CustomIntentReceiver mLaunchCaptivePortalAppBroadcastReceiver = null;
- private final LocalLog validationLogs = new LocalLog(20); // 20 lines
+ private final LocalLog validationLogs = new LocalLog(NUM_VALIDATION_LOG_LINES);
private final Stopwatch mEvaluationTimer = new Stopwatch();
// This variable is set before transitioning to the mCaptivePortalState.
private CaptivePortalProbeResult mLastPortalProbeResult = CaptivePortalProbeResult.FAILED;
- // Configuration values for captive portal detection probes.
- private final String mCaptivePortalUserAgent;
- private final URL mCaptivePortalHttpsUrl;
- private final URL mCaptivePortalHttpUrl;
- private final URL[] mCaptivePortalFallbackUrls;
private int mNextFallbackUrlIndex = 0;
public NetworkMonitor(Context context, Handler handler, NetworkAgentInfo networkAgentInfo,
NetworkRequest defaultRequest) {
- this(context, handler, networkAgentInfo, defaultRequest, new IpConnectivityLog());
+ this(context, handler, networkAgentInfo, defaultRequest, new IpConnectivityLog(),
+ NetworkMonitorSettings.DEFAULT);
}
@VisibleForTesting
protected NetworkMonitor(Context context, Handler handler, NetworkAgentInfo networkAgentInfo,
- NetworkRequest defaultRequest, IpConnectivityLog logger) {
+ NetworkRequest defaultRequest, IpConnectivityLog logger,
+ NetworkMonitorSettings settings) {
// Add suffix indicating which NetworkMonitor we're talking about.
super(TAG + networkAgentInfo.name());
mContext = context;
mMetricsLog = logger;
mConnectivityServiceHandler = handler;
+ mSettings = settings;
mNetworkAgentInfo = networkAgentInfo;
- mNetwork = new OneAddressPerFamilyNetwork(networkAgentInfo.network);
+ mNetwork = new OneAddressPerFamilyNetwork(networkAgentInfo.network());
mNetId = mNetwork.netId;
mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mDefaultRequest = defaultRequest;
addState(mDefaultState);
@@ -305,16 +309,12 @@
addState(mCaptivePortalState, mMaybeNotifyState);
setInitialState(mDefaultState);
- mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT)
- != Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE;
- mUseHttps = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.CAPTIVE_PORTAL_USE_HTTPS, 1) == 1;
-
- mCaptivePortalUserAgent = getCaptivePortalUserAgent(context);
- mCaptivePortalHttpsUrl = makeURL(getCaptivePortalServerHttpsUrl(context));
- mCaptivePortalHttpUrl = makeURL(getCaptivePortalServerHttpUrl(context));
- mCaptivePortalFallbackUrls = makeCaptivePortalFallbackUrls(context);
+ mIsCaptivePortalCheckEnabled = getIsCaptivePortalCheckEnabled();
+ mUseHttps = getUseHttpsValidation();
+ mCaptivePortalUserAgent = getCaptivePortalUserAgent();
+ mCaptivePortalHttpsUrl = makeURL(getCaptivePortalServerHttpsUrl());
+ mCaptivePortalHttpUrl = makeURL(getCaptivePortalServerHttpUrl(settings, context));
+ mCaptivePortalFallbackUrls = makeCaptivePortalFallbackUrls();
start();
}
@@ -705,19 +705,42 @@
}
}
- private static String getCaptivePortalServerHttpsUrl(Context context) {
- return getSetting(context, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL, DEFAULT_HTTPS_URL);
+ public boolean getIsCaptivePortalCheckEnabled() {
+ String symbol = Settings.Global.CAPTIVE_PORTAL_MODE;
+ int defaultValue = Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT;
+ int mode = mSettings.getSetting(mContext, symbol, defaultValue);
+ return mode != Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE;
}
+ public boolean getUseHttpsValidation() {
+ return mSettings.getSetting(mContext, Settings.Global.CAPTIVE_PORTAL_USE_HTTPS, 1) == 1;
+ }
+
+ public boolean getWifiScansAlwaysAvailableDisabled() {
+ return mSettings.getSetting(mContext, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0;
+ }
+
+ private String getCaptivePortalServerHttpsUrl() {
+ return mSettings.getSetting(mContext,
+ Settings.Global.CAPTIVE_PORTAL_HTTPS_URL, DEFAULT_HTTPS_URL);
+ }
+
+ // Static for direct access by ConnectivityService
public static String getCaptivePortalServerHttpUrl(Context context) {
- return getSetting(context, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, DEFAULT_HTTP_URL);
+ return getCaptivePortalServerHttpUrl(NetworkMonitorSettings.DEFAULT, context);
}
- private URL[] makeCaptivePortalFallbackUrls(Context context) {
+ public static String getCaptivePortalServerHttpUrl(
+ NetworkMonitorSettings settings, Context context) {
+ return settings.getSetting(
+ context, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, DEFAULT_HTTP_URL);
+ }
+
+ private URL[] makeCaptivePortalFallbackUrls() {
String separator = ",";
- String firstUrl = getSetting(context,
+ String firstUrl = mSettings.getSetting(mContext,
Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL, DEFAULT_FALLBACK_URL);
- String joinedUrls = firstUrl + separator + getSetting(context,
+ String joinedUrls = firstUrl + separator + mSettings.getSetting(mContext,
Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS, DEFAULT_OTHER_FALLBACK_URLS);
List<URL> urls = new ArrayList<>();
for (String s : joinedUrls.split(separator)) {
@@ -733,13 +756,9 @@
return urls.toArray(new URL[urls.size()]);
}
- private static String getCaptivePortalUserAgent(Context context) {
- return getSetting(context, Settings.Global.CAPTIVE_PORTAL_USER_AGENT, DEFAULT_USER_AGENT);
- }
-
- private static String getSetting(Context context, String symbol, String defaultValue) {
- final String value = Settings.Global.getString(context.getContentResolver(), symbol);
- return value != null ? value : defaultValue;
+ private String getCaptivePortalUserAgent() {
+ return mSettings.getSetting(mContext,
+ Settings.Global.CAPTIVE_PORTAL_USER_AGENT, DEFAULT_USER_AGENT);
}
private URL nextFallbackUrl() {
@@ -1035,12 +1054,13 @@
*/
private void sendNetworkConditionsBroadcast(boolean responseReceived, boolean isCaptivePortal,
long requestTimestampMs, long responseTimestampMs) {
- if (Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0) {
+ if (getWifiScansAlwaysAvailableDisabled()) {
return;
}
- if (systemReady == false) return;
+ if (!systemReady) {
+ return;
+ }
Intent latencyBroadcast = new Intent(ACTION_NETWORK_CONDITIONS_MEASURED);
switch (mNetworkAgentInfo.networkInfo.getType()) {
@@ -1144,4 +1164,24 @@
ev.durationMs = durationMs;
mMetricsLog.log(mNetId, transports, ev);
}
+
+ @VisibleForTesting
+ public interface NetworkMonitorSettings {
+ int getSetting(Context context, String symbol, int defaultValue);
+ String getSetting(Context context, String symbol, String defaultValue);
+
+ static NetworkMonitorSettings DEFAULT = new DefaultNetworkMonitorSettings();
+ }
+
+ @VisibleForTesting
+ public static class DefaultNetworkMonitorSettings implements NetworkMonitorSettings {
+ public int getSetting(Context context, String symbol, int defaultValue) {
+ return Settings.Global.getInt(context.getContentResolver(), symbol, defaultValue);
+ }
+
+ public String getSetting(Context context, String symbol, String defaultValue) {
+ final String value = Settings.Global.getString(context.getContentResolver(), symbol);
+ return value != null ? value : defaultValue;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
index 788867f..5eafe5f 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
@@ -30,6 +30,10 @@
import android.net.LinkProperties;
import android.net.NetworkStats;
import android.net.RouteInfo;
+import android.net.netlink.ConntrackMessage;
+import android.net.netlink.NetlinkConstants;
+import android.net.netlink.NetlinkSocket;
+import android.net.util.IpUtils;
import android.net.util.SharedLog;
import android.os.Handler;
import android.os.Looper;
@@ -37,10 +41,12 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.Settings;
+import android.system.ErrnoException;
+import android.system.OsConstants;
import android.text.TextUtils;
-import com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats;
import java.net.Inet4Address;
import java.net.Inet6Address;
@@ -63,6 +69,7 @@
*/
public class OffloadController {
private static final String TAG = OffloadController.class.getSimpleName();
+ private static final boolean DBG = false;
private static final String ANYIP = "0.0.0.0";
private static final ForwardedStats EMPTY_STATS = new ForwardedStats();
@@ -96,6 +103,9 @@
// includes upstream interfaces that have a quota set.
private HashMap<String, Long> mInterfaceQuotas = new HashMap<>();
+ private int mNatUpdateCallbacksReceived;
+ private int mNatUpdateNetlinkErrors;
+
public OffloadController(Handler h, OffloadHardwareInterface hwi,
ContentResolver contentResolver, INetworkManagementService nms, SharedLog log) {
mHandler = h;
@@ -115,12 +125,12 @@
}
}
- public void start() {
- if (started()) return;
+ public boolean start() {
+ if (started()) return true;
if (isOffloadDisabled()) {
mLog.i("tethering offload disabled");
- return;
+ return false;
}
if (!mConfigInitialized) {
@@ -128,11 +138,14 @@
if (!mConfigInitialized) {
mLog.i("tethering offload config not supported");
stop();
- return;
+ return false;
}
}
mControlInitialized = mHwInterface.initOffloadControl(
+ // OffloadHardwareInterface guarantees that these callback
+ // methods are called on the handler passed to it, which is the
+ // same as mHandler, as coordinated by the setup in Tethering.
new OffloadHardwareInterface.ControlCallback() {
@Override
public void onStarted() {
@@ -203,15 +216,20 @@
String srcAddr, int srcPort,
String dstAddr, int dstPort) {
if (!started()) return;
- mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)",
- proto, srcAddr, srcPort, dstAddr, dstPort));
+ updateNatTimeout(proto, srcAddr, srcPort, dstAddr, dstPort);
}
});
- if (!mControlInitialized) {
+
+ final boolean isStarted = started();
+ if (!isStarted) {
mLog.i("tethering offload control not supported");
stop();
+ } else {
+ mLog.log("tethering offload started");
+ mNatUpdateCallbacksReceived = 0;
+ mNatUpdateNetlinkErrors = 0;
}
- mLog.log("tethering offload started");
+ return isStarted;
}
public void stop() {
@@ -227,6 +245,10 @@
if (wasStarted) mLog.log("tethering offload stopped");
}
+ private boolean started() {
+ return mConfigInitialized && mControlInitialized;
+ }
+
private class OffloadTetheringStatsProvider extends ITetheringStatsProvider.Stub {
@Override
public NetworkStats getTetherStats(int how) {
@@ -402,10 +424,6 @@
mContentResolver, TETHER_OFFLOAD_DISABLED, defaultDisposition) != 0);
}
- private boolean started() {
- return mConfigInitialized && mControlInitialized;
- }
-
private boolean pushUpstreamParameters(String prevUpstream) {
final String iface = currentUpstreamInterface();
@@ -516,10 +534,113 @@
pw.println("Offload disabled");
return;
}
- pw.println("Offload HALs " + (started() ? "started" : "not started"));
+ final boolean isStarted = started();
+ pw.println("Offload HALs " + (isStarted ? "started" : "not started"));
LinkProperties lp = mUpstreamLinkProperties;
String upstream = (lp != null) ? lp.getInterfaceName() : null;
pw.println("Current upstream: " + upstream);
pw.println("Exempt prefixes: " + mLastLocalPrefixStrs);
+ pw.println("NAT timeout update callbacks received during the "
+ + (isStarted ? "current" : "last")
+ + " offload session: "
+ + mNatUpdateCallbacksReceived);
+ pw.println("NAT timeout update netlink errors during the "
+ + (isStarted ? "current" : "last")
+ + " offload session: "
+ + mNatUpdateNetlinkErrors);
+ }
+
+ private void updateNatTimeout(
+ int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) {
+ final String protoName = protoNameFor(proto);
+ if (protoName == null) {
+ mLog.e("Unknown NAT update callback protocol: " + proto);
+ return;
+ }
+
+ final Inet4Address src = parseIPv4Address(srcAddr);
+ if (src == null) {
+ mLog.e("Failed to parse IPv4 address: " + srcAddr);
+ return;
+ }
+
+ if (!IpUtils.isValidUdpOrTcpPort(srcPort)) {
+ mLog.e("Invalid src port: " + srcPort);
+ return;
+ }
+
+ final Inet4Address dst = parseIPv4Address(dstAddr);
+ if (dst == null) {
+ mLog.e("Failed to parse IPv4 address: " + dstAddr);
+ return;
+ }
+
+ if (!IpUtils.isValidUdpOrTcpPort(dstPort)) {
+ mLog.e("Invalid dst port: " + dstPort);
+ return;
+ }
+
+ mNatUpdateCallbacksReceived++;
+ if (DBG) {
+ mLog.log(String.format("NAT timeout update: %s (%s, %s) -> (%s, %s)",
+ protoName, srcAddr, srcPort, dstAddr, dstPort));
+ }
+
+ final int timeoutSec = connectionTimeoutUpdateSecondsFor(proto);
+ final byte[] msg = ConntrackMessage.newIPv4TimeoutUpdateRequest(
+ proto, src, srcPort, dst, dstPort, timeoutSec);
+
+ try {
+ NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_NETFILTER, msg);
+ } catch (ErrnoException e) {
+ mNatUpdateNetlinkErrors++;
+ mLog.e("Error updating NAT conntrack entry: " + e
+ + ", msg: " + NetlinkConstants.hexify(msg));
+ mLog.log("NAT timeout update callbacks received: " + mNatUpdateCallbacksReceived);
+ mLog.log("NAT timeout update netlink errors: " + mNatUpdateNetlinkErrors);
+ }
+ }
+
+ private static Inet4Address parseIPv4Address(String addrString) {
+ try {
+ final InetAddress ip = InetAddress.parseNumericAddress(addrString);
+ // TODO: Consider other sanitization steps here, including perhaps:
+ // not eql to 0.0.0.0
+ // not within 169.254.0.0/16
+ // not within ::ffff:0.0.0.0/96
+ // not within ::/96
+ // et cetera.
+ if (ip instanceof Inet4Address) {
+ return (Inet4Address) ip;
+ }
+ } catch (IllegalArgumentException iae) {}
+ return null;
+ }
+
+ private static String protoNameFor(int proto) {
+ // OsConstants values are not constant expressions; no switch statement.
+ if (proto == OsConstants.IPPROTO_UDP) {
+ return "UDP";
+ } else if (proto == OsConstants.IPPROTO_TCP) {
+ return "TCP";
+ }
+ return null;
+ }
+
+ private static int connectionTimeoutUpdateSecondsFor(int proto) {
+ // TODO: Replace this with more thoughtful work, perhaps reading from
+ // and maybe writing to any required
+ //
+ // /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_*
+ // /proc/sys/net/netfilter/nf_conntrack_udp_timeout{,_stream}
+ //
+ // entries. TBD.
+ if (proto == OsConstants.IPPROTO_TCP) {
+ // Cf. /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
+ return 432000;
+ } else {
+ // Cf. /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream
+ return 180;
+ }
}
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
index 865a989..76195c4 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
@@ -21,10 +21,12 @@
import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback;
import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
+import android.hardware.tetheroffload.control.V1_0.NetworkProtocol;
import android.hardware.tetheroffload.control.V1_0.OffloadCallbackEvent;
import android.os.Handler;
import android.os.RemoteException;
import android.net.util.SharedLog;
+import android.system.OsConstants;
import java.util.ArrayList;
@@ -107,6 +109,10 @@
mLog.e("tethering offload control not supported: " + e);
return false;
}
+ if (mOffloadControl == null) {
+ mLog.e("tethering IOffloadControl.getService() returned null");
+ return false;
+ }
}
final String logmsg = String.format("initOffloadControl(%s)",
@@ -327,13 +333,24 @@
public void updateTimeout(NatTimeoutUpdate params) {
handler.post(() -> {
controlCb.onNatTimeoutUpdate(
- params.proto,
+ networkProtocolToOsConstant(params.proto),
params.src.addr, uint16(params.src.port),
params.dst.addr, uint16(params.dst.port));
});
}
}
+ private static int networkProtocolToOsConstant(int proto) {
+ switch (proto) {
+ case NetworkProtocol.TCP: return OsConstants.IPPROTO_TCP;
+ case NetworkProtocol.UDP: return OsConstants.IPPROTO_UDP;
+ default:
+ // The caller checks this value and will log an error. Just make
+ // sure it won't collide with valid OsContants.IPPROTO_* values.
+ return -Math.abs(proto);
+ }
+ }
+
private static class CbResults {
boolean success;
String errMsg;
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index c6998d6..ac80794 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -228,7 +228,6 @@
private static final String KEY_MAX_WORK_RESCHEDULE_COUNT = "max_work_reschedule_count";
private static final String KEY_MIN_LINEAR_BACKOFF_TIME = "min_linear_backoff_time";
private static final String KEY_MIN_EXP_BACKOFF_TIME = "min_exp_backoff_time";
- private static final String KEY_BG_JOBS_RESTRICTED = "bg_jobs_restricted";
private static final int DEFAULT_MIN_IDLE_COUNT = 1;
private static final int DEFAULT_MIN_CHARGING_COUNT = 1;
@@ -244,7 +243,6 @@
private static final int DEFAULT_BG_MODERATE_JOB_COUNT = 4;
private static final int DEFAULT_BG_LOW_JOB_COUNT = 1;
private static final int DEFAULT_BG_CRITICAL_JOB_COUNT = 1;
- private static final boolean DEFAULT_BG_JOBS_RESTRICTED = false;
private static final int DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT = Integer.MAX_VALUE;
private static final int DEFAULT_MAX_WORK_RESCHEDULE_COUNT = Integer.MAX_VALUE;
private static final long DEFAULT_MIN_LINEAR_BACKOFF_TIME = JobInfo.MIN_BACKOFF_MILLIS;
@@ -338,11 +336,6 @@
*/
long MIN_EXP_BACKOFF_TIME = DEFAULT_MIN_EXP_BACKOFF_TIME;
- /**
- * Runtime switch for throttling background jobs
- */
- boolean BACKGROUND_JOBS_RESTRICTED = DEFAULT_BG_JOBS_RESTRICTED;
-
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -421,12 +414,6 @@
DEFAULT_MIN_LINEAR_BACKOFF_TIME);
MIN_EXP_BACKOFF_TIME = mParser.getLong(KEY_MIN_EXP_BACKOFF_TIME,
DEFAULT_MIN_EXP_BACKOFF_TIME);
- final boolean bgJobsRestricted = mParser.getBoolean(KEY_BG_JOBS_RESTRICTED,
- DEFAULT_BG_JOBS_RESTRICTED);
- if (bgJobsRestricted != BACKGROUND_JOBS_RESTRICTED) {
- mBackgroundJobsController.enableRestrictionsLocked(
- BACKGROUND_JOBS_RESTRICTED = bgJobsRestricted);
- }
}
}
@@ -486,9 +473,6 @@
pw.print(" "); pw.print(KEY_MIN_EXP_BACKOFF_TIME); pw.print("=");
pw.print(MIN_EXP_BACKOFF_TIME); pw.println();
-
- pw.print(" "); pw.print(KEY_BG_JOBS_RESTRICTED); pw.print("=");
- pw.print(BACKGROUND_JOBS_RESTRICTED); pw.println();
}
}
diff --git a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java
index ec50d6d..0539c02 100644
--- a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java
+++ b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java
@@ -48,14 +48,12 @@
private static final Object sCreationLock = new Object();
private static volatile BackgroundJobsController sController;
- /* Runtime switch to keep feature under wraps */
- private boolean mEnableSwitch;
private final JobSchedulerService mJobSchedulerService;
private final IAppOpsService mAppOpsService;
private final IDeviceIdleController mDeviceIdleController;
private final SparseBooleanArray mForegroundUids;
- private int[] mPowerWhitelistedAppIds;
+ private int[] mPowerWhitelistedUserAppIds;
private int[] mTempWhitelistedAppIds;
/**
* Only tracks jobs for which source package app op RUN_ANY_IN_BACKGROUND is not ALLOWED.
@@ -81,7 +79,8 @@
try {
switch (intent.getAction()) {
case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:
- mPowerWhitelistedAppIds = mDeviceIdleController.getAppIdWhitelist();
+ mPowerWhitelistedUserAppIds =
+ mDeviceIdleController.getAppIdUserWhitelist();
break;
case PowerManager.ACTION_POWER_SAVE_TEMP_WHITELIST_CHANGED:
mTempWhitelistedAppIds = mDeviceIdleController.getAppIdTempWhitelist();
@@ -110,7 +109,7 @@
try {
mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, null,
new AppOpsWatcher());
- mPowerWhitelistedAppIds = mDeviceIdleController.getAppIdWhitelist();
+ mPowerWhitelistedUserAppIds = mDeviceIdleController.getAppIdUserWhitelist();
mTempWhitelistedAppIds = mDeviceIdleController.getAppIdTempWhitelist();
} catch (RemoteException rexc) {
// Shouldn't happen as they are in the same process.
@@ -121,8 +120,6 @@
powerWhitelistFilter.addAction(PowerManager.ACTION_POWER_SAVE_TEMP_WHITELIST_CHANGED);
context.registerReceiverAsUser(mDozeWhitelistReceiver, UserHandle.ALL, powerWhitelistFilter,
null, null);
-
- mEnableSwitch = false;
}
@Override
@@ -170,7 +167,6 @@
@Override
public void dumpControllerStateLocked(final PrintWriter pw, final int filterUid) {
- pw.println("Background restrictions: global switch = " + mEnableSwitch);
pw.print("Foreground uids: [");
for (int i = 0; i < mForegroundUids.size(); i++) {
if (mForegroundUids.valueAt(i)) pw.print(mForegroundUids.keyAt(i) + " ");
@@ -206,14 +202,6 @@
});
}
- public void enableRestrictionsLocked(boolean enable) {
- mEnableSwitch = enable;
- Slog.d(LOG_TAG, "Background jobs restrictions switch changed to " + mEnableSwitch);
- if (checkAllTrackedJobsLocked()) {
- mStateChangedListener.onControllerStateChanged();
- }
- }
-
void startTrackingJobLocked(JobStatus jobStatus) {
final int uid = jobStatus.getSourceUid();
ArraySet<JobStatus> jobsForUid = mTrackedJobs.get(uid);
@@ -255,11 +243,11 @@
boolean isWhitelistedLocked(int uid) {
return ArrayUtils.contains(mTempWhitelistedAppIds, UserHandle.getAppId(uid))
- || ArrayUtils.contains(mPowerWhitelistedAppIds, UserHandle.getAppId(uid));
+ || ArrayUtils.contains(mPowerWhitelistedUserAppIds, UserHandle.getAppId(uid));
}
boolean canRunJobLocked(int uid) {
- return !mEnableSwitch || mForegroundUids.get(uid) || isWhitelistedLocked(uid);
+ return mForegroundUids.get(uid) || isWhitelistedLocked(uid);
}
private final class AppOpsWatcher extends IAppOpsCallback.Stub {
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index a1b8456..11043bd 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -154,7 +154,8 @@
private final Injector mInjector;
private final Context mContext;
- private final Handler mHandler;
+ @VisibleForTesting
+ protected final Handler mHandler;
@VisibleForTesting
protected final LockSettingsStorage mStorage;
private final LockSettingsStrongAuth mStrongAuth;
@@ -1141,12 +1142,13 @@
continue;
}
try {
- result.put(userId, getDecryptedPasswordForTiedProfile(userId));
+ result.put(managedUserId, getDecryptedPasswordForTiedProfile(managedUserId));
} catch (KeyStoreException | UnrecoverableKeyException | NoSuchAlgorithmException
| NoSuchPaddingException | InvalidKeyException
| InvalidAlgorithmParameterException | IllegalBlockSizeException
| BadPaddingException | CertificateException | IOException e) {
- // ignore
+ Slog.e(TAG, "getDecryptedPasswordsForAllTiedProfiles failed for user " +
+ managedUserId, e);
}
}
return result;
@@ -1736,6 +1738,10 @@
return response;
}
+ /**
+ * Call this method to notify DPMS regarding the latest password metric. This should be called
+ * when the user is authenticating or when a new password is being set.
+ */
private void notifyActivePasswordMetricsAvailable(String password, @UserIdInt int userId) {
final PasswordMetrics metrics;
if (password == null) {
@@ -2197,6 +2203,8 @@
}
setLong(SYNTHETIC_PASSWORD_HANDLE_KEY, newHandle, userId);
synchronizeUnifiedWorkChallengeForProfiles(userId, profilePasswords);
+
+ notifyActivePasswordMetricsAvailable(credential, userId);
return newHandle;
}
@@ -2246,13 +2254,13 @@
userId);
synchronizeUnifiedWorkChallengeForProfiles(userId, null);
mSpManager.destroyPasswordBasedSyntheticPassword(handle, userId);
+
+ notifyActivePasswordMetricsAvailable(credential, userId);
} else /* response == null || responseCode == VerifyCredentialResponse.RESPONSE_RETRY */ {
Slog.w(TAG, "spBasedSetLockCredentialInternalLocked: " +
(response != null ? "rate limit exceeded" : "failed"));
return;
}
- notifyActivePasswordMetricsAvailable(credential, userId);
-
}
@Override
@@ -2358,6 +2366,10 @@
Slog.w(TAG, "Invalid escrow token supplied");
return false;
}
+ // Update PASSWORD_TYPE_KEY since it's needed by notifyActivePasswordMetricsAvailable()
+ // called by setLockCredentialWithAuthTokenLocked().
+ // TODO: refactor usage of PASSWORD_TYPE_KEY b/65239740
+ setLong(LockPatternUtils.PASSWORD_TYPE_KEY, requestedQuality, userId);
long oldHandle = getSyntheticPasswordHandleLocked(userId);
setLockCredentialWithAuthTokenLocked(credential, type, result.authToken,
requestedQuality, userId);
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
index b4c10ec..70d6072 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
@@ -713,12 +713,15 @@
private static final String DATABASE_NAME = "locksettings.db";
private static final int DATABASE_VERSION = 2;
+ private static final int IDLE_CONNECTION_TIMEOUT_MS = 30000;
private Callback mCallback;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
setWriteAheadLoggingEnabled(true);
+ // Memory optimization - close idle connections after 30s of inactivity
+ setIdleConnectionTimeout(IDLE_CONNECTION_TIMEOUT_MS);
}
public void setCallback(Callback callback) {
diff --git a/services/core/java/com/android/server/media/AudioPlaybackMonitor.java b/services/core/java/com/android/server/media/AudioPlaybackMonitor.java
index f6f7676..791ee82 100644
--- a/services/core/java/com/android/server/media/AudioPlaybackMonitor.java
+++ b/services/core/java/com/android/server/media/AudioPlaybackMonitor.java
@@ -100,7 +100,11 @@
* @param configs List of the current audio playback configuration
*/
@Override
- public void dispatchPlaybackConfigChange(List<AudioPlaybackConfiguration> configs) {
+ public void dispatchPlaybackConfigChange(List<AudioPlaybackConfiguration> configs,
+ boolean flush) {
+ if (flush) {
+ Binder.flushPendingCommands();
+ }
final long token = Binder.clearCallingIdentity();
try {
List<Integer> newActiveAudioPlaybackClientUids = new ArrayList<>();
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 6dfb469..90dab2c 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -113,16 +113,20 @@
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
import android.net.NetworkIdentity;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkQuotaInfo;
+import android.net.NetworkRequest;
import android.net.NetworkState;
import android.net.NetworkTemplate;
import android.net.TrafficStats;
@@ -446,6 +450,10 @@
@GuardedBy("mUidRulesFirstLock")
final SparseIntArray mUidState = new SparseIntArray();
+ /** Map from network ID to last observed meteredness state */
+ @GuardedBy("mNetworkPoliciesSecondLock")
+ private final SparseBooleanArray mNetworkMetered = new SparseBooleanArray();
+
private final RemoteCallbackList<INetworkPolicyListener>
mListeners = new RemoteCallbackList<>();
@@ -748,6 +756,10 @@
ACTION_CARRIER_CONFIG_CHANGED);
mContext.registerReceiver(mCarrierConfigReceiver, carrierConfigFilter, null, mHandler);
+ // listen for meteredness changes
+ mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
+ new NetworkRequest.Builder().build(), mNetworkCallback);
+
mUsageStats.addAppIdleStateChangeListener(new AppIdleStateChangeListener());
// tell systemReady() that the service has been initialized
initCompleteSignal.countDown();
@@ -936,6 +948,26 @@
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
upgradeWifiMeteredOverrideAL();
+ }
+ }
+ // Only need to perform upgrade logic once
+ mContext.unregisterReceiver(this);
+ }
+ };
+
+ private final NetworkCallback mNetworkCallback = new NetworkCallback() {
+ @Override
+ public void onCapabilitiesChanged(Network network,
+ NetworkCapabilities networkCapabilities) {
+ if (network == null || networkCapabilities == null) return;
+
+ synchronized (mNetworkPoliciesSecondLock) {
+ final boolean oldMetered = mNetworkMetered.get(network.netId, false);
+ final boolean newMetered = !networkCapabilities
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
+
+ if ((oldMetered != newMetered) || mNetworkMetered.indexOfKey(network.netId) < 0) {
+ mNetworkMetered.put(network.netId, newMetered);
updateNetworkRulesNL();
}
}
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 34f1bfa..add4184 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -99,6 +99,7 @@
protected final Object mMutex;
private final UserProfiles mUserProfiles;
private final IPackageManager mPm;
+ private final UserManager mUm;
private final Config mConfig;
// contains connections to all connected services, including app services
@@ -138,6 +139,7 @@
mPm = pm;
mConfig = getConfig();
mApprovalLevel = APPROVAL_BY_COMPONENT;
+ mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
}
abstract protected Config getConfig();
@@ -296,7 +298,9 @@
final int userId = XmlUtils.readIntAttribute(parser, ATT_USER_ID, 0);
final boolean isPrimary =
XmlUtils.readBooleanAttribute(parser, ATT_IS_PRIMARY, true);
- addApprovedList(approved, userId, isPrimary);
+ if (mUm.getUserInfo(userId) != null) {
+ addApprovedList(approved, userId, isPrimary);
+ }
mUseXml = true;
}
}
@@ -494,7 +498,7 @@
return info;
}
throw new SecurityException("Disallowed call from unknown " + getCaption() + ": "
- + service);
+ + service + " " + service.getClass());
}
public void unregisterService(IInterface service, int userid) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 0c9f65a..fe39fcc 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -755,9 +755,12 @@
if (r != null) {
r.stats.onExpansionChanged(userAction, expanded);
final long now = System.currentTimeMillis();
- MetricsLogger.action(r.getLogMaker(now)
- .setCategory(MetricsEvent.NOTIFICATION_ITEM)
- .setType(MetricsEvent.TYPE_DETAIL));
+ if (userAction) {
+ MetricsLogger.action(r.getLogMaker(now)
+ .setCategory(MetricsEvent.NOTIFICATION_ITEM)
+ .setType(expanded ? MetricsEvent.TYPE_DETAIL
+ : MetricsEvent.TYPE_COLLAPSE));
+ }
EventLogTags.writeNotificationExpansion(key,
userAction ? 1 : 0, expanded ? 1 : 0,
r.getLifespanMs(now), r.getFreshnessMs(now), r.getExposureMs(now));
@@ -1460,8 +1463,18 @@
if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
// cancel
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channel.getId(), 0, 0, true,
- UserHandle.getUserId(Binder.getCallingUid()), REASON_CHANNEL_BANNED,
+ UserHandle.getUserId(uid), REASON_CHANNEL_BANNED,
null);
+ if (isUidSystemOrPhone(uid)) {
+ int[] profileIds = mUserProfiles.getCurrentProfileIds();
+ int N = profileIds.length;
+ for (int i = 0; i < N; i++) {
+ int profileId = profileIds[i];
+ cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channel.getId(), 0, 0, true,
+ profileId, REASON_CHANNEL_BANNED,
+ null);
+ }
+ }
}
mRankingHelper.updateNotificationChannel(pkg, uid, channel);
@@ -2760,17 +2773,22 @@
public void setNotificationPolicyAccessGranted(String pkg, boolean granted)
throws RemoteException {
checkCallerIsSystemOrShell();
- if (!mActivityManager.isLowRamDevice()) {
- mConditionProviders.setPackageOrComponentEnabled(
- pkg, getCallingUserHandle().getIdentifier(), true, granted);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(
+ pkg, getCallingUserHandle().getIdentifier(), true, granted);
- getContext().sendBroadcastAsUser(new Intent(
- NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- .setPackage(pkg)
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
- getCallingUserHandle(), null);
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(pkg)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
- savePolicyFile();
+ savePolicyFile();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
@@ -2852,19 +2870,25 @@
boolean granted) throws RemoteException {
Preconditions.checkNotNull(listener);
checkCallerIsSystemOrShell();
- if (!mActivityManager.isLowRamDevice()) {
- mConditionProviders.setPackageOrComponentEnabled(listener.flattenToString(),
- userId, false, granted);
- mListeners.setPackageOrComponentEnabled(listener.flattenToString(),
- userId, true, granted);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(listener.flattenToString(),
+ userId, false, granted);
+ mListeners.setPackageOrComponentEnabled(listener.flattenToString(),
+ userId, true, granted);
- getContext().sendBroadcastAsUser(new Intent(
- NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- .setPackage(listener.getPackageName())
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
- getCallingUserHandle(), null);
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- savePolicyFile();
+ .setPackage(listener.getPackageName())
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
+
+ savePolicyFile();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
@@ -2873,19 +2897,24 @@
int userId, boolean granted) throws RemoteException {
Preconditions.checkNotNull(assistant);
checkCallerIsSystemOrShell();
- if (!mActivityManager.isLowRamDevice()) {
- mConditionProviders.setPackageOrComponentEnabled(assistant.flattenToString(),
- userId, false, granted);
- mAssistants.setPackageOrComponentEnabled(assistant.flattenToString(),
- userId, true, granted);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(assistant.flattenToString(),
+ userId, false, granted);
+ mAssistants.setPackageOrComponentEnabled(assistant.flattenToString(),
+ userId, true, granted);
- getContext().sendBroadcastAsUser(new Intent(
- NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- .setPackage(assistant.getPackageName())
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
- getCallingUserHandle(), null);
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(assistant.getPackageName())
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
- savePolicyFile();
+ savePolicyFile();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index c8f4d31..e40dad6 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -1059,6 +1059,9 @@
private static final int EVENT_TYPE_CLICK = 2;
private static final int EVENT_TYPE_REMOVE = 3;
private static final int EVENT_TYPE_DISMISS = 4;
+
+ private static final int IDLE_CONNECTION_TIMEOUT_MS = 30000;
+
private static long sLastPruneMs;
private static long sNumWrites;
@@ -1141,6 +1144,12 @@
}
@Override
+ public void onConfigure(SQLiteDatabase db) {
+ // Memory optimization - close idle connections after 30s of inactivity
+ setIdleConnectionTimeout(IDLE_CONNECTION_TIMEOUT_MS);
+ }
+
+ @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion != newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TAB_LOG);
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 1736a74..fc24581 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -1220,7 +1220,7 @@
changed |= oldValue != newValue;
}
if (changed) {
- mRankingHandler.requestSort();
+ updateConfig();
}
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 1a0b878..ffdafc5 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -465,6 +465,8 @@
+ "from " + currRule.getName() + " to " + defaultRule.name);
// update default rule (if locale changed, name of rule will change)
AutomaticZenRule defaultAutoRule = createAutomaticZenRule(defaultRule);
+ // ensure enabled state is carried over from current rule
+ defaultAutoRule.setEnabled(currRule.isEnabled());
updateAutomaticZenRule(ruleId, defaultAutoRule,
"locale changed");
}
@@ -735,6 +737,9 @@
mConfig = config;
mHandler.postApplyConfig(config, reason, setRingerMode);
return true;
+ } catch (SecurityException e) {
+ Log.wtf(TAG, "Invalid rule in config", e);
+ return false;
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/services/core/java/com/android/server/oemlock/OemLockService.java b/services/core/java/com/android/server/oemlock/OemLockService.java
index 5e19b13..40c6639 100644
--- a/services/core/java/com/android/server/oemlock/OemLockService.java
+++ b/services/core/java/com/android/server/oemlock/OemLockService.java
@@ -149,8 +149,12 @@
final long token = Binder.clearCallingIdentity();
try {
- if (!canUserAllowOemUnlock()) {
- throw new SecurityException("User cannot allow OEM unlock");
+ if (!isOemUnlockAllowedByAdmin()) {
+ throw new SecurityException("Admin does not allow OEM unlock");
+ }
+
+ if (!mOemLock.isOemUnlockAllowedByCarrier()) {
+ throw new SecurityException("Carrier does not allow OEM unlock");
}
mOemLock.setOemUnlockAllowedByDevice(allowedByUser);
@@ -172,18 +176,6 @@
}
@Override
- public boolean canUserAllowOemUnlock() {
- enforceOemUnlockReadPermission();
-
- final long token = Binder.clearCallingIdentity();
- try {
- return isOemUnlockAllowedByAdmin() && mOemLock.isOemUnlockAllowedByCarrier();
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
public boolean isOemUnlockAllowed() {
enforceOemUnlockReadPermission();
diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
index c3957f43..db6e974 100644
--- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
+++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
@@ -169,9 +169,8 @@
}
final PackageInfo targetPackage = mPackageManager.getPackageInfo(packageName, userId);
- if (updateAllOverlaysForTarget(packageName, userId, targetPackage)) {
- mListener.onOverlaysChanged(packageName, userId);
- }
+ updateAllOverlaysForTarget(packageName, userId, targetPackage);
+ mListener.onOverlaysChanged(packageName, userId);
}
void onTargetPackageChanged(@NonNull final String packageName, final int userId) {
@@ -211,9 +210,7 @@
Slog.d(TAG, "onTargetPackageRemoved packageName=" + packageName + " userId=" + userId);
}
- if (updateAllOverlaysForTarget(packageName, userId, null)) {
- mListener.onOverlaysChanged(packageName, userId);
- }
+ updateAllOverlaysForTarget(packageName, userId, null);
}
/**
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index 1082eae..a3811ba 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -18,6 +18,7 @@
import android.Manifest;
import android.annotation.NonNull;
+import android.app.ActivityManager;
import android.app.DownloadManager;
import android.app.admin.DevicePolicyManager;
import android.companion.CompanionDeviceManager;
@@ -582,6 +583,21 @@
}
}
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ // Allow voice search on low-ram devices
+ Intent globalSearchIntent = new Intent("android.search.action.GLOBAL_SEARCH");
+ PackageParser.Package globalSearchPickerPackage =
+ getDefaultSystemHandlerActivityPackageLPr(globalSearchIntent, userId);
+
+ if (globalSearchPickerPackage != null
+ && doesPackageSupportRuntimePermissions(globalSearchPickerPackage)) {
+ grantRuntimePermissionsLPw(globalSearchPickerPackage,
+ MICROPHONE_PERMISSIONS, true, userId);
+ grantRuntimePermissionsLPw(globalSearchPickerPackage,
+ LOCATION_PERMISSIONS, true, userId);
+ }
+ }
+
// Voice recognition
Intent voiceRecoIntent = new Intent("android.speech.RecognitionService");
voiceRecoIntent.addCategory(Intent.CATEGORY_DEFAULT);
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index da6e26e..6253857 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -53,7 +53,8 @@
private final static boolean DEBUG_DEXOPT = true;
// The synthetic library dependencies denoting "no checks."
- private final static String[] NO_LIBRARIES = new String[] { "&" };
+ private final static String[] NO_LIBRARIES =
+ new String[] { PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK };
// The amount of "available" (free - low threshold) space necessary at the start of an OTA to
// not bulk-delete unused apps' odex files.
@@ -322,11 +323,6 @@
new DexoptOptions(pkg.packageName, compilationReason,
DexoptOptions.DEXOPT_BOOT_COMPLETE));
- mPackageManagerService.getDexManager().dexoptSecondaryDex(
- new DexoptOptions(pkg.packageName, compilationReason,
- DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX |
- DexoptOptions.DEXOPT_BOOT_COMPLETE));
-
return commands;
}
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 698d387..0f580d8 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -147,8 +147,13 @@
// Get the class loader context dependencies.
// For each code path in the package, this array contains the class loader context that
// needs to be passed to dexopt in order to ensure correct optimizations.
+ boolean[] pathsWithCode = new boolean[paths.size()];
+ pathsWithCode[0] = (pkg.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) != 0;
+ for (int i = 1; i < paths.size(); i++) {
+ pathsWithCode[i] = (pkg.splitFlags[i - 1] & ApplicationInfo.FLAG_HAS_CODE) != 0;
+ }
String[] classLoaderContexts = DexoptUtils.getClassLoaderContexts(
- pkg.applicationInfo, sharedLibraries);
+ pkg.applicationInfo, sharedLibraries, pathsWithCode);
// Sanity check that we do not call dexopt with inconsistent data.
if (paths.size() != classLoaderContexts.length) {
@@ -164,10 +169,15 @@
int result = DEX_OPT_SKIPPED;
for (int i = 0; i < paths.size(); i++) {
// Skip paths that have no code.
- if ((i == 0 && (pkg.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) == 0) ||
- (i != 0 && (pkg.splitFlags[i - 1] & ApplicationInfo.FLAG_HAS_CODE) == 0)) {
+ if (!pathsWithCode[i]) {
continue;
}
+ if (classLoaderContexts[i] == null) {
+ throw new IllegalStateException("Inconsistent information in the "
+ + "package structure. A split is marked to contain code "
+ + "but has no dependency listed. Index=" + i + " path=" + paths.get(i));
+ }
+
// Append shared libraries with split dependencies for this split.
String path = paths.get(i);
if (options.getSplitName() != null) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index c3b93b4..1fa37b9 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -319,9 +319,15 @@
if (type == START_TAG) {
final String tag = in.getName();
if (PackageInstallerSession.TAG_SESSION.equals(tag)) {
- final PackageInstallerSession session = PackageInstallerSession.
- readFromXml(in, mInternalCallback, mContext, mPm,
- mInstallThread.getLooper(), mSessionsDir);
+ final PackageInstallerSession session;
+ try {
+ session = PackageInstallerSession.readFromXml(in, mInternalCallback,
+ mContext, mPm, mInstallThread.getLooper(), mSessionsDir);
+ } catch (Exception e) {
+ Slog.e(TAG, "Could not read session", e);
+ continue;
+ }
+
final long age = System.currentTimeMillis() - session.createdMillis;
final boolean valid;
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 69db49b..ff6e5b3 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -88,6 +88,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.NativeLibraryHelper;
import com.android.internal.content.PackageHelper;
+import com.android.internal.os.SomeArgs;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -118,6 +119,7 @@
private static final String REMOVE_SPLIT_MARKER_EXTENSION = ".removed";
private static final int MSG_COMMIT = 0;
+ private static final int MSG_ON_PACKAGE_INSTALLED = 1;
/** XML constants used for persisting a session */
static final String TAG_SESSION = "session";
@@ -274,15 +276,36 @@
private final Handler.Callback mHandlerCallback = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
- synchronized (mLock) {
- try {
- commitLocked();
- } catch (PackageManagerException e) {
- final String completeMsg = ExceptionUtils.getCompleteMessage(e);
- Slog.e(TAG, "Commit of session " + sessionId + " failed: " + completeMsg);
- destroyInternal();
- dispatchSessionFinished(e.error, completeMsg, null);
- }
+ switch (msg.what) {
+ case MSG_COMMIT:
+ synchronized (mLock) {
+ try {
+ commitLocked();
+ } catch (PackageManagerException e) {
+ final String completeMsg = ExceptionUtils.getCompleteMessage(e);
+ Slog.e(TAG,
+ "Commit of session " + sessionId + " failed: " + completeMsg);
+ destroyInternal();
+ dispatchSessionFinished(e.error, completeMsg, null);
+ }
+ }
+
+ break;
+ case MSG_ON_PACKAGE_INSTALLED:
+ final SomeArgs args = (SomeArgs) msg.obj;
+ final String packageName = (String) args.arg1;
+ final String message = (String) args.arg2;
+ final Bundle extras = (Bundle) args.arg3;
+ final IPackageInstallObserver2 observer = (IPackageInstallObserver2) args.arg4;
+ final int returnCode = args.argi1;
+ args.recycle();
+
+ try {
+ observer.onPackageInstalled(packageName, returnCode, message, extras);
+ } catch (RemoteException ignored) {
+ }
+
+ break;
}
return true;
@@ -357,7 +380,17 @@
}
mPrepared = prepared;
- mSealed = sealed;
+
+ if (sealed) {
+ synchronized (mLock) {
+ try {
+ sealAndValidateLocked();
+ } catch (PackageManagerException | IOException e) {
+ destroyInternal();
+ throw new IllegalArgumentException(e);
+ }
+ }
+ }
final long identity = Binder.clearCallingIdentity();
try {
@@ -673,11 +706,6 @@
public void commit(@NonNull IntentSender statusReceiver, boolean forTransfer) {
Preconditions.checkNotNull(statusReceiver);
- // Cache package manager data without the lock held
- final PackageInfo installedPkgInfo = mPm.getPackageInfo(
- params.appPackageName, PackageManager.GET_SIGNATURES
- | PackageManager.MATCH_STATIC_SHARED_LIBRARIES /*flags*/, userId);
-
final boolean wasSealed;
synchronized (mLock) {
assertCallerIsOwnerOrRootLocked();
@@ -702,7 +730,9 @@
wasSealed = mSealed;
if (!mSealed) {
try {
- sealAndValidateLocked(installedPkgInfo);
+ sealAndValidateLocked();
+ } catch (IOException e) {
+ throw new IllegalArgumentException(e);
} catch (PackageManagerException e) {
// Do now throw an exception here to stay compatible with O and older
destroyInternal();
@@ -736,18 +766,33 @@
*
* <p>The session will be sealed after calling this method even if it failed.
*
- * @param pkgInfo The package info for {@link #params}.packagename
+ * @throws PackageManagerException if the session was sealed but something went wrong. If the
+ * session was sealed this is the only possible exception.
*/
- private void sealAndValidateLocked(@Nullable PackageInfo pkgInfo)
- throws PackageManagerException {
+ private void sealAndValidateLocked() throws PackageManagerException, IOException {
assertNoWriteFileTransfersOpenLocked();
+ assertPreparedAndNotDestroyedLocked("sealing of session");
+
+ final PackageInfo pkgInfo = mPm.getPackageInfo(
+ params.appPackageName, PackageManager.GET_SIGNATURES
+ | PackageManager.MATCH_STATIC_SHARED_LIBRARIES /*flags*/, userId);
+
+ resolveStageDirLocked();
mSealed = true;
// Verify that stage looks sane with respect to existing application.
// This currently only ensures packageName, versionCode, and certificate
// consistency.
- validateInstallLocked(pkgInfo);
+ try {
+ validateInstallLocked(pkgInfo);
+ } catch (PackageManagerException e) {
+ throw e;
+ } catch (Throwable e) {
+ // Convert all exceptions into package manager exceptions as only those are handled
+ // in the code above
+ throw new PackageManagerException(e);
+ }
// Read transfers from the original owner stay open, but as the session's data
// cannot be modified anymore, there is no leak of information.
@@ -768,11 +813,6 @@
+ "the " + Manifest.permission.INSTALL_PACKAGES + " permission");
}
- // Cache package manager data without the lock held
- final PackageInfo installedPkgInfo = mPm.getPackageInfo(
- params.appPackageName, PackageManager.GET_SIGNATURES
- | PackageManager.MATCH_STATIC_SHARED_LIBRARIES /*flags*/, userId);
-
// Only install flags that can be verified by the app the session is transferred to are
// allowed. The parameters can be read via PackageInstaller.SessionInfo.
if (!params.areHiddenOptionsSet()) {
@@ -784,8 +824,14 @@
assertPreparedAndNotSealedLocked("transfer");
try {
- sealAndValidateLocked(installedPkgInfo);
+ sealAndValidateLocked();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
} catch (PackageManagerException e) {
+ // Session is sealed but could not be verified, we need to destroy it
+ destroyInternal();
+ dispatchSessionFinished(e.error, ExceptionUtils.getCompleteMessage(e), null);
+
throw new IllegalArgumentException("Package is not valid", e);
}
@@ -813,13 +859,6 @@
throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, "Session not sealed");
}
- try {
- resolveStageDirLocked();
- } catch (IOException e) {
- throw new PackageManagerException(INSTALL_FAILED_CONTAINER_ERROR,
- "Failed to resolve stage location", e);
- }
-
Preconditions.checkNotNull(mPackageName);
Preconditions.checkNotNull(mSignatures);
Preconditions.checkNotNull(mResolvedBaseFile);
@@ -940,6 +979,13 @@
mResolvedStagedFiles.clear();
mResolvedInheritedFiles.clear();
+ try {
+ resolveStageDirLocked();
+ } catch (IOException e) {
+ throw new PackageManagerException(INSTALL_FAILED_CONTAINER_ERROR,
+ "Failed to resolve stage location", e);
+ }
+
final File[] removedFiles = mResolvedStageDir.listFiles(sRemovedFilter);
final List<String> removeSplitList = new ArrayList<>();
if (!ArrayUtils.isEmpty(removedFiles)) {
@@ -1445,10 +1491,17 @@
}
if (observer != null) {
- try {
- observer.onPackageInstalled(packageName, returnCode, msg, extras);
- } catch (RemoteException ignored) {
- }
+ // Execute observer.onPackageInstalled on different tread as we don't want callers
+ // inside the system server have to worry about catching the callbacks while they are
+ // calling into the session
+ final SomeArgs args = SomeArgs.obtain();
+ args.arg1 = packageName;
+ args.arg2 = msg;
+ args.arg3 = extras;
+ args.arg4 = observer;
+ args.argi1 = returnCode;
+
+ mHandler.obtainMessage(MSG_ON_PACKAGE_INSTALLED, args).sendToTarget();
}
final boolean success = (returnCode == PackageManager.INSTALL_SUCCEEDED);
@@ -1545,6 +1598,10 @@
*/
void write(@NonNull XmlSerializer out, @NonNull File sessionsDir) throws IOException {
synchronized (mLock) {
+ if (mDestroyed) {
+ return;
+ }
+
out.startTag(null, TAG_SESSION);
writeIntAttribute(out, ATTR_SESSION_ID, sessionId);
diff --git a/services/core/java/com/android/server/pm/PackageManagerException.java b/services/core/java/com/android/server/pm/PackageManagerException.java
index 0e3f173..0793b09 100644
--- a/services/core/java/com/android/server/pm/PackageManagerException.java
+++ b/services/core/java/com/android/server/pm/PackageManagerException.java
@@ -40,6 +40,11 @@
this.error = error;
}
+ public PackageManagerException(Throwable e) {
+ super(e);
+ this.error = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ }
+
public static PackageManagerException from(PackageParserException e)
throws PackageManagerException {
throw new PackageManagerException(e.error, e.getMessage(), e.getCause());
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 79732c2..ff52e0e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -82,6 +82,7 @@
import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.content.pm.PackageParser.PARSE_IS_OEM;
import static android.content.pm.PackageParser.PARSE_IS_PRIVILEGED;
import static android.content.pm.PackageParser.isApkFile;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
@@ -2650,7 +2651,8 @@
final File oemAppDir = new File(Environment.getOemDirectory(), "app");
scanDirTracedLI(oemAppDir, mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM
- | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
+ | PackageParser.PARSE_IS_SYSTEM_DIR
+ | PackageParser.PARSE_IS_OEM, scanFlags, 0);
// Prune any system packages that no longer exist.
final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<>();
@@ -2711,8 +2713,14 @@
// Actual deletion of code and data will be handled by later
// reconciliation step
} else {
- final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(ps.name);
- if (disabledPs.codePath == null || !disabledPs.codePath.exists()) {
+ // we still have a disabled system package, but, it still might have
+ // been removed. check the code path still exists and check there's
+ // still a package. the latter can happen if an OTA keeps the same
+ // code path, but, changes the package name.
+ final PackageSetting disabledPs =
+ mSettings.getDisabledSystemPkgLPr(ps.name);
+ if (disabledPs.codePath == null || !disabledPs.codePath.exists()
+ || disabledPs.pkg == null) {
possiblyDeletedUpdatedSystemApps.add(ps.name);
}
}
@@ -2814,7 +2822,8 @@
| PackageParser.PARSE_IS_SYSTEM_DIR;
} else if (FileUtils.contains(oemAppDir, scanFile)) {
reparseFlags = PackageParser.PARSE_IS_SYSTEM
- | PackageParser.PARSE_IS_SYSTEM_DIR;
+ | PackageParser.PARSE_IS_SYSTEM_DIR
+ | PackageParser.PARSE_IS_OEM;
} else {
Slog.e(TAG, "Ignoring unexpected fallback path " + scanFile);
continue;
@@ -8512,7 +8521,7 @@
continue;
}
if (filterAppAccessLPr(ps, callingUid, userId)) {
- return null;
+ continue;
}
final PackageInfo pi = generatePackageInfo(ps, flags, userId);
if (pi != null) {
@@ -8527,7 +8536,7 @@
continue;
}
if (filterAppAccessLPr(ps, callingUid, userId)) {
- return null;
+ continue;
}
final PackageInfo pi = generatePackageInfo((PackageSetting)
p.mExtras, flags, userId);
@@ -8639,7 +8648,7 @@
continue;
}
if (filterAppAccessLPr(ps, callingUid, userId)) {
- return null;
+ continue;
}
ai = PackageParser.generateApplicationInfo(ps.pkg, effectiveFlags,
ps.readUserState(userId), userId);
@@ -8665,7 +8674,7 @@
continue;
}
if (filterAppAccessLPr(ps, callingUid, userId)) {
- return null;
+ continue;
}
ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags,
ps.readUserState(userId), userId);
@@ -9339,6 +9348,13 @@
} else {
updatedPkg.pkgPrivateFlags &= ~ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
}
+ // If new package is not located in "/oem" (e.g. due to an OTA),
+ // it needs to drop FLAG_OEM.
+ if (locationIsOem(scanFile)) {
+ updatedPkg.pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_OEM;
+ } else {
+ updatedPkg.pkgPrivateFlags &= ~ApplicationInfo.PRIVATE_FLAG_OEM;
+ }
if (ps != null && !ps.codePath.equals(scanFile)) {
// The path has changed from what was last scanned... check the
@@ -9457,6 +9473,12 @@
if ((updatedPkg.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) {
policyFlags |= PackageParser.PARSE_IS_PRIVILEGED;
}
+
+ // An updated OEM app will not have the PARSE_IS_OEM
+ // flag set initially
+ if ((updatedPkg.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0) {
+ policyFlags |= PackageParser.PARSE_IS_OEM;
+ }
}
// Verify certificates against what was last scanned
@@ -11177,6 +11199,10 @@
pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
}
+ if ((policyFlags&PackageParser.PARSE_IS_OEM) != 0) {
+ pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_OEM;
+ }
+
if (!isSystemApp(pkg)) {
// Only system apps can use these features.
pkg.mOriginalPackages = null;
@@ -11398,6 +11424,10 @@
+ " but expected at " + known.codePathString
+ "; ignoring.");
}
+ } else {
+ throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION,
+ "Application package " + pkg.packageName
+ + " not found; ignoring.");
}
}
}
@@ -13244,6 +13274,8 @@
private boolean grantSignaturePermission(String perm, PackageParser.Package pkg,
BasePermission bp, PermissionsState origPermissions) {
+ boolean oemPermission = (bp.protectionLevel
+ & PermissionInfo.PROTECTION_FLAG_OEM) != 0;
boolean privilegedPermission = (bp.protectionLevel
& PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0;
boolean privappPermissionsDisable =
@@ -13281,9 +13313,9 @@
== PackageManager.SIGNATURE_MATCH)
|| (compareSignatures(mPlatformPackage.mSignatures, pkg.mSignatures)
== PackageManager.SIGNATURE_MATCH);
- if (!allowed && privilegedPermission) {
+ if (!allowed && (privilegedPermission || oemPermission)) {
if (isSystemApp(pkg)) {
- // For updated system applications, a system permission
+ // For updated system applications, a privileged/oem permission
// is granted only if it had been defined by the original application.
if (pkg.isUpdatedSystemApp()) {
final PackageSetting sysPs = mSettings
@@ -13292,7 +13324,9 @@
// If the original was granted this permission, we take
// that grant decision as read and propagate it to the
// update.
- if (sysPs.isPrivileged()) {
+ if ((privilegedPermission && sysPs.isPrivileged())
+ || (oemPermission && sysPs.isOem()
+ && canGrantOemPermission(sysPs, perm))) {
allowed = true;
}
} else {
@@ -13302,32 +13336,39 @@
// before. In this case we do want to allow the app to
// now get the new permission if the ancestral apk is
// privileged to get it.
- if (sysPs != null && sysPs.pkg != null && sysPs.isPrivileged()) {
- // TODO(gboyer): This is the same as isPackageRequestingPermission().
- for (int j = 0; j < sysPs.pkg.requestedPermissions.size(); j++) {
- if (perm.equals(sysPs.pkg.requestedPermissions.get(j))) {
- allowed = true;
- break;
- }
- }
+ if (sysPs != null && sysPs.pkg != null
+ && isPackageRequestingPermission(sysPs.pkg, perm)
+ && ((privilegedPermission && sysPs.isPrivileged())
+ || (oemPermission && sysPs.isOem()
+ && canGrantOemPermission(sysPs, perm)))) {
+ allowed = true;
}
// Also if a privileged parent package on the system image or any of
- // its children requested a privileged permission, the updated child
+ // its children requested a privileged/oem permission, the updated child
// packages can also get the permission.
if (pkg.parentPackage != null) {
final PackageSetting disabledSysParentPs = mSettings
.getDisabledSystemPkgLPr(pkg.parentPackage.packageName);
- if (disabledSysParentPs != null && disabledSysParentPs.pkg != null
- && disabledSysParentPs.isPrivileged()) {
- if (isPackageRequestingPermission(disabledSysParentPs.pkg, perm)) {
+ final PackageParser.Package disabledSysParentPkg =
+ (disabledSysParentPs == null || disabledSysParentPs.pkg == null)
+ ? null : disabledSysParentPs.pkg;
+ if (disabledSysParentPkg != null
+ && ((privilegedPermission && disabledSysParentPs.isPrivileged())
+ || (oemPermission && disabledSysParentPs.isOem()))) {
+ if (isPackageRequestingPermission(disabledSysParentPkg, perm)
+ && canGrantOemPermission(disabledSysParentPs, perm)) {
allowed = true;
- } else if (disabledSysParentPs.pkg.childPackages != null) {
- final int count = disabledSysParentPs.pkg.childPackages.size();
+ } else if (disabledSysParentPkg.childPackages != null) {
+ final int count = disabledSysParentPkg.childPackages.size();
for (int i = 0; i < count; i++) {
- PackageParser.Package disabledSysChildPkg =
- disabledSysParentPs.pkg.childPackages.get(i);
- if (isPackageRequestingPermission(disabledSysChildPkg,
- perm)) {
+ final PackageParser.Package disabledSysChildPkg =
+ disabledSysParentPkg.childPackages.get(i);
+ final PackageSetting disabledSysChildPs =
+ mSettings.getDisabledSystemPkgLPr(
+ disabledSysChildPkg.packageName);
+ if (isPackageRequestingPermission(disabledSysChildPkg, perm)
+ && canGrantOemPermission(
+ disabledSysChildPs, perm)) {
allowed = true;
break;
}
@@ -13337,7 +13378,10 @@
}
}
} else {
- allowed = isPrivilegedApp(pkg);
+ allowed = (privilegedPermission && isPrivilegedApp(pkg))
+ || (oemPermission && isOemApp(pkg)
+ && canGrantOemPermission(
+ mSettings.getPackageLPr(pkg.packageName), perm));
}
}
}
@@ -13384,6 +13428,20 @@
return allowed;
}
+ private static boolean canGrantOemPermission(PackageSetting ps, String permission) {
+ if (!ps.isOem()) {
+ return false;
+ }
+ // all oem permissions must explicitly be granted or denied
+ final Boolean granted =
+ SystemConfig.getInstance().getOemPermissions(ps.name).get(permission);
+ if (granted == null) {
+ throw new IllegalStateException("OEM permission" + permission + " requested by package "
+ + ps.name + " must be explicitly declared granted or not");
+ }
+ return Boolean.TRUE == granted;
+ }
+
private boolean isPackageRequestingPermission(PackageParser.Package pkg, String permission) {
final int permCount = pkg.requestedPermissions.size();
for (int j = 0; j < permCount; j++) {
@@ -17777,13 +17835,17 @@
boolean sysPkg = (isSystemApp(oldPackage));
if (sysPkg) {
- // Set the system/privileged flags as needed
+ // Set the system/privileged/oem flags as needed
final boolean privileged =
(oldPackage.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
+ final boolean oem =
+ (oldPackage.applicationInfo.privateFlags
+ & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
final int systemPolicyFlags = policyFlags
| PackageParser.PARSE_IS_SYSTEM
- | (privileged ? PackageParser.PARSE_IS_PRIVILEGED : 0);
+ | (privileged ? PARSE_IS_PRIVILEGED : 0)
+ | (oem ? PARSE_IS_OEM : 0);
replaceSystemPackageLIF(oldPackage, pkg, systemPolicyFlags, scanFlags,
user, allUsers, installerPackageName, res, installReason);
@@ -18634,6 +18696,7 @@
+ perm.info.name + "; Removing ephemeral.");
perm.info.protectionLevel &= ~PermissionInfo.PROTECTION_FLAG_INSTANT;
}
+
// Check whether the newly-scanned package wants to define an already-defined perm
if (bp != null) {
// If the defining package is signed with our cert, it's okay. This
@@ -18989,6 +19052,10 @@
return (pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
}
+ private static boolean isOemApp(PackageParser.Package pkg) {
+ return (pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
+ }
+
private static boolean hasDomainURLs(PackageParser.Package pkg) {
return (pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0;
}
@@ -19742,6 +19809,16 @@
return false;
}
+ static boolean locationIsOem(File path) {
+ try {
+ return path.getCanonicalPath().startsWith(
+ Environment.getOemDirectory().getCanonicalPath());
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to access code path " + path);
+ }
+ return false;
+ }
+
/*
* Tries to delete system package.
*/
@@ -19859,6 +19936,9 @@
if (isPrivileged || locationIsPrivileged(codePath)) {
parseFlags |= PackageParser.PARSE_IS_PRIVILEGED;
}
+ if (locationIsOem(codePath)) {
+ parseFlags |= PackageParser.PARSE_IS_OEM;
+ }
final PackageParser.Package newPkg =
scanPackageTracedLI(codePath, parseFlags, 0 /*scanFlags*/, 0 /*currentTime*/, null);
@@ -22284,13 +22364,21 @@
mDefaultPermissionPolicy.grantDefaultPermissions(userId);
}
- // If we did not grant default permissions, we preload from this the
- // default permission exceptions lazily to ensure we don't hit the
- // disk on a new user creation.
if (grantPermissionsUserIds == EMPTY_INT_ARRAY) {
+ // If we did not grant default permissions, we preload from this the
+ // default permission exceptions lazily to ensure we don't hit the
+ // disk on a new user creation.
mDefaultPermissionPolicy.scheduleReadDefaultPermissionExceptions();
}
+ // Now that we've scanned all packages, and granted any default
+ // permissions, ensure permissions are updated. Beware of dragons if you
+ // try optimizing this.
+ synchronized (mPackages) {
+ updatePermissionsLPw(null, null, StorageManager.UUID_PRIVATE_INTERNAL,
+ UPDATE_PERMISSIONS_ALL);
+ }
+
// Kick off any messages waiting for system ready
if (mPostSystemReadyMessages != null) {
for (Message msg : mPostSystemReadyMessages) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 909ffab..930e4f0 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -54,6 +54,7 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.PrintWriterPrinter;
import com.android.internal.content.PackageHelper;
@@ -75,6 +76,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
@@ -150,6 +152,8 @@
return runGetPrivappPermissions();
case "get-privapp-deny-permissions":
return runGetPrivappDenyPermissions();
+ case "get-oem-permissions":
+ return runGetOemPermissions();
case "get-instantapp-resolver":
return runGetInstantAppResolver();
case "has-feature":
@@ -1308,6 +1312,24 @@
return 0;
}
+ private int runGetOemPermissions() {
+ final String pkg = getNextArg();
+ if (pkg == null) {
+ System.err.println("Error: no package specified.");
+ return 1;
+ }
+ final Map<String, Boolean> oemPermissions = SystemConfig.getInstance()
+ .getOemPermissions(pkg);
+ if (oemPermissions == null || oemPermissions.isEmpty()) {
+ getOutPrintWriter().println("{}");
+ } else {
+ oemPermissions.forEach((permission, granted) ->
+ getOutPrintWriter().println(permission + " granted:" + granted)
+ );
+ }
+ return 0;
+ }
+
private int runGetInstantAppResolver() {
final PrintWriter pw = getOutPrintWriter();
try {
@@ -1730,6 +1752,10 @@
pw.println(" has-feature FEATURE_NAME [version]");
pw.println(" prints true and returns exit status 0 when system has a FEATURE_NAME,");
pw.println(" otherwise prints false and returns exit status 1");
+ pw.println(" get-privileged-permissions TARGET-PACKAGE");
+ pw.println(" prints all privileged permissions for a package.");
+ pw.println(" get-oem-permissions TARGET-PACKAGE");
+ pw.println(" prints all OEM permissions for a package.");
pw.println();
Intent.printIntentArgsHelp(pw , "");
}
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index b4bba88..52bf641 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -113,6 +113,10 @@
return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
}
+ public boolean isOem() {
+ return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
+ }
+
public boolean isForwardLocked() {
return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0;
}
diff --git a/services/core/java/com/android/server/pm/SettingBase.java b/services/core/java/com/android/server/pm/SettingBase.java
index 71e8d51..e17cec0 100644
--- a/services/core/java/com/android/server/pm/SettingBase.java
+++ b/services/core/java/com/android/server/pm/SettingBase.java
@@ -58,6 +58,7 @@
void setPrivateFlags(int pkgPrivateFlags) {
this.pkgPrivateFlags = pkgPrivateFlags
& (ApplicationInfo.PRIVATE_FLAG_PRIVILEGED
+ | ApplicationInfo.PRIVATE_FLAG_OEM
| ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK
| ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER);
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 56835f6..51d3e10 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -869,6 +869,8 @@
pkgSetting.pkgFlags |= pkgFlags & ApplicationInfo.FLAG_SYSTEM;
pkgSetting.pkgPrivateFlags |=
pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
+ pkgSetting.pkgPrivateFlags |=
+ pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM;
pkgSetting.primaryCpuAbiString = primaryCpuAbi;
pkgSetting.secondaryCpuAbiString = secondaryCpuAbi;
if (childPkgNames != null) {
@@ -4529,21 +4531,24 @@
};
private static final Object[] PRIVATE_FLAG_DUMP_SPEC = new Object[] {
- ApplicationInfo.PRIVATE_FLAG_HIDDEN, "HIDDEN",
- ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
- ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK, "FORWARD_LOCK",
- ApplicationInfo.PRIVATE_FLAG_PRIVILEGED, "PRIVILEGED",
- ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS, "HAS_DOMAIN_URLS",
- 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_INSTANT, "EPHEMERAL",
- ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER, "REQUIRED_FOR_SYSTEM_USER",
- ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE",
- ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE",
- ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION",
- ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND, "BACKUP_IN_FOREGROUND",
- ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY, "STATIC_SHARED_LIBRARY",
+ ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE",
+ ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION",
+ ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE",
+ ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND, "BACKUP_IN_FOREGROUND",
+ ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
+ 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_FORWARD_LOCK, "FORWARD_LOCK",
+ ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS, "HAS_DOMAIN_URLS",
+ ApplicationInfo.PRIVATE_FLAG_HIDDEN, "HIDDEN",
+ ApplicationInfo.PRIVATE_FLAG_INSTANT, "EPHEMERAL",
+ ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING, "ISOLATED_SPLIT_LOADING",
+ ApplicationInfo.PRIVATE_FLAG_OEM, "OEM",
+ ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE, "PARTIALLY_DIRECT_BOOT_AWARE",
+ ApplicationInfo.PRIVATE_FLAG_PRIVILEGED, "PRIVILEGED",
+ ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER, "REQUIRED_FOR_SYSTEM_USER",
+ ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY, "STATIC_SHARED_LIBRARY",
+ ApplicationInfo.PRIVATE_FLAG_VIRTUAL_PRELOAD, "VIRTUAL_PRELOAD",
};
void dumpVersionLPr(IndentingPrintWriter pw) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index afa7a24..f2d527b 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -128,6 +128,7 @@
*
* Method naming convention:
* <ul>
+ * <li> Methods suffixed with "LAr" should be called within the {@link #mAppRestrictionsLock} lock.
* <li> Methods suffixed with "LP" should be called within the {@link #mPackagesLock} lock.
* <li> Methods suffixed with "LR" should be called within the {@link #mRestrictionsLock} lock.
* <li> Methods suffixed with "LU" should be called within the {@link #mUsersLock} lock.
@@ -232,6 +233,8 @@
// Short-term lock for internal state, when interaction/sync with PM is not required
private final Object mUsersLock = LockGuard.installNewLock(LockGuard.INDEX_USER);
private final Object mRestrictionsLock = new Object();
+ // Used for serializing access to app restriction files
+ private final Object mAppRestrictionsLock = new Object();
private final Handler mHandler;
@@ -2328,13 +2331,11 @@
/**
* Removes the app restrictions file for a specific package and user id, if it exists.
*/
- private void cleanAppRestrictionsForPackage(String pkg, int userId) {
- synchronized (mPackagesLock) {
- File dir = Environment.getUserSystemDirectory(userId);
- File resFile = new File(dir, packageToRestrictionsFileName(pkg));
- if (resFile.exists()) {
- resFile.delete();
- }
+ private static void cleanAppRestrictionsForPackageLAr(String pkg, int userId) {
+ File dir = Environment.getUserSystemDirectory(userId);
+ File resFile = new File(dir, packageToRestrictionsFileName(pkg));
+ if (resFile.exists()) {
+ resFile.delete();
}
}
@@ -2847,9 +2848,9 @@
|| !UserHandle.isSameApp(Binder.getCallingUid(), getUidForPackage(packageName))) {
checkSystemOrRoot("get application restrictions for other user/app " + packageName);
}
- synchronized (mPackagesLock) {
+ synchronized (mAppRestrictionsLock) {
// Read the restrictions from XML
- return readApplicationRestrictionsLP(packageName, userId);
+ return readApplicationRestrictionsLAr(packageName, userId);
}
}
@@ -2860,12 +2861,12 @@
if (restrictions != null) {
restrictions.setDefusable(true);
}
- synchronized (mPackagesLock) {
+ synchronized (mAppRestrictionsLock) {
if (restrictions == null || restrictions.isEmpty()) {
- cleanAppRestrictionsForPackage(packageName, userId);
+ cleanAppRestrictionsForPackageLAr(packageName, userId);
} else {
// Write the restrictions to XML
- writeApplicationRestrictionsLP(packageName, restrictions, userId);
+ writeApplicationRestrictionsLAr(packageName, restrictions, userId);
}
}
@@ -2888,15 +2889,17 @@
}
}
- private Bundle readApplicationRestrictionsLP(String packageName, int userId) {
+ @GuardedBy("mAppRestrictionsLock")
+ private static Bundle readApplicationRestrictionsLAr(String packageName, int userId) {
AtomicFile restrictionsFile =
new AtomicFile(new File(Environment.getUserSystemDirectory(userId),
packageToRestrictionsFileName(packageName)));
- return readApplicationRestrictionsLP(restrictionsFile);
+ return readApplicationRestrictionsLAr(restrictionsFile);
}
@VisibleForTesting
- static Bundle readApplicationRestrictionsLP(AtomicFile restrictionsFile) {
+ @GuardedBy("mAppRestrictionsLock")
+ static Bundle readApplicationRestrictionsLAr(AtomicFile restrictionsFile) {
final Bundle restrictions = new Bundle();
final ArrayList<String> values = new ArrayList<>();
if (!restrictionsFile.getBaseFile().exists()) {
@@ -2979,16 +2982,18 @@
return childBundle;
}
- private void writeApplicationRestrictionsLP(String packageName,
+ @GuardedBy("mAppRestrictionsLock")
+ private static void writeApplicationRestrictionsLAr(String packageName,
Bundle restrictions, int userId) {
AtomicFile restrictionsFile = new AtomicFile(
new File(Environment.getUserSystemDirectory(userId),
packageToRestrictionsFileName(packageName)));
- writeApplicationRestrictionsLP(restrictions, restrictionsFile);
+ writeApplicationRestrictionsLAr(restrictions, restrictionsFile);
}
@VisibleForTesting
- static void writeApplicationRestrictionsLP(Bundle restrictions, AtomicFile restrictionsFile) {
+ @GuardedBy("mAppRestrictionsLock")
+ static void writeApplicationRestrictionsLAr(Bundle restrictions, AtomicFile restrictionsFile) {
FileOutputStream fos = null;
try {
fos = restrictionsFile.startWrite();
@@ -3232,7 +3237,7 @@
return -1;
}
- private String packageToRestrictionsFileName(String packageName) {
+ private static String packageToRestrictionsFileName(String packageName) {
return RESTRICTIONS_FILE_PREFIX + packageName + XML_SUFFIX;
}
diff --git a/services/core/java/com/android/server/pm/dex/DexoptUtils.java b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
index 0196212..e1310a2 100644
--- a/services/core/java/com/android/server/pm/dex/DexoptUtils.java
+++ b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
@@ -21,6 +21,7 @@
import android.util.SparseArray;
import com.android.internal.os.ClassLoaderFactory;
+import com.android.server.pm.PackageDexOptimizer;
import java.io.File;
import java.util.ArrayList;
@@ -35,7 +36,9 @@
/**
* Creates the class loader context dependencies for each of the application code paths.
* The returned array contains the class loader contexts that needs to be passed to dexopt in
- * order to ensure correct optimizations.
+ * order to ensure correct optimizations. "Code" paths with no actual code, as specified by
+ * {@param pathsWithCode}, are ignored and will have null as their context in the returned array
+ * (configuration splits are an example of paths without code).
*
* A class loader context describes how the class loader chain should be built by dex2oat
* in order to ensure that classes are resolved during compilation as they would be resolved
@@ -60,7 +63,8 @@
* {@link android.app.LoadedApk#makePaths(
* android.app.ActivityThread, boolean, ApplicationInfo, List, List)}.
*/
- public static String[] getClassLoaderContexts(ApplicationInfo info, String[] sharedLibraries) {
+ public static String[] getClassLoaderContexts(ApplicationInfo info,
+ String[] sharedLibraries, boolean[] pathsWithCode) {
// The base class loader context contains only the shared library.
String sharedLibrariesClassPath = encodeClasspath(sharedLibraries);
String baseApkContextClassLoader = encodeClassLoader(
@@ -86,7 +90,7 @@
// Index 0 is the class loaded context for the base apk.
// Index `i` is the class loader context encoding for split `i`.
String[] classLoaderContexts = new String[/*base apk*/ 1 + splitRelativeCodePaths.length];
- classLoaderContexts[0] = baseApkContextClassLoader;
+ classLoaderContexts[0] = pathsWithCode[0] ? baseApkContextClassLoader : null;
if (!info.requestsIsolatedSplitLoading() || info.splitDependencies == null) {
// If the app didn't request for the splits to be loaded in isolation or if it does not
@@ -94,7 +98,15 @@
// apk class loader (in the order of their definition).
String classpath = sharedLibrariesAndBaseClassPath;
for (int i = 1; i < classLoaderContexts.length; i++) {
- classLoaderContexts[i] = encodeClassLoader(classpath, info.classLoaderName);
+ classLoaderContexts[i] = pathsWithCode[i]
+ ? encodeClassLoader(classpath, info.classLoaderName) : null;
+ // Note that the splits with no code are not removed from the classpath computation.
+ // i.e. split_n might get the split_n-1 in its classpath dependency even
+ // if split_n-1 has no code.
+ // The splits with no code do not matter for the runtime which ignores
+ // apks without code when doing the classpath checks. As such we could actually
+ // filter them but we don't do it in order to keep consistency with how the apps
+ // are loaded.
classpath = encodeClasspath(classpath, splitRelativeCodePaths[i - 1]);
}
} else {
@@ -116,9 +128,17 @@
String splitDependencyOnBase = encodeClassLoader(
sharedLibrariesAndBaseClassPath, info.classLoaderName);
SparseArray<int[]> splitDependencies = info.splitDependencies;
+
+ // Note that not all splits have dependencies (e.g. configuration splits)
+ // The splits without dependencies will have classLoaderContexts[config_split_index]
+ // set to null after this step.
for (int i = 1; i < splitDependencies.size(); i++) {
- getParentDependencies(splitDependencies.keyAt(i), splitClassLoaderEncodingCache,
- splitDependencies, classLoaderContexts, splitDependencyOnBase);
+ int splitIndex = splitDependencies.keyAt(i);
+ if (pathsWithCode[splitIndex]) {
+ // Compute the class loader context only for the splits with code.
+ getParentDependencies(splitIndex, splitClassLoaderEncodingCache,
+ splitDependencies, classLoaderContexts, splitDependencyOnBase);
+ }
}
// At this point classLoaderContexts contains only the parent dependencies.
@@ -126,8 +146,17 @@
// come first in the context.
for (int i = 1; i < classLoaderContexts.length; i++) {
String splitClassLoader = encodeClassLoader("", info.splitClassLoaderNames[i - 1]);
- classLoaderContexts[i] = encodeClassLoaderChain(
- splitClassLoader, classLoaderContexts[i]);
+ if (pathsWithCode[i]) {
+ // If classLoaderContexts[i] is null it means that the split does not have
+ // any dependency. In this case its context equals its declared class loader.
+ classLoaderContexts[i] = classLoaderContexts[i] == null
+ ? splitClassLoader
+ : encodeClassLoaderChain(splitClassLoader, classLoaderContexts[i]);
+ } else {
+ // This is a split without code, it has no dependency and it is not compiled.
+ // Its context will be null.
+ classLoaderContexts[i] = null;
+ }
}
}
@@ -210,10 +239,15 @@
/**
* Encodes a single class loader dependency starting from {@param path} and
* {@param classLoaderName}.
+ * When classpath is {@link PackageDexOptimizer#SKIP_SHARED_LIBRARY_CHECK}, the method returns
+ * the same. This special property is used only during OTA.
* NOTE: Keep this in sync with the dexopt expectations! Right now that is either "PCL[path]"
* for a PathClassLoader or "DLC[path]" for a DelegateLastClassLoader.
*/
- private static String encodeClassLoader(String classpath, String classLoaderName) {
+ /*package*/ static String encodeClassLoader(String classpath, String classLoaderName) {
+ if (classpath.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK)) {
+ return classpath;
+ }
String classLoaderDexoptEncoding = classLoaderName;
if (ClassLoaderFactory.isPathClassLoaderName(classLoaderName)) {
classLoaderDexoptEncoding = "PCL";
@@ -227,10 +261,17 @@
/**
* Links to dependencies together in a format accepted by dexopt.
+ * For the special case when either of cl1 or cl2 equals
+ * {@link PackageDexOptimizer#SKIP_SHARED_LIBRARY_CHECK}, the method returns the same. This
+ * property is used only during OTA.
* NOTE: Keep this in sync with the dexopt expectations! Right now that is a list of split
* dependencies {@see encodeClassLoader} separated by ';'.
*/
- private static String encodeClassLoaderChain(String cl1, String cl2) {
+ /*package*/ static String encodeClassLoaderChain(String cl1, String cl2) {
+ if (cl1.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK) ||
+ cl2.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK)) {
+ return PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK;
+ }
if (cl1.isEmpty()) return cl2;
if (cl2.isEmpty()) return cl1;
return cl1 + ";" + cl2;
diff --git a/services/core/java/com/android/server/policy/LegacyGlobalActions.java b/services/core/java/com/android/server/policy/LegacyGlobalActions.java
index 14fabc5..8eb6d06 100644
--- a/services/core/java/com/android/server/policy/LegacyGlobalActions.java
+++ b/services/core/java/com/android/server/policy/LegacyGlobalActions.java
@@ -202,11 +202,14 @@
&& !(mAdapter.getItem(0) instanceof LongPressAction)) {
((SinglePressAction) mAdapter.getItem(0)).onPress();
} else {
- WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
- attrs.setTitle("LegacyGlobalActions");
- mDialog.getWindow().setAttributes(attrs);
- mDialog.show();
- mDialog.getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_EXPAND);
+ if (mDialog != null) {
+ WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
+ attrs.setTitle("LegacyGlobalActions");
+ mDialog.getWindow().setAttributes(attrs);
+ mDialog.show();
+ mDialog.getWindow().getDecorView().setSystemUiVisibility(
+ View.STATUS_BAR_DISABLE_EXPAND);
+ }
}
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 68913c3..a806af4 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -338,6 +338,7 @@
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";
+ static public final String SYSTEM_DIALOG_REASON_SCREENSHOT = "screenshot";
/**
* These are the system UI flags that, when changing, can cause the layout
@@ -832,6 +833,7 @@
private static final int MSG_ACCESSIBILITY_TV = 23;
private static final int MSG_DISPATCH_BACK_KEY_TO_AUTOFILL = 24;
private static final int MSG_SYSTEM_KEY_PRESS = 25;
+ private static final int MSG_HANDLE_ALL_APPS = 26;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1;
@@ -924,6 +926,9 @@
case MSG_SYSTEM_KEY_PRESS:
sendSystemKeyToStatusBar(msg.arg1);
break;
+ case MSG_HANDLE_ALL_APPS:
+ launchAllAppsAction();
+ break;
}
}
}
@@ -1804,6 +1809,17 @@
private void launchAllAppsAction() {
Intent intent = new Intent(Intent.ACTION_ALL_APPS);
+ if (mHasFeatureLeanback) {
+ final PackageManager pm = mContext.getPackageManager();
+ Intent intentLauncher = new Intent(Intent.ACTION_MAIN);
+ intentLauncher.addCategory(Intent.CATEGORY_HOME);
+ ResolveInfo resolveInfo = pm.resolveActivityAsUser(intentLauncher,
+ PackageManager.MATCH_SYSTEM_ONLY,
+ mCurrentUserId);
+ if (resolveInfo != null) {
+ intent.setPackage(resolveInfo.activityInfo.packageName);
+ }
+ }
startActivityAsUser(intent, UserHandle.CURRENT);
}
@@ -3623,6 +3639,14 @@
return -1;
} else if (mHasFeatureLeanback && interceptAccessibilityGestureTv(keyCode, down)) {
return -1;
+ } else if (keyCode == KeyEvent.KEYCODE_ALL_APPS) {
+ if (!down) {
+ mHandler.removeMessages(MSG_HANDLE_ALL_APPS);
+ Message msg = mHandler.obtainMessage(MSG_HANDLE_ALL_APPS);
+ msg.setAsynchronous(true);
+ msg.sendToTarget();
+ }
+ return -1;
}
// Toggle Caps Lock on META-ALT.
diff --git a/services/core/java/com/android/server/search/SearchManagerService.java b/services/core/java/com/android/server/search/SearchManagerService.java
index 8969771..c3fa823 100644
--- a/services/core/java/com/android/server/search/SearchManagerService.java
+++ b/services/core/java/com/android/server/search/SearchManagerService.java
@@ -17,7 +17,6 @@
package com.android.server.search;
import android.app.ActivityManager;
-import android.app.AppGlobals;
import android.app.IActivityManager;
import android.app.ISearchManager;
import android.app.SearchManager;
@@ -26,7 +25,6 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.ContentObserver;
@@ -37,6 +35,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
+import android.service.voice.VoiceInteractionService;
import android.util.Log;
import android.util.SparseArray;
@@ -272,24 +271,25 @@
}
}
+ // Check and return VIS component
private ComponentName getLegacyAssistComponent(int userHandle) {
try {
userHandle = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
- Binder.getCallingUid(), userHandle, true, false, "getLegacyAssistComponent", null);
- IPackageManager pm = AppGlobals.getPackageManager();
- Intent assistIntent = new Intent(Intent.ACTION_ASSIST);
- ResolveInfo info =
- pm.resolveIntent(assistIntent,
- assistIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
- PackageManager.MATCH_DEFAULT_ONLY, userHandle);
- if (info != null) {
+ Binder.getCallingUid(), userHandle, true, false, "getLegacyAssistComponent",
+ null);
+ PackageManager pm = mContext.getPackageManager();
+ Intent intentAssistProbe = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
+ List<ResolveInfo> infoListVis = pm.queryIntentServicesAsUser(intentAssistProbe,
+ PackageManager.MATCH_SYSTEM_ONLY, userHandle);
+ if (infoListVis == null || infoListVis.isEmpty()) {
+ return null;
+ } else {
+ ResolveInfo rInfo = infoListVis.get(0);
return new ComponentName(
- info.activityInfo.applicationInfo.packageName,
- info.activityInfo.name);
+ rInfo.serviceInfo.applicationInfo.packageName,
+ rInfo.serviceInfo.name);
+
}
- } catch (RemoteException re) {
- // Local call
- Log.e(TAG, "RemoteException in getLegacyAssistComponent: " + re);
} catch (Exception e) {
Log.e(TAG, "Exception in getLegacyAssistComponent: " + e);
}
@@ -304,9 +304,15 @@
}
long ident = Binder.clearCallingIdentity();
try {
- Intent intent = new Intent(Intent.ACTION_ASSIST);
+ Intent intent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
intent.setComponent(comp);
+
IActivityManager am = ActivityManager.getService();
+ if (args != null) {
+ args.putInt(Intent.EXTRA_KEY_EVENT, android.view.KeyEvent.KEYCODE_ASSIST);
+ }
+ intent.putExtras(args);
+
return am.launchAssistIntent(intent, ActivityManager.ASSIST_CONTEXT_BASIC, hint,
userHandle, args);
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 34ac645..38dc33f 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -20,7 +20,6 @@
import android.app.StatusBarManager;
import android.content.ComponentName;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.graphics.Rect;
import android.os.Binder;
import android.os.Bundle;
@@ -957,6 +956,10 @@
this, in, out, err, args, callback, resultReceiver);
}
+ public String[] getStatusBarIcons() {
+ return mContext.getResources().getStringArray(R.array.config_statusBarIcons);
+ }
+
// ================================================================================
// Can be called from any thread
// ================================================================================
diff --git a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
index 40bb496..4e20f01 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
@@ -25,7 +25,7 @@
public class StatusBarShellCommand extends ShellCommand {
- private final IStatusBarService mInterface;
+ private final StatusBarManagerService mInterface;
public StatusBarShellCommand(StatusBarManagerService service) {
mInterface = service;
@@ -54,6 +54,8 @@
final PrintWriter pw = getOutPrintWriter();
pw.println(String.valueOf(TileService.isQuickSettingsSupported()));
return 0;
+ case "get-status-icons":
+ return runGetStatusIcons();
default:
return handleDefaultCommands(cmd);
}
@@ -94,6 +96,14 @@
return 0;
}
+ private int runGetStatusIcons() {
+ final PrintWriter pw = getOutPrintWriter();
+ for (String icon : mInterface.getStatusBarIcons()) {
+ pw.println(icon);
+ }
+ return 0;
+ }
+
@Override
public void onHelp() {
final PrintWriter pw = getOutPrintWriter();
@@ -122,5 +132,8 @@
pw.println(" check-support");
pw.println(" Check if this device supports QS + APIs");
pw.println("");
+ pw.println(" get-status-icons");
+ pw.println(" Print the list of status bar icons and the order they appear in");
+ pw.println("");
}
}
diff --git a/services/core/java/com/android/server/timezone/IntentHelperImpl.java b/services/core/java/com/android/server/timezone/IntentHelperImpl.java
index 11928b9..6db70cd 100644
--- a/services/core/java/com/android/server/timezone/IntentHelperImpl.java
+++ b/services/core/java/com/android/server/timezone/IntentHelperImpl.java
@@ -53,20 +53,34 @@
// The intent filter that triggers when package update events happen that indicate there may
// be work to do.
IntentFilter packageIntentFilter = new IntentFilter();
- // Either of these mean a downgrade?
- packageIntentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
- packageIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+
packageIntentFilter.addDataScheme("package");
packageIntentFilter.addDataSchemeSpecificPart(
updaterAppPackageName, PatternMatcher.PATTERN_LITERAL);
packageIntentFilter.addDataSchemeSpecificPart(
dataAppPackageName, PatternMatcher.PATTERN_LITERAL);
+
+ // ACTION_PACKAGE_ADDED is fired when a package is upgraded or downgraded (in addition to
+ // ACTION_PACKAGE_REMOVED and ACTION_PACKAGE_REPLACED). A system/priv-app can never be
+ // removed entirely so we do not need to trigger on ACTION_PACKAGE_REMOVED or
+ // ACTION_PACKAGE_FULLY_REMOVED.
+ packageIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+
+ // ACTION_PACKAGE_CHANGED is used when a package is disabled / re-enabled. It is not
+ // strictly necessary to trigger on this but it won't hurt anything and may catch some cases
+ // where a package has changed while disabled.
+ // Note: ACTION_PACKAGE_CHANGED is not fired when updating a suspended app, but
+ // ACTION_PACKAGE_ADDED, ACTION_PACKAGE_REMOVED and ACTION_PACKAGE_REPLACED are (and the app
+ // is left in an unsuspended state after this).
+ packageIntentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+
+ // We do not register for ACTION_PACKAGE_RESTARTED because it doesn't imply an update.
+ // We do not register for ACTION_PACKAGE_DATA_CLEARED because the updater / data apps are
+ // not expected to need local data.
+
Receiver packageUpdateReceiver = new Receiver(listener, true /* packageUpdated */);
mContext.registerReceiver(packageUpdateReceiver, packageIntentFilter);
- // TODO(nfuller): Add more exotic intents as needed. e.g.
- // packageIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
- // Also, disabled...?
mReliabilityReceiver = new Receiver(listener, false /* packageUpdated */);
}
diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java
index 50f27ed..3ad4419 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerService.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerService.java
@@ -343,16 +343,20 @@
@Override
public void run() {
EventLogTags.writeTimezoneUninstallStarted(toStringOrNull(mCheckToken));
- boolean success = false;
+ boolean packageTrackerStatus = false;
try {
- success = mInstaller.stageUninstall();
- // Right now we just have success (0) / failure (1). All clients should be checking
- // against SUCCESS. More granular failures may be added in future.
- int resultCode = success ? Callback.SUCCESS
- : Callback.ERROR_UNKNOWN_FAILURE;
+ int uninstallResult = mInstaller.stageUninstall();
+ packageTrackerStatus = (uninstallResult == TimeZoneDistroInstaller.UNINSTALL_SUCCESS
+ || uninstallResult == TimeZoneDistroInstaller.UNINSTALL_NOTHING_INSTALLED);
+
+ // Right now we just have Callback.SUCCESS / Callback.ERROR_UNKNOWN_FAILURE for
+ // uninstall. All clients should be checking against SUCCESS. More granular failures
+ // may be added in future.
+ int callbackResultCode =
+ packageTrackerStatus ? Callback.SUCCESS : Callback.ERROR_UNKNOWN_FAILURE;
EventLogTags.writeTimezoneUninstallComplete(
- toStringOrNull(mCheckToken), resultCode);
- sendFinishedStatus(mCallback, resultCode);
+ toStringOrNull(mCheckToken), callbackResultCode);
+ sendFinishedStatus(mCallback, callbackResultCode);
} catch (Exception e) {
EventLogTags.writeTimezoneUninstallComplete(
toStringOrNull(mCheckToken), Callback.ERROR_UNKNOWN_FAILURE);
@@ -360,7 +364,7 @@
sendFinishedStatus(mCallback, Callback.ERROR_UNKNOWN_FAILURE);
} finally {
// Notify the package tracker that the operation is now complete.
- mPackageTracker.recordCheckResult(mCheckToken, success);
+ mPackageTracker.recordCheckResult(mCheckToken, packageTrackerStatus);
mOperationInProgress.set(false);
}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index b963561..0536ff1 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -1138,7 +1138,13 @@
mMonitor = new MyPackageMonitor();
mMonitor.register(context, null, UserHandle.ALL, true);
getWallpaperDir(UserHandle.USER_SYSTEM).mkdirs();
+
+ // Initialize state from the persistent store, then guarantee that the
+ // WallpaperData for the system imagery is instantiated & active, creating
+ // it from defaults if necessary.
loadSettingsLocked(UserHandle.USER_SYSTEM, false);
+ getWallpaperSafeLocked(UserHandle.USER_SYSTEM, FLAG_SYSTEM);
+
mColorsChangedListeners = new SparseArray<>();
}
@@ -1627,13 +1633,10 @@
(which == FLAG_LOCK) ? mLockWallpaperMap : mWallpaperMap;
WallpaperData wallpaper = whichSet.get(wallpaperUserId);
if (wallpaper == null) {
- // common case, this is the first lookup post-boot of the system or
- // unified lock, so we bring up the saved state lazily now and recheck.
- loadSettingsLocked(wallpaperUserId, false);
- wallpaper = whichSet.get(wallpaperUserId);
- if (wallpaper == null) {
- return null;
- }
+ // There is no established wallpaper imagery of this type (expected
+ // only for lock wallpapers; a system WallpaperData is established at
+ // user switch)
+ return null;
}
try {
if (outParams != null) {
@@ -1658,7 +1661,7 @@
@Override
public WallpaperInfo getWallpaperInfo(int userId) {
userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
- Binder.getCallingUid(), userId, false, true, "getWallpaperIdForUser", null);
+ Binder.getCallingUid(), userId, false, true, "getWallpaperInfo", null);
synchronized (mLock) {
WallpaperData wallpaper = mWallpaperMap.get(userId);
if (wallpaper != null && wallpaper.connection != null) {
@@ -2260,7 +2263,7 @@
private void writeWallpaperAttributes(XmlSerializer out, String tag, WallpaperData wallpaper)
throws IllegalArgumentException, IllegalStateException, IOException {
if (DEBUG) {
- Slog.v(TAG, "writeWallpaperAttributes");
+ Slog.v(TAG, "writeWallpaperAttributes id=" + wallpaper.wallpaperId);
}
out.startTag(null, tag);
out.attribute(null, "id", Integer.toString(wallpaper.wallpaperId));
@@ -2359,6 +2362,9 @@
* the event yet. We use this safe method when we don't care about this ordering and just
* want to update the data. The data is going to be applied when the user switch observer
* is eventually executed.
+ *
+ * Important: this method loads settings to initialize the given user's wallpaper data if
+ * there is no current in-memory state.
*/
private WallpaperData getWallpaperSafeLocked(int userId, int which) {
// We're setting either just system (work with the system wallpaper),
@@ -2397,8 +2403,6 @@
}
private void loadSettingsLocked(int userId, boolean keepDimensionHints) {
- if (DEBUG) Slog.v(TAG, "loadSettingsLocked");
-
JournaledFile journal = makeJournaledFile(userId);
FileInputStream stream = null;
File file = journal.chooseForRead();
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdater.java b/services/core/java/com/android/server/webkit/WebViewUpdater.java
index 203bbf6..7fc907f 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdater.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdater.java
@@ -569,6 +569,7 @@
PackageInfo systemUserPackageInfo =
userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
if (systemUserPackageInfo == null) {
+ pw.println(String.format(" %s is NOT installed.", provider.packageName));
continue;
}
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index 66e0a15..5841840 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -181,12 +181,12 @@
int requestedOrientation, boolean fullscreen, boolean showForAllUsers, int configChanges,
boolean voiceInteraction, boolean launchTaskBehind, boolean alwaysFocusable,
int targetSdkVersion, int rotationAnimationHint, long inputDispatchingTimeoutNanos,
- Configuration overrideConfig, Rect bounds) {
+ Rect bounds) {
this(taskController, token, listener, index, requestedOrientation, fullscreen,
showForAllUsers,
configChanges, voiceInteraction, launchTaskBehind, alwaysFocusable,
targetSdkVersion, rotationAnimationHint, inputDispatchingTimeoutNanos,
- WindowManagerService.getInstance(), overrideConfig, bounds);
+ WindowManagerService.getInstance(), bounds);
}
public AppWindowContainerController(TaskWindowContainerController taskController,
@@ -194,7 +194,7 @@
int requestedOrientation, boolean fullscreen, boolean showForAllUsers, int configChanges,
boolean voiceInteraction, boolean launchTaskBehind, boolean alwaysFocusable,
int targetSdkVersion, int rotationAnimationHint, long inputDispatchingTimeoutNanos,
- WindowManagerService service, Configuration overrideConfig, Rect bounds) {
+ WindowManagerService service, Rect bounds) {
super(listener, service);
mHandler = new H(service.mH.getLooper());
mToken = token;
@@ -215,7 +215,7 @@
atoken = createAppWindow(mService, token, voiceInteraction, task.getDisplayContent(),
inputDispatchingTimeoutNanos, fullscreen, showForAllUsers, targetSdkVersion,
requestedOrientation, rotationAnimationHint, configChanges, launchTaskBehind,
- alwaysFocusable, this, overrideConfig, bounds);
+ alwaysFocusable, this, bounds);
if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "addAppToken: " + atoken
+ " controller=" + taskController + " at " + index);
task.addChild(atoken, index);
@@ -227,12 +227,11 @@
boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos,
boolean fullscreen, boolean showForAllUsers, int targetSdk, int orientation,
int rotationAnimationHint, int configChanges, boolean launchTaskBehind,
- boolean alwaysFocusable, AppWindowContainerController controller,
- Configuration overrideConfig, Rect bounds) {
+ boolean alwaysFocusable, AppWindowContainerController controller, Rect bounds) {
return new AppWindowToken(service, token, voiceInteraction, dc,
inputDispatchingTimeoutNanos, fullscreen, showForAllUsers, targetSdk, orientation,
rotationAnimationHint, configChanges, launchTaskBehind, alwaysFocusable,
- controller, overrideConfig, bounds);
+ controller, bounds);
}
public void removeContainer(int displayId) {
@@ -651,7 +650,7 @@
// Use the same thread to remove the window as we used to add it, as otherwise we end up
// with things in the view hierarchy being called from different threads.
- mHandler.post(() -> {
+ mService.mAnimationHandler.post(() -> {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Removing startingView=" + surface);
try {
surface.remove();
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index f70035c..ea2f305 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -187,7 +187,7 @@
private boolean mDisablePreviewScreenshots;
- Task mLastParent;
+ private Task mLastParent;
/**
* See {@link #canTurnScreenOn()}
@@ -198,8 +198,8 @@
DisplayContent dc, long inputDispatchingTimeoutNanos, boolean fullscreen,
boolean showForAllUsers, int targetSdk, int orientation, int rotationAnimationHint,
int configChanges, boolean launchTaskBehind, boolean alwaysFocusable,
- AppWindowContainerController controller, Configuration overrideConfig, Rect bounds) {
- this(service, token, voiceInteraction, dc, fullscreen, overrideConfig, bounds);
+ AppWindowContainerController controller, Rect bounds) {
+ this(service, token, voiceInteraction, dc, fullscreen, bounds);
setController(controller);
mInputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
mShowForAllUsers = showForAllUsers;
@@ -216,7 +216,7 @@
}
AppWindowToken(WindowManagerService service, IApplicationToken token, boolean voiceInteraction,
- DisplayContent dc, boolean fillsParent, Configuration overrideConfig, Rect bounds) {
+ DisplayContent dc, boolean fillsParent, Rect bounds) {
super(service, token != null ? token.asBinder() : null, TYPE_APPLICATION, true, dc,
false /* ownerCanManageAppTokens */);
appToken = token;
@@ -224,9 +224,6 @@
mFillsParent = fillsParent;
mInputApplicationHandle = new InputApplicationHandle(this);
mAppAnimator = new AppWindowAnimator(this, service);
- if (overrideConfig != null) {
- onOverrideConfigurationChanged(overrideConfig);
- }
if (bounds != null) {
mBounds.set(bounds);
}
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index 21b67f1..28ba9b3 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -21,11 +21,15 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.activityTypeToString;
import android.app.WindowConfiguration;
import android.content.res.Configuration;
+import java.util.ArrayList;
+
/**
* Contains common logic for classes that have override configurations and are organized in a
* hierarchy.
@@ -48,6 +52,8 @@
*/
private Configuration mMergedOverrideConfiguration = new Configuration();
+ private ArrayList<ConfigurationContainerListener> mChangeListeners = new ArrayList<>();
+
// TODO: Can't have ag/2592611 soon enough!
private final Configuration mTmpConfig = new Configuration();
@@ -90,6 +96,11 @@
onConfigurationChanged(parent != null ? parent.getConfiguration() : Configuration.EMPTY);
// Update merged override config of this container and all its children.
onMergedOverrideConfigurationChanged();
+
+ // Inform listeners of the change.
+ for (int i = mChangeListeners.size() - 1; i >=0; --i) {
+ mChangeListeners.get(i).onOverrideConfigurationChanged(overrideConfiguration);
+ }
}
/**
@@ -136,6 +147,33 @@
onOverrideConfigurationChanged(mTmpConfig);
}
+ /** Returns true if this container is currently in split-screen windowing mode. */
+ public boolean inSplitScreenWindowingMode() {
+ /*@WindowConfiguration.WindowingMode*/ int windowingMode =
+ mFullConfiguration.windowConfiguration.getWindowingMode();
+
+ return windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
+ || windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+ }
+
+ /** Returns true if this container is currently in split-screen secondary windowing mode. */
+ public boolean inSplitScreenSecondaryWindowingMode() {
+ /*@WindowConfiguration.WindowingMode*/ int windowingMode =
+ mFullConfiguration.windowConfiguration.getWindowingMode();
+
+ return windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+ }
+
+ /**
+ * Returns true if this container can be put in either
+ * {@link WindowConfiguration#WINDOWING_MODE_SPLIT_SCREEN_PRIMARY} or
+ * {@link WindowConfiguration##WINDOWING_MODE_SPLIT_SCREEN_SECONDARY} windowing modes based on
+ * its current state.
+ */
+ public boolean supportSplitScreenWindowingMode() {
+ return mFullConfiguration.windowConfiguration.supportSplitScreenWindowingMode();
+ }
+
/** Returns the activity type associated with the the configuration container. */
/*@WindowConfiguration.ActivityType*/
public int getActivityType() {
@@ -173,6 +211,11 @@
return getActivityType() == ACTIVITY_TYPE_STANDARD;
}
+ public boolean isActivityTypeStandardOrUndefined() {
+ /*@WindowConfiguration.ActivityType*/ final int activityType = getActivityType();
+ return activityType == ACTIVITY_TYPE_STANDARD || activityType == ACTIVITY_TYPE_UNDEFINED;
+ }
+
public boolean hasCompatibleActivityType(ConfigurationContainer other) {
/*@WindowConfiguration.ActivityType*/ int thisType = getActivityType();
/*@WindowConfiguration.ActivityType*/ int otherType = other.getActivityType();
@@ -182,6 +225,18 @@
|| otherType == ACTIVITY_TYPE_UNDEFINED;
}
+ public void registerConfigurationChangeListener(ConfigurationContainerListener listener) {
+ if (mChangeListeners.contains(listener)) {
+ return;
+ }
+ mChangeListeners.add(listener);
+ listener.onOverrideConfigurationChanged(mOverrideConfiguration);
+ }
+
+ public void unregisterConfigurationChangeListener(ConfigurationContainerListener listener) {
+ mChangeListeners.remove(listener);
+ }
+
/**
* Must be called when new parent for the container was set.
*/
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainerListener.java b/services/core/java/com/android/server/wm/ConfigurationContainerListener.java
new file mode 100644
index 0000000..ff14d97
--- /dev/null
+++ b/services/core/java/com/android/server/wm/ConfigurationContainerListener.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.server.wm;
+
+import android.content.res.Configuration;
+
+/**
+ * Interface for listening to changes in a {@link ConfigurationContainer}.
+ */
+public interface ConfigurationContainerListener {
+
+ void onOverrideConfigurationChanged(Configuration overrideConfiguration);
+}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index d74e482..6cf608a 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1915,9 +1915,13 @@
super.removeImmediately();
if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this);
mDimLayerController.close();
- if (mDisplayId == DEFAULT_DISPLAY && mService.canDispatchPointerEvents()) {
- mService.unregisterPointerEventListener(mTapDetector);
- mService.unregisterPointerEventListener(mService.mMousePositionTracker);
+ if (mService.canDispatchPointerEvents()) {
+ if (mTapDetector != null) {
+ mService.unregisterPointerEventListener(mTapDetector);
+ }
+ if (mDisplayId == DEFAULT_DISPLAY && mService.mMousePositionTracker != null) {
+ mService.unregisterPointerEventListener(mService.mMousePositionTracker);
+ }
}
} finally {
mRemovingDisplay = false;
@@ -3066,7 +3070,7 @@
final boolean foundTargetWs =
(w.mAppToken != null && w.mAppToken.token == appToken)
|| (mScreenshotApplicationState.appWin != null && wallpaperOnly);
- if (foundTargetWs && winAnim.getShown()) {
+ if (foundTargetWs && winAnim.getShown() && winAnim.mLastAlpha > 0f) {
mScreenshotApplicationState.screenshotReady = true;
}
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index b5c9b99..590ac6e 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -40,9 +40,8 @@
private Rect mTmpToBounds = new Rect();
public PinnedStackWindowController(int stackId, PinnedStackWindowListener listener,
- int displayId, boolean onTop, Rect outBounds, Configuration overrideConfig) {
- super(stackId, listener, displayId, onTop, outBounds, overrideConfig,
- WindowManagerService.getInstance());
+ int displayId, boolean onTop, Rect outBounds) {
+ super(stackId, listener, displayId, onTop, outBounds, WindowManagerService.getInstance());
}
/**
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 54dd199..8a74976 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -249,13 +249,8 @@
// Tap Listeners are supported for:
// 1. All physical displays (multi-display).
- // 2. VirtualDisplays that support virtual touch input. (Only VR for now)
- // TODO(multi-display): Support VirtualDisplays with no virtual touch input.
- if ((display.getType() != Display.TYPE_VIRTUAL
- || (display.getType() == Display.TYPE_VIRTUAL
- // Only VR VirtualDisplays
- && displayId == mService.mVr2dDisplayId))
- && mService.canDispatchPointerEvents()) {
+ // 2. VirtualDisplays on VR, AA (and everything else).
+ if (mService.canDispatchPointerEvents()) {
if (DEBUG_DISPLAY) {
Slog.d(TAG,
"Registering PointerEventListener for DisplayId: " + displayId);
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
index aaacef5..a50ed71 100644
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ b/services/core/java/com/android/server/wm/StackWindowController.java
@@ -57,16 +57,14 @@
private final Rect mTmpNonDecorInsets = new Rect();
private final Rect mTmpDisplayBounds = new Rect();
- public StackWindowController(int stackId, StackWindowListener listener,
- int displayId, boolean onTop, Rect outBounds, Configuration overriderConfig) {
- this(stackId, listener, displayId, onTop, outBounds, overriderConfig,
- WindowManagerService.getInstance());
+ public StackWindowController(int stackId, StackWindowListener listener, int displayId,
+ boolean onTop, Rect outBounds) {
+ this(stackId, listener, displayId, onTop, outBounds, WindowManagerService.getInstance());
}
@VisibleForTesting
public StackWindowController(int stackId, StackWindowListener listener,
- int displayId, boolean onTop, Rect outBounds, Configuration overrideConfig,
- WindowManagerService service) {
+ int displayId, boolean onTop, Rect outBounds, WindowManagerService service) {
super(listener, service);
mStackId = stackId;
mHandler = new H(new WeakReference<>(this), service.mH.getLooper());
@@ -79,9 +77,6 @@
}
final TaskStack stack = dc.addStackToDisplay(stackId, onTop);
- if (overrideConfig != null) {
- stack.onOverrideConfigurationChanged(overrideConfig);
- }
stack.setController(this);
getRawBounds(outBounds);
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index f57238e..55b6c91 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -106,8 +106,8 @@
private boolean mPreserveNonFloatingState = false;
Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
- Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
- TaskDescription taskDescription, TaskWindowContainerController controller) {
+ int resizeMode, boolean supportsPictureInPicture, TaskDescription taskDescription,
+ TaskWindowContainerController controller) {
mTaskId = taskId;
mStack = stack;
mUserId = userId;
@@ -115,7 +115,7 @@
mResizeMode = resizeMode;
mSupportsPictureInPicture = supportsPictureInPicture;
setController(controller);
- setBounds(bounds, overrideConfig);
+ setBounds(bounds, getOverrideConfiguration());
mTaskDescription = taskDescription;
// Tasks have no set orientation value (including SCREEN_ORIENTATION_UNSPECIFIED).
@@ -273,6 +273,9 @@
}
/** Set the task bounds. Passing in null sets the bounds to fullscreen. */
+ // TODO: There is probably not a need to pass in overrideConfig anymore since any change to it
+ // will be automatically propagated from the AM. Also, mBound is going to be in
+ // WindowConfiguration long term.
private int setBounds(Rect bounds, Configuration overrideConfig) {
if (overrideConfig == null) {
overrideConfig = Configuration.EMPTY;
@@ -418,9 +421,9 @@
/** Return true if the current bound can get outputted to the rest of the system as-is. */
private boolean useCurrentBounds() {
- final DisplayContent displayContent = mStack.getDisplayContent();
+ final DisplayContent displayContent = getDisplayContent();
return mFillsParent
- || !StackId.isTaskResizeableByDockedStack(mStack.mStackId)
+ || !inSplitScreenSecondaryWindowingMode()
|| displayContent == null
|| displayContent.getDockedStackIgnoringVisibility() != null;
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 6ec7565..4664dcb 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -289,7 +289,7 @@
/** Return true if the current bound can get outputted to the rest of the system as-is. */
private boolean useCurrentBounds() {
if (mFillsParent
- || !StackId.isResizeableByDockedStack(mStackId)
+ || !inSplitScreenSecondaryWindowingMode()
|| mDisplayContent == null
|| mDisplayContent.getDockedStackLocked() != null) {
return true;
@@ -684,7 +684,7 @@
Rect bounds = null;
final TaskStack dockedStack = dc.getDockedStackIgnoringVisibility();
if (mStackId == DOCKED_STACK_ID
- || (dockedStack != null && StackId.isResizeableByDockedStack(mStackId)
+ || (dockedStack != null && inSplitScreenSecondaryWindowingMode()
&& !dockedStack.fillsParent())) {
// The existence of a docked stack affects the size of other static stack created since
// the docked stack occupies a dedicated region on screen, but only if the dock stack is
@@ -756,8 +756,7 @@
return;
}
- if ((mStackId != DOCKED_STACK_ID && !StackId.isResizeableByDockedStack(mStackId))
- || mDisplayContent == null) {
+ if (!inSplitScreenWindowingMode() || mDisplayContent == null) {
outStackBounds.set(mBounds);
return;
}
@@ -1324,8 +1323,8 @@
return getDockSide(mBounds);
}
- int getDockSide(Rect bounds) {
- if (mStackId != DOCKED_STACK_ID && !StackId.isResizeableByDockedStack(mStackId)) {
+ private int getDockSide(Rect bounds) {
+ if (!inSplitScreenWindowingMode()) {
return DOCKED_INVALID;
}
if (mDisplayContent == null) {
diff --git a/services/core/java/com/android/server/wm/TaskWindowContainerController.java b/services/core/java/com/android/server/wm/TaskWindowContainerController.java
index d8929c9..65f8cdf 100644
--- a/services/core/java/com/android/server/wm/TaskWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/TaskWindowContainerController.java
@@ -49,19 +49,18 @@
private final H mHandler;
public TaskWindowContainerController(int taskId, TaskWindowContainerListener listener,
- StackWindowController stackController, int userId, Rect bounds,
- Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
- boolean toTop, boolean showForAllUsers, TaskDescription taskDescription) {
- this(taskId, listener, stackController, userId, bounds, overrideConfig, resizeMode,
+ StackWindowController stackController, int userId, Rect bounds, int resizeMode,
+ boolean supportsPictureInPicture, boolean toTop, boolean showForAllUsers,
+ TaskDescription taskDescription) {
+ this(taskId, listener, stackController, userId, bounds, resizeMode,
supportsPictureInPicture, toTop, showForAllUsers, taskDescription,
WindowManagerService.getInstance());
}
public TaskWindowContainerController(int taskId, TaskWindowContainerListener listener,
- StackWindowController stackController, int userId, Rect bounds,
- Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
- boolean toTop, boolean showForAllUsers, TaskDescription taskDescription,
- WindowManagerService service) {
+ StackWindowController stackController, int userId, Rect bounds, int resizeMode,
+ boolean supportsPictureInPicture, boolean toTop, boolean showForAllUsers,
+ TaskDescription taskDescription, WindowManagerService service) {
super(listener, service);
mTaskId = taskId;
mHandler = new H(new WeakReference<>(this), service.mH.getLooper());
@@ -76,7 +75,7 @@
+ stackController);
}
EventLog.writeEvent(WM_TASK_CREATED, taskId, stack.mStackId);
- final Task task = createTask(taskId, stack, userId, bounds, overrideConfig, resizeMode,
+ final Task task = createTask(taskId, stack, userId, bounds, resizeMode,
supportsPictureInPicture, taskDescription);
final int position = toTop ? POSITION_TOP : POSITION_BOTTOM;
// We only want to move the parents to the parents if we are creating this task at the
@@ -86,10 +85,9 @@
}
@VisibleForTesting
- Task createTask(int taskId, TaskStack stack, int userId, Rect bounds,
- Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
- TaskDescription taskDescription) {
- return new Task(taskId, stack, userId, mService, bounds, overrideConfig, resizeMode,
+ Task createTask(int taskId, TaskStack stack, int userId, Rect bounds, int resizeMode,
+ boolean supportsPictureInPicture, TaskDescription taskDescription) {
+ return new Task(taskId, stack, userId, mService, bounds, resizeMode,
supportsPictureInPicture, taskDescription, this);
}
diff --git a/services/core/java/com/android/server/wm/WindowContainerController.java b/services/core/java/com/android/server/wm/WindowContainerController.java
index c4a6837..eb23faf 100644
--- a/services/core/java/com/android/server/wm/WindowContainerController.java
+++ b/services/core/java/com/android/server/wm/WindowContainerController.java
@@ -16,9 +16,7 @@
package com.android.server.wm;
-import android.os.IBinder;
-
-import java.util.HashMap;
+import android.content.res.Configuration;
/**
* Class that allows the owner/creator of a {@link WindowContainer} to communicate directly with the
@@ -29,7 +27,8 @@
*
* Test class: {@link WindowContainerControllerTests}
*/
-class WindowContainerController<E extends WindowContainer, I extends WindowContainerListener> {
+class WindowContainerController<E extends WindowContainer, I extends WindowContainerListener>
+ implements ConfigurationContainerListener {
final WindowManagerService mService;
final RootWindowContainer mRoot;
@@ -53,18 +52,32 @@
+ " for controller=" + this + " Already set to=" + mContainer);
}
mContainer = container;
+ if (mContainer != null && mListener != null) {
+ mListener.registerConfigurationChangeListener(this);
+ }
}
void removeContainer() {
// TODO: See if most uses cases should support removeIfPossible here.
//mContainer.removeIfPossible();
- if (mContainer != null) {
- mContainer.setController(null);
- mContainer = null;
+ if (mContainer == null) {
+ return;
+ }
+
+ mContainer.setController(null);
+ mContainer = null;
+ if (mListener != null) {
+ mListener.unregisterConfigurationChangeListener(this);
}
}
- boolean checkCallingPermission(String permission, String func) {
- return mService.checkCallingPermission(permission, func);
+ @Override
+ public void onOverrideConfigurationChanged(Configuration overrideConfiguration) {
+ synchronized (mWindowMap) {
+ if (mContainer == null) {
+ return;
+ }
+ mContainer.onOverrideConfigurationChanged(overrideConfiguration);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/WindowContainerListener.java b/services/core/java/com/android/server/wm/WindowContainerListener.java
index ab9d71a..4b3cd36 100644
--- a/services/core/java/com/android/server/wm/WindowContainerListener.java
+++ b/services/core/java/com/android/server/wm/WindowContainerListener.java
@@ -21,5 +21,6 @@
* @see WindowContainerController
*/
public interface WindowContainerListener {
-
+ void registerConfigurationChangeListener(ConfigurationContainerListener listener);
+ void unregisterConfigurationChangeListener(ConfigurationContainerListener listener);
}
diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java
index 5d1083e..857b13d 100644
--- a/services/core/java/com/android/server/wm/WindowLayersController.java
+++ b/services/core/java/com/android/server/wm/WindowLayersController.java
@@ -101,7 +101,7 @@
mHighestLayerInImeTargetBaseLayer = Math.max(mHighestLayerInImeTargetBaseLayer,
w.mWinAnimator.mAnimLayer);
}
- if (w.getAppToken() != null && StackId.isResizeableByDockedStack(w.getStackId())) {
+ if (w.getAppToken() != null && w.inSplitScreenSecondaryWindowingMode()) {
mHighestDockedAffectedLayer = Math.max(mHighestDockedAffectedLayer,
w.mWinAnimator.mAnimLayer);
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index e8e40a7..1b05566 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1475,7 +1475,7 @@
// TODO: Another visibility method that was added late in the release to minimize risk.
@Override
public boolean canAffectSystemUiFlags() {
- final boolean shown = mWinAnimator.getShown() && mWinAnimator.mShownAlpha > 0f;
+ final boolean shown = mWinAnimator.getShown();
// We only consider the app to be exiting when the animation has started. After the app
// transition is executed the windows are marked exiting before the new windows have been
@@ -1489,7 +1489,12 @@
final boolean exiting = exitingSelf || mDestroying || appExiting;
final boolean translucent = mAttrs.alpha == 0.0f;
- return shown && !exiting && !translucent;
+
+ // If we are entering with a dummy animation, avoid affecting SystemUI flags until the
+ // transition is starting.
+ final boolean enteringWithDummyAnimation =
+ mWinAnimator.isDummyAnimation() && mWinAnimator.mShownAlpha == 0f;
+ return shown && !exiting && !translucent && !enteringWithDummyAnimation;
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index ddb8df2..1b7e527 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1652,7 +1652,14 @@
if (mWin.mAppToken != null) {
mWin.mAppToken.setCanTurnScreenOn(false);
}
- mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN;
+
+ // We do not add {@code SET_TURN_ON_SCREEN} when the screen is already
+ // interactive as the value may persist until the next animation, which could
+ // potentially occurring while turning off the screen. This would lead to the
+ // screen incorrectly turning back on.
+ if (!mService.mPowerManager.isInteractive()) {
+ mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN;
+ }
}
}
if (hasSurface()) {
diff --git a/services/core/jni/BroadcastRadio/NativeCallbackThread.cpp b/services/core/jni/BroadcastRadio/NativeCallbackThread.cpp
index 85ec9e0..81d46f3 100644
--- a/services/core/jni/BroadcastRadio/NativeCallbackThread.cpp
+++ b/services/core/jni/BroadcastRadio/NativeCallbackThread.cpp
@@ -48,15 +48,19 @@
return;
}
- while (!mExiting) {
- ALOGV("Waiting for task...");
+ while (true) {
Task task;
{
unique_lock<mutex> lk(mQueueMutex);
- mQueueCond.wait(lk);
- if (mExiting) break;
- if (mQueue.empty()) continue;
+ if (mExiting) break;
+ if (mQueue.empty()) {
+ ALOGV("Waiting for task...");
+ mQueueCond.wait(lk);
+ if (mExiting) break;
+ if (mQueue.empty()) continue;
+ }
+
task = mQueue.front();
mQueue.pop();
}
@@ -74,6 +78,7 @@
ALOGE_IF(res != JNI_OK, "Couldn't detach thread");
ALOGV("Native callback thread %p finished", this);
+ ALOGD_IF(!mQueue.empty(), "Skipped execution of %zu tasks", mQueue.size());
}
void NativeCallbackThread::enqueue(const Task &task) {
@@ -84,6 +89,7 @@
return;
}
+ ALOGV("Adding task to the queue...");
mQueue.push(task);
mQueueCond.notify_one();
}
diff --git a/services/core/jni/BroadcastRadio/Tuner.cpp b/services/core/jni/BroadcastRadio/Tuner.cpp
index 85603d5..e1ade4d 100644
--- a/services/core/jni/BroadcastRadio/Tuner.cpp
+++ b/services/core/jni/BroadcastRadio/Tuner.cpp
@@ -84,6 +84,7 @@
bool mIsClosed = false;
HalRevision mHalRev;
bool mWithAudio;
+ bool mIsAudioConnected = false;
Band mBand;
wp<V1_0::IBroadcastRadio> mHalModule;
wp<V1_1::IBroadcastRadio> mHalModule11;
@@ -142,6 +143,8 @@
// TODO(b/62713378): implement support for multiple tuners open at the same time
static void notifyAudioService(TunerContext& ctx, bool connected) {
if (!ctx.mWithAudio) return;
+ if (ctx.mIsAudioConnected == connected) return;
+ ctx.mIsAudioConnected = connected;
ALOGD("Notifying AudioService about new state: %d", connected);
auto token = IPCThreadState::self()->clearCallingIdentity();
@@ -265,6 +268,14 @@
return convert::BandConfigFromHal(env, halConfig, region).release();
}
+static void nativeSetMuted(JNIEnv *env, jobject obj, jlong nativeContext, bool mute) {
+ ALOGV("%s(%d)", __func__, mute);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ notifyAudioService(ctx, !mute);
+}
+
static void nativeStep(JNIEnv *env, jobject obj, jlong nativeContext,
bool directionDown, bool skipSubChannel) {
ALOGV("%s", __func__);
@@ -497,6 +508,7 @@
(void*)nativeSetConfiguration },
{ "nativeGetConfiguration", "(JI)Landroid/hardware/radio/RadioManager$BandConfig;",
(void*)nativeGetConfiguration },
+ { "nativeSetMuted", "(JZ)V", (void*)nativeSetMuted },
{ "nativeStep", "(JZZ)V", (void*)nativeStep },
{ "nativeScan", "(JZZ)V", (void*)nativeScan },
{ "nativeTune", "(JLandroid/hardware/radio/ProgramSelector;)V", (void*)nativeTune },
diff --git a/services/core/jni/BroadcastRadio/regions.cpp b/services/core/jni/BroadcastRadio/regions.cpp
index e313521..b856419 100644
--- a/services/core/jni/BroadcastRadio/regions.cpp
+++ b/services/core/jni/BroadcastRadio/regions.cpp
@@ -64,7 +64,7 @@
{
{ Region::ITU_2 },
{ Band::FM, Band::FM_HD },
- 87900,
+ 87700,
107900,
200,
Deemphasis::D75,
@@ -101,14 +101,14 @@
{ Region::ITU_1, Region::OIRT, Region::JAPAN, Region::KOREA },
{ Band::AM },
153,
- 279,
+ 282,
9,
},
{ // AM MW
{ Region::ITU_1, Region::OIRT, Region::JAPAN, Region::KOREA },
{ Band::AM },
531,
- 1611,
+ 1620,
9,
},
{ // AM SW
@@ -128,8 +128,8 @@
{ // AM MW ITU2
{ Region::ITU_2 },
{ Band::AM, Band::AM_HD },
- 540,
- 1610,
+ 530,
+ 1700,
10,
},
{ // AM SW ITU2
diff --git a/services/core/jni/com_android_server_am_BatteryStatsService.cpp b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
index 2dc388a..ae7d6da 100644
--- a/services/core/jni/com_android_server_am_BatteryStatsService.cpp
+++ b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
@@ -63,6 +63,12 @@
extern std::mutex gPowerHalMutex;
extern bool getPowerHal();
+// Java methods used in getLowPowerStats
+static jmethodID jgetAndUpdatePlatformState = NULL;
+static jmethodID jgetSubsystem = NULL;
+static jmethodID jputVoter = NULL;
+static jmethodID jputState = NULL;
+
static void wakeup_callback(bool success)
{
ALOGV("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
@@ -185,6 +191,97 @@
return mergedreasonpos - mergedreason;
}
+static void getLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject jrpmStats) {
+ if (jrpmStats == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException",
+ "The rpmstats jni input jobject jrpmStats is null.");
+ return;
+ }
+ if (jgetAndUpdatePlatformState == NULL || jgetSubsystem == NULL
+ || jputVoter == NULL || jputState == NULL) {
+ ALOGE("A rpmstats jni jmethodID is null.");
+ return;
+ }
+
+ std::lock_guard<std::mutex> lock(gPowerHalMutex);
+ if (!getPowerHal()) {
+ ALOGE("Power Hal not loaded");
+ return;
+ }
+
+ Return<void> ret = gPowerHalV1_0->getPlatformLowPowerStats(
+ [&env, &jrpmStats](hidl_vec<PowerStatePlatformSleepState> states, Status status) {
+
+ if (status != Status::SUCCESS) return;
+
+ for (size_t i = 0; i < states.size(); i++) {
+ const PowerStatePlatformSleepState& state = states[i];
+
+ jobject jplatformState = env->CallObjectMethod(jrpmStats,
+ jgetAndUpdatePlatformState,
+ env->NewStringUTF(state.name.c_str()),
+ state.residencyInMsecSinceBoot,
+ state.totalTransitions);
+ if (jplatformState == NULL) {
+ ALOGE("The rpmstats jni jobject jplatformState is null.");
+ return;
+ }
+
+ for (size_t j = 0; j < state.voters.size(); j++) {
+ const PowerStateVoter& voter = state.voters[j];
+ env->CallVoidMethod(jplatformState, jputVoter,
+ env->NewStringUTF(voter.name.c_str()),
+ voter.totalTimeInMsecVotedForSinceBoot,
+ voter.totalNumberOfTimesVotedSinceBoot);
+ }
+ }
+ });
+ if (!ret.isOk()) {
+ ALOGE("getLowPowerStats() failed: power HAL service not available");
+ gPowerHalV1_0 = nullptr;
+ return;
+ }
+
+ //Trying to cast to IPower 1.1, this will succeed only for devices supporting 1.1
+ sp<android::hardware::power::V1_1::IPower> gPowerHal_1_1
+ = android::hardware::power::V1_1::IPower::castFrom(gPowerHalV1_0);
+ if (gPowerHal_1_1 == nullptr) {
+ //This device does not support IPower@1.1, exiting gracefully
+ return;
+ }
+ ret = gPowerHal_1_1->getSubsystemLowPowerStats(
+ [&env, &jrpmStats](hidl_vec<PowerStateSubsystem> subsystems, Status status) {
+
+ if (status != Status::SUCCESS) return;
+
+ if (subsystems.size() > 0) {
+ for (size_t i = 0; i < subsystems.size(); i++) {
+ const PowerStateSubsystem &subsystem = subsystems[i];
+
+ jobject jsubsystem = env->CallObjectMethod(jrpmStats, jgetSubsystem,
+ env->NewStringUTF(subsystem.name.c_str()));
+ if (jsubsystem == NULL) {
+ ALOGE("The rpmstats jni jobject jsubsystem is null.");
+ return;
+ }
+
+ for (size_t j = 0; j < subsystem.states.size(); j++) {
+ const PowerStateSubsystemSleepState& state = subsystem.states[j];
+ env->CallVoidMethod(jsubsystem, jputState,
+ env->NewStringUTF(state.name.c_str()),
+ state.residencyInMsecSinceBoot,
+ state.totalTransitions);
+ }
+ }
+ }
+ });
+ if (!ret.isOk()) {
+ ALOGE("getSubsystemLowPowerStats() failed: power HAL service not available");
+ gPowerHalV1_0 = nullptr;
+ }
+ // gPowerHalMutex released here
+}
+
static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject outBuf) {
char *output = (char*)env->GetDirectBufferAddress(outBuf);
char *offset = output;
@@ -369,12 +466,33 @@
static const JNINativeMethod method_table[] = {
{ "nativeWaitWakeup", "(Ljava/nio/ByteBuffer;)I", (void*)nativeWaitWakeup },
+ { "getLowPowerStats", "(Lcom/android/internal/os/RpmStats;)V", (void*)getLowPowerStats },
{ "getPlatformLowPowerStats", "(Ljava/nio/ByteBuffer;)I", (void*)getPlatformLowPowerStats },
{ "getSubsystemLowPowerStats", "(Ljava/nio/ByteBuffer;)I", (void*)getSubsystemLowPowerStats },
};
int register_android_server_BatteryStatsService(JNIEnv *env)
{
+ // get java classes and methods
+ jclass clsRpmStats = env->FindClass("com/android/internal/os/RpmStats");
+ jclass clsPowerStatePlatformSleepState =
+ env->FindClass("com/android/internal/os/RpmStats$PowerStatePlatformSleepState");
+ jclass clsPowerStateSubsystem =
+ env->FindClass("com/android/internal/os/RpmStats$PowerStateSubsystem");
+ if (clsRpmStats == NULL || clsPowerStatePlatformSleepState == NULL
+ || clsPowerStateSubsystem == NULL) {
+ ALOGE("A rpmstats jni jclass is null.");
+ } else {
+ jgetAndUpdatePlatformState = env->GetMethodID(clsRpmStats, "getAndUpdatePlatformState",
+ "(Ljava/lang/String;JI)Lcom/android/internal/os/RpmStats$PowerStatePlatformSleepState;");
+ jgetSubsystem = env->GetMethodID(clsRpmStats, "getSubsystem",
+ "(Ljava/lang/String;)Lcom/android/internal/os/RpmStats$PowerStateSubsystem;");
+ jputVoter = env->GetMethodID(clsPowerStatePlatformSleepState, "putVoter",
+ "(Ljava/lang/String;JI)V");
+ jputState = env->GetMethodID(clsPowerStateSubsystem, "putState",
+ "(Ljava/lang/String;JI)V");
+ }
+
return jniRegisterNativeMethods(env, "com/android/server/am/BatteryStatsService",
method_table, NELEM(method_table));
}
diff --git a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
index f9cbd16..9a17635 100644
--- a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
+++ b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
@@ -113,7 +113,7 @@
hidl_handle h1(handleFromFileDescriptor(std::move(fd1))),
h2(handleFromFileDescriptor(std::move(fd2)));
- bool rval;
+ bool rval(false);
hidl_string msg;
const auto status = configInterface->setHandles(h1, h2,
[&rval, &msg](bool success, const hidl_string& errMsg) {
@@ -123,6 +123,8 @@
if (!status.isOk() || !rval) {
ALOGE("IOffloadConfig::setHandles() error: '%s' / '%s'",
status.description().c_str(), msg.c_str());
+ // If status is somehow not ok, make sure rval captures this too.
+ rval = false;
}
return rval;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index d6b5567..6c859f7 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -4101,6 +4101,7 @@
return true;
}
enforceFullCrossUsersPermission(userHandle);
+ enforceUserUnlocked(userHandle, parent);
synchronized (this) {
// This API can only be called by an active device admin,
@@ -4120,7 +4121,8 @@
enforceManagedProfile(userHandle, "call APIs refering to the parent profile");
synchronized (this) {
- int targetUser = getProfileParentId(userHandle);
+ final int targetUser = getProfileParentId(userHandle);
+ enforceUserUnlocked(targetUser, false);
DevicePolicyData policy = getUserDataUnchecked(getCredentialOwner(userHandle, false));
return isActivePasswordSufficientForUserLocked(policy, targetUser, false);
}
@@ -4128,7 +4130,15 @@
private boolean isActivePasswordSufficientForUserLocked(
DevicePolicyData policy, int userHandle, boolean parent) {
- enforceUserUnlocked(userHandle, parent);
+ final int requiredPasswordQuality = getPasswordQuality(null, userHandle, parent);
+ if (requiredPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
+ // A special case is when there is no required password quality, then we just return
+ // true since any password would be sufficient. This is for the scenario when a work
+ // profile is first created so there is no information about the current password but
+ // it should be considered sufficient as there is no password requirement either.
+ // This is useful since it short-circuits the password checkpoint for FDE device below.
+ return true;
+ }
if (!mInjector.storageManagerIsFileBasedEncryptionEnabled()
&& !policy.mPasswordStateHasBeenSetSinceBoot) {
@@ -4140,7 +4150,6 @@
return policy.mPasswordValidAtLastCheckpoint;
}
- final int requiredPasswordQuality = getPasswordQuality(null, userHandle, parent);
if (policy.mActivePasswordMetrics.quality < requiredPasswordQuality) {
return false;
}
@@ -4462,7 +4471,7 @@
result = mLockPatternUtils.setLockCredentialWithToken(password,
TextUtils.isEmpty(password) ? LockPatternUtils.CREDENTIAL_TYPE_NONE
: LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
- tokenHandle, token, userHandle);
+ quality, tokenHandle, token, userHandle);
}
boolean requireEntry = (flags & DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY) != 0;
if (requireEntry) {
@@ -5466,6 +5475,11 @@
}
}
+ /**
+ * Notify DPMS regarding the metric of the current password. This happens when the user changes
+ * the password, but also when the user just unlocks the keyguard. In comparison,
+ * reportPasswordChanged() is only called when the user changes the password.
+ */
@Override
public void setActivePasswordState(PasswordMetrics metrics, int userHandle) {
if (!mHasFeature) {
diff --git a/services/net/java/android/net/ip/IpReachabilityMonitor.java b/services/net/java/android/net/ip/IpReachabilityMonitor.java
index e833f6a..714b35a 100644
--- a/services/net/java/android/net/ip/IpReachabilityMonitor.java
+++ b/services/net/java/android/net/ip/IpReachabilityMonitor.java
@@ -205,44 +205,14 @@
final byte[] msg = RtNetlinkNeighborMessage.newNewNeighborMessage(
1, ip, StructNdMsg.NUD_PROBE, ifIndex, null);
- int errno = -OsConstants.EPROTO;
- try (NetlinkSocket nlSocket = new NetlinkSocket(OsConstants.NETLINK_ROUTE)) {
- final long IO_TIMEOUT = 300L;
- nlSocket.connectToKernel();
- nlSocket.sendMessage(msg, 0, msg.length, IO_TIMEOUT);
- final ByteBuffer bytes = nlSocket.recvMessage(IO_TIMEOUT);
- // recvMessage() guaranteed to not return null if it did not throw.
- final NetlinkMessage response = NetlinkMessage.parse(bytes);
- if (response != null && response instanceof NetlinkErrorMessage &&
- (((NetlinkErrorMessage) response).getNlMsgError() != null)) {
- errno = ((NetlinkErrorMessage) response).getNlMsgError().error;
- if (errno != 0) {
- // TODO: consider ignoring EINVAL (-22), which appears to be
- // normal when probing a neighbor for which the kernel does
- // not already have / no longer has a link layer address.
- Log.e(TAG, "Error " + msgSnippet + ", errmsg=" + response.toString());
- }
- } else {
- String errmsg;
- if (response == null) {
- bytes.position(0);
- errmsg = "raw bytes: " + NetlinkConstants.hexify(bytes);
- } else {
- errmsg = response.toString();
- }
- Log.e(TAG, "Error " + msgSnippet + ", errmsg=" + errmsg);
- }
+ try {
+ NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_ROUTE, msg);
} catch (ErrnoException e) {
- Log.e(TAG, "Error " + msgSnippet, e);
- errno = -e.errno;
- } catch (InterruptedIOException e) {
- Log.e(TAG, "Error " + msgSnippet, e);
- errno = -OsConstants.ETIMEDOUT;
- } catch (SocketException e) {
- Log.e(TAG, "Error " + msgSnippet, e);
- errno = -OsConstants.EIO;
+ Log.e(TAG, "Error " + msgSnippet + ": " + e);
+ return -e.errno;
}
- return errno;
+
+ return 0;
}
public IpReachabilityMonitor(Context context, String ifName, SharedLog log, Callback callback) {
diff --git a/services/net/java/android/net/netlink/ConntrackMessage.java b/services/net/java/android/net/netlink/ConntrackMessage.java
new file mode 100644
index 0000000..605c46b
--- /dev/null
+++ b/services/net/java/android/net/netlink/ConntrackMessage.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.netlink;
+
+import static android.net.netlink.NetlinkConstants.alignedLengthOf;
+import static android.net.netlink.StructNlAttr.makeNestedType;
+import static android.net.netlink.StructNlAttr.NLA_HEADERLEN;
+import static android.net.netlink.StructNlMsgHdr.NLM_F_ACK;
+import static android.net.netlink.StructNlMsgHdr.NLM_F_DUMP;
+import static android.net.netlink.StructNlMsgHdr.NLM_F_REPLACE;
+import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST;
+import static android.net.util.NetworkConstants.IPV4_ADDR_LEN;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+
+import android.system.OsConstants;
+import android.util.Log;
+import libcore.io.SizeOf;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+
+/**
+ * A NetlinkMessage subclass for netlink conntrack messages.
+ *
+ * see also: <linux_src>/include/uapi/linux/netfilter/nfnetlink_conntrack.h
+ *
+ * @hide
+ */
+public class ConntrackMessage extends NetlinkMessage {
+ public static final int STRUCT_SIZE = StructNlMsgHdr.STRUCT_SIZE + StructNfGenMsg.STRUCT_SIZE;
+
+ public static final short NFNL_SUBSYS_CTNETLINK = 1;
+ public static final short IPCTNL_MSG_CT_NEW = 0;
+
+ // enum ctattr_type
+ public static final short CTA_TUPLE_ORIG = 1;
+ public static final short CTA_TUPLE_REPLY = 2;
+ public static final short CTA_TIMEOUT = 7;
+
+ // enum ctattr_tuple
+ public static final short CTA_TUPLE_IP = 1;
+ public static final short CTA_TUPLE_PROTO = 2;
+
+ // enum ctattr_ip
+ public static final short CTA_IP_V4_SRC = 1;
+ public static final short CTA_IP_V4_DST = 2;
+
+ // enum ctattr_l4proto
+ public static final short CTA_PROTO_NUM = 1;
+ public static final short CTA_PROTO_SRC_PORT = 2;
+ public static final short CTA_PROTO_DST_PORT = 3;
+
+ public static byte[] newIPv4TimeoutUpdateRequest(
+ int proto, Inet4Address src, int sport, Inet4Address dst, int dport, int timeoutSec) {
+ // *** STYLE WARNING ***
+ //
+ // Code below this point uses extra block indentation to highlight the
+ // packing of nested tuple netlink attribute types.
+ final StructNlAttr ctaTupleOrig = new StructNlAttr(CTA_TUPLE_ORIG,
+ new StructNlAttr(CTA_TUPLE_IP,
+ new StructNlAttr(CTA_IP_V4_SRC, src),
+ new StructNlAttr(CTA_IP_V4_DST, dst)),
+ new StructNlAttr(CTA_TUPLE_PROTO,
+ new StructNlAttr(CTA_PROTO_NUM, (byte) proto),
+ new StructNlAttr(CTA_PROTO_SRC_PORT, (short) sport, BIG_ENDIAN),
+ new StructNlAttr(CTA_PROTO_DST_PORT, (short) dport, BIG_ENDIAN)));
+
+ final StructNlAttr ctaTimeout = new StructNlAttr(CTA_TIMEOUT, timeoutSec, BIG_ENDIAN);
+
+ final int payloadLength = ctaTupleOrig.getAlignedLength() + ctaTimeout.getAlignedLength();
+ final byte[] bytes = new byte[STRUCT_SIZE + payloadLength];
+ final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
+ byteBuffer.order(ByteOrder.nativeOrder());
+
+ final ConntrackMessage ctmsg = new ConntrackMessage();
+ ctmsg.mHeader.nlmsg_len = bytes.length;
+ ctmsg.mHeader.nlmsg_type = (NFNL_SUBSYS_CTNETLINK << 8) | IPCTNL_MSG_CT_NEW;
+ ctmsg.mHeader.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE;
+ ctmsg.mHeader.nlmsg_seq = 1;
+ ctmsg.pack(byteBuffer);
+
+ ctaTupleOrig.pack(byteBuffer);
+ ctaTimeout.pack(byteBuffer);
+
+ return bytes;
+ }
+
+ protected StructNfGenMsg mNfGenMsg;
+
+ private ConntrackMessage() {
+ super(new StructNlMsgHdr());
+ mNfGenMsg = new StructNfGenMsg((byte) OsConstants.AF_INET);
+ }
+
+ public void pack(ByteBuffer byteBuffer) {
+ mHeader.pack(byteBuffer);
+ mNfGenMsg.pack(byteBuffer);
+ }
+}
diff --git a/services/net/java/android/net/netlink/NetlinkSocket.java b/services/net/java/android/net/netlink/NetlinkSocket.java
index 657d48c..a9e0cd9 100644
--- a/services/net/java/android/net/netlink/NetlinkSocket.java
+++ b/services/net/java/android/net/netlink/NetlinkSocket.java
@@ -51,6 +51,47 @@
private long mLastRecvTimeoutMs;
private long mLastSendTimeoutMs;
+ public static void sendOneShotKernelMessage(int nlProto, byte[] msg) throws ErrnoException {
+ final String errPrefix = "Error in NetlinkSocket.sendOneShotKernelMessage";
+
+ try (NetlinkSocket nlSocket = new NetlinkSocket(nlProto)) {
+ final long IO_TIMEOUT = 300L;
+ nlSocket.connectToKernel();
+ nlSocket.sendMessage(msg, 0, msg.length, IO_TIMEOUT);
+ final ByteBuffer bytes = nlSocket.recvMessage(IO_TIMEOUT);
+ // recvMessage() guaranteed to not return null if it did not throw.
+ final NetlinkMessage response = NetlinkMessage.parse(bytes);
+ if (response != null && response instanceof NetlinkErrorMessage &&
+ (((NetlinkErrorMessage) response).getNlMsgError() != null)) {
+ final int errno = ((NetlinkErrorMessage) response).getNlMsgError().error;
+ if (errno != 0) {
+ // TODO: consider ignoring EINVAL (-22), which appears to be
+ // normal when probing a neighbor for which the kernel does
+ // not already have / no longer has a link layer address.
+ Log.e(TAG, errPrefix + ", errmsg=" + response.toString());
+ // Note: convert kernel errnos (negative) into userspace errnos (positive).
+ throw new ErrnoException(response.toString(), Math.abs(errno));
+ }
+ } else {
+ final String errmsg;
+ if (response == null) {
+ bytes.position(0);
+ errmsg = "raw bytes: " + NetlinkConstants.hexify(bytes);
+ } else {
+ errmsg = response.toString();
+ }
+ Log.e(TAG, errPrefix + ", errmsg=" + errmsg);
+ throw new ErrnoException(errmsg, OsConstants.EPROTO);
+ }
+ } catch (InterruptedIOException e) {
+ Log.e(TAG, errPrefix, e);
+ throw new ErrnoException(errPrefix, OsConstants.ETIMEDOUT, e);
+ } catch (SocketException e) {
+ Log.e(TAG, errPrefix, e);
+ throw new ErrnoException(errPrefix, OsConstants.EIO, e);
+ }
+ }
+
public NetlinkSocket(int nlProto) throws ErrnoException {
mDescriptor = Os.socket(
OsConstants.AF_NETLINK, OsConstants.SOCK_DGRAM, nlProto);
diff --git a/services/net/java/android/net/netlink/RtNetlinkNeighborMessage.java b/services/net/java/android/net/netlink/RtNetlinkNeighborMessage.java
index 02df131..e784fbb 100644
--- a/services/net/java/android/net/netlink/RtNetlinkNeighborMessage.java
+++ b/services/net/java/android/net/netlink/RtNetlinkNeighborMessage.java
@@ -36,7 +36,7 @@
/**
- * A NetlinkMessage subclass for netlink error messages.
+ * A NetlinkMessage subclass for rtnetlink neighbor messages.
*
* see also: <linux_src>/include/uapi/linux/neighbour.h
*
diff --git a/services/net/java/android/net/netlink/StructNfGenMsg.java b/services/net/java/android/net/netlink/StructNfGenMsg.java
new file mode 100644
index 0000000..99695e2
--- /dev/null
+++ b/services/net/java/android/net/netlink/StructNfGenMsg.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.net.netlink;
+
+import libcore.io.SizeOf;
+
+import java.nio.ByteBuffer;
+
+
+/**
+ * struct nfgenmsg
+ *
+ * see <linux_src>/include/uapi/linux/netfilter/nfnetlink.h
+ *
+ * @hide
+ */
+public class StructNfGenMsg {
+ public static final int STRUCT_SIZE = 2 + SizeOf.SHORT;
+
+ public static final int NFNETLINK_V0 = 0;
+
+ final public byte nfgen_family;
+ final public byte version;
+ final public short res_id; // N.B.: this is big endian in the kernel
+
+ public StructNfGenMsg(byte family) {
+ nfgen_family = family;
+ version = (byte) NFNETLINK_V0;
+ res_id = (short) 0;
+ }
+
+ public void pack(ByteBuffer byteBuffer) {
+ byteBuffer.put(nfgen_family);
+ byteBuffer.put(version);
+ byteBuffer.putShort(res_id);
+ }
+}
diff --git a/services/net/java/android/net/netlink/StructNlAttr.java b/services/net/java/android/net/netlink/StructNlAttr.java
index 597a6aa..811bdbb 100644
--- a/services/net/java/android/net/netlink/StructNlAttr.java
+++ b/services/net/java/android/net/netlink/StructNlAttr.java
@@ -34,7 +34,12 @@
*/
public class StructNlAttr {
// Already aligned.
- public static final int NLA_HEADERLEN = 4;
+ public static final int NLA_HEADERLEN = 4;
+ public static final int NLA_F_NESTED = (1 << 15);
+
+ public static short makeNestedType(short type) {
+ return (short) (type | NLA_F_NESTED);
+ }
// Return a (length, type) object only, without consuming any bytes in
// |byteBuffer| and without copying or interpreting any value bytes.
@@ -46,10 +51,17 @@
}
final int baseOffset = byteBuffer.position();
- final StructNlAttr struct = new StructNlAttr();
- struct.nla_len = byteBuffer.getShort();
- struct.nla_type = byteBuffer.getShort();
- struct.mByteOrder = byteBuffer.order();
+ // Assume the byte order of the buffer is the expected byte order of the value.
+ final StructNlAttr struct = new StructNlAttr(byteBuffer.order());
+ // The byte order of nla_len and nla_type is always native.
+ final ByteOrder originalOrder = byteBuffer.order();
+ byteBuffer.order(ByteOrder.nativeOrder());
+ try {
+ struct.nla_len = byteBuffer.getShort();
+ struct.nla_type = byteBuffer.getShort();
+ } finally {
+ byteBuffer.order(originalOrder);
+ }
byteBuffer.position(baseOffset);
if (struct.nla_len < NLA_HEADERLEN) {
@@ -78,13 +90,65 @@
return struct;
}
- public short nla_len;
+ public short nla_len = (short) NLA_HEADERLEN;
public short nla_type;
public byte[] nla_value;
- public ByteOrder mByteOrder;
- public StructNlAttr() {
- mByteOrder = ByteOrder.nativeOrder();
+ // The byte order used to read/write the value member. Netlink length and
+ // type members are always read/written in native order.
+ private ByteOrder mByteOrder = ByteOrder.nativeOrder();
+
+ public StructNlAttr() {}
+
+ public StructNlAttr(ByteOrder byteOrder) {
+ mByteOrder = byteOrder;
+ }
+
+ public StructNlAttr(short type, byte value) {
+ nla_type = type;
+ setValue(new byte[1]);
+ nla_value[0] = value;
+ }
+
+ public StructNlAttr(short type, short value) {
+ this(type, value, ByteOrder.nativeOrder());
+ }
+
+ public StructNlAttr(short type, short value, ByteOrder order) {
+ this(order);
+ nla_type = type;
+ setValue(new byte[SizeOf.SHORT]);
+ getValueAsByteBuffer().putShort(value);
+ }
+
+ public StructNlAttr(short type, int value) {
+ this(type, value, ByteOrder.nativeOrder());
+ }
+
+ public StructNlAttr(short type, int value, ByteOrder order) {
+ this(order);
+ nla_type = type;
+ setValue(new byte[SizeOf.INT]);
+ getValueAsByteBuffer().putInt(value);
+ }
+
+ public StructNlAttr(short type, InetAddress ip) {
+ nla_type = type;
+ setValue(ip.getAddress());
+ }
+
+ public StructNlAttr(short type, StructNlAttr... nested) {
+ this();
+ nla_type = makeNestedType(type);
+
+ int payloadLength = 0;
+ for (StructNlAttr nla : nested) payloadLength += nla.getAlignedLength();
+ setValue(new byte[payloadLength]);
+
+ final ByteBuffer buf = getValueAsByteBuffer();
+ for (StructNlAttr nla : nested) {
+ nla.pack(buf);
+ }
}
public int getAlignedLength() {
@@ -117,13 +181,25 @@
}
public void pack(ByteBuffer byteBuffer) {
+ final ByteOrder originalOrder = byteBuffer.order();
final int originalPosition = byteBuffer.position();
- byteBuffer.putShort(nla_len);
- byteBuffer.putShort(nla_type);
- byteBuffer.put(nla_value);
+
+ byteBuffer.order(ByteOrder.nativeOrder());
+ try {
+ byteBuffer.putShort(nla_len);
+ byteBuffer.putShort(nla_type);
+ if (nla_value != null) byteBuffer.put(nla_value);
+ } finally {
+ byteBuffer.order(originalOrder);
+ }
byteBuffer.position(originalPosition + getAlignedLength());
}
+ private void setValue(byte[] value) {
+ nla_value = value;
+ nla_len = (short) (NLA_HEADERLEN + ((nla_value != null) ? nla_value.length : 0));
+ }
+
@Override
public String toString() {
return "StructNlAttr{ "
diff --git a/services/robotests/Android.mk b/services/robotests/Android.mk
index 7171762..322b891 100644
--- a/services/robotests/Android.mk
+++ b/services/robotests/Android.mk
@@ -45,7 +45,6 @@
# Include the testing libraries (JUnit4 + Robolectric libs).
LOCAL_STATIC_JAVA_LIBRARIES := \
- platform-system-robolectric \
truth-prebuilt
LOCAL_JAVA_LIBRARIES := \
diff --git a/services/tests/notification/AndroidTest.xml b/services/tests/notification/AndroidTest.xml
index fa77407..448bc3d 100644
--- a/services/tests/notification/AndroidTest.xml
+++ b/services/tests/notification/AndroidTest.xml
@@ -23,6 +23,6 @@
<option name="test-tag" value="FrameworksNotificationTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.frameworks.tests.notification" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="android.testing.TestableInstrumentation" />
</test>
</configuration>
diff --git a/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
index 613f01c..a4b9b25 100644
--- a/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
@@ -254,6 +254,14 @@
loadXml(service);
verifyExpectedApprovedEntries(service);
+
+ int[] invalidUsers = new int[] {98, 99};
+ for (int invalidUser : invalidUsers) {
+ assertFalse("service type " + service.mApprovalLevel + ":"
+ + invalidUser + " is allowed for user " + invalidUser,
+ service.isPackageOrComponentAllowed(
+ String.valueOf(invalidUser), invalidUser));
+ }
}
}
@@ -616,6 +624,14 @@
xml.append(getXmlEntry(
mExpectedSecondary.get(service.mApprovalLevel).get(userId), userId, false));
}
+ xml.append("<" + ManagedServices.TAG_MANAGED_SERVICES + " "
+ + ManagedServices.ATT_USER_ID + "=\"99\" "
+ + ManagedServices.ATT_IS_PRIMARY + "=\"true\" "
+ + ManagedServices.ATT_APPROVED_LIST + "=\"99\" />\n");
+ xml.append("<" + ManagedServices.TAG_MANAGED_SERVICES + " "
+ + ManagedServices.ATT_USER_ID + "=\"98\" "
+ + ManagedServices.ATT_IS_PRIMARY + "=\"false\" "
+ + ManagedServices.ATT_APPROVED_LIST + "=\"98\" />\n");
xml.append("</" + service.getConfig().xmlTag + ">");
XmlPullParser parser = Xml.newPullParser();
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java b/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java
index 0dba35f..e3ee47f 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java
@@ -16,6 +16,7 @@
package com.android.server.accessibility;
+import android.app.Notification;
import android.os.Handler;
import android.os.Message;
import android.util.Pair;
@@ -49,7 +50,7 @@
public void sendOneMessage() {
Message message = timedMessages.remove(0).first;
removeMessages(message.what, message.obj);
- mCallback.handleMessage(message);
+ dispatchMessage(message);
removeStaleMessages();
}
@@ -62,7 +63,7 @@
public void sendLastMessage() {
Message message = timedMessages.remove(timedMessages.size() - 1).first;
removeMessages(message.what, message.obj);
- mCallback.handleMessage(message);
+ dispatchMessage(message);
removeStaleMessages();
}
@@ -79,4 +80,12 @@
}
}
}
+
+ public void dispatchMessage(Message m) {
+ if (mCallback != null) {
+ mCallback.handleMessage(m);
+ return;
+ }
+ super.dispatchMessage(m);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java
index f63d438..6311d00 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java
@@ -19,7 +19,9 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.accessibilityservice.AccessibilityServiceInfo;
@@ -29,7 +31,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.view.WindowManagerInternal;
@@ -38,6 +39,7 @@
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -49,6 +51,8 @@
final UiAutomationManager mUiAutomationManager = new UiAutomationManager();
+ MessageCapturingHandler mMessageCapturingHandler;
+
@Mock AccessibilityManagerService.UserState mMockUserState;
@Mock Context mMockContext;
@Mock AccessibilityServiceInfo mMockServiceInfo;
@@ -68,7 +72,6 @@
}
}
-
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
@@ -80,6 +83,8 @@
mMockResolveInfo.serviceInfo.applicationInfo = mock(ApplicationInfo.class);
when(mMockAccessibilityServiceClient.asBinder()).thenReturn(mMockServiceAsBinder);
+
+ mMessageCapturingHandler = new MessageCapturingHandler(null);
}
@Test
@@ -146,10 +151,20 @@
assertEquals(0, mUiAutomationManager.getRequestedEventMaskLocked());
}
+ @Test
+ public void uiAutomationBinderDiesBeforeConnecting_shouldNotCrash() throws Exception {
+ register(0);
+ ArgumentCaptor<IBinder.DeathRecipient> captor = ArgumentCaptor.forClass(
+ IBinder.DeathRecipient.class);
+ verify(mMockOwner).linkToDeath(captor.capture(), anyInt());
+ captor.getValue().binderDied();
+ mMessageCapturingHandler.sendAllMessages();
+ }
+
private void register(int flags) {
mUiAutomationManager.registerUiTestAutomationServiceLocked(mMockOwner,
mMockAccessibilityServiceClient, mMockContext, mMockServiceInfo, SERVICE_ID,
- new Handler(), new Object(), mMockSecurityPolicy, mMockSystemSupport,
+ mMessageCapturingHandler, new Object(), mMockSecurityPolicy, mMockSystemSupport,
mMockWindowManagerInternal, mMockGlobalActionPerformer, flags);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 5b8df299..b534544 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -281,8 +281,7 @@
}
@Override
- protected T createStackWindowController(int displayId, boolean onTop, Rect outBounds,
- Configuration overrideConfig) {
+ protected T createStackWindowController(int displayId, boolean onTop, Rect outBounds) {
mContainerController = (T) WindowTestUtils.createMockStackWindowContainerController();
return mContainerController;
}
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 e8a1811..87b0db8 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -3658,7 +3658,8 @@
// test reset password with token
when(getServices().lockPatternUtils.setLockCredentialWithToken(eq(password),
- eq(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD), eq(handle), eq(token),
+ eq(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD),
+ eq(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED), eq(handle), eq(token),
eq(UserHandle.USER_SYSTEM)))
.thenReturn(true);
assertTrue(dpm.resetPasswordWithToken(admin1, password, token, 0));
diff --git a/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java b/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
index 70d2274..afe432b 100644
--- a/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
@@ -32,7 +32,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
import android.os.IDeviceIdleController;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -117,7 +116,6 @@
intentFilter.addAction(ACTION_JOB_STARTED);
intentFilter.addAction(ACTION_JOB_STOPPED);
mContext.registerReceiver(mJobStateChangeReceiver, intentFilter);
- setGlobalSwitch(true);
setAppOpsModeAllowed(true);
setPowerWhiteListed(false);
}
@@ -133,16 +131,6 @@
}
@Test
- public void testGlobalSwitch() throws Exception {
- setGlobalSwitch(false); // Job should not stop now.
- scheduleAndAssertJobStarted();
- setAppOpsModeAllowed(false);
- mIActivityManager.makePackageIdle(TEST_APP_PACKAGE, UserHandle.USER_CURRENT);
- assertFalse("Job stopped even when feature switch is off",
- awaitJobStop(DEFAULT_WAIT_TIMEOUT));
- }
-
- @Test
public void testPowerWhiteList() throws Exception {
scheduleAndAssertJobStarted();
setAppOpsModeAllowed(false);
@@ -164,16 +152,10 @@
cancelJobsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(cancelJobsIntent);
mContext.unregisterReceiver(mJobStateChangeReceiver);
- setGlobalSwitch(false);
setAppOpsModeAllowed(true);
setPowerWhiteListed(false);
}
- private void setGlobalSwitch(boolean enabled) {
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.JOB_SCHEDULER_CONSTANTS, "bg_jobs_restricted=" + enabled);
- }
-
private void setPowerWhiteListed(boolean whitelist) throws RemoteException {
if (whitelist) {
mDeviceIdleController.addPowerSaveWhitelistApp(TEST_APP_PACKAGE);
@@ -182,7 +164,7 @@
}
}
- private void setAppOpsModeAllowed(boolean allow) throws PackageManager.NameNotFoundException {
+ private void setAppOpsModeAllowed(boolean allow) {
mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mTestPackageUid,
TEST_APP_PACKAGE, allow ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
index 0df834f..0916a33 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
@@ -21,6 +21,7 @@
import android.app.IActivityManager;
import android.content.Context;
import android.os.Handler;
+import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.os.storage.IStorageManager;
@@ -56,7 +57,7 @@
@Override
public Handler getHandler() {
- return mock(Handler.class);
+ return new Handler(Looper.getMainLooper());
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
index fd77de3..2c9aa9d 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -23,8 +23,9 @@
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_ENABLED_KEY;
import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_HANDLE_KEY;
+import static org.mockito.Mockito.verify;
-import android.app.admin.DevicePolicyManager;
+import android.app.admin.PasswordMetrics;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -272,14 +273,22 @@
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();
+ 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(), PASSWORD_QUALITY_SOMETHING, PRIMARY_USER_ID);
+ // Verify DPM gets notified about new device lock
+ mService.mHandler.runWithScissors(() -> {}, 0 /*now*/); // Flush runnables on handler
+ PasswordMetrics metric = PasswordMetrics.computeForPassword(PATTERN);
+ metric.quality = PASSWORD_QUALITY_SOMETHING;
+ verify(mDevicePolicyManager).setActivePasswordState(metric, PRIMARY_USER_ID);
+
assertEquals(VerifyCredentialResponse.RESPONSE_OK,
- mService.verifyCredential(PATTERN, LockPatternUtils.CREDENTIAL_TYPE_PATTERN, 0, PRIMARY_USER_ID).getResponseCode());
+ mService.verifyCredential(PATTERN, LockPatternUtils.CREDENTIAL_TYPE_PATTERN, 0,
+ PRIMARY_USER_ID).getResponseCode());
assertArrayEquals(storageKey, mStorageManager.getUserUnlockToken(PRIMARY_USER_ID));
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java
index 9f77297..d136614 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java
@@ -55,11 +55,11 @@
public void testWriteReadApplicationRestrictions() throws IOException {
AtomicFile atomicFile = new AtomicFile(restrictionsFile);
Bundle bundle = createBundle();
- UserManagerService.writeApplicationRestrictionsLP(bundle, atomicFile);
+ UserManagerService.writeApplicationRestrictionsLAr(bundle, atomicFile);
assertTrue(atomicFile.getBaseFile().exists());
String s = FileUtils.readTextFile(restrictionsFile, 10000, "");
System.out.println("restrictionsFile: " + s);
- bundle = UserManagerService.readApplicationRestrictionsLP(atomicFile);
+ bundle = UserManagerService.readApplicationRestrictionsLAr(atomicFile);
System.out.println("readApplicationRestrictionsLocked bundle: " + bundle);
assertBundle(bundle);
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
index 2c56a82..150f7f0 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
@@ -16,10 +16,14 @@
package com.android.server.pm.dex;
+import com.android.server.pm.PackageDexOptimizer;
+
+import static com.android.server.pm.PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import android.content.pm.ApplicationInfo;
import android.support.test.filters.SmallTest;
@@ -46,22 +50,35 @@
private static final String DELEGATE_LAST_CLASS_LOADER_NAME =
DelegateLastClassLoader.class.getName();
- private ApplicationInfo createMockApplicationInfo(String baseClassLoader, boolean addSplits,
+ private static class TestData {
+ ApplicationInfo info;
+ boolean[] pathsWithCode;
+ }
+
+ private TestData createMockApplicationInfo(String baseClassLoader, boolean addSplits,
boolean addSplitDependencies) {
ApplicationInfo ai = new ApplicationInfo();
String codeDir = "/data/app/mock.android.com";
ai.setBaseCodePath(codeDir + "/base.dex");
ai.classLoaderName = baseClassLoader;
ai.privateFlags = ai.privateFlags | ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING;
+ boolean[] pathsWithCode;
+ if (!addSplits) {
+ pathsWithCode = new boolean[] {true};
+ } else {
+ pathsWithCode = new boolean[9];
+ Arrays.fill(pathsWithCode, true);
+ pathsWithCode[7] = false; // config split
- if (addSplits) {
ai.setSplitCodePaths(new String[]{
codeDir + "/base-1.dex",
codeDir + "/base-2.dex",
codeDir + "/base-3.dex",
codeDir + "/base-4.dex",
codeDir + "/base-5.dex",
- codeDir + "/base-6.dex"});
+ codeDir + "/base-6.dex",
+ codeDir + "/config-split-7.dex",
+ codeDir + "/feature-no-deps.dex"});
ai.splitClassLoaderNames = new String[]{
DELEGATE_LAST_CLASS_LOADER_NAME,
@@ -69,7 +86,9 @@
PATH_CLASS_LOADER_NAME,
DEX_CLASS_LOADER_NAME,
PATH_CLASS_LOADER_NAME,
- null}; // A null class loader name should default to PathClassLoader.
+ null, // A null class loader name should default to PathClassLoader.
+ null, // The config split gets a null class loader.
+ null}; // The feature split with no dependency and no specified class loader.
if (addSplitDependencies) {
ai.splitDependencies = new SparseArray<>(ai.splitClassLoaderNames.length + 1);
ai.splitDependencies.put(0, new int[] {-1}); // base has no dependency
@@ -79,18 +98,24 @@
ai.splitDependencies.put(4, new int[] {0}); // split 4 depends on base
ai.splitDependencies.put(5, new int[] {0}); // split 5 depends on base
ai.splitDependencies.put(6, new int[] {5}); // split 6 depends on 5
+ // Do not add the config split to the dependency list.
+ // Do not add the feature split with no dependency to the dependency list.
}
}
- return ai;
+ TestData data = new TestData();
+ data.info = ai;
+ data.pathsWithCode = pathsWithCode;
+ return data;
}
@Test
public void testSplitChain() {
- ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, true);
+ TestData data = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, true);
String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
- assertEquals(7, contexts.length);
+ assertEquals(9, contexts.length);
assertEquals("PCL[a.dex:b.dex]", contexts[0]);
assertEquals("DLC[];DLC[base-2.dex];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]",
contexts[1]);
@@ -99,15 +124,18 @@
assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[4]);
assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[5]);
assertEquals("PCL[];PCL[base-5.dex];PCL[a.dex:b.dex:base.dex]", contexts[6]);
+ assertEquals(null, contexts[7]); // config split
+ assertEquals("PCL[]", contexts[8]); // feature split with no dependency
}
@Test
public void testSplitChainNoSplitDependencies() {
- ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, false);
+ TestData data = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, false);
String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
- assertEquals(7, contexts.length);
+ assertEquals(9, contexts.length);
assertEquals("PCL[a.dex:b.dex]", contexts[0]);
assertEquals("PCL[a.dex:b.dex:base.dex]", contexts[1]);
assertEquals("PCL[a.dex:b.dex:base.dex:base-1.dex]", contexts[2]);
@@ -119,15 +147,21 @@
assertEquals(
"PCL[a.dex:b.dex:base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex:base-5.dex]",
contexts[6]);
+ assertEquals(null, contexts[7]); // config split
+ assertEquals(
+ "PCL[a.dex:b.dex:base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex:base-5.dex:base-6.dex:config-split-7.dex]",
+ contexts[8]); // feature split with no dependency
}
@Test
public void testSplitChainNoIsolationNoSharedLibrary() {
- ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, true);
- ai.privateFlags = ai.privateFlags & (~ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING);
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+ TestData data = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, true);
+ data.info.privateFlags = data.info.privateFlags
+ & (~ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, null, data.pathsWithCode);
- assertEquals(7, contexts.length);
+ assertEquals(9, contexts.length);
assertEquals("PCL[]", contexts[0]);
assertEquals("PCL[base.dex]", contexts[1]);
assertEquals("PCL[base.dex:base-1.dex]", contexts[2]);
@@ -137,14 +171,20 @@
assertEquals(
"PCL[base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex:base-5.dex]",
contexts[6]);
+ assertEquals(null, contexts[7]); // config split
+ assertEquals(
+ "PCL[base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex:base-5.dex:base-6.dex:config-split-7.dex]",
+ contexts[8]); // feature split with no dependency
}
+
@Test
public void testSplitChainNoSharedLibraries() {
- ApplicationInfo ai = createMockApplicationInfo(
+ TestData data = createMockApplicationInfo(
DELEGATE_LAST_CLASS_LOADER_NAME, true, true);
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, null, data.pathsWithCode);
- assertEquals(7, contexts.length);
+ assertEquals(9, contexts.length);
assertEquals("DLC[]", contexts[0]);
assertEquals("DLC[];DLC[base-2.dex];PCL[base-4.dex];DLC[base.dex]", contexts[1]);
assertEquals("DLC[];PCL[base-4.dex];DLC[base.dex]", contexts[2]);
@@ -152,16 +192,19 @@
assertEquals("PCL[];DLC[base.dex]", contexts[4]);
assertEquals("PCL[];DLC[base.dex]", contexts[5]);
assertEquals("PCL[];PCL[base-5.dex];DLC[base.dex]", contexts[6]);
+ assertEquals(null, contexts[7]); // config split
+ assertEquals("PCL[]", contexts[8]); // feature split with no dependency
}
@Test
public void testSplitChainWithNullPrimaryClassLoader() {
// A null classLoaderName should mean PathClassLoader.
- ApplicationInfo ai = createMockApplicationInfo(null, true, true);
+ TestData data = createMockApplicationInfo(null, true, true);
String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
- assertEquals(7, contexts.length);
+ assertEquals(9, contexts.length);
assertEquals("PCL[a.dex:b.dex]", contexts[0]);
assertEquals("DLC[];DLC[base-2.dex];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[1]);
assertEquals("DLC[];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[2]);
@@ -169,13 +212,16 @@
assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[4]);
assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[5]);
assertEquals("PCL[];PCL[base-5.dex];PCL[a.dex:b.dex:base.dex]", contexts[6]);
+ assertEquals(null, contexts[7]); // config split
+ assertEquals("PCL[]", contexts[8]); // feature split with no dependency
}
@Test
public void tesNoSplits() {
- ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, false, false);
+ TestData data = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, false, false);
String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
assertEquals(1, contexts.length);
assertEquals("PCL[a.dex:b.dex]", contexts[0]);
@@ -183,9 +229,10 @@
@Test
public void tesNoSplitsNullClassLoaderName() {
- ApplicationInfo ai = createMockApplicationInfo(null, false, false);
+ TestData data = createMockApplicationInfo(null, false, false);
String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
assertEquals(1, contexts.length);
assertEquals("PCL[a.dex:b.dex]", contexts[0]);
@@ -193,10 +240,11 @@
@Test
public void tesNoSplitDelegateLast() {
- ApplicationInfo ai = createMockApplicationInfo(
+ TestData data = createMockApplicationInfo(
DELEGATE_LAST_CLASS_LOADER_NAME, false, false);
String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
assertEquals(1, contexts.length);
assertEquals("DLC[a.dex:b.dex]", contexts[0]);
@@ -204,8 +252,9 @@
@Test
public void tesNoSplitsNoSharedLibraries() {
- ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, false, false);
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+ TestData data = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, false, false);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, null, data.pathsWithCode);
assertEquals(1, contexts.length);
assertEquals("PCL[]", contexts[0]);
@@ -213,15 +262,55 @@
@Test
public void tesNoSplitDelegateLastNoSharedLibraries() {
- ApplicationInfo ai = createMockApplicationInfo(
+ TestData data = createMockApplicationInfo(
DELEGATE_LAST_CLASS_LOADER_NAME, false, false);
- String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, null, data.pathsWithCode);
assertEquals(1, contexts.length);
assertEquals("DLC[]", contexts[0]);
}
@Test
+ public void testContextWithNoCode() {
+ TestData data = createMockApplicationInfo(null, true, false);
+ Arrays.fill(data.pathsWithCode, false);
+
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
+
+ assertEquals(9, contexts.length);
+ assertEquals(null, contexts[0]);
+ assertEquals(null, contexts[1]);
+ assertEquals(null, contexts[2]);
+ assertEquals(null, contexts[3]);
+ assertEquals(null, contexts[4]);
+ assertEquals(null, contexts[5]);
+ assertEquals(null, contexts[6]);
+ assertEquals(null, contexts[7]);
+ }
+
+ @Test
+ public void testContextBaseNoCode() {
+ TestData data = createMockApplicationInfo(null, true, true);
+ data.pathsWithCode[0] = false;
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(
+ data.info, sharedLibrary, data.pathsWithCode);
+
+ assertEquals(9, contexts.length);
+ assertEquals(null, contexts[0]);
+ assertEquals("DLC[];DLC[base-2.dex];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[1]);
+ assertEquals("DLC[];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[2]);
+ assertEquals("PCL[];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[3]);
+ assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[4]);
+ assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[5]);
+ assertEquals("PCL[];PCL[base-5.dex];PCL[a.dex:b.dex:base.dex]", contexts[6]);
+ assertEquals(null, contexts[7]);
+ }
+
+ @Test
public void testProcessContextForDexLoad() {
List<String> classLoaders = Arrays.asList(
DELEGATE_LAST_CLASS_LOADER_NAME,
@@ -284,4 +373,49 @@
}
assertTrue(gotException);
}
+
+ @Test
+ public void testEncodeClassLoader() {
+ assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader(
+ SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.PathClassLoader"));
+ assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader(
+ SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.DexClassLoader"));
+ assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader(
+ SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.DelegateLastClassLoader"));
+ assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz",
+ "dalvik.system.PathClassLoader"));
+ assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz",
+ "dalvik.system.DexClassLoader"));
+ assertEquals("DLC[xyz]", DexoptUtils.encodeClassLoader("xyz",
+ "dalvik.system.DelegateLastClassLoader"));
+ assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz", null));
+ assertEquals("abc[xyz]", DexoptUtils.encodeClassLoader("xyz", "abc"));
+
+ try {
+ DexoptUtils.encodeClassLoader(null, "abc");
+ fail(); // Exception should be caught.
+ } catch (NullPointerException expected) {}
+ }
+
+ @Test
+ public void testEncodeClassLoaderChain() {
+ assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain(
+ SKIP_SHARED_LIBRARY_CHECK, "PCL[a]"));
+ assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain("PCL[a]",
+ SKIP_SHARED_LIBRARY_CHECK));
+ assertEquals("PCL[a];DLC[b]", DexoptUtils.encodeClassLoaderChain("PCL[a]",
+ "DLC[b]"));
+ assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain("PCL[a]",
+ SKIP_SHARED_LIBRARY_CHECK));
+
+ try {
+ DexoptUtils.encodeClassLoaderChain("a", null);
+ fail(); // exception is expected
+ } catch (NullPointerException expected) {}
+
+ try {
+ DexoptUtils.encodeClassLoaderChain(null, "b");
+ fail(); // exception is expected
+ } catch (NullPointerException expected) {}
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
index 2887e3b..d09d0c8 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
@@ -585,7 +585,39 @@
verifyNoPackageTrackerCallsMade();
// Set up the installer.
- configureStageUninstallExpectation(true /* success */);
+ configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_SUCCESS);
+
+ // Simulate the async execution.
+ mFakeExecutor.simulateAsyncExecutionOfLastCommand();
+
+ // Verify the expected calls were made to other components.
+ verifyStageUninstallCalled();
+ verifyPackageTrackerCalled(token, true /* success */);
+
+ // Check the callback was called.
+ callback.assertResultReceived(Callback.SUCCESS);
+ }
+
+ @Test
+ public void requestUninstall_asyncNothingInstalled() throws Exception {
+ configureCallerHasPermission();
+
+ CheckToken token = createArbitraryToken();
+ byte[] tokenBytes = token.toByteArray();
+
+ TestCallback callback = new TestCallback();
+
+ // Request the uninstall.
+ assertEquals(RulesManager.SUCCESS,
+ mRulesManagerService.requestUninstall(tokenBytes, callback));
+
+ // Assert nothing has happened yet.
+ callback.assertNoResultReceived();
+ verifyNoInstallerCallsMade();
+ verifyNoPackageTrackerCallsMade();
+
+ // Set up the installer.
+ configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_NOTHING_INSTALLED);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
@@ -613,7 +645,7 @@
callback.assertNoResultReceived();
// Set up the installer.
- configureStageUninstallExpectation(true /* success */);
+ configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_SUCCESS);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
@@ -644,7 +676,7 @@
callback.assertNoResultReceived();
// Set up the installer.
- configureStageUninstallExpectation(false /* success */);
+ configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_FAIL);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
@@ -849,8 +881,8 @@
.thenReturn(resultCode);
}
- private void configureStageUninstallExpectation(boolean success) throws Exception {
- doReturn(success).when(mMockTimeZoneDistroInstaller).stageUninstall();
+ private void configureStageUninstallExpectation(int resultCode) throws Exception {
+ doReturn(resultCode).when(mMockTimeZoneDistroInstaller).stageUninstall();
}
private void verifyStageInstallCalled() throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java
index d441df0..192e156 100644
--- a/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java
@@ -27,6 +27,7 @@
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
+import static android.content.res.Configuration.EMPTY;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -55,22 +56,22 @@
public void testConfigurationInit() throws Exception {
// Check root container initial config.
final TestConfigurationContainer root = new TestConfigurationContainer();
- assertEquals(Configuration.EMPTY, root.getOverrideConfiguration());
- assertEquals(Configuration.EMPTY, root.getMergedOverrideConfiguration());
- assertEquals(Configuration.EMPTY, root.getConfiguration());
+ assertEquals(EMPTY, root.getOverrideConfiguration());
+ assertEquals(EMPTY, root.getMergedOverrideConfiguration());
+ assertEquals(EMPTY, root.getConfiguration());
// Check child initial config.
final TestConfigurationContainer child1 = root.addChild();
- assertEquals(Configuration.EMPTY, child1.getOverrideConfiguration());
- assertEquals(Configuration.EMPTY, child1.getMergedOverrideConfiguration());
- assertEquals(Configuration.EMPTY, child1.getConfiguration());
+ assertEquals(EMPTY, child1.getOverrideConfiguration());
+ assertEquals(EMPTY, child1.getMergedOverrideConfiguration());
+ assertEquals(EMPTY, child1.getConfiguration());
// Check child initial config if root has overrides.
final Configuration rootOverrideConfig = new Configuration();
rootOverrideConfig.fontScale = 1.3f;
root.onOverrideConfigurationChanged(rootOverrideConfig);
final TestConfigurationContainer child2 = root.addChild();
- assertEquals(Configuration.EMPTY, child2.getOverrideConfiguration());
+ assertEquals(EMPTY, child2.getOverrideConfiguration());
assertEquals(rootOverrideConfig, child2.getMergedOverrideConfiguration());
assertEquals(rootOverrideConfig, child2.getConfiguration());
@@ -83,7 +84,7 @@
rootFullConfig.updateFrom(rootOverrideConfig);
final TestConfigurationContainer child3 = root.addChild();
- assertEquals(Configuration.EMPTY, child3.getOverrideConfiguration());
+ assertEquals(EMPTY, child3.getOverrideConfiguration());
assertEquals(rootOverrideConfig, child3.getMergedOverrideConfiguration());
assertEquals(rootFullConfig, child3.getConfiguration());
}
@@ -239,6 +240,9 @@
}
assertTrue("Can't change activity type once set.", gotException);
+ // TODO: Commenting out for now until we figure-out a good way to test these rules that
+ // should only apply to system process.
+ /*
gotException = false;
try {
// Parent can't change child's activity type once set.
@@ -260,9 +264,26 @@
gotException = true;
}
assertTrue("Can't re-parent to a different activity type.", gotException);
+ */
}
+ @Test
+ public void testRegisterConfigurationChangeListener() throws Exception {
+ final TestConfigurationContainer container = new TestConfigurationContainer();
+ final TestConfigurationChangeListener listener = new TestConfigurationChangeListener();
+ final Configuration config = new Configuration();
+ config.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ config.windowConfiguration.setAppBounds(10, 10, 10, 10);
+ container.onOverrideConfigurationChanged(config);
+ container.registerConfigurationChangeListener(listener);
+ // Assert listener got the current config. of the container after it was registered.
+ assertEquals(config, listener.mOverrideConfiguration);
+ // Assert listener gets changes to override configuration.
+ container.onOverrideConfigurationChanged(EMPTY);
+ assertEquals(EMPTY, listener.mOverrideConfiguration);
+ }
+
/**
* Contains minimal implementation of {@link ConfigurationContainer}'s abstract behavior needed
* for testing.
@@ -303,4 +324,13 @@
return mParent;
}
}
+
+ private class TestConfigurationChangeListener implements ConfigurationContainerListener {
+
+ final Configuration mOverrideConfiguration = new Configuration();
+
+ public void onOverrideConfigurationChanged(Configuration overrideConfiguration) {
+ mOverrideConfiguration.setTo(overrideConfiguration);
+ }
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
index d9b99ee..5da3224 100644
--- a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import android.graphics.Rect;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -60,6 +61,7 @@
}
@Test
+ @Ignore("b/65379195")
public void testRemoveContainer_deferRemoval() throws Exception {
final StackWindowController stackController =
createStackControllerOnDisplay(mDisplayContent);
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
index 52f66ae..29bbe6e 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
@@ -54,10 +54,10 @@
super.setUp();
final Configuration overrideConfig = new Configuration();
overrideConfig.windowConfiguration.setWindowingMode(
- getWindowingModeForStackId(PINNED_STACK_ID));
+ getWindowingModeForStackId(PINNED_STACK_ID, false /* inSplitScreenMode */));
mPinnedStack = new StackWindowController(PINNED_STACK_ID, null,
- mDisplayContent.getDisplayId(), true /* onTop */, new Rect(),
- overrideConfig, sWm).mContainer;
+ mDisplayContent.getDisplayId(), true /* onTop */, new Rect(), sWm).mContainer;
+ mPinnedStack.onOverrideConfigurationChanged(overrideConfig);
// Stack should contain visible app window to be considered visible.
final Task pinnedTask = createTaskInStack(mPinnedStack, 0 /* userId */);
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
index 3f75b41..31aad79 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
@@ -125,14 +125,9 @@
config.setActivityType(ACTIVITY_TYPE_HOME);
assertEquals(ACTIVITY_TYPE_HOME, config.getActivityType());
- boolean gotException = false;
- try {
- // Can't change activity type once set.
- config.setActivityType(ACTIVITY_TYPE_STANDARD);
- } catch (IllegalStateException e) {
- gotException = true;
- }
- assertTrue("Can't change activity type once set.", gotException);
+ // Allowed to change from app process.
+ config.setActivityType(ACTIVITY_TYPE_STANDARD);
+ assertEquals(ACTIVITY_TYPE_STANDARD, config.getActivityType());
}
/** Ensures the configuration app bounds at the root level match the app dimensions. */
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
index f1e15d9..8df7568 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
@@ -16,12 +16,16 @@
package com.android.server.wm;
+import android.app.WindowConfiguration;
+import android.content.res.Configuration;
import org.junit.Test;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.content.res.Configuration.EMPTY;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -80,4 +84,27 @@
controller.removeContainer();
assertNull(controller.mContainer);
}
+
+ @Test
+ public void testOnOverrideConfigurationChanged() throws Exception {
+ final WindowContainerController controller = new WindowContainerController(null, sWm);
+ final WindowContainer container = new WindowContainer();
+
+ controller.setContainer(container);
+ assertEquals(controller.mContainer, container);
+ assertEquals(EMPTY, container.getOverrideConfiguration());
+
+ final Configuration config = new Configuration();
+ config.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ config.windowConfiguration.setAppBounds(10, 10, 10, 10);
+
+ // Assert that the config change through the controller is propagated to the container.
+ controller.onOverrideConfigurationChanged(config);
+ assertEquals(config, container.getOverrideConfiguration());
+
+ // Assert the container configuration isn't changed after removal from the controller.
+ controller.removeContainer();
+ controller.onOverrideConfigurationChanged(EMPTY);
+ assertEquals(config, container.getOverrideConfiguration());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
index df3f755..e39ccca 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
@@ -75,7 +75,7 @@
final Rect mInsetBounds = new Rect();
boolean mFullscreenForTest = true;
TaskWithBounds(Rect bounds) {
- super(0, mStubStack, 0, sWm, null, null, 0, false, new TaskDescription(), null);
+ super(0, mStubStack, 0, sWm, null, 0, false, new TaskDescription(), null);
mBounds = bounds;
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
index ebe00ce..2ae10aa 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
@@ -66,7 +66,7 @@
/** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */
public static Task createTaskInStack(WindowManagerService service, TaskStack stack,
int userId) {
- final Task newTask = new Task(sNextTaskId++, stack, userId, service, null, EMPTY, 0, false,
+ final Task newTask = new Task(sNextTaskId++, stack, userId, service, null, 0, false,
new ActivityManager.TaskDescription(), null);
stack.addTask(newTask, POSITION_TOP);
return newTask;
@@ -94,19 +94,17 @@
TestAppWindowToken(DisplayContent dc) {
super(dc.mService, new IApplicationToken.Stub() {
public String getName() {return null;}
- }, false, dc, true /* fillsParent */,
- null /* overrideConfig */, null /* bounds */);
+ }, false, dc, true /* fillsParent */, null /* bounds */);
}
TestAppWindowToken(WindowManagerService service, IApplicationToken token,
boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos,
boolean fullscreen, boolean showForAllUsers, int targetSdk, int orientation,
int rotationAnimationHint, int configChanges, boolean launchTaskBehind,
- boolean alwaysFocusable, AppWindowContainerController controller,
- Configuration overrideConfig, Rect bounds) {
+ boolean alwaysFocusable, AppWindowContainerController controller, Rect bounds) {
super(service, token, voiceInteraction, dc, inputDispatchingTimeoutNanos, fullscreen,
showForAllUsers, targetSdk, orientation, rotationAnimationHint, configChanges,
- launchTaskBehind, alwaysFocusable, controller, overrideConfig, bounds);
+ launchTaskBehind, alwaysFocusable, controller, bounds);
}
int getWindowsCount() {
@@ -174,10 +172,10 @@
private boolean mIsAnimating = false;
TestTask(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
- Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
+ int resizeMode, boolean supportsPictureInPicture,
TaskWindowContainerController controller) {
- super(taskId, stack, userId, service, bounds, overrideConfig, resizeMode,
- supportsPictureInPicture, new ActivityManager.TaskDescription(), controller);
+ super(taskId, stack, userId, service, bounds, resizeMode, supportsPictureInPicture,
+ new ActivityManager.TaskDescription(), controller);
}
boolean shouldDeferRemoval() {
@@ -218,6 +216,18 @@
TestTaskWindowContainerController(StackWindowController stackController) {
super(sNextTaskId++, new TaskWindowContainerListener() {
@Override
+ public void registerConfigurationChangeListener(
+ ConfigurationContainerListener listener) {
+
+ }
+
+ @Override
+ public void unregisterConfigurationChangeListener(
+ ConfigurationContainerListener listener) {
+
+ }
+
+ @Override
public void onSnapshotChanged(ActivityManager.TaskSnapshot snapshot) {
}
@@ -226,18 +236,16 @@
public void requestResize(Rect bounds, int resizeMode) {
}
- }, stackController, 0 /* userId */, null /* bounds */,
- EMPTY /* overrideConfig*/, RESIZE_MODE_UNRESIZEABLE,
+ }, stackController, 0 /* userId */, null /* bounds */, RESIZE_MODE_UNRESIZEABLE,
false /* supportsPictureInPicture */, true /* toTop*/,
true /* showForAllUsers */, new ActivityManager.TaskDescription(),
stackController.mService);
}
@Override
- TestTask createTask(int taskId, TaskStack stack, int userId, Rect bounds,
- Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
- ActivityManager.TaskDescription taskDescription) {
- return new TestTask(taskId, stack, userId, mService, bounds, overrideConfig, resizeMode,
+ TestTask createTask(int taskId, TaskStack stack, int userId, Rect bounds, int resizeMode,
+ boolean supportsPictureInPicture, ActivityManager.TaskDescription taskDescription) {
+ return new TestTask(taskId, stack, userId, mService, bounds, resizeMode,
supportsPictureInPicture, this);
}
}
@@ -258,7 +266,7 @@
false /* launchTaskBehind */, false /* alwaysFocusable */,
0 /* targetSdkVersion */, 0 /* rotationAnimationHint */,
0 /* inputDispatchingTimeoutNanos */, taskController.mService,
- null /* overrideConfig */, null /* bounds */);
+ null /* bounds */);
mToken = token;
}
@@ -267,13 +275,12 @@
boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos,
boolean fullscreen, boolean showForAllUsers, int targetSdk, int orientation,
int rotationAnimationHint, int configChanges, boolean launchTaskBehind,
- boolean alwaysFocusable, AppWindowContainerController controller,
- Configuration overrideConfig, Rect bounds) {
+ boolean alwaysFocusable, AppWindowContainerController controller, Rect bounds) {
return new TestAppWindowToken(service, token, voiceInteraction, dc,
inputDispatchingTimeoutNanos, fullscreen, showForAllUsers, targetSdk,
orientation,
rotationAnimationHint, configChanges, launchTaskBehind, alwaysFocusable,
- controller, overrideConfig, bounds);
+ controller, bounds);
}
AppWindowToken getAppWindowToken(DisplayContent dc) {
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 bce740b..3df13ab 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -237,12 +237,14 @@
return createStackControllerOnStackOnDisplay(stackId, dc);
}
- StackWindowController createStackControllerOnStackOnDisplay(int stackId,
- DisplayContent dc) {
+ StackWindowController createStackControllerOnStackOnDisplay(int stackId, DisplayContent dc) {
final Configuration overrideConfig = new Configuration();
- overrideConfig.windowConfiguration.setWindowingMode(getWindowingModeForStackId(stackId));
- return new StackWindowController(stackId, null, dc.getDisplayId(),
- true /* onTop */, new Rect(), overrideConfig, sWm);
+ overrideConfig.windowConfiguration.setWindowingMode(
+ getWindowingModeForStackId(stackId, false /* inSplitScreenMode */));
+ final StackWindowController controller = new StackWindowController(stackId, null,
+ dc.getDisplayId(), true /* onTop */, new Rect(), sWm);
+ controller.onOverrideConfigurationChanged(overrideConfig);
+ return controller;
}
/** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */
diff --git a/services/tests/servicestests/test-apps/JobTestApp/src/com/android/servicestests/apps/jobtestapp/TestJobActivity.java b/services/tests/servicestests/test-apps/JobTestApp/src/com/android/servicestests/apps/jobtestapp/TestJobActivity.java
index 94a85ee..011817e 100644
--- a/services/tests/servicestests/test-apps/JobTestApp/src/com/android/servicestests/apps/jobtestapp/TestJobActivity.java
+++ b/services/tests/servicestests/test-apps/JobTestApp/src/com/android/servicestests/apps/jobtestapp/TestJobActivity.java
@@ -30,9 +30,9 @@
public static final String EXTRA_JOB_ID_KEY =
"com.android.servicestests.apps.jobtestapp.extra.JOB_ID";
public static final String ACTION_START_JOB =
- "com.android.servicestests.apps.jobtestapp.extra.START_JOB";
+ "com.android.servicestests.apps.jobtestapp.action.START_JOB";
public static final String ACTION_CANCEL_JOBS =
- "com.android.servicestests.apps.jobtestapp.extra.CANCEL_JOBS";
+ "com.android.servicestests.apps.jobtestapp.action.CANCEL_JOBS";
public static final int JOB_INITIAL_BACKOFF = 10_000;
public static final int JOB_MINIMUM_LATENCY = 5_000;
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index ce0dcc3..c657a1b 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -22,8 +22,10 @@
import android.hardware.usb.UsbConfiguration;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
+import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
@@ -32,8 +34,11 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.usb.descriptors.UsbDescriptorParser;
+import com.android.server.usb.descriptors.report.TextReportCanvas;
+import com.android.server.usb.descriptors.tree.UsbDescriptorsTree;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
/**
@@ -43,6 +48,8 @@
private static final String TAG = UsbHostManager.class.getSimpleName();
private static final boolean DEBUG = false;
+ private final Context mContext;
+
// contains all connected USB devices
private final HashMap<String, UsbDevice> mDevices = new HashMap<>();
@@ -69,6 +76,8 @@
public UsbHostManager(Context context, UsbAlsaManager alsaManager,
UsbSettingsManager settingsManager) {
+ mContext = context;
+
mHostBlacklist = context.getResources().getStringArray(
com.android.internal.R.array.config_usbHostBlacklist);
mUsbAlsaManager = alsaManager;
@@ -265,8 +274,8 @@
if (parser.parseDevice(mNewDevice.getDeviceName())) {
isInputHeadset = parser.isInputHeadset();
isOutputHeadset = parser.isOutputHeadset();
- Slog.i(TAG, "---- isHeadset[in:" + isInputHeadset
- + " , out:" + isOutputHeadset + "]");
+ Slog.i(TAG, "---- isHeadset[in: " + isInputHeadset
+ + " , out: " + isOutputHeadset + "]");
}
mUsbAlsaManager.usbDeviceAdded(mNewDevice,
isInputHeadset, isOutputHeadset);
@@ -339,6 +348,33 @@
if (mUsbDeviceConnectionHandler != null) {
pw.println("Default USB Host Connection handler: " + mUsbDeviceConnectionHandler);
}
+
+ Collection<UsbDevice> devices = mDevices.values();
+ if (devices.size() != 0) {
+ pw.println("USB Peripheral Descriptors");
+ for (UsbDevice device : devices) {
+ StringBuilder stringBuilder = new StringBuilder();
+
+ UsbDescriptorParser parser = new UsbDescriptorParser();
+ if (parser.parseDevice(device.getDeviceName())) {
+ UsbDescriptorsTree descriptorTree = new UsbDescriptorsTree();
+ descriptorTree.parse(parser);
+
+ UsbManager usbManager =
+ (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
+ UsbDeviceConnection connection = usbManager.openDevice(device);
+
+ descriptorTree.report(new TextReportCanvas(connection, stringBuilder));
+ connection.close();
+
+ stringBuilder.append("isHeadset[in: " + parser.isInputHeadset()
+ + " , out: " + parser.isOutputHeadset() + "]");
+ } else {
+ stringBuilder.append("Error Parsing USB Descriptors");
+ }
+ pw.println(stringBuilder.toString());
+ }
+ }
}
}
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbASFormat.java b/services/usb/java/com/android/server/usb/descriptors/UsbASFormat.java
index 305ae2f..7a92f9e 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbASFormat.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbASFormat.java
@@ -102,6 +102,6 @@
public void report(ReportCanvas canvas) {
super.report(canvas);
- canvas.write(UsbStrings.getFormatName(getFormatType()));
+ canvas.writeParagraph(UsbStrings.getFormatName(getFormatType()), /*emphasis*/false);
}
}
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java
index c8fa694..d5cb89e 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java
@@ -130,8 +130,8 @@
String subClasStr = UsbStrings.getClassName(devSubClass);
canvas.writeListItem("Class " + devClass + ": " + classStr + " Subclass"
+ devSubClass + ": " + subClasStr);
- canvas.writeListItem("Vendor ID: " + getVendorID()
- + " Product ID: " + getProductID()
+ canvas.writeListItem("Vendor ID: " + ReportCanvas.getHexString(getVendorID())
+ + " Product ID: " + ReportCanvas.getHexString(getProductID())
+ " Product Release: " + ReportCanvas.getBCDString(getDeviceRelease()));
byte mfgIndex = getMfgIndex();
diff --git a/services/usb/java/com/android/server/usb/descriptors/report/TextReportCanvas.java b/services/usb/java/com/android/server/usb/descriptors/report/TextReportCanvas.java
index 33746ba..a43569d 100644
--- a/services/usb/java/com/android/server/usb/descriptors/report/TextReportCanvas.java
+++ b/services/usb/java/com/android/server/usb/descriptors/report/TextReportCanvas.java
@@ -40,6 +40,12 @@
mStringBuilder = stringBuilder;
}
+ private void writeListIndent() {
+ for (int space = 0; space < mListIndent; space++) {
+ mStringBuilder.append(" ");
+ }
+ }
+
@Override
public void write(String text) {
mStringBuilder.append(text);
@@ -47,7 +53,8 @@
@Override
public void openHeader(int level) {
- mStringBuilder.append("[" + level + " - ");
+ writeListIndent();
+ mStringBuilder.append("[");
}
@Override
@@ -56,7 +63,8 @@
}
@Override
- public void openParagraph(boolean inRed) {
+ public void openParagraph(boolean emphasis) {
+ writeListIndent();
}
@Override
@@ -75,30 +83,20 @@
closeParagraph();
}
- private void writeListIndent() {
- for (int space = 0; space < mListIndent; space++) {
- mStringBuilder.append(" ");
- }
- }
-
@Override
public void openList() {
mListIndent += LIST_INDENT_AMNT;
- writeListIndent();
- mStringBuilder.append("---->\n");
}
@Override
public void closeList() {
- writeListIndent();
mListIndent -= LIST_INDENT_AMNT;
- mStringBuilder.append("<----\n");
}
@Override
public void openListItem() {
writeListIndent();
- mStringBuilder.append(" - ");
+ mStringBuilder.append("- ");
}
@Override
diff --git a/services/usb/java/com/android/server/usb/descriptors/report/UsbStrings.java b/services/usb/java/com/android/server/usb/descriptors/report/UsbStrings.java
index ff58a26..64ecebc 100644
--- a/services/usb/java/com/android/server/usb/descriptors/report/UsbStrings.java
+++ b/services/usb/java/com/android/server/usb/descriptors/report/UsbStrings.java
@@ -38,6 +38,10 @@
private static HashMap<Integer, String> sTerminalNames;
private static HashMap<Integer, String> sFormatNames;
+ static {
+ allocUsbStrings();
+ }
+
private static void initDescriptorNames() {
sDescriptorNames = new HashMap<Byte, String>();
sDescriptorNames.put(UsbDescriptor.DESCRIPTORTYPE_DEVICE, "Device");
@@ -246,7 +250,7 @@
/**
* Initializes string tables.
*/
- public static void allocUsbStrings() {
+ private static void allocUsbStrings() {
initDescriptorNames();
initACControlInterfaceNames();
initACStreamingInterfaceNames();
@@ -258,19 +262,6 @@
}
/**
- * Deinitializes string tables.
- */
- public static void releaseUsbStrings() {
- sDescriptorNames = null;
- sACControlInterfaceNames = null;
- sACStreamingInterfaceNames = null;
- sClassNames = null;
- sAudioSubclassNames = null;
- sAudioEncodingNames = null;
- sTerminalNames = null;
- }
-
- /**
* Retrieves the name for the specified descriptor ID.
*/
public static String getDescriptorName(byte descriptorID) {
diff --git a/services/usb/java/com/android/server/usb/descriptors/tree/UsbDescriptorsACInterfaceNode.java b/services/usb/java/com/android/server/usb/descriptors/tree/UsbDescriptorsACInterfaceNode.java
index 49caca5..6dbf415 100644
--- a/services/usb/java/com/android/server/usb/descriptors/tree/UsbDescriptorsACInterfaceNode.java
+++ b/services/usb/java/com/android/server/usb/descriptors/tree/UsbDescriptorsACInterfaceNode.java
@@ -37,10 +37,10 @@
@Override
public void report(ReportCanvas canvas) {
- canvas.openListItem();
- canvas.writeParagraph("AC Interface type:0x"
- + Integer.toHexString(mACInterface.getSubtype()), false);
+ canvas.writeListItem("AC Interface type: 0x"
+ + Integer.toHexString(mACInterface.getSubtype()));
+ canvas.openList();
mACInterface.report(canvas);
- canvas.closeListItem();
+ canvas.closeList();
}
}
diff --git a/telecomm/java/android/telecom/DefaultDialerManager.java b/telecomm/java/android/telecom/DefaultDialerManager.java
index 2a707c9..1806aee 100644
--- a/telecomm/java/android/telecom/DefaultDialerManager.java
+++ b/telecomm/java/android/telecom/DefaultDialerManager.java
@@ -22,6 +22,7 @@
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Process;
+import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
@@ -163,7 +164,10 @@
for (ResolveInfo resolveInfo : resolveInfoList) {
final ActivityInfo activityInfo = resolveInfo.activityInfo;
- if (activityInfo != null && !packageNames.contains(activityInfo.packageName)) {
+ if (activityInfo != null
+ && !packageNames.contains(activityInfo.packageName)
+ // ignore cross profile intent handler
+ && resolveInfo.targetUserId == UserHandle.USER_CURRENT) {
packageNames.add(activityInfo.packageName);
}
}
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index b1eedf5..9e52c71 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -1345,10 +1345,8 @@
/**
* Returns whether TTY is supported on this device.
- *
- * @hide
*/
- @SystemApi
+
@RequiresPermission(anyOf = {
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
android.Manifest.permission.READ_PHONE_STATE
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index acbcc3c..689ce95 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1565,6 +1565,14 @@
public static final String KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL =
"convert_cdma_caller_id_mmi_codes_while_roaming_on_3gpp_bool";
+ /**
+ * Flag specifying whether IMS registration state menu is shown in Status Info setting,
+ * default to false.
+ * @hide
+ */
+ public static final String KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL =
+ "show_ims_registration_status_bool";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -1763,9 +1771,7 @@
sDefaults.putStringArray(KEY_CARRIER_APP_WAKE_SIGNAL_CONFIG_STRING_ARRAY,
new String[]{
"com.android.carrierdefaultapp/.CarrierDefaultBroadcastReceiver:"
- + "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED,"
- + "com.android.internal.telephony.CARRIER_SIGNAL_RESET,"
- + "com.android.internal.telephony.CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE"
+ + "com.android.internal.telephony.CARRIER_SIGNAL_RESET"
});
sDefaults.putStringArray(KEY_CARRIER_APP_NO_WAKE_SIGNAL_CONFIG_STRING_ARRAY, null);
@@ -1833,6 +1839,7 @@
false);
sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null);
sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null);
+ sDefaults.putBoolean(KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false);
}
/**
diff --git a/telephony/java/android/telephony/MbmsDownloadManager.java b/telephony/java/android/telephony/MbmsDownloadManager.java
deleted file mode 100644
index 1e8cf18..0000000
--- a/telephony/java/android/telephony/MbmsDownloadManager.java
+++ /dev/null
@@ -1,586 +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.telephony;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SdkConstant;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.telephony.mbms.DownloadProgressListener;
-import android.telephony.mbms.FileInfo;
-import android.telephony.mbms.DownloadRequest;
-import android.telephony.mbms.MbmsDownloadManagerCallback;
-import android.telephony.mbms.MbmsDownloadReceiver;
-import android.telephony.mbms.MbmsException;
-import android.telephony.mbms.MbmsTempFileProvider;
-import android.telephony.mbms.MbmsUtils;
-import android.telephony.mbms.vendor.IMbmsDownloadService;
-import android.util.Log;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-/** @hide */
-public class MbmsDownloadManager {
- private static final String LOG_TAG = MbmsDownloadManager.class.getSimpleName();
-
- /** @hide */
- // TODO: systemapi
- @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
- public static final String MBMS_DOWNLOAD_SERVICE_ACTION =
- "android.telephony.action.EmbmsDownload";
-
- /**
- * Integer extra indicating the result code of the download. One of
- * {@link #RESULT_SUCCESSFUL}, {@link #RESULT_EXPIRED}, or {@link #RESULT_CANCELLED}.
- */
- public static final String EXTRA_RESULT = "android.telephony.mbms.extra.RESULT";
-
- /**
- * Extra containing the {@link android.telephony.mbms.FileInfo} for which the download result
- * is for. Must not be null.
- */
- public static final String EXTRA_FILE_INFO = "android.telephony.mbms.extra.FILE_INFO";
-
- /**
- * Extra containing a single {@link Uri} indicating the location of the successfully
- * downloaded file. Set on the intent provided via
- * {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)}.
- * Will always be set to a non-null value if {@link #EXTRA_RESULT} is set to
- * {@link #RESULT_SUCCESSFUL}.
- */
- public static final String EXTRA_COMPLETED_FILE_URI =
- "android.telephony.mbms.extra.COMPLETED_FILE_URI";
-
- public static final int RESULT_SUCCESSFUL = 1;
- public static final int RESULT_CANCELLED = 2;
- public static final int RESULT_EXPIRED = 3;
- public static final int RESULT_IO_ERROR = 4;
- // TODO - more results!
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({STATUS_UNKNOWN, STATUS_ACTIVELY_DOWNLOADING, STATUS_PENDING_DOWNLOAD,
- STATUS_PENDING_REPAIR, STATUS_PENDING_DOWNLOAD_WINDOW})
- public @interface DownloadStatus {}
-
- public static final int STATUS_UNKNOWN = 0;
- public static final int STATUS_ACTIVELY_DOWNLOADING = 1;
- public static final int STATUS_PENDING_DOWNLOAD = 2;
- public static final int STATUS_PENDING_REPAIR = 3;
- public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4;
-
- private static AtomicBoolean sIsInitialized = new AtomicBoolean(false);
-
- private final Context mContext;
- private int mSubscriptionId = INVALID_SUBSCRIPTION_ID;
- private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
- @Override
- public void binderDied() {
- sendErrorToApp(MbmsException.ERROR_MIDDLEWARE_LOST, "Received death notification");
- }
- };
-
- private AtomicReference<IMbmsDownloadService> mService = new AtomicReference<>(null);
- private final MbmsDownloadManagerCallback mCallback;
-
- private MbmsDownloadManager(Context context, MbmsDownloadManagerCallback callback, int subId) {
- mContext = context;
- mCallback = callback;
- mSubscriptionId = subId;
- }
-
- /**
- * Create a new MbmsDownloadManager using the system default data subscription ID.
- * See {@link #create(Context, MbmsDownloadManagerCallback, int)}
- *
- * @hide
- */
- public static MbmsDownloadManager create(Context context,
- MbmsDownloadManagerCallback listener)
- throws MbmsException {
- return create(context, listener, SubscriptionManager.getDefaultSubscriptionId());
- }
-
- /**
- * Create a new MbmsDownloadManager using the given subscription ID.
- *
- * Note that this call will bind a remote service and that may take a bit. The instance of
- * {@link MbmsDownloadManager} that is returned will not be ready for use until
- * {@link MbmsDownloadManagerCallback#middlewareReady()} is called on the provided callback.
- * If you attempt to use the manager before it is ready, a {@link MbmsException} will be thrown.
- *
- * This also may throw an {@link IllegalArgumentException} or an {@link IllegalStateException}.
- *
- * You may only have one instance of {@link MbmsDownloadManager} per UID. If you call this
- * method while there is an active instance of {@link MbmsDownloadManager} in your process
- * (in other words, one that has not had {@link #dispose()} called on it), this method will
- * throw an {@link MbmsException}. If you call this method in a different process
- * running under the same UID, an error will be indicated via
- * {@link MbmsDownloadManagerCallback#error(int, String)}.
- *
- * Note that initialization may fail asynchronously. If you wish to try again after you
- * receive such an asynchronous error, you must call dispose() on the instance of
- * {@link MbmsDownloadManager} that you received before calling this method again.
- *
- * @param context The instance of {@link Context} to use
- * @param listener A callback to get asynchronous error messages and file service updates.
- * @param subscriptionId The data subscription ID to use
- * @hide
- */
- public static MbmsDownloadManager create(Context context,
- MbmsDownloadManagerCallback listener, int subscriptionId)
- throws MbmsException {
- if (!sIsInitialized.compareAndSet(false, true)) {
- throw new MbmsException(MbmsException.InitializationErrors.ERROR_DUPLICATE_INITIALIZE);
- }
- MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, subscriptionId);
- try {
- mdm.bindAndInitialize();
- } catch (MbmsException e) {
- sIsInitialized.set(false);
- throw e;
- }
- return mdm;
- }
-
- private void bindAndInitialize() throws MbmsException {
- MbmsUtils.startBinding(mContext, MBMS_DOWNLOAD_SERVICE_ACTION,
- new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- IMbmsDownloadService downloadService =
- IMbmsDownloadService.Stub.asInterface(service);
- int result;
- try {
- result = downloadService.initialize(mSubscriptionId, mCallback);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Service died before initialization");
- sIsInitialized.set(false);
- return;
- } catch (RuntimeException e) {
- Log.e(LOG_TAG, "Runtime exception during initialization");
- sendErrorToApp(
- MbmsException.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
- e.toString());
- sIsInitialized.set(false);
- return;
- }
- if (result != MbmsException.SUCCESS) {
- sendErrorToApp(result, "Error returned during initialization");
- sIsInitialized.set(false);
- return;
- }
- try {
- downloadService.asBinder().linkToDeath(mDeathRecipient, 0);
- } catch (RemoteException e) {
- sendErrorToApp(MbmsException.ERROR_MIDDLEWARE_LOST,
- "Middleware lost during initialization");
- sIsInitialized.set(false);
- return;
- }
- mService.set(downloadService);
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- sIsInitialized.set(false);
- mService.set(null);
- }
- });
- }
-
- /**
- * An inspection API to retrieve the list of available
- * {@link android.telephony.mbms.FileServiceInfo}s currently being advertised.
- * The results are returned asynchronously via a call to
- * {@link MbmsDownloadManagerCallback#fileServicesUpdated(List)}
- *
- * The serviceClasses argument lets the app filter on types of programming and is opaque data
- * negotiated beforehand between the app and the carrier.
- *
- * This may throw an {@link MbmsException} containing one of the following errors:
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
- *
- * Asynchronous error codes via the {@link MbmsDownloadManagerCallback#error(int, String)}
- * callback can include any of the errors except:
- * {@link MbmsException.StreamingErrors#ERROR_UNABLE_TO_START_SERVICE}
- *
- * @param classList A list of service classes which the app wishes to receive
- * {@link MbmsDownloadManagerCallback#fileServicesUpdated(List)} callbacks
- * about. Subsequent calls to this method will replace this list of service
- * classes (i.e. the middleware will no longer send updates for services
- * matching classes only in the old list).
- */
- public void getFileServices(List<String> classList) throws MbmsException {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
- try {
- int returnCode = downloadService.getFileServices(mSubscriptionId, classList);
- if (returnCode != MbmsException.SUCCESS) {
- throw new MbmsException(returnCode);
- }
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "Remote process died");
- mService.set(null);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
- }
-
- /**
- * Sets the temp file root for downloads.
- * All temp files created for the middleware to write to will be contained in the specified
- * directory. Applications that wish to specify a location only need to call this method once
- * as long their data is persisted in storage -- the argument will be stored both in a
- * local instance of {@link android.content.SharedPreferences} and by the middleware.
- *
- * If this method is not called at least once before calling
- * {@link #download(DownloadRequest, DownloadProgressListener)}, the framework
- * will default to a directory formed by the concatenation of the app's files directory and
- * {@link android.telephony.mbms.MbmsTempFileProvider#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY}.
- *
- * Before calling this method, the app must cancel all of its pending
- * {@link DownloadRequest}s via {@link #cancelDownload(DownloadRequest)}. If this is not done,
- * an {@link MbmsException} will be thrown with code
- * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} unless the
- * provided directory is the same as what has been previously configured.
- *
- * The {@link File} supplied as a root temp file directory must already exist. If not, an
- * {@link IllegalArgumentException} will be thrown.
- * @param tempFileRootDirectory A directory to place temp files in.
- */
- public void setTempFileRootDirectory(@NonNull File tempFileRootDirectory)
- throws MbmsException {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
- if (!tempFileRootDirectory.exists()) {
- throw new IllegalArgumentException("Provided directory does not exist");
- }
- if (!tempFileRootDirectory.isDirectory()) {
- throw new IllegalArgumentException("Provided File is not a directory");
- }
- String filePath;
- try {
- filePath = tempFileRootDirectory.getCanonicalPath();
- } catch (IOException e) {
- throw new IllegalArgumentException("Unable to canonicalize the provided path: " + e);
- }
-
- try {
- int result = downloadService.setTempFileRootDirectory(mSubscriptionId, filePath);
- if (result != MbmsException.SUCCESS) {
- throw new MbmsException(result);
- }
- } catch (RemoteException e) {
- mService.set(null);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
-
- SharedPreferences prefs = mContext.getSharedPreferences(
- MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
- prefs.edit().putString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, filePath).apply();
- }
-
- /**
- * Retrieves the currently configured temp file root directory. Returns the file that was
- * configured via {@link #setTempFileRootDirectory(File)} or the default directory
- * {@link #download(DownloadRequest, DownloadProgressListener)} was called without ever setting
- * the temp file root. If neither method has been called since the last time the app's shared
- * preferences were reset, returns null.
- *
- * @return A {@link File} pointing to the configured temp file directory, or null if not yet
- * configured.
- */
- public @Nullable File getTempFileRootDirectory() {
- SharedPreferences prefs = mContext.getSharedPreferences(
- MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
- String path = prefs.getString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, null);
- if (path != null) {
- return new File(path);
- }
- return null;
- }
-
- /**
- * Requests a download of a file that is available via multicast.
- *
- * downloadListener is an optional callback object which can be used to get progress reports
- * of a currently occuring download. Note this can only run while the calling app
- * is running, so future downloads will simply result in resultIntents being sent
- * for completed or errored-out downloads. A NULL indicates no callbacks are needed.
- *
- * May throw an {@link IllegalArgumentException}
- *
- * If {@link #setTempFileRootDirectory(File)} has not called after the app has been installed,
- * this method will create a directory at the default location defined at
- * {@link MbmsTempFileProvider#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY} and store that as the temp
- * file root directory.
- *
- * Asynchronous errors through the listener include any of the errors
- *
- * @param request The request that specifies what should be downloaded
- * @param progressListener Optional listener that will be provided progress updates
- * if the app is running.
- */
- public void download(DownloadRequest request, DownloadProgressListener progressListener)
- throws MbmsException {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
-
- // Check to see whether the app's set a temp root dir yet, and set it if not.
- SharedPreferences prefs = mContext.getSharedPreferences(
- MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
- if (prefs.getString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, null) == null) {
- File tempRootDirectory = new File(mContext.getFilesDir(),
- MbmsTempFileProvider.DEFAULT_TOP_LEVEL_TEMP_DIRECTORY);
- tempRootDirectory.mkdirs();
- setTempFileRootDirectory(tempRootDirectory);
- }
-
- checkValidDownloadDestination(request);
- writeDownloadRequestToken(request);
- try {
- downloadService.download(request, progressListener);
- } catch (RemoteException e) {
- mService.set(null);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
- }
-
- /**
- * Returns a list of pending {@link DownloadRequest}s that originated from this application.
- * A pending request is one that was issued via
- * {@link #download(DownloadRequest, DownloadProgressListener)} but not cancelled through
- * {@link #cancelDownload(DownloadRequest)}.
- * @return A list, possibly empty, of {@link DownloadRequest}s
- */
- public @NonNull List<DownloadRequest> listPendingDownloads() throws MbmsException {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
-
- try {
- return downloadService.listPendingDownloads(mSubscriptionId);
- } catch (RemoteException e) {
- mService.set(null);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
- }
-
- /**
- * Attempts to cancel the specified {@link DownloadRequest}.
- *
- * If the middleware is not aware of the specified download request, an MbmsException will be
- * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
- *
- * If this method returns without throwing an exception, you may assume that cancellation
- * was successful.
- * @param downloadRequest The download request that you wish to cancel.
- */
- public void cancelDownload(DownloadRequest downloadRequest) throws MbmsException {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
-
- try {
- int result = downloadService.cancelDownload(downloadRequest);
- if (result != MbmsException.SUCCESS) {
- throw new MbmsException(result);
- }
- } catch (RemoteException e) {
- mService.set(null);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
- deleteDownloadRequestToken(downloadRequest);
- }
-
- /**
- * Gets information about the status of a file pending download.
- *
- * If the middleware has not yet been properly initialized or if it has no records of the
- * file indicated by {@code fileInfo} being associated with {@code downloadRequest},
- * {@link #STATUS_UNKNOWN} will be returned.
- *
- * @param downloadRequest The download request to query.
- * @param fileInfo The particular file within the request to get information on.
- * @return The status of the download.
- */
- @DownloadStatus
- public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo)
- throws MbmsException {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
-
- try {
- return downloadService.getDownloadStatus(downloadRequest, fileInfo);
- } catch (RemoteException e) {
- mService.set(null);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
- }
-
- /**
- * Resets the middleware's knowledge of previously-downloaded files in this download request.
- *
- * Normally, the middleware keeps track of the hashes of downloaded files and won't re-download
- * files whose server-reported hash matches one of the already-downloaded files. This means
- * that if the file is accidentally deleted by the user or by the app, the middleware will
- * not try to download it again.
- * This method will reset the middleware's cache of hashes for the provided
- * {@link DownloadRequest}, so that previously downloaded content will be downloaded again
- * when available.
- * This will not interrupt in-progress downloads.
- *
- * If the middleware is not aware of the specified download request, an MbmsException will be
- * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
- *
- * May throw a {@link MbmsException} with error code
- * @param downloadRequest The request to re-download files for.
- */
- public void resetDownloadKnowledge(DownloadRequest downloadRequest) throws MbmsException {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
-
- try {
- int result = downloadService.resetDownloadKnowledge(downloadRequest);
- if (result != MbmsException.SUCCESS) {
- throw new MbmsException(result);
- }
- } catch (RemoteException e) {
- mService.set(null);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
- }
-
- public void dispose() {
- try {
- IMbmsDownloadService downloadService = mService.get();
- if (downloadService == null) {
- Log.i(LOG_TAG, "Service already dead");
- return;
- }
- downloadService.dispose(mSubscriptionId);
- } catch (RemoteException e) {
- // Ignore
- Log.i(LOG_TAG, "Remote exception while disposing of service");
- } finally {
- mService.set(null);
- sIsInitialized.set(false);
- }
- }
-
- private void writeDownloadRequestToken(DownloadRequest request) {
- File token = getDownloadRequestTokenPath(request);
- if (!token.getParentFile().exists()) {
- token.getParentFile().mkdirs();
- }
- if (token.exists()) {
- Log.w(LOG_TAG, "Download token " + token.getName() + " already exists");
- return;
- }
- try {
- if (!token.createNewFile()) {
- throw new RuntimeException("Failed to create download token for request "
- + request);
- }
- } catch (IOException e) {
- throw new RuntimeException("Failed to create download token for request " + request
- + " due to IOException " + e);
- }
- }
-
- private void deleteDownloadRequestToken(DownloadRequest request) {
- File token = getDownloadRequestTokenPath(request);
- if (!token.isFile()) {
- Log.w(LOG_TAG, "Attempting to delete non-existent download token at " + token);
- return;
- }
- if (!token.delete()) {
- Log.w(LOG_TAG, "Couldn't delete download token at " + token);
- }
- }
-
- private File getDownloadRequestTokenPath(DownloadRequest request) {
- File tempFileLocation = MbmsUtils.getEmbmsTempFileDirForService(mContext,
- request.getFileServiceId());
- String downloadTokenFileName = request.getHash()
- + MbmsDownloadReceiver.DOWNLOAD_TOKEN_SUFFIX;
- return new File(tempFileLocation, downloadTokenFileName);
- }
-
- /**
- * Verifies the following:
- * If a request is multi-part,
- * 1. Destination Uri must exist and be a directory
- * 2. Directory specified must contain no files.
- * Otherwise
- * 1. The file specified by the destination Uri must not exist.
- */
- private void checkValidDownloadDestination(DownloadRequest request) {
- File toFile = new File(request.getDestinationUri().getSchemeSpecificPart());
- if (request.isMultipartDownload()) {
- if (!toFile.isDirectory()) {
- throw new IllegalArgumentException("Multipart download must specify valid " +
- "destination directory.");
- }
- if (toFile.listFiles().length > 0) {
- throw new IllegalArgumentException("Destination directory must be clear of all " +
- "files.");
- }
- } else {
- if (toFile.exists()) {
- throw new IllegalArgumentException("Destination file must not exist.");
- }
- }
- }
-
- private void sendErrorToApp(int errorCode, String message) {
- try {
- mCallback.error(errorCode, message);
- } catch (RemoteException e) {
- // Ignore, should not happen locally.
- }
- }
-}
diff --git a/telephony/java/android/telephony/MbmsDownloadSession.java b/telephony/java/android/telephony/MbmsDownloadSession.java
new file mode 100644
index 0000000..ebac041
--- /dev/null
+++ b/telephony/java/android/telephony/MbmsDownloadSession.java
@@ -0,0 +1,773 @@
+/*
+ * 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.telephony;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.telephony.mbms.DownloadStateCallback;
+import android.telephony.mbms.FileInfo;
+import android.telephony.mbms.DownloadRequest;
+import android.telephony.mbms.InternalDownloadSessionCallback;
+import android.telephony.mbms.InternalDownloadStateCallback;
+import android.telephony.mbms.MbmsDownloadSessionCallback;
+import android.telephony.mbms.MbmsDownloadReceiver;
+import android.telephony.mbms.MbmsErrors;
+import android.telephony.mbms.MbmsTempFileProvider;
+import android.telephony.mbms.MbmsUtils;
+import android.telephony.mbms.vendor.IMbmsDownloadService;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+/**
+ * This class provides functionality for file download over MBMS.
+ */
+public class MbmsDownloadSession implements AutoCloseable {
+ private static final String LOG_TAG = MbmsDownloadSession.class.getSimpleName();
+
+ /**
+ * Service action which must be handled by the middleware implementing the MBMS file download
+ * interface.
+ * @hide
+ */
+ @SystemApi
+ @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+ public static final String MBMS_DOWNLOAD_SERVICE_ACTION =
+ "android.telephony.action.EmbmsDownload";
+
+ /**
+ * Integer extra that Android will attach to the intent supplied via
+ * {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)}
+ * Indicates the result code of the download. One of
+ * {@link #RESULT_SUCCESSFUL}, {@link #RESULT_EXPIRED}, {@link #RESULT_CANCELLED}, or
+ * {@link #RESULT_IO_ERROR}.
+ *
+ * This extra may also be used by the middleware when it is sending intents to the app.
+ */
+ public static final String EXTRA_MBMS_DOWNLOAD_RESULT =
+ "android.telephony.extra.MBMS_DOWNLOAD_RESULT";
+
+ /**
+ * {@link FileInfo} extra that Android will attach to the intent supplied via
+ * {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)}
+ * Indicates the file for which the download result is for. Never null.
+ *
+ * This extra may also be used by the middleware when it is sending intents to the app.
+ */
+ public static final String EXTRA_MBMS_FILE_INFO = "android.telephony.extra.MBMS_FILE_INFO";
+
+ /**
+ * {@link Uri} extra that Android will attach to the intent supplied via
+ * {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)}
+ * Indicates the location of the successfully downloaded file within the temp file root set
+ * via {@link #setTempFileRootDirectory(File)}.
+ * While you may use this file in-place, it is highly encouraged that you move
+ * this file to a different location after receiving the download completion intent, as this
+ * file resides within the temp file directory.
+ *
+ * Will always be set to a non-null value if
+ * {@link #EXTRA_MBMS_DOWNLOAD_RESULT} is set to {@link #RESULT_SUCCESSFUL}.
+ */
+ public static final String EXTRA_MBMS_COMPLETED_FILE_URI =
+ "android.telephony.extra.MBMS_COMPLETED_FILE_URI";
+
+ /**
+ * Extra containing the {@link DownloadRequest} for which the download result or file
+ * descriptor request is for. Must not be null.
+ */
+ public static final String EXTRA_MBMS_DOWNLOAD_REQUEST =
+ "android.telephony.extra.MBMS_DOWNLOAD_REQUEST";
+
+ /**
+ * The default directory name for all MBMS temp files. If you call
+ * {@link #download(DownloadRequest)} without first calling
+ * {@link #setTempFileRootDirectory(File)}, this directory will be created for you under the
+ * path returned by {@link Context#getFilesDir()}.
+ */
+ public static final String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
+
+ /**
+ * Indicates that the download was successful.
+ */
+ public static final int RESULT_SUCCESSFUL = 1;
+
+ /**
+ * Indicates that the download was cancelled via {@link #cancelDownload(DownloadRequest)}.
+ */
+ public static final int RESULT_CANCELLED = 2;
+
+ /**
+ * Indicates that the download will not be completed due to the expiration of its download
+ * window on the carrier's network.
+ */
+ public static final int RESULT_EXPIRED = 3;
+
+ /**
+ * Indicates that the download will not be completed due to an I/O error incurred while
+ * writing to temp files. This commonly indicates that the device is out of storage space,
+ * but may indicate other conditions as well (such as an SD card being removed).
+ */
+ public static final int RESULT_IO_ERROR = 4;
+ // TODO - more results!
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({STATUS_UNKNOWN, STATUS_ACTIVELY_DOWNLOADING, STATUS_PENDING_DOWNLOAD,
+ STATUS_PENDING_REPAIR, STATUS_PENDING_DOWNLOAD_WINDOW})
+ public @interface DownloadStatus {}
+
+ /**
+ * Indicates that the middleware has no information on the file.
+ */
+ public static final int STATUS_UNKNOWN = 0;
+
+ /**
+ * Indicates that the file is actively downloading.
+ */
+ public static final int STATUS_ACTIVELY_DOWNLOADING = 1;
+
+ /**
+ * TODO: I don't know...
+ */
+ public static final int STATUS_PENDING_DOWNLOAD = 2;
+
+ /**
+ * Indicates that the file is being repaired after the download being interrupted.
+ */
+ public static final int STATUS_PENDING_REPAIR = 3;
+
+ /**
+ * Indicates that the file is waiting to download because its download window has not yet
+ * started.
+ */
+ public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4;
+
+ private static AtomicBoolean sIsInitialized = new AtomicBoolean(false);
+
+ private final Context mContext;
+ private int mSubscriptionId = INVALID_SUBSCRIPTION_ID;
+ private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, "Received death notification");
+ }
+ };
+
+ private AtomicReference<IMbmsDownloadService> mService = new AtomicReference<>(null);
+ private final InternalDownloadSessionCallback mInternalCallback;
+ private final Map<DownloadStateCallback, InternalDownloadStateCallback>
+ mInternalDownloadCallbacks = new HashMap<>();
+
+ private MbmsDownloadSession(Context context, MbmsDownloadSessionCallback callback,
+ int subscriptionId, Handler handler) {
+ mContext = context;
+ mSubscriptionId = subscriptionId;
+ if (handler == null) {
+ handler = new Handler(Looper.getMainLooper());
+ }
+ mInternalCallback = new InternalDownloadSessionCallback(callback, handler);
+ }
+
+ /**
+ * Create a new {@link MbmsDownloadSession} using the system default data subscription ID.
+ * See {@link #create(Context, MbmsDownloadSessionCallback, int, Handler)}
+ */
+ public static MbmsDownloadSession create(@NonNull Context context,
+ @NonNull MbmsDownloadSessionCallback callback, @NonNull Handler handler) {
+ return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), handler);
+ }
+
+ /**
+ * Create a new MbmsDownloadManager using the given subscription ID.
+ *
+ * Note that this call will bind a remote service and that may take a bit. The instance of
+ * {@link MbmsDownloadSession} that is returned will not be ready for use until
+ * {@link MbmsDownloadSessionCallback#onMiddlewareReady()} is called on the provided callback.
+ * If you attempt to use the instance before it is ready, an {@link IllegalStateException}
+ * will be thrown or an error will be delivered through
+ * {@link MbmsDownloadSessionCallback#onError(int, String)}.
+ *
+ * This also may throw an {@link IllegalArgumentException}.
+ *
+ * You may only have one instance of {@link MbmsDownloadSession} per UID. If you call this
+ * method while there is an active instance of {@link MbmsDownloadSession} in your process
+ * (in other words, one that has not had {@link #close()} called on it), this method will
+ * throw an {@link IllegalStateException}. If you call this method in a different process
+ * running under the same UID, an error will be indicated via
+ * {@link MbmsDownloadSessionCallback#onError(int, String)}.
+ *
+ * Note that initialization may fail asynchronously. If you wish to try again after you
+ * receive such an asynchronous error, you must call {@link #close()} on the instance of
+ * {@link MbmsDownloadSession} that you received before calling this method again.
+ *
+ * @param context The instance of {@link Context} to use
+ * @param callback A callback to get asynchronous error messages and file service updates.
+ * @param subscriptionId The data subscription ID to use
+ * @param handler The {@link Handler} on which callbacks should be enqueued.
+ * @return A new instance of {@link MbmsDownloadSession}, or null if an error occurred during
+ * setup.
+ */
+ public static @Nullable MbmsDownloadSession create(@NonNull Context context,
+ final @NonNull MbmsDownloadSessionCallback callback,
+ int subscriptionId, @NonNull Handler handler) {
+ if (!sIsInitialized.compareAndSet(false, true)) {
+ throw new IllegalStateException("Cannot have two active instances");
+ }
+ MbmsDownloadSession session =
+ new MbmsDownloadSession(context, callback, subscriptionId, handler);
+ final int result = session.bindAndInitialize();
+ if (result != MbmsErrors.SUCCESS) {
+ sIsInitialized.set(false);
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onError(result, null);
+ }
+ });
+ return null;
+ }
+ return session;
+ }
+
+ private int bindAndInitialize() {
+ return MbmsUtils.startBinding(mContext, MBMS_DOWNLOAD_SERVICE_ACTION,
+ new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ IMbmsDownloadService downloadService =
+ IMbmsDownloadService.Stub.asInterface(service);
+ int result;
+ try {
+ result = downloadService.initialize(mSubscriptionId, mInternalCallback);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Service died before initialization");
+ sIsInitialized.set(false);
+ return;
+ } catch (RuntimeException e) {
+ Log.e(LOG_TAG, "Runtime exception during initialization");
+ sendErrorToApp(
+ MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
+ e.toString());
+ sIsInitialized.set(false);
+ return;
+ }
+ if (result != MbmsErrors.SUCCESS) {
+ sendErrorToApp(result, "Error returned during initialization");
+ sIsInitialized.set(false);
+ return;
+ }
+ try {
+ downloadService.asBinder().linkToDeath(mDeathRecipient, 0);
+ } catch (RemoteException e) {
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
+ "Middleware lost during initialization");
+ sIsInitialized.set(false);
+ return;
+ }
+ mService.set(downloadService);
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ sIsInitialized.set(false);
+ mService.set(null);
+ }
+ });
+ }
+
+ /**
+ * An inspection API to retrieve the list of available
+ * {@link android.telephony.mbms.FileServiceInfo}s currently being advertised.
+ * The results are returned asynchronously via a call to
+ * {@link MbmsDownloadSessionCallback#onFileServicesUpdated(List)}
+ *
+ * Asynchronous error codes via the {@link MbmsDownloadSessionCallback#onError(int, String)}
+ * callback may include any of the errors that are not specific to the streaming use-case.
+ *
+ * May throw an {@link IllegalStateException} or {@link IllegalArgumentException}.
+ *
+ * @param classList A list of service classes which the app wishes to receive
+ * {@link MbmsDownloadSessionCallback#onFileServicesUpdated(List)} callbacks
+ * about. Subsequent calls to this method will replace this list of service
+ * classes (i.e. the middleware will no longer send updates for services
+ * matching classes only in the old list).
+ * Values in this list should be negotiated with the wireless carrier prior
+ * to using this API.
+ */
+ public void requestUpdateFileServices(@NonNull List<String> classList) {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+ try {
+ int returnCode = downloadService.requestUpdateFileServices(mSubscriptionId, classList);
+ if (returnCode != MbmsErrors.SUCCESS) {
+ sendErrorToApp(returnCode, null);
+ }
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "Remote process died");
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ }
+ }
+
+ /**
+ * Sets the temp file root for downloads.
+ * All temp files created for the middleware to write to will be contained in the specified
+ * directory. Applications that wish to specify a location only need to call this method once
+ * as long their data is persisted in storage -- the argument will be stored both in a
+ * local instance of {@link android.content.SharedPreferences} and by the middleware.
+ *
+ * If this method is not called at least once before calling
+ * {@link #download(DownloadRequest)}, the framework
+ * will default to a directory formed by the concatenation of the app's files directory and
+ * {@link MbmsDownloadSession#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY}.
+ *
+ * Before calling this method, the app must cancel all of its pending
+ * {@link DownloadRequest}s via {@link #cancelDownload(DownloadRequest)}. If this is not done,
+ * you will receive an asynchronous error with code
+ * {@link MbmsErrors.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} unless the
+ * provided directory is the same as what has been previously configured.
+ *
+ * The {@link File} supplied as a root temp file directory must already exist. If not, an
+ * {@link IllegalArgumentException} will be thrown. In addition, as an additional sanity
+ * check, an {@link IllegalArgumentException} will be thrown if you attempt to set the temp
+ * file root directory to one of your data roots (the value of {@link Context#getDataDir()},
+ * {@link Context#getFilesDir()}, or {@link Context#getCacheDir()}).
+ * @param tempFileRootDirectory A directory to place temp files in.
+ */
+ public void setTempFileRootDirectory(@NonNull File tempFileRootDirectory) {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+ try {
+ validateTempFileRootSanity(tempFileRootDirectory);
+ } catch (IOException e) {
+ throw new IllegalStateException("Got IOException checking directory sanity");
+ }
+ String filePath;
+ try {
+ filePath = tempFileRootDirectory.getCanonicalPath();
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Unable to canonicalize the provided path: " + e);
+ }
+
+ try {
+ int result = downloadService.setTempFileRootDirectory(mSubscriptionId, filePath);
+ if (result != MbmsErrors.SUCCESS) {
+ sendErrorToApp(result, null);
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return;
+ }
+
+ SharedPreferences prefs = mContext.getSharedPreferences(
+ MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
+ prefs.edit().putString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, filePath).apply();
+ }
+
+ private void validateTempFileRootSanity(File tempFileRootDirectory) throws IOException {
+ if (!tempFileRootDirectory.exists()) {
+ throw new IllegalArgumentException("Provided directory does not exist");
+ }
+ if (!tempFileRootDirectory.isDirectory()) {
+ throw new IllegalArgumentException("Provided File is not a directory");
+ }
+ String canonicalTempFilePath = tempFileRootDirectory.getCanonicalPath();
+ if (mContext.getDataDir().getCanonicalPath().equals(canonicalTempFilePath)) {
+ throw new IllegalArgumentException("Temp file root cannot be your data dir");
+ }
+ if (mContext.getCacheDir().getCanonicalPath().equals(canonicalTempFilePath)) {
+ throw new IllegalArgumentException("Temp file root cannot be your cache dir");
+ }
+ if (mContext.getFilesDir().getCanonicalPath().equals(canonicalTempFilePath)) {
+ throw new IllegalArgumentException("Temp file root cannot be your files dir");
+ }
+ }
+ /**
+ * Retrieves the currently configured temp file root directory. Returns the file that was
+ * configured via {@link #setTempFileRootDirectory(File)} or the default directory
+ * {@link #download(DownloadRequest)} was called without ever
+ * setting the temp file root. If neither method has been called since the last time the app's
+ * shared preferences were reset, returns {@code null}.
+ *
+ * @return A {@link File} pointing to the configured temp file directory, or null if not yet
+ * configured.
+ */
+ public @Nullable File getTempFileRootDirectory() {
+ SharedPreferences prefs = mContext.getSharedPreferences(
+ MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
+ String path = prefs.getString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, null);
+ if (path != null) {
+ return new File(path);
+ }
+ return null;
+ }
+
+ /**
+ * Requests the download of a file or set of files that the carrier has indicated to be
+ * available.
+ *
+ * May throw an {@link IllegalArgumentException}
+ *
+ * If {@link #setTempFileRootDirectory(File)} has not called after the app has been installed,
+ * this method will create a directory at the default location defined at
+ * {@link MbmsDownloadSession#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY} and store that as the temp
+ * file root directory.
+ *
+ * Asynchronous errors through the callback may include any error not specific to the
+ * streaming use-case.
+ * @param request The request that specifies what should be downloaded.
+ */
+ public void download(@NonNull DownloadRequest request) {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ // Check to see whether the app's set a temp root dir yet, and set it if not.
+ SharedPreferences prefs = mContext.getSharedPreferences(
+ MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
+ if (prefs.getString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, null) == null) {
+ File tempRootDirectory = new File(mContext.getFilesDir(),
+ DEFAULT_TOP_LEVEL_TEMP_DIRECTORY);
+ tempRootDirectory.mkdirs();
+ setTempFileRootDirectory(tempRootDirectory);
+ }
+
+ writeDownloadRequestToken(request);
+ try {
+ downloadService.download(request);
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ }
+ }
+
+ /**
+ * Returns a list of pending {@link DownloadRequest}s that originated from this application.
+ * A pending request is one that was issued via
+ * {@link #download(DownloadRequest)} but not cancelled through
+ * {@link #cancelDownload(DownloadRequest)}.
+ * @return A list, possibly empty, of {@link DownloadRequest}s
+ */
+ public @NonNull List<DownloadRequest> listPendingDownloads() {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ try {
+ return downloadService.listPendingDownloads(mSubscriptionId);
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * Registers a callback for a {@link DownloadRequest} previously requested via
+ * {@link #download(DownloadRequest)}. This callback will only be called as long as both this
+ * app and the middleware are both running -- if either one stops, no further calls on the
+ * provided {@link DownloadStateCallback} will be enqueued.
+ *
+ * If the middleware is not aware of the specified download request,
+ * this method will throw an {@link IllegalArgumentException}.
+ *
+ * @param request The {@link DownloadRequest} that you want updates on.
+ * @param callback The callback that should be called when the middleware has information to
+ * share on the download.
+ * @param handler The {@link Handler} on which calls to {@code callback} should be enqueued on.
+ */
+ public void registerStateCallback(@NonNull DownloadRequest request,
+ @NonNull DownloadStateCallback callback,
+ @NonNull Handler handler) {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ InternalDownloadStateCallback internalCallback =
+ new InternalDownloadStateCallback(callback, handler);
+
+ try {
+ int result = downloadService.registerStateCallback(request, internalCallback);
+ if (result != MbmsErrors.SUCCESS) {
+ if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
+ throw new IllegalArgumentException("Unknown download request.");
+ }
+ sendErrorToApp(result, null);
+ return;
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return;
+ }
+ mInternalDownloadCallbacks.put(callback, internalCallback);
+ }
+
+ /**
+ * Un-register a callback previously registered via
+ * {@link #registerStateCallback(DownloadRequest, DownloadStateCallback, Handler)}. After
+ * this method is called, no further callbacks will be enqueued on the {@link Handler}
+ * provided upon registration, even if this method throws an exception.
+ *
+ * If the middleware is not aware of the specified download request,
+ * this method will throw an {@link IllegalArgumentException}.
+ *
+ * @param request The {@link DownloadRequest} provided during registration
+ * @param callback The callback provided during registration.
+ */
+ public void unregisterStateCallback(@NonNull DownloadRequest request,
+ @NonNull DownloadStateCallback callback) {
+ try {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ InternalDownloadStateCallback internalCallback =
+ mInternalDownloadCallbacks.get(callback);
+
+ try {
+ int result = downloadService.unregisterStateCallback(request, internalCallback);
+ if (result != MbmsErrors.SUCCESS) {
+ if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
+ throw new IllegalArgumentException("Unknown download request.");
+ }
+ sendErrorToApp(result, null);
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ }
+ } finally {
+ InternalDownloadStateCallback internalCallback =
+ mInternalDownloadCallbacks.remove(callback);
+ if (internalCallback != null) {
+ internalCallback.stop();
+ }
+ }
+ }
+
+ /**
+ * Attempts to cancel the specified {@link DownloadRequest}.
+ *
+ * If the middleware is not aware of the specified download request,
+ * this method will throw an {@link IllegalArgumentException}.
+ *
+ * @param downloadRequest The download request that you wish to cancel.
+ */
+ public void cancelDownload(@NonNull DownloadRequest downloadRequest) {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ try {
+ int result = downloadService.cancelDownload(downloadRequest);
+ if (result != MbmsErrors.SUCCESS) {
+ if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
+ throw new IllegalArgumentException("Unknown download request.");
+ }
+ sendErrorToApp(result, null);
+ return;
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return;
+ }
+ deleteDownloadRequestToken(downloadRequest);
+ }
+
+ /**
+ * Gets information about the status of a file pending download.
+ *
+ * If there was a problem communicating with the middleware or if it has no records of the
+ * file indicated by {@code fileInfo} being associated with {@code downloadRequest},
+ * {@link #STATUS_UNKNOWN} will be returned.
+ *
+ * @param downloadRequest The download request to query.
+ * @param fileInfo The particular file within the request to get information on.
+ * @return The status of the download.
+ */
+ @DownloadStatus
+ public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo) {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ try {
+ return downloadService.getDownloadStatus(downloadRequest, fileInfo);
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return STATUS_UNKNOWN;
+ }
+ }
+
+ /**
+ * Resets the middleware's knowledge of previously-downloaded files in this download request.
+ *
+ * Normally, the middleware keeps track of the hashes of downloaded files and won't re-download
+ * files whose server-reported hash matches one of the already-downloaded files. This means
+ * that if the file is accidentally deleted by the user or by the app, the middleware will
+ * not try to download it again.
+ * This method will reset the middleware's cache of hashes for the provided
+ * {@link DownloadRequest}, so that previously downloaded content will be downloaded again
+ * when available.
+ * This will not interrupt in-progress downloads.
+ *
+ * This is distinct from cancelling and re-issuing the download request -- if you cancel and
+ * re-issue, the middleware will not clear its cache of download state information.
+ *
+ * If the middleware is not aware of the specified download request, an
+ * {@link IllegalArgumentException} will be thrown.
+ *
+ * @param downloadRequest The request to re-download files for.
+ */
+ public void resetDownloadKnowledge(DownloadRequest downloadRequest) {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ try {
+ int result = downloadService.resetDownloadKnowledge(downloadRequest);
+ if (result != MbmsErrors.SUCCESS) {
+ if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
+ throw new IllegalArgumentException("Unknown download request.");
+ }
+ sendErrorToApp(result, null);
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ }
+ }
+
+ /**
+ * Terminates this instance.
+ *
+ * After this method returns,
+ * no further callbacks originating from the middleware will be enqueued on the provided
+ * instance of {@link MbmsDownloadSessionCallback}, but callbacks that have already been
+ * enqueued will still be delivered.
+ *
+ * It is safe to call {@link #create(Context, MbmsDownloadSessionCallback, int, Handler)} to
+ * obtain another instance of {@link MbmsDownloadSession} immediately after this method
+ * returns.
+ *
+ * May throw an {@link IllegalStateException}
+ */
+ @Override
+ public void close() {
+ try {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ Log.i(LOG_TAG, "Service already dead");
+ return;
+ }
+ downloadService.dispose(mSubscriptionId);
+ } catch (RemoteException e) {
+ // Ignore
+ Log.i(LOG_TAG, "Remote exception while disposing of service");
+ } finally {
+ mService.set(null);
+ sIsInitialized.set(false);
+ mInternalCallback.stop();
+ }
+ }
+
+ private void writeDownloadRequestToken(DownloadRequest request) {
+ File token = getDownloadRequestTokenPath(request);
+ if (!token.getParentFile().exists()) {
+ token.getParentFile().mkdirs();
+ }
+ if (token.exists()) {
+ Log.w(LOG_TAG, "Download token " + token.getName() + " already exists");
+ return;
+ }
+ try {
+ if (!token.createNewFile()) {
+ throw new RuntimeException("Failed to create download token for request "
+ + request);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to create download token for request " + request
+ + " due to IOException " + e);
+ }
+ }
+
+ private void deleteDownloadRequestToken(DownloadRequest request) {
+ File token = getDownloadRequestTokenPath(request);
+ if (!token.isFile()) {
+ Log.w(LOG_TAG, "Attempting to delete non-existent download token at " + token);
+ return;
+ }
+ if (!token.delete()) {
+ Log.w(LOG_TAG, "Couldn't delete download token at " + token);
+ }
+ }
+
+ private File getDownloadRequestTokenPath(DownloadRequest request) {
+ File tempFileLocation = MbmsUtils.getEmbmsTempFileDirForService(mContext,
+ request.getFileServiceId());
+ String downloadTokenFileName = request.getHash()
+ + MbmsDownloadReceiver.DOWNLOAD_TOKEN_SUFFIX;
+ return new File(tempFileLocation, downloadTokenFileName);
+ }
+
+ private void sendErrorToApp(int errorCode, String message) {
+ try {
+ mInternalCallback.onError(errorCode, message);
+ } catch (RemoteException e) {
+ // Ignore, should not happen locally.
+ }
+ }
+}
diff --git a/telephony/java/android/telephony/MbmsStreamingManager.java b/telephony/java/android/telephony/MbmsStreamingManager.java
deleted file mode 100644
index b6b253e..0000000
--- a/telephony/java/android/telephony/MbmsStreamingManager.java
+++ /dev/null
@@ -1,323 +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.telephony;
-
-import android.annotation.SdkConstant;
-import android.annotation.SystemApi;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.ServiceConnection;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.telephony.mbms.InternalStreamingManagerCallback;
-import android.telephony.mbms.InternalStreamingServiceCallback;
-import android.telephony.mbms.MbmsException;
-import android.telephony.mbms.MbmsStreamingManagerCallback;
-import android.telephony.mbms.MbmsUtils;
-import android.telephony.mbms.StreamingService;
-import android.telephony.mbms.StreamingServiceCallback;
-import android.telephony.mbms.StreamingServiceInfo;
-import android.telephony.mbms.vendor.IMbmsStreamingService;
-import android.util.Log;
-
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-/**
- * This class provides functionality for streaming media over MBMS.
- */
-public class MbmsStreamingManager {
- private static final String LOG_TAG = "MbmsStreamingManager";
-
- /**
- * Service action which must be handled by the middleware implementing the MBMS streaming
- * interface.
- * @hide
- */
- @SystemApi
- @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
- public static final String MBMS_STREAMING_SERVICE_ACTION =
- "android.telephony.action.EmbmsStreaming";
-
- private static AtomicBoolean sIsInitialized = new AtomicBoolean(false);
-
- private AtomicReference<IMbmsStreamingService> mService = new AtomicReference<>(null);
- private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
- @Override
- public void binderDied() {
- sIsInitialized.set(false);
- sendErrorToApp(MbmsException.ERROR_MIDDLEWARE_LOST, "Received death notification");
- }
- };
-
- private InternalStreamingManagerCallback mInternalCallback;
-
- private final Context mContext;
- private int mSubscriptionId = INVALID_SUBSCRIPTION_ID;
-
- /** @hide */
- private MbmsStreamingManager(Context context, MbmsStreamingManagerCallback callback,
- int subscriptionId, Handler handler) {
- mContext = context;
- mSubscriptionId = subscriptionId;
- if (handler == null) {
- handler = new Handler(Looper.getMainLooper());
- }
- mInternalCallback = new InternalStreamingManagerCallback(callback, handler);
- }
-
- /**
- * Create a new MbmsStreamingManager using the given subscription ID.
- *
- * Note that this call will bind a remote service. You may not call this method on your app's
- * main thread. This may throw an {@link MbmsException}, indicating errors that may happen
- * during the initialization or binding process.
- *
- *
- * You may only have one instance of {@link MbmsStreamingManager} per UID. If you call this
- * method while there is an active instance of {@link MbmsStreamingManager} in your process
- * (in other words, one that has not had {@link #dispose()} called on it), this method will
- * throw an {@link MbmsException}. If you call this method in a different process
- * running under the same UID, an error will be indicated via
- * {@link MbmsStreamingManagerCallback#onError(int, String)}.
- *
- * Note that initialization may fail asynchronously. If you wish to try again after you
- * receive such an asynchronous error, you must call dispose() on the instance of
- * {@link MbmsStreamingManager} that you received before calling this method again.
- *
- * @param context The {@link Context} to use.
- * @param callback A callback object on which you wish to receive results of asynchronous
- * operations.
- * @param subscriptionId The subscription ID to use.
- * @param handler The handler you wish to receive callbacks on. If null, callbacks will be
- * processed on the main looper (in other words, the looper returned from
- * {@link Looper#getMainLooper()}).
- */
- public static MbmsStreamingManager create(Context context,
- MbmsStreamingManagerCallback callback, int subscriptionId, Handler handler)
- throws MbmsException {
- if (!sIsInitialized.compareAndSet(false, true)) {
- throw new MbmsException(MbmsException.InitializationErrors.ERROR_DUPLICATE_INITIALIZE);
- }
- MbmsStreamingManager manager = new MbmsStreamingManager(context, callback,
- subscriptionId, handler);
- try {
- manager.bindAndInitialize();
- } catch (MbmsException e) {
- sIsInitialized.set(false);
- throw e;
- }
- return manager;
- }
-
- /**
- * Create a new MbmsStreamingManager using the system default data subscription ID.
- * See {@link #create(Context, MbmsStreamingManagerCallback, int, Handler)}.
- */
- public static MbmsStreamingManager create(Context context,
- MbmsStreamingManagerCallback callback, Handler handler)
- throws MbmsException {
- return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), handler);
- }
-
- /**
- * Create a new MbmsStreamingManager using the system default data subscription ID and
- * default {@link Handler}.
- * See {@link #create(Context, MbmsStreamingManagerCallback, int, Handler)}.
- */
- public static MbmsStreamingManager create(Context context,
- MbmsStreamingManagerCallback callback)
- throws MbmsException {
- return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), null);
- }
-
- /**
- * Terminates this instance, ending calls to the registered listener. Also terminates
- * any streaming services spawned from this instance.
- *
- * May throw an {@link IllegalStateException}
- */
- public void dispose() {
- try {
- IMbmsStreamingService streamingService = mService.get();
- if (streamingService == null) {
- // Ignore and return, assume already disposed.
- return;
- }
- streamingService.dispose(mSubscriptionId);
- } catch (RemoteException e) {
- // Ignore for now
- } finally {
- mService.set(null);
- sIsInitialized.set(false);
- }
- }
-
- /**
- * An inspection API to retrieve the list of streaming media currently be advertised.
- * The results are returned asynchronously through the previously registered callback.
- * serviceClasses lets the app filter on types of programming and is opaque data between
- * the app and the carrier.
- *
- * Multiple calls replace the list of serviceClasses of interest.
- *
- * This may throw an {@link MbmsException} containing any error in
- * {@link android.telephony.mbms.MbmsException.GeneralErrors},
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or
- * {@link MbmsException#ERROR_MIDDLEWARE_LOST}.
- *
- * May also throw an unchecked {@link IllegalArgumentException} or an
- * {@link IllegalStateException}
- *
- * @param classList A list of streaming service classes that the app would like updates on.
- */
- public void getStreamingServices(List<String> classList) throws MbmsException {
- IMbmsStreamingService streamingService = mService.get();
- if (streamingService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
- try {
- int returnCode = streamingService.getStreamingServices(mSubscriptionId, classList);
- if (returnCode != MbmsException.SUCCESS) {
- throw new MbmsException(returnCode);
- }
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "Remote process died");
- mService.set(null);
- sIsInitialized.set(false);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
- }
-
- /**
- * Starts streaming a requested service, reporting status to the indicated callback.
- * Returns an object used to control that stream. The stream may not be ready for consumption
- * immediately upon return from this method -- wait until the streaming state has been
- * reported via
- * {@link android.telephony.mbms.StreamingServiceCallback#onStreamStateUpdated(int, int)}
- *
- * May throw an
- * {@link MbmsException} containing any of the error codes in
- * {@link android.telephony.mbms.MbmsException.GeneralErrors},
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or
- * {@link MbmsException#ERROR_MIDDLEWARE_LOST}.
- *
- * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
- *
- * Asynchronous errors through the callback include any of the errors in
- * {@link android.telephony.mbms.MbmsException.GeneralErrors} or
- * {@link android.telephony.mbms.MbmsException.StreamingErrors}.
- *
- * @param serviceInfo The information about the service to stream.
- * @param callback A callback that'll be called when something about the stream changes.
- * @param handler A handler that calls to {@code callback} should be called on. If null,
- * defaults to the handler provided via
- * {@link #create(Context, MbmsStreamingManagerCallback, int, Handler)}.
- * @return An instance of {@link StreamingService} through which the stream can be controlled.
- */
- public StreamingService startStreaming(StreamingServiceInfo serviceInfo,
- StreamingServiceCallback callback, Handler handler) throws MbmsException {
- IMbmsStreamingService streamingService = mService.get();
- if (streamingService == null) {
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
- }
-
- InternalStreamingServiceCallback serviceCallback = new InternalStreamingServiceCallback(
- callback, handler == null ? mInternalCallback.getHandler() : handler);
-
- StreamingService serviceForApp = new StreamingService(
- mSubscriptionId, streamingService, serviceInfo, serviceCallback);
-
- try {
- int returnCode = streamingService.startStreaming(
- mSubscriptionId, serviceInfo.getServiceId(), serviceCallback);
- if (returnCode != MbmsException.SUCCESS) {
- throw new MbmsException(returnCode);
- }
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "Remote process died");
- mService.set(null);
- sIsInitialized.set(false);
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- }
-
- return serviceForApp;
- }
-
- private void bindAndInitialize() throws MbmsException {
- MbmsUtils.startBinding(mContext, MBMS_STREAMING_SERVICE_ACTION,
- new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- IMbmsStreamingService streamingService =
- IMbmsStreamingService.Stub.asInterface(service);
- int result;
- try {
- result = streamingService.initialize(mInternalCallback,
- mSubscriptionId);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Service died before initialization");
- sendErrorToApp(
- MbmsException.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
- e.toString());
- sIsInitialized.set(false);
- return;
- } catch (RuntimeException e) {
- Log.e(LOG_TAG, "Runtime exception during initialization");
- sendErrorToApp(
- MbmsException.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
- e.toString());
- sIsInitialized.set(false);
- return;
- }
- if (result != MbmsException.SUCCESS) {
- sendErrorToApp(result, "Error returned during initialization");
- sIsInitialized.set(false);
- return;
- }
- try {
- streamingService.asBinder().linkToDeath(mDeathRecipient, 0);
- } catch (RemoteException e) {
- sendErrorToApp(MbmsException.ERROR_MIDDLEWARE_LOST,
- "Middleware lost during initialization");
- sIsInitialized.set(false);
- return;
- }
- mService.set(streamingService);
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- sIsInitialized.set(false);
- mService.set(null);
- }
- });
- }
-
- private void sendErrorToApp(int errorCode, String message) {
- try {
- mInternalCallback.error(errorCode, message);
- } catch (RemoteException e) {
- // Ignore, should not happen locally.
- }
- }
-}
diff --git a/telephony/java/android/telephony/MbmsStreamingSession.java b/telephony/java/android/telephony/MbmsStreamingSession.java
new file mode 100644
index 0000000..a8c4607
--- /dev/null
+++ b/telephony/java/android/telephony/MbmsStreamingSession.java
@@ -0,0 +1,330 @@
+/*
+ * 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.telephony;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.telephony.mbms.InternalStreamingSessionCallback;
+import android.telephony.mbms.InternalStreamingServiceCallback;
+import android.telephony.mbms.MbmsErrors;
+import android.telephony.mbms.MbmsStreamingSessionCallback;
+import android.telephony.mbms.MbmsUtils;
+import android.telephony.mbms.StreamingService;
+import android.telephony.mbms.StreamingServiceCallback;
+import android.telephony.mbms.StreamingServiceInfo;
+import android.telephony.mbms.vendor.IMbmsStreamingService;
+import android.util.ArraySet;
+import android.util.Log;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+/**
+ * This class provides functionality for streaming media over MBMS.
+ */
+public class MbmsStreamingSession implements AutoCloseable {
+ private static final String LOG_TAG = "MbmsStreamingSession";
+
+ /**
+ * Service action which must be handled by the middleware implementing the MBMS streaming
+ * interface.
+ * @hide
+ */
+ @SystemApi
+ @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+ public static final String MBMS_STREAMING_SERVICE_ACTION =
+ "android.telephony.action.EmbmsStreaming";
+
+ private static AtomicBoolean sIsInitialized = new AtomicBoolean(false);
+
+ private AtomicReference<IMbmsStreamingService> mService = new AtomicReference<>(null);
+ private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ sIsInitialized.set(false);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, "Received death notification");
+ }
+ };
+
+ private InternalStreamingSessionCallback mInternalCallback;
+ private Set<StreamingService> mKnownActiveStreamingServices = new ArraySet<>();
+
+ private final Context mContext;
+ private int mSubscriptionId = INVALID_SUBSCRIPTION_ID;
+
+ /** @hide */
+ private MbmsStreamingSession(Context context, MbmsStreamingSessionCallback callback,
+ int subscriptionId, Handler handler) {
+ mContext = context;
+ mSubscriptionId = subscriptionId;
+ if (handler == null) {
+ handler = new Handler(Looper.getMainLooper());
+ }
+ mInternalCallback = new InternalStreamingSessionCallback(callback, handler);
+ }
+
+ /**
+ * Create a new {@link MbmsStreamingSession} using the given subscription ID.
+ *
+ * Note that this call will bind a remote service. You may not call this method on your app's
+ * main thread.
+ *
+ * You may only have one instance of {@link MbmsStreamingSession} per UID. If you call this
+ * method while there is an active instance of {@link MbmsStreamingSession} in your process
+ * (in other words, one that has not had {@link #close()} called on it), this method will
+ * throw an {@link IllegalStateException}. If you call this method in a different process
+ * running under the same UID, an error will be indicated via
+ * {@link MbmsStreamingSessionCallback#onError(int, String)}.
+ *
+ * Note that initialization may fail asynchronously. If you wish to try again after you
+ * receive such an asynchronous error, you must call {@link #close()} on the instance of
+ * {@link MbmsStreamingSession} that you received before calling this method again.
+ *
+ * @param context The {@link Context} to use.
+ * @param callback A callback object on which you wish to receive results of asynchronous
+ * operations.
+ * @param subscriptionId The subscription ID to use.
+ * @param handler The handler you wish to receive callbacks on.
+ * @return An instance of {@link MbmsStreamingSession}, or null if an error occurred.
+ */
+ public static @Nullable MbmsStreamingSession create(@NonNull Context context,
+ final @NonNull MbmsStreamingSessionCallback callback, int subscriptionId,
+ @NonNull Handler handler) {
+ if (!sIsInitialized.compareAndSet(false, true)) {
+ throw new IllegalStateException("Cannot create two instances of MbmsStreamingSession");
+ }
+ MbmsStreamingSession session = new MbmsStreamingSession(context, callback,
+ subscriptionId, handler);
+
+ final int result = session.bindAndInitialize();
+ if (result != MbmsErrors.SUCCESS) {
+ sIsInitialized.set(false);
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onError(result, null);
+ }
+ });
+ return null;
+ }
+ return session;
+ }
+
+ /**
+ * Create a new {@link MbmsStreamingSession} using the system default data subscription ID.
+ * See {@link #create(Context, MbmsStreamingSessionCallback, int, Handler)}.
+ */
+ public static MbmsStreamingSession create(@NonNull Context context,
+ @NonNull MbmsStreamingSessionCallback callback, @NonNull Handler handler) {
+ return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), handler);
+ }
+
+ /**
+ * Terminates this instance. Also terminates
+ * any streaming services spawned from this instance as if
+ * {@link StreamingService#stopStreaming()} had been called on them. After this method returns,
+ * no further callbacks originating from the middleware will be enqueued on the provided
+ * instance of {@link MbmsStreamingSessionCallback}, but callbacks that have already been
+ * enqueued will still be delivered.
+ *
+ * It is safe to call {@link #create(Context, MbmsStreamingSessionCallback, int, Handler)} to
+ * obtain another instance of {@link MbmsStreamingSession} immediately after this method
+ * returns.
+ *
+ * May throw an {@link IllegalStateException}
+ */
+ public void close() {
+ try {
+ IMbmsStreamingService streamingService = mService.get();
+ if (streamingService == null) {
+ // Ignore and return, assume already disposed.
+ return;
+ }
+ streamingService.dispose(mSubscriptionId);
+ for (StreamingService s : mKnownActiveStreamingServices) {
+ s.getCallback().stop();
+ }
+ mKnownActiveStreamingServices.clear();
+ } catch (RemoteException e) {
+ // Ignore for now
+ } finally {
+ mService.set(null);
+ sIsInitialized.set(false);
+ mInternalCallback.stop();
+ }
+ }
+
+ /**
+ * An inspection API to retrieve the list of streaming media currently be advertised.
+ * The results are returned asynchronously via
+ * {@link MbmsStreamingSessionCallback#onStreamingServicesUpdated(List)} on the callback
+ * provided upon creation.
+ *
+ * Multiple calls replace the list of service classes of interest.
+ *
+ * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}.
+ *
+ * @param serviceClassList A list of streaming service classes that the app would like updates
+ * on. The exact names of these classes should be negotiated with the
+ * wireless carrier separately.
+ */
+ public void requestUpdateStreamingServices(List<String> serviceClassList) {
+ IMbmsStreamingService streamingService = mService.get();
+ if (streamingService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+ try {
+ int returnCode = streamingService.requestUpdateStreamingServices(
+ mSubscriptionId, serviceClassList);
+ if (returnCode != MbmsErrors.SUCCESS) {
+ sendErrorToApp(returnCode, null);
+ }
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "Remote process died");
+ mService.set(null);
+ sIsInitialized.set(false);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ }
+ }
+
+ /**
+ * Starts streaming a requested service, reporting status to the indicated callback.
+ * Returns an object used to control that stream. The stream may not be ready for consumption
+ * immediately upon return from this method -- wait until the streaming state has been
+ * reported via
+ * {@link android.telephony.mbms.StreamingServiceCallback#onStreamStateUpdated(int, int)}
+ *
+ * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
+ *
+ * Asynchronous errors through the callback include any of the errors in
+ * {@link MbmsErrors.GeneralErrors} or
+ * {@link MbmsErrors.StreamingErrors}.
+ *
+ * @param serviceInfo The information about the service to stream.
+ * @param callback A callback that'll be called when something about the stream changes.
+ * @param handler A handler that calls to {@code callback} should be called on.
+ * @return An instance of {@link StreamingService} through which the stream can be controlled.
+ * May be {@code null} if an error occurred.
+ */
+ public @Nullable StreamingService startStreaming(StreamingServiceInfo serviceInfo,
+ StreamingServiceCallback callback, @NonNull Handler handler) {
+ IMbmsStreamingService streamingService = mService.get();
+ if (streamingService == null) {
+ throw new IllegalStateException("Middleware not yet bound");
+ }
+
+ InternalStreamingServiceCallback serviceCallback = new InternalStreamingServiceCallback(
+ callback, handler);
+
+ StreamingService serviceForApp = new StreamingService(
+ mSubscriptionId, streamingService, this, serviceInfo, serviceCallback);
+ mKnownActiveStreamingServices.add(serviceForApp);
+
+ try {
+ int returnCode = streamingService.startStreaming(
+ mSubscriptionId, serviceInfo.getServiceId(), serviceCallback);
+ if (returnCode != MbmsErrors.SUCCESS) {
+ sendErrorToApp(returnCode, null);
+ return null;
+ }
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "Remote process died");
+ mService.set(null);
+ sIsInitialized.set(false);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return null;
+ }
+
+ return serviceForApp;
+ }
+
+ /** @hide */
+ public void onStreamingServiceStopped(StreamingService service) {
+ mKnownActiveStreamingServices.remove(service);
+ }
+
+ private int bindAndInitialize() {
+ return MbmsUtils.startBinding(mContext, MBMS_STREAMING_SERVICE_ACTION,
+ new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ IMbmsStreamingService streamingService =
+ IMbmsStreamingService.Stub.asInterface(service);
+ int result;
+ try {
+ result = streamingService.initialize(mInternalCallback,
+ mSubscriptionId);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Service died before initialization");
+ sendErrorToApp(
+ MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
+ e.toString());
+ sIsInitialized.set(false);
+ return;
+ } catch (RuntimeException e) {
+ Log.e(LOG_TAG, "Runtime exception during initialization");
+ sendErrorToApp(
+ MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
+ e.toString());
+ sIsInitialized.set(false);
+ return;
+ }
+ if (result != MbmsErrors.SUCCESS) {
+ sendErrorToApp(result, "Error returned during initialization");
+ sIsInitialized.set(false);
+ return;
+ }
+ try {
+ streamingService.asBinder().linkToDeath(mDeathRecipient, 0);
+ } catch (RemoteException e) {
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
+ "Middleware lost during initialization");
+ sIsInitialized.set(false);
+ return;
+ }
+ mService.set(streamingService);
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ sIsInitialized.set(false);
+ mService.set(null);
+ }
+ });
+ }
+
+ private void sendErrorToApp(int errorCode, String message) {
+ try {
+ mInternalCallback.onError(errorCode, message);
+ } catch (RemoteException e) {
+ // Ignore, should not happen locally.
+ }
+ }
+}
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index 8705446..d5ff1ad 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -2540,11 +2540,11 @@
}
// Split a phone number like "+20(123)-456#" using spaces, ignoring anything that is not
- // a digit, to produce a result like "20 123 456".
+ // a digit or the characters * and #, to produce a result like "20 123 456#".
private static String splitAtNonNumerics(CharSequence number) {
StringBuilder sb = new StringBuilder(number.length());
for (int i = 0; i < number.length(); i++) {
- sb.append(PhoneNumberUtils.isISODigit(number.charAt(i))
+ sb.append(PhoneNumberUtils.is12Key(number.charAt(i))
? number.charAt(i)
: " ");
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 98cb1f9..cde0bdf 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -48,6 +48,7 @@
import android.service.carrier.CarrierIdentifier;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
import android.telephony.VisualVoicemailService.VisualVoicemailTask;
import android.telephony.ims.feature.ImsFeature;
import android.util.Log;
@@ -1678,6 +1679,10 @@
}
}
+ /*
+ * When adding a network type to the list below, make sure to add the correct icon to
+ * MobileSignalController.mapIconSets().
+ */
/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN = 0;
/** Current network is GPRS */
@@ -5159,7 +5164,12 @@
}
}
- /** @hide */
+ /**
+ * @deprecated Use {@link android.telecom.TelecomManager#placeCall(Uri address,
+ * Bundle extras)} instead.
+ * @hide
+ */
+ @Deprecated
@SystemApi
@RequiresPermission(android.Manifest.permission.CALL_PHONE)
public void call(String callingPackage, String number) {
@@ -5172,7 +5182,11 @@
}
}
- /** @hide */
+ /**
+ * @deprecated Use {@link android.telecom.TelecomManager#endCall()} instead.
+ * @hide
+ */
+ @Deprecated
@SystemApi
@RequiresPermission(android.Manifest.permission.CALL_PHONE)
public boolean endCall() {
@@ -5186,7 +5200,11 @@
return false;
}
- /** @hide */
+ /**
+ * @deprecated Use {@link android.telecom.TelecomManager#acceptRingingCall} instead
+ * @hide
+ */
+ @Deprecated
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public void answerRingingCall() {
@@ -5199,7 +5217,11 @@
}
}
- /** @hide */
+ /**
+ * @deprecated Use {@link android.telecom.TelecomManager#silenceRinger} instead
+ * @hide
+ */
+ @Deprecated
@SystemApi
@SuppressLint("Doclava125")
public void silenceRinger() {
@@ -5754,10 +5776,13 @@
}
/**
+ * @deprecated Use {@link TelecomManager#isTtySupported()} instead
* Whether the phone supports TTY mode.
*
* @return {@code true} if the device supports TTY mode, and {@code false} otherwise.
+ *
*/
+ @Deprecated
public boolean isTtyModeSupported() {
try {
ITelephony telephony = getITelephony();
@@ -5810,6 +5835,25 @@
}
/**
+ * Returns the IMS Registration Status for a particular Subscription ID
+ *
+ * @param subId Subscription ID
+ * @return true if IMS status is registered, false if the IMS status is not registered or a
+ * RemoteException occurred.
+ *
+ * @hide
+ */
+ public boolean isImsRegistered(int subId) {
+ try {
+ return getITelephony().isImsRegisteredForSubscriber(subId);
+ } catch (RemoteException ex) {
+ return false;
+ } catch (NullPointerException ex) {
+ return false;
+ }
+ }
+
+ /**
* Returns the Status of Volte
* @hide
*/
@@ -6793,7 +6837,6 @@
* Get the most recent SignalStrength information reported by the modem. Due
* to power saving this information may not always be current.
* @return the most recent cached signal strength info from the modem
- * @hide
*/
@Nullable
public SignalStrength getSignalStrength() {
diff --git a/telephony/java/android/telephony/mbms/DownloadProgressListener.java b/telephony/java/android/telephony/mbms/DownloadProgressListener.java
deleted file mode 100644
index d91e9ad..0000000
--- a/telephony/java/android/telephony/mbms/DownloadProgressListener.java
+++ /dev/null
@@ -1,48 +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.telephony.mbms;
-
-import android.os.RemoteException;
-
-/**
- * A optional listener class used by download clients to track progress.
- * @hide
- */
-public class DownloadProgressListener extends IDownloadProgressListener.Stub {
- /**
- * Gives process callbacks for a given DownloadRequest.
- * This is optionally specified when requesting a download and
- * only lives while the app is running - it's unlikely to be useful for
- * downloads far in the future.
- *
- * @param request a {@link DownloadRequest}, indicating which download is being referenced.
- * @param fileInfo a {@link FileInfo} specifying the file to report progress on. Note that
- * the request may result in many files being downloaded and the client
- * may not have been able to get a list of them in advance.
- * @param currentDownloadSize is the current amount downloaded.
- * @param fullDownloadSize is the total number of bytes that make up the downloaded content.
- * This may be different from the decoded final size, but is useful in gauging download
- * progress.
- * @param currentDecodedSize is the number of bytes that have been decoded.
- * @param fullDecodedSize is the total number of bytes that make up the final decoded content.
- */
- @Override
- public void progress(DownloadRequest request, FileInfo fileInfo,
- int currentDownloadSize, int fullDownloadSize,
- int currentDecodedSize, int fullDecodedSize) throws RemoteException {
- }
-}
diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java
index eae9011..5a57f32 100644
--- a/telephony/java/android/telephony/mbms/DownloadRequest.java
+++ b/telephony/java/android/telephony/mbms/DownloadRequest.java
@@ -16,6 +16,7 @@
package android.telephony.mbms;
+import android.annotation.SystemApi;
import android.content.Intent;
import android.net.Uri;
import android.os.Parcel;
@@ -37,34 +38,27 @@
import java.util.Objects;
/**
- * A Parcelable class describing a pending Cell-Broadcast download request
- * @hide
+ * Describes a request to download files over cell-broadcast. Instances of this class should be
+ * created by the app when requesting a download, and instances of this class will be passed back
+ * to the app when the middleware updates the status of the download.
*/
-public class DownloadRequest implements Parcelable {
+public final class DownloadRequest implements Parcelable {
// Version code used to keep token calculation consistent.
private static final int CURRENT_VERSION = 1;
private static final String LOG_TAG = "MbmsDownloadRequest";
- /**
- * Maximum permissible length for the app's download-completion intent, when serialized via
- * {@link Intent#toUri(int)}.
- */
+ /** @hide */
public static final int MAX_APP_INTENT_SIZE = 50000;
- /**
- * Maximum permissible length for the app's destination path, when serialized via
- * {@link Uri#toString()}.
- */
+ /** @hide */
public static final int MAX_DESTINATION_URI_SIZE = 50000;
/** @hide */
private static class OpaqueDataContainer implements Serializable {
- private final String destinationUri;
private final String appIntent;
private final int version;
- public OpaqueDataContainer(String destinationUri, String appIntent, int version) {
- this.destinationUri = destinationUri;
+ public OpaqueDataContainer(String appIntent, int version) {
this.appIntent = appIntent;
this.version = version;
}
@@ -73,7 +67,6 @@
public static class Builder {
private String fileServiceId;
private Uri source;
- private Uri dest;
private int subscriptionId;
private String appIntent;
private int version = CURRENT_VERSION;
@@ -91,8 +84,8 @@
/**
* Set the service ID for the download request. For use by the middleware only.
* @hide
- * TODO: systemapi
*/
+ @SystemApi
public Builder setServiceId(String serviceId) {
fileServiceId = serviceId;
return this;
@@ -101,7 +94,6 @@
/**
* Sets the source URI for the download request to be built.
* @param source
- * @return
*/
public Builder setSource(Uri source) {
this.source = source;
@@ -109,25 +101,8 @@
}
/**
- * Sets the destination URI for the download request to be built. The middleware should
- * not set this directly.
- * @param dest A URI obtained from {@link Uri#fromFile(File)}, denoting the requested
- * final destination of the download.
- * @return
- */
- public Builder setDest(Uri dest) {
- if (dest.toString().length() > MAX_DESTINATION_URI_SIZE) {
- throw new IllegalArgumentException("Destination uri must not exceed length " +
- MAX_DESTINATION_URI_SIZE);
- }
- this.dest = dest;
- return this;
- }
-
- /**
* Set the subscription ID on which the file(s) should be downloaded.
* @param subscriptionId
- * @return
*/
public Builder setSubscriptionId(int subscriptionId) {
this.subscriptionId = subscriptionId;
@@ -141,7 +116,6 @@
*
* The middleware should not use this method.
* @param intent
- * @return
*/
public Builder setAppIntent(Intent intent) {
this.appIntent = intent.toUri(0);
@@ -158,17 +132,15 @@
* manager code, but is irrelevant to the middleware.
* @param data A byte array, the contents of which should have been originally obtained
* from {@link DownloadRequest#getOpaqueData()}.
- * @return
- * TODO: systemapi
* @hide
*/
+ @SystemApi
public Builder setOpaqueData(byte[] data) {
try {
ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(data));
OpaqueDataContainer dataContainer = (OpaqueDataContainer) stream.readObject();
version = dataContainer.version;
appIntent = dataContainer.appIntent;
- dest = Uri.parse(dataContainer.destinationUri);
} catch (IOException e) {
// Really should never happen
Log.e(LOG_TAG, "Got IOException trying to parse opaque data");
@@ -181,24 +153,21 @@
}
public DownloadRequest build() {
- return new DownloadRequest(fileServiceId, source, dest,
- subscriptionId, appIntent, version);
+ return new DownloadRequest(fileServiceId, source, subscriptionId, appIntent, version);
}
}
private final String fileServiceId;
private final Uri sourceUri;
- private final Uri destinationUri;
private final int subscriptionId;
private final String serializedResultIntentForApp;
private final int version;
private DownloadRequest(String fileServiceId,
- Uri source, Uri dest,
- int sub, String appIntent, int version) {
+ Uri source, int sub,
+ String appIntent, int version) {
this.fileServiceId = fileServiceId;
sourceUri = source;
- destinationUri = dest;
subscriptionId = sub;
serializedResultIntentForApp = appIntent;
this.version = version;
@@ -211,7 +180,6 @@
private DownloadRequest(DownloadRequest dr) {
fileServiceId = dr.fileServiceId;
sourceUri = dr.sourceUri;
- destinationUri = dr.destinationUri;
subscriptionId = dr.subscriptionId;
serializedResultIntentForApp = dr.serializedResultIntentForApp;
version = dr.version;
@@ -220,7 +188,6 @@
private DownloadRequest(Parcel in) {
fileServiceId = in.readString();
sourceUri = in.readParcelable(getClass().getClassLoader());
- destinationUri = in.readParcelable(getClass().getClassLoader());
subscriptionId = in.readInt();
serializedResultIntentForApp = in.readString();
version = in.readInt();
@@ -233,7 +200,6 @@
public void writeToParcel(Parcel out, int flags) {
out.writeString(fileServiceId);
out.writeParcelable(sourceUri, flags);
- out.writeParcelable(destinationUri, flags);
out.writeInt(subscriptionId);
out.writeString(serializedResultIntentForApp);
out.writeInt(version);
@@ -254,14 +220,6 @@
}
/**
- * For use by the client app only.
- * @return The URI of the final destination of the download.
- */
- public Uri getDestinationUri() {
- return destinationUri;
- }
-
- /**
* @return The subscription ID on which to perform MBMS operations.
*/
public int getSubscriptionId() {
@@ -287,14 +245,14 @@
* {@link Builder#setOpaqueData(byte[])}.
* @return A byte array of opaque data to persist.
* @hide
- * TODO: systemapi
*/
+ @SystemApi
public byte[] getOpaqueData() {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(byteArrayOutputStream);
OpaqueDataContainer container = new OpaqueDataContainer(
- destinationUri.toString(), serializedResultIntentForApp, version);
+ serializedResultIntentForApp, version);
stream.writeObject(container);
stream.flush();
return byteArrayOutputStream.toByteArray();
@@ -321,6 +279,22 @@
};
/**
+ * Maximum permissible length for the app's destination path, when serialized via
+ * {@link Uri#toString()}.
+ */
+ public static int getMaxAppIntentSize() {
+ return MAX_APP_INTENT_SIZE;
+ }
+
+ /**
+ * Maximum permissible length for the app's download-completion intent, when serialized via
+ * {@link Intent#toUri(int)}.
+ */
+ public static int getMaxDestinationUriSize() {
+ return MAX_DESTINATION_URI_SIZE;
+ }
+
+ /**
* @hide
*/
public boolean isMultipartDownload() {
@@ -344,7 +318,6 @@
if (version >= 1) {
// Hash the source URI, destination URI, and the app intent
digest.update(sourceUri.toString().getBytes(StandardCharsets.UTF_8));
- digest.update(destinationUri.toString().getBytes(StandardCharsets.UTF_8));
digest.update(serializedResultIntentForApp.getBytes(StandardCharsets.UTF_8));
}
// Add updates for future versions here
@@ -365,13 +338,12 @@
version == request.version &&
Objects.equals(fileServiceId, request.fileServiceId) &&
Objects.equals(sourceUri, request.sourceUri) &&
- Objects.equals(destinationUri, request.destinationUri) &&
Objects.equals(serializedResultIntentForApp, request.serializedResultIntentForApp);
}
@Override
public int hashCode() {
- return Objects.hash(fileServiceId, sourceUri, destinationUri,
+ return Objects.hash(fileServiceId, sourceUri,
subscriptionId, serializedResultIntentForApp, version);
}
}
diff --git a/telephony/java/android/telephony/mbms/DownloadStateCallback.java b/telephony/java/android/telephony/mbms/DownloadStateCallback.java
new file mode 100644
index 0000000..86920bd
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/DownloadStateCallback.java
@@ -0,0 +1,62 @@
+/*
+ * 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.telephony.mbms;
+
+import android.telephony.MbmsDownloadSession;
+
+/**
+ * A optional listener class used by download clients to track progress. Apps should extend this
+ * class and pass an instance into
+ * {@link MbmsDownloadSession#download(DownloadRequest)}
+ *
+ * This is optionally specified when requesting a download and will only be called while the app
+ * is running.
+ */
+public class DownloadStateCallback {
+
+ /**
+ * Called when the middleware wants to report progress for a file in a {@link DownloadRequest}.
+ *
+ * @param request a {@link DownloadRequest}, indicating which download is being referenced.
+ * @param fileInfo a {@link FileInfo} specifying the file to report progress on. Note that
+ * the request may result in many files being downloaded and the client
+ * may not have been able to get a list of them in advance.
+ * @param currentDownloadSize is the current amount downloaded.
+ * @param fullDownloadSize is the total number of bytes that make up the downloaded content.
+ * This may be different from the decoded final size, but is useful in gauging download
+ * progress.
+ * @param currentDecodedSize is the number of bytes that have been decoded.
+ * @param fullDecodedSize is the total number of bytes that make up the final decoded content.
+ */
+ public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+ int currentDownloadSize, int fullDownloadSize,
+ int currentDecodedSize, int fullDecodedSize) {
+ }
+
+ /**
+ * Gives download state callbacks for a file in a {@link DownloadRequest}.
+ *
+ * @param request a {@link DownloadRequest}, indicating which download is being referenced.
+ * @param fileInfo a {@link FileInfo} specifying the file to report progress on. Note that
+ * the request may result in many files being downloaded and the client
+ * may not have been able to get a list of them in advance.
+ * @param state The current state of the download.
+ */
+ public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
+ @MbmsDownloadSession.DownloadStatus int state) {
+ }
+}
diff --git a/telephony/java/android/telephony/mbms/FileInfo.java b/telephony/java/android/telephony/mbms/FileInfo.java
index f97131d..0d737b5 100644
--- a/telephony/java/android/telephony/mbms/FileInfo.java
+++ b/telephony/java/android/telephony/mbms/FileInfo.java
@@ -16,26 +16,18 @@
package android.telephony.mbms;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
/**
- * A Parcelable class Cell-Broadcast downloadable file information.
- * @hide
+ * Describes a single file that is available over MBMS.
*/
-public class FileInfo implements Parcelable {
+public final class FileInfo implements Parcelable {
- /**
- * The URI into the carriers infrastructure which points to this file.
- * This is used internally but is also one of the few pieces of data about the content that is
- * exposed and may be needed for disambiguation by the application.
- */
private final Uri uri;
- /**
- * The mime type of the content.
- */
private final String mimeType;
public static final Parcelable.Creator<FileInfo> CREATOR =
@@ -53,8 +45,8 @@
/**
* @hide
- * TODO: systemapi
*/
+ @SystemApi
public FileInfo(Uri uri, String mimeType) {
this.uri = uri;
this.mimeType = mimeType;
@@ -76,10 +68,17 @@
return 0;
}
+ /**
+ * @return The URI in the carrier's infrastructure which points to this file. Apps should
+ * negotiate the contents of this URI separately with the carrier.
+ */
public Uri getUri() {
return uri;
}
+ /**
+ * @return The MIME type of the file.
+ */
public String getMimeType() {
return mimeType;
}
diff --git a/telephony/java/android/telephony/mbms/FileServiceInfo.java b/telephony/java/android/telephony/mbms/FileServiceInfo.java
index 8afe4d3..d8d7f48 100644
--- a/telephony/java/android/telephony/mbms/FileServiceInfo.java
+++ b/telephony/java/android/telephony/mbms/FileServiceInfo.java
@@ -16,6 +16,7 @@
package android.telephony.mbms;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -26,13 +27,14 @@
import java.util.Map;
/**
- * A Parcelable class Cell-Broadcast downloadable file information.
- * @hide
+ * Describes a file service available from the carrier from which files can be downloaded via
+ * cell-broadcast.
*/
-public class FileServiceInfo extends ServiceInfo implements Parcelable {
+public final class FileServiceInfo extends ServiceInfo implements Parcelable {
private final List<FileInfo> files;
- /** @hide TODO: systemapi */
+ /** @hide */
+ @SystemApi
public FileServiceInfo(Map<Locale, String> newNames, String newClassName,
List<Locale> newLocales, String newServiceId, Date start, Date end,
List<FileInfo> newFiles) {
@@ -56,7 +58,7 @@
FileServiceInfo(Parcel in) {
super(in);
files = new ArrayList<FileInfo>();
- in.readList(files, null);
+ in.readList(files, FileInfo.class.getClassLoader());
}
@Override
@@ -70,8 +72,12 @@
return 0;
}
+ /**
+ * @return A list of files available from this service. Note that this list may not be
+ * exhaustive -- the middleware may not have information on all files that are available.
+ * Consult the carrier for an authoritative and exhaustive list.
+ */
public List<FileInfo> getFiles() {
return files;
}
-
}
diff --git a/telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl b/telephony/java/android/telephony/mbms/IDownloadStateCallback.aidl
similarity index 75%
rename from telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl
rename to telephony/java/android/telephony/mbms/IDownloadStateCallback.aidl
index bb9dc6c..cebc70d 100755
--- a/telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl
+++ b/telephony/java/android/telephony/mbms/IDownloadStateCallback.aidl
@@ -23,12 +23,15 @@
* The optional interface used by download clients to track progress.
* @hide
*/
-interface IDownloadProgressListener
+interface IDownloadStateCallback
{
/**
* Gives progress callbacks for a given DownloadRequest. Includes a FileInfo
* as the list of files may not have been known at request-time.
*/
- void progress(in DownloadRequest request, in FileInfo fileInfo, int currentDownloadSize,
- int fullDownloadSize, int currentDecodedSize, int fullDecodedSize);
+ void onProgressUpdated(in DownloadRequest request, in FileInfo fileInfo,
+ int currentDownloadSize, int fullDownloadSize,
+ int currentDecodedSize, int fullDecodedSize);
+
+ void onStateUpdated(in DownloadRequest request, in FileInfo fileInfo, int state);
}
diff --git a/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl
similarity index 80%
rename from telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl
rename to telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl
index ac2f202..0d813a7 100755
--- a/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl
@@ -24,11 +24,11 @@
* The interface the clients top-level file download listener will satisfy.
* @hide
*/
-oneway interface IMbmsDownloadManagerCallback
+oneway interface IMbmsDownloadSessionCallback
{
- void error(int errorCode, String message);
+ void onError(int errorCode, String message);
- void fileServicesUpdated(in List<FileServiceInfo> services);
+ void onFileServicesUpdated(in List<FileServiceInfo> services);
- void middlewareReady();
+ void onMiddlewareReady();
}
diff --git a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl
similarity index 80%
rename from telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
rename to telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl
index 007aee7..0bf0ebc 100755
--- a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl
@@ -24,11 +24,11 @@
* The interface the clients top-level streaming listener will satisfy.
* @hide
*/
-oneway interface IMbmsStreamingManagerCallback
+oneway interface IMbmsStreamingSessionCallback
{
- void error(int errorCode, String message);
+ void onError(int errorCode, String message);
- void streamingServicesUpdated(in List<StreamingServiceInfo> services);
+ void onStreamingServicesUpdated(in List<StreamingServiceInfo> services);
- void middlewareReady();
+ void onMiddlewareReady();
}
diff --git a/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
index 0952fbe..164cefb 100755
--- a/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
@@ -20,9 +20,9 @@
* @hide
*/
oneway interface IStreamingServiceCallback {
- void error(int errorCode, String message);
- void streamStateUpdated(int state, int reason);
- void mediaDescriptionUpdated();
- void broadcastSignalStrengthUpdated(int signalStrength);
- void streamMethodUpdated(int methodType);
+ void onError(int errorCode, String message);
+ void onStreamStateUpdated(int state, int reason);
+ void onMediaDescriptionUpdated();
+ void onBroadcastSignalStrengthUpdated(int signalStrength);
+ void onStreamMethodUpdated(int methodType);
}
diff --git a/telephony/java/android/telephony/mbms/InternalStreamingManagerCallback.java b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
similarity index 64%
copy from telephony/java/android/telephony/mbms/InternalStreamingManagerCallback.java
copy to telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
index b52df8c..a7a5958 100644
--- a/telephony/java/android/telephony/mbms/InternalStreamingManagerCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
@@ -18,25 +18,28 @@
import android.os.Handler;
import android.os.RemoteException;
-import android.telephony.mbms.IMbmsStreamingManagerCallback;
-import android.telephony.mbms.MbmsStreamingManagerCallback;
-import android.telephony.mbms.StreamingServiceInfo;
import java.util.List;
/** @hide */
-public class InternalStreamingManagerCallback extends IMbmsStreamingManagerCallback.Stub {
- private final Handler mHandler;
- private final MbmsStreamingManagerCallback mAppCallback;
+public class InternalDownloadSessionCallback extends IMbmsDownloadSessionCallback.Stub {
- public InternalStreamingManagerCallback(MbmsStreamingManagerCallback appCallback,
+ private final Handler mHandler;
+ private final MbmsDownloadSessionCallback mAppCallback;
+ private volatile boolean mIsStopped = false;
+
+ public InternalDownloadSessionCallback(MbmsDownloadSessionCallback appCallback,
Handler handler) {
mAppCallback = appCallback;
mHandler = handler;
}
@Override
- public void error(int errorCode, String message) throws RemoteException {
+ public void onError(final int errorCode, final String message) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -46,18 +49,25 @@
}
@Override
- public void streamingServicesUpdated(List<StreamingServiceInfo> services)
- throws RemoteException {
+ public void onFileServicesUpdated(final List<FileServiceInfo> services) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
- mAppCallback.onStreamingServicesUpdated(services);
+ mAppCallback.onFileServicesUpdated(services);
}
});
}
@Override
- public void middlewareReady() throws RemoteException {
+ public void onMiddlewareReady() throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -69,4 +79,8 @@
public Handler getHandler() {
return mHandler;
}
+
+ public void stop() {
+ mIsStopped = true;
+ }
}
diff --git a/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java b/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java
new file mode 100644
index 0000000..8702952
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.mbms;
+
+import android.os.Handler;
+import android.os.RemoteException;
+
+/**
+ * @hide
+ */
+public class InternalDownloadStateCallback extends IDownloadStateCallback.Stub {
+ private final Handler mHandler;
+ private final DownloadStateCallback mAppCallback;
+ private volatile boolean mIsStopped = false;
+
+ public InternalDownloadStateCallback(DownloadStateCallback appCallback, Handler handler) {
+ mAppCallback = appCallback;
+ mHandler = handler;
+ }
+
+ @Override
+ public void onProgressUpdated(final DownloadRequest request, final FileInfo fileInfo,
+ final int currentDownloadSize, final int fullDownloadSize, final int currentDecodedSize,
+ final int fullDecodedSize) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mAppCallback.onProgressUpdated(request, fileInfo, currentDownloadSize,
+ fullDownloadSize, currentDecodedSize, fullDecodedSize);
+ }
+ });
+ }
+
+ @Override
+ public void onStateUpdated(final DownloadRequest request, final FileInfo fileInfo,
+ final int state) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mAppCallback.onStateUpdated(request, fileInfo, state);
+ }
+ });
+ }
+
+ public void stop() {
+ mIsStopped = true;
+ }
+}
diff --git a/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java b/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java
index bb337b2..eb6579ce 100644
--- a/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java
@@ -23,6 +23,7 @@
public class InternalStreamingServiceCallback extends IStreamingServiceCallback.Stub {
private final StreamingServiceCallback mAppCallback;
private final Handler mHandler;
+ private volatile boolean mIsStopped = false;
public InternalStreamingServiceCallback(StreamingServiceCallback appCallback, Handler handler) {
mAppCallback = appCallback;
@@ -30,7 +31,11 @@
}
@Override
- public void error(int errorCode, String message) throws RemoteException {
+ public void onError(final int errorCode, final String message) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -40,7 +45,11 @@
}
@Override
- public void streamStateUpdated(int state, int reason) throws RemoteException {
+ public void onStreamStateUpdated(final int state, final int reason) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -50,7 +59,11 @@
}
@Override
- public void mediaDescriptionUpdated() throws RemoteException {
+ public void onMediaDescriptionUpdated() throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -60,7 +73,11 @@
}
@Override
- public void broadcastSignalStrengthUpdated(int signalStrength) throws RemoteException {
+ public void onBroadcastSignalStrengthUpdated(final int signalStrength) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -70,7 +87,11 @@
}
@Override
- public void streamMethodUpdated(int methodType) throws RemoteException {
+ public void onStreamMethodUpdated(final int methodType) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -78,4 +99,8 @@
}
});
}
+
+ public void stop() {
+ mIsStopped = true;
+ }
}
diff --git a/telephony/java/android/telephony/mbms/InternalStreamingManagerCallback.java b/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java
similarity index 68%
rename from telephony/java/android/telephony/mbms/InternalStreamingManagerCallback.java
rename to telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java
index b52df8c..d782d12 100644
--- a/telephony/java/android/telephony/mbms/InternalStreamingManagerCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java
@@ -18,25 +18,27 @@
import android.os.Handler;
import android.os.RemoteException;
-import android.telephony.mbms.IMbmsStreamingManagerCallback;
-import android.telephony.mbms.MbmsStreamingManagerCallback;
-import android.telephony.mbms.StreamingServiceInfo;
import java.util.List;
/** @hide */
-public class InternalStreamingManagerCallback extends IMbmsStreamingManagerCallback.Stub {
+public class InternalStreamingSessionCallback extends IMbmsStreamingSessionCallback.Stub {
private final Handler mHandler;
- private final MbmsStreamingManagerCallback mAppCallback;
+ private final MbmsStreamingSessionCallback mAppCallback;
+ private volatile boolean mIsStopped = false;
- public InternalStreamingManagerCallback(MbmsStreamingManagerCallback appCallback,
+ public InternalStreamingSessionCallback(MbmsStreamingSessionCallback appCallback,
Handler handler) {
mAppCallback = appCallback;
mHandler = handler;
}
@Override
- public void error(int errorCode, String message) throws RemoteException {
+ public void onError(final int errorCode, final String message) throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -46,8 +48,12 @@
}
@Override
- public void streamingServicesUpdated(List<StreamingServiceInfo> services)
+ public void onStreamingServicesUpdated(final List<StreamingServiceInfo> services)
throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -57,7 +63,11 @@
}
@Override
- public void middlewareReady() throws RemoteException {
+ public void onMiddlewareReady() throws RemoteException {
+ if (mIsStopped) {
+ return;
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -69,4 +79,8 @@
public Handler getHandler() {
return mHandler;
}
+
+ public void stop() {
+ mIsStopped = true;
+ }
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
deleted file mode 100644
index 17291d0..0000000
--- a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
+++ /dev/null
@@ -1,64 +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.telephony.mbms;
-
-import android.os.RemoteException;
-import android.telephony.MbmsDownloadManager;
-
-import java.util.List;
-
-/**
- * A Parcelable class with Cell-Broadcast service information.
- * @hide
- */
-public class MbmsDownloadManagerCallback extends IMbmsDownloadManagerCallback.Stub {
-
- @Override
- public void error(int errorCode, String message) throws RemoteException {
- // default implementation empty
- }
-
- /**
- * Called to indicate published File Services have changed.
- *
- * This will only be called after the application has requested
- * a list of file services and specified a service class list
- * of interest AND the results of a subsequent getFileServices
- * call with the same service class list would return different
- * results.
- *
- * @param services a List of FileServiceInfos
- *
- */
- @Override
- public void fileServicesUpdated(List<FileServiceInfo> services) throws RemoteException {
- // default implementation empty
- }
-
- /**
- * Called to indicate that the middleware has been initialized and is ready.
- *
- * Before this method is called, calling any method on an instance of
- * {@link android.telephony.MbmsDownloadManager} will result in an {@link MbmsException}
- * being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
- */
- @Override
- public void middlewareReady() throws RemoteException {
- // default implementation empty
- }
-}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
index ba7d120..61415b5 100644
--- a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
@@ -16,6 +16,7 @@
package android.telephony.mbms;
+import android.annotation.SystemApi;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -24,8 +25,8 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
-import android.telephony.MbmsDownloadManager;
-import android.telephony.mbms.vendor.VendorIntents;
+import android.telephony.MbmsDownloadSession;
+import android.telephony.mbms.vendor.VendorUtils;
import android.util.Log;
import java.io.File;
@@ -35,52 +36,74 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
/**
- * @hide
+ * The {@link BroadcastReceiver} responsible for handling intents sent from the middleware. Apps
+ * that wish to download using MBMS APIs should declare this class in their AndroidManifest.xml as
+ * follows:
+<pre>{@code
+<receiver
+ android:name="android.telephony.mbms.MbmsDownloadReceiver"
+ android:permission="android.permission.SEND_EMBMS_INTENTS"
+ android:enabled="true"
+ android:exported="true">
+</receiver>}</pre>
*/
public class MbmsDownloadReceiver extends BroadcastReceiver {
+ /** @hide */
public static final String DOWNLOAD_TOKEN_SUFFIX = ".download_token";
+ /** @hide */
public static final String MBMS_FILE_PROVIDER_META_DATA_KEY = "mbms-file-provider-authority";
/**
- * TODO: @SystemApi all these result codes
* Indicates that the requested operation completed without error.
+ * @hide
*/
+ @SystemApi
public static final int RESULT_OK = 0;
/**
* Indicates that the intent sent had an invalid action. This will be the result if
* {@link Intent#getAction()} returns anything other than
- * {@link VendorIntents#ACTION_DOWNLOAD_RESULT_INTERNAL},
- * {@link VendorIntents#ACTION_FILE_DESCRIPTOR_REQUEST}, or
- * {@link VendorIntents#ACTION_CLEANUP}.
+ * {@link VendorUtils#ACTION_DOWNLOAD_RESULT_INTERNAL},
+ * {@link VendorUtils#ACTION_FILE_DESCRIPTOR_REQUEST}, or
+ * {@link VendorUtils#ACTION_CLEANUP}.
* This is a fatal result code and no result extras should be expected.
+ * @hide
*/
+ @SystemApi
public static final int RESULT_INVALID_ACTION = 1;
/**
* Indicates that the intent was missing some required extras.
* This is a fatal result code and no result extras should be expected.
+ * @hide
*/
+ @SystemApi
public static final int RESULT_MALFORMED_INTENT = 2;
/**
- * Indicates that the supplied value for {@link VendorIntents#EXTRA_TEMP_FILE_ROOT}
+ * Indicates that the supplied value for {@link VendorUtils#EXTRA_TEMP_FILE_ROOT}
* does not match what the app has stored.
* This is a fatal result code and no result extras should be expected.
+ * @hide
*/
+ @SystemApi
public static final int RESULT_BAD_TEMP_FILE_ROOT = 3;
/**
* Indicates that the manager was unable to move the completed download to its final location.
* This is a fatal result code and no result extras should be expected.
+ * @hide
*/
+ @SystemApi
public static final int RESULT_DOWNLOAD_FINALIZATION_ERROR = 4;
/**
@@ -88,35 +111,48 @@
* descriptors.
* This is a non-fatal result code -- some file descriptors may still be generated, but there
* is no guarantee that they will be the same number as requested.
+ * @hide
*/
+ @SystemApi
public static final int RESULT_TEMP_FILE_GENERATION_ERROR = 5;
+ /**
+ * Indicates that the manager was unable to notify the app of the completed download.
+ * This is a fatal result code and no result extras should be expected.
+ * @hide
+ */
+ @SystemApi
+ public static final int RESULT_APP_NOTIFICATION_ERROR = 6;
+
+
private static final String LOG_TAG = "MbmsDownloadReceiver";
private static final String TEMP_FILE_SUFFIX = ".embms.temp";
- private static final int MAX_TEMP_FILE_RETRIES = 5;
+ private static final String TEMP_FILE_STAGING_LOCATION = "staged_completed_files";
+ private static final int MAX_TEMP_FILE_RETRIES = 5;
private String mFileProviderAuthorityCache = null;
private String mMiddlewarePackageNameCache = null;
+ /** @hide */
@Override
public void onReceive(Context context, Intent intent) {
if (!verifyIntentContents(context, intent)) {
setResultCode(RESULT_MALFORMED_INTENT);
return;
}
- if (!Objects.equals(intent.getStringExtra(VendorIntents.EXTRA_TEMP_FILE_ROOT),
+ if (!Objects.equals(intent.getStringExtra(VendorUtils.EXTRA_TEMP_FILE_ROOT),
MbmsTempFileProvider.getEmbmsTempFileDir(context).getPath())) {
setResultCode(RESULT_BAD_TEMP_FILE_ROOT);
return;
}
- if (VendorIntents.ACTION_DOWNLOAD_RESULT_INTERNAL.equals(intent.getAction())) {
+ if (VendorUtils.ACTION_DOWNLOAD_RESULT_INTERNAL.equals(intent.getAction())) {
moveDownloadedFile(context, intent);
cleanupPostMove(context, intent);
- } else if (VendorIntents.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) {
+ } else if (VendorUtils.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) {
generateTempFiles(context, intent);
- } else if (VendorIntents.ACTION_CLEANUP.equals(intent.getAction())) {
+ } else if (VendorUtils.ACTION_CLEANUP.equals(intent.getAction())) {
cleanupTempFiles(context, intent);
} else {
setResultCode(RESULT_INVALID_ACTION);
@@ -124,30 +160,31 @@
}
private boolean verifyIntentContents(Context context, Intent intent) {
- if (VendorIntents.ACTION_DOWNLOAD_RESULT_INTERNAL.equals(intent.getAction())) {
- if (!intent.hasExtra(MbmsDownloadManager.EXTRA_RESULT)) {
+ if (VendorUtils.ACTION_DOWNLOAD_RESULT_INTERNAL.equals(intent.getAction())) {
+ if (!intent.hasExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_RESULT)) {
Log.w(LOG_TAG, "Download result did not include a result code. Ignoring.");
return false;
}
- if (!intent.hasExtra(VendorIntents.EXTRA_REQUEST)) {
+ if (!intent.hasExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_REQUEST)) {
Log.w(LOG_TAG, "Download result did not include the associated request. Ignoring.");
return false;
}
- if (!intent.hasExtra(VendorIntents.EXTRA_TEMP_FILE_ROOT)) {
+ if (!intent.hasExtra(VendorUtils.EXTRA_TEMP_FILE_ROOT)) {
Log.w(LOG_TAG, "Download result did not include the temp file root. Ignoring.");
return false;
}
- if (!intent.hasExtra(MbmsDownloadManager.EXTRA_FILE_INFO)) {
+ if (!intent.hasExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO)) {
Log.w(LOG_TAG, "Download result did not include the associated file info. " +
"Ignoring.");
return false;
}
- if (!intent.hasExtra(VendorIntents.EXTRA_FINAL_URI)) {
+ if (!intent.hasExtra(VendorUtils.EXTRA_FINAL_URI)) {
Log.w(LOG_TAG, "Download result did not include the path to the final " +
"temp file. Ignoring.");
return false;
}
- DownloadRequest request = intent.getParcelableExtra(VendorIntents.EXTRA_REQUEST);
+ DownloadRequest request = intent.getParcelableExtra(
+ MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_REQUEST);
String expectedTokenFileName = request.getHash() + DOWNLOAD_TOKEN_SUFFIX;
File expectedTokenFile = new File(
MbmsUtils.getEmbmsTempFileDirForService(context, request.getFileServiceId()),
@@ -157,27 +194,27 @@
"Expected " + expectedTokenFile);
return false;
}
- } else if (VendorIntents.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) {
- if (!intent.hasExtra(VendorIntents.EXTRA_SERVICE_INFO)) {
- Log.w(LOG_TAG, "Temp file request did not include the associated service info." +
+ } else if (VendorUtils.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) {
+ if (!intent.hasExtra(VendorUtils.EXTRA_SERVICE_ID)) {
+ Log.w(LOG_TAG, "Temp file request did not include the associated service id." +
" Ignoring.");
return false;
}
- if (!intent.hasExtra(VendorIntents.EXTRA_TEMP_FILE_ROOT)) {
+ if (!intent.hasExtra(VendorUtils.EXTRA_TEMP_FILE_ROOT)) {
Log.w(LOG_TAG, "Download result did not include the temp file root. Ignoring.");
return false;
}
- } else if (VendorIntents.ACTION_CLEANUP.equals(intent.getAction())) {
- if (!intent.hasExtra(VendorIntents.EXTRA_SERVICE_INFO)) {
- Log.w(LOG_TAG, "Cleanup request did not include the associated service info." +
+ } else if (VendorUtils.ACTION_CLEANUP.equals(intent.getAction())) {
+ if (!intent.hasExtra(VendorUtils.EXTRA_SERVICE_ID)) {
+ Log.w(LOG_TAG, "Cleanup request did not include the associated service id." +
" Ignoring.");
return false;
}
- if (!intent.hasExtra(VendorIntents.EXTRA_TEMP_FILE_ROOT)) {
+ if (!intent.hasExtra(VendorUtils.EXTRA_TEMP_FILE_ROOT)) {
Log.w(LOG_TAG, "Cleanup request did not include the temp file root. Ignoring.");
return false;
}
- if (!intent.hasExtra(VendorIntents.EXTRA_TEMP_FILES_IN_USE)) {
+ if (!intent.hasExtra(VendorUtils.EXTRA_TEMP_FILES_IN_USE)) {
Log.w(LOG_TAG, "Cleanup request did not include the list of temp files in use. " +
"Ignoring.");
return false;
@@ -187,21 +224,26 @@
}
private void moveDownloadedFile(Context context, Intent intent) {
- DownloadRequest request = intent.getParcelableExtra(VendorIntents.EXTRA_REQUEST);
+ DownloadRequest request = intent.getParcelableExtra(
+ MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_REQUEST);
Intent intentForApp = request.getIntentForApp();
+ if (intentForApp == null) {
+ Log.i(LOG_TAG, "Malformed app notification intent");
+ setResultCode(RESULT_APP_NOTIFICATION_ERROR);
+ return;
+ }
- int result = intent.getIntExtra(MbmsDownloadManager.EXTRA_RESULT,
- MbmsDownloadManager.RESULT_CANCELLED);
- intentForApp.putExtra(MbmsDownloadManager.EXTRA_RESULT, result);
+ int result = intent.getIntExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_RESULT,
+ MbmsDownloadSession.RESULT_CANCELLED);
+ intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_RESULT, result);
- if (result != MbmsDownloadManager.RESULT_SUCCESSFUL) {
+ if (result != MbmsDownloadSession.RESULT_SUCCESSFUL) {
Log.i(LOG_TAG, "Download request indicated a failed download. Aborting.");
context.sendBroadcast(intentForApp);
return;
}
- Uri destinationUri = request.getDestinationUri();
- Uri finalTempFile = intent.getParcelableExtra(VendorIntents.EXTRA_FINAL_URI);
+ Uri finalTempFile = intent.getParcelableExtra(VendorUtils.EXTRA_FINAL_URI);
if (!verifyTempFilePath(context, request.getFileServiceId(), finalTempFile)) {
Log.w(LOG_TAG, "Download result specified an invalid temp file " + finalTempFile);
setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR);
@@ -209,30 +251,37 @@
}
FileInfo completedFileInfo =
- (FileInfo) intent.getParcelableExtra(MbmsDownloadManager.EXTRA_FILE_INFO);
- String relativePath = calculateDestinationFileRelativePath(request, completedFileInfo);
+ (FileInfo) intent.getParcelableExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO);
+ Path stagingDirectory = FileSystems.getDefault().getPath(
+ MbmsTempFileProvider.getEmbmsTempFileDir(context).getPath(),
+ TEMP_FILE_STAGING_LOCATION);
- Uri finalFileLocation = moveTempFile(finalTempFile, destinationUri, relativePath);
- if (finalFileLocation == null) {
+ Uri stagedFileLocation;
+ try {
+ stagedFileLocation = stageTempFile(finalTempFile, stagingDirectory);
+ } catch (IOException e) {
Log.w(LOG_TAG, "Failed to move temp file to final destination");
setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR);
return;
}
- intentForApp.putExtra(MbmsDownloadManager.EXTRA_COMPLETED_FILE_URI, finalFileLocation);
- intentForApp.putExtra(MbmsDownloadManager.EXTRA_FILE_INFO, completedFileInfo);
+ intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_COMPLETED_FILE_URI,
+ stagedFileLocation);
+ intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO, completedFileInfo);
+ intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_REQUEST, request);
context.sendBroadcast(intentForApp);
setResultCode(RESULT_OK);
}
private void cleanupPostMove(Context context, Intent intent) {
- DownloadRequest request = intent.getParcelableExtra(VendorIntents.EXTRA_REQUEST);
+ DownloadRequest request = intent.getParcelableExtra(
+ MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_REQUEST);
if (request == null) {
Log.w(LOG_TAG, "Intent does not include a DownloadRequest. Ignoring.");
return;
}
- List<Uri> tempFiles = intent.getParcelableExtra(VendorIntents.EXTRA_TEMP_LIST);
+ List<Uri> tempFiles = intent.getParcelableExtra(VendorUtils.EXTRA_TEMP_LIST);
if (tempFiles == null) {
return;
}
@@ -246,16 +295,15 @@
}
private void generateTempFiles(Context context, Intent intent) {
- FileServiceInfo serviceInfo =
- intent.getParcelableExtra(VendorIntents.EXTRA_SERVICE_INFO);
- if (serviceInfo == null) {
- Log.w(LOG_TAG, "Temp file request did not include the associated service info. " +
+ String serviceId = intent.getStringExtra(VendorUtils.EXTRA_SERVICE_ID);
+ if (serviceId == null) {
+ Log.w(LOG_TAG, "Temp file request did not include the associated service id. " +
"Ignoring.");
setResultCode(RESULT_MALFORMED_INTENT);
return;
}
- int fdCount = intent.getIntExtra(VendorIntents.EXTRA_FD_COUNT, 0);
- List<Uri> pausedList = intent.getParcelableExtra(VendorIntents.EXTRA_PAUSED_LIST);
+ int fdCount = intent.getIntExtra(VendorUtils.EXTRA_FD_COUNT, 0);
+ List<Uri> pausedList = intent.getParcelableExtra(VendorUtils.EXTRA_PAUSED_LIST);
if (fdCount == 0 && (pausedList == null || pausedList.size() == 0)) {
Log.i(LOG_TAG, "No temp files actually requested. Ending.");
@@ -265,22 +313,20 @@
}
ArrayList<UriPathPair> freshTempFiles =
- generateFreshTempFiles(context, serviceInfo, fdCount);
+ generateFreshTempFiles(context, serviceId, fdCount);
ArrayList<UriPathPair> pausedFiles =
- generateUrisForPausedFiles(context, serviceInfo, pausedList);
+ generateUrisForPausedFiles(context, serviceId, pausedList);
Bundle result = new Bundle();
- result.putParcelableArrayList(VendorIntents.EXTRA_FREE_URI_LIST, freshTempFiles);
- result.putParcelableArrayList(VendorIntents.EXTRA_PAUSED_URI_LIST, pausedFiles);
+ result.putParcelableArrayList(VendorUtils.EXTRA_FREE_URI_LIST, freshTempFiles);
+ result.putParcelableArrayList(VendorUtils.EXTRA_PAUSED_URI_LIST, pausedFiles);
setResultCode(RESULT_OK);
setResultExtras(result);
}
- private ArrayList<UriPathPair> generateFreshTempFiles(Context context,
- FileServiceInfo serviceInfo,
+ private ArrayList<UriPathPair> generateFreshTempFiles(Context context, String serviceId,
int freshFdCount) {
- File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context,
- serviceInfo.getServiceId());
+ File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context, serviceId);
if (!tempFileDir.exists()) {
tempFileDir.mkdirs();
}
@@ -324,14 +370,14 @@
}
private ArrayList<UriPathPair> generateUrisForPausedFiles(Context context,
- FileServiceInfo serviceInfo, List<Uri> pausedFiles) {
+ String serviceId, List<Uri> pausedFiles) {
if (pausedFiles == null) {
return new ArrayList<>(0);
}
ArrayList<UriPathPair> result = new ArrayList<>(pausedFiles.size());
for (Uri fileUri : pausedFiles) {
- if (!verifyTempFilePath(context, serviceInfo.getServiceId(), fileUri)) {
+ if (!verifyTempFilePath(context, serviceId, fileUri)) {
Log.w(LOG_TAG, "Supplied file " + fileUri + " is not a valid temp file to resume");
setResultCode(RESULT_TEMP_FILE_GENERATION_ERROR);
continue;
@@ -353,12 +399,10 @@
}
private void cleanupTempFiles(Context context, Intent intent) {
- FileServiceInfo serviceInfo =
- intent.getParcelableExtra(VendorIntents.EXTRA_SERVICE_INFO);
- File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context,
- serviceInfo.getServiceId());
+ String serviceId = intent.getStringExtra(VendorUtils.EXTRA_SERVICE_ID);
+ File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context, serviceId);
final List<Uri> filesInUse =
- intent.getParcelableArrayListExtra(VendorIntents.EXTRA_TEMP_FILES_IN_USE);
+ intent.getParcelableArrayListExtra(VendorUtils.EXTRA_TEMP_FILES_IN_USE);
File[] filesToDelete = tempFileDir.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
@@ -385,63 +429,22 @@
}
}
- private static String calculateDestinationFileRelativePath(DownloadRequest request,
- FileInfo info) {
- List<String> filePathComponents = info.getUri().getPathSegments();
- List<String> requestPathComponents = request.getSourceUri().getPathSegments();
- Iterator<String> filePathIter = filePathComponents.iterator();
- Iterator<String> requestPathIter = requestPathComponents.iterator();
-
- StringBuilder pathBuilder = new StringBuilder();
- // Iterate through the segments of the carrier's URI to the file, along with the segments
- // of the source URI specified in the download request. The relative path is calculated
- // as the tail of the file's URI that does not match the path segments in the source URI.
- while (filePathIter.hasNext()) {
- String currFilePathComponent = filePathIter.next();
- if (requestPathIter.hasNext()) {
- String requestFilePathComponent = requestPathIter.next();
- if (requestFilePathComponent.equals(currFilePathComponent)) {
- continue;
- }
- }
- pathBuilder.append(currFilePathComponent);
- pathBuilder.append('/');
- }
- // remove the trailing slash
- if (pathBuilder.length() > 0) {
- pathBuilder.deleteCharAt(pathBuilder.length() - 1);
- }
- return pathBuilder.toString();
- }
-
/*
- * Moves a tempfile located at fromPath to a new location at toPath. If
- * toPath is a directory, the destination file will be located at relativePath
- * underneath toPath.
+ * Moves a tempfile located at fromPath to a new location in the staging directory.
*/
- private static Uri moveTempFile(Uri fromPath, Uri toPath, String relativePath) {
+ private static Uri stageTempFile(Uri fromPath, Path stagingDirectory) throws IOException {
if (!ContentResolver.SCHEME_FILE.equals(fromPath.getScheme())) {
Log.w(LOG_TAG, "Moving source uri " + fromPath+ " does not have a file scheme");
return null;
}
- if (!ContentResolver.SCHEME_FILE.equals(toPath.getScheme())) {
- Log.w(LOG_TAG, "Moving destination uri " + toPath + " does not have a file scheme");
- return null;
- }
- File fromFile = new File(fromPath.getSchemeSpecificPart());
- File toFile = new File(toPath.getSchemeSpecificPart());
- if (toFile.isDirectory()) {
- toFile = new File(toFile, relativePath);
+ Path fromFile = FileSystems.getDefault().getPath(fromPath.getPath());
+ if (!Files.isDirectory(stagingDirectory)) {
+ Files.createDirectory(stagingDirectory);
}
- toFile.getParentFile().mkdirs();
+ Path result = Files.move(fromFile, stagingDirectory.resolve(fromFile.getFileName()));
- if (fromFile.renameTo(toFile)) {
- return Uri.fromFile(toFile);
- } else if (manualMove(fromFile, toFile)) {
- return Uri.fromFile(toFile);
- }
- return null;
+ return Uri.fromFile(result.toFile());
}
private static boolean verifyTempFilePath(Context context, String serviceId,
@@ -493,7 +496,7 @@
private String getMiddlewarePackageCached(Context context) {
if (mMiddlewarePackageNameCache == null) {
mMiddlewarePackageNameCache = MbmsUtils.getMiddlewareServiceInfo(context,
- MbmsDownloadManager.MBMS_DOWNLOAD_SERVICE_ACTION).packageName;
+ MbmsDownloadSession.MBMS_DOWNLOAD_SERVICE_ACTION).packageName;
}
return mMiddlewarePackageNameCache;
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadSessionCallback.java b/telephony/java/android/telephony/mbms/MbmsDownloadSessionCallback.java
new file mode 100644
index 0000000..77dea6f
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadSessionCallback.java
@@ -0,0 +1,66 @@
+/*
+ * 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.telephony.mbms;
+
+import android.telephony.MbmsDownloadSession;
+
+import java.util.List;
+
+/**
+ * A callback class that apps should use to receive information on file downloads over
+ * cell-broadcast.
+ */
+public class MbmsDownloadSessionCallback {
+
+ /**
+ * Indicates that the middleware has encountered an asynchronous error.
+ * @param errorCode Any error code listed in {@link MbmsErrors}
+ * @param message A message, intended for debugging purposes, describing the error in further
+ * detail.
+ */
+ public void onError(int errorCode, String message) {
+ // default implementation empty
+ }
+
+ /**
+ * Called to indicate published File Services have changed.
+ *
+ * This will only be called after the application has requested a list of file services and
+ * specified a service class list of interest via
+ * {@link MbmsDownloadSession#requestUpdateFileServices(List)}. If there are subsequent calls to
+ * {@link MbmsDownloadSession#requestUpdateFileServices(List)},
+ * this method may not be called again if
+ * the list of service classes would remain the same.
+ *
+ * @param services The most recently updated list of available file services.
+ */
+ public void onFileServicesUpdated(List<FileServiceInfo> services) {
+ // default implementation empty
+ }
+
+ /**
+ * Called to indicate that the middleware has been initialized and is ready.
+ *
+ * Before this method is called, calling any method on an instance of
+ * {@link MbmsDownloadSession} will result in an {@link IllegalStateException}
+ * being thrown or {@link #onError(int, String)} being called with error code
+ * {@link MbmsErrors.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
+ */
+ public void onMiddlewareReady() {
+ // default implementation empty
+ }
+}
diff --git a/telephony/java/android/telephony/mbms/MbmsException.java b/telephony/java/android/telephony/mbms/MbmsErrors.java
similarity index 87%
rename from telephony/java/android/telephony/mbms/MbmsException.java
rename to telephony/java/android/telephony/mbms/MbmsErrors.java
index 6de5a18..af0af24 100644
--- a/telephony/java/android/telephony/mbms/MbmsException.java
+++ b/telephony/java/android/telephony/mbms/MbmsErrors.java
@@ -16,7 +16,9 @@
package android.telephony.mbms;
-public class MbmsException extends Exception {
+import android.telephony.MbmsStreamingSession;
+
+public class MbmsErrors {
/** Indicates that the operation was successful. */
public static final int SUCCESS = 0;
@@ -30,8 +32,8 @@
/**
* Indicates that the app attempted to perform an operation on an instance of
- * TODO: link android.telephony.MbmsDownloadManager or
- * {@link android.telephony.MbmsStreamingManager} without being bound to the middleware.
+ * {@link android.telephony.MbmsDownloadSession} or
+ * {@link MbmsStreamingSession} without being bound to the middleware.
*/
public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2;
@@ -46,8 +48,7 @@
private InitializationErrors() {}
/**
* Indicates that the app tried to create more than one instance each of
- * {@link android.telephony.MbmsStreamingManager} or
- * TODO: link android.telephony.MbmsDownloadManager
+ * {@link MbmsStreamingSession} or {@link android.telephony.MbmsDownloadSession}.
*/
public static final int ERROR_DUPLICATE_INITIALIZE = 101;
/** Indicates that the app is not authorized to access media via MBMS.*/
@@ -64,8 +65,8 @@
private GeneralErrors() {}
/**
* Indicates that the app attempted to perform an operation before receiving notification
- * that the middleware is ready via {@link MbmsStreamingManagerCallback#onMiddlewareReady()}
- * or TODO: link MbmsDownloadManagerCallback#middlewareReady
+ * that the middleware is ready via {@link MbmsStreamingSessionCallback#onMiddlewareReady()}
+ * or {@link MbmsDownloadSessionCallback#onMiddlewareReady()}.
*/
public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 201;
/**
@@ -107,7 +108,7 @@
/**
* Indicates that the app called
- * {@link android.telephony.MbmsStreamingManager#startStreaming(
+ * {@link MbmsStreamingSession#startStreaming(
* StreamingServiceInfo, StreamingServiceCallback, android.os.Handler)}
* more than once for the same {@link StreamingServiceInfo}.
*/
@@ -116,10 +117,9 @@
/**
* Indicates the errors that are applicable only to the file-download use-case
- * TODO: unhide
- * @hide
*/
public static class DownloadErrors {
+ private DownloadErrors() { }
/**
* Indicates that the app is not allowed to change the temp file root at this time due to
* outstanding download requests.
@@ -130,15 +130,5 @@
public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402;
}
- private final int mErrorCode;
-
- /** @hide */
- public MbmsException(int errorCode) {
- super();
- mErrorCode = errorCode;
- }
-
- public int getErrorCode() {
- return mErrorCode;
- }
+ private MbmsErrors() {}
}
diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
similarity index 75%
rename from telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
rename to telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
index b31ffa7..5c130a0 100644
--- a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
@@ -16,25 +16,26 @@
package android.telephony.mbms;
+import android.annotation.Nullable;
import android.content.Context;
-import android.os.RemoteException;
-import android.telephony.MbmsStreamingManager;
+import android.os.Handler;
+import android.telephony.MbmsStreamingSession;
import java.util.List;
/**
* A callback class that is used to receive information from the middleware on MBMS streaming
* services. An instance of this object should be passed into
- * {@link android.telephony.MbmsStreamingManager#create(Context, MbmsStreamingManagerCallback)}.
+ * {@link MbmsStreamingSession#create(Context, MbmsStreamingSessionCallback, int, Handler)}.
*/
-public class MbmsStreamingManagerCallback {
+public class MbmsStreamingSessionCallback {
/**
* Called by the middleware when it has detected an error condition. The possible error codes
- * are listed in {@link MbmsException}.
+ * are listed in {@link MbmsErrors}.
* @param errorCode The error code.
* @param message A human-readable message generated by the middleware for debugging purposes.
*/
- public void onError(int errorCode, String message) {
+ public void onError(int errorCode, @Nullable String message) {
// default implementation empty
}
@@ -47,8 +48,7 @@
* call with the same service class list would return different
* results.
*
- * @param services a List of StreamingServiceInfos
- *
+ * @param services The list of available services.
*/
public void onStreamingServicesUpdated(List<StreamingServiceInfo> services) {
// default implementation empty
@@ -58,9 +58,9 @@
* Called to indicate that the middleware has been initialized and is ready.
*
* Before this method is called, calling any method on an instance of
- * {@link android.telephony.MbmsStreamingManager} will result in an {@link MbmsException}
- * being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
+ * {@link MbmsStreamingSession} will result in an {@link IllegalStateException} or an error
+ * delivered via {@link #onError(int, String)} with error code
+ * {@link MbmsErrors.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}.
*/
public void onMiddlewareReady() {
// default implementation empty
diff --git a/telephony/java/android/telephony/mbms/MbmsTempFileProvider.java b/telephony/java/android/telephony/mbms/MbmsTempFileProvider.java
index c4d033b..689becd 100644
--- a/telephony/java/android/telephony/mbms/MbmsTempFileProvider.java
+++ b/telephony/java/android/telephony/mbms/MbmsTempFileProvider.java
@@ -23,12 +23,11 @@
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
import android.net.Uri;
-import android.os.Bundle;
import android.os.ParcelFileDescriptor;
+import android.telephony.MbmsDownloadSession;
import java.io.File;
import java.io.FileNotFoundException;
@@ -39,7 +38,6 @@
* @hide
*/
public class MbmsTempFileProvider extends ContentProvider {
- public static final String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
public static final String TEMP_FILE_ROOT_PREF_FILE_NAME = "MbmsTempFileRootPrefs";
public static final String TEMP_FILE_ROOT_PREF_NAME = "mbms_temp_file_root";
@@ -182,8 +180,8 @@
if (storedTempFileRoot != null) {
return new File(storedTempFileRoot).getCanonicalFile();
} else {
- return new File(context.getFilesDir(), DEFAULT_TOP_LEVEL_TEMP_DIRECTORY)
- .getCanonicalFile();
+ return new File(context.getFilesDir(),
+ MbmsDownloadSession.DEFAULT_TOP_LEVEL_TEMP_DIRECTORY).getCanonicalFile();
}
} catch (IOException e) {
throw new RuntimeException("Unable to canonicalize temp file root path " + e);
diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java
index 4b913f8..d38d8a7 100644
--- a/telephony/java/android/telephony/mbms/MbmsUtils.java
+++ b/telephony/java/android/telephony/mbms/MbmsUtils.java
@@ -68,19 +68,20 @@
return downloadServices.get(0).serviceInfo;
}
- public static void startBinding(Context context, String serviceAction,
- ServiceConnection serviceConnection) throws MbmsException {
+ public static int startBinding(Context context, String serviceAction,
+ ServiceConnection serviceConnection) {
Intent bindIntent = new Intent();
ServiceInfo mbmsServiceInfo =
MbmsUtils.getMiddlewareServiceInfo(context, serviceAction);
if (mbmsServiceInfo == null) {
- throw new MbmsException(MbmsException.ERROR_NO_UNIQUE_MIDDLEWARE);
+ return MbmsErrors.ERROR_NO_UNIQUE_MIDDLEWARE;
}
bindIntent.setComponent(MbmsUtils.toComponentName(mbmsServiceInfo));
context.bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
+ return MbmsErrors.SUCCESS;
}
/**
diff --git a/telephony/java/android/telephony/mbms/ServiceInfo.java b/telephony/java/android/telephony/mbms/ServiceInfo.java
index c01604b..9a01ed0 100644
--- a/telephony/java/android/telephony/mbms/ServiceInfo.java
+++ b/telephony/java/android/telephony/mbms/ServiceInfo.java
@@ -16,6 +16,8 @@
package android.telephony.mbms;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -26,12 +28,13 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
/**
* Describes a cell-broadcast service. This class should not be instantiated directly -- use
- * {@link StreamingServiceInfo} or FileServiceInfo TODO: add link once that's unhidden
+ * {@link StreamingServiceInfo} or {@link FileServiceInfo}
*/
public class ServiceInfo {
// arbitrary limit on the number of locale -> name pairs we support
@@ -58,6 +61,13 @@
if (newLocales.size() > MAP_LIMIT) {
throw new RuntimeException("bad locales length " + newLocales.size());
}
+
+ for (Locale l : newLocales) {
+ if (!newNames.containsKey(l)) {
+ throw new IllegalArgumentException("A name must be provided for each locale");
+ }
+ }
+
names = new HashMap(newNames.size());
names.putAll(newNames);
className = newClassName;
@@ -114,16 +124,25 @@
}
/**
- * User displayable names listed by language. Do not modify the map returned from this method.
+ * Get the user-displayable name for this cell-broadcast service corresponding to the
+ * provided {@link Locale}.
+ * @param locale The {@link Locale} in which you want the name of the service. This must be a
+ * value from the list returned by {@link #getLocales()} -- an
+ * {@link java.util.NoSuchElementException} may be thrown otherwise.
+ * @return The {@link CharSequence} providing the name of the service in the given
+ * {@link Locale}
*/
- public Map<Locale, String> getNames() {
- return names;
+ public @NonNull CharSequence getNameForLocale(@NonNull Locale locale) {
+ if (!names.containsKey(locale)) {
+ throw new NoSuchElementException("Locale not supported");
+ }
+ return names.get(locale);
}
/**
* The class name for this service - used to categorize and filter
*/
- public String getClassName() {
+ public String getServiceClassName() {
return className;
}
diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java
index 1d66bac..ec9134a 100644
--- a/telephony/java/android/telephony/mbms/StreamingService.java
+++ b/telephony/java/android/telephony/mbms/StreamingService.java
@@ -17,8 +17,10 @@
package android.telephony.mbms;
import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.net.Uri;
import android.os.RemoteException;
+import android.telephony.MbmsStreamingSession;
import android.telephony.mbms.vendor.IMbmsStreamingService;
import android.util.Log;
@@ -27,7 +29,7 @@
/**
* Class used to represent a single MBMS stream. After a stream has been started with
- * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo,
+ * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo,
* StreamingServiceCallback, android.os.Handler)},
* this class is used to hold information about the stream and control it.
*/
@@ -63,7 +65,7 @@
/**
* State changed due to a call to {@link #stopStreaming()} or
- * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo,
+ * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo,
* StreamingServiceCallback, android.os.Handler)}
*/
public static final int REASON_BY_USER_REQUEST = 1;
@@ -101,6 +103,7 @@
public final static int UNICAST_METHOD = 2;
private final int mSubscriptionId;
+ private final MbmsStreamingSession mParentSession;
private final StreamingServiceInfo mServiceInfo;
private final InternalStreamingServiceCallback mCallback;
@@ -111,25 +114,25 @@
*/
public StreamingService(int subscriptionId,
IMbmsStreamingService service,
+ MbmsStreamingSession session,
StreamingServiceInfo streamingServiceInfo,
InternalStreamingServiceCallback callback) {
mSubscriptionId = subscriptionId;
+ mParentSession = session;
mService = service;
mServiceInfo = streamingServiceInfo;
mCallback = callback;
}
/**
- * Retreive the Uri used to play this stream.
+ * Retrieve the Uri used to play this stream.
*
- * This may throw a {@link MbmsException} with the error code
- * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}.
*
- * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
- *
- * @return The {@link Uri} to pass to the streaming client.
+ * @return The {@link Uri} to pass to the streaming client, or {@code null} if an error
+ * occurred.
*/
- public Uri getPlaybackUri() throws MbmsException {
+ public @Nullable Uri getPlaybackUri() {
if (mService == null) {
throw new IllegalStateException("No streaming service attached");
}
@@ -139,25 +142,26 @@
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService = null;
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ mParentSession.onStreamingServiceStopped(this);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return null;
}
}
/**
- * Retreive the info for this StreamingService.
+ * Retrieve the {@link StreamingServiceInfo} corresponding to this stream.
*/
public StreamingServiceInfo getInfo() {
return mServiceInfo;
}
/**
- * Stop streaming this service.
- * This may throw a {@link MbmsException} with the error code
- * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ * Stop streaming this service. Further operations on this object will fail with an
+ * {@link IllegalStateException}.
*
- * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
+ * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*/
- public void stopStreaming() throws MbmsException {
+ public void stopStreaming() {
if (mService == null) {
throw new IllegalStateException("No streaming service attached");
}
@@ -167,32 +171,22 @@
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService = null;
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ } finally {
+ mParentSession.onStreamingServiceStopped(this);
}
}
- /**
- * Disposes of this stream. Further operations on this object will fail with an
- * {@link IllegalStateException}.
- *
- * This may throw a {@link MbmsException} with the error code
- * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
- * May also throw an {@link IllegalStateException}
- */
- public void dispose() throws MbmsException {
- if (mService == null) {
- throw new IllegalStateException("No streaming service attached");
- }
+ /** @hide */
+ public InternalStreamingServiceCallback getCallback() {
+ return mCallback;
+ }
+ private void sendErrorToApp(int errorCode, String message) {
try {
- mService.disposeStream(mSubscriptionId, mServiceInfo.getServiceId());
+ mCallback.onError(errorCode, message);
} catch (RemoteException e) {
- Log.w(LOG_TAG, "Remote process died");
- throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
- } catch (IllegalArgumentException e) {
- throw new IllegalStateException("StreamingService state inconsistent with middleware");
- } finally {
- mService = null;
+ // Ignore, should not happen locally.
}
}
}
diff --git a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
index b72c715..0903824 100644
--- a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
+++ b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
@@ -16,6 +16,8 @@
package android.telephony.mbms;
+import android.annotation.Nullable;
+
/**
* A callback class for use when the application is actively streaming content. The middleware
* will provide updates on the status of the stream via this callback.
@@ -33,11 +35,11 @@
/**
* Called by the middleware when it has detected an error condition in this stream. The
- * possible error codes are listed in {@link MbmsException}.
+ * possible error codes are listed in {@link MbmsErrors}.
* @param errorCode The error code.
* @param message A human-readable message generated by the middleware for debugging purposes.
*/
- public void onError(int errorCode, String message) {
+ public void onError(int errorCode, @Nullable String message) {
// default implementation empty
}
diff --git a/telephony/java/android/telephony/mbms/UriPathPair.java b/telephony/java/android/telephony/mbms/UriPathPair.java
index 7acc270..187e9ee 100644
--- a/telephony/java/android/telephony/mbms/UriPathPair.java
+++ b/telephony/java/android/telephony/mbms/UriPathPair.java
@@ -16,13 +16,20 @@
package android.telephony.mbms;
+import android.annotation.SystemApi;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
+import android.telephony.mbms.vendor.VendorUtils;
-/** @hide */
-public class UriPathPair implements Parcelable {
+/**
+ * Wrapper for a pair of {@link Uri}s that describe a temp file used by the middleware to
+ * download files via cell-broadcast.
+ * @hide
+ */
+@SystemApi
+public final class UriPathPair implements Parcelable {
private final Uri mFilePathUri;
private final Uri mContentUri;
@@ -40,7 +47,7 @@
}
/** @hide */
- protected UriPathPair(Parcel in) {
+ private UriPathPair(Parcel in) {
mFilePathUri = in.readParcelable(Uri.class.getClassLoader());
mContentUri = in.readParcelable(Uri.class.getClassLoader());
}
@@ -57,12 +64,23 @@
}
};
- /** future systemapi */
+ /**
+ * Returns the file-path {@link Uri}. This has scheme {@code file} and points to the actual
+ * location on disk where the temp file resides. Use this when sending {@link Uri}s back to the
+ * app in the intents in {@link VendorUtils}.
+ * @return A {@code file} {@link Uri}.
+ */
public Uri getFilePathUri() {
return mFilePathUri;
}
- /** future systemapi */
+ /**
+ * Returns the content {@link Uri} that may be used with
+ * {@link ContentResolver#openFileDescriptor(Uri, String)} to obtain a
+ * {@link android.os.ParcelFileDescriptor} to a temp file to write to. This {@link Uri} will
+ * expire if the middleware process dies.
+ * @return A {@code content} {@link Uri}
+ */
public Uri getContentUri() {
return mContentUri;
}
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
index dfcc5f7..ed5e826 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
@@ -20,21 +20,26 @@
import android.net.Uri;
import android.telephony.mbms.DownloadRequest;
import android.telephony.mbms.FileInfo;
-import android.telephony.mbms.IMbmsDownloadManagerCallback;
-import android.telephony.mbms.IDownloadProgressListener;
+import android.telephony.mbms.IMbmsDownloadSessionCallback;
+import android.telephony.mbms.IDownloadStateCallback;
/**
* @hide
*/
interface IMbmsDownloadService
{
- int initialize(int subId, IMbmsDownloadManagerCallback listener);
+ int initialize(int subId, IMbmsDownloadSessionCallback listener);
- int getFileServices(int subId, in List<String> serviceClasses);
+ int requestUpdateFileServices(int subId, in List<String> serviceClasses);
int setTempFileRootDirectory(int subId, String rootDirectoryPath);
- int download(in DownloadRequest downloadRequest, IDownloadProgressListener listener);
+ int download(in DownloadRequest downloadRequest);
+
+ int registerStateCallback(in DownloadRequest downloadRequest, IDownloadStateCallback listener);
+
+ int unregisterStateCallback(in DownloadRequest downloadRequest,
+ IDownloadStateCallback listener);
List<DownloadRequest> listPendingDownloads(int subscriptionId);
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
index 4dd4292..c90ffc7 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
@@ -17,7 +17,7 @@
package android.telephony.mbms.vendor;
import android.net.Uri;
-import android.telephony.mbms.IMbmsStreamingManagerCallback;
+import android.telephony.mbms.IMbmsStreamingSessionCallback;
import android.telephony.mbms.IStreamingServiceCallback;
import android.telephony.mbms.StreamingServiceInfo;
@@ -26,18 +26,16 @@
*/
interface IMbmsStreamingService
{
- int initialize(IMbmsStreamingManagerCallback listener, int subId);
+ int initialize(IMbmsStreamingSessionCallback callback, int subId);
- int getStreamingServices(int subId, in List<String> serviceClasses);
+ int requestUpdateStreamingServices(int subId, in List<String> serviceClasses);
int startStreaming(int subId, String serviceId,
- IStreamingServiceCallback listener);
+ IStreamingServiceCallback callback);
Uri getPlaybackUri(int subId, String serviceId);
void stopStreaming(int subId, String serviceId);
- void disposeStream(int subId, String serviceId);
-
void dispose(int subId);
}
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
index 71713d0..d845a57 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
@@ -17,40 +17,50 @@
package android.telephony.mbms.vendor;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
import android.os.RemoteException;
-import android.telephony.mbms.DownloadProgressListener;
+import android.telephony.MbmsDownloadSession;
import android.telephony.mbms.DownloadRequest;
+import android.telephony.mbms.DownloadStateCallback;
import android.telephony.mbms.FileInfo;
import android.telephony.mbms.FileServiceInfo;
-import android.telephony.mbms.IDownloadProgressListener;
-import android.telephony.mbms.IMbmsDownloadManagerCallback;
-import android.telephony.mbms.MbmsDownloadManagerCallback;
-import android.telephony.mbms.MbmsException;
+import android.telephony.mbms.IDownloadStateCallback;
+import android.telephony.mbms.IMbmsDownloadSessionCallback;
+import android.telephony.mbms.MbmsDownloadSessionCallback;
+import android.telephony.mbms.MbmsErrors;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
- * Base class for MbmsDownloadService. The middleware should extend this base class rather than
- * the aidl stub for compatibility
+ * Base class for MbmsDownloadService. The middleware should return an instance of this object from
+ * its {@link android.app.Service#onBind(Intent)} method.
* @hide
- * TODO: future systemapi
*/
+@SystemApi
public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
+ private final Map<IBinder, DownloadStateCallback> mDownloadCallbackBinderMap = new HashMap<>();
+ private final Map<IBinder, DeathRecipient> mDownloadCallbackDeathRecipients = new HashMap<>();
+
/**
* Initialize the download service for this app and subId, registering the listener.
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}, which
* will be intercepted and passed to the app as
- * {@link android.telephony.mbms.MbmsException.InitializationErrors#ERROR_UNABLE_TO_INITIALIZE}
+ * {@link MbmsErrors.InitializationErrors#ERROR_UNABLE_TO_INITIALIZE}
*
- * May return any value from {@link android.telephony.mbms.MbmsException.InitializationErrors}
- * or {@link MbmsException#SUCCESS}. Non-successful error codes will be passed to the app via
- * {@link IMbmsDownloadManagerCallback#error(int, String)}.
+ * May return any value from {@link MbmsErrors.InitializationErrors}
+ * or {@link MbmsErrors#SUCCESS}. Non-successful error codes will be passed to the app via
+ * {@link IMbmsDownloadSessionCallback#onError(int, String)}.
*
* @param callback The callback to use to communicate with the app.
* @param subscriptionId The subscription ID to use.
*/
- public int initialize(int subscriptionId, MbmsDownloadManagerCallback callback)
+ public int initialize(int subscriptionId, MbmsDownloadSessionCallback callback)
throws RemoteException {
return 0;
}
@@ -60,22 +70,42 @@
* @hide
*/
@Override
- public final int initialize(int subscriptionId,
- final IMbmsDownloadManagerCallback callback) throws RemoteException {
- return initialize(subscriptionId, new MbmsDownloadManagerCallback() {
+ public final int initialize(final int subscriptionId,
+ final IMbmsDownloadSessionCallback callback) throws RemoteException {
+ final int uid = Binder.getCallingUid();
+ callback.asBinder().linkToDeath(new DeathRecipient() {
@Override
- public void error(int errorCode, String message) throws RemoteException {
- callback.error(errorCode, message);
+ public void binderDied() {
+ onAppCallbackDied(uid, subscriptionId);
+ }
+ }, 0);
+
+ return initialize(subscriptionId, new MbmsDownloadSessionCallback() {
+ @Override
+ public void onError(int errorCode, String message) {
+ try {
+ callback.onError(errorCode, message);
+ } catch (RemoteException e) {
+ onAppCallbackDied(uid, subscriptionId);
+ }
}
@Override
- public void fileServicesUpdated(List<FileServiceInfo> services) throws RemoteException {
- callback.fileServicesUpdated(services);
+ public void onFileServicesUpdated(List<FileServiceInfo> services) {
+ try {
+ callback.onFileServicesUpdated(services);
+ } catch (RemoteException e) {
+ onAppCallbackDied(uid, subscriptionId);
+ }
}
@Override
- public void middlewareReady() throws RemoteException {
- callback.middlewareReady();
+ public void onMiddlewareReady() {
+ try {
+ callback.onMiddlewareReady();
+ } catch (RemoteException e) {
+ onAppCallbackDied(uid, subscriptionId);
+ }
}
});
}
@@ -83,7 +113,7 @@
/**
* Registers serviceClasses of interest with the appName/subId key.
* Starts async fetching data on streaming services of matching classes to be reported
- * later via {@link IMbmsDownloadManagerCallback#fileServicesUpdated(List)}
+ * later via {@link IMbmsDownloadSessionCallback#onFileServicesUpdated(List)}
*
* Note that subsequent calls with the same uid and subId will replace
* the service class list.
@@ -94,11 +124,11 @@
* @param serviceClasses The service classes that the app wishes to get info on. The strings
* may contain arbitrary data as negotiated between the app and the
* carrier.
- * @return One of {@link MbmsException#SUCCESS} or
- * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY},
+ * @return One of {@link MbmsErrors#SUCCESS} or
+ * {@link MbmsErrors.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY},
*/
@Override
- public int getFileServices(int subscriptionId, List<String> serviceClasses)
+ public int requestUpdateFileServices(int subscriptionId, List<String> serviceClasses)
throws RemoteException {
return 0;
}
@@ -110,13 +140,13 @@
*
* If the calling app (as identified by the calling UID) currently has any pending download
* requests that have not been canceled, the middleware must return
- * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here.
+ * {@link MbmsErrors.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here.
*
* @param subscriptionId The subscription id the download is operating under.
* @param rootDirectoryPath The path to the app's temp file root directory.
- * @return {@link MbmsException#SUCCESS},
- * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} or
- * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}
+ * @return {@link MbmsErrors#SUCCESS},
+ * {@link MbmsErrors.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} or
+ * {@link MbmsErrors.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}
*/
@Override
public int setTempFileRootDirectory(int subscriptionId,
@@ -132,12 +162,32 @@
* this is not the case, an {@link IllegalStateException} may be thrown.
*
* @param downloadRequest An object describing the set of files to be downloaded.
- * @param listener A listener through which the middleware can provide progress updates to
- * the app while both are still running.
- * @return Any error from {@link android.telephony.mbms.MbmsException.GeneralErrors}
- * or {@link MbmsException#SUCCESS}
+ * @return Any error from {@link MbmsErrors.GeneralErrors}
+ * or {@link MbmsErrors#SUCCESS}
*/
- public int download(DownloadRequest downloadRequest, DownloadProgressListener listener) {
+ @Override
+ public int download(DownloadRequest downloadRequest) throws RemoteException {
+ return 0;
+ }
+
+ /**
+ * Registers a download state callbacks for the provided {@link DownloadRequest}.
+ *
+ * This method is called by the app when it wants to request updates on the progress or
+ * status of the download.
+ *
+ * If the middleware is not aware of a download having been requested with the provided
+ *
+ * {@link DownloadRequest} in the past,
+ * {@link MbmsErrors.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}
+ * must be returned.
+ *
+ * @param downloadRequest The {@link DownloadRequest} that was used to initiate the download
+ * for which progress updates are being requested.
+ * @param callback The callback object to use.
+ */
+ public int registerStateCallback(DownloadRequest downloadRequest,
+ DownloadStateCallback callback) throws RemoteException {
return 0;
}
@@ -146,24 +196,101 @@
* @hide
*/
@Override
- public final int download(DownloadRequest downloadRequest, IDownloadProgressListener listener)
+ public final int registerStateCallback(
+ final DownloadRequest downloadRequest, final IDownloadStateCallback callback)
throws RemoteException {
- return download(downloadRequest, new DownloadProgressListener() {
+ final int uid = Binder.getCallingUid();
+ DeathRecipient deathRecipient = new DeathRecipient() {
@Override
- public void progress(DownloadRequest request, FileInfo fileInfo, int
- currentDownloadSize, int fullDownloadSize, int currentDecodedSize, int
- fullDecodedSize) throws RemoteException {
- listener.progress(request, fileInfo, currentDownloadSize, fullDownloadSize,
- currentDecodedSize, fullDecodedSize);
+ public void binderDied() {
+ onAppCallbackDied(uid, downloadRequest.getSubscriptionId());
+ mDownloadCallbackBinderMap.remove(callback.asBinder());
+ mDownloadCallbackDeathRecipients.remove(callback.asBinder());
}
- });
+ };
+ mDownloadCallbackDeathRecipients.put(callback.asBinder(), deathRecipient);
+ callback.asBinder().linkToDeath(deathRecipient, 0);
+
+ DownloadStateCallback exposedCallback = new DownloadStateCallback() {
+ @Override
+ public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo, int
+ currentDownloadSize, int fullDownloadSize, int currentDecodedSize, int
+ fullDecodedSize) {
+ try {
+ callback.onProgressUpdated(request, fileInfo, currentDownloadSize,
+ fullDownloadSize,
+ currentDecodedSize, fullDecodedSize);
+ } catch (RemoteException e) {
+ onAppCallbackDied(uid, downloadRequest.getSubscriptionId());
+ }
+ }
+
+ @Override
+ public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
+ @MbmsDownloadSession.DownloadStatus int state) {
+ try {
+ callback.onStateUpdated(request, fileInfo, state);
+ } catch (RemoteException e) {
+ onAppCallbackDied(uid, downloadRequest.getSubscriptionId());
+ }
+ }
+ };
+
+ mDownloadCallbackBinderMap.put(callback.asBinder(), exposedCallback);
+
+ return registerStateCallback(downloadRequest, exposedCallback);
}
+ /**
+ * Un-registers a download state callbacks for the provided {@link DownloadRequest}.
+ *
+ * This method is called by the app when it no longer wants to request updates on the
+ * download.
+ *
+ * If the middleware is not aware of a download having been requested with the provided
+ * {@link DownloadRequest} in the past,
+ * {@link MbmsErrors.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}
+ * must be returned.
+ *
+ * @param downloadRequest The {@link DownloadRequest} that was used to register the callback
+ * @param callback The callback object that
+ * {@link #registerStateCallback(DownloadRequest, DownloadStateCallback)}
+ * was called with.
+ */
+ public int unregisterStateCallback(DownloadRequest downloadRequest,
+ DownloadStateCallback callback) throws RemoteException {
+ return 0;
+ }
+
+ /**
+ * Actual AIDL implementation -- hides the callback AIDL from the API.
+ * @hide
+ */
+ @Override
+ public final int unregisterStateCallback(
+ final DownloadRequest downloadRequest, final IDownloadStateCallback callback)
+ throws RemoteException {
+ DeathRecipient deathRecipient =
+ mDownloadCallbackDeathRecipients.remove(callback.asBinder());
+ if (deathRecipient == null) {
+ throw new IllegalArgumentException("Unknown callback");
+ }
+
+ callback.asBinder().unlinkToDeath(deathRecipient, 0);
+
+ DownloadStateCallback exposedCallback =
+ mDownloadCallbackBinderMap.remove(callback.asBinder());
+ if (exposedCallback == null) {
+ throw new IllegalArgumentException("Unknown callback");
+ }
+
+ return unregisterStateCallback(downloadRequest, exposedCallback);
+ }
/**
* Returns a list of pending {@link DownloadRequest}s that originated from the calling
* application, identified by its uid. A pending request is one that was issued via
- * {@link #download(DownloadRequest, IDownloadProgressListener)} but not cancelled through
+ * {@link #download(DownloadRequest)} but not cancelled through
* {@link #cancelDownload(DownloadRequest)}.
* The middleware must return a non-null result synchronously or throw an exception
* inheriting from {@link RuntimeException}.
@@ -179,13 +306,13 @@
* Issues a request to cancel the specified download request.
*
* If the middleware is unable to cancel the request for whatever reason, it should return
- * synchronously with an error. If this method returns {@link MbmsException#SUCCESS}, the app
+ * synchronously with an error. If this method returns {@link MbmsErrors#SUCCESS}, the app
* will no longer be expecting any more file-completed intents from the middleware for this
* {@link DownloadRequest}.
* @param downloadRequest The request to cancel
- * @return {@link MbmsException#SUCCESS},
- * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST},
- * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
+ * @return {@link MbmsErrors#SUCCESS},
+ * {@link MbmsErrors.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST},
+ * {@link MbmsErrors.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
*/
@Override
public int cancelDownload(DownloadRequest downloadRequest) throws RemoteException {
@@ -197,7 +324,7 @@
*
* If the middleware has not yet been properly initialized or if it has no records of the
* file indicated by {@code fileInfo} being associated with {@code downloadRequest},
- * {@link android.telephony.MbmsDownloadManager#STATUS_UNKNOWN} must be returned.
+ * {@link MbmsDownloadSession#STATUS_UNKNOWN} must be returned.
*
* @param downloadRequest The download request to query.
* @param fileInfo The particular file within the request to get information on.
@@ -217,7 +344,7 @@
* In addition, current in-progress downloads must not be interrupted.
*
* If the middleware is not aware of the specified download request, return
- * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
+ * {@link MbmsErrors.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
*
* @param downloadRequest The request to re-download files for.
*/
@@ -231,7 +358,7 @@
* Signals that the app wishes to dispose of the session identified by the
* {@code subscriptionId} argument and the caller's uid. No notification back to the
* app is required for this operation, and the corresponding callback provided via
- * {@link #initialize(int, IMbmsDownloadManagerCallback)} should no longer be used
+ * {@link #initialize(int, IMbmsDownloadSessionCallback)} should no longer be used
* after this method has been called by the app.
*
* Any download requests issued by the app should remain in effect until the app calls
@@ -244,4 +371,12 @@
@Override
public void dispose(int subscriptionId) throws RemoteException {
}
+
+ /**
+ * Indicates that the app identified by the given UID and subscription ID has died.
+ * @param uid the UID of the app, as returned by {@link Binder#getCallingUid()}.
+ * @param subscriptionId The subscription ID the app is using.
+ */
+ public void onAppCallbackDied(int uid, int subscriptionId) {
+ }
}
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
index 843e048..f8f370a 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
@@ -18,13 +18,14 @@
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.content.Intent;
import android.net.Uri;
import android.os.Binder;
import android.os.RemoteException;
-import android.telephony.mbms.IMbmsStreamingManagerCallback;
+import android.telephony.mbms.IMbmsStreamingSessionCallback;
import android.telephony.mbms.IStreamingServiceCallback;
-import android.telephony.mbms.MbmsException;
-import android.telephony.mbms.MbmsStreamingManagerCallback;
+import android.telephony.mbms.MbmsErrors;
+import android.telephony.mbms.MbmsStreamingSessionCallback;
import android.telephony.mbms.StreamingService;
import android.telephony.mbms.StreamingServiceCallback;
import android.telephony.mbms.StreamingServiceInfo;
@@ -32,6 +33,8 @@
import java.util.List;
/**
+ * Base class for MBMS streaming services. The middleware should return an instance of this
+ * object from its {@link android.app.Service#onBind(Intent)} method.
* @hide
*/
@SystemApi
@@ -41,16 +44,16 @@
*
* May throw an {@link IllegalArgumentException} or a {@link SecurityException}, which
* will be intercepted and passed to the app as
- * {@link android.telephony.mbms.MbmsException.InitializationErrors#ERROR_UNABLE_TO_INITIALIZE}
+ * {@link MbmsErrors.InitializationErrors#ERROR_UNABLE_TO_INITIALIZE}
*
- * May return any value from {@link android.telephony.mbms.MbmsException.InitializationErrors}
- * or {@link MbmsException#SUCCESS}. Non-successful error codes will be passed to the app via
- * {@link IMbmsStreamingManagerCallback#error(int, String)}.
+ * May return any value from {@link MbmsErrors.InitializationErrors}
+ * or {@link MbmsErrors#SUCCESS}. Non-successful error codes will be passed to the app via
+ * {@link IMbmsStreamingSessionCallback#onError(int, String)}.
*
* @param callback The callback to use to communicate with the app.
* @param subscriptionId The subscription ID to use.
*/
- public int initialize(MbmsStreamingManagerCallback callback, int subscriptionId)
+ public int initialize(MbmsStreamingSessionCallback callback, int subscriptionId)
throws RemoteException {
return 0;
}
@@ -60,7 +63,7 @@
* @hide
*/
@Override
- public final int initialize(final IMbmsStreamingManagerCallback callback,
+ public final int initialize(final IMbmsStreamingSessionCallback callback,
final int subscriptionId) throws RemoteException {
final int uid = Binder.getCallingUid();
callback.asBinder().linkToDeath(new DeathRecipient() {
@@ -70,20 +73,20 @@
}
}, 0);
- return initialize(new MbmsStreamingManagerCallback() {
+ return initialize(new MbmsStreamingSessionCallback() {
@Override
- public void onError(int errorCode, String message) {
+ public void onError(final int errorCode, final String message) {
try {
- callback.error(errorCode, message);
+ callback.onError(errorCode, message);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
}
@Override
- public void onStreamingServicesUpdated(List<StreamingServiceInfo> services) {
+ public void onStreamingServicesUpdated(final List<StreamingServiceInfo> services) {
try {
- callback.streamingServicesUpdated(services);
+ callback.onStreamingServicesUpdated(services);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
@@ -92,7 +95,7 @@
@Override
public void onMiddlewareReady() {
try {
- callback.middlewareReady();
+ callback.onMiddlewareReady();
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
@@ -104,7 +107,7 @@
/**
* Registers serviceClasses of interest with the appName/subId key.
* Starts async fetching data on streaming services of matching classes to be reported
- * later via {@link IMbmsStreamingManagerCallback#streamingServicesUpdated(List)}
+ * later via {@link IMbmsStreamingSessionCallback#onStreamingServicesUpdated(List)}
*
* Note that subsequent calls with the same uid and subId will replace
* the service class list.
@@ -115,11 +118,11 @@
* @param serviceClasses The service classes that the app wishes to get info on. The strings
* may contain arbitrary data as negotiated between the app and the
* carrier.
- * @return {@link MbmsException#SUCCESS} or any of the errors in
- * {@link android.telephony.mbms.MbmsException.GeneralErrors}
+ * @return {@link MbmsErrors#SUCCESS} or any of the errors in
+ * {@link MbmsErrors.GeneralErrors}
*/
@Override
- public int getStreamingServices(int subscriptionId,
+ public int requestUpdateStreamingServices(int subscriptionId,
List<String> serviceClasses) throws RemoteException {
return 0;
}
@@ -127,14 +130,14 @@
/**
* Starts streaming on a particular service. This method may perform asynchronous work. When
* the middleware is ready to send bits to the frontend, it should inform the app via
- * {@link IStreamingServiceCallback#streamStateUpdated(int, int)}.
+ * {@link IStreamingServiceCallback#onStreamStateUpdated(int, int)}.
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
* @param subscriptionId The subscription id to use.
* @param serviceId The ID of the streaming service that the app has requested.
* @param callback The callback object on which the app wishes to receive updates.
- * @return Any error in {@link android.telephony.mbms.MbmsException.GeneralErrors}
+ * @return Any error in {@link MbmsErrors.GeneralErrors}
*/
public int startStreaming(int subscriptionId, String serviceId,
StreamingServiceCallback callback) throws RemoteException {
@@ -147,8 +150,8 @@
* @hide
*/
@Override
- public int startStreaming(int subscriptionId, String serviceId,
- IStreamingServiceCallback callback) throws RemoteException {
+ public int startStreaming(final int subscriptionId, String serviceId,
+ final IStreamingServiceCallback callback) throws RemoteException {
final int uid = Binder.getCallingUid();
callback.asBinder().linkToDeath(new DeathRecipient() {
@Override
@@ -159,19 +162,19 @@
return startStreaming(subscriptionId, serviceId, new StreamingServiceCallback() {
@Override
- public void onError(int errorCode, String message) {
+ public void onError(final int errorCode, final String message) {
try {
- callback.error(errorCode, message);
+ callback.onError(errorCode, message);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
}
@Override
- public void onStreamStateUpdated(@StreamingService.StreamingState int state,
- @StreamingService.StreamingStateChangeReason int reason) {
+ public void onStreamStateUpdated(@StreamingService.StreamingState final int state,
+ @StreamingService.StreamingStateChangeReason final int reason) {
try {
- callback.streamStateUpdated(state, reason);
+ callback.onStreamStateUpdated(state, reason);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
@@ -180,25 +183,25 @@
@Override
public void onMediaDescriptionUpdated() {
try {
- callback.mediaDescriptionUpdated();
+ callback.onMediaDescriptionUpdated();
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
}
@Override
- public void onBroadcastSignalStrengthUpdated(int signalStrength) {
+ public void onBroadcastSignalStrengthUpdated(final int signalStrength) {
try {
- callback.broadcastSignalStrengthUpdated(signalStrength);
+ callback.onBroadcastSignalStrengthUpdated(signalStrength);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
}
@Override
- public void onStreamMethodUpdated(int methodType) {
+ public void onStreamMethodUpdated(final int methodType) {
try {
- callback.streamMethodUpdated(methodType);
+ callback.onStreamMethodUpdated(methodType);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
}
@@ -225,7 +228,11 @@
/**
* Stop streaming the stream identified by {@code serviceId}. Notification of the resulting
* stream state change should be reported to the app via
- * {@link IStreamingServiceCallback#streamStateUpdated(int, int)}.
+ * {@link IStreamingServiceCallback#onStreamStateUpdated(int, int)}.
+ *
+ * In addition, the callback provided via
+ * {@link #startStreaming(int, String, IStreamingServiceCallback)} should no longer be
+ * used after this method has called by the app.
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
@@ -238,27 +245,10 @@
}
/**
- * Dispose of the stream identified by {@code serviceId} for the app identified by the
- * {@code appName} and {@code subscriptionId} arguments along with the caller's uid.
- * No notification back to the app is required for this operation, and the callback provided via
- * {@link #startStreaming(int, String, IStreamingServiceCallback)} should no longer be
- * used after this method has called by the app.
- *
- * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
- *
- * @param subscriptionId The subscription id to use.
- * @param serviceId The ID of the streaming service that the app wishes to dispose of.
- */
- @Override
- public void disposeStream(int subscriptionId, String serviceId)
- throws RemoteException {
- }
-
- /**
* Signals that the app wishes to dispose of the session identified by the
* {@code subscriptionId} argument and the caller's uid. No notification back to the
* app is required for this operation, and the corresponding callback provided via
- * {@link #initialize(IMbmsStreamingManagerCallback, int)} should no longer be used
+ * {@link #initialize(IMbmsStreamingSessionCallback, int)} should no longer be used
* after this method has been called by the app.
*
* May throw an {@link IllegalStateException}
diff --git a/telephony/java/android/telephony/mbms/vendor/VendorIntents.java b/telephony/java/android/telephony/mbms/vendor/VendorUtils.java
similarity index 76%
rename from telephony/java/android/telephony/mbms/vendor/VendorIntents.java
rename to telephony/java/android/telephony/mbms/vendor/VendorUtils.java
index 367c995..8fb27b2 100644
--- a/telephony/java/android/telephony/mbms/vendor/VendorIntents.java
+++ b/telephony/java/android/telephony/mbms/vendor/VendorUtils.java
@@ -16,29 +16,32 @@
package android.telephony.mbms.vendor;
+import android.annotation.SystemApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.net.Uri;
-import android.telephony.mbms.DownloadRequest;
+import android.telephony.MbmsDownloadSession;
import android.telephony.mbms.MbmsDownloadReceiver;
import java.io.File;
import java.util.List;
/**
+ * Contains constants and utility methods for MBMS Download middleware apps to communicate with
+ * frontend apps.
* @hide
- * TODO: future systemapi
*/
-public class VendorIntents {
+@SystemApi
+public class VendorUtils {
/**
* The MBMS middleware should send this when a download of single file has completed or
* failed. Mandatory extras are
- * {@link android.telephony.MbmsDownloadManager#EXTRA_RESULT}
- * {@link android.telephony.MbmsDownloadManager#EXTRA_FILE_INFO}
- * {@link #EXTRA_REQUEST}
+ * {@link MbmsDownloadSession#EXTRA_MBMS_DOWNLOAD_RESULT}
+ * {@link MbmsDownloadSession#EXTRA_MBMS_FILE_INFO}
+ * {@link MbmsDownloadSession#EXTRA_MBMS_DOWNLOAD_REQUEST}
* {@link #EXTRA_TEMP_LIST}
* {@link #EXTRA_FINAL_URI}
*/
@@ -49,7 +52,7 @@
* The MBMS middleware should send this when it wishes to request {@code content://} URIs to
* serve as temp files for downloads or when it wishes to resume paused downloads. Mandatory
* extras are
- * {@link #EXTRA_REQUEST}
+ * {@link #EXTRA_SERVICE_ID}
*
* Optional extras are
* {@link #EXTRA_FD_COUNT} (0 if not present)
@@ -118,48 +121,35 @@
"android.telephony.mbms.extra.TEMP_FILES_IN_USE";
/**
- * Extra containing the {@link DownloadRequest} for which the download result or file
- * descriptor request is for. Must not be null.
- */
- public static final String EXTRA_REQUEST = "android.telephony.mbms.extra.REQUEST";
-
- /**
* Extra containing a single {@link Uri} indicating the path to the temp file in which the
* decoded downloaded file resides. Must not be null.
*/
public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
/**
- * Extra containing an instance of {@link android.telephony.mbms.ServiceInfo}, used by
+ * Extra containing a String representing a service ID, used by
* file-descriptor requests and cleanup requests to specify which service they want to
* request temp files or clean up temp files for, respectively.
*/
- public static final String EXTRA_SERVICE_INFO =
- "android.telephony.mbms.extra.SERVICE_INFO";
+ public static final String EXTRA_SERVICE_ID =
+ "android.telephony.mbms.extra.SERVICE_ID";
/**
* Retrieves the {@link ComponentName} for the {@link android.content.BroadcastReceiver} that
* the various intents from the middleware should be targeted towards.
- * @param uid The uid of the frontend app.
+ * @param packageName The package name of the app.
* @return The component name of the receiver that the middleware should send its intents to,
* or null if the app didn't declare it in the manifest.
*/
- public static ComponentName getAppReceiverFromUid(Context context, int uid) {
- String[] packageNames = context.getPackageManager().getPackagesForUid(uid);
- if (packageNames == null) {
- return null;
- }
-
- for (String packageName : packageNames) {
- ComponentName candidate = new ComponentName(packageName,
- MbmsDownloadReceiver.class.getCanonicalName());
- Intent queryIntent = new Intent();
- queryIntent.setComponent(candidate);
- List<ResolveInfo> receivers =
- context.getPackageManager().queryBroadcastReceivers(queryIntent, 0);
- if (receivers != null && receivers.size() > 0) {
- return candidate;
- }
+ public static ComponentName getAppReceiverFromPackageName(Context context, String packageName) {
+ ComponentName candidate = new ComponentName(packageName,
+ MbmsDownloadReceiver.class.getCanonicalName());
+ Intent queryIntent = new Intent();
+ queryIntent.setComponent(candidate);
+ List<ResolveInfo> receivers =
+ context.getPackageManager().queryBroadcastReceivers(queryIntent, 0);
+ if (receivers != null && receivers.size() > 0) {
+ return candidate;
}
return null;
}
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index 256e13b..91032f3 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -107,6 +107,7 @@
public static final int EVENT_PCO_DATA_RECEIVED = BASE + 45;
public static final int EVENT_SET_CARRIER_DATA_ENABLED = BASE + 46;
public static final int EVENT_DATA_RECONNECT = BASE + 47;
+ public static final int EVENT_ROAMING_SETTING_CHANGE = BASE + 48;
/***** Constants *****/
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 9262ec5..2ac11b5 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1089,6 +1089,15 @@
boolean isImsRegistered();
/**
+ * Get IMS Registration Status on a particular subid.
+ *
+ * @param subId user preferred subId.
+ *
+ * @return {@code true} if the IMS status is registered.
+ */
+ boolean isImsRegisteredForSubscriber(int subId);
+
+ /**
* Returns the Status of Wi-Fi Calling
*/
boolean isWifiCallingAvailable();
diff --git a/test-runner/Android.mk b/test-runner/Android.mk
index 3c3718a..060a518 100644
--- a/test-runner/Android.mk
+++ b/test-runner/Android.mk
@@ -107,11 +107,10 @@
LOCAL_SOURCE_FILES_ALL_GENERATED := true
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
# Make sure to run droiddoc first to generate the stub source files.
-$(full_classes_compiled_jar) : $(android_test_runner_api_gen_stamp)
-$(full_classes_jack) : $(android_test_runner_api_gen_stamp)
+LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_runner_api_gen_stamp)
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
# Archive a copy of the classes.jar in SDK build.
$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.runner.stubs.jar)
@@ -202,11 +201,10 @@
LOCAL_SOURCE_FILES_ALL_GENERATED := true
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
# Make sure to run droiddoc first to generate the stub source files.
-$(full_classes_compiled_jar) : $(android_test_mock_gen_stamp)
-$(full_classes_jack) : $(android_test_mock_gen_stamp)
+LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_mock_gen_stamp)
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
# Archive a copy of the classes.jar in SDK build.
$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.mock.stubs.jar)
diff --git a/tests/ServiceCrashTest/Android.mk b/tests/ServiceCrashTest/Android.mk
new file mode 100644
index 0000000..d1f8456
--- /dev/null
+++ b/tests/ServiceCrashTest/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := ServiceCrashTest
+
+LOCAL_CERTIFICATE := platform
+LOCAL_JAVA_LIBRARIES := legacy-android-test
+
+LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util android-support-test
+
+include $(BUILD_PACKAGE)
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/ServiceCrashTest/AndroidManifest.xml b/tests/ServiceCrashTest/AndroidManifest.xml
new file mode 100644
index 0000000..387c8b8
--- /dev/null
+++ b/tests/ServiceCrashTest/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.tests.servicecrashtest">
+
+ <application android:label="Service Crash Test">
+ <uses-library android:name="android.test.runner" />
+
+ <service android:name=".CrashingService"
+ android:process=":badservice" />
+
+ <activity android:name=".MainActivity" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+ </application>
+
+ <instrumentation android:label="Test bound service crash restart"
+ android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.android.tests.servicecrashtest" />
+
+</manifest>
diff --git a/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/CrashingService.java b/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/CrashingService.java
new file mode 100644
index 0000000..8593bce
--- /dev/null
+++ b/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/CrashingService.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.tests.servicecrashtest;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.widget.Toast;
+
+public class CrashingService extends Service {
+ private ServiceHandler mServiceHandler;
+
+ static long CRASH_DELAY = 1000;
+
+ // Handler that receives messages from the thread
+ private final class ServiceHandler extends Handler {
+ public ServiceHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ throw new RuntimeException("Crashing!");
+ }
+ }
+
+ @Override
+ public void onCreate() {
+ mServiceHandler = new ServiceHandler(Looper.getMainLooper());
+ Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
+
+ Message msg = mServiceHandler.obtainMessage();
+ mServiceHandler.sendMessageDelayed(msg, CRASH_DELAY);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ // If we get killed, after returning from here, restart
+ return START_STICKY;
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ // We don't provide binding, so return null
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/MainActivity.java b/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/MainActivity.java
new file mode 100644
index 0000000..8fffecc
--- /dev/null
+++ b/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/MainActivity.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tests.servicecrashtest;
+
+import android.app.Activity;
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
+import android.widget.TextView;
+
+import java.util.concurrent.CountDownLatch;
+
+public class MainActivity extends Activity {
+
+ private static final String TAG = "ServiceCrashTest";
+
+ static final CountDownLatch sBindingDiedLatch = new CountDownLatch(1);
+
+ private ServiceConnection mServiceConnection = new ServiceConnection() {
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ Log.i(TAG, "Service connected");
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ Log.i(TAG, "Service disconnected");
+ }
+
+ @Override
+ public void onBindingDied(ComponentName componentName) {
+ Log.i(TAG, "Binding died");
+ sBindingDiedLatch.countDown();
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstance) {
+ super.onCreate(savedInstance);
+
+ setContentView(new TextView(this));
+ }
+
+ public void onResume() {
+ Intent intent = new Intent();
+ intent.setClass(this, CrashingService.class);
+ bindService(intent, mServiceConnection, Service.BIND_AUTO_CREATE);
+
+ super.onResume();
+ }
+}
diff --git a/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/ServiceCrashTest.java b/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/ServiceCrashTest.java
new file mode 100644
index 0000000..fb0fa4b
--- /dev/null
+++ b/tests/ServiceCrashTest/src/com/android/tests/servicecrashtest/ServiceCrashTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tests.servicecrashtest;
+
+import android.app.UiAutomation;
+import android.content.Context;
+import android.content.Intent;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.test.InstrumentationTestCase;
+
+import com.android.compatibility.common.util.SystemUtil;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+public class ServiceCrashTest extends InstrumentationTestCase {
+
+ private static final String TAG = ServiceCrashTest.class.getSimpleName();
+
+ private String mResetConstants = "foo=bar";
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mResetConstants = Settings.Global.getString(
+ getInstrumentation().getContext().getContentResolver(),
+ Settings.Global.ACTIVITY_MANAGER_CONSTANTS);
+ setAMConstants("service_crash_restart_duration=5000,service_crash_max_retry=4");
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // Reset the activity manager constants
+ setAMConstants(mResetConstants);
+ super.tearDown();
+ }
+
+ private void setAMConstants(String value) throws IOException {
+ // Set the activity manager constants
+ if (value == null) {
+ SystemUtil.runShellCommand(getInstrumentation(),
+ "settings delete global activity_manager_constants");
+ } else {
+ SystemUtil.runShellCommand(getInstrumentation(), "settings put global "
+ + "activity_manager_constants " + value);
+ }
+ }
+
+ public void testCrashQuickly() throws RemoteException {
+ Context ctx = getInstrumentation().getContext();
+ // Start the activity, which will bind the crashing service
+ Intent intent = new Intent();
+ intent.setAction(Intent.ACTION_MAIN);
+ intent.setClass(ctx, MainActivity.class);
+ ctx.startActivity(intent);
+ try {
+ assertTrue(MainActivity.sBindingDiedLatch.await(200, TimeUnit.SECONDS));
+ } catch (InterruptedException ie) {
+ }
+ }
+}
diff --git a/tests/net/java/android/net/ip/IpManagerTest.java b/tests/net/java/android/net/ip/IpManagerTest.java
index 541f91ad..22d88fb 100644
--- a/tests/net/java/android/net/ip/IpManagerTest.java
+++ b/tests/net/java/android/net/ip/IpManagerTest.java
@@ -180,7 +180,8 @@
// Add N - 1 addresses
for (int i = 0; i < lastAddr; i++) {
mObserver.addressUpdated(iface, new LinkAddress(addresses[i]));
- verify(mCb, timeout(100).times(1)).onLinkPropertiesChange(any());
+ verify(mCb, timeout(100)).onLinkPropertiesChange(any());
+ reset(mCb);
}
// Add Nth address
diff --git a/tests/net/java/android/net/netlink/ConntrackMessageTest.java b/tests/net/java/android/net/netlink/ConntrackMessageTest.java
new file mode 100644
index 0000000..3aab942
--- /dev/null
+++ b/tests/net/java/android/net/netlink/ConntrackMessageTest.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.netlink;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assume.assumeTrue;
+
+import android.system.OsConstants;
+import libcore.util.HexEncoding;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.runner.RunWith;
+import org.junit.Test;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ConntrackMessageTest {
+ private static final boolean USING_LE = (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN);
+
+ // Example 1: TCP (192.168.43.209, 44333) -> (23.211.13.26, 443)
+ public static final String CT_V4UPDATE_TCP_HEX =
+ // struct nlmsghdr
+ "50000000" + // length = 80
+ "0001" + // type = (1 << 8) | 0
+ "0501" + // flags
+ "01000000" + // seqno = 1
+ "00000000" + // pid = 0
+ // struct nfgenmsg
+ "02" + // nfgen_family = AF_INET
+ "00" + // version = NFNETLINK_V0
+ "0000" + // res_id
+ // struct nlattr
+ "3400" + // nla_len = 52
+ "0180" + // nla_type = nested CTA_TUPLE_ORIG
+ // struct nlattr
+ "1400" + // nla_len = 20
+ "0180" + // nla_type = nested CTA_TUPLE_IP
+ "0800 0100 C0A82BD1" + // nla_type=CTA_IP_V4_SRC, ip=192.168.43.209
+ "0800 0200 17D30D1A" + // nla_type=CTA_IP_V4_DST, ip=23.211.13.26
+ // struct nlattr
+ "1C00" + // nla_len = 28
+ "0280" + // nla_type = nested CTA_TUPLE_PROTO
+ "0500 0100 06 000000" + // nla_type=CTA_PROTO_NUM, proto=6
+ "0600 0200 AD2D 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=44333 (big endian)
+ "0600 0300 01BB 0000" + // nla_type=CTA_PROTO_DST_PORT, port=443 (big endian)
+ // struct nlattr
+ "0800" + // nla_len = 8
+ "0700" + // nla_type = CTA_TIMEOUT
+ "00069780"; // nla_value = 432000 (big endian)
+ public static final byte[] CT_V4UPDATE_TCP_BYTES =
+ HexEncoding.decode(CT_V4UPDATE_TCP_HEX.replaceAll(" ", "").toCharArray(), false);
+
+ // Example 2: UDP (100.96.167.146, 37069) -> (216.58.197.10, 443)
+ public static final String CT_V4UPDATE_UDP_HEX =
+ // struct nlmsghdr
+ "50000000" + // length = 80
+ "0001" + // type = (1 << 8) | 0
+ "0501" + // flags
+ "01000000" + // seqno = 1
+ "00000000" + // pid = 0
+ // struct nfgenmsg
+ "02" + // nfgen_family = AF_INET
+ "00" + // version = NFNETLINK_V0
+ "0000" + // res_id
+ // struct nlattr
+ "3400" + // nla_len = 52
+ "0180" + // nla_type = nested CTA_TUPLE_ORIG
+ // struct nlattr
+ "1400" + // nla_len = 20
+ "0180" + // nla_type = nested CTA_TUPLE_IP
+ "0800 0100 6460A792" + // nla_type=CTA_IP_V4_SRC, ip=100.96.167.146
+ "0800 0200 D83AC50A" + // nla_type=CTA_IP_V4_DST, ip=216.58.197.10
+ // struct nlattr
+ "1C00" + // nla_len = 28
+ "0280" + // nla_type = nested CTA_TUPLE_PROTO
+ "0500 0100 11 000000" + // nla_type=CTA_PROTO_NUM, proto=17
+ "0600 0200 90CD 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=37069 (big endian)
+ "0600 0300 01BB 0000" + // nla_type=CTA_PROTO_DST_PORT, port=443 (big endian)
+ // struct nlattr
+ "0800" + // nla_len = 8
+ "0700" + // nla_type = CTA_TIMEOUT
+ "000000B4"; // nla_value = 180 (big endian)
+ public static final byte[] CT_V4UPDATE_UDP_BYTES =
+ HexEncoding.decode(CT_V4UPDATE_UDP_HEX.replaceAll(" ", "").toCharArray(), false);
+
+ @Test
+ public void testConntrackIPv4TcpTimeoutUpdate() throws Exception {
+ assumeTrue(USING_LE);
+
+ final byte[] tcp = ConntrackMessage.newIPv4TimeoutUpdateRequest(
+ OsConstants.IPPROTO_TCP,
+ (Inet4Address) InetAddress.getByName("192.168.43.209"), 44333,
+ (Inet4Address) InetAddress.getByName("23.211.13.26"), 443,
+ 432000);
+ assertArrayEquals(CT_V4UPDATE_TCP_BYTES, tcp);
+ }
+
+ @Test
+ public void testConntrackIPv4UdpTimeoutUpdate() throws Exception {
+ assumeTrue(USING_LE);
+
+ final byte[] udp = ConntrackMessage.newIPv4TimeoutUpdateRequest(
+ OsConstants.IPPROTO_UDP,
+ (Inet4Address) InetAddress.getByName("100.96.167.146"), 37069,
+ (Inet4Address) InetAddress.getByName("216.58.197.10"), 443,
+ 180);
+ assertArrayEquals(CT_V4UPDATE_UDP_BYTES, udp);
+ }
+}
diff --git a/tests/net/java/android/net/nsd/NsdManagerTest.java b/tests/net/java/android/net/nsd/NsdManagerTest.java
index 9115378..0a5a6aa 100644
--- a/tests/net/java/android/net/nsd/NsdManagerTest.java
+++ b/tests/net/java/android/net/nsd/NsdManagerTest.java
@@ -60,7 +60,7 @@
NsdManager mManager;
- long mTimeoutMs = 100; // non-final so that tests can adjust the value.
+ long mTimeoutMs = 200; // non-final so that tests can adjust the value.
@Before
public void setUp() throws Exception {
@@ -74,7 +74,7 @@
@After
public void tearDown() throws Exception {
- waitForIdleHandler(mServiceHandler, mTimeoutMs);
+ mServiceHandler.waitForIdle(mTimeoutMs);
mServiceHandler.chan.disconnect();
mServiceHandler.stop();
if (mManager != null) {
@@ -334,9 +334,10 @@
}
int verifyRequest(int expectedMessageType) {
+ mServiceHandler.waitForIdle(mTimeoutMs);
verify(mServiceHandler, timeout(mTimeoutMs)).handleMessage(any());
reset(mServiceHandler);
- Message received = mServiceHandler.lastMessage;
+ Message received = mServiceHandler.getLastMessage();
assertEquals(NsdManager.nameOf(expectedMessageType), NsdManager.nameOf(received.what));
return received.arg2;
}
@@ -347,31 +348,43 @@
// Implements the server side of AsyncChannel connection protocol
public static class MockServiceHandler extends Handler {
- public Context mContext;
+ public final Context context;
public AsyncChannel chan;
- public volatile Message lastMessage;
+ public Message lastMessage;
- MockServiceHandler(Looper looper, Context context) {
- super(looper);
- mContext = context;
+ MockServiceHandler(Looper l, Context c) {
+ super(l);
+ context = c;
+ }
+
+ synchronized Message getLastMessage() {
+ return lastMessage;
+ }
+
+ synchronized void setLastMessage(Message msg) {
+ lastMessage = obtainMessage();
+ lastMessage.copyFrom(msg);
+ }
+
+ void waitForIdle(long timeoutMs) {
+ waitForIdleHandler(this, timeoutMs);
}
@Override
public void handleMessage(Message msg) {
- lastMessage = obtainMessage();
- lastMessage.copyFrom(msg);
+ setLastMessage(msg);
if (msg.what == AsyncChannel.CMD_CHANNEL_FULL_CONNECTION) {
chan = new AsyncChannel();
- chan.connect(mContext, this, msg.replyTo);
+ chan.connect(context, this, msg.replyTo);
chan.sendMessage(AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED);
}
}
- public void stop() {
+ void stop() {
getLooper().quitSafely();
}
- public static MockServiceHandler create(Context context) {
+ static MockServiceHandler create(Context context) {
HandlerThread t = new HandlerThread("mock-service-handler");
t.start();
return new MockServiceHandler(t.getLooper(), context);
diff --git a/tests/net/java/com/android/internal/util/TestUtils.java b/tests/net/java/com/android/internal/util/TestUtils.java
index c9fa340..6db01d3 100644
--- a/tests/net/java/com/android/internal/util/TestUtils.java
+++ b/tests/net/java/com/android/internal/util/TestUtils.java
@@ -30,8 +30,7 @@
* Block until the given Handler thread becomes idle, or until timeoutMs has passed.
*/
public static void waitForIdleHandler(HandlerThread handlerThread, long timeoutMs) {
- // TODO: convert to getThreadHandler once it is available on aosp
- waitForIdleLooper(handlerThread.getLooper(), timeoutMs);
+ waitForIdleHandler(handlerThread.getThreadHandler(), timeoutMs);
}
/**
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index f6481cf..a814738 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -64,6 +64,7 @@
import android.net.NetworkMisc;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
+import android.net.NetworkUtils;
import android.net.RouteInfo;
import android.net.StringNetworkSpecifier;
import android.net.metrics.IpConnectivityLog;
@@ -88,6 +89,7 @@
import android.test.mock.MockContentResolver;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.Log;
import android.util.LogPrinter;
@@ -109,7 +111,10 @@
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -304,6 +309,10 @@
private String mRedirectUrl;
MockNetworkAgent(int transport) {
+ this(transport, new LinkProperties());
+ }
+
+ MockNetworkAgent(int transport, LinkProperties linkProperties) {
final int type = transportToLegacyType(transport);
final String typeName = ConnectivityManager.getNetworkTypeName(type);
mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock");
@@ -329,7 +338,7 @@
mHandlerThread.start();
mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext,
"Mock-" + typeName, mNetworkInfo, mNetworkCapabilities,
- new LinkProperties(), mScore, new NetworkMisc()) {
+ linkProperties, mScore, new NetworkMisc()) {
@Override
public void unwanted() { mDisconnected.open(); }
@@ -674,7 +683,8 @@
public WrappedNetworkMonitor(Context context, Handler handler,
NetworkAgentInfo networkAgentInfo, NetworkRequest defaultRequest,
IpConnectivityLog log) {
- super(context, handler, networkAgentInfo, defaultRequest, log);
+ super(context, handler, networkAgentInfo, defaultRequest, log,
+ NetworkMonitor.NetworkMonitorSettings.DEFAULT);
}
@Override
@@ -3338,6 +3348,68 @@
assertException(() -> { mCm.requestRouteToHostAddress(TYPE_NONE, null); }, unsupported);
}
+ @SmallTest
+ public void testLinkPropertiesEnsuresDirectlyConnectedRoutes() {
+ final NetworkRequest networkRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_WIFI).build();
+ final TestNetworkCallback networkCallback = new TestNetworkCallback();
+ mCm.registerNetworkCallback(networkRequest, networkCallback);
+
+ LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName("wlan0");
+ LinkAddress myIpv4Address = new LinkAddress("192.168.12.3/24");
+ RouteInfo myIpv4DefaultRoute = new RouteInfo((IpPrefix) null,
+ NetworkUtils.numericToInetAddress("192.168.12.1"), lp.getInterfaceName());
+ lp.addLinkAddress(myIpv4Address);
+ lp.addRoute(myIpv4DefaultRoute);
+
+ // Verify direct routes are added when network agent is first registered in
+ // ConnectivityService.
+ MockNetworkAgent networkAgent = new MockNetworkAgent(TRANSPORT_WIFI, lp);
+ networkAgent.connect(true);
+ networkCallback.expectCallback(CallbackState.AVAILABLE, networkAgent);
+ networkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, networkAgent);
+ CallbackInfo cbi = networkCallback.expectCallback(CallbackState.LINK_PROPERTIES,
+ networkAgent);
+ networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, networkAgent);
+ networkCallback.assertNoCallback();
+ checkDirectlyConnectedRoutes(cbi.arg, Arrays.asList(myIpv4Address),
+ Arrays.asList(myIpv4DefaultRoute));
+ checkDirectlyConnectedRoutes(mCm.getLinkProperties(networkAgent.getNetwork()),
+ Arrays.asList(myIpv4Address), Arrays.asList(myIpv4DefaultRoute));
+
+ // Verify direct routes are added during subsequent link properties updates.
+ LinkProperties newLp = new LinkProperties(lp);
+ LinkAddress myIpv6Address1 = new LinkAddress("fe80::cafe/64");
+ LinkAddress myIpv6Address2 = new LinkAddress("2001:db8::2/64");
+ newLp.addLinkAddress(myIpv6Address1);
+ newLp.addLinkAddress(myIpv6Address2);
+ networkAgent.sendLinkProperties(newLp);
+ cbi = networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, networkAgent);
+ networkCallback.assertNoCallback();
+ checkDirectlyConnectedRoutes(cbi.arg,
+ Arrays.asList(myIpv4Address, myIpv6Address1, myIpv6Address2),
+ Arrays.asList(myIpv4DefaultRoute));
+ mCm.unregisterNetworkCallback(networkCallback);
+ }
+
+ private void checkDirectlyConnectedRoutes(Object callbackObj,
+ Collection<LinkAddress> linkAddresses, Collection<RouteInfo> otherRoutes) {
+ assertTrue(callbackObj instanceof LinkProperties);
+ LinkProperties lp = (LinkProperties) callbackObj;
+
+ Set<RouteInfo> expectedRoutes = new ArraySet<>();
+ expectedRoutes.addAll(otherRoutes);
+ for (LinkAddress address : linkAddresses) {
+ RouteInfo localRoute = new RouteInfo(address, null, lp.getInterfaceName());
+ // Duplicates in linkAddresses are considered failures
+ assertTrue(expectedRoutes.add(localRoute));
+ }
+ List<RouteInfo> observedRoutes = lp.getRoutes();
+ assertEquals(expectedRoutes.size(), observedRoutes.size());
+ assertTrue(observedRoutes.containsAll(expectedRoutes));
+ }
+
private static <T> void assertEmpty(T[] ts) {
int length = ts.length;
assertEquals("expected empty array, but length was " + length, 0, length);
diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
index eff04ab..f72a1c6 100644
--- a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
+++ b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
@@ -16,6 +16,8 @@
package com.android.server.connectivity;
+import static android.net.metrics.INetdEventListener.EVENT_GETADDRINFO;
+import static android.net.metrics.INetdEventListener.EVENT_GETHOSTBYNAME;
import static com.android.server.connectivity.MetricsTestUtil.aBool;
import static com.android.server.connectivity.MetricsTestUtil.aByteArray;
import static com.android.server.connectivity.MetricsTestUtil.aLong;
@@ -31,29 +33,41 @@
import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.ETHERNET;
import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.MULTIPLE;
import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.WIFI;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import android.net.ConnectivityMetricsEvent;
import android.net.metrics.ApfProgramEvent;
import android.net.metrics.ApfStats;
+import android.net.metrics.ConnectStats;
import android.net.metrics.DefaultNetworkEvent;
import android.net.metrics.DhcpClientEvent;
import android.net.metrics.DhcpErrorEvent;
import android.net.metrics.DnsEvent;
+import android.net.metrics.DnsEvent;
import android.net.metrics.IpManagerEvent;
import android.net.metrics.IpReachabilityEvent;
import android.net.metrics.NetworkEvent;
import android.net.metrics.RaEvent;
import android.net.metrics.ValidationProbeEvent;
+import android.net.metrics.WakeupStats;
+import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+
import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent;
+
import java.util.Arrays;
import java.util.List;
-import junit.framework.TestCase;
+
+import org.junit.runner.RunWith;
+import org.junit.Test;
// TODO: instead of comparing textpb to textpb, parse textpb and compare proto to proto.
-public class IpConnectivityEventBuilderTest extends TestCase {
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class IpConnectivityEventBuilderTest {
- @SmallTest
+ @Test
public void testLinkLayerInferrence() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(IpReachabilityEvent.class),
@@ -182,7 +196,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testDefaultNetworkEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(DefaultNetworkEvent.class),
@@ -223,7 +237,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testDhcpClientEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(DhcpClientEvent.class),
@@ -249,7 +263,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testDhcpErrorEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(DhcpErrorEvent.class),
@@ -274,7 +288,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testIpManagerEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(IpManagerEvent.class),
@@ -300,7 +314,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testIpReachabilityEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(IpReachabilityEvent.class),
@@ -324,7 +338,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testNetworkEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(NetworkEvent.class),
@@ -353,7 +367,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testValidationProbeEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(ValidationProbeEvent.class),
@@ -380,7 +394,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testApfProgramEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(ApfProgramEvent.class),
@@ -414,7 +428,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testApfStatsSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(ApfStats.class),
@@ -457,7 +471,7 @@
verifySerialization(want, ev);
}
- @SmallTest
+ @Test
public void testRaEventSerialization() {
ConnectivityMetricsEvent ev = describeIpEvent(
aType(RaEvent.class),
@@ -490,11 +504,49 @@
verifySerialization(want, ev);
}
+ @Test
+ public void testWakeupStatsSerialization() {
+ WakeupStats stats = new WakeupStats("wlan0");
+ stats.totalWakeups = 14;
+ stats.applicationWakeups = 5;
+ stats.nonApplicationWakeups = 1;
+ stats.rootWakeups = 2;
+ stats.systemWakeups = 3;
+ stats.unroutedWakeups = 3;
+
+ IpConnectivityEvent got = IpConnectivityEventBuilder.toProto(stats);
+ String want = String.join("\n",
+ "dropped_events: 0",
+ "events <",
+ " if_name: \"\"",
+ " link_layer: 4",
+ " network_id: 0",
+ " time_ms: 0",
+ " transports: 0",
+ " wakeup_stats <",
+ " application_wakeups: 5",
+ " duration_sec: 0",
+ " non_application_wakeups: 1",
+ " root_wakeups: 2",
+ " system_wakeups: 3",
+ " total_wakeups: 14",
+ " unrouted_wakeups: 3",
+ " >",
+ ">",
+ "version: 2\n");
+
+ verifySerialization(want, got);
+ }
+
static void verifySerialization(String want, ConnectivityMetricsEvent... input) {
+ List<IpConnectivityEvent> protoInput =
+ IpConnectivityEventBuilder.toProto(Arrays.asList(input));
+ verifySerialization(want, protoInput.toArray(new IpConnectivityEvent[0]));
+ }
+
+ static void verifySerialization(String want, IpConnectivityEvent... input) {
try {
- List<IpConnectivityEvent> proto =
- IpConnectivityEventBuilder.toProto(Arrays.asList(input));
- byte[] got = IpConnectivityEventBuilder.serialize(0, proto);
+ byte[] got = IpConnectivityEventBuilder.serialize(0, Arrays.asList(input));
IpConnectivityLog log = IpConnectivityLog.parseFrom(got);
assertEquals(want, log.toString());
} catch (Exception e) {
diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
index cc18b7f..ede5988 100644
--- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
+++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
@@ -224,6 +224,15 @@
dnsEvent(101, EVENT_GETADDRINFO, 0, 56);
dnsEvent(101, EVENT_GETHOSTBYNAME, 0, 34);
+ // iface, uid
+ wakeupEvent("wlan0", 1000);
+ wakeupEvent("rmnet0", 10123);
+ wakeupEvent("wlan0", 1000);
+ wakeupEvent("rmnet0", 10008);
+ wakeupEvent("wlan0", -1);
+ wakeupEvent("wlan0", 10008);
+ wakeupEvent("rmnet0", 1000);
+
String want = String.join("\n",
"dropped_events: 0",
"events <",
@@ -405,6 +414,38 @@
" return_codes: 0",
" >",
">",
+ "events <",
+ " if_name: \"\"",
+ " link_layer: 2",
+ " network_id: 0",
+ " time_ms: 0",
+ " transports: 0",
+ " wakeup_stats <",
+ " application_wakeups: 2",
+ " duration_sec: 0",
+ " non_application_wakeups: 0",
+ " root_wakeups: 0",
+ " system_wakeups: 1",
+ " total_wakeups: 3",
+ " unrouted_wakeups: 0",
+ " >",
+ ">",
+ "events <",
+ " if_name: \"\"",
+ " link_layer: 4",
+ " network_id: 0",
+ " time_ms: 0",
+ " transports: 0",
+ " wakeup_stats <",
+ " application_wakeups: 1",
+ " duration_sec: 0",
+ " non_application_wakeups: 0",
+ " root_wakeups: 0",
+ " system_wakeups: 2",
+ " total_wakeups: 4",
+ " unrouted_wakeups: 1",
+ " >",
+ ">",
"version: 2\n");
verifySerialization(want, getdump("flush"));
@@ -425,6 +466,11 @@
mNetdListener.onDnsEvent(netId, type, result, latency, "", null, 0, 0);
}
+ void wakeupEvent(String iface, int uid) throws Exception {
+ String prefix = NetdEventListenerService.WAKEUP_EVENT_IFACE_PREFIX + iface;
+ mNetdListener.onWakeupEvent(prefix, uid, uid, 0);
+ }
+
List<ConnectivityMetricsEvent> verifyEvents(int n, int timeoutMs) throws Exception {
ArgumentCaptor<ConnectivityMetricsEvent> captor =
ArgumentCaptor.forClass(ConnectivityMetricsEvent.class);
diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
index 46f395e..2b105e5 100644
--- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
+++ b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
@@ -19,6 +19,7 @@
import static android.net.metrics.INetdEventListener.EVENT_GETADDRINFO;
import static android.net.metrics.INetdEventListener.EVENT_GETHOSTBYNAME;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
@@ -37,9 +38,11 @@
import android.system.OsConstants;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Base64;
+
import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.DNSLookupBatch;
import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent;
import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityLog;
+
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -47,6 +50,7 @@
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -75,6 +79,118 @@
}
@Test
+ public void testWakeupEventLogging() throws Exception {
+ final int BUFFER_LENGTH = NetdEventListenerService.WAKEUP_EVENT_BUFFER_LENGTH;
+
+ // Assert no events
+ String[] events1 = listNetdEvent();
+ assertEquals(new String[]{""}, events1);
+
+ long now = System.currentTimeMillis();
+ String prefix = "iface:wlan0";
+ int[] uids = { 10001, 10002, 10004, 1000, 10052, 10023, 10002, 10123, 10004 };
+ for (int uid : uids) {
+ mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, now);
+ }
+
+ String[] events2 = listNetdEvent();
+ int expectedLength2 = uids.length + 1; // +1 for the WakeupStats line
+ assertEquals(expectedLength2, events2.length);
+ assertContains(events2[0], "WakeupStats");
+ assertContains(events2[0], "wlan0");
+ for (int i = 0; i < uids.length; i++) {
+ String got = events2[i+1];
+ assertContains(got, "WakeupEvent");
+ assertContains(got, "wlan0");
+ assertContains(got, "uid: " + uids[i]);
+ }
+
+ int uid = 20000;
+ for (int i = 0; i < BUFFER_LENGTH * 2; i++) {
+ long ts = now + 10;
+ mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, ts);
+ }
+
+ String[] events3 = listNetdEvent();
+ int expectedLength3 = BUFFER_LENGTH + 1; // +1 for the WakeupStats line
+ assertEquals(expectedLength3, events3.length);
+ assertContains(events2[0], "WakeupStats");
+ assertContains(events2[0], "wlan0");
+ for (int i = 1; i < expectedLength3; i++) {
+ String got = events3[i];
+ assertContains(got, "WakeupEvent");
+ assertContains(got, "wlan0");
+ assertContains(got, "uid: " + uid);
+ }
+
+ uid = 45678;
+ mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, now);
+
+ String[] events4 = listNetdEvent();
+ String lastEvent = events4[events4.length - 1];
+ assertContains(lastEvent, "WakeupEvent");
+ assertContains(lastEvent, "wlan0");
+ assertContains(lastEvent, "uid: " + uid);
+ }
+
+ @Test
+ public void testWakeupStatsLogging() throws Exception {
+ wakeupEvent("wlan0", 1000);
+ wakeupEvent("rmnet0", 10123);
+ wakeupEvent("wlan0", 1000);
+ wakeupEvent("rmnet0", 10008);
+ wakeupEvent("wlan0", -1);
+ wakeupEvent("wlan0", 10008);
+ wakeupEvent("rmnet0", 1000);
+ wakeupEvent("wlan0", 10004);
+ wakeupEvent("wlan0", 1000);
+ wakeupEvent("wlan0", 0);
+ wakeupEvent("wlan0", -1);
+ wakeupEvent("rmnet0", 10052);
+ wakeupEvent("wlan0", 0);
+ wakeupEvent("rmnet0", 1000);
+ wakeupEvent("wlan0", 1010);
+
+ String got = flushStatistics();
+ String want = String.join("\n",
+ "dropped_events: 0",
+ "events <",
+ " if_name: \"\"",
+ " link_layer: 2",
+ " network_id: 0",
+ " time_ms: 0",
+ " transports: 0",
+ " wakeup_stats <",
+ " application_wakeups: 3",
+ " duration_sec: 0",
+ " non_application_wakeups: 0",
+ " root_wakeups: 0",
+ " system_wakeups: 2",
+ " total_wakeups: 5",
+ " unrouted_wakeups: 0",
+ " >",
+ ">",
+ "events <",
+ " if_name: \"\"",
+ " link_layer: 4",
+ " network_id: 0",
+ " time_ms: 0",
+ " transports: 0",
+ " wakeup_stats <",
+ " application_wakeups: 2",
+ " duration_sec: 0",
+ " non_application_wakeups: 1",
+ " root_wakeups: 2",
+ " system_wakeups: 3",
+ " total_wakeups: 10",
+ " unrouted_wakeups: 2",
+ " >",
+ ">",
+ "version: 2\n");
+ assertEquals(want, got);
+ }
+
+ @Test
public void testDnsLogging() throws Exception {
asyncDump(100);
@@ -297,6 +413,11 @@
mNetdEventListenerService.onDnsEvent(netId, type, result, latency, "", null, 0, 0);
}
+ void wakeupEvent(String iface, int uid) throws Exception {
+ String prefix = NetdEventListenerService.WAKEUP_EVENT_IFACE_PREFIX + iface;
+ mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, 0);
+ }
+
void asyncDump(long durationMs) throws Exception {
final long stop = System.currentTimeMillis() + durationMs;
final PrintWriter pw = new PrintWriter(new FileOutputStream("/dev/null"));
@@ -329,4 +450,15 @@
}
return log.toString();
}
+
+ String[] listNetdEvent() throws Exception {
+ StringWriter buffer = new StringWriter();
+ PrintWriter writer = new PrintWriter(buffer);
+ mNetdEventListenerService.list(writer);
+ return buffer.toString().split("\\n");
+ }
+
+ static void assertContains(String got, String want) {
+ assertTrue(got + " did not contain \"" + want + "\"", got.contains(want));
+ }
}
diff --git a/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java b/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java
new file mode 100644
index 0000000..27a897d
--- /dev/null
+++ b/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.Network;
+import android.net.NetworkRequest;
+import android.net.metrics.IpConnectivityLog;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.telephony.TelephonyManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class NetworkMonitorTest {
+
+ static final int TEST_ID = 60; // should be less than min netid 100
+
+ @Mock Context mContext;
+ @Mock Handler mHandler;
+ @Mock IpConnectivityLog mLogger;
+ @Mock NetworkAgentInfo mAgent;
+ @Mock NetworkMonitor.NetworkMonitorSettings mSettings;
+ @Mock NetworkRequest mRequest;
+ @Mock TelephonyManager mTelephony;
+ @Mock WifiManager mWifi;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mAgent.network()).thenReturn(new Network(TEST_ID));
+ when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephony);
+ when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifi);
+ }
+
+ NetworkMonitor makeMonitor() {
+ return new NetworkMonitor(mContext, mHandler, mAgent, mRequest, mLogger, mSettings);
+ }
+
+ @Test
+ public void testCreatingNetworkMonitor() {
+ NetworkMonitor monitor = makeMonitor();
+ }
+}
+
diff --git a/tools/aapt/Android.bp b/tools/aapt/Android.bp
new file mode 100644
index 0000000..e26c9c3
--- /dev/null
+++ b/tools/aapt/Android.bp
@@ -0,0 +1,115 @@
+//
+// 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.
+//
+
+// ==========================================================
+// Setup some common variables for the different build
+// targets here.
+// ==========================================================
+
+cc_defaults {
+ name: "aapt_defaults",
+
+ static_libs: [
+ "libandroidfw",
+ "libpng",
+ "libutils",
+ "liblog",
+ "libcutils",
+ "libexpat",
+ "libziparchive",
+ "libbase",
+ "libz",
+ ],
+ group_static_libs: true,
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+ target: {
+ windows: {
+ enabled: true,
+ },
+ },
+
+ // This tool is prebuilt if we're doing an app-only build.
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ unbundled_build: {
+ enabled: false,
+ },
+ },
+}
+
+// ==========================================================
+// Build the host static library: libaapt
+// ==========================================================
+cc_library_host_static {
+ name: "libaapt",
+ defaults: ["aapt_defaults"],
+ target: {
+ darwin: {
+ cflags: ["-D_DARWIN_UNLIMITED_STREAMS"],
+ },
+ },
+ cflags: [
+ "-Wno-format-y2k",
+ "-DSTATIC_ANDROIDFW_FOR_TOOLS",
+ ],
+
+ srcs: [
+ "AaptAssets.cpp",
+ "AaptConfig.cpp",
+ "AaptUtil.cpp",
+ "AaptXml.cpp",
+ "ApkBuilder.cpp",
+ "Command.cpp",
+ "CrunchCache.cpp",
+ "FileFinder.cpp",
+ "Images.cpp",
+ "Package.cpp",
+ "pseudolocalize.cpp",
+ "Resource.cpp",
+ "ResourceFilter.cpp",
+ "ResourceIdCache.cpp",
+ "ResourceTable.cpp",
+ "SourcePos.cpp",
+ "StringPool.cpp",
+ "WorkQueue.cpp",
+ "XMLNode.cpp",
+ "ZipEntry.cpp",
+ "ZipFile.cpp",
+ ],
+}
+
+// ==========================================================
+// Build the host tests: libaapt_tests
+// ==========================================================
+cc_test_host {
+ name: "libaapt_tests",
+ defaults: ["aapt_defaults"],
+ srcs: [
+ "tests/AaptConfig_test.cpp",
+ "tests/AaptGroupEntry_test.cpp",
+ "tests/Pseudolocales_test.cpp",
+ "tests/ResourceFilter_test.cpp",
+ "tests/ResourceTable_test.cpp",
+ ],
+ static_libs: ["libaapt"],
+}
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk
index 04f46d9..7bcf631 100644
--- a/tools/aapt/Android.mk
+++ b/tools/aapt/Android.mk
@@ -14,7 +14,6 @@
# limitations under the License.
#
-# This tool is prebuilt if we're doing an app-only build.
ifeq ($(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)),)
# ==========================================================
@@ -23,37 +22,6 @@
# ==========================================================
LOCAL_PATH:= $(call my-dir)
-aaptMain := Main.cpp
-aaptSources := \
- AaptAssets.cpp \
- AaptConfig.cpp \
- AaptUtil.cpp \
- AaptXml.cpp \
- ApkBuilder.cpp \
- Command.cpp \
- CrunchCache.cpp \
- FileFinder.cpp \
- Images.cpp \
- Package.cpp \
- pseudolocalize.cpp \
- Resource.cpp \
- ResourceFilter.cpp \
- ResourceIdCache.cpp \
- ResourceTable.cpp \
- SourcePos.cpp \
- StringPool.cpp \
- WorkQueue.cpp \
- XMLNode.cpp \
- ZipEntry.cpp \
- ZipFile.cpp
-
-aaptTests := \
- tests/AaptConfig_test.cpp \
- tests/AaptGroupEntry_test.cpp \
- tests/Pseudolocales_test.cpp \
- tests/ResourceFilter_test.cpp \
- tests/ResourceTable_test.cpp
-
aaptHostStaticLibs := \
libandroidfw \
libpng \
@@ -62,35 +30,10 @@
libcutils \
libexpat \
libziparchive \
- libbase
+ libbase \
+ libz
-aaptCFlags := -DAAPT_VERSION=\"$(BUILD_NUMBER_FROM_FILE)\"
-aaptCFlags += -Wall -Werror
-
-aaptHostLdLibs_linux := -lrt -ldl -lpthread
-
-# Statically link libz for MinGW (Win SDK under Linux),
-# and dynamically link for all others.
-aaptHostStaticLibs_windows := libz
-aaptHostLdLibs_linux += -lz
-aaptHostLdLibs_darwin := -lz
-
-
-# ==========================================================
-# Build the host static library: libaapt
-# ==========================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libaapt
-LOCAL_MODULE_HOST_OS := darwin linux windows
-LOCAL_CFLAGS := -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)
-LOCAL_CPPFLAGS := $(aaptCppFlags)
-LOCAL_CFLAGS_darwin := -D_DARWIN_UNLIMITED_STREAMS
-LOCAL_SRC_FILES := $(aaptSources)
-LOCAL_STATIC_LIBRARIES := $(aaptHostStaticLibs)
-LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)
-
-include $(BUILD_HOST_STATIC_LIBRARY)
+aaptCFlags := -Wall -Werror
# ==========================================================
# Build the host executable: aapt
@@ -99,33 +42,10 @@
LOCAL_MODULE := aapt
LOCAL_MODULE_HOST_OS := darwin linux windows
-LOCAL_CFLAGS := $(aaptCFlags)
-LOCAL_CPPFLAGS := $(aaptCppFlags)
-LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)
-LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)
-LOCAL_SRC_FILES := $(aaptMain)
+LOCAL_CFLAGS := -DAAPT_VERSION=\"$(BUILD_NUMBER_FROM_FILE)\" $(aaptCFlags)
+LOCAL_SRC_FILES := Main.cpp
LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs)
-LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)
include $(BUILD_HOST_EXECUTABLE)
-
-# ==========================================================
-# Build the host tests: libaapt_tests
-# ==========================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libaapt_tests
-LOCAL_CFLAGS := $(aaptCFlags)
-LOCAL_CPPFLAGS := $(aaptCppFlags)
-LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)
-LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)
-LOCAL_SRC_FILES := $(aaptTests)
-LOCAL_C_INCLUDES := $(LOCAL_PATH)
-LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs)
-LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)
-
-include $(BUILD_HOST_NATIVE_TEST)
-
-
endif # No TARGET_BUILD_APPS or TARGET_BUILD_PDK
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index ba73180..5e85802 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -29,24 +29,6 @@
using namespace android;
-#ifndef AAPT_VERSION
- #define AAPT_VERSION ""
-#endif
-
-/*
- * Show version info. All the cool kids do it.
- */
-int doVersion(Bundle* bundle)
-{
- if (bundle->getFileSpecCount() != 0) {
- printf("(ignoring extra arguments)\n");
- }
- printf("Android Asset Packaging Tool, v0.2-" AAPT_VERSION "\n");
-
- return 0;
-}
-
-
/*
* Open the file read only. The call fails if the file doesn't exist.
*
diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp
index 417b7ae..d714687 100644
--- a/tools/aapt/Main.cpp
+++ b/tools/aapt/Main.cpp
@@ -20,6 +20,23 @@
static const char* gProgName = "aapt";
+#ifndef AAPT_VERSION
+ #define AAPT_VERSION ""
+#endif
+
+/*
+ * Show version info. All the cool kids do it.
+ */
+int doVersion(Bundle* bundle)
+{
+ if (bundle->getFileSpecCount() != 0) {
+ printf("(ignoring extra arguments)\n");
+ }
+ printf("Android Asset Packaging Tool, v0.2-" AAPT_VERSION "\n");
+
+ return 0;
+}
+
/*
* When running under Cygwin on Windows, this will convert slash-based
* paths into back-slash-based ones. Otherwise the ApptAssets file comparisons
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 24aa6eb..43918da 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -24,7 +24,7 @@
]
cc_defaults {
- name: "aapt_defaults",
+ name: "aapt2_defaults",
cflags: [
"-Wall",
"-Werror",
@@ -39,14 +39,9 @@
windows: {
enabled: true,
cflags: ["-Wno-maybe-uninitialized"],
- static_libs: ["libz"],
},
darwin: {
cflags: ["-D_DARWIN_UNLIMITED_STREAMS"],
- host_ldlibs: ["-lz"],
- },
- linux: {
- host_ldlibs: ["-lz"],
},
},
static_libs: [
@@ -59,6 +54,7 @@
"libpng",
"libbase",
"libprotobuf-cpp-lite",
+ "libz",
],
group_static_libs: true,
}
@@ -149,7 +145,7 @@
proto: {
export_proto_headers: true,
},
- defaults: ["aapt_defaults"],
+ defaults: ["aapt2_defaults"],
}
// ==========================================================
@@ -159,7 +155,7 @@
name: "libaapt2_jni",
srcs: toolSources + ["jni/aapt2_jni.cpp"],
static_libs: ["libaapt2"],
- defaults: ["aapt_defaults"],
+ defaults: ["aapt2_defaults"],
}
// ==========================================================
@@ -176,7 +172,7 @@
"libaapt2",
"libgmock",
],
- defaults: ["aapt_defaults"],
+ defaults: ["aapt2_defaults"],
}
// ==========================================================
@@ -186,5 +182,5 @@
name: "aapt2",
srcs: ["Main.cpp"] + toolSources,
static_libs: ["libaapt2"],
- defaults: ["aapt_defaults"],
+ defaults: ["aapt2_defaults"],
}
diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp
index 49ed778..dba9cb5 100644
--- a/tools/aapt2/Debug.cpp
+++ b/tools/aapt2/Debug.cpp
@@ -291,7 +291,13 @@
std::cerr << "(" << attr.compiled_attribute.value().id.value_or_default(ResourceId(0x0))
<< ")";
}
- std::cerr << "=" << attr.value << "\n";
+ std::cerr << "=";
+ if (attr.compiled_value != nullptr) {
+ std::cerr << *attr.compiled_value;
+ } else {
+ std::cerr << attr.value;
+ }
+ std::cerr << "\n";
}
prefix_ += " ";
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index 86f4c42..36ab30c 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -41,7 +41,7 @@
static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
-static const char* sMinorVersion = "18";
+static const char* sMinorVersion = "19";
static void PrintVersion() {
std::cerr << StringPrintf("Android Asset Packaging Tool (aapt) %s:%s", sMajorVersion,
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 47549f0..4cc60a8 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -392,6 +392,7 @@
{"declare-styleable", std::mem_fn(&ResourceParser::ParseDeclareStyleable)},
{"integer-array", std::mem_fn(&ResourceParser::ParseIntegerArray)},
{"java-symbol", std::mem_fn(&ResourceParser::ParseSymbol)},
+ {"overlayable", std::mem_fn(&ResourceParser::ParseOverlayable)},
{"plurals", std::mem_fn(&ResourceParser::ParsePlural)},
{"public", std::mem_fn(&ResourceParser::ParsePublic)},
{"public-group", std::mem_fn(&ResourceParser::ParsePublicGroup)},
@@ -498,7 +499,7 @@
const auto bag_iter = elToBagMap.find(resource_type);
if (bag_iter != elToBagMap.end()) {
// Ensure we have a name (unless this is a <public-group>).
- if (resource_type != "public-group") {
+ if (resource_type != "public-group" && resource_type != "overlayable") {
if (!maybe_name) {
diag_->Error(DiagMessage(out_resource->source)
<< "<" << parser->element_name() << "> missing 'name' attribute");
@@ -690,6 +691,11 @@
bool ResourceParser::ParsePublic(xml::XmlPullParser* parser,
ParsedResource* out_resource) {
+ if (out_resource->config != ConfigDescription::DefaultConfig()) {
+ diag_->Warn(DiagMessage(out_resource->source)
+ << "ignoring configuration '" << out_resource->config << "' for <public> tag");
+ }
+
Maybe<StringPiece> maybe_type = xml::FindNonEmptyAttribute(parser, "type");
if (!maybe_type) {
diag_->Error(DiagMessage(out_resource->source)
@@ -726,8 +732,13 @@
return true;
}
-bool ResourceParser::ParsePublicGroup(xml::XmlPullParser* parser,
- ParsedResource* out_resource) {
+bool ResourceParser::ParsePublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource) {
+ if (out_resource->config != ConfigDescription::DefaultConfig()) {
+ diag_->Warn(DiagMessage(out_resource->source)
+ << "ignoring configuration '" << out_resource->config
+ << "' for <public-group> tag");
+ }
+
Maybe<StringPiece> maybe_type = xml::FindNonEmptyAttribute(parser, "type");
if (!maybe_type) {
diag_->Error(DiagMessage(out_resource->source)
@@ -842,13 +853,83 @@
return true;
}
-bool ResourceParser::ParseSymbol(xml::XmlPullParser* parser,
- ParsedResource* out_resource) {
- if (ParseSymbolImpl(parser, out_resource)) {
- out_resource->symbol_state = SymbolState::kPrivate;
- return true;
+bool ResourceParser::ParseSymbol(xml::XmlPullParser* parser, ParsedResource* out_resource) {
+ if (out_resource->config != ConfigDescription::DefaultConfig()) {
+ diag_->Warn(DiagMessage(out_resource->source)
+ << "ignoring configuration '" << out_resource->config << "' for <"
+ << parser->element_name() << "> tag");
}
- return false;
+
+ if (!ParseSymbolImpl(parser, out_resource)) {
+ return false;
+ }
+
+ out_resource->symbol_state = SymbolState::kPrivate;
+ return true;
+}
+
+bool ResourceParser::ParseOverlayable(xml::XmlPullParser* parser, ParsedResource* out_resource) {
+ if (out_resource->config != ConfigDescription::DefaultConfig()) {
+ diag_->Warn(DiagMessage(out_resource->source)
+ << "ignoring configuration '" << out_resource->config << "' for <overlayable> tag");
+ }
+
+ if (Maybe<StringPiece> maybe_policy = xml::FindNonEmptyAttribute(parser, "policy")) {
+ const StringPiece& policy = maybe_policy.value();
+ if (policy != "system") {
+ diag_->Error(DiagMessage(out_resource->source)
+ << "<overlayable> has invalid policy '" << policy << "'");
+ return false;
+ }
+ }
+
+ bool error = false;
+ const size_t depth = parser->depth();
+ while (xml::XmlPullParser::NextChildNode(parser, depth)) {
+ if (parser->event() != xml::XmlPullParser::Event::kStartElement) {
+ // Skip text/comments.
+ continue;
+ }
+
+ const Source item_source = source_.WithLine(parser->line_number());
+ const std::string& element_namespace = parser->element_namespace();
+ const std::string& element_name = parser->element_name();
+ if (element_namespace.empty() && element_name == "item") {
+ Maybe<StringPiece> maybe_name = xml::FindNonEmptyAttribute(parser, "name");
+ if (!maybe_name) {
+ diag_->Error(DiagMessage(item_source)
+ << "<item> within an <overlayable> tag must have a 'name' attribute");
+ error = true;
+ continue;
+ }
+
+ Maybe<StringPiece> maybe_type = xml::FindNonEmptyAttribute(parser, "type");
+ if (!maybe_type) {
+ diag_->Error(DiagMessage(item_source)
+ << "<item> within an <overlayable> tag must have a 'type' attribute");
+ error = true;
+ continue;
+ }
+
+ const ResourceType* type = ParseResourceType(maybe_type.value());
+ if (type == nullptr) {
+ diag_->Error(DiagMessage(out_resource->source)
+ << "invalid resource type '" << maybe_type.value()
+ << "' in <item> within an <overlayable>");
+ error = true;
+ continue;
+ }
+
+ // TODO(b/64980941): Mark the symbol as overlayable and allow marking which entity can overlay
+ // the resource (system/app).
+
+ xml::XmlPullParser::SkipCurrentElement(parser);
+ } else if (!ShouldIgnoreElement(element_namespace, element_name)) {
+ diag_->Error(DiagMessage(item_source) << ":" << element_name << ">");
+ error = true;
+ }
+ }
+ return !error;
}
bool ResourceParser::ParseAddResource(xml::XmlPullParser* parser,
diff --git a/tools/aapt2/ResourceParser.h b/tools/aapt2/ResourceParser.h
index 5631dc2..fb9dbd0 100644
--- a/tools/aapt2/ResourceParser.h
+++ b/tools/aapt2/ResourceParser.h
@@ -91,6 +91,7 @@
bool ParsePublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource);
bool ParseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* out_resource);
bool ParseSymbol(xml::XmlPullParser* parser, ParsedResource* out_resource);
+ bool ParseOverlayable(xml::XmlPullParser* parser, ParsedResource* out_resource);
bool ParseAddResource(xml::XmlPullParser* parser, ParsedResource* out_resource);
bool ParseAttr(xml::XmlPullParser* parser, ParsedResource* out_resource);
bool ParseAttrImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, bool weak);
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index 144ebd2..f08b03e 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -790,4 +790,49 @@
ASSERT_TRUE(TestParse(R"(<string name="foo">%1$s %n %2$s</string>)"));
}
+TEST_F(ResourceParserTest, ParseOverlayableTagWithSystemPolicy) {
+ std::string input = R"(
+ <overlayable policy="illegal_policy">
+ <item type="string" name="foo" />
+ </overlayable>)";
+ EXPECT_FALSE(TestParse(input));
+
+ input = R"(
+ <overlayable policy="system">
+ <item name="foo" />
+ </overlayable>)";
+ EXPECT_FALSE(TestParse(input));
+
+ input = R"(
+ <overlayable policy="system">
+ <item type="attr" />
+ </overlayable>)";
+ EXPECT_FALSE(TestParse(input));
+
+ input = R"(
+ <overlayable policy="system">
+ <item type="bad_type" name="foo" />
+ </overlayable>)";
+ EXPECT_FALSE(TestParse(input));
+
+ input = R"(<overlayable policy="system" />)";
+ EXPECT_TRUE(TestParse(input));
+
+ input = R"(<overlayable />)";
+ EXPECT_TRUE(TestParse(input));
+
+ input = R"(
+ <overlayable policy="system">
+ <item type="string" name="foo" />
+ <item type="dimen" name="foo" />
+ </overlayable>)";
+ ASSERT_TRUE(TestParse(input));
+
+ input = R"(
+ <overlayable>
+ <item type="string" name="bar" />
+ </overlayable>)";
+ ASSERT_TRUE(TestParse(input));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md
index 2645d54..8368f9d 100644
--- a/tools/aapt2/readme.md
+++ b/tools/aapt2/readme.md
@@ -2,6 +2,16 @@
## Version 2.19
- Added navigation resource type.
+- Fixed issue with resource deduplication. (bug 64397629)
+- Added a daemon mode for issuing commands. This is invoked with `aapt2 daemon`.
+ Command line arguments are separated by newlines, with an empty line signalling the
+ end of a command. Sending `EOF (Ctrl+D)` to the daemon will exit.
+- Fixed an issue where multiple permissions defined in AndroidManifest.xml would generate
+ conflicting definitions for the same Java constant in Manifest.java. Changed the implementation
+ to match that of `aapt`, which will take the last definition as the sole definition.
+ A warning is logged if such a scenario occurs. (bug 64472942)
+- Made improvements to handling of paths on Windows. This should resolve a lot of issues with
+ Unicode paths. (bug 62336414, 63830502)
## Version 2.18
### `aapt2 ...`
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 19de3af..32ec7bc 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -236,16 +236,22 @@
attr.name = util::Utf16ToUtf8(StringPiece16(str16, len));
}
+ uint32_t res_id = parser->getAttributeNameResID(i);
+ if (res_id > 0) {
+ attr.compiled_attribute = AaptAttribute(::aapt::Attribute(), {res_id});
+ }
+
str16 = parser->getAttributeStringValue(i, &len);
if (str16) {
attr.value = util::Utf16ToUtf8(StringPiece16(str16, len));
+ } else {
+ android::Res_value res_value;
+ if (parser->getAttributeValue(i, &res_value) > 0) {
+ attr.compiled_value = ResourceUtils::ParseBinaryResValue(
+ ResourceType::kAnim, {}, parser->getStrings(), res_value, out_pool);
+ }
}
- android::Res_value res_value;
- if (parser->getAttributeValue(i, &res_value) > 0) {
- attr.compiled_value = ResourceUtils::ParseBinaryResValue(
- ResourceType::kAnim, {}, parser->getStrings(), res_value, out_pool);
- }
el->attributes.push_back(std::move(attr));
}
diff --git a/tools/bit/Android.bp b/tools/bit/Android.bp
new file mode 100644
index 0000000..258e9b5
--- /dev/null
+++ b/tools/bit/Android.bp
@@ -0,0 +1,40 @@
+//
+// 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.
+//
+
+// ==========================================================
+// Build the host executable: bit
+// ==========================================================
+cc_binary_host {
+ name: "bit",
+
+ srcs: [
+ "aapt.cpp",
+ "adb.cpp",
+ "command.cpp",
+ "main.cpp",
+ "make.cpp",
+ "print.cpp",
+ "util.cpp",
+ ],
+
+ static_libs: [
+ "libexpat",
+ "libinstrumentation",
+ "libjsoncpp",
+ ],
+
+ shared_libs: ["libprotobuf-cpp-full"],
+}
diff --git a/tools/bit/Android.mk b/tools/bit/Android.mk
deleted file mode 100644
index 57f46d4..0000000
--- a/tools/bit/Android.mk
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH:= $(call my-dir)
-
-# ==========================================================
-# Build the host executable: protoc-gen-javastream
-# ==========================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := bit
-
-LOCAL_MODULE_HOST_OS := linux darwin
-
-LOCAL_SRC_FILES := \
- aapt.cpp \
- adb.cpp \
- command.cpp \
- main.cpp \
- make.cpp \
- print.cpp \
- util.cpp
-
-LOCAL_STATIC_LIBRARIES := \
- libexpat \
- libinstrumentation \
- libjsoncpp
-
-LOCAL_SHARED_LIBRARIES := \
- libprotobuf-cpp-full
-
-include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/bit/adb.h b/tools/bit/adb.h
index dca80c8..f0774db 100644
--- a/tools/bit/adb.h
+++ b/tools/bit/adb.h
@@ -17,7 +17,7 @@
#ifndef ADB_H
#define ADB_H
-#include "instrumentation_data.pb.h"
+#include "proto/instrumentation_data.pb.h"
#include <string>
diff --git a/tools/incident_report/Android.bp b/tools/incident_report/Android.bp
new file mode 100644
index 0000000..ab55dbd
--- /dev/null
+++ b/tools/incident_report/Android.bp
@@ -0,0 +1,35 @@
+//
+// 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.
+//
+
+// ==========================================================
+// Build the host executable: incident_report
+// ==========================================================
+cc_binary_host {
+ name: "incident_report",
+
+ srcs: [
+ "generic_message.cpp",
+ "main.cpp",
+ "printer.cpp",
+ ],
+
+ shared_libs: [
+ "libplatformprotos",
+ "libprotobuf-cpp-full",
+ ],
+
+ cflags: ["-Wno-unused-parameter"],
+}
diff --git a/tools/incident_report/Android.mk b/tools/incident_report/Android.mk
deleted file mode 100644
index 9e56e3d..0000000
--- a/tools/incident_report/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH:= $(call my-dir)
-
-# ==========================================================
-# Build the host executable: protoc-gen-javastream
-# ==========================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := incident_report
-
-LOCAL_C_INCLUDES := \
- external/protobuf/src
-
-LOCAL_SRC_FILES := \
- generic_message.cpp \
- main.cpp \
- printer.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libplatformprotos \
- libprotobuf-cpp-full
-
-LOCAL_C_FLAGS := \
- -Wno-unused-parameter
-include $(BUILD_HOST_EXECUTABLE)
-
-
diff --git a/tools/incident_section_gen/Android.bp b/tools/incident_section_gen/Android.bp
new file mode 100644
index 0000000..1756e06
--- /dev/null
+++ b/tools/incident_section_gen/Android.bp
@@ -0,0 +1,31 @@
+//
+// 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.
+//
+
+// ==========================================================
+// Build the host executable: incident-section-gen
+// ==========================================================
+cc_binary_host {
+ name: "incident-section-gen",
+ cflags: [
+ "-g",
+ "-O0",
+ ],
+ srcs: ["main.cpp"],
+ shared_libs: [
+ "libplatformprotos",
+ "libprotobuf-cpp-full",
+ ],
+}
diff --git a/tools/incident_section_gen/Android.mk b/tools/incident_section_gen/Android.mk
deleted file mode 100644
index acf3f83..0000000
--- a/tools/incident_section_gen/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH:= $(call my-dir)
-
-# ==========================================================
-# Build the host executable: protoc-gen-javastream
-# ==========================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := incident-section-gen
-LOCAL_CFLAGS += -g -O0
-LOCAL_C_INCLUDES := \
- external/protobuf/src
-LOCAL_SRC_FILES := \
- main.cpp
-LOCAL_LDFLAGS := -ldl
-LOCAL_SHARED_LIBRARIES := \
- libplatformprotos \
- libprotobuf-cpp-full
-
-include $(BUILD_HOST_EXECUTABLE)
-
diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp
index e76fef5..900690c 100644
--- a/tools/incident_section_gen/main.cpp
+++ b/tools/incident_section_gen/main.cpp
@@ -88,7 +88,7 @@
}
}
-static const char* replaceAll(const string& field_name, const char oldC, const string& newS) {
+static const std::string replaceAll(const string& field_name, const char oldC, const string& newS) {
if (field_name.find_first_of(oldC) == field_name.npos) return field_name.c_str();
size_t pos = 0, idx = 0;
char* res = new char[field_name.size() * newS.size() + 1]; // assign a larger buffer
@@ -104,7 +104,9 @@
}
}
res[idx] = '\0';
- return res;
+ std::string result(res);
+ delete [] res;
+ return result;
}
static inline bool isDefaultDest(const FieldDescriptor* field) {
@@ -118,7 +120,8 @@
for (int i=0; i<descriptor->field_count(); i++) {
hasDefaultFlags[i] = true; // set default to true
const FieldDescriptor* field = descriptor->field(i);
- const char* field_name = replaceAll(field->full_name(), '.', "__");
+ const std::string field_name_str = replaceAll(field->full_name(), '.', "__");
+ const char* field_name = field_name_str.c_str();
// check if the same name is already defined
if (msgNames.find(field_name) != msgNames.end()) {
hasDefaultFlags[i] = msgNames[field_name];
@@ -132,27 +135,24 @@
if (generatePrivacyFlags(field->message_type(), field_name, msgNames) &&
isDefaultDest(field)) break;
- printf("static Privacy %s = { %d, %d, %d, NULL, %s_LIST };\n", field_name, field->number(),
- (int) field->type(), p.dest(), field_name);
+ printf("Privacy %s { %d, %d, %s_LIST, %d, NULL };\n", field_name, field->number(), field->type(), field_name, p.dest());
hasDefaultFlags[i] = false;
break;
case FieldDescriptor::TYPE_STRING:
if (isDefaultDest(field) && p.patterns_size() == 0) break;
- printf("static const char* %s_patterns[] = {\n", field_name);
+ printf("const char* %s_patterns[] = {\n", field_name);
for (int i=0; i<p.patterns_size(); i++) {
// the generated string need to escape backslash as well, need to dup it here
- printf(" \"%s\",\n", replaceAll(p.patterns(i), '\\', "\\\\"));
+ printf(" \"%s\",\n", replaceAll(p.patterns(i), '\\', "\\\\").c_str());
}
printf(" NULL };\n");
- printf("static Privacy %s = { %d, %d, %d, %s_patterns };\n", field_name, field->number(),
- (int) field->type(), p.dest(), field_name);
+ printf("Privacy %s { %d, %d, NULL, %d, %s_patterns };\n", field_name, field->number(), field->type(), p.dest(), field_name);
hasDefaultFlags[i] = false;
break;
default:
if (isDefaultDest(field)) break;
- printf("static Privacy %s = { %d, %d, %d };\n", field_name, field->number(),
- (int) field->type(), p.dest());
+ printf("Privacy %s { %d, %d, NULL, %d, NULL };\n", field_name, field->number(), field->type(), p.dest());
hasDefaultFlags[i] = false;
}
// add the field name to message map, true means it has default flags
@@ -166,13 +166,23 @@
if (allDefaults) return true;
emptyline();
- printf("const Privacy* %s_LIST[] = {\n", alias);
+
+ bool needConst = strcmp(alias, "PRIVACY_POLICY") == 0;
+ int policyCount = 0;
+
+ printf("%s Privacy* %s_LIST[] = {\n", needConst ? "const" : "", alias);
for (int i=0; i<descriptor->field_count(); i++) {
const FieldDescriptor* field = descriptor->field(i);
if (hasDefaultFlags[i]) continue;
- printf(" &%s,\n", replaceAll(field->full_name(), '.', "__"));
+ printf(" &%s,\n", replaceAll(field->full_name(), '.', "__").c_str());
+ policyCount++;
}
- printf(" NULL };\n");
+ if (needConst) {
+ printf("};\n\n");
+ printf("const int PRIVACY_POLICY_COUNT = %d;\n", policyCount);
+ } else {
+ printf(" NULL };\n");
+ }
emptyline();
return false;
}
@@ -210,25 +220,12 @@
printf(" NULL };\n");
emptyline();
- // generates DESTINATION enum values
- EnumDescriptor const* destination = Destination_descriptor();
- for (int i=0; i<destination->value_count(); i++) {
- EnumValueDescriptor const* val = destination->value(i);
- printf("const uint8_t %s = %d;\n", val->name().c_str(), val->number());
- }
- emptyline();
- printf("const uint8_t DEST_DEFAULT_VALUE = %d;\n", PrivacyFlags::default_instance().dest());
- emptyline();
- // populates string type and message type values
- printf("const uint8_t TYPE_STRING = %d;\n", (int) FieldDescriptor::TYPE_STRING);
- printf("const uint8_t TYPE_MESSAGE = %d;\n", (int) FieldDescriptor::TYPE_MESSAGE);
- emptyline();
-
// generates PRIVACY_POLICY
map<string, bool> messageNames;
if (generatePrivacyFlags(descriptor, "PRIVACY_POLICY", messageNames)) {
// if no privacy options set at all, define an empty list
- printf("const Privacy* PRIVACY_POLICY_LIST[] = { NULL };\n");
+ printf("const Privacy* PRIVACY_POLICY_LIST[] = {};\n");
+ printf("const int PRIVACY_POLICY_COUNT = 0;\n");
}
return true;
diff --git a/tools/obbtool/Android.bp b/tools/obbtool/Android.bp
new file mode 100644
index 0000000..f879658
--- /dev/null
+++ b/tools/obbtool/Android.bp
@@ -0,0 +1,51 @@
+//
+// Copyright 2010 The Android Open Source Project
+//
+// Opaque Binary Blob (OBB) Tool
+//
+
+cc_binary_host {
+ name: "obbtool",
+
+ srcs: ["Main.cpp"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-mismatched-tags",
+ ],
+
+ static_libs: [
+ "libandroidfw",
+ "libutils",
+ "libcutils",
+ "liblog",
+ ],
+
+ // This tool is prebuilt if we're doing an app-only build.
+ product_variables: {
+ unbundled_build: {
+ enabled: false,
+ },
+ },
+}
+
+//####################################################
+cc_binary_host {
+ name: "pbkdf2gen",
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-mismatched-tags",
+ ],
+ srcs: ["pbkdf2gen.cpp"],
+ static_libs: ["libcrypto"],
+
+ // This tool is prebuilt if we're doing an app-only build.
+ product_variables: {
+ unbundled_build: {
+ enabled: false,
+ },
+ },
+}
diff --git a/tools/obbtool/Android.mk b/tools/obbtool/Android.mk
deleted file mode 100644
index 6dc306e..0000000
--- a/tools/obbtool/Android.mk
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# Copyright 2010 The Android Open Source Project
-#
-# Opaque Binary Blob (OBB) Tool
-#
-
-# This tool is prebuilt if we're doing an app-only build.
-ifeq ($(TARGET_BUILD_APPS),)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- Main.cpp
-
-LOCAL_CFLAGS := -Wall -Werror -Wno-mismatched-tags
-
-#LOCAL_C_INCLUDES +=
-
-LOCAL_STATIC_LIBRARIES := \
- libandroidfw \
- libutils \
- libcutils \
- liblog
-
-ifeq ($(HOST_OS),linux)
-LOCAL_LDLIBS += -ldl -lpthread
-endif
-
-LOCAL_MODULE := obbtool
-
-include $(BUILD_HOST_EXECUTABLE)
-
-#####################################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := pbkdf2gen
-LOCAL_MODULE_TAGS := optional
-LOCAL_CFLAGS := -Wall -Werror -Wno-mismatched-tags
-LOCAL_SRC_FILES := pbkdf2gen.cpp
-LOCAL_LDLIBS += -ldl
-LOCAL_STATIC_LIBRARIES := libcrypto
-
-include $(BUILD_HOST_EXECUTABLE)
-
-#######################################################
-endif # TARGET_BUILD_APPS
diff --git a/tools/split-select/Android.bp b/tools/split-select/Android.bp
new file mode 100644
index 0000000..ee822b7
--- /dev/null
+++ b/tools/split-select/Android.bp
@@ -0,0 +1,108 @@
+//
+// 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.
+//
+
+// ==========================================================
+// Setup some common variables for the different build
+// targets here.
+// ==========================================================
+
+cc_defaults {
+ name: "split-select_defaults",
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+ include_dirs: ["frameworks/base/tools"],
+ static_libs: [
+ "libaapt",
+ "libandroidfw",
+ "libpng",
+ "libutils",
+ "liblog",
+ "libcutils",
+ "libexpat",
+ "libziparchive",
+ "libbase",
+ "libz",
+ ],
+ group_static_libs: true,
+
+ target: {
+ windows: {
+ enabled: true,
+ },
+ },
+
+ // This tool is prebuilt if we're doing an app-only build.
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ unbundled_build: {
+ enabled: false,
+ },
+ },
+}
+
+// ==========================================================
+// Build the host static library: libsplit-select
+// ==========================================================
+cc_library_host_static {
+ name: "libsplit-select",
+ defaults: ["split-select_defaults"],
+
+ srcs: [
+ "Abi.cpp",
+ "Grouper.cpp",
+ "Rule.cpp",
+ "RuleGenerator.cpp",
+ "SplitDescription.cpp",
+ "SplitSelector.cpp",
+ ],
+ cflags: ["-D_DARWIN_UNLIMITED_STREAMS"],
+
+}
+
+// ==========================================================
+// Build the host tests: libsplit-select_tests
+// ==========================================================
+cc_test_host {
+ name: "libsplit-select_tests",
+ defaults: ["split-select_defaults"],
+
+ srcs: [
+ "Grouper_test.cpp",
+ "Rule_test.cpp",
+ "RuleGenerator_test.cpp",
+ "SplitSelector_test.cpp",
+ "TestRules.cpp",
+ ],
+
+ static_libs: ["libsplit-select"],
+
+}
+
+// ==========================================================
+// Build the host executable: split-select
+// ==========================================================
+cc_binary_host {
+ name: "split-select",
+ defaults: ["split-select_defaults"],
+ srcs: ["Main.cpp"],
+
+ static_libs: ["libsplit-select"],
+}
diff --git a/tools/split-select/Android.mk b/tools/split-select/Android.mk
deleted file mode 100644
index 4a1511e..0000000
--- a/tools/split-select/Android.mk
+++ /dev/null
@@ -1,119 +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.
-#
-
-# This tool is prebuilt if we're doing an app-only build.
-ifeq ($(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)),)
-
-# ==========================================================
-# Setup some common variables for the different build
-# targets here.
-# ==========================================================
-LOCAL_PATH:= $(call my-dir)
-
-main := Main.cpp
-sources := \
- Abi.cpp \
- Grouper.cpp \
- Rule.cpp \
- RuleGenerator.cpp \
- SplitDescription.cpp \
- SplitSelector.cpp
-
-testSources := \
- Grouper_test.cpp \
- Rule_test.cpp \
- RuleGenerator_test.cpp \
- SplitSelector_test.cpp \
- TestRules.cpp
-
-cIncludes := \
- external/zlib \
- frameworks/base/tools
-
-hostStaticLibs := \
- libaapt \
- libandroidfw \
- libpng \
- libutils \
- liblog \
- libcutils \
- libexpat \
- libziparchive \
- libbase
-
-cFlags := -Wall -Werror
-
-hostLdLibs_linux := -lrt -ldl -lpthread
-
-# Statically link libz for MinGW (Win SDK under Linux),
-# and dynamically link for all others.
-hostStaticLibs_windows := libz
-hostLdLibs_darwin := -lz
-hostLdLibs_linux += -lz
-
-
-# ==========================================================
-# Build the host static library: libsplit-select
-# ==========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libsplit-select
-LOCAL_MODULE_HOST_OS := darwin linux windows
-
-LOCAL_SRC_FILES := $(sources)
-LOCAL_STATIC_LIBRARIES := $(hostStaticLibs)
-LOCAL_C_INCLUDES := $(cIncludes)
-LOCAL_CFLAGS := $(cFlags) -D_DARWIN_UNLIMITED_STREAMS
-
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-
-# ==========================================================
-# Build the host tests: libsplit-select_tests
-# ==========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libsplit-select_tests
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(testSources)
-
-LOCAL_C_INCLUDES := $(cIncludes)
-LOCAL_STATIC_LIBRARIES := libsplit-select $(hostStaticLibs)
-LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows)
-LOCAL_LDLIBS_darwin := $(hostLdLibs_darwin)
-LOCAL_LDLIBS_linux := $(hostLdLibs_linux)
-LOCAL_CFLAGS := $(cFlags)
-
-include $(BUILD_HOST_NATIVE_TEST)
-
-# ==========================================================
-# Build the host executable: split-select
-# ==========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := split-select
-LOCAL_MODULE_HOST_OS := darwin linux windows
-
-LOCAL_SRC_FILES := $(main)
-
-LOCAL_C_INCLUDES := $(cIncludes)
-LOCAL_STATIC_LIBRARIES := libsplit-select $(hostStaticLibs)
-LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows)
-LOCAL_LDLIBS_darwin := $(hostLdLibs_darwin)
-LOCAL_LDLIBS_linux := $(hostLdLibs_linux)
-LOCAL_CFLAGS := $(cFlags)
-
-include $(BUILD_HOST_EXECUTABLE)
-
-endif # No TARGET_BUILD_APPS or TARGET_BUILD_PDK
diff --git a/tools/streaming_proto/Android.bp b/tools/streaming_proto/Android.bp
new file mode 100644
index 0000000..24068e9
--- /dev/null
+++ b/tools/streaming_proto/Android.bp
@@ -0,0 +1,29 @@
+//
+// 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.
+//
+
+// ==========================================================
+// Build the host executable: protoc-gen-javastream
+// ==========================================================
+cc_binary_host {
+ name: "protoc-gen-javastream",
+ srcs: [
+ "Errors.cpp",
+ "string_utils.cpp",
+ "main.cpp",
+ ],
+
+ shared_libs: ["libprotoc"],
+}
diff --git a/tools/streaming_proto/Android.mk b/tools/streaming_proto/Android.mk
index 5a54fd1..ebb77a1 100644
--- a/tools/streaming_proto/Android.mk
+++ b/tools/streaming_proto/Android.mk
@@ -16,19 +16,6 @@
LOCAL_PATH:= $(call my-dir)
# ==========================================================
-# Build the host executable: protoc-gen-javastream
-# ==========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := protoc-gen-javastream
-LOCAL_SRC_FILES := \
- Errors.cpp \
- string_utils.cpp \
- main.cpp
-LOCAL_SHARED_LIBRARIES := \
- libprotoc
-include $(BUILD_HOST_EXECUTABLE)
-
-# ==========================================================
# Build the java test
# ==========================================================
include $(CLEAR_VARS)
diff --git a/tools/validatekeymaps/Android.bp b/tools/validatekeymaps/Android.bp
new file mode 100644
index 0000000..6fb278c
--- /dev/null
+++ b/tools/validatekeymaps/Android.bp
@@ -0,0 +1,30 @@
+//
+// Copyright 2010 The Android Open Source Project
+//
+// Keymap validation tool.
+//
+
+cc_binary_host {
+ name: "validatekeymaps",
+
+ srcs: ["Main.cpp"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+ static_libs: [
+ "libinput",
+ "libutils",
+ "libcutils",
+ "liblog",
+ ],
+
+ // This tool is prebuilt if we're doing an app-only build.
+ product_variables: {
+ unbundled_build: {
+ enabled: false,
+ },
+ },
+}
diff --git a/tools/validatekeymaps/Android.mk b/tools/validatekeymaps/Android.mk
deleted file mode 100644
index 9af721d..0000000
--- a/tools/validatekeymaps/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Copyright 2010 The Android Open Source Project
-#
-# Keymap validation tool.
-#
-
-# This tool is prebuilt if we're doing an app-only build.
-ifeq ($(TARGET_BUILD_APPS),)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- Main.cpp
-
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_STATIC_LIBRARIES := \
- libinput \
- libutils \
- libcutils \
- liblog
-
-ifeq ($(HOST_OS),linux)
-LOCAL_LDLIBS += -ldl -lpthread
-endif
-
-LOCAL_MODULE := validatekeymaps
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_HOST_EXECUTABLE)
-
-endif # TARGET_BUILD_APPS