diff options
439 files changed, 10196 insertions, 5916 deletions
diff --git a/apex/extservices/Android.bp b/apex/extservices/Android.bp index 021246cc7404..68350afdac85 100644 --- a/apex/extservices/Android.bp +++ b/apex/extservices/Android.bp @@ -21,6 +21,7 @@ apex { apex_defaults { name: "com.android.extservices-defaults", updatable: true, + min_sdk_version: "R", key: "com.android.extservices.key", certificate: ":com.android.extservices.certificate", apps: ["ExtServices"], diff --git a/apex/permission/Android.bp b/apex/permission/Android.bp index 0171b0d76760..71a52bb216ea 100644 --- a/apex/permission/Android.bp +++ b/apex/permission/Android.bp @@ -21,6 +21,7 @@ apex { apex_defaults { name: "com.android.permission-defaults", updatable: true, + min_sdk_version: "R", key: "com.android.permission.key", certificate: ":com.android.permission.certificate", java_libs: [ diff --git a/apex/sdkextensions/Android.bp b/apex/sdkextensions/Android.bp index 322d5e114541..fc26e0833b1a 100644 --- a/apex/sdkextensions/Android.bp +++ b/apex/sdkextensions/Android.bp @@ -27,6 +27,7 @@ apex { apex_defaults { name: "com.android.sdkext-defaults", updatable: true, + min_sdk_version: "R", java_libs: [ "framework-sdkextensions" ], prebuilts: [ "derive_sdk.rc", diff --git a/apex/statsd/Android.bp b/apex/statsd/Android.bp index 2df3eea1494d..32e13e31eebe 100644 --- a/apex/statsd/Android.bp +++ b/apex/statsd/Android.bp @@ -33,6 +33,7 @@ apex_defaults { prebuilts: ["com.android.os.statsd.init.rc"], name: "com.android.os.statsd-defaults", updatable: true, + min_sdk_version: "R", key: "com.android.os.statsd.key", certificate: ":com.android.os.statsd.certificate", } diff --git a/api/test-current.txt b/api/test-current.txt index 4eeaaf87ea0d..03f4dc5d2f87 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3522,6 +3522,32 @@ package android.service.textclassifier { } +package android.service.watchdog { + + public abstract class ExplicitHealthCheckService extends android.app.Service { + ctor public ExplicitHealthCheckService(); + method public final void notifyHealthCheckPassed(@NonNull String); + method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); + method public abstract void onCancelHealthCheck(@NonNull String); + method @NonNull public abstract java.util.List<java.lang.String> onGetRequestedPackages(); + method @NonNull public abstract java.util.List<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> onGetSupportedPackages(); + method public abstract void onRequestHealthCheck(@NonNull String); + method public void setCallback(@Nullable android.os.RemoteCallback); + field public static final String BIND_PERMISSION = "android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE"; + field public static final String SERVICE_INTERFACE = "android.service.watchdog.ExplicitHealthCheckService"; + } + + public static final class ExplicitHealthCheckService.PackageConfig implements android.os.Parcelable { + ctor public ExplicitHealthCheckService.PackageConfig(@NonNull String, long); + method public int describeContents(); + method public long getHealthCheckTimeoutMillis(); + method @NonNull public String getPackageName(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> CREATOR; + } + +} + package android.telecom { public final class Call { diff --git a/cmds/statsd/benchmark/metric_util.cpp b/cmds/statsd/benchmark/metric_util.cpp index 4bce89fd7f9c..482d66fc7556 100644 --- a/cmds/statsd/benchmark/metric_util.cpp +++ b/cmds/statsd/benchmark/metric_util.cpp @@ -370,13 +370,6 @@ sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const Stat return processor; } -AttributionNodeInternal CreateAttribution(const int& uid, const string& tag) { - AttributionNodeInternal attribution; - attribution.set_uid(uid); - attribution.set_tag(tag); - return attribution; -} - void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) { std::sort(events->begin(), events->end(), [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) { diff --git a/cmds/statsd/benchmark/metric_util.h b/cmds/statsd/benchmark/metric_util.h index 6199fa9dc7a1..c5fcf7c27440 100644 --- a/cmds/statsd/benchmark/metric_util.h +++ b/cmds/statsd/benchmark/metric_util.h @@ -120,9 +120,6 @@ std::unique_ptr<LogEvent> CreateSyncEndEvent(uint64_t timestampNs, const vector<string>& attributionTags, const string& name); -// Helper function to create an AttributionNodeInternal proto. -AttributionNodeInternal CreateAttribution(const int& uid, const string& tag); - // Create a statsd log event processor upon the start time in seconds, config and key. sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config, const ConfigKey& key); diff --git a/cmds/statsd/src/annotations.h b/cmds/statsd/src/annotations.h index 1e9390e49ae1..cf7f5433663f 100644 --- a/cmds/statsd/src/annotations.h +++ b/cmds/statsd/src/annotations.h @@ -22,13 +22,11 @@ namespace statsd { const uint8_t ANNOTATION_ID_IS_UID = 1; const uint8_t ANNOTATION_ID_TRUNCATE_TIMESTAMP = 2; -const uint8_t ANNOTATION_ID_STATE_OPTION = 3; -const uint8_t ANNOTATION_ID_RESET_STATE = 5; -const uint8_t ANNOTATION_ID_STATE_NESTED = 6; - -const int32_t STATE_OPTION_PRIMARY_FIELD = 1; -const int32_t STATE_OPTION_EXCLUSIVE_STATE = 2; -const int32_t STATE_OPTION_PRIMARY_FIELD_FIRST_UID = 3; +const uint8_t ANNOTATION_ID_PRIMARY_FIELD = 3; +const uint8_t ANNOTATION_ID_EXCLUSIVE_STATE = 4; +const uint8_t ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID = 5; +const uint8_t ANNOTATION_ID_TRIGGER_STATE_RESET = 7; +const uint8_t ANNOTATION_ID_STATE_NESTED = 8; } // namespace statsd } // namespace os diff --git a/cmds/statsd/src/atom_field_options.proto b/cmds/statsd/src/atom_field_options.proto index afee79d7506b..8527185d3891 100644 --- a/cmds/statsd/src/atom_field_options.proto +++ b/cmds/statsd/src/atom_field_options.proto @@ -23,25 +23,12 @@ option java_outer_classname = "AtomFieldOptions"; import "google/protobuf/descriptor.proto"; -enum StateField { - // Default value for fields that are not a primary or exclusive state field. - STATE_FIELD_UNSET = 0; - // Fields that represent the key that the state belongs to. - // Used on simple proto fields. Do not use on attribution chains. - PRIMARY_FIELD = 1; - // The field that represents the state. It's an exclusive state. - EXCLUSIVE_STATE = 2; - // Used on an attribution chain field to indicate that the first uid is the - // primary field. - PRIMARY_FIELD_FIRST_UID = 3; -} - // Used to annotate an atom that represents a state change. A state change atom must have exactly // ONE exclusive state field, and any number of primary key fields. For example, message // UidProcessStateChanged { -// optional int32 uid = 1 [(state_field_option).option = PRIMARY_FIELD]; -// optional android.app.ProcessStateEnum state = 2 [(state_field_option).option = -// EXCLUSIVE_STATE]; +// optional int32 uid = 1 [(state_field_option).primary_field = true]; +// optional android.app.ProcessStateEnum state = +// 2 [(state_field_option).exclusive_state = true]; // } // Each UidProcessStateChanged atom event represents a state change for a specific uid. // A new state automatically overrides the previous state. @@ -50,23 +37,23 @@ enum StateField { // primary fields are the primary key. // For example: // message ThreadStateChanged { -// optional int32 pid = 1 [(state_field_option).option = PRIMARY_FIELD]; -// optional int32 tid = 2 [(state_field_option).option = PRIMARY_FIELD]; -// optional int32 state = 3 [(state_field_option).option = EXCLUSIVE_STATE]; +// optional int32 pid = 1 [(state_field_option).primary_field = true]; +// optional int32 tid = 2 [(state_field_option).primary_field = true]; +// optional int32 state = 3 [(state_field_option).exclusive_state = true]; // } // // Sometimes, there is no primary key field, when the state is GLOBAL. // For example, // message ScreenStateChanged { -// optional android.view.DisplayStateEnum state = 1 [(state_field_option).option = -// EXCLUSIVE_STATE]; +// optional android.view.DisplayStateEnum state = +// 1 [(state_field_option).exclusive_state = true]; // } // // For state atoms with attribution chain, sometimes the primary key is the first uid in the chain. // For example: // message AudioStateChanged { // repeated AttributionNode attribution_node = 1 -// [(stateFieldOption).option = PRIMARY_KEY_FIRST_UID]; +// [(stateFieldOption).primary_field_first_uid = true]; // // enum State { // OFF = 0; @@ -74,10 +61,19 @@ enum StateField { // // RESET indicates all audio stopped. Used when it (re)starts (e.g. after it crashes). // RESET = 2; // } -// optional State state = 2 [(stateFieldOption).option = EXCLUSIVE_STATE]; +// optional State state = 2 [(stateFieldOption).exclusive_state = true]; // } message StateAtomFieldOption { - optional StateField option = 1 [default = STATE_FIELD_UNSET]; + // Fields that represent the key that the state belongs to. + // Used on simple proto fields. Do not use on attribution chains. + optional bool primary_field = 1 [default = false]; + + // The field that represents the state. It's an exclusive state. + optional bool exclusive_state = 2 [default = false]; + + // Used on an attribution chain field to indicate that the first uid is the + // primary field. + optional bool primary_field_first_uid = 3 [default = false]; // Note: We cannot annotate directly on the enums because many enums are imported from other // proto files in the platform. proto-lite cc library does not support annotations unfortunately @@ -85,14 +81,14 @@ message StateAtomFieldOption { // Knowing the default state value allows state trackers to remove entries that become the // default state. If there is no default value specified, the default value is unknown, and all // states will be tracked in memory. - optional int32 default_state_value = 2; + optional int32 default_state_value = 4; // A reset state signals all states go to default value. For example, BLE reset means all active // BLE scans are to be turned off. - optional int32 reset_state_value = 3; + optional int32 trigger_state_reset_value = 5; // If the state change needs to count nesting. - optional bool nested = 4 [default = true]; + optional bool nested = 6 [default = true]; } // Used to generate StatsLog.write APIs. diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 5cd00c35b05c..bd15264c008f 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -610,7 +610,7 @@ message ThermalThrottlingStateChanged { message ScreenStateChanged { // New screen state, from frameworks/base/core/proto/android/view/enums.proto. optional android.view.DisplayStateEnum state = 1 - [(state_field_option).option = EXCLUSIVE_STATE, (state_field_option).nested = false]; + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } /** @@ -621,11 +621,11 @@ message ScreenStateChanged { * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java */ message UidProcessStateChanged { - optional int32 uid = 1 [(state_field_option).option = PRIMARY_FIELD, (is_uid) = true]; + optional int32 uid = 1 [(state_field_option).primary_field = true, (is_uid) = true]; // The state, from frameworks/base/core/proto/android/app/enums.proto. optional android.app.ProcessStateEnum state = 2 - [(state_field_option).option = EXCLUSIVE_STATE, (state_field_option).nested = false]; + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } /** @@ -657,7 +657,7 @@ message ActivityManagerSleepStateChanged { ASLEEP = 1; AWAKE = 2; } - optional State state = 1 [(state_field_option).option = EXCLUSIVE_STATE]; + optional State state = 1 [(state_field_option).exclusive_state = true]; } /** @@ -676,7 +676,7 @@ message MemoryFactorStateChanged { CRITICAL = 4; // critical memory. } - optional State factor = 1 [(state_field_option).option = EXCLUSIVE_STATE]; + optional State factor = 1 [(state_field_option).exclusive_state = true]; } /** @@ -854,7 +854,7 @@ message ProcessLifeCycleStateChanged { */ message BleScanStateChanged { repeated AttributionNode attribution_node = 1 - [(state_field_option).option = PRIMARY_FIELD_FIRST_UID]; + [(state_field_option).primary_field_first_uid = true]; enum State { OFF = 0; @@ -863,18 +863,18 @@ message BleScanStateChanged { RESET = 2; } optional State state = 2 [ - (state_field_option).option = EXCLUSIVE_STATE, + (state_field_option).exclusive_state = true, (state_field_option).default_state_value = 0 /* State.OFF */, - (state_field_option).reset_state_value = 2 /* State.RESET */, + (state_field_option).trigger_state_reset_value = 2 /* State.RESET */, (state_field_option).nested = true ]; // Does the scan have a filter. - optional bool is_filtered = 3 [(state_field_option).option = PRIMARY_FIELD]; + optional bool is_filtered = 3 [(state_field_option).primary_field = true]; // Whether the scan is a CALLBACK_TYPE_FIRST_MATCH scan. Called 'background' scan internally. - optional bool is_first_match = 4 [(state_field_option).option = PRIMARY_FIELD]; + optional bool is_first_match = 4 [(state_field_option).primary_field = true]; // Whether the scan set to piggy-back off the results of other scans (SCAN_MODE_OPPORTUNISTIC). - optional bool is_opportunistic = 5 [(state_field_option).option = PRIMARY_FIELD]; + optional bool is_opportunistic = 5 [(state_field_option).primary_field = true]; } /** @@ -1105,15 +1105,14 @@ message CameraStateChanged { */ message WakelockStateChanged { repeated AttributionNode attribution_node = 1 - [(state_field_option).option = PRIMARY_FIELD_FIRST_UID]; + [(state_field_option).primary_field_first_uid = true]; // The type (level) of the wakelock; e.g. a partial wakelock or a full wakelock. // From frameworks/base/core/proto/android/os/enums.proto. - optional android.os.WakeLockLevelEnum type = 2 [(state_field_option).option = PRIMARY_FIELD]; - ; + optional android.os.WakeLockLevelEnum type = 2 [(state_field_option).primary_field = true]; // The wakelock tag (Called tag in the Java API, sometimes name elsewhere). - optional string tag = 3 [(state_field_option).option = PRIMARY_FIELD]; + optional string tag = 3 [(state_field_option).primary_field = true]; enum State { RELEASE = 0; @@ -1122,7 +1121,7 @@ message WakelockStateChanged { CHANGE_ACQUIRE = 3; } optional State state = 4 [ - (state_field_option).option = EXCLUSIVE_STATE, + (state_field_option).exclusive_state = true, (state_field_option).default_state_value = 0, (state_field_option).nested = true ]; @@ -3494,9 +3493,9 @@ message PictureInPictureStateChanged { * services/core/java/com/android/server/wm/Session.java */ message OverlayStateChanged { - optional int32 uid = 1 [(state_field_option).option = PRIMARY_FIELD, (is_uid) = true]; + optional int32 uid = 1 [(state_field_option).primary_field = true, (is_uid) = true]; - optional string package_name = 2 [(state_field_option).option = PRIMARY_FIELD]; + optional string package_name = 2 [(state_field_option).primary_field = true]; optional bool using_alert_window = 3; @@ -3505,7 +3504,7 @@ message OverlayStateChanged { EXITED = 2; } optional State state = 4 [ - (state_field_option).option = EXCLUSIVE_STATE, + (state_field_option).exclusive_state = true, (state_field_option).nested = false, (state_field_option).default_state_value = 2 ]; @@ -3713,7 +3712,7 @@ message LmkKillOccurred { */ message AppDied { // timestamp(elapsedRealtime) of record creation - optional uint64 timestamp_millis = 1 [(state_field_option).option = EXCLUSIVE_STATE]; + optional uint64 timestamp_millis = 1 [(state_field_option).exclusive_state = true]; } /** @@ -4235,7 +4234,7 @@ message PrivacyIndicatorsInteracted { DIALOG_LINE_ITEM = 5; } - optional Type type = 1 [(state_field_option).option = EXCLUSIVE_STATE]; + optional Type type = 1 [(state_field_option).exclusive_state = true]; // Used if the type is LINE_ITEM optional string package_name = 2; @@ -8698,13 +8697,12 @@ message RuntimeAppOpAccess { // Name of the package accessing app op optional string package_name = 2; - // operation string id per OPSTR_ constants in AppOpsManager.java - optional string op = 3; + // deprecated - set to empty string + optional string op_deprecated = 3 [deprecated = true]; // attribution_tag; provided by developer when accessing related API, limited at 50 chars by - // API. - // Attributions must be provided through manifest using <attribution> tag available in R and - // above. + // API. Attributions must be provided through manifest using <attribution> tag available in R + // and above. optional string attribution_tag = 4; // message related to app op access, limited to 600 chars by API @@ -8719,6 +8717,9 @@ message RuntimeAppOpAccess { // sampling strategy used to collect this message optional SamplingStrategy sampling_strategy = 6; + + // operation id + optional android.app.AppOpEnum op = 7 [default = APP_OP_NONE]; } /* diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp index a6ae3899e4de..96bf04f4f6d6 100644 --- a/cmds/statsd/src/logd/LogEvent.cpp +++ b/cmds/statsd/src/logd/LogEvent.cpp @@ -17,14 +17,14 @@ #define DEBUG false // STOPSHIP if true #include "logd/LogEvent.h" +#include <android-base/stringprintf.h> +#include <android/binder_ibinder.h> +#include <private/android_filesystem_config.h> + #include "annotations.h" #include "stats_log_util.h" #include "statslog_statsd.h" -#include <android/binder_ibinder.h> -#include <android-base/stringprintf.h> -#include <private/android_filesystem_config.h> - namespace android { namespace os { namespace statsd { @@ -76,77 +76,7 @@ LogEvent::LogEvent(const LogEvent& event) { } LogEvent::LogEvent(int32_t uid, int32_t pid) - : mLogdTimestampNs(time(nullptr)), - mLogUid(uid), - mLogPid(pid) { -} - -LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs) { - mLogdTimestampNs = wallClockTimestampNs; - mElapsedTimestampNs = elapsedTimestampNs; - mTagId = tagId; - mLogUid = 0; - mContext = create_android_logger(1937006964); // the event tag shared by all stats logs - if (mContext) { - android_log_write_int64(mContext, elapsedTimestampNs); - android_log_write_int32(mContext, tagId); - } -} - -LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, - int32_t uid, - const std::map<int32_t, int32_t>& int_map, - const std::map<int32_t, int64_t>& long_map, - const std::map<int32_t, std::string>& string_map, - const std::map<int32_t, float>& float_map) { - mLogdTimestampNs = wallClockTimestampNs; - mElapsedTimestampNs = elapsedTimestampNs; - mTagId = util::KEY_VALUE_PAIRS_ATOM; - mLogUid = uid; - - int pos[] = {1, 1, 1}; - - mValues.push_back(FieldValue(Field(mTagId, pos, 0 /* depth */), Value(uid))); - pos[0]++; - for (const auto&itr : int_map) { - pos[2] = 1; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.first))); - pos[2] = 2; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.second))); - mValues.back().mField.decorateLastPos(2); - pos[1]++; - } - - for (const auto&itr : long_map) { - pos[2] = 1; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.first))); - pos[2] = 3; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.second))); - mValues.back().mField.decorateLastPos(2); - pos[1]++; - } - - for (const auto&itr : string_map) { - pos[2] = 1; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.first))); - pos[2] = 4; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.second))); - mValues.back().mField.decorateLastPos(2); - pos[1]++; - } - - for (const auto&itr : float_map) { - pos[2] = 1; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.first))); - pos[2] = 5; - mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.second))); - mValues.back().mField.decorateLastPos(2); - pos[1]++; - } - if (!mValues.empty()) { - mValues.back().mField.decorateLastPos(1); - mValues.at(mValues.size() - 2).mField.decorateLastPos(1); - } + : mLogdTimestampNs(time(nullptr)), mLogUid(uid), mLogPid(pid) { } LogEvent::LogEvent(const string& trainName, int64_t trainVersionCode, bool requiresStaging, @@ -184,17 +114,6 @@ LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)), Value(trainInfo.status))); } -LogEvent::LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid) { - mLogdTimestampNs = timestampNs; - mTagId = tagId; - mLogUid = uid; - mContext = create_android_logger(1937006964); // the event tag shared by all stats logs - if (mContext) { - android_log_write_int64(mContext, timestampNs); - android_log_write_int32(mContext, tagId); - } -} - LogEvent::~LogEvent() { if (mContext) { // This is for the case when LogEvent is created using the test interface @@ -203,154 +122,6 @@ LogEvent::~LogEvent() { } } -bool LogEvent::write(int32_t value) { - if (mContext) { - return android_log_write_int32(mContext, value) >= 0; - } - return false; -} - -bool LogEvent::write(uint32_t value) { - if (mContext) { - return android_log_write_int32(mContext, value) >= 0; - } - return false; -} - -bool LogEvent::write(int64_t value) { - if (mContext) { - return android_log_write_int64(mContext, value) >= 0; - } - return false; -} - -bool LogEvent::write(uint64_t value) { - if (mContext) { - return android_log_write_int64(mContext, value) >= 0; - } - return false; -} - -bool LogEvent::write(const string& value) { - if (mContext) { - return android_log_write_string8_len(mContext, value.c_str(), value.length()) >= 0; - } - return false; -} - -bool LogEvent::write(float value) { - if (mContext) { - return android_log_write_float32(mContext, value) >= 0; - } - return false; -} - -bool LogEvent::writeBytes(const string& value) { - /* if (mContext) { - return android_log_write_char_array(mContext, value.c_str(), value.length()) >= 0; - }*/ - return false; -} - -bool LogEvent::writeKeyValuePairs(int32_t uid, - const std::map<int32_t, int32_t>& int_map, - const std::map<int32_t, int64_t>& long_map, - const std::map<int32_t, std::string>& string_map, - const std::map<int32_t, float>& float_map) { - if (mContext) { - if (android_log_write_list_begin(mContext) < 0) { - return false; - } - write(uid); - for (const auto& itr : int_map) { - if (android_log_write_list_begin(mContext) < 0) { - return false; - } - write(itr.first); - write(itr.second); - if (android_log_write_list_end(mContext) < 0) { - return false; - } - } - - for (const auto& itr : long_map) { - if (android_log_write_list_begin(mContext) < 0) { - return false; - } - write(itr.first); - write(itr.second); - if (android_log_write_list_end(mContext) < 0) { - return false; - } - } - - for (const auto& itr : string_map) { - if (android_log_write_list_begin(mContext) < 0) { - return false; - } - write(itr.first); - write(itr.second.c_str()); - if (android_log_write_list_end(mContext) < 0) { - return false; - } - } - - for (const auto& itr : float_map) { - if (android_log_write_list_begin(mContext) < 0) { - return false; - } - write(itr.first); - write(itr.second); - if (android_log_write_list_end(mContext) < 0) { - return false; - } - } - - if (android_log_write_list_end(mContext) < 0) { - return false; - } - return true; - } - return false; -} - -bool LogEvent::write(const std::vector<AttributionNodeInternal>& nodes) { - if (mContext) { - if (android_log_write_list_begin(mContext) < 0) { - return false; - } - for (size_t i = 0; i < nodes.size(); ++i) { - if (!write(nodes[i])) { - return false; - } - } - if (android_log_write_list_end(mContext) < 0) { - return false; - } - return true; - } - return false; -} - -bool LogEvent::write(const AttributionNodeInternal& node) { - if (mContext) { - if (android_log_write_list_begin(mContext) < 0) { - return false; - } - if (android_log_write_int32(mContext, node.uid()) < 0) { - return false; - } - if (android_log_write_string8(mContext, node.tag().c_str()) < 0) { - return false; - } - if (android_log_write_list_end(mContext) < 0) { - return false; - } - return true; - } - return false; -} - void LogEvent::parseInt32(int32_t* pos, int32_t depth, bool* last, uint8_t numAnnotations) { int32_t value = readNextValue<int32_t>(); addToValues(pos, depth, value, last); @@ -420,7 +191,7 @@ void LogEvent::parseKeyValuePairs(int32_t* pos, int32_t depth, bool* last, uint8 uint8_t typeInfo = readNextValue<uint8_t>(); switch (getTypeId(typeInfo)) { case INT32_TYPE: - pos[2] = 2; // pos[2] determined by index of type in KeyValuePair in atoms.proto + pos[2] = 2; // pos[2] determined by index of type in KeyValuePair in atoms.proto parseInt32(pos, /*depth=*/2, last, /*numAnnotations=*/0); break; case INT64_TYPE: @@ -488,33 +259,38 @@ void LogEvent::parseTruncateTimestampAnnotation(uint8_t annotationType) { mTruncateTimestamp = readNextValue<uint8_t>(); } -void LogEvent::parseStateOptionAnnotation(uint8_t annotationType, int firstUidInChainIndex) { - if (mValues.empty() || annotationType != INT32_TYPE) { +void LogEvent::parsePrimaryFieldAnnotation(uint8_t annotationType) { + if (mValues.empty() || annotationType != BOOL_TYPE) { mValid = false; return; } - int32_t stateOption = readNextValue<int32_t>(); - switch (stateOption) { - case STATE_OPTION_EXCLUSIVE_STATE: - mValues[mValues.size() - 1].mAnnotations.setExclusiveState(true); - break; - case STATE_OPTION_PRIMARY_FIELD: - mValues[mValues.size() - 1].mAnnotations.setPrimaryField(true); - break; - case STATE_OPTION_PRIMARY_FIELD_FIRST_UID: - if (firstUidInChainIndex == -1) { - mValid = false; - } else { - mValues[firstUidInChainIndex].mAnnotations.setPrimaryField(true); - } - break; - default: - mValid = false; + const bool primaryField = readNextValue<uint8_t>(); + mValues[mValues.size() - 1].mAnnotations.setPrimaryField(primaryField); +} + +void LogEvent::parsePrimaryFieldFirstUidAnnotation(uint8_t annotationType, + int firstUidInChainIndex) { + if (mValues.empty() || annotationType != BOOL_TYPE || -1 == firstUidInChainIndex) { + mValid = false; + return; + } + + const bool primaryField = readNextValue<uint8_t>(); + mValues[firstUidInChainIndex].mAnnotations.setPrimaryField(primaryField); +} + +void LogEvent::parseExclusiveStateAnnotation(uint8_t annotationType) { + if (mValues.empty() || annotationType != BOOL_TYPE) { + mValid = false; + return; } + + const bool exclusiveState = readNextValue<uint8_t>(); + mValues[mValues.size() - 1].mAnnotations.setExclusiveState(exclusiveState); } -void LogEvent::parseResetStateAnnotation(uint8_t annotationType) { +void LogEvent::parseTriggerStateResetAnnotation(uint8_t annotationType) { if (mValues.empty() || annotationType != INT32_TYPE) { mValid = false; return; @@ -548,11 +324,17 @@ void LogEvent::parseAnnotations(uint8_t numAnnotations, int firstUidInChainIndex case ANNOTATION_ID_TRUNCATE_TIMESTAMP: parseTruncateTimestampAnnotation(annotationType); break; - case ANNOTATION_ID_STATE_OPTION: - parseStateOptionAnnotation(annotationType, firstUidInChainIndex); + case ANNOTATION_ID_PRIMARY_FIELD: + parsePrimaryFieldAnnotation(annotationType); + break; + case ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID: + parsePrimaryFieldFirstUidAnnotation(annotationType, firstUidInChainIndex); + break; + case ANNOTATION_ID_EXCLUSIVE_STATE: + parseExclusiveStateAnnotation(annotationType); break; - case ANNOTATION_ID_RESET_STATE: - parseResetStateAnnotation(annotationType); + case ANNOTATION_ID_TRIGGER_STATE_RESET: + parseTriggerStateResetAnnotation(annotationType); break; case ANNOTATION_ID_STATE_NESTED: parseStateNestedAnnotation(annotationType); @@ -589,8 +371,7 @@ bool LogEvent::parseBuffer(uint8_t* buf, size_t len) { if (getTypeId(typeInfo) != INT32_TYPE) mValid = false; mTagId = readNextValue<int32_t>(); numElements--; - parseAnnotations(getNumAnnotations(typeInfo)); // atom-level annotations - + parseAnnotations(getNumAnnotations(typeInfo)); // atom-level annotations for (pos[0] = 1; pos[0] <= numElements && mValid; pos[0]++) { last[0] = (pos[0] == numElements); @@ -599,7 +380,7 @@ bool LogEvent::parseBuffer(uint8_t* buf, size_t len) { uint8_t typeId = getTypeId(typeInfo); // TODO(b/144373276): handle errors passed to the socket - switch(typeId) { + switch (typeId) { case BOOL_TYPE: parseBool(pos, /*depth=*/0, last, getNumAnnotations(typeInfo)); break; @@ -636,11 +417,11 @@ bool LogEvent::parseBuffer(uint8_t* buf, size_t len) { } uint8_t LogEvent::getTypeId(uint8_t typeInfo) { - return typeInfo & 0x0F; // type id in lower 4 bytes + return typeInfo & 0x0F; // type id in lower 4 bytes } uint8_t LogEvent::getNumAnnotations(uint8_t typeInfo) { - return (typeInfo >> 4) & 0x0F; // num annotations in upper 4 bytes + return (typeInfo >> 4) & 0x0F; // num annotations in upper 4 bytes } int64_t LogEvent::GetLong(size_t key, status_t* err) const { @@ -751,17 +532,17 @@ float LogEvent::GetFloat(size_t key, status_t* err) const { std::vector<uint8_t> LogEvent::GetStorage(size_t key, status_t* err) const { int field = getSimpleField(key); for (const auto& value : mValues) { - if (value.mField.getField() == field) { - if (value.mValue.getType() == STORAGE) { - return value.mValue.storage_value; - } else { - *err = BAD_TYPE; - return vector<uint8_t>(); + if (value.mField.getField() == field) { + if (value.mValue.getType() == STORAGE) { + return value.mValue.storage_value; + } else { + *err = BAD_TYPE; + return vector<uint8_t>(); + } + } + if ((size_t)value.mField.getPosAtDepth(0) > key) { + break; } - } - if ((size_t)value.mField.getPosAtDepth(0) > key) { - break; - } } *err = BAD_INDEX; diff --git a/cmds/statsd/src/logd/LogEvent.h b/cmds/statsd/src/logd/LogEvent.h index 0a89be4ce335..850e2b010f8c 100644 --- a/cmds/statsd/src/logd/LogEvent.h +++ b/cmds/statsd/src/logd/LogEvent.h @@ -28,27 +28,6 @@ namespace android { namespace os { namespace statsd { -struct AttributionNodeInternal { - void set_uid(int32_t id) { - mUid = id; - } - - void set_tag(const std::string& value) { - mTag = value; - } - - int32_t uid() const { - return mUid; - } - - const std::string& tag() const { - return mTag; - } - - int32_t mUid; - std::string mTag; -}; - struct InstallTrainInfo { int64_t trainVersionCode; std::string trainName; @@ -83,28 +62,6 @@ public: */ bool parseBuffer(uint8_t* buf, size_t len); - // TODO(b/149590301): delete unused functions below once LogEvent uses the - // new socket schema within test code. Really we would like the only entry - // points into LogEvent to be the above constructor and parseBuffer functions. - - /** - * Constructs a LogEvent with synthetic data for testing. Must call init() before reading. - */ - explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs); - - // For testing. The timestamp is used as both elapsed real time and logd timestamp. - explicit LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid); - - /** - * Constructs a KeyValuePairsAtom LogEvent from value maps. - */ - explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, - int32_t uid, - const std::map<int32_t, int32_t>& int_map, - const std::map<int32_t, int64_t>& long_map, - const std::map<int32_t, std::string>& string_map, - const std::map<int32_t, float>& float_map); - // Constructs a BinaryPushStateChanged LogEvent from API call. explicit LogEvent(const std::string& trainName, int64_t trainVersionCode, bool requiresStaging, bool rollbackEnabled, bool requiresLowLatencyMonitor, int32_t state, @@ -152,25 +109,6 @@ public: std::vector<uint8_t> GetStorage(size_t key, status_t* err) const; /** - * Write test data to the LogEvent. This can only be used when the LogEvent is constructed - * using LogEvent(tagId, timestampNs). You need to call init() before you can read from it. - */ - bool write(uint32_t value); - bool write(int32_t value); - bool write(uint64_t value); - bool write(int64_t value); - bool write(const std::string& value); - bool write(float value); - bool write(const std::vector<AttributionNodeInternal>& nodes); - bool write(const AttributionNodeInternal& node); - bool writeBytes(const std::string& value); - bool writeKeyValuePairs(int32_t uid, - const std::map<int32_t, int32_t>& int_map, - const std::map<int32_t, int64_t>& long_map, - const std::map<int32_t, std::string>& string_map, - const std::map<int32_t, float>& float_map); - - /** * Return a string representation of this event. */ std::string ToString() const; @@ -270,8 +208,10 @@ private: void parseAnnotations(uint8_t numAnnotations, int firstUidInChainIndex = -1); void parseIsUidAnnotation(uint8_t annotationType); void parseTruncateTimestampAnnotation(uint8_t annotationType); - void parseStateOptionAnnotation(uint8_t annotationType, int firstUidInChainIndex); - void parseResetStateAnnotation(uint8_t annotationType); + void parsePrimaryFieldAnnotation(uint8_t annotationType); + void parsePrimaryFieldFirstUidAnnotation(uint8_t annotationType, int firstUidInChainIndex); + void parseExclusiveStateAnnotation(uint8_t annotationType); + void parseTriggerStateResetAnnotation(uint8_t annotationType); void parseStateNestedAnnotation(uint8_t annotationType); /** diff --git a/cmds/statsd/tests/LogEvent_test.cpp b/cmds/statsd/tests/LogEvent_test.cpp index 41e21e4afb37..bb4578d9b701 100644 --- a/cmds/statsd/tests/LogEvent_test.cpp +++ b/cmds/statsd/tests/LogEvent_test.cpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "src/logd/LogEvent.h" + #include <gtest/gtest.h> #include "frameworks/base/cmds/statsd/src/atoms.pb.h" #include "frameworks/base/core/proto/android/stats/launcher/launcher.pb.h" #include "log/log_event_list.h" -#include "src/logd/LogEvent.h" #include "stats_event.h" - #ifdef __ANDROID__ namespace android { @@ -32,6 +32,8 @@ using std::vector; using util::ProtoOutputStream; using util::ProtoReader; +namespace { + Field getField(int32_t tag, const vector<int32_t>& pos, int32_t depth, const vector<bool>& last) { Field f(tag, (int32_t*)pos.data(), depth); @@ -43,6 +45,38 @@ Field getField(int32_t tag, const vector<int32_t>& pos, int32_t depth, const vec return f; } +void createIntWithBoolAnnotationLogEvent(LogEvent* logEvent, uint8_t annotationId, + bool annotationValue) { + AStatsEvent* statsEvent = AStatsEvent_obtain(); + AStatsEvent_setAtomId(statsEvent, /*atomId=*/100); + AStatsEvent_writeInt32(statsEvent, 10); + AStatsEvent_addBoolAnnotation(statsEvent, annotationId, annotationValue); + AStatsEvent_build(statsEvent); + + size_t size; + uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size); + EXPECT_TRUE(logEvent->parseBuffer(buf, size)); + + AStatsEvent_release(statsEvent); +} + +void createIntWithIntAnnotationLogEvent(LogEvent* logEvent, uint8_t annotationId, + int annotationValue) { + AStatsEvent* statsEvent = AStatsEvent_obtain(); + AStatsEvent_setAtomId(statsEvent, /*atomId=*/100); + AStatsEvent_writeInt32(statsEvent, 10); + AStatsEvent_addInt32Annotation(statsEvent, annotationId, annotationValue); + AStatsEvent_build(statsEvent); + + size_t size; + uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size); + EXPECT_TRUE(logEvent->parseBuffer(buf, size)); + + AStatsEvent_release(statsEvent); +} + +} // anonymous namespace + TEST(LogEventTest, TestPrimitiveParsing) { AStatsEvent* event = AStatsEvent_obtain(); AStatsEvent_setAtomId(event, 100); @@ -86,13 +120,12 @@ TEST(LogEventTest, TestPrimitiveParsing) { const FieldValue& boolItem = values[3]; expectedField = getField(100, {4, 1, 1}, 0, {true, false, false}); EXPECT_EQ(expectedField, boolItem.mField); - EXPECT_EQ(Type::INT, boolItem.mValue.getType()); // FieldValue does not support boolean type + EXPECT_EQ(Type::INT, boolItem.mValue.getType()); // FieldValue does not support boolean type EXPECT_EQ(1, boolItem.mValue.int_value); AStatsEvent_release(event); } - TEST(LogEventTest, TestStringAndByteArrayParsing) { AStatsEvent* event = AStatsEvent_obtain(); AStatsEvent_setAtomId(event, 100); @@ -104,7 +137,7 @@ TEST(LogEventTest, TestStringAndByteArrayParsing) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); - LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); @@ -140,7 +173,7 @@ TEST(LogEventTest, TestEmptyString) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); - LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); @@ -169,7 +202,7 @@ TEST(LogEventTest, TestByteArrayWithNullCharacter) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); - LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); @@ -205,7 +238,7 @@ TEST(LogEventTest, TestAttributionChain) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); - LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); @@ -213,7 +246,7 @@ TEST(LogEventTest, TestAttributionChain) { EXPECT_EQ(1001, logEvent.GetPid()); const vector<FieldValue>& values = logEvent.getValues(); - EXPECT_EQ(4, values.size()); // 2 per attribution node + EXPECT_EQ(4, values.size()); // 2 per attribution node // Check first attribution node const FieldValue& uid1Item = values[0]; @@ -244,21 +277,6 @@ TEST(LogEventTest, TestAttributionChain) { AStatsEvent_release(event); } -void createIntWithBoolAnnotationLogEvent(LogEvent* logEvent, uint8_t annotationId, - bool annotationValue) { - AStatsEvent* statsEvent = AStatsEvent_obtain(); - AStatsEvent_setAtomId(statsEvent, /*atomId=*/100); - AStatsEvent_writeInt32(statsEvent, 10); - AStatsEvent_addBoolAnnotation(statsEvent, annotationId, annotationValue); - AStatsEvent_build(statsEvent); - - size_t size; - uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size); - EXPECT_TRUE(logEvent->parseBuffer(buf, size)); - - AStatsEvent_release(statsEvent); -} - TEST(LogEventTest, TestAnnotationIdIsUid) { LogEvent event(/*uid=*/0, /*pid=*/0); createIntWithBoolAnnotationLogEvent(&event, ANNOTATION_ID_IS_UID, true); @@ -277,25 +295,9 @@ TEST(LogEventTest, TestAnnotationIdStateNested) { EXPECT_TRUE(values[0].mAnnotations.isNested()); } -void createIntWithIntAnnotationLogEvent(LogEvent* logEvent, uint8_t annotationId, - int annotationValue) { - AStatsEvent* statsEvent = AStatsEvent_obtain(); - AStatsEvent_setAtomId(statsEvent, /*atomId=*/100); - AStatsEvent_writeInt32(statsEvent, 10); - AStatsEvent_addInt32Annotation(statsEvent, annotationId, annotationValue); - AStatsEvent_build(statsEvent); - - size_t size; - uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size); - EXPECT_TRUE(logEvent->parseBuffer(buf, size)); - - AStatsEvent_release(statsEvent); -} - TEST(LogEventTest, TestPrimaryFieldAnnotation) { LogEvent event(/*uid=*/0, /*pid=*/0); - createIntWithIntAnnotationLogEvent(&event, ANNOTATION_ID_STATE_OPTION, - STATE_OPTION_PRIMARY_FIELD); + createIntWithBoolAnnotationLogEvent(&event, ANNOTATION_ID_PRIMARY_FIELD, true); const vector<FieldValue>& values = event.getValues(); EXPECT_EQ(values.size(), 1); @@ -304,8 +306,7 @@ TEST(LogEventTest, TestPrimaryFieldAnnotation) { TEST(LogEventTest, TestExclusiveStateAnnotation) { LogEvent event(/*uid=*/0, /*pid=*/0); - createIntWithIntAnnotationLogEvent(&event, ANNOTATION_ID_STATE_OPTION, - STATE_OPTION_EXCLUSIVE_STATE); + createIntWithBoolAnnotationLogEvent(&event, ANNOTATION_ID_EXCLUSIVE_STATE, true); const vector<FieldValue>& values = event.getValues(); EXPECT_EQ(values.size(), 1); @@ -328,8 +329,7 @@ TEST(LogEventTest, TestPrimaryFieldFirstUidAnnotation) { AStatsEvent_writeInt32(statsEvent, 10); } AStatsEvent_writeAttributionChain(statsEvent, uids, tags, 2); - AStatsEvent_addInt32Annotation(statsEvent, ANNOTATION_ID_STATE_OPTION, - STATE_OPTION_PRIMARY_FIELD_FIRST_UID); + AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true); AStatsEvent_build(statsEvent); // Construct LogEvent @@ -348,7 +348,7 @@ TEST(LogEventTest, TestPrimaryFieldFirstUidAnnotation) { TEST(LogEventTest, TestResetStateAnnotation) { int32_t resetState = 10; LogEvent event(/*uid=*/0, /*pid=*/0); - createIntWithIntAnnotationLogEvent(&event, ANNOTATION_ID_RESET_STATE, resetState); + createIntWithIntAnnotationLogEvent(&event, ANNOTATION_ID_TRIGGER_STATE_RESET, resetState); const vector<FieldValue>& values = event.getValues(); EXPECT_EQ(values.size(), 1); diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp index 2f81c2ded8b0..7d765d3fbbf5 100644 --- a/cmds/statsd/tests/statsd_test_util.cpp +++ b/cmds/statsd/tests/statsd_test_util.cpp @@ -1060,13 +1060,6 @@ sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const in return processor; } -AttributionNodeInternal CreateAttribution(const int& uid, const string& tag) { - AttributionNodeInternal attribution; - attribution.set_uid(uid); - attribution.set_tag(tag); - return attribution; -} - void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) { std::sort(events->begin(), events->end(), [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) { diff --git a/cmds/statsd/tests/statsd_test_util.h b/cmds/statsd/tests/statsd_test_util.h index 715ba2b73169..f24705a0c89f 100644 --- a/cmds/statsd/tests/statsd_test_util.h +++ b/cmds/statsd/tests/statsd_test_util.h @@ -291,9 +291,6 @@ std::unique_ptr<LogEvent> CreateOverlayStateChangedEvent(int64_t timestampNs, co const bool usingAlertWindow, const OverlayStateChanged::State state); -// Helper function to create an AttributionNodeInternal proto. -AttributionNodeInternal CreateAttribution(const int& uid, const string& tag); - // Create a statsd log event processor upon the start time in seconds, config and key. sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs, const StatsdConfig& config, const ConfigKey& key, diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index f3759fd611df..d4f511280553 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -47,7 +47,6 @@ import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.KeyEvent; -import android.view.SurfaceControl; import android.view.SurfaceView; import android.view.WindowManager; import android.view.WindowManagerImpl; @@ -1981,8 +1980,6 @@ public abstract class AccessibilityService extends Service { * to declare the capability to take screenshot by setting the * {@link android.R.styleable#AccessibilityService_canTakeScreenshot} * property in its meta-data. For details refer to {@link #SERVICE_META_DATA}. - * This API only will support {@link Display#DEFAULT_DISPLAY} until {@link SurfaceControl} - * supports non-default displays. * </p> * * @param displayId The logic display id, must be {@link Display#DEFAULT_DISPLAY} for @@ -1990,18 +1987,11 @@ public abstract class AccessibilityService extends Service { * @param executor Executor on which to run the callback. * @param callback The callback invoked when taking screenshot has succeeded or failed. * See {@link TakeScreenshotCallback} for details. - * - * @throws IllegalArgumentException if displayId is not {@link Display#DEFAULT_DISPLAY}. */ public void takeScreenshot(int displayId, @NonNull @CallbackExecutor Executor executor, @NonNull TakeScreenshotCallback callback) { Preconditions.checkNotNull(executor, "executor cannot be null"); Preconditions.checkNotNull(callback, "callback cannot be null"); - - if (displayId != Display.DEFAULT_DISPLAY) { - throw new IllegalArgumentException("DisplayId isn't the default display"); - } - final IAccessibilityServiceConnection connection = AccessibilityInteractionClient.getInstance().getConnection( mConnectionId); diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl index 27c9cfcdd05b..aa290404c001 100644 --- a/core/java/android/content/pm/ILauncherApps.aidl +++ b/core/java/android/content/pm/ILauncherApps.aidl @@ -25,6 +25,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IOnAppsChangedListener; import android.content.pm.LauncherApps; +import android.content.pm.ShortcutQueryWrapper; import android.content.pm.IPackageInstallerCallback; import android.content.pm.IShortcutChangeCallback; import android.content.pm.PackageInstaller; @@ -67,9 +68,8 @@ interface ILauncherApps { LauncherApps.AppUsageLimit getAppUsageLimit(String callingPackage, String packageName, in UserHandle user); - ParceledListSlice getShortcuts(String callingPackage, long changedSince, String packageName, - in List shortcutIds, in List<LocusId> locusIds, in ComponentName componentName, - int flags, in UserHandle user); + ParceledListSlice getShortcuts(String callingPackage, in ShortcutQueryWrapper query, + in UserHandle user); void pinShortcuts(String callingPackage, String packageName, in List<String> shortcutIds, in UserHandle user); boolean startShortcut(String callingPackage, String packageName, String featureId, String id, @@ -93,9 +93,8 @@ interface ILauncherApps { in IPackageInstallerCallback callback); ParceledListSlice getAllSessions(String callingPackage); - void registerShortcutChangeCallback(String callingPackage, long changedSince, - String packageName, in List shortcutIds, in List<LocusId> locusIds, - in ComponentName componentName, int flags, in IShortcutChangeCallback callback); + void registerShortcutChangeCallback(String callingPackage, in ShortcutQueryWrapper query, + in IShortcutChangeCallback callback); void unregisterShortcutChangeCallback(String callingPackage, in IShortcutChangeCallback callback); diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 6c161fcb8646..87dc0a17f41c 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -1046,8 +1046,7 @@ public class LauncherApps { // changed callback, but that only returns shortcuts with the "key" information, so // that won't return disabled message. return maybeUpdateDisabledMessage(mService.getShortcuts(mContext.getPackageName(), - query.mChangedSince, query.mPackage, query.mShortcutIds, query.mLocusIds, - query.mActivity, query.mQueryFlags, user) + new ShortcutQueryWrapper(query), user) .getList()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -1826,8 +1825,7 @@ public class LauncherApps { mShortcutChangeCallbacks.put(callback, new Pair<>(executor, proxy)); try { mService.registerShortcutChangeCallback(mContext.getPackageName(), - query.mChangedSince, query.mPackage, query.mShortcutIds, query.mLocusIds, - query.mActivity, query.mQueryFlags, proxy); + new ShortcutQueryWrapper(query), proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/ShortcutQueryWrapper.aidl b/core/java/android/content/pm/ShortcutQueryWrapper.aidl new file mode 100644 index 000000000000..d02600acf232 --- /dev/null +++ b/core/java/android/content/pm/ShortcutQueryWrapper.aidl @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +parcelable ShortcutQueryWrapper; + diff --git a/core/java/android/content/pm/ShortcutQueryWrapper.java b/core/java/android/content/pm/ShortcutQueryWrapper.java new file mode 100644 index 000000000000..c6134416adbc --- /dev/null +++ b/core/java/android/content/pm/ShortcutQueryWrapper.java @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.ComponentName; +import android.content.LocusId; +import android.os.Parcel; +import android.os.Parcelable; + +import com.android.internal.util.DataClass; + +import java.util.ArrayList; +import java.util.List; + +/** + * @hide + */ +@DataClass(genParcelable = true, genToString = true) +public final class ShortcutQueryWrapper extends LauncherApps.ShortcutQuery implements Parcelable { + + public ShortcutQueryWrapper(LauncherApps.ShortcutQuery query) { + this(); + mChangedSince = query.mChangedSince; + mPackage = query.mPackage; + mLocusIds = query.mLocusIds; + mShortcutIds = query.mShortcutIds; + mActivity = query.mActivity; + mQueryFlags = query.mQueryFlags; + } + + public long getChangedSince() { + return mChangedSince; + } + + @Nullable + public String getPackage() { + return mPackage; + } + + @Nullable + public List<LocusId> getLocusIds() { + return mLocusIds; + } + + @Nullable + public List<String> getShortcutIds() { + return mShortcutIds; + } + + @Nullable + public ComponentName getActivity() { + return mActivity; + } + + public int getQueryFlags() { + return mQueryFlags; + } + + // Code below generated by codegen v1.0.14. + // + // DO NOT MODIFY! + // CHECKSTYLE:OFF Generated code + // + // To regenerate run: + // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/content/pm/ShortcutQueryWrapper.java + // + // To exclude the generated code from IntelliJ auto-formatting enable (one-time): + // Settings > Editor > Code Style > Formatter Control + //@formatter:off + + + @DataClass.Generated.Member + public ShortcutQueryWrapper() { + + // onConstructed(); // You can define this method to get a callback + } + + @Override + @DataClass.Generated.Member + public String toString() { + // You can override field toString logic by defining methods like: + // String fieldNameToString() { ... } + + return "ShortcutQueryWrapper { " + + " }"; + } + + @Override + @DataClass.Generated.Member + public void writeToParcel(@NonNull Parcel dest, int flags) { + // You can override field parcelling by defining methods like: + // void parcelFieldName(Parcel dest, int flags) { ... } + + byte flg = 0; + if (mPackage != null) flg |= 0x2; + if (mShortcutIds != null) flg |= 0x4; + if (mLocusIds != null) flg |= 0x8; + if (mActivity != null) flg |= 0x10; + dest.writeByte(flg); + dest.writeLong(mChangedSince); + if (mPackage != null) dest.writeString(mPackage); + if (mShortcutIds != null) dest.writeStringList(mShortcutIds); + if (mLocusIds != null) dest.writeParcelableList(mLocusIds, flags); + if (mActivity != null) dest.writeTypedObject(mActivity, flags); + dest.writeInt(mQueryFlags); + } + + @Override + @DataClass.Generated.Member + public int describeContents() { return 0; } + + /** @hide */ + @SuppressWarnings({"unchecked", "RedundantCast"}) + @DataClass.Generated.Member + /* package-private */ ShortcutQueryWrapper(@NonNull Parcel in) { + // You can override field unparcelling by defining methods like: + // static FieldType unparcelFieldName(Parcel in) { ... } + + byte flg = in.readByte(); + long changedSince = in.readLong(); + String pkg = (flg & 0x2) == 0 ? null : in.readString(); + List<String> shortcutIds = null; + if ((flg & 0x4) != 0) { + shortcutIds = new ArrayList<>(); + in.readStringList(shortcutIds); + } + List<LocusId> locusIds = null; + if ((flg & 0x8) != 0) { + locusIds = new ArrayList<>(); + in.readParcelableList(locusIds, LocusId.class.getClassLoader()); + } + ComponentName activity = (flg & 0x10) == 0 ? null + : (ComponentName) in.readTypedObject(ComponentName.CREATOR); + int queryFlags = in.readInt(); + + this.mChangedSince = changedSince; + this.mPackage = pkg; + this.mShortcutIds = shortcutIds; + this.mLocusIds = locusIds; + this.mActivity = activity; + this.mQueryFlags = queryFlags; + com.android.internal.util.AnnotationValidations.validate( + QueryFlags.class, null, mQueryFlags); + + // onConstructed(); // You can define this method to get a callback + } + + @DataClass.Generated.Member + public static final @NonNull Parcelable.Creator<ShortcutQueryWrapper> CREATOR + = new Parcelable.Creator<ShortcutQueryWrapper>() { + @Override + public ShortcutQueryWrapper[] newArray(int size) { + return new ShortcutQueryWrapper[size]; + } + + @Override + public ShortcutQueryWrapper createFromParcel(@NonNull Parcel in) { + return new ShortcutQueryWrapper(in); + } + }; + + @DataClass.Generated( + time = 1582049937960L, + codegenVersion = "1.0.14", + sourceFile = "frameworks/base/core/java/android/content/pm/ShortcutQueryWrapper.java", + inputSignatures = "public long getChangedSince()\npublic @android.annotation.Nullable java.lang.String getPackage()\npublic @android.annotation.Nullable java.util.List<android.content.LocusId> getLocusIds()\npublic @android.annotation.Nullable java.util.List<java.lang.String> getShortcutIds()\npublic @android.annotation.Nullable android.content.ComponentName getActivity()\npublic int getQueryFlags()\nclass ShortcutQueryWrapper extends android.content.pm.LauncherApps.ShortcutQuery implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genParcelable=true, genToString=true)") + @Deprecated + private void __metadata() {} + + + //@formatter:on + // End of generated code + +} diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index d6a9f6990abe..c399bc72e438 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -40,6 +40,7 @@ import android.annotation.StringRes; import android.annotation.StyleRes; import android.annotation.StyleableRes; import android.annotation.XmlRes; +import android.app.Application; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.Config; @@ -58,9 +59,11 @@ import android.util.Log; import android.util.LongSparseArray; import android.util.Pools.SynchronizedPool; import android.util.TypedValue; +import android.view.Display; import android.view.DisplayAdjustments; import android.view.ViewDebug; import android.view.ViewHierarchyEncoder; +import android.view.WindowManager; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -101,6 +104,12 @@ import java.util.List; * (such as for different languages and screen sizes). This is an important aspect of developing * Android applications that are compatible on different types of devices.</p> * + * <p>After {@link Build.VERSION_CODES#R}, {@link Resources} must be obtained by + * {@link android.app.Activity} or {@link android.content.Context} created with + * {@link android.content.Context#createWindowContext(int, Bundle)}. + * {@link Application#getResources()} may report wrong values in multi-window or on secondary + * displays. + * * <p>For more information about using resources, see the documentation about <a * href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>.</p> */ @@ -2024,10 +2033,20 @@ public class Resources { } /** - * Return the current display metrics that are in effect for this resource - * object. The returned object should be treated as read-only. - * - * @return The resource's current display metrics. + * Return the current display metrics that are in effect for this resource + * object. The returned object should be treated as read-only. + * + * <p>Note that the reported value may be different than the window this application is + * interested in.</p> + * + * <p>Best practices are to obtain metrics from {@link WindowManager#getCurrentWindowMetrics()} + * for window bounds, {@link Display#getRealMetrics(DisplayMetrics)} for display bounds and + * obtain density from {@link Configuration#densityDpi}. The value obtained from this API may be + * wrong if the {@link Resources} is from the context which is different than the window is + * attached such as {@link Application#getResources()}. + * <p/> + * + * @return The resource's current display metrics. */ public DisplayMetrics getDisplayMetrics() { return mResourcesImpl.getDisplayMetrics(); diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java index ea2b9e79d99c..571537c3cc22 100644 --- a/core/java/android/hardware/display/DisplayManagerInternal.java +++ b/core/java/android/hardware/display/DisplayManagerInternal.java @@ -72,6 +72,15 @@ public abstract class DisplayManagerInternal { public abstract SurfaceControl.ScreenshotGraphicBuffer screenshot(int displayId); /** + * Take a screenshot without secure layer of the specified display and return a buffer. + * + * @param displayId The display id to take the screenshot of. + * @return The buffer or null if we have failed. + */ + public abstract SurfaceControl.ScreenshotGraphicBuffer screenshotWithoutSecureLayer( + int displayId); + + /** * Returns information about the specified logical display. * * @param displayId The logical display id. diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index 7ff954bdc1d2..651494d1c99c 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -1074,6 +1074,21 @@ public final class LinkProperties implements Parcelable { } /** + * Returns true if this link has an IPv4 unreachable default route. + * + * @return {@code true} if there is an IPv4 unreachable default route, {@code false} otherwise. + * @hide + */ + public boolean hasIpv4UnreachableDefaultRoute() { + for (RouteInfo r : mRoutes) { + if (r.isIPv4UnreachableDefault()) { + return true; + } + } + return false; + } + + /** * For backward compatibility. * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely * just yet. @@ -1102,6 +1117,21 @@ public final class LinkProperties implements Parcelable { } /** + * Returns true if this link has an IPv6 unreachable default route. + * + * @return {@code true} if there is an IPv6 unreachable default route, {@code false} otherwise. + * @hide + */ + public boolean hasIpv6UnreachableDefaultRoute() { + for (RouteInfo r : mRoutes) { + if (r.isIPv6UnreachableDefault()) { + return true; + } + } + return false; + } + + /** * For backward compatibility. * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely * just yet. diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index fe90a8457949..c42dacc187a9 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -624,7 +624,9 @@ public abstract class NetworkAgent { throw new UnsupportedOperationException( "Legacy agents can't call markConnected."); } - mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null); + // |reason| cannot be used by the non-legacy agents + mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null /* reason */, + mNetworkInfo.getExtraInfo()); queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo); } @@ -638,7 +640,9 @@ public abstract class NetworkAgent { if (mIsLegacy) { throw new UnsupportedOperationException("Legacy agents can't call unregister."); } - mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null); + // When unregistering an agent nobody should use the extrainfo (or reason) any more. + mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null /* reason */, + null /* extraInfo */); queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo); } diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 9c1fb41ecc96..b7fb280efdc4 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -1195,18 +1195,24 @@ public final class NetworkStats implements Parcelable { /** * Remove all rows that match one of specified UIDs. + * This mutates the original structure in place. * @hide */ public void removeUids(int[] uids) { - int nextOutputEntry = 0; - for (int i = 0; i < size; i++) { - if (!ArrayUtils.contains(uids, uid[i])) { - maybeCopyEntry(nextOutputEntry, i); - nextOutputEntry++; - } - } + filter(e -> !ArrayUtils.contains(uids, e.uid)); + } - size = nextOutputEntry; + /** + * Remove all rows that match one of specified UIDs. + * @return the result object. + * @hide + */ + @NonNull + public NetworkStats removeEmptyEntries() { + final NetworkStats ret = this.clone(); + ret.filter(e -> e.rxBytes != 0 || e.rxPackets != 0 || e.txBytes != 0 || e.txPackets != 0 + || e.operations != 0); + return ret; } /** diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java index dbdaa4c2da67..e550f85e6b9a 100644 --- a/core/java/android/net/RouteInfo.java +++ b/core/java/android/net/RouteInfo.java @@ -426,6 +426,16 @@ public final class RouteInfo implements Parcelable { } /** + * Indicates if this route is an unreachable default route. + * + * @return {@code true} if it's an unreachable route with prefix length of 0. + * @hide + */ + private boolean isUnreachableDefaultRoute() { + return mType == RTN_UNREACHABLE && mDestination.getPrefixLength() == 0; + } + + /** * Indicates if this route is an IPv4 default route. * @hide */ @@ -434,6 +444,14 @@ public final class RouteInfo implements Parcelable { } /** + * Indicates if this route is an IPv4 unreachable default route. + * @hide + */ + public boolean isIPv4UnreachableDefault() { + return isUnreachableDefaultRoute() && mDestination.getAddress() instanceof Inet4Address; + } + + /** * Indicates if this route is an IPv6 default route. * @hide */ @@ -442,6 +460,14 @@ public final class RouteInfo implements Parcelable { } /** + * Indicates if this route is an IPv6 unreachable default route. + * @hide + */ + public boolean isIPv6UnreachableDefault() { + return isUnreachableDefaultRoute() && mDestination.getAddress() instanceof Inet6Address; + } + + /** * Indicates if this route is a host route (ie, matches only a single host address). * * @return {@code true} if the destination has a prefix length of 32 or 128 for IPv4 or IPv6, diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java index 20e5f243163f..683993f762c0 100644 --- a/core/java/android/os/BinderProxy.java +++ b/core/java/android/os/BinderProxy.java @@ -251,6 +251,11 @@ public final class BinderProxy implements IBinder { } } } + // For gathering this debug output, we're making synchronous binder calls + // out of system_server to all processes hosting binder objects it holds a reference to; + // since some of those processes might be frozen, we don't want to block here + // forever. Disable the freezer. + Process.enableFreezer(false); for (WeakReference<BinderProxy> weakRef : proxiesToQuery) { BinderProxy bp = weakRef.get(); String key; @@ -273,6 +278,7 @@ public final class BinderProxy implements IBinder { counts.put(key, i + 1); } } + Process.enableFreezer(true); Map.Entry<String, Integer>[] sorted = counts.entrySet().toArray( new Map.Entry[counts.size()]); diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index ae65f1d0bd05..5f8c4f5cdf27 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -1268,6 +1268,7 @@ public class Environment { public static boolean isExternalStorageLegacy(@NonNull File path) { final Context context = AppGlobals.getInitialApplication(); final int uid = context.getApplicationInfo().uid; + // Isolated processes and Instant apps are never allowed to be in scoped storage if (Process.isIsolated(uid)) { return false; } @@ -1277,8 +1278,6 @@ public class Environment { return false; } - // TODO(b/150672994): Compat flags do not override instant app and isolated process's - // behavior. boolean defaultScopedStorage = Compatibility.isChangeEnabled(DEFAULT_SCOPED_STORAGE); boolean forceEnableScopedStorage = Compatibility.isChangeEnabled( FORCE_ENABLE_SCOPED_STORAGE); diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index fb81d675939c..e86aa62d00bc 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -266,6 +266,13 @@ public final class DeviceConfig { public static final String NAMESPACE_SCHEDULER = "scheduler"; /** + * Namespace for settings statistics features. + * + * @hide + */ + public static final String NAMESPACE_SETTINGS_STATS = "settings_stats"; + + /** * Namespace for storage-related features. * * @deprecated Replace storage namespace with storage_native_boot. diff --git a/core/java/android/service/watchdog/ExplicitHealthCheckService.java b/core/java/android/service/watchdog/ExplicitHealthCheckService.java index 995014374721..b1647fe0fcf9 100644 --- a/core/java/android/service/watchdog/ExplicitHealthCheckService.java +++ b/core/java/android/service/watchdog/ExplicitHealthCheckService.java @@ -21,7 +21,9 @@ import static android.os.Parcelable.Creator; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; +import android.annotation.SuppressLint; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.content.pm.PackageManager; @@ -64,6 +66,7 @@ import java.util.concurrent.TimeUnit; * </pre> * @hide */ +@TestApi @SystemApi public abstract class ExplicitHealthCheckService extends Service { @@ -159,6 +162,15 @@ public abstract class ExplicitHealthCheckService extends Service { } /** + * Sets {@link RemoteCallback}, for testing purpose. + * + * @hide + */ + @TestApi + public void setCallback(@Nullable RemoteCallback callback) { + mCallback = callback; + } + /** * Implementors should call this to notify the system when explicit health check passes * for {@code packageName}; */ @@ -183,6 +195,7 @@ public abstract class ExplicitHealthCheckService extends Service { * * @hide */ + @TestApi @SystemApi public static final class PackageConfig implements Parcelable { private static final long DEFAULT_HEALTH_CHECK_TIMEOUT_MILLIS = TimeUnit.HOURS.toMillis(1); @@ -263,7 +276,7 @@ public abstract class ExplicitHealthCheckService extends Service { } @Override - public void writeToParcel(Parcel parcel, int flags) { + public void writeToParcel(@SuppressLint({"MissingNullability"}) Parcel parcel, int flags) { parcel.writeString(mPackageName); parcel.writeLong(mHealthCheckTimeoutMillis); } diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index fe70ff7a1dbf..174165c5ba59 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -124,8 +124,14 @@ public class SurfaceControlViewHost { /** @hide */ public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d, @NonNull WindowlessWindowManager wwm) { + this(c, d, wwm, false /* useSfChoreographer */); + } + + /** @hide */ + public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d, + @NonNull WindowlessWindowManager wwm, boolean useSfChoreographer) { mWm = wwm; - mViewRoot = new ViewRootImpl(c, d, mWm); + mViewRoot = new ViewRootImpl(c, d, mWm, useSfChoreographer); mViewRoot.forceDisableBLAST(); mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection(); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b5e8dd8212e3..2d309034e1c2 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -449,7 +449,7 @@ public final class ViewRootImpl implements ViewParent, InputQueue mInputQueue; @UnsupportedAppUsage FallbackEventHandler mFallbackEventHandler; - Choreographer mChoreographer; + final Choreographer mChoreographer; // used in relayout to get SurfaceControl size // for BLAST adapter surface setup @@ -692,11 +692,18 @@ public final class ViewRootImpl implements ViewParent, private SurfaceControl.Transaction mRtBLASTSyncTransaction = new SurfaceControl.Transaction(); private String mTag = TAG; + public ViewRootImpl(Context context, Display display) { - this(context, display, WindowManagerGlobal.getWindowSession()); + this(context, display, WindowManagerGlobal.getWindowSession(), + false /* useSfChoreographer */); } public ViewRootImpl(Context context, Display display, IWindowSession session) { + this(context, display, session, false /* useSfChoreographer */); + } + + public ViewRootImpl(Context context, Display display, IWindowSession session, + boolean useSfChoreographer) { mContext = context; mWindowSession = session; mDisplay = display; @@ -732,7 +739,8 @@ public final class ViewRootImpl implements ViewParent, mDensity = context.getResources().getDisplayMetrics().densityDpi; mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi; mFallbackEventHandler = new PhoneFallbackEventHandler(context); - mChoreographer = Choreographer.getInstance(); + mChoreographer = useSfChoreographer + ? Choreographer.getSfInstance() : Choreographer.getInstance(); mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); mInsetsController = new InsetsController(this); @@ -1748,13 +1756,17 @@ public final class ViewRootImpl implements ViewParent, return null; } + Surface ret = null; if (mBlastBufferQueue == null) { mBlastBufferQueue = new BLASTBufferQueue( mBlastSurfaceControl, width, height); + // We only return the Surface the first time, as otherwise + // it hasn't changed and there is no need to update. + ret = mBlastBufferQueue.getSurface(); } mBlastBufferQueue.update(mBlastSurfaceControl, width, height); - return mBlastBufferQueue.getSurface(); + return ret; } private void setBoundsLayerCrop() { @@ -7349,8 +7361,14 @@ public final class ViewRootImpl implements ViewParent, if (!mUseBLASTAdapter) { mSurface.copyFrom(mSurfaceControl); } else { - mSurface.transferFrom(getOrCreateBLASTSurface(mSurfaceSize.x, - mSurfaceSize.y)); + final Surface blastSurface = getOrCreateBLASTSurface(mSurfaceSize.x, + mSurfaceSize.y); + // If blastSurface == null that means it hasn't changed since the last time we + // called. In this situation, avoid calling transferFrom as we would then + // inc the generation ID and cause EGL resources to be recreated. + if (blastSurface != null) { + mSurface.transferFrom(blastSurface); + } } } else { destroySurface(); diff --git a/core/java/android/window/TaskOrganizerTaskEmbedder.java b/core/java/android/window/TaskOrganizerTaskEmbedder.java index 2091c9398e95..39a0101bbf59 100644 --- a/core/java/android/window/TaskOrganizerTaskEmbedder.java +++ b/core/java/android/window/TaskOrganizerTaskEmbedder.java @@ -254,7 +254,9 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder { mTaskToken = taskInfo.token; mTaskLeash = mTaskToken.getLeash(); mTransaction.reparent(mTaskLeash, mSurfaceControl) - .show(mSurfaceControl).apply(); + .show(mTaskLeash) + .show(mSurfaceControl) + .apply(); if (mPendingNotifyBoundsChanged) { // TODO: Either defer show or hide and synchronize show with the resize notifyBoundsChanged(); diff --git a/core/java/com/android/internal/view/SurfaceFlingerVsyncChoreographer.java b/core/java/com/android/internal/view/SurfaceFlingerVsyncChoreographer.java deleted file mode 100644 index 924b3f704f5b..000000000000 --- a/core/java/com/android/internal/view/SurfaceFlingerVsyncChoreographer.java +++ /dev/null @@ -1,94 +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.internal.view; - -import android.os.Handler; -import android.os.Message; -import android.view.Choreographer; -import android.view.Display; - -/** - * Utility class to schedule things at vsync-sf instead of vsync-app - * @hide - */ -public class SurfaceFlingerVsyncChoreographer { - - private static final long ONE_MS_IN_NS = 1000000; - private static final long ONE_S_IN_NS = ONE_MS_IN_NS * 1000; - - private final Handler mHandler; - private final Choreographer mChoreographer; - - /** - * The offset between vsync-app and vsync-surfaceflinger. See - * {@link #calculateAppSurfaceFlingerVsyncOffsetMs} why this is necessary. - */ - private long mSurfaceFlingerOffsetMs; - - public SurfaceFlingerVsyncChoreographer(Handler handler, Display display, - Choreographer choreographer) { - mHandler = handler; - mChoreographer = choreographer; - mSurfaceFlingerOffsetMs = calculateAppSurfaceFlingerVsyncOffsetMs(display); - } - - public long getSurfaceFlingerOffsetMs() { - return mSurfaceFlingerOffsetMs; - } - - /** - * This method calculates the offset between vsync-surfaceflinger and vsync-app. If vsync-app - * is a couple of milliseconds before vsync-sf, a touch or animation event that causes a surface - * flinger transaction are sometimes processed before the vsync-sf tick, and sometimes after, - * which leads to jank. Figure out this difference here and then post all the touch/animation - * events to start being processed at vsync-sf. - * - * @return The offset between vsync-app and vsync-sf, or 0 if vsync app happens after vsync-sf. - */ - private long calculateAppSurfaceFlingerVsyncOffsetMs(Display display) { - - // Calculate vsync offset from SurfaceFlinger. - // See frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:getDisplayConfigs - long vsyncPeriod = (long) (ONE_S_IN_NS / display.getRefreshRate()); - long sfVsyncOffset = vsyncPeriod - (display.getPresentationDeadlineNanos() - ONE_MS_IN_NS); - return Math.max(0, (sfVsyncOffset - display.getAppVsyncOffsetNanos()) / ONE_MS_IN_NS); - } - - public void scheduleAtSfVsync(Runnable r) { - final long delay = calculateDelay(); - if (delay <= 0) { - r.run(); - } else { - mHandler.postDelayed(r, delay); - } - } - - public void scheduleAtSfVsync(Handler h, Message m) { - final long delay = calculateDelay(); - if (delay <= 0) { - h.handleMessage(m); - } else { - m.setAsynchronous(true); - h.sendMessageDelayed(m, delay); - } - } - - private long calculateDelay() { - final long sinceFrameStart = System.nanoTime() - mChoreographer.getLastFrameTimeNanos(); - return mSurfaceFlingerOffsetMs - sinceFrameStart / 1000000; - } -} diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 0c74387c1a2e..7c32ca653114 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -696,7 +696,7 @@ static jlong android_os_Process_getTotalMemory(JNIEnv* env, jobject clazz) return -1; } - return si.totalram; + return static_cast<jlong>(si.totalram) * si.mem_unit; } /* diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index ab57e3dcdc53..6321651c1345 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -2669,4 +2669,9 @@ enum PageId { // Open: Settings > Sound > Do Not Disturb > Apps > <Choose App> // OS: R DND_APPS_BYPASSING = 1840; + + // OPEN: Settings > Battery > Advanced battery option + // CATEGORY: SETTINGS + // OS: R + FUELGAUGE_ADVANCED_BATTERY_OPTION = 1842; } diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index e078384686b5..8facd8a4d963 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Gesprek"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Groepsgesprek"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Persoonlik"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Werk"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persoonlike aansig"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index b3c8b7aa9e23..37fd9652e894 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ውይይት"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"የቡድን ውይይት"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"የግል"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ሥራ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"የግል እይታ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index a6db03a0b597..4715823b6482 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -218,7 +218,7 @@ <string name="power_dialog" product="default" msgid="1107775420270203046">"خيارات الهاتف"</string> <string name="silent_mode" msgid="8796112363642579333">"وضع صامت"</string> <string name="turn_on_radio" msgid="2961717788170634233">"تفعيل اللاسلكي"</string> - <string name="turn_off_radio" msgid="7222573978109933360">"إيقاف تفعيل الشبكة اللاسلكية"</string> + <string name="turn_off_radio" msgid="7222573978109933360">"إيقاف الشبكة اللاسلكية"</string> <string name="screen_lock" msgid="2072642720826409809">"قفل الشاشة"</string> <string name="power_off" msgid="4111692782492232778">"إيقاف التشغيل"</string> <string name="silent_mode_silent" msgid="5079789070221150912">"إيقاف الرنين"</string> @@ -231,10 +231,10 @@ <string name="reboot_to_reset_title" msgid="2226229680017882787">"إعادة الضبط على الإعدادات الأصلية"</string> <string name="reboot_to_reset_message" msgid="3347690497972074356">"جارٍ إعادة التشغيل…"</string> <string name="shutdown_progress" msgid="5017145516412657345">"جارٍ إيقاف التشغيل..."</string> - <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"سيتم إيقاف تفعيل الجهاز اللوحي."</string> + <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"سيتم إيقاف الجهاز اللوحي."</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"سيتم إيقاف جهاز Android TV."</string> <string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"سيتم إيقاف المشاهدة."</string> - <string name="shutdown_confirm" product="default" msgid="136816458966692315">"سيتم إيقاف تفعيل هاتفك."</string> + <string name="shutdown_confirm" product="default" msgid="136816458966692315">"سيتم إيقاف هاتفك."</string> <string name="shutdown_confirm_question" msgid="796151167261608447">"هل تريد إيقاف التشغيل؟"</string> <string name="reboot_safemode_title" msgid="5853949122655346734">"إعادة تشغيل في الوضع الآمن"</string> <string name="reboot_safemode_confirm" msgid="1658357874737219624">"هل تريد إعادة تشغيل الكمبيوتر في الوضع الآمن؟ سيؤدي ذلك إلى إيقاف جميع تطبيقات الجهات الخارجية التي تم تثبيتها. ستتم استعادتها عند إعادة التشغيل مرة أخرى."</string> @@ -245,10 +245,8 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"خيارات الهاتف"</string> <string name="global_action_lock" msgid="6949357274257655383">"قفل الشاشة"</string> <string name="global_action_power_off" msgid="4404936470711393203">"إيقاف التشغيل"</string> - <!-- no translation found for global_action_power_options (1185286119330160073) --> - <skip /> - <!-- no translation found for global_action_restart (4678451019561687074) --> - <skip /> + <string name="global_action_power_options" msgid="1185286119330160073">"التشغيل"</string> + <string name="global_action_restart" msgid="4678451019561687074">"إعادة التشغيل"</string> <string name="global_action_emergency" msgid="1387617624177105088">"الطوارئ"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"تقرير الأخطاء"</string> <string name="global_action_logout" msgid="6093581310002476511">"إنهاء الجلسة"</string> @@ -452,8 +450,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"التقاط صور وفيديوهات"</string> <string name="permdesc_camera" msgid="1354600178048761499">"يمكن لهذا التطبيق التقاط صور وتسجيل فيديوهات باستخدام الكاميرا في أي وقت."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"السماح لتطبيق أو خدمة بالوصول إلى كاميرات النظام لالتقاط صور وتسجيل فيديوهات"</string> - <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> - <skip /> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"إنّ تطبيق النظام هذا، أو التطبيق المزوّد بأذونات مميّزة، يمكنه التقاط صور وتسجيل فيديوهات باستخدام كاميرا النظام في أي وقت. ويجب أن يحصل التطبيق أيضًا على الإذن android.permission.CAMERA."</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"يسمح الإذن لتطبيق أو خدمة بتلقّي استدعاءات عما إذا كانت أجهزة الكاميرات مفتوحة أو مغلقة."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"يمكن أن يتلقّى هذا التطبيق استدعاءات عندما تكون هناك كاميرا مفتوحة (بواسطة هذا التطبيق) أو مغلقة."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"التحكم في الاهتزاز"</string> @@ -1434,8 +1431,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> غير متوافق"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"هذا الجهاز غير متوافق مع <xliff:g id="NAME">%s</xliff:g> هذا. انقر للإعداد بتنسيق متوافق."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"لا يتوافق هذا الجهاز مع <xliff:g id="NAME">%s</xliff:g>. يمكنك النقر للإعداد بتنسيق متوافق."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"لا يدعم هذا الجهاز <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"تمت إزالة <xliff:g id="NAME">%s</xliff:g> بشكل غير متوقع"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"إخراج الوسائط قبل الإزالة لتجنّب فقدان المحتوى"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"تمت إزالة <xliff:g id="NAME">%s</xliff:g>."</string> @@ -1711,24 +1707,15 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"هل تريد رفع مستوى الصوت فوق المستوى الموصى به؟\n\nقد يضر سماع صوت عالٍ لفترات طويلة بسمعك."</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"هل تريد استخدام اختصار \"سهولة الاستخدام\"؟"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"عند تفعيل الاختصار، يؤدي الضغط على زرّي التحكّم في مستوى الصوت معًا لمدة 3 ثوانٍ إلى تفعيل إحدى ميزات إمكانية الوصول."</string> - <!-- no translation found for accessibility_shortcut_multiple_service_warning_title (8417489297036013065) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_warning (3740723309483706911) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_list (6935581470716541531) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning_title (3410100187167382427) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning (8412954203626349109) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning_title (2819109500943271385) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning (6363127705112844257) --> - <skip /> - <!-- no translation found for accessibility_shortcut_on (5463618449556111344) --> - <skip /> - <!-- no translation found for accessibility_shortcut_off (3651336255403648739) --> - <skip /> + <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"هل تريد تفعيل ميزات إمكانية الوصول؟"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"يؤدي الضغط مع الاستمرار على كلا مفتاحَي التحكّم في مستوى الصوت لبضع ثوانٍ إلى تفعيل ميزات إمكانية الوصول. قد يؤدي هذا إلى تغيير كيفية عمل جهازك.\n\nالميزات الحالية:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nيمكنك تغيير الميزات المحددة في الإعدادات > أدوات تمكين الوصول."</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"هل تريد تفعيل TalkBack؟"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"يؤدي الضغط مع الاستمرار لبضع ثوانٍ على كلا مفتاحَي التحكّم في مستوى الصوت إلى تفعيل TalkBack، وهو قارئ شاشة يساعد المكفوفين أو الذين يعانون من ضعف في النظر. تؤدي ميزة TalkBack إلى تغيير كيفية عمل جهازك بالكامل.\n\nيمكنك تغيير هذا الاختصار للعمل مع ميزة أخرى في الإعدادات > أدوات تمكين الوصول."</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"هل تريد تفعيل <xliff:g id="SERVICE">%1$s</xliff:g>؟"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"يؤدي الضغط مع الاستمرار لبضع ثوانٍ على كلا مفتاحَي التحكّم في مستوى الصوت إلى تفعيل <xliff:g id="SERVICE">%1$s</xliff:g> وهي إحدى ميزات إمكانية الوصول. يمكن أن يؤدي هذا الإجراء إلى تغيير كيفية عمل جهازك.\n\nيمكنك تغيير هذا الاختصار لاستخدامه مع ميزة أخرى في الإعدادات > أدوات تمكين الوصول."</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"تفعيل"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"عدم التفعيل"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"هل تريد السماح لخدمة <xliff:g id="SERVICE">%1$s</xliff:g> بالتحكّم الكامل في جهازك؟"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"في حال تفعيل <xliff:g id="SERVICE">%1$s</xliff:g>، لن يستخدم جهازك ميزة قفل الشاشة لتحسين ترميز البيانات."</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"إنّ التحكّم الكامل ليس ملائمًا لمعظم التطبيقات، باستثناء التطبيقات المعنية بسهولة الاستخدام."</string> @@ -1739,10 +1726,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"سماح"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"رفض"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"انقر على ميزة لبدء استخدامها:"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_button_title (239446795930436325) --> - <skip /> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (1077294237378645981) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"اختيار الميزات التي تريد استخدامها مع زر أدوات تمكين الوصول"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"اختيار الميزات التي تريد استخدامها مع اختصار مفتاح التحكّم في مستوى الصوت"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"تم إيقاف <xliff:g id="SERVICE_NAME">%s</xliff:g>."</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"تعديل الاختصارات"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"تم"</string> @@ -1750,23 +1735,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"استخدام الاختصار"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"عكس الألوان"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"تصحيح الألوان"</string> - <!-- no translation found for accessibility_shortcut_enabling_service (5473495203759847687) --> - <skip /> - <!-- no translation found for accessibility_shortcut_disabling_service (8675244165062700619) --> - <skip /> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"تم الضغط مع الاستمرار على مفتاحَي التحكّم في مستوى الصوت. تم تفعيل <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"تم الضغط مع الاستمرار على مفتاحَي التحكّم في مستوى الصوت. تم إيقاف <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"اضغط مع الاستمرار على مفتاحي مستوى الصوت لمدة 3 ثوانٍ لاستخدام <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> - <!-- no translation found for accessibility_button_prompt_text (8343213623338605305) --> - <skip /> - <!-- no translation found for accessibility_gesture_prompt_text (8742535972130563952) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_prompt_text (5211827854510660203) --> - <skip /> - <!-- no translation found for accessibility_button_instructional_text (8853928358872550500) --> - <skip /> - <!-- no translation found for accessibility_gesture_instructional_text (9196230728837090497) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_instructional_text (3425123684990193765) --> - <skip /> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"يمكنك اختيار إحدى الميزات لاستخدامها عند النقر على زر أدوات تمكين الوصول:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"يمكنك اختيار إحدى الميزات لاستخدامها مع إيماءة أدوات تمكين الوصول (مرّر سريعًا إلى الأعلى من أسفل الشاشة باستخدام إصبعين):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"يمكنك اختيار إحدى الميزات التالية لاستخدامها مع إيماءة أدوات تمكين الوصول (مرّر سريعًا إلى الأعلى من أسفل الشاشة باستخدام ثلاثة أصابع):"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"للتبديل بين الخدمات، يمكنك النقر مع الاستمرار على زر أدوات تمكين الوصول."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"للتبديل بين الخدمات، مرّر سريعًا من أسفل الشاشة إلى أعلاها باستخدام إصبعين مع تثبيتهما."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"للتبديل بين الميزات، مرّر سريعًا من أسفل الشاشة لأعلاها بثلاثة أصابع مع تثبيتها."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"التكبير"</string> <string name="user_switched" msgid="7249833311585228097">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"جارٍ التبديل إلى <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -2185,8 +2162,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> و<xliff:g id="COUNT_3">%d</xliff:g> ملف</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> وملف (<xliff:g id="COUNT_1">%d</xliff:g>)</item> </plurals> - <!-- no translation found for chooser_no_direct_share_targets (1511722103987329028) --> - <skip /> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ليس هناك أشخاص مقترحون للمشاركة معهم"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"قائمة التطبيقات"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"لم يتم منح هذا التطبيق إذن تسجيل، ولكن يمكنه تسجيل الصوت من خلال جهاز USB هذا."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"الشاشة الرئيسية"</string> @@ -2204,6 +2180,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"محادثة"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"محادثة جماعية"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"شخصي"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"عمل"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"عرض المحتوى الشخصي"</string> @@ -2222,220 +2200,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"لا يمكن لتطبيقات العمل أن تفتح هذا المحتوى."</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"لا يمكن للتطبيقات الشخصية أن تدعم هذا المحتوى."</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"لا يمكن للتطبيقات الشخصية أن تفتح هذا المحتوى."</string> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ENTRY (8050953231914637819) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY (7164399703751688214) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ENTRY (4447629474818217364) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY (973059024670737358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ENTRY (4487435301206073787) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY (768060297218652809) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY (7129527319490548930) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY (2876126640607573252) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY (8952595089930109282) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ENTRY (3013902515773728996) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ENTRY (2974411408893410289) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ENTRY (687618528751880721) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ENTRY (6810596579655575381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ENTRY (2715929642540980259) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY (8557791623303951590) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ENTRY (7382468767274580323) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY (6730880791104286987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY (6432126539782267026) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY (1730510161529488920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY (3369885925003346830) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY (9129139686191167829) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY (2869929685874615358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ENTRY (1238663472392741771) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY (3988705848553894358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ENTRY (6186770686690993200) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ENTRY (7043865376145617024) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ENTRY (6144227308185112176) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS (4233355366318061180) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS (6742563947637715645) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS (2033399698172403560) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS (4795977251920732254) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS (1090425878157254446) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS (6476898876518094438) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS (6006806734293747731) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (6546680489620881893) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS (3506845511000727015) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_IN_PROGRESS (6709169861932992750) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS (4013870911606478520) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS (9032651188219523434) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS (6584576506344491207) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS (830981927724888114) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS (7851790973098894802) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_IN_PROGRESS (1149560739586960121) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS (5708964693522116025) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS (7288103122966483455) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS (4036752174056147753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS (5089536274515338566) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS (6737197986936251958) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS (5658767775619998623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS (665978313257653727) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS (3857142652251836850) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS (2695664012344346788) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (2695678959963807782) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS (1230605365926493599) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ERROR (1924844017037151535) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR (3372797822292089708) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR (1878443146720411381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ERROR (7664778312218023192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ERROR (2472944311643350302) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ERROR (828089694480999120) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ERROR (17619001007092511) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ERROR (807214229604353614) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ERROR (8644184447744175747) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR (3801002648649640407) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ERROR (707397021218680753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR (894358680773257820) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR (352466878146726991) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR (7353389721907138671) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR (2655263155490857920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ERROR (6903740900892931310) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR (5165901670447518687) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR (2856763216589267623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR (817542684437829139) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR (5178635064113393143) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR (5391587926974531008) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR (4895494864493315868) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ERROR (9017576601595353649) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR (1116993930995545742) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ERROR (7559167306794441462) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ERROR (2782926139511136588) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ERROR (1890493954453456758) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUCCESS (4886243367747126325) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS (4053809277733513987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS (8249342930499801740) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_SUCCESS (2339794542560381270) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_SUCCESS (6975608174152828954) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS (2846699261330463192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS (5335414726057102801) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_SUCCESS (8868100318474971969) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS (6020936629725666932) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS (6944873647584595489) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_SUCCESS (2526483514124121988) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS (7662200333621664621) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS (2861223407953766632) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS (5345648571175243272) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS (3725278343103422466) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS (6998502547560297983) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS (8555433771162560361) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS (3555767296933606232) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS (6778051818199974237) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS (4080108758498911429) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS (7873675303000794343) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS (1763198215069819523) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_SUCCESS (2053891977727320532) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS (8146602361895007345) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_SUCCESS (8058678548991999545) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_SUCCESS (2545608067978550571) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_SUCCESS (4352382949744625007) --> - <skip /> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"رقم التعريف الشخصي لإلغاء قفل شبكة شريحة SIM"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"رقم التعريف الشخصي لإلغاء قفل المجموعة الفرعية لشبكة شريحة SIM"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"رقم التعريف الشخصي لإلغاء قفل شريحة SIM للشركات"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"رقم التعريف الشخصي لإلغاء قفل مقدم خدمة شريحة SIM"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"رقم التعريف الشخصي لإلغاء قفل شريحة SIM"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"رقم التعريف الشخصي لإلغاء قفل RUIM network1"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"رقم التعريف الشخصي لإلغاء قفل RUIM network2"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"رقم التعريف الشخصي لإلغاء قفل بطاقة RUIM لبيانات الحزمة ذات المعدل العالي"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"رقم التعريف الشخصي لإلغاء قفل بطاقة RUIM للشركات"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"رقم التعريف الشخصي لإلغاء قفل مقدم خدمة بطاقة RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"رقم التعريف الشخصي لإلغاء قفل بطاقة RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"إدخال رمز PUK"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"رقم التعريف الشخصي لإلغاء قفل SPN"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"رقم التعريف الشخصي لإلغاء قفل SP Equivalent Home PLMN"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"رقم التعريف الشخصي لإلغاء قفل ICCID"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"رقم التعريف الشخصي لإلغاء قفل IMPI"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"رقم التعريف الشخصي لإلغاء قفل مقدم خدمة المجموعة الفرعية للشبكة"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"جارٍ طلب إلغاء قفل شبكة شريحة SIM.…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"جارٍ طلب إلغاء قفل المجموعة الفرعية لشبكة شريحة SIM …"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"جارٍ طلب إلغاء قفل مقدم خدمة شريحة SIM…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"جارٍ طلب إلغاء قفل شريحة SIM للشركات…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"جارٍ طلب إلغاء قفل شريحة SIM…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"جارٍ طلب إلغاء قفل RUIM network1…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"جارٍ طلب إلغاء قفل RUIM network2…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"جارٍ طلب إلغاء قفل بطاقة RUIM لبيانات الحزمة ذات المعدل العالي.…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"جارٍ طلب إلغاء قفل مقدم خدمة بطاقة RUIM…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"جارٍ طلب إلغاء قفل بطاقة RUIM للشركات…"</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"جارٍ طلب إلغاء قفل SPN…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"جارٍ طلب إلغاء قفل SP Equivalent Home PLMN…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"جارٍ طلب إلغاء قفل ICCID.…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"جارٍ طلب إلغاء قفل IMPI…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"جارٍ طلب إلغاء قفل مقدم خدمة المجموعة الفرعية للشبكة…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"جارٍ طلب إلغاء قفل بطاقة RUIM…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"جارٍ طلب إلغاء القفل باستخدام رمز PUK…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"تعذّر طلب إلغاء قفل شبكة شريحة SIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"تعذّر طلب إلغاء قفل المجموعة الفرعية لشبكة شريحة SIM."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"تعذّر طلب إلغاء قفل مقدم خدمة شريحة SIM."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"تعذّر طلب إلغاء قفل شريحة SIM للشركات."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"تعذّر طلب إلغاء قفل شريحة SIM."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"تعذّر طلب إلغاء قفل RUIM Network1."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"تعذّر طلب إلغاء قفل RUIM network2."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"تعذّر طلب إلغاء قفل بطاقة RUIM لبيانات الحزمة ذات المعدل العالي."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"تعذّر طلب إلغاء قفل بطاقة RUIM للشركات."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"تعذّر طلب إلغاء قفل مقدم خدمة بطاقة RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"تعذّر طلب إلغاء قفل بطاقة RUIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"تعذّر إلغاء القفل باستخدام رمز PUK."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"تعذّر طلب إلغاء قفل SPN."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"تعذّر طلب إلغاء قفل SP Equivalent Home PLMN."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"تعذّر طلب إلغاء قفل ICCID."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"تعذّر طلب إلغاء قفل IMPI."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"تعذّر طلب إلغاء قفل مقدم خدمة المجموعة الفرعية للشبكة."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"تم إلغاء قفل شبكة شريحة SIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"تم إلغاء قفل المجموعة الفرعية لشبكة شريحة SIM."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"تم إلغاء قفل مقدم خدمة شريحة SIM."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"تم إلغاء قفل شريحة SIM للشركات."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"تم إلغاء قفل شريحة SIM."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"تم إلغاء قفل RUIM Network1."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"تم إلغاء قفل RUIM network2."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"تم إلغاء قفل بطاقة RUIM لبيانات الحزمة ذات المعدل العالي."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"تم إلغاء قفل مقدم خدمة بطاقة RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"تم إلغاء قفل بطاقة RUIM للشركات بنجاح."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"تم إلغاء قفل بطاقة RUIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"تم إلغاء القفل باستخدام رمز PUK بنجاح."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"تم إلغاء قفل SPN."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"تم إلغاء قفل SP Equivalent Home PLMN."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"تم إلغاء قفل ICCID."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"تم إلغاء قفل IMPI."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"تم إلغاء قفل مقدم خدمة المجموعة الفرعية للشبكة."</string> </resources> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 7685e4bc9ee9..c0e070bf27bf 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -297,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"আপোনাৰ সম্পৰ্কসূচী চাব পাৰে"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"অৱস্থান"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"এই ডিভাইচৰ অৱস্থান ব্যৱহাৰ কৰিব পাৰে"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"কেলেণ্ডাৰ"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"আপোনাৰ কেলেণ্ডাৰ ব্যৱহাৰ কৰিব পাৰে"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"এছএমএছ"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"এছএমএছ বার্তা পঠিয়াব আৰু চাব পাৰে"</string> @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g>ক ব্যৱহাৰ কৰিব নোৱাৰি"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"এই ডিভাইচটোৱে <xliff:g id="NAME">%s</xliff:g>ক ব্যৱহাৰ কৰিব নোৱাৰে। ব্যৱহাৰ কৰিব পৰা ফৰ্মেটত ছেট আপ কৰিবলৈ টিপক।"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"এই ডিভাইচটোৱে <xliff:g id="NAME">%s</xliff:g>ক চলাব নোৱাৰে। চলাব পৰা কোনো ফৰ্মেটত ছেট আপ কৰিবলৈ বাছনি কৰক।"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"এই ডিভাইচটোৱে এই <xliff:g id="NAME">%s</xliff:g>ক সমৰ্থন নকৰে।"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> অপ্ৰত্য়াশিতভাৱে আঁতৰোৱা হ’ল"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"সমল হেৰুওৱাৰ পৰা হাত সাৰিবলৈ আঁতৰোৱাৰ আগতে মিডিয়া বাহিৰ কৰক"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> আঁতৰোৱা হ’ল"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"বাৰ্তালাপ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"গোটত কৰা বাৰ্তালাপ"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ব্যক্তিগত"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"কৰ্মস্থান"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ব্যক্তিগত ভিউ"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index faeaa655bedd..ec6960660b54 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Dəstəklənməyən <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"<xliff:g id="NAME">%s</xliff:g> bu cihaz tərəfindən dəstəklənmir. Dəstəklənən formatda ayarlamaq üçün tıklayın."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"<xliff:g id="NAME">%s</xliff:g> bu cihaz tərəfindən dəstəklənmir. Dəstəklənən formatda ayarlamaq üçün seçin."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"<xliff:g id="NAME">%s</xliff:g> bu cihaz tərəfindən dəstəklənmir."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> gözlənilmədən çıxarıldı"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Kontenti itirməmək üçün silmədən öncə medianı çıxarın"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> silindi"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Söhbət"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Qrup Söhbəti"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Şəxsi"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"İş"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Şəxsi məzmuna baxış"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index bd11a8fdd378..0636ea960572 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1371,8 +1371,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Uređaj <xliff:g id="NAME">%s</xliff:g> nije podržan"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Ovaj uređaj ne podržava ovaj uređaj <xliff:g id="NAME">%s</xliff:g>. Dodirnite da biste podesili podržani format."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Ovaj uređaj ne podržava ovaj medij (<xliff:g id="NAME">%s</xliff:g>). Izaberite da ga podesite u podržanom formatu."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Ovaj uređaj ne podržava: <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"Uređaj <xliff:g id="NAME">%s</xliff:g> je neočekivano uklonjen"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Izbacite medijum pre nego što ga uklonite da ne biste izgubili sadržaj"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> je uklonjen/a"</string> @@ -2079,6 +2078,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konverzacija"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupna konverzacija"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Lični"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Poslovni"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Lični prikaz"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 2d5d510b30ab..133df6c00109 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1391,8 +1391,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> не падтрымліваецца"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Гэта прылада не падтрымлівае носьбіт <xliff:g id="NAME">%s</xliff:g>. Дакраніцеся, каб наладзіць яго ў фармаце, які падтрымліваецца."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Гэта прылада не падтрымлівае носьбіт <xliff:g id="NAME">%s</xliff:g>. Выберыце, каб наладзіць яго ў фармаце, які падтрымліваецца."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Гэта прылада не падтрымлівае гэты элемент: <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"Носьбіт <xliff:g id="NAME">%s</xliff:g> нечакана выняты"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Адключыце носьбіт перад тым, як дастаць яго, каб не страціць змесціва"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"Носьбіт (<xliff:g id="NAME">%s</xliff:g>) выняты"</string> @@ -2113,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Размова"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групавая размова"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Асабістыя"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Працоўныя"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Прагляд асабістага змесціва"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 7440f20e8942..468b8256c689 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -240,7 +240,7 @@ <string name="global_action_power_options" msgid="1185286119330160073">"Захранване"</string> <string name="global_action_restart" msgid="4678451019561687074">"Рестартиране"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Спешно обаждане"</string> - <string name="global_action_bug_report" msgid="5127867163044170003">"Сигнал за програмна грешка"</string> + <string name="global_action_bug_report" msgid="5127867163044170003">"Сигнал за грешка"</string> <string name="global_action_logout" msgid="6093581310002476511">"Прекратяване на сесията"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Екранна снимка"</string> <string name="bugreport_title" msgid="8549990811777373050">"Сигнал за грешка"</string> @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Разговор"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групов разговор"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Лични"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Служебни"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Личен изглед"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 57255f57c85b..a8cc98620260 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -297,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"আপনার পরিচিতিগুলিতে অ্যাক্সেস"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"লোকেশন"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"এই ডিভাইসের লোকেশন অ্যাক্সেস"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"ক্যালেন্ডার"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"এসএমএসগুলি পাঠাতে এবং দেখতে"</string> @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> অসমর্থিত"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট-আপ করতে আলতো চাপুন।"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট-আপ করতে চাইলে বেছে নিন।"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"এই ডিভাইসে <xliff:g id="NAME">%s</xliff:g> ব্যবহার করা যায় না।"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> অপ্রত্যাশিতভাবে মুছে ফেলা হয়েছে"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"মিডিয়া সরিয়ে নেওয়ার আগে সেটি সিস্টেম থেকে ইজেক্ট করুন, নাহলে কন্টেন্ট সেভ নাও হতে পারে"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> সরানো হয়েছে"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"কথোপকথন"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"গ্রুপ কথোপকথন"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ব্যক্তিগত"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"অফিস"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ব্যক্তিগত ভিউ"</string> @@ -2104,7 +2105,7 @@ <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM Network2 আনলক করতে অনুরোধ করা হচ্ছে…"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM Hrpd আনলক করতে অনুরোধ করা হচ্ছে…"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM পরিষেবা প্রদানকারী আনলক করতে অনুরোধ করা হচ্ছে…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"কর্পোরেট RUIM আনলক করতে অনুরোধ করা হচ্ছে…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"কর্পোরেট RUIM করতে অনুরোধ করা হচ্ছে…"</string> <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN আনলক করার অনুরোধ করা হচ্ছে…"</string> <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP Equivalent Home PLMN আনলক করার অনুরোধ করা হচ্ছে…"</string> <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID আনলক করার অনুরোধ করা হচ্ছে…"</string> @@ -2117,17 +2118,17 @@ <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK আনলক করতে অনুরোধ করা হচ্ছে…"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK আনলক করতে অনুরোধ করা হচ্ছে…"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK আনলক করতে অনুরোধ করা হচ্ছে…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"সিম নেটওয়ার্ক আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"সিম নেটওয়ার্ক সাবসেট আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"সিম পরিষেবা প্রদানকারী আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"কর্পোরেট সিম আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"সিম আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM Network1 আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM Network2 আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM Hrpd আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"কর্পোরেট RUIM আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM পরিষেবা প্রদানকারী আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"সিম নেটওয়ার্ক আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"সিম নেটওয়ার্ক সাবসেট আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"সিম পরিষেবা প্রদানকারী আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"কর্পোরেট সিম আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"সিম আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM Network1 আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM Network2 আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM Hrpd আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"কর্পোরেট RUIM আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM পরিষেবা প্রদানকারী আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM আনলক করার অনুরোধ করা যায়নি।"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK আনলক করা যায়নি।"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK আনলক করা যায়নি।"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK আনলক করা যায়নি।"</string> @@ -2139,11 +2140,11 @@ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK আনলক করা যায়নি।"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK আনলক করা যায়নি।"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK আনলক করা যায়নি।"</string> - <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP Equivalent Home PLMN আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"নেটওয়ার্ক সাবসেট পরিষেবা প্রদানকারী আনলক করার অনুরোধ ব্যর্থ হয়েছে।"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP Equivalent Home PLMN আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI আনলক করার অনুরোধ করা যায়নি।"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"নেটওয়ার্ক সাবসেট পরিষেবা প্রদানকারী আনলক করার অনুরোধ করা যায়নি।"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"সিম নেটওয়ার্ক আনলক করা হয়েছে।"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"সিম নেটওয়ার্ক সাবসেট আনলক করা হয়েছে।"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"সিম পরিষেবা প্রদানকারী আনলক করা হয়েছে।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 37739b92589f..a6aa753cdee0 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2080,6 +2080,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Razgovor"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupni razgovor"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Lično"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Posao"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Prikaz ličnog sadržaja"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index afed753f00b0..b3cb436fff63 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1351,7 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> no és compatible"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"El dispositiu no admet la unitat <xliff:g id="NAME">%s</xliff:g>. Toca per configurar-la amb un format compatible."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Aquest dispositiu no admet la unitat següent: <xliff:g id="NAME">%s</xliff:g>. Selecciona-la per configurar-la en un format compatible."</string> - <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"El dispositiu no admet aquest suport extern: <xliff:g id="NAME">%s</xliff:g>."</string> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"El dispositiu no admet <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"S\'ha extret <xliff:g id="NAME">%s</xliff:g> de manera inesperada"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Expulsa el suport extern abans d\'extreure\'l per evitar perdre\'n el contingut"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"S\'ha suprimit el suport (<xliff:g id="NAME">%s</xliff:g>)"</string> @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grup"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Feina"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualització personal"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index a77d4178aeaa..36adc52ec8f7 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1391,8 +1391,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Úložiště <xliff:g id="NAME">%s</xliff:g> není podporováno"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Úložiště <xliff:g id="NAME">%s</xliff:g> není v tomto zařízení podporováno. Klepnutím zahájíte nastavení v podporovaném formátu."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Úložiště <xliff:g id="NAME">%s</xliff:g> není v tomto zařízení podporováno. Vyberte ho a zahajte nastavení v podporovaném formátu."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Úložiště <xliff:g id="NAME">%s</xliff:g> není v tomto zařízení podporováno."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"Úložiště <xliff:g id="NAME">%s</xliff:g> neočekávaně odpojeno"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Před odebráním médium nejprve odpojte, zabráníte tak ztrátě obsahu"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"Médium <xliff:g id="NAME">%s</xliff:g> bylo odebráno"</string> @@ -2113,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konverzace"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinová konverzace"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Osobní"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Pracovní"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobní zobrazení"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 03d969fa88db..6d8a2b4d21ff 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Samtale"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppesamtale"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personlig"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Arbejde"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visningen Personligt"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 15d3645dce4e..3de322e16ff1 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -438,7 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"Bilder und Videos aufnehmen"</string> <string name="permdesc_camera" msgid="1354600178048761499">"Diese App kann mit der Kamera jederzeit Bilder und Videos aufnehmen."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"Einer App oder einem Dienst Zugriff auf Systemkameras erlauben, um Fotos und Videos aufnehmen zu können"</string> - <string name="permdesc_systemCamera" msgid="5938360914419175986">"Diese privilegierte System-App kann jederzeit mit einer Systemkamera Bilder und Videos aufnehmen. Die App benötigt auch die Berechtigung \"android.permission.CAMERA\"."</string> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"Diese privilegierte App oder System-App kann jederzeit mit einer Systemkamera Bilder und Videos aufnehmen. Die App benötigt auch die Berechtigung \"android.permission.CAMERA\"."</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Einer App oder einem Dienst den Empfang von Callbacks erlauben, wenn eine Kamera geöffnet oder geschlossen wird."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"Diese App kann Callbacks empfangen, wenn eine der Kameras des Geräts von einer Anwendung geöffnet oder geschlossen wird."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"Vibrationsalarm steuern"</string> @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> nicht unterstützt"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zum Einrichten in einem unterstützten Format tippen."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zur Einrichtung eines unterstützten Formats auswählen."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> wurde unerwartet entfernt"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Lass das Speichergerät vor dem Entfernen auswerfen, damit keine Daten verloren gehen"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> wurde entfernt"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Unterhaltung"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppenunterhaltung"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Privat"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Geschäftlich"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Private Ansicht"</string> @@ -2063,21 +2064,21 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Diese Inhalte dürfen nicht mit geschäftlichen Apps geöffnet werden"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Diese Inhalte werden von privaten Apps nicht unterstützt"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Diese Inhalte dürfen nicht mit privaten Apps geöffnet werden"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Entsperr-PIN für Netz-SIM"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Entsperr-PIN für Subnetz-SIM"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Entsperr-PIN für Unternehmens-SIM"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"Entsperr-PIN für Mobilfunkanbieter-SIM"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Entsperr-PIN für netzgebundenes Gerät"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Entsperr-PIN für subnetzgebundenes Gerät"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Entsperr-PIN für unternehmensgebundenes Gerät"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"Entsperr-PIN für mobilfunkanbietergebundenes Gerät"</string> <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"Entsperr-PIN für SIM"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUK eingeben"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUK eingeben"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK eingeben"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK eingeben"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK eingeben"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"Entsperr-PIN für Network1-RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"Entsperr-PIN für Network2-RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"Entsperr-PIN für HRPD-RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"Entsperr-PIN für Unternehmens-RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"Entsperr-PIN für Mobilfunkanbieter-RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"Entsperr-PIN für Network1-gebundenes Gerät"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"Entsperr-PIN für Network2-gebundenes Gerät"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"Entsperr-PIN für HRPD-Netz-gebundenes Gerät"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"Entsperr-PIN für unternehmensgebundenes Gerät"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"Entsperr-PIN für mobilfunkanbietergebundenes Gerät"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"Entsperr-PIN für RUIM"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUK eingeben"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUK eingeben"</string> @@ -2085,49 +2086,49 @@ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUK eingeben"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK eingeben"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK eingeben"</string> - <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"Entsperr-PIN für SPN-SIM"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"Entsperr-PIN für SP-Equivalent-Home-PLMN-SIM"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"Entsperr-PIN für SPN-gebundenes Gerät"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"Entsperr-PIN für SP Equivalent Home PLMN"</string> <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"Entsperr-PIN für ICCID"</string> <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"Entsperr-PIN für IMPI"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"Entsperr-PIN für Subnetz- und Mobilfunkanbieter-SIM"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"Netz-SIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"Subnetz-SIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"Mobilfunkanbieter-SIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Unternehmens-SIM: Entsperrung wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"Entsperr-PIN für subnetz- und mobilfunkanbietergebundenes Gerät"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"Entsperrung des netzgebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"Entsperrung des subnetzgebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"Entsperrung des mobilfunkanbietergebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Entsperrung des unternehmensgebundenen Geräts wird angefordert…"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"Network1-RUIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"Network2-RUIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"HRPD-RUIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"Mobilfunkanbieter-RUIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Unternehmens-RUIM: Entsperrung wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM-Entsperrung wird angefordert…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"Entsperrung des Network1-gebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"Entsperrung des Network2-gebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"Entsperrung des HRPD-Netz-gebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"Entsperrung des mobilfunkanbietergebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Entsperrung des unternehmensgebundenen Geräts wird angefordert…"</string> <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN-SIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP-Equivalent-Home-PLMN: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Subnetz- und Mobilfunkanbieter-SIM: Entsperrung wird angefordert…"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM: Entsperrung angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP-Equivalent-Home-PLMN-Entsperrung wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID-Entsperrung wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI-Entsperrung wird angefordert…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Entsperrung des subnetz- und mobilfunkanbietergebundenen Geräts wird angefordert…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM-Entsperrung angefordert…"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"Entsperrung durch PUK-Eingabe wird angefordert…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"Netz-SIM: Entsperrung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"Subnetz-SIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"Mobilfunkanbieter-SIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Unternehmens-SIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"Network1-RUIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"Network2-RUIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"HRPD-RUIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Unternehmens-RUIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"Mobilfunkanbieter-RUIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM: Entsperranforderung war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"Entsperranforderung für netzgebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"Entsperranforderung für subnetzgebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"Entsperranforderung für mobilfunkanbietergebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Entsperranforderung für unternehmensgebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"Entsperranforderung für SIM war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"Entsperranforderung für Network1-gebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"Entsperranforderung für Network2-gebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"Entsperranforderung für HRPD-Netz-gebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Entsperranforderung für unternehmensgebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"Entsperranforderung für mobilfunkanbietergebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"Entsperranforderung für RUIM war nicht erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"Entsperrung durch PUK-Eingabe war nicht erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"Entsperrung durch PUK-Eingabe war nicht erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"Entsperrung durch PUK-Eingabe war nicht erfolgreich."</string> @@ -2139,22 +2140,22 @@ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"Entsperrung durch PUK-Eingabe war nicht erfolgreich."</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"Entsperrung durch PUK-Eingabe war nicht erfolgreich."</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"Entsperrung durch PUK-Eingabe war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN-SIM: Entsperrungsanforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP-Equivalent-Home-PLMN: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI: Entsperrung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Subnetz- und Mobilfunkanbieter-SIM: Entsperranforderung war nicht erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"Subnetz-SIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"Subnetz-SIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"Mobilfunkanbieter-SIM: Entsperranforderung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Unternehmens-SIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"Network1-RUIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"Network2-RUIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"HRPD-RUIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"Mobilfunkanbieter-RUIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Unternehmens-RUIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM: Entsperrung war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"Entsperranforderung für SPN-gebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"Entsperranforderung für SP Equivalent Home PLMN war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"Entsperranforderung für ICCID war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"Entsperranforderung für IMPI war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Entsperranforderung für subnetz- und mobilfunkanbietergebundenes Gerät war nicht erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"Entsperrung des subnetzgebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"Entsperrung des subnetzgebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"Entsperrung des mobilfunkanbietergebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Entsperrung des unternehmensgebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM-Entsperrung war erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"Entsperrung des Network1-gebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"Entsperrung des Network2-gebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"Entsperrung des HRPD-Netz-gebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"Entsperrung des mobilfunkanbietergebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Entsperrung des unternehmensgebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM-Entsperrung war erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"Entsperrung durch PUK-Eingabe war erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"Entsperrung durch PUK-Eingabe war erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"Entsperrung durch PUK-Eingabe war erfolgreich."</string> @@ -2166,9 +2167,9 @@ <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"Entsperrung durch PUK-Eingabe war erfolgreich."</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"Entsperrung durch PUK-Eingabe war erfolgreich."</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"Entsperrung durch PUK-Eingabe war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN-SIM: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP-Equivalent-Home-PLMN: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI: Entsperrung war erfolgreich."</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Subnetz- und Mobilfunkanbieter-SIM: Entsperrung war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"Entsperrung des SPN-gebundenen Geräts war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP-Equivalent-Home-PLMN-Entsperrung war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID-Entsperrung war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI-Entsperrung war erfolgreich."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Entsperrung des subnetz- und mobilfunkanbietergebundenen Geräts war erfolgreich."</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 2c22a120efcd..57b02f44954a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Συνομιλία"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ομαδική συνομιλία"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Προσωπικό"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Εργασία"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Προσωπική προβολή"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index bcaff2ee5153..ea121ef6c0e9 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index dfd80d440188..a5bbb418b686 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index bcaff2ee5153..ea121ef6c0e9 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index bcaff2ee5153..ea121ef6c0e9 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 96a983ed084c..2777e0ecf939 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group Conversation"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index f37ac16a9404..366d19db16b8 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -438,7 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"tomar fotografías y grabar videos"</string> <string name="permdesc_camera" msgid="1354600178048761499">"Esta app puede tomar fotos y grabar videos con la cámara en cualquier momento."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"Permitir que una aplicación o un servicio accedan a las cámaras del sistema para tomar fotos y grabar videos"</string> - <string name="permdesc_systemCamera" msgid="5938360914419175986">"Esta app con privilegios o del sistema puede tomar fotografías y grabar videos con una cámara del sistema en cualquier momento. También se requiere que la app posea el permiso android.permission.CAMERA."</string> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"Esta app del sistema o con privilegios puede tomar fotografías y grabar videos con una cámara del sistema en cualquier momento. Para ello, requiere tener el permiso android.permission.CAMERA."</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Permite que una aplicación o un servicio reciba devoluciones de llamada cuando se abren o cierran dispositivos de cámara."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"Esta app puede recibir devoluciones de llamada cuando se cierra o se abre cualquier dispositivo de cámara (y qué aplicación lo hace)."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"controlar la vibración"</string> @@ -1620,12 +1620,12 @@ <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"¿Usar acceso directo de accesibilidad?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Cuando la combinación de teclas está activada, puedes presionar los botones de volumen durante 3 segundos para iniciar una función de accesibilidad."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"¿Quieres activar las funciones de accesibilidad?"</string> - <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Si mantienes presionadas ambas teclas de volumen durante unos segundos, se activan las funciones de accesibilidad. Esto podría cambiar la manera en que funciona tu dispositivo.\n\nFunciones actuales:\n<xliff:g id="SERVICE">%1$s</xliff:g>\npuedes cambiar las funciones seleccionadas en Configuración > Accesibilidad."</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Si mantienes presionadas ambas teclas de volumen durante unos segundos, se activarán las funciones de accesibilidad. Esto podría cambiar la manera en la que funciona tu dispositivo.\n\nFunciones actuales:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPuedes cambiar las funciones seleccionadas en Configuración > Accesibilidad."</string> <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> - <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"Cómo activar TalkBack"</string> - <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Si mantienes presionadas ambas teclas de volumen durante unos segundos, se activa TalkBack, un lector de pantalla que ayuda a las personas ciegas o con visión reducida. TalkBack cambia por completo la manera en que funciona tu dispositivo.\n\nPuedes cambiar este acceso directo a otra función en Configuración > Accesibilidad."</string> - <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"Cómo activar <xliff:g id="SERVICE">%1$s</xliff:g>"</string> - <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Si mantienes presionadas ambas teclas de volumen durante unos segundos, se activa <xliff:g id="SERVICE">%1$s</xliff:g>, un función de accesibilidad. Esto podría cambiar la forma en que funciona tu dispositivo.\n\nPuedes cambiar este acceso directo a otra función en Configuración > Accesibilidad."</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"¿Quieres activar TalkBack?"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Si mantienes presionadas ambas teclas de volumen durante unos segundos, se activará TalkBack, un lector de pantalla que ayuda a las personas ciegas o con visión reducida. TalkBack cambia por completo la manera en la que funciona tu dispositivo.\n\nPuedes cambiar este acceso directo a otra función en Configuración > Accesibilidad."</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"¿Quieres activar <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Si mantienes presionadas ambas teclas de volumen durante unos segundos, se activará la función de accesibilidad <xliff:g id="SERVICE">%1$s</xliff:g>. Esto podría cambiar la forma en que funciona tu dispositivo.\n\nPuedes cambiar este acceso directo a otra función en Configuración > Accesibilidad."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activar"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"No activar"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"¿Deseas permitir que <xliff:g id="SERVICE">%1$s</xliff:g> tenga el control total del dispositivo?"</string> @@ -1639,7 +1639,7 @@ <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Rechazar"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Presiona una función para comenzar a usarla:"</string> <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Selecciona las funciones a utilizar con el botón de accesibilidad"</string> - <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Selecciona las funciones a utilizar con el acceso directo de la tecla de volumen"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Selecciona las funciones a utilizar con la combinación de teclas de volumen"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Se desactivó <xliff:g id="SERVICE_NAME">%s</xliff:g>"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Editar accesos directos"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Listo"</string> @@ -1647,15 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Usar acceso directo"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"Inversión de color"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"Corrección de color"</string> - <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Mantuviste presionadas las teclas de volumen. Se activó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> - <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Mantuviste presionadas las teclas de volumen. Se desactivó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Al mantener presionadas las teclas de volumen, se activó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Al mantener presionadas las teclas de volumen, se desactivó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Mantén presionadas ambas teclas de volumen durante tres segundos para usar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Elige una función para usar cuando pulses el botón accesibilidad:"</string> <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Elige la función que se usará cuando realices el gesto de accesibilidad (deslizar dos dedos hacia arriba desde la parte inferior de la pantalla):"</string> <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Elige la función que se usará cuando realices el gesto de accesibilidad (deslizar tres dedos hacia arriba desde la parte inferior de la pantalla):"</string> - <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Para cambiar entre funciones, mantén pulsado el botón de accesibilidad."</string> - <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Para cambiar de función, desliza dos dedos hacia arriba y mantenlos pulsados sobre la pantalla."</string> - <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Para cambiar de función, desliza tres dedos hacia arriba y mantenlos pulsados sobre la pantalla."</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Para cambiar entre funciones, mantén presionado el botón de accesibilidad."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Para cambiar de función, desliza dos dedos hacia arriba y mantén presionada la pantalla."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Para cambiar de función, desliza tres dedos hacia arriba y mantén presionada la pantalla."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliación"</string> <string name="user_switched" msgid="7249833311585228097">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="1912993630661332336">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -2026,7 +2026,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos más</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo más</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay personas recomendadas para compartir"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay personas recomendadas con las que compartir"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Aunque no se le otorgó permiso de grabación a esta app, puede capturar audio con este dispositivo USB."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Página principal"</string> @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversación"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversación en grupo"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"+<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Trabajo"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista personal"</string> @@ -2062,112 +2063,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Las apps de trabajo no pueden abrir este contenido"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Las apps personales no pueden admitir este contenido"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Las apps personales no pueden abrir este contenido"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo de red de tarjeta SIM"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN de desbloqueo de subconjunto de redes de tarjeta SIM"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN de desbloqueo corporativo de tarjeta SIM"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"PIN de desbloqueo de proveedor de servicios de tarjeta SIM"</string> - <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"PIN de desbloqueo de tarjeta SIM"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo del dispositivo para la red de tarjeta SIM"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN de desbloqueo del dispositivo para el subconjunto de redes de tarjeta SIM"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN de desbloqueo corporativo del dispositivo para tarjeta SIM"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"PIN de desbloqueo del dispositivo para el proveedor de servicios de tarjeta SIM"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"PIN de desbloqueo del dispositivo para tarjeta SIM"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"Ingresar PUK"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"PIN de desbloqueo de red1 de RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"PIN de desbloqueo del RUIM de network2"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"PIN de desbloqueo de HRPD de RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"PIN de desbloqueo corporativo de RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"PIN de desbloqueo de proveedor de servicios de RUIM"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"PIN de desbloqueo de RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"PIN de desbloqueo del dispositivo para Network1 de RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"PIN de desbloqueo del dispositivo para Network2 de RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"PIN de desbloqueo del dispositivo para la red HRPD"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"PIN de desbloqueo corporativo del dispositivo para RUIM"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"PIN de desbloqueo del dispositivo para el proveedor de servicios de RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"PIN de desbloqueo del dispositivo para RUIM"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"Ingresar PUK"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"Ingresar PUK"</string> - <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"PIN de desbloqueo de SPN"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"PIN de desbloqueo de PLMN del SP equivalente a la de hogar"</string> - <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"PIN de desbloqueo de ICCID"</string> - <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"PIN de desbloqueo de IMPI"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"PIN de desbloqueo de proveedor de servicios de subconjunto de redes"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"Solicitando desbloqueo de red de tarjeta SIM…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"Solicitando desbloqueo de subconjunto de redes de tarjeta SIM…"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"Solicitando desbloqueo de proveedor de servicios de tarjeta SIM…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Solicitando desbloqueo corporativo de tarjeta SIM…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"Solicitando desbloqueo de tarjeta SIM…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"Solicitando desbloqueo de red1 de RUIM…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"Solicitando desbloqueo de red2 de RUIM…"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"Solicitando desbloqueo de HRPD de RUIM…"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"Solicitando desbloqueo de proveedor de servicios de RUIM…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Solicitando desbloqueo corporativo de RUIM…"</string> - <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"Solicitando desbloqueo de SPN…"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"Solicitando desbloqueo de PLMN del SP equivalente a la de hogar…"</string> - <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"Solicitando desbloqueo de ICCID…"</string> - <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"Solicitando desbloqueo de IMPI…"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Solicitando desbloqueo de proveedor de servicios de subconjunto de redes…"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"Solicitando desbloqueo de RUIM…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"Solicitando desbloqueo de PUK…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"Se produjo un error al solicitar el desbloqueo de red de tarjeta SIM."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"Se produjo un error al solicitar el desbloqueo de subconjunto de redes de tarjeta SIM."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"Se produjo un error al solicitar el desbloqueo de proveedor de servicios de tarjeta SIM."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Solicitud de desbloqueo corporativo de tarjeta SIM incorrecta."</string> - <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"Solicitud de desbloqueo de tarjeta SIM incorrecta."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"Se produjo un error al solicitar el desbloqueo de red1 de RUIM."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"Se produjo un error al desbloquear el RUIM de Network2."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"Se produjo un error al solicitar el desbloqueo de HRPD de RUIM."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Se produjo un error al solicitar el desbloqueo corporativo de RUIM."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"Se produjo un error al solicitar el desbloqueo del proveedor de servicios de RUIM."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"Se produjo un error al desbloquear el RUIM."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"Se produjo un error al desbloquear el PUK."</string> - <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"Se produjo un error al solicitar el desbloqueo de SPN incorrecta."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"Se produjo un error al solicitar el desbloqueo de PLMN del SP equivalente a la de hogar."</string> - <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"Se produjo un error al solicitar el desbloqueo de ICCID."</string> - <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"Se produjo un error al desbloquear el IMPI."</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Se produjo error al solicitar el desbloqueo de proveedor de servicios de subconjunto de redes."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"Se desbloqueó correctamente la red de la SIM."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"Se desbloqueó correctamente el subconjunto de redes de tarjeta SIM."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"Se desbloqueó correctamente el proveedor de servicios de tarjeta SIM."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Desbloqueo corporativo de tarjeta SIM correcto."</string> - <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"Desbloqueo de tarjeta SIM correcto."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"Se desbloqueó correctamente el RUIM de Network1."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"Se desbloqueó correctamente el RUIM de Network 2."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"Se produjo un error al desbloquear el HRPD de RUIM."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"Se desbloqueó correctamente el proveedor de servicios de RUIM."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Se desbloqueó correctamente el RUIM corporativo."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"Se desbloqueó correctamente el RUIM."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"Se desbloqueó correctamente el PUK."</string> - <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"Desbloqueo de SPN correcto."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"Se desbloqueó correctamente el PLMN del SP equivalente a la de hogar."</string> - <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Se desbloqueó correctamente el ICCID."</string> - <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Se desbloqueó correctamente el IMPI."</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Se desbloqueó correctamente el proveedor de servicios de subconjunto de redes."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"PIN de desbloqueo del dispositivo para un valor SPN"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"PIN de desbloqueo del dispositivo para el SP del EHPLMN"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"PIN de desbloqueo del dispositivo para ICCID"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"PIN de desbloqueo del dispositivo para IMPI"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"PIN de desbloqueo del dispositivo para el proveedor de servicios del subconjunto de redes"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"Solicitando desbloqueo para la red de tarjeta SIM…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"Solicitando desbloqueo para el subconjunto de redes de tarjeta SIM…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"Solicitando desbloqueo para el proveedor de servicios de tarjeta SIM…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Solicitando desbloqueo corporativo para tarjeta SIM…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"Solicitando desbloqueo para tarjeta SIM…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"Solicitando desbloqueo para Network1 de RUIM…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"Solicitando desbloqueo para Network2 de RUIM…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"Solicitando desbloqueo para la red HRPD…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"Solicitando desbloqueo para el proveedor de servicios de RUIM…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Solicitando desbloqueo corporativo para RUIM…"</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"Solicitando desbloqueo para un valor de SPN…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"Solicitando desbloqueo para el SP del EHPLMN…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"Solicitando desbloqueo para ICCID…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"Solicitando desbloqueo para IMPI…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Solicitando desbloqueo para el proveedor de servicios del subconjunto de redes…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"Solicitando desbloqueo para RUIM…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"Solicitando desbloqueo con el PUK…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"Se produjo un error al solicitar el desbloqueo del dispositivo para la red de tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"Se produjo un error al solicitar el desbloqueo del dispositivo para el subconjunto de redes de tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"Se produjo un error al solicitar el desbloqueo del dispositivo para el proveedor de servicios de tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Se produjo un error al solicitar el desbloqueo corporativo del dispositivo para tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"Se produjo un error al solicitar el desbloqueo del dispositivo para tarjeta SIM."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"Se produjo un error al solicitar el desbloqueo del dispositivo para Network1 de RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"Se produjo un error al desbloquear el dispositivo para Network2 de RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"Se produjo un error al solicitar el desbloqueo del dispositivo para la red HRPD."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Se produjo un error al solicitar el desbloqueo corporativo del dispositivo para RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"Se produjo un error al solicitar el desbloqueo del dispositivo para el proveedor de servicios de RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"Se produjo un error al solicitar el desbloqueo para RUIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"Se produjo un error al desbloquear el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"Se produjo un error al solicitar el desbloqueo del dispositivo para un valor SPN."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"Se produjo un error al solicitar el desbloqueo del dispositivo para el SP del EHPLMN."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"Se produjo un error al solicitar el desbloqueo del dispositivo para ICCID."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"Se produjo un error al desbloquear el dispositivo para IMPI."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Se produjo un error al solicitar el desbloqueo del dispositivo para el proveedor de servicios del subconjunto de redes."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"Se desbloqueó correctamente el dispositivo para la red de tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"Se desbloqueó correctamente el dispositivo para el subconjunto de redes de tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"Se desbloqueó correctamente el dispositivo para el proveedor de servicios de tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Desbloqueo corporativo exitoso para tarjeta SIM."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"Se desbloqueó correctamente el dispositivo para tarjeta SIM."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"Se desbloqueó correctamente el dispositivo para Network1 de RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"Se desbloqueó correctamente Network2 para RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"Se produjo un error al desbloquear el dispositivo para la red HRPD."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"Desbloqueo del proveedor de servicios exitoso para RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Desbloqueo corporativo exitoso para RUIM."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"Se desbloqueó correctamente el dispositivo para RUIM."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"Se desbloqueó correctamente el dispositivo con el PUK."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"Se desbloqueó correctamente el dispositivo para un valor de SPN."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"Se desbloqueó correctamente el dispositivo para el SP del EHPLMN."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Se desbloqueó correctamente el dispositivo para ICCID."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Se desbloqueó correctamente el dispositivo para IMPI."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Se desbloqueó correctamente el dispositivo para el proveedor de servicios del subconjunto de redes."</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index d4dafdf22056..197a47cd20ac 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversación"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversación de grupo"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Trabajo"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ver contenido personal"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 26d918775609..2e9ea38e7aa2 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Vestlus"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupivestlus"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Isiklik"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Töö"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Isiklik vaade"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index e2e4433750e5..9af4b68a071a 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Ez da onartzen <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Gailuak ez du <xliff:g id="NAME">%s</xliff:g> onartzen. Sakatu onartzen den formatu batean konfiguratzeko."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Gailuak ez du <xliff:g id="NAME">%s</xliff:g> onartzen. Hauta ezazu onartzen den formatu batean konfiguratzeko."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Gailuak ez du onartzen <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ustekabean kendu da"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Kendu aurretik, kanporatu euskarria edukirik ez galtzeko"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"Kendu egin da <xliff:g id="NAME">%s</xliff:g>"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Elkarrizketa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Taldeko elkarrizketa"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Pertsonala"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Lanekoa"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ikuspegi pertsonala"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 710950bfcc3a..e25dc34614d5 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> پشتیبانی نشده"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"این دستگاه از این <xliff:g id="NAME">%s</xliff:g> پشتیبانی نمیکند. برای نصب آن در قالب پشتیبانیشده ضربه بزنید."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"این دستگاه از این <xliff:g id="NAME">%s</xliff:g> پشتیبانی نمیکند. برای تنظیم در یک قالب پشتیبانیشده، آن را انتخاب کنید."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"این دستگاه از این <xliff:g id="NAME">%s</xliff:g> پشتیبانی نمیکند."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> بهطور غیرمنتظره جدا شد"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"برای جلوگیری از از دست رفتن محتوا، رسانه را قبل از برداشتن بیرون برانید"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> برداشته شد"</string> @@ -2045,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"مکالمه"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"مکالمه گروهی"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"+<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"شخصی"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"کاری"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"نمای شخصی"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 6883b2392bcd..b62d8b02cbe3 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Epäyhteensopiva <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"<xliff:g id="NAME">%s</xliff:g> ei ole yhteensopiva tämän laitteen kanssa. Ota se käyttöön tuetussa tilassa napauttamalla."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Tämä laite ei tue laitetta <xliff:g id="NAME">%s</xliff:g>. Valitse laite, niin voit suorittaa määrityksen tuetussa muodossa."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"<xliff:g id="NAME">%s</xliff:g> ei ole yhteensopiva tämän laitteen kanssa."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> poistettiin yllättäen"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Poista media ennen sen irrottamista, niin et menetä sisältöä."</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> poistettu"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Keskustelu"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ryhmäkeskustelu"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Henkilökohtainen"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Työ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Henkilökohtainen näkymä"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 0e64840ab77b..84c1c18151b6 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversation de groupe"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personnel"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Bureau"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Affichage personnel"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 0a310f87b85c..1de01a3d738d 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversation de groupe"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personnel"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Professionnel"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vue personnelle"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index ad3f4789b139..1f6e4d74f696 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grupo"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Persoal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Traballo"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista persoal"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 90c23f8d04ff..29a984773c31 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -237,10 +237,8 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"ફોન વિકલ્પો"</string> <string name="global_action_lock" msgid="6949357274257655383">"સ્ક્રીન લૉક"</string> <string name="global_action_power_off" msgid="4404936470711393203">"પાવર બંધ"</string> - <!-- no translation found for global_action_power_options (1185286119330160073) --> - <skip /> - <!-- no translation found for global_action_restart (4678451019561687074) --> - <skip /> + <string name="global_action_power_options" msgid="1185286119330160073">"પાવર"</string> + <string name="global_action_restart" msgid="4678451019561687074">"ફરી શરૂ કરો"</string> <string name="global_action_emergency" msgid="1387617624177105088">"કટોકટી"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"બગ રિપોર્ટ"</string> <string name="global_action_logout" msgid="6093581310002476511">"સત્ર સમાપ્ત કરો"</string> @@ -299,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"તમારા સંપર્કોને ઍક્સેસ કરવાની"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"સ્થાન"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"કૅલેન્ડર"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"તમારા કેલેન્ડરને ઍક્સેસ કરવાની"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS સંદેશા મોકલવાની અને જોવાની"</string> @@ -440,8 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"ચિત્રો અને વિડિઓઝ લો"</string> <string name="permdesc_camera" msgid="1354600178048761499">"આ ઍપ્લિકેશન, કૅમેરાનો ઉપયોગ કરીને કોઈપણ સમયે ચિત્રો લઈ અને વિડિઓઝ રેકોર્ડ કરી શકે છે."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ઍપ્લિકેશન અથવા સેવા ઍક્સેસને સિસ્ટમ કૅમેરાનો ઉપયોગ કરીને ફોટા અને વીડિયો લેવાની મંજૂરી આપો"</string> - <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> - <skip /> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"આ વિશેષાધિકૃત અથવા સિસ્ટમ ઍપ કોઈપણ સમયે સિસ્ટમ કૅમેરાનો ઉપયોગ કરીને ફોટા લઈ અને વીડિયો રેકૉર્ડ કરી શકે છે. ઍપ દ્વારા આયોજિત કરવા માટે android.permission.CAMERAની પરવાનગી પણ જરૂરી છે"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"કૅમેરા ડિવાઇસ ચાલુ કે બંધ થવા વિશે કૉલબૅક પ્રાપ્ત કરવાની ઍપ્લિકેશન કે સેવાને મંજૂરી આપો."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"જ્યારે કોઈ કૅમેરા ડિવાઇસ (કયા ઍપ્લિકેશન વડે) ખોલવા કે બંધ કરવામાં આવે, ત્યારે આ ઍપ કૉલબૅક પ્રાપ્ત કરી શકે છે."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"વાઇબ્રેશન નિયંત્રિત કરો"</string> @@ -1354,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"અસમર્થિત <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"આ ઉપકરણ આ <xliff:g id="NAME">%s</xliff:g> નું સમર્થન કરતું નથી. સમર્થિત ફોર્મેટમાં સેટ કરવા માટે ટૅપ કરો."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"આ ઉપકરણ આ <xliff:g id="NAME">%s</xliff:g> નું સમર્થન કરતું નથી. સમર્થિત ફૉર્મેટમાં સેટ કરવા માટે પસંદ કરો."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"આ ડિવાઇસમાં આ <xliff:g id="NAME">%s</xliff:g> માટે સુવિધા નથી."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> અનપેક્ષિત રીતે દૂર કર્યું"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"કન્ટેન્ટ ગુમાવવાનું ટાળવા માટે મીડિયાને દૂર કરતા પહેલાં બહાર કાઢો"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> કાઢી નાખ્યું"</string> @@ -1623,24 +1619,15 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"ભલામણ કરેલ સ્તરની ઉપર વૉલ્યૂમ વધાર્યો?\n\nલાંબા સમય સુધી ઊંચા અવાજે સાંભળવું તમારી શ્રવણક્ષમતાને નુકસાન પહોંચાડી શકે છે."</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ઍક્સેસિબિલિટી શૉર્ટકટનો ઉપયોગ કરીએ?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"જ્યારે શૉર્ટકટ ચાલુ હોય, ત્યારે બન્ને વૉલ્યૂમ બટનને 3 સેકન્ડ સુધી દબાવી રાખવાથી ઍક્સેસિબિલિટી સુવિધા શરૂ થઈ જશે."</string> - <!-- no translation found for accessibility_shortcut_multiple_service_warning_title (8417489297036013065) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_warning (3740723309483706911) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_list (6935581470716541531) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning_title (3410100187167382427) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning (8412954203626349109) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning_title (2819109500943271385) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning (6363127705112844257) --> - <skip /> - <!-- no translation found for accessibility_shortcut_on (5463618449556111344) --> - <skip /> - <!-- no translation found for accessibility_shortcut_off (3651336255403648739) --> - <skip /> + <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"ઍક્સેસિબિલિટી સુવિધાઓ ચાલુ કરીએ?"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"બન્ને વૉલ્યૂમ કીને થોડી સેકન્ડ સુધી દબાવી રાખવાથી ઍક્સેસિબિલિટી સુવિધાઓ ચાલુ થઈ જાય છે. આનાથી તમારા ડિવાઇસની કામ કરવાની રીત બદલાઈ શકે છે.\n\nવર્તમાન સુવિધાઓ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nતમે સેટિંગ > ઍક્સેસિબિલિટીમાં જઈને પસંદ કરેલી સુવિધાઓને બદલી શકો છો."</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"ટૉકબૅક ચાલુ કરીએ?"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"બન્ને વૉલ્યૂમ કીને થોડી સેકન્ડ સુધી દબાવી રાખવાથી ટૉકબૅક ચાલુ થઈ જાય છે, જે એક સ્ક્રીન રીડર છે કે જે દૃષ્ટિહીન અથવા ઓછી દૃષ્ટિવાળા લોકોને સહાયરૂપ થઈ શકે છે. ટૉકબૅકથી તમારા ડિવાઇસની કામ કરવાની રીત પૂર્ણપણે બદલાઈ જાય છે.\n\nતમે સેટિંગ > ઍક્સેસિબિલિટીમાં જઈને આ શૉર્ટકટને બીજી સુવિધામાં બદલી શકો છો."</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g>ને ચાલુ કરીએ?"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"બન્ને વૉલ્યૂમ કીને થોડી સેકન્ડ સુધી દબાવી રાખવાથી ઍક્સેસિબિલિટી સુવિધા એવી <xliff:g id="SERVICE">%1$s</xliff:g> ચાલુ થઈ જાય છે. આનાથી તમારા ડિવાઇસની કામ કરવાની રીત બદલાઈ શકે છે.\n\nતમે સેટિંગ > ઍક્સેસિબિલિટીમાં જઈને આ શૉર્ટકટને બીજી સુવિધામાં બદલી શકો છો."</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ચાલુ કરો"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"ચાલુ કરશો નહીં"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"શું <xliff:g id="SERVICE">%1$s</xliff:g>ને તમારા ડિવાઇસના સંપૂર્ણ નિયંત્રણની મંજૂરી આપીએ?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"જો તમે <xliff:g id="SERVICE">%1$s</xliff:g> ચાલુ કરશો, તો તમારું ડિવાઇસ ડેટા એન્ક્રિપ્શનને બહેતર બનાવવા તમારા સ્ક્રીન લૉકનો ઉપયોગ કરશે નહીં."</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"ઍક્સેસિબિલિટી સંબંધિત આવશ્યકતા માટે સહાય કરતી ઍપ માટે સંપૂર્ણ નિયંત્રણ યોગ્ય છે, પણ મોટા ભાગની ઍપ માટે યોગ્ય નથી."</string> @@ -1651,10 +1638,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"મંજૂરી આપો"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"નકારો"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"સુવિધાનો ઉપયોગ શરૂ કરવા તેના પર ટૅપ કરો:"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_button_title (239446795930436325) --> - <skip /> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (1077294237378645981) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ઍક્સેસિબિલિટી બટન વડે તમે ઉપયોગમાં લેવા માગો છો તે સુવિધાઓ પસંદ કરો"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"વૉલ્યૂમ કી શૉર્ટકટ વડે તમે ઉપયોગમાં લેવા માગો છો તે સુવિધાઓ પસંદ કરો"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> બંધ કરવામાં આવ્યું છે"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"શૉર્ટકટમાં ફેરફાર કરો"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"થઈ ગયું"</string> @@ -1662,23 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"શૉર્ટકટનો ઉપયોગ કરો"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"રંગનો વ્યુત્ક્રમ"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"રંગ સુધારણા"</string> - <!-- no translation found for accessibility_shortcut_enabling_service (5473495203759847687) --> - <skip /> - <!-- no translation found for accessibility_shortcut_disabling_service (8675244165062700619) --> - <skip /> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"વૉલ્યૂમ કી દબાવી રાખો. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ચાલુ કરી."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"વૉલ્યૂમ કી દબાવી રાખો. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> બંધ કરી."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>નો ઉપયોગ કરવા માટે બન્ને વૉલ્યૂમ કીને ત્રણ સેકન્ડ સુધી દબાવી રાખો"</string> - <!-- no translation found for accessibility_button_prompt_text (8343213623338605305) --> - <skip /> - <!-- no translation found for accessibility_gesture_prompt_text (8742535972130563952) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_prompt_text (5211827854510660203) --> - <skip /> - <!-- no translation found for accessibility_button_instructional_text (8853928358872550500) --> - <skip /> - <!-- no translation found for accessibility_gesture_instructional_text (9196230728837090497) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_instructional_text (3425123684990193765) --> - <skip /> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"જ્યારે તમે ઍક્સેસિબિલિટી બટન પર ટૅપ કરો, ત્યારે ઉપયોગ કરવાની સુવિધા પસંદ કરો:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ઍક્સેસિબિલિટી સંકેત સાથે ઉપયોગ કરવાની સુવિધા પસંદ કરો (બે આંગળીઓ વડે સ્ક્રીનના નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરવા માટે):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ઍક્સેસિબિલિટી સંકેત સાથે ઉપયોગ કરવાની સુવિધા પસંદ કરો (ત્રણ આંગળીઓ વડે સ્ક્રીનના નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરવા માટે):"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"કોઈ એક સુવિધાથી બીજી સુવિધા પર સ્વિચ કરવા માટે, ઍક્સેસિબિલિટી બટનને ટચ કરીને થોડીવાર દબાવી રાખો."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"કોઈ એક સુવિધાથી બીજી સુવિધા પર સ્વિચ કરવા માટે, બે આંગળીઓ વડે સ્ક્રીનની ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"કોઈ એક સુવિધાથી બીજી સુવિધા પર સ્વિચ કરવા માટે, ત્રણ આંગળીઓ વડે સ્ક્રીનની ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"વિસ્તૃતીકરણ"</string> <string name="user_switched" msgid="7249833311585228097">"વર્તમાન વપરાશકર્તા <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> પર સ્વિચ કરી રહ્યાં છે…"</string> @@ -2049,8 +2026,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item> </plurals> - <!-- no translation found for chooser_no_direct_share_targets (1511722103987329028) --> - <skip /> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"શેર કરવા માટે સૂચન આપવામાં આવેલા કોઈ લોકો નથી"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ઍપની સૂચિ"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"આ ઍપને રેકૉર્ડ કરવાની પરવાનગી આપવામાં આવી નથી પરંતુ તે આ USB ડિવાઇસ મારફતે ઑડિયો કૅપ્ચર કરી શકે છે."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"હોમ"</string> @@ -2068,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"વાતચીત"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ગ્રૂપ વાતચીત"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"વ્યક્તિગત"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"કાર્યાલય"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"વ્યક્તિગત વ્યૂ"</string> @@ -2086,220 +2064,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"કોઈ ઑફિસ માટેની ઍપ આ કન્ટેન્ટ ખોલી શકતી નથી"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"કોઈ વ્યક્તિગત ઍપ આ કન્ટેન્ટને સપોર્ટ કરી શકતી નથી"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"કોઈ વ્યક્તિગત ઍપ આ કન્ટેન્ટ ખોલી શકતી નથી"</string> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ENTRY (8050953231914637819) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY (7164399703751688214) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ENTRY (4447629474818217364) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY (973059024670737358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ENTRY (4487435301206073787) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY (768060297218652809) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY (7129527319490548930) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY (2876126640607573252) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY (8952595089930109282) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ENTRY (3013902515773728996) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ENTRY (2974411408893410289) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ENTRY (687618528751880721) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ENTRY (6810596579655575381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ENTRY (2715929642540980259) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY (8557791623303951590) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ENTRY (7382468767274580323) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY (6730880791104286987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY (6432126539782267026) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY (1730510161529488920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY (3369885925003346830) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY (9129139686191167829) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY (2869929685874615358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ENTRY (1238663472392741771) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY (3988705848553894358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ENTRY (6186770686690993200) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ENTRY (7043865376145617024) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ENTRY (6144227308185112176) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS (4233355366318061180) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS (6742563947637715645) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS (2033399698172403560) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS (4795977251920732254) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS (1090425878157254446) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS (6476898876518094438) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS (6006806734293747731) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (6546680489620881893) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS (3506845511000727015) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_IN_PROGRESS (6709169861932992750) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS (4013870911606478520) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS (9032651188219523434) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS (6584576506344491207) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS (830981927724888114) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS (7851790973098894802) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_IN_PROGRESS (1149560739586960121) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS (5708964693522116025) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS (7288103122966483455) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS (4036752174056147753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS (5089536274515338566) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS (6737197986936251958) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS (5658767775619998623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS (665978313257653727) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS (3857142652251836850) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS (2695664012344346788) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (2695678959963807782) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS (1230605365926493599) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ERROR (1924844017037151535) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR (3372797822292089708) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR (1878443146720411381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ERROR (7664778312218023192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ERROR (2472944311643350302) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ERROR (828089694480999120) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ERROR (17619001007092511) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ERROR (807214229604353614) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ERROR (8644184447744175747) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR (3801002648649640407) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ERROR (707397021218680753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR (894358680773257820) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR (352466878146726991) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR (7353389721907138671) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR (2655263155490857920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ERROR (6903740900892931310) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR (5165901670447518687) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR (2856763216589267623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR (817542684437829139) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR (5178635064113393143) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR (5391587926974531008) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR (4895494864493315868) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ERROR (9017576601595353649) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR (1116993930995545742) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ERROR (7559167306794441462) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ERROR (2782926139511136588) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ERROR (1890493954453456758) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUCCESS (4886243367747126325) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS (4053809277733513987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS (8249342930499801740) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_SUCCESS (2339794542560381270) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_SUCCESS (6975608174152828954) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS (2846699261330463192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS (5335414726057102801) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_SUCCESS (8868100318474971969) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS (6020936629725666932) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS (6944873647584595489) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_SUCCESS (2526483514124121988) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS (7662200333621664621) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS (2861223407953766632) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS (5345648571175243272) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS (3725278343103422466) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS (6998502547560297983) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS (8555433771162560361) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS (3555767296933606232) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS (6778051818199974237) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS (4080108758498911429) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS (7873675303000794343) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS (1763198215069819523) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_SUCCESS (2053891977727320532) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS (8146602361895007345) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_SUCCESS (8058678548991999545) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_SUCCESS (2545608067978550571) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_SUCCESS (4352382949744625007) --> - <skip /> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"સિમ નેટવર્કને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"સિમ નેટવર્ક સબસેટને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"સિમ કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"સિમ સેવા પ્રદાતાના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"સિમને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM network1ના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM network2ના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM hrpdને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"RUIM કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM સેવા પ્રદાતાના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIMના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK દાખલ કરો"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPNને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP Equivalent Home PLMNને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCIDને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPIને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"નેટવર્ક સબસેટ સેવા પ્રદાતાના લૉકને અનલૉક કરવાનો પિન"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"સિમ નેટવર્કને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"સિમ નેટવર્ક સબસેટને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"સિમ સેવા પ્રદાતાના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"સિમ કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"સિમને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM network1ના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM network2ના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM hrpdને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM સેવા પ્રદાતાના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"RUIM કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPNને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP Equivalent Home PLMNને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCIDને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPIને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"નેટવર્ક સબસેટ સેવા પ્રદાતાના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIMના લૉકને અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK વડે અનલૉક કરવાની વિનંતી કરી રહ્યાં છીએ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"સિમ નેટવર્કને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"સિમ નેટવર્ક સબસેટને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"સિમ સેવા પ્રદાતાના લૉકને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"સિમ કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"સિમને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM Network1ના લૉકને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM Network2ના લૉકને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM Hrpdને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાની વિનંતી નિષ્ફળ રહી."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM સેવા પ્રદાતાના લૉકને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIMના લૉકને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK વડે અનલૉક કરવાનું નિષ્ફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPNને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP Equivalent Home PLMNને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCIDને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPIને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"નેટવર્ક સબસેટ સેવા પ્રદાતાના લૉકને અનલૉક કરવાની વિનંતી અસફળ રહી."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"સિમ નેટવર્કને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"સિમ નેટવર્ક સબસેટને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"સિમ સેવા પ્રદાતાના લૉકને અનલૉક કરવાનું સફળ રહ્યું ."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"સિમ કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"સિમને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM Network1ના લૉકને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM Network2ના લૉકને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM Hrpdને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM સેવા પ્રદાતાના લૉકને અનલૉક કરવાનું અસફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"RUIM કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIMના લૉકને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK વડે અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPNને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP Equivalent Home PLMNને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCIDને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPIને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"નેટવર્ક સબસેટ સેવા પ્રદાતાના લૉકને અનલૉક કરવાનું સફળ રહ્યું."</string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 862f29b4615e..cd6eec1ade9e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -438,7 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"चित्र और वीडियो लें"</string> <string name="permdesc_camera" msgid="1354600178048761499">"यह ऐप्लिकेशन किसी भी समय कैमरे का उपयोग करके चित्र ले सकता है और वीडियो रिकॉर्ड कर सकता है."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"तस्वीरें और वीडियो लेने के लिए ऐप्लिकेशन या सेवा को सिस्टम के कैमरे का ऐक्सेस दें"</string> - <string name="permdesc_systemCamera" msgid="5938360914419175986">"यह खास या सिस्टम ऐप्लिकेशन जब चाहे, तस्वीरें लेने और वीडियो रिकॉर्ड करने के लिए सिस्टम के कैमरे का इस्तेमाल कर सकता है. इसके लिए ऐप्लिकेशन को android.permission.CAMERA की अनुमति देना भी ज़रूरी है"</string> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"यह खास सिस्टम ऐप्लिकेशन जब चाहे, तस्वीरें लेने और वीडियो रिकॉर्ड करने के लिए सिस्टम के कैमरे का इस्तेमाल कर सकता है. इसके लिए ऐप्लिकेशन को android.permission.CAMERA की अनुमति देना भी ज़रूरी है"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"डिवाइस का कैमरे चालू या बंद होने पर, किसी ऐप्लिकेशन या सेवा को कॉलबैक पाने की मंज़ूरी दें."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"यह ऐप्लिकेशन, डिवाइस के कैमरे को चालू या बंद करते समय (किसी ऐप्लिकेशन से) कॉलबैक पा सकता है."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"कंपन (वाइब्रेशन) को नियंत्रित करें"</string> @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"यह डिवाइस इस <xliff:g id="NAME">%s</xliff:g> का समर्थन नहीं करता है. समर्थित प्रारूप में सेट करने के लिए टैप करें."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"इस डिवाइस पर <xliff:g id="NAME">%s</xliff:g> काम नहीं करता है. काम करने वाले प्रारूप में सेट अप करने के लिए चुनें."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"इस डिवाइस पर <xliff:g id="NAME">%s</xliff:g> काम नहीं करता."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूप से निकाला गया"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"पहले मीडिया डिवाइस निकालने का विकल्प चुनें, फिर उसे निकालें ताकि आपकी सामग्री सुरक्षित रहे"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> निकाला गया."</string> @@ -1624,7 +1623,7 @@ <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"आवाज़ कम और ज़्यादा करने वाले दोनों बटन को कुछ सेकंड तक दबाकर रखने से सुलभता सुविधाएं चालू हो जाती हैं. ऐसा करने से आपके डिवाइस के काम करने के तरीके में बदलाव हो सकता है.\n\nमौजूदा सुविधाएं:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nआप सेटिंग और सुलभता में जाकर चुनी हुई सुविधाएं बदल सकते हैं."</string> <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"टॉकबैक की सुविधा चालू करना चाहते हैं?"</string> - <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"आवाज़ कम और ज़्यादा करने वाले दोनों बटन को कुछ सेकंड तक दबाकर रखने से टॉकबैक चालू हो जाती है. यह एक स्क्रीन रीडर है जो दृष्टिहीन और कम दृष्टि वाले व्यक्तियों के लिए उपयोगी होती है. टॉकबैक की सुविधा चालू करने से आपके डिवाइस के काम करने का तरीका पूरी तरह से बदल जाता है.\n\nआप सेटिंग और सुलभता में जाकर इस शॉर्टकट को किसी दूसरी सुविधा के लिए बदल सकते हैं."</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"आवाज़ कम और ज़्यादा करने वाले दोनों बटन को कुछ सेकंड तक दबाकर रखने से टॉकबैक की सुविधा चालू हो जाती है. यह एक स्क्रीन रीडर है जो दृष्टिहीन और कम दृष्टि वाले व्यक्तियों के लिए उपयोगी होती है. टॉकबैक की सुविधा चालू करने से आपके डिवाइस के काम करने का तरीका पूरी तरह से बदल जाता है.\n\nआप सेटिंग और सुलभता में जाकर इस शॉर्टकट को किसी दूसरी सुविधा के लिए बदल सकते हैं."</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> चालू करना चाहते हैं?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"आवाज़ कम और ज़्यादा करने वाले दोनों बटन को कुछ सेकंड तक दबाकर रखने से <xliff:g id="SERVICE">%1$s</xliff:g> चालू हो जाती है, जो एक सुलभता सुविधा है. ऐसा करने से आपके डिवाइस के काम करने के तरीके में बदलाव हो सकता है.\n\nआप सेटिंग और सुलभता में जाकर इस शॉर्टकट को किसी दूसरी सुविधा के लिए बदल सकते हैं."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"चालू करें"</string> @@ -1648,15 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"शॉर्टकट का उपयोग करें"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"रंग बदलने की सुविधा"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"रंग में सुधार करने की सुविधा"</string> - <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"आवाज़ कम-ज़्यादा करने वाले बटन को दबाकर रखें. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू कर दिया गया."</string> - <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"आवाज़ कम-ज़्यादा करने वाले बटन को दबाकर रखें. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद कर दिया गया."</string> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"आवाज़ कम-ज़्यादा करने वाले दोनों बटन दबाकर रखें. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू कर दिया गया."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"आवाज़ कम-ज़्यादा करने वाले दोनों बटन दबाकर रखें. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद कर दिया गया."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> इस्तेमाल करने के लिए आवाज़ वाले दोनों बटन तीन सेकंड तक दबाकर रखें"</string> <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"सुलभता बटन पर टैप करके, इस्तेमाल करने के लिए सुविधा चुनें:"</string> - <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"सुलभता वाले जेस्चर के साथ इस्तेमाल करने के लिए सुविधा चुनें (दो उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):"</string> - <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"सुलभता वाले जेस्चर के साथ इस्तेमाल करने के लिए सुविधा चुनें (तीन उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"सुलभता वाले हाथ के जेस्चर (हाव-भाव) के साथ इस्तेमाल करने के लिए सुविधा चुनें (दो उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"सुलभता वाले हाथ के जेस्चर (हाव-भाव) के साथ इस्तेमाल करने के लिए सुविधा चुनें (तीन उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):"</string> <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"एक सुविधा से दूसरी सुविधा पर जाने के लिए, सुलभता बटन दबाकर रखें."</string> - <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"एक सुविधा से दूसरी सुविधा पर जाने के लिए, स्क्रीन पर दो उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक स्क्रीन पर उंगलियां रखे रहें."</string> - <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"एक सुविधा से दूसरी सुविधा पर जाने के लिए, स्क्रीन पर तीन उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक स्क्रीन पर उंगलियां रखे रहें."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"एक सुविधा से दूसरी सुविधा पर जाने के लिए, स्क्रीन पर दो उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक उंगलियां स्क्रीन पर रखे रहें."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"एक सुविधा से दूसरी सुविधा पर जाने के लिए, स्क्रीन पर तीन उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक उंगलियां स्क्रीन पर रखे रहें."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"बड़ा करना"</string> <string name="user_switched" msgid="7249833311585228097">"मौजूदा उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> पर स्विच किया जा रहा है…"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"बातचीत"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ग्रुप में बातचीत"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"निजी प्रोफ़ाइल"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"वर्क प्रोफ़ाइल"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"निजी व्यू"</string> @@ -2064,7 +2065,7 @@ <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"इस सामग्री का इस्तेमाल, किसी भी निजी ऐप्लिकेशन पर नहीं किया जा सकता"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"किसी भी निजी ऐप्लिकेशन का इस्तेमाल करके, इस सामग्री को खोला नहीं जा सकता"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क को अनलॉक करने का पिन"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"सिम नेटवर्क के सबसेट को अनलॉक नहीं किया जा सका"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"सिम नेटवर्क के सबसेट को अनलॉक करने का पिन"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"कारोबार के लिए इस्तेमाल होने वाले सिम को अनलॉक करने का पिन"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"सिम नेटवर्क को अनलॉक करने का पिन"</string> <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"सिम को अनलॉक करने का पिन"</string> @@ -2151,7 +2152,7 @@ <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"सिम को अनलॉक किया गया."</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM कार्ड के network1 को अनलॉक किया गया."</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM कार्ड के network2 को अनलॉक किया गया."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"hrpd नेटवर्क वाले RUIM कार्ड को अनलॉक किया गया."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"Hrpd नेटवर्क वाले RUIM कार्ड को अनलॉक किया गया."</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM कार्ड की सेवा देने वाली कंपनी के लॉक को अनलॉक किया गया."</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"कारोबार के लिए इस्तेमाल होने वाले RUIM कार्ड को अनलॉक किया गया."</string> <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM कार्ड को अनलॉक किया गया."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index cfd4ff09c1dd..94ff54c3cd48 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -2078,6 +2078,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Razgovor"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupni razgovor"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Osobno"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Posao"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobni prikaz"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 31589dfe926a..30a75dc25ff4 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Beszélgetés"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Csoportos beszélgetés"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Személyes"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Munka"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Személyes nézet"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 85e2a982607f..21aa14802157 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Նամակագրություն"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Խմբային նամակագրություն"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Անձնական"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Աշխատանքային"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Անձնական"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 01dbf0500adc..9f3c5a7913ea 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -484,8 +484,8 @@ <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"Memungkinkan aplikasi mendapatkan daftar akun yang dikenal oleh tablet. Ini mungkin termasuk akun yang dibuat oleh aplikasi yang telah Anda instal."</string> <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"Mengizinkan aplikasi mendapatkan daftar akun yang dikenal oleh perangkat Android TV. Ini mungkin mencakup akun yang dibuat oleh aplikasi yang telah Anda instal."</string> <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"Memungkinkan aplikasi mendapatkan daftar akun yang dikenal oleh ponsel. Ini mungkin termasuk akun yang dibuat oleh aplikasi yang telah Anda instal."</string> - <string name="permlab_accessNetworkState" msgid="2349126720783633918">"lihat sambungan jaringan"</string> - <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"Memungkinkan aplikasi melihat informasi tentang sambungan jaringan, misalnya jaringan yang ada dan tersambung."</string> + <string name="permlab_accessNetworkState" msgid="2349126720783633918">"lihat koneksi jaringan"</string> + <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"Memungkinkan aplikasi melihat informasi tentang koneksi jaringan, misalnya jaringan yang ada dan tersambung."</string> <string name="permlab_createNetworkSockets" msgid="3224420491603590541">"dapatkan akses jaringan penuh"</string> <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"Memungkinkan aplikasi membuat soket jaringan dan menggunakan protokol jaringan khusus. Browser dan aplikasi lain menyediakan sarana untuk mengirim data ke internet sehingga izin ini tidak diperlukan untuk mengirim data ke internet."</string> <string name="permlab_changeNetworkState" msgid="8945711637530425586">"ubah konektivitas jaringan"</string> @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Percakapan"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Percakapan Grup"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Pribadi"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Kerja"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Tampilan pribadi"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index f12d0ded9e9a..6f2deee7e511 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1623,7 +1623,7 @@ <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Kveikt er á aðgengiseiginleikum þegar báðum hljóðstyrkstökkunum er haldið inni í nokkrar sekúndur. Þetta getur breytt því hvernig tækið virkar.\n\nNúverandi eiginleikar:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nÞú getur breytt völdum eiginleikum í Stillingar > Aðgengi."</string> <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"Viltu kveikja á TalkBack?"</string> - <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Ef báðum hljóðstyrkstökkunum er haldið niðri í nokkrar sekúndur er kveikt á TalkBack, sem er skjálesari sem gagnast blindum eða sjónskertum einstaklingum. TalkBack breytir því algjörlega hvernig tækið virkar.\n\nÞú getur breytt þessari flýtileið í annan eiginleika í Stillingar > Aðgengi."</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Ef báðum hljóðstyrkstökkunum er haldið niðri í nokkrar sekúndur er kveikt á skjálesaranum TalkBack sem gagnast blindum eða sjónskertum. TalkBack breytir því algjörlega hvernig tækið virkar.\n\nÞú getur breytt þessari flýtileið í annan eiginleika í Stillingar > Aðgengi."</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"Viltu kveikja á <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ef báðum hljóðstyrkstökkunum er haldið inni í nokkrar sekúndur er kveikt á aðgengiseiginleikanum <xliff:g id="SERVICE">%1$s</xliff:g>. Þetta getur breytt því hvernig tækið virkar.\n\nÞú getur breytt þessari flýtileið í annan eiginleika í Stillingar > Aðgengi."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Kveikja"</string> @@ -2026,7 +2026,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Engir einstaklingar sem mælt er með að deila með"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Engar tillögur um einstaklinga til að deila með"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Forritalisti"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Þetta forrit hefur ekki fengið heimild fyrir upptöku en gæti tekið upp hljóð í gegnum þetta USB-tæki."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Heim"</string> @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Samtal"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Hópsamtal"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Persónulegt"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Vinna"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persónulegt yfirlit"</string> @@ -2062,20 +2064,20 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Engin vinnuforrit geta opnað þetta efni"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Engin forrit til einkanota styðja þetta efni"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Engin forrit til einkanota geta opnað þetta efni"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-númer fyrir opnun SIM netkerfis"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN-númer fyrir opnun SIM netkerfishlutmengis"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN-númer til að opna SIM fyrirtækis"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"PIN-númer fyrir opnun SIM þjónustuaðila"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-númer fyrir opnun á SIM-korti netkerfis"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN-númer fyrir opnun á SIM-korti netkerfishlutmengis"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN-númer fyrir opnun á SIM-korti fyrirtækis"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"PIN-númer fyrir opnun þjónustuaðila SIM"</string> <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"PIN-númer fyrir opnun SIM"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"Slá inn PUK-númer"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"Slá inn PUK-númer"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"Slá inn PUK-númer"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"Slá inn PUK-númer"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"Slá inn PUK-númer"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"PIN-númer fyrir opnun RUIM netkerfis 1"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"PIN-númer fyrir opnun RUIM netkerfis 2"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"PIN-númer fyrir opnun á RUIM-korti netkerfis 1"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"PIN-númer fyrir opnun á RUIM-korti netkerfis 2"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"PIN-númer fyrir opnun RUIM hrpd"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"PIN-númer fyrir opnun RUIM fyrirtækis"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"PIN-númer fyrir opnun á RUIM-korti fyrirtækis"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"PIN-númer fyrir opnun þjónustuaðila RUIM"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"PIN-númer fyrir opnun RUIM"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"Slá inn PUK-númer"</string> @@ -2089,82 +2091,82 @@ <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"PIN-númer fyrir opnun ICCID"</string> <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"PIN-númer fyrir opnun IMPI"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"PIN-númer fyrir opnun þjónustuaðila netkerfishlutmengis"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"Biður um opnun SIM netkerfis…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"Biður um opnun SIM netkerfishlutmengis…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"Biður um opnun á SIM-korti netkerfis…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"Biður um opnun á SIM-korti netkerfishlutmengis…"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"Biður um opnun þjónustuaðila SIM…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Biður um opnun SIM fyrirtækis…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"Biður um PUK-opnun…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Biður um opnun á SIM-korti fyrirtækis…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"Biður um opnun með PUK-númeri…"</string> <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"Biður um opnun SIM…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"Biður um opnun RUIM netkerfis 1…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"Biður um opnun RUIM netkerfis 2…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"Biður um opnun á RUIM-korti netkerfis 1…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"Biður um opnun á RUIM-korti netkerfis 2…"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"Biður um opnun RUIM hrpd…"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"Biður um opnun þjónustuaðila RUIM…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Biður um opnun RUIM fyrirtækis…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Biður um opnun á RUIM-korti fyrirtækis…"</string> <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"Biður um opnun SPN…"</string> <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"Biður um opnun SP Equivalent Home PLMN…"</string> <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"Biður um opnun ICCID…"</string> <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"Biður um opnun IMPI…"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Biður um opnun þjónustuaðila netkerfishlutmengis…"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"Biður um opnun RUIM…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"Biður um PUK-opnun…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"Beiðni um opnun SIM netkerfis tókst ekki."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"Beiðni um opnun SIM netkerfishlutmengis tókst ekki."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"Beiðni um opnun þjónustuaðila SIM tókst ekki."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Beiðni um opnun SIM fyrirtækis tókst ekki."</string> - <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"Beiðni um opnun SIM tókst ekki."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"Beiðni um opnun RUIM netkerfis 1 tókst ekki."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"Beiðni um opnun RUIM netkerfis 2 tókst ekki."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"Biður um opnun með PUK-númeri…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"Beiðni um opnun á SIM-korti netkerfis mistókst."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"Beiðni um opnun á SIM-korti netkerfishlutmengis mistókst."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"Beiðni um opnun þjónustuaðila SIM mistókst."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Beiðni um opnun á SIM-korti fyrirtækis mistókst."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"Beiðni um opnun SIM mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"Beiðni um opnun á RUIM-korti netkerfis 1 mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"Beiðni um opnun á RUIM-korti netkerfis 2 mistókst."</string> <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"Beiðni um opnun RUIM Hrpd tókst ekki."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Beiðni um opnun RUIM fyrirtækis tókst ekki."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"Beiðni um opnun þjónustuaðila RUIM tókst ekki."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Beiðni um opnun á RUIM-korti fyrirtækis mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"Beiðni um opnun þjónustuaðila RUIM mistókst."</string> <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"Beiðni um opnun RUIM tókst ekki."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK-opnun mistókst."</string> - <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"Beiðni um opnun SPN tókst ekki."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"Beiðni um opnun SP Equivalent Home PLMN tókst ekki."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"Opnun með PUK-númeri mistókst."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"Beiðni um opnun SPN mistókst."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"Beiðni um opnun SP Equivalent Home PLMN mistókst."</string> <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"Beiðni um opnun ICCID tókst ekki."</string> <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"Beiðni um opnun IMPI tókst ekki."</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Beiðni um opnun þjónustuaðila netkerfishlutmengis tókst."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"Opnun SIM netkerfis tókst."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"Opnun SIM netkerfishlutmengis tókst."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Beiðni um opnun þjónustuaðila netkerfishlutmengis mistókst."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"Opnun á SIM-korti netkerfis tókst."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"Opnun á SIM-korti netkerfishlutmengis tókst."</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"Opnun þjónustuaðila SIM tókst."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Opnun SIM fyrirtækis tókst."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Opnun á SIM-korti fyrirtækis tókst."</string> <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"Opnun SIM tókst."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"Opnun RUIM netkerfis 1 tókst."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"Opnun RUIM netkerfis 2 tókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"Opnun á RUIM-korti netkerfis 1 tókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"Opnun á RUIM-korti netkerfis 2 tókst."</string> <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"Opnun RUIM Hrpd tókst."</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"Beiðni um opnun þjónustuaðila RUIM tókst."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Opnun RUIM fyrirtækis tókst."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Opnun á RUIM-korti fyrirtækis tókst."</string> <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"Opnun RUIM tókst."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK-opnun tókst."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK-opnun tókst."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"Opnun með PUK-númeri tókst."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"Opnun með PUK-númeri tókst."</string> <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"Opnun SPN tókst."</string> <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"Opnun SP Equivalent Home PLMN tókst."</string> <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Opnun ICCID tókst."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index c577f021a089..39e5a6e61d66 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversazione"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversazione di gruppo"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personale"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Lavoro"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualizzazione personale"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 1a95c3b09df0..4b131247e7ee 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -2112,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"שיחה"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"שיחה קבוצתית"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"אישי"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"עבודה"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"תצוגה אישית"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index c56e2dc70f46..f31f1c830688 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"対応していない<xliff:g id="NAME">%s</xliff:g>です"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"このデバイスはこの <xliff:g id="NAME">%s</xliff:g>に対応していません。タップして、対応している形式でセットアップしてください。"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"このデバイスはこの <xliff:g id="NAME">%s</xliff:g>に対応していません。サポートされるフォーマットで設定するには選択してください。"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"このデバイスはこの <xliff:g id="NAME">%s</xliff:g>に対応していません。"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g>が不適切に取り外されました"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"コンテンツの喪失を防ぐため、メディアを取り出してから取り外してください"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g>の取り外し"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"会話"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"グループの会話"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"個人用"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"仕事用"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人用ビュー"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 54a88dd35e9a..89de80322c77 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -240,7 +240,7 @@ <string name="global_action_power_options" msgid="1185286119330160073">"ძალა"</string> <string name="global_action_restart" msgid="4678451019561687074">"გადატვირთვა"</string> <string name="global_action_emergency" msgid="1387617624177105088">"საგანგებო სამსახურები"</string> - <string name="global_action_bug_report" msgid="5127867163044170003">"ხარვეზის შესახებ ანგარიში"</string> + <string name="global_action_bug_report" msgid="5127867163044170003">"ხარვეზის ანგარიში"</string> <string name="global_action_logout" msgid="6093581310002476511">"სესიის დასრულება"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"ეკრანის ანაბეჭდი"</string> <string name="bugreport_title" msgid="8549990811777373050">"ხარვეზის ანგარიში"</string> @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"მიმოწერა"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ჯგუფური მიმოწერა"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"პირადი"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"სამსახური"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"პირადი ხედი"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 63fe2c5ff68f..b5892ebbe434 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -237,7 +237,7 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"Телефон опциялары"</string> <string name="global_action_lock" msgid="6949357274257655383">"Экранды құлыптау"</string> <string name="global_action_power_off" msgid="4404936470711393203">"Өшіру"</string> - <string name="global_action_power_options" msgid="1185286119330160073">"Қуат түймесі"</string> + <string name="global_action_power_options" msgid="1185286119330160073">"Қуат"</string> <string name="global_action_restart" msgid="4678451019561687074">"Қайта қосу"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Төтенше жағдай"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"Вирус туралы хабарлау"</string> @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Қолданылмайтын <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Бұл құрылғы <xliff:g id="NAME">%s</xliff:g> картасына қолдау көрсетеді. Қолдау көрсетілетін пішімде орнату үшін түртіңіз."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Бұл құрылғыда <xliff:g id="NAME">%s</xliff:g> картасына қолдау көрсетілмейді. Қолдау көрсетілетін форматта реттеуді таңдаңыз."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Бұл құрылғы <xliff:g id="NAME">%s</xliff:g> картасын қолдамайды."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> кенеттен шығарылды"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Мазмұнды жоғалтып алмау үшін ақпарат тасығышты алдымен ажыратыңыз, содан кейін барып шығарыңыз."</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string> @@ -1621,12 +1620,12 @@ <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Арнайы мүмкіндік төте жолын пайдалану керек пе?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Түймелер тіркесімі қосулы кезде, екі дыбыс түймесін 3 секунд басып тұрсаңыз, \"Арнайы мүмкіндіктер\" функциясы іске қосылады."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"Арнайы мүмкіндіктер іске қосылсын ба?"</string> - <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз, арнайы мүмкіндіктер іске қосылады. Бұл – құрылғының жұмысына әсер етуі мүмкін.\n\nФункциялар:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nТаңдалған функцияларды \"Параметрлер > Accessibility\" бөлімінен өзгерте аласыз."</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз, арнайы мүмкіндіктер іске қосылады. Бұл – құрылғының жұмысына әсер етуі мүмкін.\n\nФункциялар:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nТаңдалған функцияларды \"Параметрлер > Арнайы мүмкіндіктер\" бөлімінен өзгерте аласыз."</string> <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"TalkBack қосылсын ба?"</string> - <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз TalkBack қосылады. Бұл – зағип немесе көру қабілеті нашар адамдарға арналған экранды оқу құралы. TalkBack құрылғының жұмыс істеуіне әсер етеді.\n\nБұл таңбашаны басқа функцияға \"Параметрлер > Accessibility\" бөлімінде өзгерте аласыз."</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз, TalkBack қосылады. Бұл – зағип немесе көру қабілеті нашар адамдарға арналған экранды оқу құралы. TalkBack құрылғының жұмыс істеуіне әсер етеді.\n\nБұл таңбашаны басқа функцияға \"Параметрлер > Арнайы мүмкіндіктер\" бөлімінде өзгерте аласыз."</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> қосылсын ба?"</string> - <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз, <xliff:g id="SERVICE">%1$s</xliff:g> және арнайы мүмкіндіктер іске қосылады. Бұл – құрылғының жүмысына әсер етуі мүмкін.\n\nБұл таңбашаны басқа функцияға \"Параметрлер > Accessibility\" бөлімінен өзгерте аласыз."</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз, <xliff:g id="SERVICE">%1$s</xliff:g> арнайы қызметі іске қосылады. Бұл – құрылғының жүмысына әсер етуі мүмкін.\n\nБұл таңбашаны басқа функцияға \"Параметрлер > Арнайы мүмкіндіктер\" бөлімінен өзгерте аласыз."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Қосылсын"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"Қосылмасын"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> қызметі құрылғыңызды толық басқаруына рұқсат етілсін бе?"</string> @@ -1648,13 +1647,13 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Төте жолды пайдалану"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"Түстер инверсиясы"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"Түсті түзету"</string> - <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Дыбыс деңгейі пернелерін басып ұстап тұрыңыз. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қосулы."</string> - <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Дыбыс деңгейі пернелерін басып ұстап тұрыңыз. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> өшірулі."</string> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Пайдаланушы дыбыс деңгейі пернелерін басып ұстап тұрды. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қосулы."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Пайдаланушы дыбыс деңгейі пернелерін басып ұстап тұрды. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> өшірулі."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін пайдалану үшін дыбыс деңгейін реттейтін екі түймені де 3 секунд басып тұрыңыз"</string> <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын функцияны таңдаңыз:"</string> - <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Арнайы мүмкіндіктер қимылымен пайдаланатын функцияны таңдаңыз (екі саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз):"</string> - <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Арнайы мүмкіндіктер қимылымен пайдаланатын функцияны таңдаңыз (үш саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз):"</string> - <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Бір функциядан екінші функцияға ауысу үшін арнайы мүмкіндіктер түймесін түртіп, оны ұстап тұрыңыз."</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Арнайы мүмкіндіктер қимылымен (екі саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз) пайдаланатын функцияны таңдаңыз:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Арнайы мүмкіндіктер қимылымен (үш саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз) пайдаланатын функцияны таңдаңыз:"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Бір функциядан екінші функцияға ауысу үшін \"Арнайы мүмкіндіктер\" түймесін түртіп, оны ұстап тұрыңыз."</string> <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Бір функциядан екінші функцияға ауысу үшін екі саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Бір функциядан екінші функцияға ауысу үшін үш саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ұлғайту"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Чат"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтық чат"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Жеке"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Жұмыс"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көру"</string> @@ -2065,9 +2066,9 @@ <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Бұл мазмұнды ешқандай жеке қолданба аша алмайды."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM желісінің құлпын ашатын PIN коды"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM желісі ішкі жиынтығының құлпын ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Корпоративтік SIM картасын ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"Қызмет көрсетушінің SIM картасын ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"SIM картасын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Корпоративтік SIM картасының құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"SIM картасының қызмет көрсетушісінің құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"SIM картасының құлпын ашатын PIN коды"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK кодын енгізіңіз"</string> @@ -2075,100 +2076,100 @@ <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM network1 желісінің құлпын ашатын PIN коды"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM network2 желісінің құлпын ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM картасының HRPD ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"Корпоративтік RUIM картасын ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM картасының қызмет көрсетушісін ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIM картасын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM картасының HRPD құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"Корпоративтік RUIM картасының құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM картасының қызмет көрсетушісінің құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIM картасының құлпын ашатын PIN коды"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK кодын енгізіңіз"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK кодын енгізіңіз"</string> - <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP Equivalent Home PLMN ашатын PIN коды"</string> - <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID кодын көрсететін PIN коды"</string> - <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI кодын көрсететін PIN коды"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"Қызмет көрсетуші желісінің ішкі жиынтығын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP Equivalent Home PLMN құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI құлпын ашатын PIN коды"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"Қызмет көрсетуші желісінің ішкі жиынтығы құлпын ашатын PIN коды"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"SIM желісінің құлпын ашу сұралуда…"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"SIM желісі ішкі жиынтығының құлпын ашу сұралуда …"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"Қызмет көрсетушінің SIM картасын ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Корпоративтік SIM картасын ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM картасын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"SIM картасының қызмет көрсетушісінің құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"Корпоративтік SIM картасының құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM картасының құлпын ашу сұралуда…"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM network1 желісінің құлпын ашу сұралуда…"</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM network2 желісінің құлпын ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM картасының HRPD ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM картасының қызмет көрсетушісін ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Корпоративтік RUIM картасын ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP Equivalent Home PLMN ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID кодын көрсету сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI кодын көрсету сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Қызмет көрсетуші желісінің ішкі жиынтығын ашу сұралуда.…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM картасының HRPD құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM картасының қызмет көрсетушісінің құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Корпоративтік RUIM картасының құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP Equivalent Home PLMN құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI құлпын ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Қызмет көрсетуші желісінің ішкі жиынтығы құлпын ашу сұралуда.…"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM картасының құлпын ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK кодымен ашу сұралуда…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"SIM желісінің құлпын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"SIM желісі ішкі жиынтығының құлпын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"Қызмет көрсетушінің SIM картасын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Корпоративтік SIM картасын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM картасын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM Network1 желісінің құлпын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM Network2 желісінің құлпын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM картасының HRPD ашу сұралмады."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Корпоративтік RUIM картасын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM картасының қызмет көрсетушісін ашу сұралмады."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM картасын ашу сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK кодымен ашылмады."</string> - <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN ашу сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP Equivalent Home PLMN ашу сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID кодын көрсету сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI кодын көрсету сұралмады."</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Қызмет көрсетуші желісінің ішкі жиынтығын ашу сұралмады."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"Құлпын PUK кодымен ашу сұралуда…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"SIM желісінің құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"SIM желісі ішкі жиынтығының құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"SIM картасының қызмет көрсетушісінің құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Корпоративтік SIM картасының құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM картасының құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM Network1 желісінің құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM Network2 желісінің құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM картасының HRPD құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Корпоративтік RUIM картасының құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM картасының қызмет көрсетушісінің құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM картасының құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"Құлпы PUK кодымен ашылмады."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP Equivalent Home PLMN құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI құлпын ашу сұрауы орындалмады."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Қызмет көрсетуші желісінің ішкі жиынтығы құлпын ашу сұрауы орындалмады."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"SIM желісінің құлпы ашылды."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"SIM желісі ішкі жиынтығының құлпы ашылды."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"Қызмет көрсетуші SIM картасы ашылмады."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Корпоративтік SIM картасы ашылды."</string> - <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM картасы ашылмады."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"SIM картасының қызмет көрсетушісінің құлпы ашылды."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Корпоративтік SIM картасының құлпы ашылды."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM картасының құлпы ашылды."</string> <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM Network1 желісінің құлпы ашылды."</string> <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM Network2 желісінің құлпы ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM картасының HRPD ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM картасының қызмет көрсетушісі ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Корпоративтік RUIM картасы ашылмады."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM картасы ашылды."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK кодымен ашылды."</string> - <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN ашылды."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP Equivalent Home PLMN ашылды."</string> - <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID коды көрсетілді."</string> - <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI көрсетілді."</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Қызмет көрсетуші желісінің ішкі жиынтығын ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM картасының HRPD құлпы ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM картасының қызмет көрсетушісінің құлпы ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Корпоративтік RUIM картасының құлпы ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM картасының құлпы ашылды."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"Құлпы PUK кодымен ашылды."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN құлпы ашылды."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP Equivalent Home PLMN құлпы ашылды."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID құлпы ашылды."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI құлпы ашылды."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Қызмет көрсетуші желісінің ішкі жиынтығы құлпы ашылды."</string> </resources> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index bf420e004240..7de5a8b40ffa 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -438,7 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"ថតរូប និងវីដេអូ"</string> <string name="permdesc_camera" msgid="1354600178048761499">"កម្មវិធីនេះអាចថតរូប និងថតវីដេអូ ដោយប្រើកាមេរ៉ាបានគ្រប់ពេល។"</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"អនុញ្ញាតឱ្យកម្មវិធី ឬសេវាកម្មចូលប្រើកាមេរ៉ាប្រព័ន្ធ ដើម្បីថតរូប និងថតវីដេអូ"</string> - <string name="permdesc_systemCamera" msgid="5938360914419175986">"កម្មវិធីប្រព័ន្ធដែលមានសិទ្ធិអនុញ្ញាតនេះអាចថតរូប និងថតវីដេអូ ដោយប្រើកាមេរ៉ាប្រព័ន្ធបានគ្រប់ពេល។ តម្រូវឱ្យមានការអនុញ្ញាត android.permission.CAMERA ដើម្បីឱ្យកម្មវិធីអាចធ្វើសកម្មភាពបានផងដែរ"</string> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"កម្មវិធីប្រព័ន្ធ ឬកម្មវិធីដែលមានសិទ្ធិអនុញ្ញាតនេះអាចថតរូប និងថតវីដេអូ ដោយប្រើកាមេរ៉ាប្រព័ន្ធបានគ្រប់ពេល។ តម្រូវឱ្យមានការអនុញ្ញាត android.permission.CAMERA ដើម្បីឱ្យកម្មវិធីអាចធ្វើសកម្មភាពបានផងដែរ"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"អនុញ្ញាតឱ្យកម្មវិធី ឬសេវាកម្មទទួលការហៅត្រឡប់វិញអំពីកាមេរ៉ាដែលកំពុងបិទ ឬបើក។"</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"កម្មវិធីនេះអាចទទួលការហៅត្រឡប់វិញបាន នៅពេលកំពុងបិទ ឬបើកកាមេរ៉ា (ដោយកម្មវិធី)។"</string> <string name="permlab_vibrate" msgid="8596800035791962017">"ពិនិត្យការញ័រ"</string> @@ -1353,8 +1353,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> មិនគាំទ្រ"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ឧបករណ៍នេះមិនគាំទ្រ <xliff:g id="NAME">%s</xliff:g> នេះទេ។ ប៉ះដើម្បីកំណត់ទម្រង់ដែលគាំទ្រ។"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"ឧបករណ៍នេះមិនស្គាល់ <xliff:g id="NAME">%s</xliff:g> នេះទេ។ សូមជ្រើសរើសដើម្បីរៀបចំក្នុងទម្រង់ដែលស្គាល់។"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"ឧបករណ៍នេះមិនស្គាល់ <xliff:g id="NAME">%s</xliff:g> នេះទេ។"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញដោយមិនបានរំពឹងទុក"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"ដកមេឌៀមុនពេលយកវាចេញ ដើម្បីជៀសវាងការបាត់បង់ខ្លឹមសារ"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"បានយក <xliff:g id="NAME">%s</xliff:g> ចេញ"</string> @@ -1656,9 +1655,9 @@ <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"ជ្រើសរើសមុខងារដែលត្រូវប្រើ នៅពេលដែលអ្នកចុចប៊ូតុងភាពងាយស្រួល៖"</string> <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ជ្រើសរើសមុខងារ ដើម្បីប្រើជាមួយចលនាភាពងាយស្រួល (អូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ដោយប្រើម្រាមដៃពីរ)៖"</string> <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ជ្រើសរើសមុខងារ ដើម្បីប្រើជាមួយចលនាភាពងាយស្រួល (អូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ដោយប្រើម្រាមដៃបី)៖"</string> - <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ដើម្បីប្ដូរឆ្លាស់រវាងមុខងារផ្សេងៗ សូមចុចប៊ូតុងភាពងាយស្រួលឱ្យជាប់។"</string> - <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ដើម្បីប្ដូរឆ្លាស់រវាងមុខងារផ្សេងៗ សូមអូសឡើងលើដោយប្រើម្រាមដៃពីរ ហើយសង្កត់ឱ្យជាប់។"</string> - <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ដើម្បីប្ដូរឆ្លាស់រវាងមុខងារផ្សេងៗ សូមអូសឡើងលើដោយប្រើម្រាមដៃបី ហើយសង្កត់ឱ្យជាប់។"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ដើម្បីប្ដូររវាងមុខងារផ្សេងៗ សូមចុចប៊ូតុងភាពងាយស្រួលឱ្យជាប់។"</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ដើម្បីប្ដូររវាងមុខងារផ្សេងៗ សូមអូសឡើងលើដោយប្រើម្រាមដៃពីរ ហើយសង្កត់ឱ្យជាប់។"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ដើម្បីប្ដូររវាងមុខងារផ្សេងៗ សូមអូសឡើងលើដោយប្រើម្រាមដៃបី ហើយសង្កត់ឱ្យជាប់។"</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ការពង្រីក"</string> <string name="user_switched" msgid="7249833311585228097">"អ្នកប្រើបច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string> <string name="user_switching_message" msgid="1912993630661332336">"កំពុងប្ដូរទៅ <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -2047,6 +2046,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>៖"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ការសន្ទនា"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ការសន្ទនាជាក្រុម"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ផ្ទាល់ខ្លួន"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ការងារ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ទិដ្ឋភាពផ្ទាល់ខ្លួន"</string> @@ -2075,8 +2076,8 @@ <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"បញ្ចូល PUK"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"បញ្ចូល PUK"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"បញ្ចូល PUK"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"កូដ PIN ដោះសោ RUIM បណ្ដាញប្រភេទទី 1"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"កូដ PIN ដោះសោ RUIM បណ្ដាញប្រភេទទី 2"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"កូដ PIN ដោះសោ RUIM បណ្ដាញទី 1"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"កូដ PIN ដោះសោ RUIM បណ្ដាញទី 2"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"កូដ PIN ដោះសោ RUIM hrpd"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"កូដ PIN ដោះសោក្រុមហ៊ុន RUIM"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"កូដ PIN ដោះសោក្រុមហ៊ុនផ្ដល់សេវា RUIM"</string> @@ -2102,8 +2103,8 @@ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"កំពុងស្នើសុំដោះសោ PUK…"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"កំពុងស្នើសុំដោះសោ PUK…"</string> <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"កំពុងស្នើសុំដោះសោស៊ីម…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"កំពុងស្នើសុំដោះសោ RUIM បណ្ដាញប្រភេទទី 1…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"កំពុងស្នើសុំដោះសោ RUIM បណ្ដាញប្រភេទទី 2…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"កំពុងស្នើសុំដោះសោ RUIM បណ្ដាញទី 1…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"កំពុងស្នើសុំដោះសោ RUIM បណ្ដាញទី 2…"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"កំពុងស្នើសុំដោះសោ RUIM hrpd…"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"កំពុងស្នើសុំដោះសោក្រុមហ៊ុនផ្ដល់សេវា RUIM…"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"កំពុងស្នើសុំដោះសោក្រុមហ៊ុន RUIM…"</string> @@ -2124,8 +2125,8 @@ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"សំណើសុំដោះសោក្រុមហ៊ុនផ្ដល់សេវាស៊ីមមិនទទួលបានជោគជ័យទេ។"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"សំណើសុំដោះសោក្រុមហ៊ុនស៊ីមមិនទទួលបានជោគជ័យទេ។"</string> <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"សំណើសុំដោះសោស៊ីមមិនទទួលបានជោគជ័យទេ។"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"សំណើសុំដោះសោ RUIM បណ្ដាញប្រភេទទី 1 មិនទទួលបានជោគជ័យទេ។"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"សំណើសុំដោះសោ RUIM បណ្ដាញប្រភេទទី 2 មិនទទួលបានជោគជ័យទេ។"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"សំណើសុំដោះសោ RUIM បណ្ដាញទី 1 មិនទទួលបានជោគជ័យទេ។"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"សំណើសុំដោះសោ RUIM បណ្ដាញទី 2 មិនទទួលបានជោគជ័យទេ។"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"សំណើសុំដោះសោ RUIM Hrpd មិនបានទទួលជោគជ័យទេ។"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"សំណើសុំដោះសោក្រុមហ៊ុន RUIM មិនទទួលបានជោគជ័យទេ។"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"សំណើសុំដោះសោក្រុមហ៊ុនផ្ដល់សេវា RUIM មិនទទួលបានជោគជ័យទេ។"</string> @@ -2151,8 +2152,8 @@ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"ការដោះសោក្រុមហ៊ុនផ្ដល់សេវាស៊ីមទទួលបានជោគជ័យហើយ។"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"ការដោះសោក្រុមហ៊ុនស៊ីមទទួលបានជោគជ័យហើយ។"</string> <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"ការដោះសោស៊ីមទទួលបានជោគជ័យហើយ។"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"ការដោះសោ RUIM បណ្ដាញប្រភេទទី 1 ទទួលបានជោគជ័យហើយ។"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"ការដោះសោ RUIM បណ្ដាញប្រភេទទី 2 ទទួលបានជោគជ័យហើយ។"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"ការដោះសោ RUIM បណ្ដាញទី 1 ទទួលបានជោគជ័យហើយ។"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"ការដោះសោ RUIM បណ្ដាញទី 2 ទទួលបានជោគជ័យហើយ។"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"ការដោះសោ RUIM Hrpd ទទួលបានជោគជ័យហើយ។"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"ការដោះសោក្រុមហ៊ុនផ្ដល់សេវា RUIM ទទួលបានជោគជ័យហើយ។"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"ការដោះសោក្រុមហ៊ុន RUIM ទទួលបានជោគជ័យហើយ។"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 386b31f4b6bb..8d4b30ac100d 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -237,10 +237,8 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"ಫೋನ್ ಆಯ್ಕೆಗಳು"</string> <string name="global_action_lock" msgid="6949357274257655383">"ಸ್ಕ್ರೀನ್ ಲಾಕ್"</string> <string name="global_action_power_off" msgid="4404936470711393203">"ಪವರ್ ಆಫ್ ಮಾಡು"</string> - <!-- no translation found for global_action_power_options (1185286119330160073) --> - <skip /> - <!-- no translation found for global_action_restart (4678451019561687074) --> - <skip /> + <string name="global_action_power_options" msgid="1185286119330160073">"ಪವರ್"</string> + <string name="global_action_restart" msgid="4678451019561687074">"ಮರುಪ್ರಾರಂಭಿಸಿ"</string> <string name="global_action_emergency" msgid="1387617624177105088">"ತುರ್ತು"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"ದೋಷದ ವರದಿ"</string> <string name="global_action_logout" msgid="6093581310002476511">"ಸೆಷನ್ ಅಂತ್ಯಗೊಳಿಸಿ"</string> @@ -299,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಲು"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"ಸ್ಥಳ"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"ಕ್ಯಾಲೆಂಡರ್"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು"</string> @@ -440,8 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"ಚಿತ್ರಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ"</string> <string name="permdesc_camera" msgid="1354600178048761499">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಯಾವ ಸಮಯದಲ್ಲಾದರೂ ಕ್ಯಾಮರಾ ಬಳಸಿಕೊಂಡು ಚಿತ್ರಗಳು ಮತ್ತು ವಿಡಿಯೋಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಬಹುದು."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ಸಿಸ್ಟಂ ಕ್ಯಾಮರಾಗಳಿಗೆ ಅಪ್ಲಿಕೇಶನ್ ಅಥವಾ ಸೇವಾ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ"</string> - <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> - <skip /> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"ಈ ವಿಶೇಷ ಅಥವಾ ಸಿಸ್ಟಂ ಆ್ಯಪ್, ಯಾವುದೇ ಸಮಯದಲ್ಲಾದರೂ ಸಿಸ್ಟಂ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಿಕೊಂಡು ಫೋಟೋಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ವೀಡಿಯೋಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಬಹುದು. ಆ್ಯಪ್ಗೆ android.permission.CAMERA ಅನುಮತಿಯ ಅಗತ್ಯವಿರುತ್ತದೆ"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"ಕ್ಯಾಮರಾ ಸಾಧನಗಳನ್ನು ತೆರೆಯುತ್ತಿರುವ ಅಥವಾ ಮುಚ್ಚುತ್ತಿರುವ ಕುರಿತು ಕಾಲ್ಬ್ಯಾಕ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಆ್ಯಪ್ ಅಥವಾ ಸೇವೆಗೆ ಅನುಮತಿಸಿ."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"ಯಾವುದೇ ಕ್ಯಾಮರಾ ಸಾಧನವನ್ನು ತೆರೆಯುತ್ತಿರುವಾಗ ಅಥವಾ ಮುಚ್ಚುತ್ತಿರುವಾಗ (ಯಾವ ಅಪ್ಲಿಕೇಶನ್ನಿಂದ ಎಂಬ ಮಾಹಿತಿಯ ಮೂಲಕ) ಈ ಆ್ಯಪ್, ಕಾಲ್ಬ್ಯಾಕ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಬಹುದು."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"ವೈಬ್ರೇಷನ್ ನಿಯಂತ್ರಿಸಿ"</string> @@ -1354,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"ಬೆಂಬಲಿಸದಿರುವ <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ಈ ಸಾಧನವು <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬೆಂಬಲಿತ ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"ಈ ಸಾಧನವು ಈ <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬೆಂಬಲಿತ ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿ ಹೊಂದಿಸಲು ಆಯ್ಕೆ ಮಾಡಿ."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"ಈ ಸಾಧನವು ಈ <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ಅನಿರೀಕ್ಷಿತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"ವಿಷಯ ನಷ್ಟವನ್ನು ತಪ್ಪಿಸಲು ತೆಗೆದುಹಾಕುವುದಕ್ಕೂ ಮುನ್ನ ಮಾಧ್ಯಮವನ್ನು ಎಜೆಕ್ಟ್ ಮಾಡಿ"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> ಅವರನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string> @@ -1623,24 +1619,15 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"ವಾಲ್ಯೂಮ್ ಅನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾದ ಮಟ್ಟಕ್ಕಿಂತಲೂ ಹೆಚ್ಚು ಮಾಡುವುದೇ?\n\nದೀರ್ಘ ಅವಧಿಯವರೆಗೆ ಹೆಚ್ಚಿನ ವಾಲ್ಯೂಮ್ನಲ್ಲಿ ಆಲಿಸುವುದರಿಂದ ನಿಮ್ಮ ಆಲಿಸುವಿಕೆ ಸಾಮರ್ಥ್ಯಕ್ಕೆ ಹಾನಿಯುಂಟು ಮಾಡಬಹುದು."</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್ ಬಳಸುವುದೇ?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ಶಾರ್ಟ್ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಬಟನ್ಗಳನ್ನು 3 ಸೆಕೆಂಡುಗಳ ಕಾಲ ಒತ್ತಿದರೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವೊಂದು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ."</string> - <!-- no translation found for accessibility_shortcut_multiple_service_warning_title (8417489297036013065) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_warning (3740723309483706911) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_list (6935581470716541531) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning_title (3410100187167382427) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning (8412954203626349109) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning_title (2819109500943271385) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning (6363127705112844257) --> - <skip /> - <!-- no translation found for accessibility_shortcut_on (5463618449556111344) --> - <skip /> - <!-- no translation found for accessibility_shortcut_off (3651336255403648739) --> - <skip /> + <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳು ಆನ್ ಆಗುತ್ತವೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\n ಪ್ರಸ್ತುತ ವೈಶಿಷ್ಟ್ಯಗಳು:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಅಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿ ಆಯ್ದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನೀವು ಬದಲಾಯಿಸಬಹುದು."</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"TalkBack ಅನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ TalkBack ಆನ್ ಆಗುತ್ತದೆ, ಇದು ಕುರುಡರು ಅಥವಾ ಕಡಿಮೆ ದೃಷ್ಟಿ ಹೊಂದಿರುವ ಜನರಿಗೆ ಸಹಾಯವಾಗುವ ಒಂದು ಸ್ಕ್ರೀನ್ ರೀಡರ್ ಆಗಿದೆ. ನಿಮ್ಮ ಸಾಧನವು ಕಾರ್ಯನಿರ್ವಹಿಸುವ ವಿಧಾನವನ್ನು TalkBack ಸಂಪೂರ್ಣವಾಗಿ ಬದಲಾಯಿಸುತ್ತದೆ.\n\nನೀವು ಈ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಅಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿನ ಮತ್ತೊಂದು ವೈಶಿಷ್ಟ್ಯಕ್ಕೆ ಬದಲಾಯಿಸಬಹುದು."</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವಾದ <xliff:g id="SERVICE">%1$s</xliff:g> ಆನ್ ಆಗುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\nನೀವು ಈ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಅಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿನ ಮತ್ತೊಂದು ವೈಶಿಷ್ಟ್ಯಕ್ಕೆ ಬದಲಾಯಿಸಬಹುದು."</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ಆನ್ ಮಾಡಿ"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"ಆನ್ ಮಾಡಬೇಡಿ"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"ನಿಮ್ಮ ಸಾಧನದ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ಹೊಂದಲು <xliff:g id="SERVICE">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೆ?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"ನೀವು <xliff:g id="SERVICE">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಿದರೆ, ನಿಮ್ಮ ಸಾಧನವು ಡೇಟಾ ಎನ್ಕ್ರಿಪ್ಶನ್ ಅನ್ನು ವರ್ಧಿಸಲು ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ಲಾಕ್ ಅನ್ನು ಬಳಸುವುದಿಲ್ಲ."</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"ಪ್ರವೇಶಿಸುವಿಕೆಯ ಅವಶ್ಯಕತೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುವ ಆ್ಯಪ್ಗಳಿಗೆ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ನೀಡುವುದು ಸೂಕ್ತವಾಗಿರುತ್ತದೆ, ಆದರೆ ಬಹುತೇಕ ಆ್ಯಪ್ಗಳಿಗೆ ಇದು ಸೂಕ್ತವಲ್ಲ."</string> @@ -1651,10 +1638,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ಅನುಮತಿಸಿ"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ನಿರಾಕರಿಸಿ"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ವೈಶಿಷ್ಟ್ದ ಬಳಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು ಅದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ:"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_button_title (239446795930436325) --> - <skip /> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (1077294237378645981) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಜೊತೆಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"ವಾಲ್ಯೂಮ್ ಕೀ ಶಾರ್ಟ್ಕಟ್ ಜೊತೆಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ಪೂರ್ಣಗೊಂಡಿದೆ"</string> @@ -1662,23 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"ಶಾರ್ಟ್ಕಟ್ ಬಳಸಿ"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"ಬಣ್ಣ ವಿಲೋಮ"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"ಬಣ್ಣ ತಿದ್ದುಪಡಿ"</string> - <!-- no translation found for accessibility_shortcut_enabling_service (5473495203759847687) --> - <skip /> - <!-- no translation found for accessibility_shortcut_disabling_service (8675244165062700619) --> - <skip /> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಬಳಸಲು ಎರಡೂ ಧ್ವನಿ ಕೀಗಳನ್ನು ಮೂರು ಸೆಕೆಂಡ್ಗಳ ಕಾಲ ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ"</string> - <!-- no translation found for accessibility_button_prompt_text (8343213623338605305) --> - <skip /> - <!-- no translation found for accessibility_gesture_prompt_text (8742535972130563952) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_prompt_text (5211827854510660203) --> - <skip /> - <!-- no translation found for accessibility_button_instructional_text (8853928358872550500) --> - <skip /> - <!-- no translation found for accessibility_gesture_instructional_text (9196230728837090497) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_instructional_text (3425123684990193765) --> - <skip /> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆರಿಸಿ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್ನೊಂದಿಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್ನೊಂದಿಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ಹಿಗ್ಗಿಸುವಿಕೆ"</string> <string name="user_switched" msgid="7249833311585228097">"ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…"</string> @@ -2049,8 +2026,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್ಗಳು</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್ಗಳು</item> </plurals> - <!-- no translation found for chooser_no_direct_share_targets (1511722103987329028) --> - <skip /> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ಹಂಚಿಕೊಳ್ಳಲು, ಯಾವುದೇ ಶಿಫಾರಸು ಮಾಡಲಾದ ಜನರಿಲ್ಲ"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ಆ್ಯಪ್ಗಳ ಪಟ್ಟಿ"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ಈ ಆ್ಯಪ್ಗೆ ರೆಕಾರ್ಡ್ ಅನುಮತಿಯನ್ನು ನೀಡಲಾಗಿಲ್ಲ, ಆದರೆ ಈ USB ಸಾಧನದ ಮೂಲಕ ಆಡಿಯೊವನ್ನು ಸೆರೆಹಿಡಿಯಬಲ್ಲದು."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"ಹೋಮ್"</string> @@ -2068,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ಸಂವಾದ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ಗುಂಪು ಸಂವಾದ"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ವೈಯಕ್ತಿಕ"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ಕೆಲಸ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ವೈಯಕ್ತಿಕ ವೀಕ್ಷಣೆ"</string> @@ -2086,220 +2064,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಯಾವುದೇ ಆ್ಯಪ್ಗಳು ಈ ವಿಷಯವನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳು ಈ ವಿಷಯವನ್ನು ಬೆಂಬಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳು ಈ ವಿಷಯವನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ENTRY (8050953231914637819) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY (7164399703751688214) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ENTRY (4447629474818217364) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY (973059024670737358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ENTRY (4487435301206073787) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY (768060297218652809) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY (7129527319490548930) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY (2876126640607573252) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY (8952595089930109282) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ENTRY (3013902515773728996) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ENTRY (2974411408893410289) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ENTRY (687618528751880721) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ENTRY (6810596579655575381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ENTRY (2715929642540980259) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY (8557791623303951590) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ENTRY (7382468767274580323) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY (6730880791104286987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY (6432126539782267026) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY (1730510161529488920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY (3369885925003346830) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY (9129139686191167829) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY (2869929685874615358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ENTRY (1238663472392741771) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY (3988705848553894358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ENTRY (6186770686690993200) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ENTRY (7043865376145617024) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ENTRY (6144227308185112176) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS (4233355366318061180) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS (6742563947637715645) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS (2033399698172403560) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS (4795977251920732254) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS (1090425878157254446) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS (6476898876518094438) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS (6006806734293747731) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (6546680489620881893) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS (3506845511000727015) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_IN_PROGRESS (6709169861932992750) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS (4013870911606478520) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS (9032651188219523434) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS (6584576506344491207) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS (830981927724888114) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS (7851790973098894802) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_IN_PROGRESS (1149560739586960121) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS (5708964693522116025) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS (7288103122966483455) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS (4036752174056147753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS (5089536274515338566) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS (6737197986936251958) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS (5658767775619998623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS (665978313257653727) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS (3857142652251836850) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS (2695664012344346788) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (2695678959963807782) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS (1230605365926493599) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ERROR (1924844017037151535) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR (3372797822292089708) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR (1878443146720411381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ERROR (7664778312218023192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ERROR (2472944311643350302) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ERROR (828089694480999120) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ERROR (17619001007092511) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ERROR (807214229604353614) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ERROR (8644184447744175747) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR (3801002648649640407) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ERROR (707397021218680753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR (894358680773257820) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR (352466878146726991) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR (7353389721907138671) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR (2655263155490857920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ERROR (6903740900892931310) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR (5165901670447518687) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR (2856763216589267623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR (817542684437829139) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR (5178635064113393143) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR (5391587926974531008) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR (4895494864493315868) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ERROR (9017576601595353649) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR (1116993930995545742) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ERROR (7559167306794441462) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ERROR (2782926139511136588) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ERROR (1890493954453456758) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUCCESS (4886243367747126325) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS (4053809277733513987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS (8249342930499801740) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_SUCCESS (2339794542560381270) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_SUCCESS (6975608174152828954) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS (2846699261330463192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS (5335414726057102801) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_SUCCESS (8868100318474971969) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS (6020936629725666932) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS (6944873647584595489) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_SUCCESS (2526483514124121988) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS (7662200333621664621) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS (2861223407953766632) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS (5345648571175243272) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS (3725278343103422466) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS (6998502547560297983) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS (8555433771162560361) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS (3555767296933606232) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS (6778051818199974237) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS (4080108758498911429) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS (7873675303000794343) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS (1763198215069819523) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_SUCCESS (2053891977727320532) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS (8146602361895007345) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_SUCCESS (8058678548991999545) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_SUCCESS (2545608067978550571) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_SUCCESS (4352382949744625007) --> - <skip /> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ನೆಟ್ವರ್ಕ್ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ನ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"SIM ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"SIM ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM network1 ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM network2 ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM hrpd ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"RUIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIM ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK ನಮೂದಿಸಿ"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP Equivalent Home PLMN ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"SIM ನೆಟ್ವರ್ಕ್ ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"SIM ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ …"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"SIM ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"SIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM network1 ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM network2 ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM hrpd ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"RUIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP Equivalent Home PLMN ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ ಸೇವಾ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK ಅನ್ಲಾಕ್ಗಾಗಿ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"SIM Network ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"SIM ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"SIM ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"SIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM Network1 ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM Network2 ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM Hrpd ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK ಅನ್ಲಾಕ್ ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP Equivalent Home PLMN ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ವಿನಂತಿಯು ವಿಫಲವಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"SIM ನೆಟ್ವರ್ಕ್ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"SIM ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ನ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"SIM ಸೇವೆ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"SIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM Network1 ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM Network2 ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM Hrpd ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM ಸೇವಾ ಪೂರೈಕೆದಾರರ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"RUIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP Equivalent Home PLMN ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ ಸೇವಾ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 4d38d3f3fe5b..73a769b65c19 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"지원되지 않는 <xliff:g id="NAME">%s</xliff:g>입니다."</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"이 기기는 <xliff:g id="NAME">%s</xliff:g>을(를) 지원하지 않습니다. 지원하는 형식으로 설정하려면 탭하세요."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"이 기기는 이 <xliff:g id="NAME">%s</xliff:g>을(를) 지원하지 않습니다. 선택하여 지원되는 형식으로 설정하세요."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"기기가 이 <xliff:g id="NAME">%s</xliff:g>을(를) 지원하지 않습니다."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g>이(가) 예기치 않게 삭제됨"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"콘텐츠 손실을 피하려면 미디어를 제거하기 전에 마운트 해제하세요."</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> 제거됨"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"대화"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"그룹 대화"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"개인"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"직장"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"개인 뷰"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 6a634efc73c8..69d886f0dbd4 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> колдоого алынбайт"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт. Колдоого алынуучу форматта орнотуу үчүн таптап коюңуз."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт. Колдоого алынуучу форматта орнотуу үчүн тандаңыз."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> күтүүсүздөн өчүрүлдү"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Мазмунду жоготуп албаш үчүн алып салуудан мурда медианы өчүрүңүз"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> чыгарылды"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Жазышуу"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтук маек"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Жеке"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Жумуш"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көрүнүш"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 1f03694bad5a..2e331a03bb97 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ການສົນທະນາ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ການສົນທະນາກຸ່ມ"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"ສ່ວນຕົວ"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ວຽກ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ມຸມມອງສ່ວນຕົວ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3956dbd8c257..021717d5133c 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -243,7 +243,7 @@ <string name="global_action_power_off" msgid="4404936470711393203">"Išjungiamas maitinimas"</string> <string name="global_action_power_options" msgid="1185286119330160073">"Maitinimas"</string> <string name="global_action_restart" msgid="4678451019561687074">"Paleisti iš naujo"</string> - <string name="global_action_emergency" msgid="1387617624177105088">"Skambutis pagalbos numeriu"</string> + <string name="global_action_emergency" msgid="1387617624177105088">"Skubus atvejis"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"Pranešimas apie riktą"</string> <string name="global_action_logout" msgid="6093581310002476511">"Baigti seansą"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Ekrano kopija"</string> @@ -1391,8 +1391,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Nepalaikoma saugykla (<xliff:g id="NAME">%s</xliff:g>)"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Šis įrenginys nepalaiko šios <xliff:g id="NAME">%s</xliff:g>. Palieskite, kad nustatytumėte palaikomu formatu."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Šis įrenginys nepalaiko šios <xliff:g id="NAME">%s</xliff:g>. Pasirinkite ir nustatykite palaikomu formatu."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Šiame įrenginyje nepalaikoma <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> netikėtai pašalinta"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Prieš šalindami išimkite laikmeną, kad neprarastumėte turinio"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"Laikmena (<xliff:g id="NAME">%s</xliff:g>) atjungta"</string> @@ -2113,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Pokalbis"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupės pokalbis"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Asmeninė"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Darbo"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Asmeninė peržiūra"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 778a08b589be..6ea61a170fe0 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1371,8 +1371,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Neatbalstīts datu nesējs (<xliff:g id="NAME">%s</xliff:g>)"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Šī ierīce neatbalsta datu nesēju <xliff:g id="NAME">%s</xliff:g>. Pieskarieties, lai iestatītu to atbalstītā formātā."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Šajā ierīcē netiek atbalstīta šī <xliff:g id="NAME">%s</xliff:g>. Atlasiet, lai iestatītu atbalstītu formātu."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Šajā ierīcē netiek atbalstīta šī <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> tika negaidīti izņemta"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Lai nezaudētu saturu, pirms izņemšanas izstumiet datu nesēju."</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"Ierīce <xliff:g id="NAME">%s</xliff:g> izņemta"</string> @@ -2079,6 +2078,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Saruna"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupas saruna"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Privātais profils"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Darba profils"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personisks skats"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 4c75e994cb44..9c434db0d025 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -2046,6 +2046,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Разговор"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групен разговор"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Лични"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Службени"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Личен приказ"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 84dfa955c532..ad0cde1d4f87 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -237,10 +237,8 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"ഫോൺ ഓപ്ഷനുകൾ"</string> <string name="global_action_lock" msgid="6949357274257655383">"സ്ക്രീൻ ലോക്ക്"</string> <string name="global_action_power_off" msgid="4404936470711393203">"പവർ ഓഫാക്കുക"</string> - <!-- no translation found for global_action_power_options (1185286119330160073) --> - <skip /> - <!-- no translation found for global_action_restart (4678451019561687074) --> - <skip /> + <string name="global_action_power_options" msgid="1185286119330160073">"പവർ"</string> + <string name="global_action_restart" msgid="4678451019561687074">"റീസ്റ്റാർട്ട് ചെയ്യുക"</string> <string name="global_action_emergency" msgid="1387617624177105088">"അടിയന്തിരാവശ്യം"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"ബഗ് റിപ്പോർട്ട്"</string> <string name="global_action_logout" msgid="6093581310002476511">"സെഷൻ അവസാനിപ്പിക്കുക"</string> @@ -299,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ ആക്സസ്സ് ചെയ്യുക"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"ലൊക്കേഷൻ"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"കലണ്ടർ"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"നിങ്ങളുടെ കലണ്ടർ ആക്സസ്സ് ചെയ്യുക"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS സന്ദേശങ്ങൾ അയയ്ക്കുകയും കാണുകയും ചെയ്യുക"</string> @@ -440,8 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"ചിത്രങ്ങളും വീഡിയോകളും എടുക്കുക"</string> <string name="permdesc_camera" msgid="1354600178048761499">"ഏതുസമയത്തും ക്യാമറ ഉപയോഗിച്ചുകൊണ്ട് ചിത്രങ്ങൾ എടുക്കാനും വീഡിയോകൾ റെക്കോർഡുചെയ്യാനും ഈ ആപ്പിന് കഴിയും."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ചിത്രങ്ങളും വീഡിയോകളും എടുക്കാൻ, സിസ്റ്റം ക്യാമറ ആക്സസ് ചെയ്യുന്നതിന് ആപ്പിനെയോ സേവനത്തെയോ അനുവദിക്കുക"</string> - <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> - <skip /> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"സിസ്റ്റം ക്യാമറ ഉപയോഗിച്ച് ഏത് സമയത്തും ചിത്രങ്ങളെടുക്കാനും വീഡിയോകൾ റെക്കോർഡ് ചെയ്യാനും ഈ വിശേഷാധികാര അല്ലെങ്കിൽ സിസ്റ്റം ആപ്പിന് കഴിയും. ആപ്പിലും android.permission.CAMERA അനുമതി ഉണ്ടായിരിക്കണം"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"ക്യാമറയുള്ള ഉപകരണങ്ങൾ ഓണാക്കുന്നതിനെയോ അടയ്ക്കുന്നതിനെയോ കുറിച്ചുള്ള കോൾബാക്കുകൾ സ്വീകരിക്കാൻ ആപ്പിനെയോ സേവനത്തെയോ അനുവദിക്കുക."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"ഏതെങ്കിലും ക്യാമറ ഉപകരണം തുറക്കുമ്പോഴോ (ഏത് ആപ്പ് ഉപയോഗിച്ചും) അടയ്ക്കുമ്പോഴോ ഈ ആപ്പിന് കോൾബാക്കുകൾ സ്വീകരിക്കാനാവും."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"വൈബ്രേറ്റുചെയ്യൽ നിയന്ത്രിക്കുക"</string> @@ -1354,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"പിന്തുണയില്ലാത്ത <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ഈ ഉപകരണം <xliff:g id="NAME">%s</xliff:g> പിന്തുണയ്ക്കുന്നതല്ല. പിന്തുണയുള്ള ഫോർമാറ്റിൽ സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"<xliff:g id="NAME">%s</xliff:g> ഈ ഉപകരണത്തിന് അനുയോജ്യമല്ല. അനുയോജ്യമായ ഒരു ഫോർമാറ്റിൽ സജ്ജമാക്കുന്നതിന് തിരഞ്ഞെടുക്കുക."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"ഈ ഉപകരണം ഈ <xliff:g id="NAME">%s</xliff:g> പിന്തുണയ്ക്കുന്നില്ല."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> അപ്രതീക്ഷിതമായി നീക്കംചെയ്തു"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"ഉള്ളടക്കം നഷ്ടമാകുന്നത് തടയാൻ, നീക്കം ചെയ്യുന്നതിന് മുൻപ് മീഡിയ ഒഴിവാക്കുക"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> നീക്കം ചെയ്തു"</string> @@ -1623,24 +1619,15 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"മുകളിൽക്കൊടുത്തിരിക്കുന്ന ശുപാർശചെയ്ത ലെവലിലേക്ക് വോളിയം വർദ്ധിപ്പിക്കണോ?\n\nഉയർന്ന വോളിയത്തിൽ ദീർഘനേരം കേൾക്കുന്നത് നിങ്ങളുടെ ശ്രവണ ശേഷിയെ ദോഷകരമായി ബാധിക്കാം."</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ഉപയോഗസഹായി കുറുക്കുവഴി ഉപയോഗിക്കണോ?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"കുറുക്കുവഴി ഓണായിരിക്കുമ്പോൾ, രണ്ട് വോളിയം ബട്ടണുകളും 3 സെക്കൻഡ് നേരത്തേക്ക് അമർത്തുന്നത് ഉപയോഗസഹായി ഫീച്ചർ ആരംഭിക്കും."</string> - <!-- no translation found for accessibility_shortcut_multiple_service_warning_title (8417489297036013065) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_warning (3740723309483706911) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_list (6935581470716541531) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning_title (3410100187167382427) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning (8412954203626349109) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning_title (2819109500943271385) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning (6363127705112844257) --> - <skip /> - <!-- no translation found for accessibility_shortcut_on (5463618449556111344) --> - <skip /> - <!-- no translation found for accessibility_shortcut_off (3651336255403648739) --> - <skip /> + <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"ഉപയോഗസഹായി ഫീച്ചറുകൾ ഓണാക്കണോ?"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"രണ്ട് വോളിയം കീകളും അൽപ്പ നേരത്തേക്ക് അമർത്തിപ്പിടിക്കുന്നത്, ഉപയോഗസഹായി ഫീച്ചറുകൾ ഓണാക്കുന്നു. നിങ്ങളുടെ ഉപകരണം പ്രവർത്തിക്കുന്ന വിധം ഇത് മാറ്റിയേക്കാം.\n\nനിലവിലുള്ള ഫീച്ചറുകൾ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nതിരഞ്ഞെടുത്ത ഫീച്ചറുകൾ ക്രമീകരണം > ഉപയോഗസഹായി എന്നതിൽ മാറ്റാനാവും."</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"TalkBack ഓണാക്കണോ?"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"രണ്ട് വോളിയം കീകളും അൽപ്പ നേരത്തേക്ക് അമർത്തിപ്പിടിക്കുന്നത്, കാഴ്ചക്കുറവുള്ളവർക്കോ അന്ധർക്കോ ഉപകാരപ്പെടുന്ന TalkBack എന്ന സ്ക്രീൻ റീഡർ ഓണാക്കുന്നു. നിങ്ങളുടെ ഉപകരണം പ്രവർത്തിക്കുന്ന വിധം TalkBack പൂർണ്ണമായും മാറ്റുന്നു.\n\nക്രമീകരണം > ഉപയോഗസഹായി എന്നതിലെ മറ്റൊരു ഫീച്ചറിലേക്ക് നിങ്ങൾക്ക് ഈ കുറുക്കുവഴി മാറ്റാനാവും."</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> ഓണാക്കണോ?"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"രണ്ട് വോളിയം കീകളും അൽപ്പ നേരത്തേക്ക് അമർത്തിപ്പിടിക്കുന്നത് ഉപയോഗസഹായി ഫീച്ചറായ <xliff:g id="SERVICE">%1$s</xliff:g> എന്നതിനെ ഓണാക്കുന്നു. നിങ്ങളുടെ ഉപകരണം പ്രവർത്തിക്കുന്ന വിധം ഇത് മാറ്റിയേക്കാം.\n\nക്രമീകരണം > ഉപയോഗസഹായി എന്നതിലെ മറ്റൊരു ഫീച്ചറിലേക്ക് നിങ്ങൾക്ക് ഈ കുറുക്കുവഴി മാറ്റാനാവും."</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ഓണാക്കുക"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"ഓണാക്കരുത്"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> എന്നതിന് നിങ്ങളുടെ ഉപകരണത്തിന്മേൽ പൂർണ്ണ നിയന്ത്രണം അനുവദിക്കണോ?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"<xliff:g id="SERVICE">%1$s</xliff:g> ഓണാക്കിയെങ്കിൽ, ഡാറ്റ എൻക്രിപ്ഷൻ മെച്ചപ്പെടുത്താൻ ഉപകരണം നിങ്ങളുടെ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കില്ല."</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"ഉപയോഗസഹായി ആവശ്യങ്ങൾക്കായി നിങ്ങളെ സഹായിക്കുന്ന ആപ്പുകൾക്ക് പൂർണ്ണ നിയന്ത്രണം അനുയോജ്യമാണെങ്കിലും മിക്ക ആപ്പുകൾക്കും അനുയോജ്യമല്ല."</string> @@ -1651,10 +1638,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"അനുവദിക്കൂ"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"നിരസിക്കുക"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ഇത് ഉപയോഗിക്കാൻ ആരംഭിക്കുന്നതിന് ഫീച്ചർ ടാപ്പ് ചെയ്യുക:"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_button_title (239446795930436325) --> - <skip /> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (1077294237378645981) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ഉപയോഗസഹായി ബട്ടണിന്റെ സഹായത്തോടെ, ഉപയോഗിക്കാൻ ഫീച്ചറുകൾ തിരഞ്ഞെടുക്കുക"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"വോളിയം കീ കുറുക്കുവഴിയുടെ സഹായത്തോടെ, ഉപയോഗിക്കാൻ ഫീച്ചറുകൾ തിരഞ്ഞെടുക്കുക"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ഓഫാക്കിയിരിക്കുന്നു"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"കുറുക്കുവഴികൾ തിരുത്തുക"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"പൂർത്തിയാക്കി"</string> @@ -1662,23 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"കുറുക്കുവഴി ഉപയോഗിക്കുക"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"വർണ്ണ വിപര്യയം"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"വർണ്ണം ക്രമീകരിക്കൽ"</string> - <!-- no translation found for accessibility_shortcut_enabling_service (5473495203759847687) --> - <skip /> - <!-- no translation found for accessibility_shortcut_disabling_service (8675244165062700619) --> - <skip /> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"വോളിയം കീകൾ പിടിച്ചു. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓണാക്കി."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"വോളിയം കീകൾ പിടിച്ചു. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓഫാക്കി."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും മൂന്ന് സെക്കൻഡ് അമർത്തിപ്പിടിക്കുക"</string> - <!-- no translation found for accessibility_button_prompt_text (8343213623338605305) --> - <skip /> - <!-- no translation found for accessibility_gesture_prompt_text (8742535972130563952) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_prompt_text (5211827854510660203) --> - <skip /> - <!-- no translation found for accessibility_button_instructional_text (8853928358872550500) --> - <skip /> - <!-- no translation found for accessibility_gesture_instructional_text (9196230728837090497) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_instructional_text (3425123684990193765) --> - <skip /> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പ് ചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നതിന് ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ഉപയോഗസഹായി വിരൽചലനത്തോടൊപ്പം ഉപയോഗിക്കാൻ ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക (രണ്ട് വിരലുകളുപയോഗിച്ച് സ്ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ഉപയോഗസഹായി വിരൽചലനത്തോടൊപ്പം ഉപയോഗിക്കാൻ ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക (മൂന്ന് വിരലുകളുപയോഗിച്ച് സ്ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക):"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ഫീച്ചറുകൾക്കിടയിൽ മാറാൻ, ഉപയോഗസഹായി ബട്ടൺ സ്പർശിച്ച് പിടിക്കുക."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ഫീച്ചറുകൾക്കിടയിൽ മാറാൻ, രണ്ട് വിരലുകളുപയോഗിച്ച് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ഫീച്ചറുകൾക്കിടയിൽ മാറാൻ, മൂന്ന് വിരലുകളുപയോഗിച്ച് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"മാഗ്നിഫിക്കേഷൻ"</string> <string name="user_switched" msgid="7249833311585228097">"നിലവിലെ ഉപയോക്താവ് <xliff:g id="NAME">%1$s</xliff:g> ആണ്."</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> എന്ന ഉപയോക്താവിലേക്ക് മാറുന്നു…"</string> @@ -2049,8 +2026,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ഫയലുകൾ</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ഫയൽ</item> </plurals> - <!-- no translation found for chooser_no_direct_share_targets (1511722103987329028) --> - <skip /> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"പങ്കിടാൻ, നിർദ്ദേശിക്കപ്പെട്ട ആളുകളൊന്നുമില്ല"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ആപ്പുകളുടെ ലിസ്റ്റ്"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ഈ ആപ്പിന് റെക്കോർഡ് അനുമതി നൽകിയിട്ടില്ല, എന്നാൽ ഈ USB ഉപകരണത്തിലൂടെ ഓഡിയോ ക്യാപ്ചർ ചെയ്യാനാവും."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"ഹോം"</string> @@ -2068,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"സംഭാഷണം"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ഗ്രൂപ്പ് സംഭാഷണം"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"വ്യക്തിപരമായത്"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ജോലിസ്ഥലം"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"വ്യക്തിപര കാഴ്ച"</string> @@ -2086,220 +2064,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"ഔദ്യോഗിക ആപ്പുകൾക്കൊന്നും ഈ ഉള്ളടക്കം തുറക്കാനാവില്ല"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"വ്യക്തിപര ആപ്പുകൾക്കൊന്നും ഈ ഉള്ളടക്കത്തെ പിന്തുണയ്ക്കാനാവില്ല"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"വ്യക്തിപര ആപ്പുകൾക്കൊന്നും ഈ ഉള്ളടക്കം തുറക്കാനാവില്ല"</string> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ENTRY (8050953231914637819) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY (7164399703751688214) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ENTRY (4447629474818217364) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY (973059024670737358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ENTRY (4487435301206073787) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY (768060297218652809) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY (7129527319490548930) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY (2876126640607573252) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY (8952595089930109282) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ENTRY (3013902515773728996) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ENTRY (2974411408893410289) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ENTRY (687618528751880721) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ENTRY (6810596579655575381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ENTRY (2715929642540980259) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY (8557791623303951590) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ENTRY (7382468767274580323) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY (6730880791104286987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY (6432126539782267026) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY (1730510161529488920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY (3369885925003346830) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY (9129139686191167829) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY (2869929685874615358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ENTRY (1238663472392741771) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY (3988705848553894358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ENTRY (6186770686690993200) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ENTRY (7043865376145617024) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ENTRY (6144227308185112176) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS (4233355366318061180) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS (6742563947637715645) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS (2033399698172403560) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS (4795977251920732254) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS (1090425878157254446) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS (6476898876518094438) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS (6006806734293747731) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (6546680489620881893) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS (3506845511000727015) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_IN_PROGRESS (6709169861932992750) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS (4013870911606478520) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS (9032651188219523434) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS (6584576506344491207) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS (830981927724888114) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS (7851790973098894802) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_IN_PROGRESS (1149560739586960121) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS (5708964693522116025) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS (7288103122966483455) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS (4036752174056147753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS (5089536274515338566) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS (6737197986936251958) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS (5658767775619998623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS (665978313257653727) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS (3857142652251836850) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS (2695664012344346788) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (2695678959963807782) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS (1230605365926493599) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ERROR (1924844017037151535) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR (3372797822292089708) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR (1878443146720411381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ERROR (7664778312218023192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ERROR (2472944311643350302) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ERROR (828089694480999120) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ERROR (17619001007092511) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ERROR (807214229604353614) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ERROR (8644184447744175747) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR (3801002648649640407) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ERROR (707397021218680753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR (894358680773257820) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR (352466878146726991) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR (7353389721907138671) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR (2655263155490857920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ERROR (6903740900892931310) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR (5165901670447518687) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR (2856763216589267623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR (817542684437829139) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR (5178635064113393143) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR (5391587926974531008) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR (4895494864493315868) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ERROR (9017576601595353649) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR (1116993930995545742) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ERROR (7559167306794441462) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ERROR (2782926139511136588) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ERROR (1890493954453456758) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUCCESS (4886243367747126325) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS (4053809277733513987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS (8249342930499801740) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_SUCCESS (2339794542560381270) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_SUCCESS (6975608174152828954) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS (2846699261330463192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS (5335414726057102801) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_SUCCESS (8868100318474971969) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS (6020936629725666932) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS (6944873647584595489) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_SUCCESS (2526483514124121988) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS (7662200333621664621) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS (2861223407953766632) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS (5345648571175243272) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS (3725278343103422466) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS (6998502547560297983) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS (8555433771162560361) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS (3555767296933606232) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS (6778051818199974237) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS (4080108758498911429) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS (7873675303000794343) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS (1763198215069819523) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_SUCCESS (2053891977727320532) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS (8146602361895007345) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_SUCCESS (8058678548991999545) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_SUCCESS (2545608067978550571) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_SUCCESS (4352382949744625007) --> - <skip /> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"സിം നെറ്റ്വർക്ക് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"സിം നെറ്റ്വർക്ക് സബ്സെറ്റ് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"സിം കോർപ്പറേറ്റ് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"സിം സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"സിം അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM നെറ്റ്വർക്ക്1 അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM നെറ്റ്വർക്ക്2 അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM എച്ച്ആർപിഡി അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"ഉപകരണത്തിൽ RUIM സേവനദാതാവ് നൽകിയ കോർപ്പറേറ്റ് ലോക്ക് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIM അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK നൽകുക"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP ഇക്വിവാലന്റ് ഹോം PLMN അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"നെറ്റ്വർക്ക് സബ്സെറ്റ് സേവനദാതാവിനെ അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"SIM അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"സിം നെറ്റ്വർക്ക് സബ്സെറ്റ് അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു …"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"സിം സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"സിം കോർപ്പറേറ്റ് അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"സിം അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM നെറ്റ്വർക്ക്1 അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM നെറ്റ്വർക്ക്2 അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM എച്ച്ആർപിഡി അൺലോക്ക് അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"ഉപകരണത്തിൽ RUIM സേവനദാതാവ് നൽകിയ കോർപ്പറേറ്റ് ലോക്ക് അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു..."</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN അൺലോക്ക് അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP ഇക്വിവാലന്റ് ഹോം PLMN അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"നെറ്റ്വർക്ക് സബ്സെറ്റ് സേവനദാതാവിനെ അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കുന്നു…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"സിം നെറ്റ്വർക്ക് അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"സിം നെറ്റ്വർക്ക് സബ്സെറ്റ് അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"സിം സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"സിം കോർപ്പറേറ്റ് അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"സിം അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM നെറ്റ്വർക്ക്1 അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM നെറ്റ്വർക്ക്2 അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM എച്ച്ആർപിഡി അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM കോർപ്പറേറ്റ് അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK അൺലോക്ക് ചെയ്യാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP ഇക്വിവാലന്റ് ഹോം PLMN അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"നെറ്റ്വർക്ക് സബ്സെറ്റ് സേവനദാതാവിനെ അൺലോക്ക് ചെയ്യാൻ അഭ്യർത്ഥിക്കാനായില്ല."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"സിം നെറ്റ്വർക്ക് അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"സിം നെറ്റ്വർക്ക് സബ്സെറ്റ് അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"സിം സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"സിം കോർപ്പറേറ്റ് അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"സിം അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM നെറ്റ്വർക്ക്1 അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM നെറ്റ്വർക്ക്2 അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM എച്ച്ആർപിഡി അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM സേവന ദാതാവിനെ അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"ഉപകരണത്തിൽ RUIM സേവനദാതാവ് നൽകിയ കോർപ്പറേറ്റ് ലോക്ക് അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP ഇക്വിവാലന്റ് ഹോം PLMN അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI അൺലോക്ക് ചെയ്തു."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"നെറ്റ്വർക്ക് സബ്സെറ്റ് സേവനദാതാവിനെ അൺലോക്ക് ചെയ്തു."</string> </resources> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index a3d21ec409ab..462d3a5c52ea 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Харилцан яриа"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Бүлгийн харилцан яриа"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Хувийн"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Ажил"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Хувийн харагдах байдал"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 81765426fa51..5dc743355260 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -297,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"आपल्या संपर्कांवर प्रवेश"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"स्थान"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"या डिव्हाइसच्या स्थानावर प्रवेश"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"कॅलेंडर"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"आपल्या कॅलेंडरवर प्रवेश"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS मेसेज पाठवणे आणि पाहणे हे"</string> @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> असमर्थित"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"हे डिव्हाइस <xliff:g id="NAME">%s</xliff:g> ला सपोर्ट करत नाही. सपोर्ट असलेल्या फॉरमॅटमध्ये सेट करण्यासाठी टॅप करा."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"हे डिव्हाइस <xliff:g id="NAME">%s</xliff:g> ला सपोर्ट करत नाही. सपोर्ट असलेल्या फॉरमॅटमध्ये सेट करण्यासाठी निवडा."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"हे डिव्हाइस या <xliff:g id="NAME">%s</xliff:g> ला सपोर्ट करत नाही."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> अनपेक्षितरित्या काढले"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"आशय गमावणे टाळण्यासाठी काढून टाकण्यापूर्वी मीडिया इजेक्ट करा"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> काढून टाकले आहे."</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"संभाषण"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"गट संभाषण"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"वैयक्तिक"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ऑफिस"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"वैयक्तिक दृश्य"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index b4d0fa3dac71..752a9c72e6ee 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Perbualan"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Perbualan Kumpulan"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Peribadi"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Kerja"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Paparan peribadi"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index f7107a48d612..e94e5536bd0b 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"စကားဝိုင်း"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"အဖွဲ့စကားဝိုင်း"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"ကိုယ်ပိုင်"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"အလုပ်"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ပုဂ္ဂိုလ်ရေးဆိုင်ရာ မြင်ကွင်း"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 6d78f8900cca..e41127b30609 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Samtale"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppesamtale"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personlig"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Jobb"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personlig visning"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index be86c4061069..6693823eb4c1 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -438,7 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"तस्बिरहरू र भिडियोहरू लिनुहोस्।"</string> <string name="permdesc_camera" msgid="1354600178048761499">"यस अनुप्रयोगले जुनसुकै समय क्यामेराको प्रयोग गरी तस्बिर खिच्न र भिडियो रेकर्ड गर्न सक्छ।"</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"अनुप्रयोग वा सेवालाई तस्बिर र भिडियो खिच्न प्रणालीका क्यामेराहरूमाथि पहुँच राख्न दिनुहोस्"</string> - <string name="permdesc_systemCamera" msgid="5938360914419175986">"प्रणालीको यस विशेषाधिकार प्राप्त अनुप्रयोगले जुनसुकै बेला प्रणालीको क्यामेरा प्रयोग गरी तस्बिर खिच्न र भिडियो रेकर्ड गर्न सक्छ। अनुप्रयोगसँग पनि android.permission.CAMERA सम्बन्धी अनुमति हुनु पर्छ"</string> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"प्रणालीको यस विशेषाधिकार प्राप्त अनुप्रयोगले जुनसुकै बेला प्रणालीको क्यामेरा प्रयोग गरी तस्बिर खिच्न र भिडियो रेकर्ड गर्न सक्छ। अनुप्रयोगसँग पनि android.permission.CAMERA प्रयोग गर्ने अनुमति हुनु पर्छ"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"कुनै अनुप्रयोग वा सेवालाई खोलिँदै वा बन्द गरिँदै गरेका क्यामेरा यन्त्रहरूका बारेमा कलब्याक प्राप्त गर्ने अनुमति दिनुहोस्।"</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"कुनै क्यामेरा यन्त्र खोलिँदा (कुन अनुप्रयोगले खोलेको भन्ने बारेमा) वा बन्द गरिँदा यो अनुप्रयोगले कलब्याक प्राप्त गर्न सक्छ।"</string> <string name="permlab_vibrate" msgid="8596800035791962017">"कम्पन नियन्त्रण गर्नुहोस्"</string> @@ -1357,8 +1357,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"यस यन्त्रले यस <xliff:g id="NAME">%s</xliff:g> लाई समर्थन गर्दैन। एक समर्थित ढाँचामा सेटअप गर्न ट्याप गर्नुहोस्।"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"यो यन्त्रले यस <xliff:g id="NAME">%s</xliff:g> लाई समर्थन गर्दैन। एक समर्थित ढाँचामा सेटअप गर्न चयन गर्नुहोस्।"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"यो यन्त्रमा यो <xliff:g id="NAME">%s</xliff:g> चल्दैन।"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूपमा निकालियो"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"सामग्री गुम्न नदिनका लागि मिडिया हटाउनुअघि त्यसलाई इजेक्ट गर्नुहोस्"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> हटाइयो"</string> @@ -1630,11 +1629,11 @@ <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"केही सेकेन्डसम्म दुवै भोल्युम बटन थिचिराख्नुले पहुँचसम्बन्धी सुविधाहरू सक्रिय गर्छ। यसले तपाईंको यन्त्रले काम गर्ने तरिका परिवर्तन गर्न सक्छ।\n\nहालका सुविधाहरू:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nतपाईं सेटिङ > पहुँचमा गएर चयन गरिएका सुविधाहरू परिवर्तन गर्न सक्नुहुन्छ।"</string> <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"TalkBack सक्रिय गर्ने हो?"</string> - <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"केही सेकेन्डसम्म दुवै भोल्युम बटन थिचिराख्नुले TalkBack सक्रिय गर्छ। यो दृष्टिविहीन वा दृष्टि कमजोर भएका मान्छेहरूका लागि उपयोगी हुने एउटा स्क्रिन रिडर हो। TalkBack ले तपाईंको यन्त्रले काम गर्ने तरिका पूर्णतया परिवर्तन गर्छ।\n\nतपाईं सेटिङ > पहुँचमा गई यो सर्टकटमार्फत खुल्ने सुविधा परिवर्तन गर्न सक्नुहुन्छ।"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"केही सेकेन्डसम्म दुवै भोल्युम बटन थिचिराख्नुले TalkBack सक्रिय गर्छ। यो दृष्टिविहीन वा दृष्टि कमजोर भएका मान्छेहरूका लागि उपयोगी हुने एउटा स्क्रिन रिडर हो। TalkBack ले तपाईंको यन्त्रले काम गर्ने तरिका पूर्णतया परिवर्तन गर्छ।\n\nतपाईं सेटिङ > पहुँचमा गई यो सर्टकटमार्फत अर्को सुविधा खुल्ने बनाउन सक्नुहुन्छ।"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> सक्रिय गर्ने हो?"</string> - <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"केही सेकेन्डसम्म दुवै भोल्युम बटन थिचिराख्नुले <xliff:g id="SERVICE">%1$s</xliff:g> सक्रिय गर्छ। यो पहुँचसम्बन्धी एउटा सुविधा हो। यसले तपाईंको यन्त्रले काम गर्ने तरिका परिवर्तन गर्न सक्छ।\n\nतपाईं सेटिङ > पहुँचमा गई यो सर्टकटमार्फत खुल्ने सुविधा परिवर्तन गर्न सक्नुहुन्छ।"</string> - <string name="accessibility_shortcut_on" msgid="5463618449556111344">"सक्रिय गर्नुहोस्"</string> - <string name="accessibility_shortcut_off" msgid="3651336255403648739">"सक्रिय नगर्नुहोस्"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"केही सेकेन्डसम्म दुवै भोल्युम बटन थिचिराख्नुले <xliff:g id="SERVICE">%1$s</xliff:g> नामक पहुँचसम्बन्धी सुविधा सक्रिय गर्छ। यसले तपाईंको यन्त्रले काम गर्ने तरिका परिवर्तन गर्न सक्छ।\n\nतपाईं सेटिङ > पहुँचमा गई यो सर्टकटमार्फत अर्को सुविधा खुल्ने बनाउन सक्नुहुन्छ।"</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"सक्रिय गरियोस्"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"सक्रिय नगरियोस्"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> लाई तपाईंको यन्त्र पूर्ण रूपमा नियन्त्रण गर्न दिने हो?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"तपाईंले <xliff:g id="SERVICE">%1$s</xliff:g> सक्रिय गर्नुभयो भने तपाईंको यन्त्रले डेटा इन्क्रिप्ट गर्ने सुविधाको स्तरोन्नति गर्न तपाईंको स्क्रिन लक सुविधाको प्रयोग गर्ने छैन।"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"तपाईंलाई पहुँच राख्न आवश्यक पर्ने कुरामा सहयोग गर्ने अनुप्रयोगहरूमाथि पूर्ण नियन्त्रण गर्नु उपयुक्त हुन्छ तर अधिकांश अनुप्रयोगहरूका हकमा यस्तो नियन्त्रण उपयुक्त हुँदैन।"</string> @@ -1645,8 +1644,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"अनुमति दिनुहोस्"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"इन्कार गर्नु⋯"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"कुनै सुविधा प्रयोग गर्न थाल्न उक्त सुविधामा ट्याप गर्नुहोस्:"</string> - <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"पहुँचको बटनमार्फत प्रयोग गरिने सुविधाहरू छनौट गर्नुहोस्"</string> - <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"भोल्युम कुञ्जीको सर्टकटमार्फत प्रयोग गरिने सुविधाहरू छनौट गर्नुहोस्"</string> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"पहुँचको बटनमार्फत प्रयोग गर्न चाहेका सुविधाहरू छनौट गर्नुहोस्"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"भोल्युम कुञ्जीको सर्टकटमार्फत प्रयोग गर्न चाहेका सुविधाहरू छनौट गर्नुहोस्"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> निष्क्रिय पारिएको छ"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"सर्टकटहरू सम्पादन गर्नुहोस्"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"सम्पन्न भयो"</string> @@ -1657,7 +1656,7 @@ <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"तपाईंले भोल्युम बटनहरू थिचिराख्नुभयो। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> सक्रिय पारियो।"</string> <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"तपाईंले भोल्युम बटनहरू थिचिराख्नुभयो। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> निष्क्रिय पारियो।"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> प्रयोग गर्न दुवै भोल्युम कुञ्जीहरूलाई तीन सेकेन्डसम्म थिचिराख्नुहोस्"</string> - <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"तपाईंले पहुँचको बटन ट्याप गरेर प्रयोग गर्न चाहनुभएको सुविधा छनौट गर्नुहोस्:"</string> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"तपाईंले पहुँचको बटन ट्याप गर्दा प्रयोग गर्न चाहनुभएको सुविधा छनौट गर्नुहोस्:"</string> <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"तपाईंले पहुँचको इसारामार्फत प्रयोग गर्न चाहनुभएको सुविधा छनौट गर्नुहोस् (दुईवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):"</string> <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"तपाईंले पहुँचको इसारामार्फत प्रयोग गर्न चाहनुभएको सुविधा छनौट गर्नुहोस् (तीनवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):"</string> <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"एउटा सुविधाबाट अर्को सुविधामा जान पहुँचको बटनमा छोइराख्नुहोस्।"</string> @@ -2033,7 +2032,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइलहरू</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> फाइल</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"सेयर गर्न सिफारिस गरिएको कुनै पनि व्यक्ति छैन"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"कुनै पनि व्यक्तिसँग सेयर गर्ने सिफारिस गरिएको छैन"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"अनुप्रयोगहरूको सूची"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"यो अनुप्रयोगलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले यो USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"गृहपृष्ठ"</string> @@ -2051,6 +2050,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"वार्तालाप"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"सामूहिक वार्तालाप"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"व्यक्तिगत"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"काम"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"व्यक्तिगत दृश्य"</string> @@ -2070,7 +2071,7 @@ <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"यो सामग्री कुनै पनि व्यक्तिगत अनुप्रयोगमार्फत सेयर गर्न मिल्दैन"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"यो सामग्री कुनै पनि व्यक्तिगत अनुप्रयोगमार्फत खोल्न मिल्दैन"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM को नेटवर्क अनलक गर्ने PIN"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM को नेटवर्कको उपसमूह अनलक गर्ने PIN"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM को नेटवर्कको सबसेट अनलक गर्ने PIN"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM को कर्पोरेट लक खोल्ने PIN"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"SIM को सेवा प्रदायकसम्बन्धी लक खोल्ने PIN"</string> <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"SIM अनलक गर्ने PIN"</string> @@ -2079,8 +2080,8 @@ <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK प्रविष्टि गर्नुहोस्"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK प्रविष्टि गर्नुहोस्"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK प्रविष्टि गर्नुहोस्"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM को network1 नेटवर्क अनलक गर्ने PIN"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM को network2 नेटवर्क अनलक गर्ने PIN"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM को network1 अनलक गर्ने PIN"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM को network2 अनलक गर्ने PIN"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM को hrpd अनलक गर्ने PIN"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"RUIM को कर्पोरेट लक खोल्ने PIN"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM को सेवा प्रदायकसम्बन्धी लक खोल्ने PIN"</string> @@ -2095,19 +2096,19 @@ <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"घरमा जोडिने SP सरहको PLMN अनलक गर्ने PIN"</string> <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID अनलक गर्ने PIN"</string> <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI अनलक गर्ने PIN"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"नेटवर्कको उपसमूहको सेवा प्रदायकसम्बन्धी लक खोल्ने PIN"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"नेटवर्कको सबसेटको सेवा प्रदायकसम्बन्धी लक खोल्ने PIN"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"SIM को नेटवर्क अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"SIM को नेटवर्कको उपसमूह अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"SIM को नेटवर्कको सबसेट अनलक गरिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"SIM को सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"SIM को कर्पोरेट लक खोलिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM को network1 नेटवर्क अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM को network2 नेटवर्क अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM को network1 अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM को network2 अनलक गरिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM को hrpd अनलक गरिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM को सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"RUIM को कर्पोरेट लक खोलिदिन अनुरोध गर्दै…"</string> @@ -2115,66 +2116,66 @@ <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"घरमा जोडिने SP सरहको PLMN अनलक गरिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID अनलक गरिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"नेटवर्कको उपसमूहको सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"नेटवर्कको सबसेटको सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्दै…"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK प्रयोग गरेर अनलक गरिदिन अनुरोध गर्दै…"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"SIM को नेटवर्क अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"SIM को नेटवर्कको उपसमूह अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK अनलक गरिदिन अनुरोध गर्दै…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"SIM को नेटवर्क अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"SIM को नेटवर्कको सबसेट अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"SIM को सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्न सकिएन।"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"SIM को कर्पोरेट लक खोलिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM को Network1 नेटवर्क अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM को Network2 नेटवर्क अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM को Hrpd अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM को कर्पोरेट लक खोलिदिन अनुरोध गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM को Network1 अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM को Network2 अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM को Hrpd अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM को कर्पोरेट लक खोलिदिन गरिएको अनुरोध असफल भयो"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM को सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK प्रयोग गरेर अनलक गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"घरमा जोडिने SP सरहको PLMN अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI अनलक गरिदिन अनुरोध गर्न सकिएन।"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"नेटवर्कको उपसमूहको सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK अनलक गर्न सकिएन।"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"घरमा जोडिने SP सरहको PLMN अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI अनलक गर्न गरिएको अनुरोध असफल भयो।"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"नेटवर्कको सबसेटको सेवा प्रदायकसम्बन्धी लक खोलिदिन अनुरोध गर्न सकिएन।"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"SIM को नेटवर्क अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"SIM को नेटवर्कको उपसमूह अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"SIM को नेटवर्कको सबसेट अनलक गरियो।"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"SIM को सेवा प्रदायकसम्बन्धी लक खोलियो ।"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"SIM को कर्पोरेट लक खोलियो।"</string> <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM को Network1 नेटवर्क अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM को Network2 नेटवर्क अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM को Network1 अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM को network2 अनलक गरियो।"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM को Hrpd अनलक गरियो।"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM को सेवा प्रदायकसम्बन्धी लक खोलियो।"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"RUIM को कर्पोरेट लक खोलियो।"</string> <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK प्रयोग गरेर अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK प्रयोग गरेर अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK अनलक गरियो।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK अनलक गरियो।"</string> <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN अनलक गरियो।"</string> <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"घरमा जोडिने SP सरहको PLMN अनलक गरियो।"</string> <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID अनलक गरियो।"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI अनलक गरियो।"</string> - <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"नेटवर्कको उपसमूहको सेवा प्रदायकसम्बन्धी लक खोलियो।"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"नेटवर्कको सबसेटको सेवा प्रदायकसम्बन्धी लक खोलियो।"</string> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 8017f65feb62..2fb675c4d5d0 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Gesprek"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Groepsgesprek"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Persoonlijk"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Werk"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persoonlijke weergave"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 2a193257026b..b5757c6f674d 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -237,10 +237,8 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"ଫୋନ ବିକଳ୍ପ"</string> <string name="global_action_lock" msgid="6949357274257655383">"ସ୍କ୍ରୀନ୍ ଲକ୍"</string> <string name="global_action_power_off" msgid="4404936470711393203">"ପାୱାର୍ ବନ୍ଦ"</string> - <!-- no translation found for global_action_power_options (1185286119330160073) --> - <skip /> - <!-- no translation found for global_action_restart (4678451019561687074) --> - <skip /> + <string name="global_action_power_options" msgid="1185286119330160073">"ପାୱାର"</string> + <string name="global_action_restart" msgid="4678451019561687074">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string> <string name="global_action_emergency" msgid="1387617624177105088">"ଜରୁରୀକାଳୀନ"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"ବଗ୍ ରିପୋର୍ଟ"</string> <string name="global_action_logout" msgid="6093581310002476511">"ସେସନ୍ ଶେଷ କରନ୍ତୁ"</string> @@ -440,8 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"ଫଟୋ ଓ ଭିଡିଓଗୁଡ଼ିକୁ ନିଅନ୍ତୁ"</string> <string name="permdesc_camera" msgid="1354600178048761499">"ଏହି ଆପ୍ ଯେକୌଣସି ସମୟରେ କ୍ୟାମେରା ବ୍ୟବହାର କରି ଫଟୋ ଉଠାଇପାରେ ଏବଂ ଭିଡିଓ ରେକର୍ଡ କରିପାରେ।"</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ଛବି ଏବଂ ଭିଡିଓଗୁଡ଼ିକୁ ନେବା ପାଇଁ ସିଷ୍ଟମ୍ କ୍ୟାମେରାଗୁଡ଼ିକୁ କୌଣସି ଆପ୍ଲିକେସନ୍ କିମ୍ବା ସେବା ଆକ୍ସେସ୍ ଅନୁମତି ଦିଅନ୍ତୁ"</string> - <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> - <skip /> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"ବିଶେଷ ଅଧିକାର ଥିବା ଏହି ଆପ୍ କିମ୍ବା ସିଷ୍ଟମ୍ ଆପ୍ ଯେ କୌଣସି ସମୟରେ ଏକ ସିଷ୍ଟମ୍ କ୍ୟାମେରା ବ୍ୟବହାର କରି ଛବି ଉଠାଇପାରିବ ଏବଂ ଭିଡିଓ ରେକର୍ଡ କରିପାରିବ। ଆପରେ ମଧ୍ୟ android.permission.CAMERA ଅନୁମତି ଆବଶ୍ୟକ"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"କ୍ୟାମେରା ଡିଭାଇସଗୁଡ଼ିକ ଖୋଲିବା କିମ୍ବା ବନ୍ଦ କରିବା ବିଷୟରେ କଲବ୍ୟାକଗୁଡ଼ିକ ପାଇବାକୁ ଏକ ଆପ୍ଲିକେସନ୍ କିମ୍ବା ସେବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"ଯେ କୌଣସି କ୍ୟାମେରା ଡିଭାଇସ୍ ଖୋଲାଗଲେ (କେଉଁ ଆପ୍ଲିକେସନ୍ ଦ୍ୱାରା) କିମ୍ବା ବନ୍ଦ କରାଗଲେ ଏହି ଆପ୍ କଲବ୍ୟାକ୍ ପାଇପାରିବ।"</string> <string name="permlab_vibrate" msgid="8596800035791962017">"କମ୍ପନ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> @@ -1354,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> ସପୋର୍ଟ କରୁନାହିଁ"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ଏହି ଡିଭାଇସ୍ ଏହି <xliff:g id="NAME">%s</xliff:g>କୁ ସପୋର୍ଟ କରେନାହିଁ। ଗୋଟିଏ ସପୋର୍ଟ କରୁଥିବା ଫର୍ମାଟ୍ରେ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"ଏହି ଡିଭାଇସ୍ ଏହି <xliff:g id="NAME">%s</xliff:g>କୁ ସପୋର୍ଟ କରେ ନାହିଁ। ଗୋଟିଏ ସପୋର୍ଟ କରୁଥିବା ଫର୍ମାଟରେ ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"ଏହି ଡିଭାଇସ୍ ଏହି <xliff:g id="NAME">%s</xliff:g>କୁ ସମର୍ଥନ କରେ ନାହିଁ।"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g>କୁ ହଠାତ୍ କାଢ଼ିଦିଆଗଲା"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"କଣ୍ଟେଣ୍ତ ହରାଇବାକୁ ଏଡ଼ାଇବା ପାଇଁ କାଢ଼ିବା ପୂର୍ବରୁ ମିଡିଆକୁ ଇଜେକ୍ଟ କରନ୍ତୁ"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g>କୁ କାଢ଼ିଦିଆଗଲା"</string> @@ -1623,24 +1619,15 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"ମାତ୍ରା ବଢ଼ାଇ ସୁପାରିଶ ସ୍ତର ବଢ଼ାଉଛନ୍ତି? \n\n ଲମ୍ବା ସମୟ ପର୍ଯ୍ୟନ୍ତ ଉଚ୍ଚ ଶବ୍ଦରେ ଶୁଣିଲେ ଆପଣଙ୍କ ଶ୍ରବଣ ଶକ୍ତି ଖରାପ ହୋଇପାରେ।"</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ଆକ୍ସେସବିଲିଟି ଶର୍ଟକଟ୍ ବ୍ୟବହାର କରିବେ?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ସର୍ଟକଟ୍ ଚାଲୁ ଥିବା ବେଳେ, ଉଭୟ ଭଲ୍ୟୁମ୍ ବଟନ୍ 3 ସେକେଣ୍ଡ ପାଇଁ ଦବାଇବା ଦ୍ୱାରା ଏକ ଆକ୍ସେସବିଲିଟି ଫିଚର୍ ଆରମ୍ଭ ହେବ।"</string> - <!-- no translation found for accessibility_shortcut_multiple_service_warning_title (8417489297036013065) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_warning (3740723309483706911) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_list (6935581470716541531) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning_title (3410100187167382427) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning (8412954203626349109) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning_title (2819109500943271385) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning (6363127705112844257) --> - <skip /> - <!-- no translation found for accessibility_shortcut_on (5463618449556111344) --> - <skip /> - <!-- no translation found for accessibility_shortcut_off (3651336255403648739) --> - <skip /> + <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"ଆକ୍ସେସିବିଲିଟୀ ଫିଚରଗୁଡ଼ିକୁ ଚାଲୁ କରିବେ?"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"କିଛି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଧରି ରଖିବା ଫଳରେ ଆକ୍ସେସିବିଲିଟୀ ଫିଚରଗୁଡ଼ିକ ଚାଲୁ ହୁଏ। ଏହା ଆପଣଙ୍କ ଡିଭାଇସ୍ କିପରି କାମ କରେ ତାହା ପରିବର୍ତ୍ତନ କରିପାରେ।\n\nବର୍ତ୍ତମାନର ଫିଚରଗୁଡ଼ିକ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\n ଆପଣ ସେଟିଂସ୍ &gt ଆକ୍ସେସିବିଲିଟୀରେ ଚୟନିତ ଫିଚରଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"TalkBack ଚାଲୁ କରିବେ?"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"କିଛି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଧରି ରଖିବା ଫଳରେ ଅନ୍ଧ କିମ୍ବା କମ୍ ଦେଖାଯାଉଥିବା ଲୋକମାନଙ୍କ ପାଇଁ ଏକ ସାହାଯ୍ୟକାରୀ ସ୍କ୍ରିନ୍ ରିଡର୍ TalkBack ଚାଲୁ ହୁଏ। ଆପଣଙ୍କ ଡିଭାଇସ୍ କିପରି କାର୍ଯ୍ୟ କରେ, ତାହା TalkBack ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ପରିବର୍ତ୍ତନ କରିଥାଏ।\n\nଆପଣ ସେଟିଂସ୍ &gt ଆକ୍ସେସିବିଲିଟୀରେ ଏହି ସର୍ଚକଟକୁ ଅନ୍ୟ ଏକ ଫିଚରରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> ଚାଲୁ କରିବେ?"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"କିଛି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଧରି ରଖିବା ଫଳରେ ଏକ ଆକ୍ସେସିବିଲିଟୀ ଫିଚର୍ <xliff:g id="SERVICE">%1$s</xliff:g> ଚାଲୁ ହୁଏ। ଏହା ଆପଣଙ୍କ ଡିଭାଇସ୍ କିପରି କାମ କରେ ତାହା ପରିବର୍ତ୍ତନ କରିପାରେ।\n\nଆପଣ ସେଟିଂସ୍ &gt ଆକ୍ସେସିବିଲିଟୀରେ ଏହି ସର୍ଚକଟକୁ ଅନ୍ୟ ଏକ ଫିଚରରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ଚାଲୁ କରନ୍ତୁ"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"ଚାଲୁ କରନ୍ତୁ ନାହିଁ"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଡିଭାଇସର ସମ୍ପୂର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣର ଅନୁମତି ଦେବେ?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"ଯଦି ଆପଣ <xliff:g id="SERVICE">%1$s</xliff:g> ଚାଲୁ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଡାଟା ଏନକ୍ରିପ୍ସନ୍ ବୃଦ୍ଧି କରିବାକୁ ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରିବ ନାହିଁ।"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"ଯେଉଁ ଆପ୍ସ ଆପଣଙ୍କୁ ଆକ୍ସେସିବିଲିଟୀ ଆବଶ୍ୟକତାରେ ସହାୟତା କରେ, ସେହି ଆପ୍ସ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ ଉପଯୁକ୍ତ ଅଟେ, କିନ୍ତୁ ଅଧିକାଂଶ ଆପ୍ସ ପାଇଁ ଉପଯୁକ୍ତ ନୁହେଁ।"</string> @@ -1651,10 +1638,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ଅନୁମତି"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ପ୍ରତ୍ୟାଖ୍ୟାନ"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ଏକ ଫିଚର୍ ବ୍ୟବହାର କରିବା ଆରମ୍ଭ କରିବାକୁ ଏହାକୁ ଟାପ୍ କରନ୍ତୁ:"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_button_title (239446795930436325) --> - <skip /> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (1077294237378645981) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ ସହିତ ବ୍ୟବହାର କରିବାକୁ ଫିଚରଗୁଡ଼ିକ ବାଛନ୍ତୁ"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"ଭଲ୍ୟୁମ୍ କୀ ସର୍ଟକଟ୍ ସହିତ ବ୍ୟବହାର କରିବାକୁ ଫିଚରଗୁଡ଼ିକ ବାଛନ୍ତୁ"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ବନ୍ଦ ହୋଇଯାଇଛି"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ସର୍ଟକଟଗୁଡ଼ିକୁ ସମ୍ପାଦନ କରନ୍ତୁ"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ହୋଇଗଲା"</string> @@ -1662,23 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"ଶର୍ଟକଟ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"ରଙ୍ଗ ବଦଳାଇବାର ସୁବିଧା"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"ରଙ୍ଗ ସଂଶୋଧନ"</string> - <!-- no translation found for accessibility_shortcut_enabling_service (5473495203759847687) --> - <skip /> - <!-- no translation found for accessibility_shortcut_disabling_service (8675244165062700619) --> - <skip /> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"ଭଲ୍ୟୁମ୍ କୀ\'ଗୁଡ଼ିକୁ ଧରି ରଖାଯାଇଛି। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଚାଲୁ ହୋଇଛି।"</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"ଭଲ୍ୟୁମ୍ କୀ\'ଗୁଡ଼ିକୁ ଧରି ରଖାଯାଇଛି। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ବନ୍ଦ ହୋଇଛି।"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରିବାକୁ ତିନି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ ଦବାଇ ଧରି ରଖନ୍ତୁ"</string> - <!-- no translation found for accessibility_button_prompt_text (8343213623338605305) --> - <skip /> - <!-- no translation found for accessibility_gesture_prompt_text (8742535972130563952) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_prompt_text (5211827854510660203) --> - <skip /> - <!-- no translation found for accessibility_button_instructional_text (8853928358872550500) --> - <skip /> - <!-- no translation found for accessibility_gesture_instructional_text (9196230728837090497) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_instructional_text (3425123684990193765) --> - <skip /> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"ଆପଣ ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ ଟାପ୍ କରିବା ବେଳେ ଏକ ଫିଚର୍ ବ୍ୟବହାର କରିବାକୁ ବାଛନ୍ତୁ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚର୍ ସହିତ ବ୍ୟବହାର କରିବାକୁ ଏକ ଫିଚର୍ ବାଛନ୍ତୁ (ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚର୍ ସହିତ ବ୍ୟବହାର କରିବାକୁ ଏକ ଫିଚର୍ ବାଛନ୍ତୁ (ତିନୋଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ):"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ।"</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ।"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ, ତିନୋଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ।"</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ମ୍ୟାଗ୍ନିଫିକେସନ୍"</string> <string name="user_switched" msgid="7249833311585228097">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="NAME">%1$s</xliff:g>।"</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> ରେ ସୁଇଚ୍ କରନ୍ତୁ…"</string> @@ -2049,8 +2026,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>ଟି ଫାଇଲ୍</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g>ଟି ଫାଇଲ୍</item> </plurals> - <!-- no translation found for chooser_no_direct_share_targets (1511722103987329028) --> - <skip /> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ଏହାକୁ ସେୟାର୍ କରିବା ପାଇଁ କୌଣସି ସୁପାରିଶ କରାଯାଇଥିବା ଲୋକ ନାହାଁନ୍ତି"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ଆପ୍ସ ତାଲିକା"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ଏହି ଆପ୍କୁ ରେକର୍ଡ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ କିନ୍ତୁ ଏହି USB ଡିଭାଇସ୍ ଜରିଆରେ ଅଡିଓ କ୍ୟାପ୍ଚର୍ କରିପାରିବ।"</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"ମୂଳପୃଷ୍ଠା"</string> @@ -2068,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ବାର୍ତ୍ତାଳାପ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ଗୋଷ୍ଠୀ ବାର୍ତ୍ତାଳାପ"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ବ୍ୟକ୍ତିଗତ"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"କାର୍ଯ୍ୟ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ବ୍ୟକ୍ତିଗତ ଭ୍ୟୁ"</string> @@ -2086,220 +2064,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"କୌଣସି କାର୍ଯ୍ୟସ୍ଥଳୀ ଆପ୍ ଏହି ବିଷୟବସ୍ତୁକୁ ଖୋଲିପାରିବ ନାହିଁ"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"କୌଣସି ବ୍ୟକ୍ତିଗତ ଆପ୍ ଏହି ବିଷୟବସ୍ତୁକୁ ସମର୍ଥନ କରିପାରିବ ନାହିଁ"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"କୌଣସି ବ୍ୟକ୍ତିଗତ ଆପ୍ ଏହି ବିଷୟବସ୍ତୁକୁ ଖୋଲିପାରିବ ନାହିଁ"</string> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ENTRY (8050953231914637819) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY (7164399703751688214) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ENTRY (4447629474818217364) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY (973059024670737358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ENTRY (4487435301206073787) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY (768060297218652809) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY (7129527319490548930) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY (2876126640607573252) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY (8952595089930109282) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ENTRY (3013902515773728996) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ENTRY (2974411408893410289) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ENTRY (687618528751880721) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ENTRY (6810596579655575381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ENTRY (2715929642540980259) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY (8557791623303951590) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ENTRY (7382468767274580323) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY (6730880791104286987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY (6432126539782267026) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY (1730510161529488920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY (3369885925003346830) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY (9129139686191167829) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY (2869929685874615358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ENTRY (1238663472392741771) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY (3988705848553894358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ENTRY (6186770686690993200) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ENTRY (7043865376145617024) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ENTRY (6144227308185112176) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS (4233355366318061180) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS (6742563947637715645) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS (2033399698172403560) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS (4795977251920732254) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS (1090425878157254446) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS (6476898876518094438) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS (6006806734293747731) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (6546680489620881893) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS (3506845511000727015) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_IN_PROGRESS (6709169861932992750) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS (4013870911606478520) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS (9032651188219523434) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS (6584576506344491207) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS (830981927724888114) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS (7851790973098894802) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_IN_PROGRESS (1149560739586960121) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS (5708964693522116025) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS (7288103122966483455) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS (4036752174056147753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS (5089536274515338566) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS (6737197986936251958) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS (5658767775619998623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS (665978313257653727) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS (3857142652251836850) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS (2695664012344346788) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (2695678959963807782) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS (1230605365926493599) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ERROR (1924844017037151535) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR (3372797822292089708) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR (1878443146720411381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ERROR (7664778312218023192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ERROR (2472944311643350302) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ERROR (828089694480999120) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ERROR (17619001007092511) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ERROR (807214229604353614) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ERROR (8644184447744175747) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR (3801002648649640407) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ERROR (707397021218680753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR (894358680773257820) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR (352466878146726991) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR (7353389721907138671) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR (2655263155490857920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ERROR (6903740900892931310) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR (5165901670447518687) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR (2856763216589267623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR (817542684437829139) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR (5178635064113393143) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR (5391587926974531008) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR (4895494864493315868) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ERROR (9017576601595353649) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR (1116993930995545742) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ERROR (7559167306794441462) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ERROR (2782926139511136588) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ERROR (1890493954453456758) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUCCESS (4886243367747126325) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS (4053809277733513987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS (8249342930499801740) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_SUCCESS (2339794542560381270) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_SUCCESS (6975608174152828954) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS (2846699261330463192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS (5335414726057102801) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_SUCCESS (8868100318474971969) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS (6020936629725666932) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS (6944873647584595489) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_SUCCESS (2526483514124121988) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS (7662200333621664621) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS (2861223407953766632) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS (5345648571175243272) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS (3725278343103422466) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS (6998502547560297983) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS (8555433771162560361) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS (3555767296933606232) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS (6778051818199974237) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS (4080108758498911429) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS (7873675303000794343) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS (1763198215069819523) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_SUCCESS (2053891977727320532) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS (8146602361895007345) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_SUCCESS (8058678548991999545) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_SUCCESS (2545608067978550571) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_SUCCESS (4352382949744625007) --> - <skip /> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ନେଟୱାର୍କ ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM ନେଟୱାର୍କର ସବସେଟ୍ ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM କର୍ପୋରେଟ୍ ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"SIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"SIM ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM ନେଟୱାର୍କ1 ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM ନେଟୱାର୍କ2 ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM hrpd ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"RUIM କର୍ପୋରେଟ୍ ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIM ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK ଲେଖନ୍ତୁ"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP ଇକ୍ୟୁଭେଲେଣ୍ଟ ହୋମ୍ PLMN ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"ନେଟୱାର୍କ ସବସେଟର ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ PIN"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"SIM ନେଟୱାର୍କ ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"SIM ନେଟୱାର୍କର ସବସେଟ୍ ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି …"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"SIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"SIM କର୍ପୋରେଟ୍ ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM ନେଟୱାର୍କ1 ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM ନେଟୱାର୍କ2 ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM hrpd ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"RUIM କର୍ପୋରେଟ୍ ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP ଇକ୍ୟୁଭେଲେଣ୍ଟ ହୋମ୍ PLMN ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"ନେଟୱାର୍କ ସବସେଟର ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK ଅନଲକ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଉଛି…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"SIM ନେଟୱାର୍କ ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"SIM ନେଟୱାର୍କର ସବସେଟ୍ ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"SIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"SIM କର୍ପୋରେଟ୍ ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM ନେଟୱାର୍କ1 ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM ନେଟୱାର୍କ2 ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM Hrpdକୁ ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM କର୍ପୋରେଟକୁ ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବା ଅନୁରୋଧ ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP ଇକ୍ୟୁଭେଲେଣ୍ଟ ହୋମ୍ PLMN ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI ଅନଲକ୍ କରିବା ଅନୁରୋଧ ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"ନେଟୱାର୍କ ସବସେଟର ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବା ବିଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"SIM ନେଟୱାର୍କ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"SIM ନେଟୱାର୍କର ସବସେଟ୍ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"SIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"SIM କର୍ପୋରେଟ୍ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM ନେଟୱାର୍କ1 ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM ନେଟୱାର୍କ2 ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM Hrpd ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM ସେବା ପ୍ରଦାନକାରୀ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"RUIM କର୍ପୋରେଟକୁ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP ଇକ୍ୟୁଭେଲେଣ୍ଟ ହୋମ୍ PLMN ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ନେଟୱାର୍କ ସବସେଟର ସେବା ପ୍ରଦାନକାରୀକୁ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> </resources> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 21226436dac1..760b08b4a393 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -237,10 +237,8 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"ਫ਼ੋਨ ਚੋਣਾਂ"</string> <string name="global_action_lock" msgid="6949357274257655383">"ਸਕ੍ਰੀਨ ਲਾਕ"</string> <string name="global_action_power_off" msgid="4404936470711393203">"ਫ਼ੋਨ ਬੰਦ ਕਰੋ"</string> - <!-- no translation found for global_action_power_options (1185286119330160073) --> - <skip /> - <!-- no translation found for global_action_restart (4678451019561687074) --> - <skip /> + <string name="global_action_power_options" msgid="1185286119330160073">"ਪਾਵਰ"</string> + <string name="global_action_restart" msgid="4678451019561687074">"ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="global_action_emergency" msgid="1387617624177105088">"ਸੰਕਟਕਾਲ"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"ਬਗ ਰਿਪੋਰਟ"</string> <string name="global_action_logout" msgid="6093581310002476511">"ਸੈਸ਼ਨ ਸਮਾਪਤ ਕਰੋ"</string> @@ -299,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"ਟਿਕਾਣਾ"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"ਕੈਲੰਡਰ"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦੇਖੋ"</string> @@ -440,8 +438,7 @@ <string name="permlab_camera" msgid="6320282492904119413">"ਤਸਵੀਰਾਂ ਅਤੇ ਵੀਡੀਓ ਬਣਾਓ"</string> <string name="permdesc_camera" msgid="1354600178048761499">"ਇਹ ਐਪ ਕਿਸੇ ਵੀ ਸਮੇਂ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ਸਿਸਟਮ ਕੈਮਰੇ ਨੂੰ ਤਸਵੀਰਾਂ ਅਤੇ ਵੀਡੀਓ ਬਣਾਉਣ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਜਾਂ ਸੇਵਾ ਤੱਕ ਪਹੁੰਚ ਦਿਓ"</string> - <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> - <skip /> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"ਇਹ ਵਿਸ਼ੇਸ਼ ਅਧਿਕ੍ਰਿਤ ਜਾਂ ਸਿਸਟਮ ਐਪ ਕਿਸੇ ਵੇਲੇ ਵੀ ਸਿਸਟਮ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਨੂੰ ਵੀ android.permission.CAMERA ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"ਐਪਲੀਕੇਸ਼ਨ ਜਾਂ ਸੇਵਾ ਨੂੰ ਕੈਮਰਾ ਡੀਵਾਈਸਾਂ ਦੇ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕੀਤੇ ਜਾਣ ਬਾਰੇ ਕਾਲਬੈਕ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ।"</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"ਇਹ ਐਪ ਕੋਈ ਵੀ ਕੈਮਰਾ ਡੀਵਾਈਸ ਚਾਲੂ ਹੋਣ (ਕਿਸ ਐਪਲੀਕੇਸ਼ਨ ਰਾਹੀਂ) ਜਾਂ ਬੰਦ ਹੋਣ \'ਤੇ ਕਾਲਬੈਕ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੀ ਹੈ।"</string> <string name="permlab_vibrate" msgid="8596800035791962017">"ਵਾਈਬ੍ਰੇਸ਼ਨ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string> @@ -1354,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"ਅਸਮਰਥਿਤ <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਚੁਣੋ।"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ।"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਅਚਨਚੇਤ ਹਟਾਇਆ ਗਿਆ"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"ਸਮੱਗਰੀ ਗੁਆਉਣ ਤੋਂ ਬਚਣ ਲਈ ਹਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਮੀਡੀਆ ਕੱਢੋ"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਹਟਾਇਆ ਗਿਆ"</string> @@ -1623,24 +1619,15 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"ਕੀ ਵੌਲਿਊਮ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ ਪੱਧਰ ਤੋਂ ਵਧਾਉਣੀ ਹੈ?\n\nਲੰਮੇ ਸਮੇਂ ਤੱਕ ਉੱਚ ਵੌਲਿਊਮ ਤੇ ਸੁਣਨ ਨਾਲ ਤੁਹਾਡੀ ਸੁਣਨ ਸ਼ਕਤੀ ਨੂੰ ਨੁਕਸਾਨ ਪਹੁੰਚ ਸਕਦਾ ਹੈ।"</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ਕੀ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਵਰਤਣਾ ਹੈ?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ਸ਼ਾਰਟਕੱਟ ਚਾਲੂ ਹੋਣ \'ਤੇ, ਕਿਸੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਬਟਨਾਂ ਨੂੰ 3 ਸਕਿੰਟ ਲਈ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> - <!-- no translation found for accessibility_shortcut_multiple_service_warning_title (8417489297036013065) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_warning (3740723309483706911) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_list (6935581470716541531) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning_title (3410100187167382427) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning (8412954203626349109) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning_title (2819109500943271385) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning (6363127705112844257) --> - <skip /> - <!-- no translation found for accessibility_shortcut_on (5463618449556111344) --> - <skip /> - <!-- no translation found for accessibility_shortcut_off (3651336255403648739) --> - <skip /> + <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"ਕੀ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ਕੁਝ ਸਕਿੰਟਾਂ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖਣਾ, ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ।\n\nਮੌਜੂਦਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nਸੈਟਿੰਗਾਂ ਅਤੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿੱਚ ਤੁਸੀਂ ਚੁਣੀਆਂ ਗਈਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"ਕੀ TalkBack ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"ਕੁਝ ਸਕਿੰਟਾਂ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖਣਾ TalkBack ਨੂੰ ਚਾਲੂ ਕਰ ਦਿੰਦਾ ਹੈ, ਜੋ ਕਿ ਇੱਕ ਅਜਿਹਾ ਸਕ੍ਰੀਨ ਰੀਡਰ ਹੈ ਜੋ ਨੇਤਰਹੀਣ ਜਾਂ ਘੱਟ ਦ੍ਰਿਸ਼ਟੀ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਲਾਭਕਾਰੀ ਹੈ। TalkBack ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬਦਲ ਸਕਦਾ ਹੈ।\n\nਸੈਟਿੰਗਾਂ ਅਤੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿੱਚ ਤੁਸੀਂ ਇਸ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਕਿਸੇ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"ਕੀ <xliff:g id="SERVICE">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ਕੁਝ ਸਕਿੰਟਾਂ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖਣਾ <xliff:g id="SERVICE">%1$s</xliff:g>, ਇੱਕ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਚਾਲੂ ਕਰ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ।\n\nਸੈਟਿੰਗਾਂ ਅਤੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿੱਚ ਤੁਸੀਂ ਇਸ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਕਿਸੇ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ਚਾਲੂ ਕਰੋ"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"ਚਾਲੂ ਨਾ ਕਰੋ"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"ਕੀ <xliff:g id="SERVICE">%1$s</xliff:g> ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪੂਰਾ ਕੰਟਰੋਲ ਦੇਣਾ ਹੈ?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"ਜੇਕਰ ਤੁਸੀਂ <xliff:g id="SERVICE">%1$s</xliff:g> ਚਾਲੂ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਸ਼ਨ ਦਾ ਵਿਸਤਾਰ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰੇਗਾ।"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"ਪੂਰਾ ਕੰਟਰੋਲ ਉਹਨਾਂ ਐਪਾਂ ਲਈ ਢੁਕਵਾਂ ਹੈ ਜੋ ਪਹੁੰਚਯੋਗਤਾ ਸੰਬੰਧੀ ਲੋੜਾਂ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਦੀਆਂ ਹਨ, ਪਰ ਜ਼ਿਆਦਾਤਰ ਐਪਾਂ ਲਈ ਢੁਕਵਾਂ ਨਹੀਂ ਹੁੰਦਾ।"</string> @@ -1651,10 +1638,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ਕਰਨ ਦਿਓ"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ਮਨ੍ਹਾਂ ਕਰੋ"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ਕਿਸੇ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਉਸ \'ਤੇ ਟੈਪ ਕਰੋ:"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_button_title (239446795930436325) --> - <skip /> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (1077294237378645981) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨਾਲ ਵਰਤਣ ਲਈ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਚੁਣੋ"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"ਅਵਾਜ਼ ਕੁੰਜੀ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਵਰਤਣ ਲਈ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਚੁਣੋ"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ਸ਼ਾਰਟਕੱਟਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ਹੋ ਗਿਆ"</string> @@ -1662,23 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"ਸ਼ਾਰਟਕੱਟ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"ਰੰਗ ਦੀ ਉਲਟੀ ਤਰਤੀਬ"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"ਰੰਗ ਸੁਧਾਈ"</string> - <!-- no translation found for accessibility_shortcut_enabling_service (5473495203759847687) --> - <skip /> - <!-- no translation found for accessibility_shortcut_disabling_service (8675244165062700619) --> - <skip /> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਦਬਾ ਕੇ ਰੱਖੀਆਂ ਗਈਆਂ। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ।"</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਦਬਾ ਕੇ ਰੱਖੀਆਂ ਗਈਆਂ। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ 3 ਸਕਿੰਟਾਂ ਲਈ ਦਬਾਈ ਰੱਖੋ"</string> - <!-- no translation found for accessibility_button_prompt_text (8343213623338605305) --> - <skip /> - <!-- no translation found for accessibility_gesture_prompt_text (8742535972130563952) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_prompt_text (5211827854510660203) --> - <skip /> - <!-- no translation found for accessibility_button_instructional_text (8853928358872550500) --> - <skip /> - <!-- no translation found for accessibility_gesture_instructional_text (9196230728837090497) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_instructional_text (3425123684990193765) --> - <skip /> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਟੈਪ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਰਤਣ ਲਈ ਕੋਈ ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੋ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ਪਹੁੰਚਯੋਗਤਾ ਸੰਕੇਤ ਨਾਲ ਵਰਤਣ ਲਈ ਕੋਈ ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੋ (ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ਪਹੁੰਚਯੋਗਤਾ ਸੰਕੇਤ ਨਾਲ ਵਰਤਣ ਲਈ ਕੋਈ ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੋ (ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ):"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ \'ਤੇ ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖੋ।"</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ਵੱਡਦਰਸ਼ੀਕਰਨ"</string> <string name="user_switched" msgid="7249833311585228097">"ਮੌਜੂਦਾ ਉਪਭੋਗਤਾ <xliff:g id="NAME">%1$s</xliff:g>।"</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…"</string> @@ -2049,8 +2026,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ਫ਼ਾਈਲ</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ਫ਼ਾਈਲਾਂ</item> </plurals> - <!-- no translation found for chooser_no_direct_share_targets (1511722103987329028) --> - <skip /> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ਸਾਂਝਾ ਕਰਨ ਲਈ ਕੋਈ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ ਲੋਕ ਨਹੀਂ"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ਐਪ ਸੂਚੀ"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ਇਸ ਐਪ ਨੂੰ ਰਿਕਾਰਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਪਰ ਇਹ USB ਡੀਵਾਈਸ ਰਾਹੀਂ ਆਡੀਓ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ।"</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"ਹੋਮ"</string> @@ -2068,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ਗੱਲਬਾਤ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ਗੁਰੱਪ ਗੱਲਬਾਤ"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ਨਿੱਜੀ"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ਕੰਮ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ਵਿਅਕਤੀਗਤ ਦ੍ਰਿਸ਼"</string> @@ -2086,220 +2064,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"ਕੋਈ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਨਹੀਂ ਖੋਲ੍ਹ ਸਕਦੀ"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਇਸ ਸਮੱਗਰੀ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰ ਸਕਦੀ"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਨਹੀਂ ਖੋਲ੍ਹ ਸਕਦੀ"</string> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ENTRY (8050953231914637819) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY (7164399703751688214) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ENTRY (4447629474818217364) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY (973059024670737358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ENTRY (4487435301206073787) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY (768060297218652809) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY (7129527319490548930) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY (2876126640607573252) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY (8952595089930109282) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ENTRY (3013902515773728996) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ENTRY (2974411408893410289) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ENTRY (687618528751880721) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ENTRY (6810596579655575381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ENTRY (2715929642540980259) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY (8557791623303951590) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ENTRY (7382468767274580323) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY (6730880791104286987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY (6432126539782267026) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY (1730510161529488920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY (3369885925003346830) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY (9129139686191167829) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY (2869929685874615358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ENTRY (1238663472392741771) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY (3988705848553894358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ENTRY (6186770686690993200) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ENTRY (7043865376145617024) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ENTRY (6144227308185112176) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS (4233355366318061180) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS (6742563947637715645) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS (2033399698172403560) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS (4795977251920732254) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS (1090425878157254446) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS (6476898876518094438) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS (6006806734293747731) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (6546680489620881893) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS (3506845511000727015) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_IN_PROGRESS (6709169861932992750) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS (4013870911606478520) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS (9032651188219523434) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS (6584576506344491207) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS (830981927724888114) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS (7851790973098894802) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_IN_PROGRESS (1149560739586960121) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS (5708964693522116025) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS (7288103122966483455) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS (4036752174056147753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS (5089536274515338566) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS (6737197986936251958) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS (5658767775619998623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS (665978313257653727) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS (3857142652251836850) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS (2695664012344346788) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (2695678959963807782) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS (1230605365926493599) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ERROR (1924844017037151535) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR (3372797822292089708) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR (1878443146720411381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ERROR (7664778312218023192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ERROR (2472944311643350302) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ERROR (828089694480999120) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ERROR (17619001007092511) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ERROR (807214229604353614) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ERROR (8644184447744175747) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR (3801002648649640407) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ERROR (707397021218680753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR (894358680773257820) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR (352466878146726991) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR (7353389721907138671) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR (2655263155490857920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ERROR (6903740900892931310) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR (5165901670447518687) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR (2856763216589267623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR (817542684437829139) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR (5178635064113393143) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR (5391587926974531008) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR (4895494864493315868) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ERROR (9017576601595353649) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR (1116993930995545742) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ERROR (7559167306794441462) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ERROR (2782926139511136588) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ERROR (1890493954453456758) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUCCESS (4886243367747126325) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS (4053809277733513987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS (8249342930499801740) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_SUCCESS (2339794542560381270) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_SUCCESS (6975608174152828954) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS (2846699261330463192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS (5335414726057102801) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_SUCCESS (8868100318474971969) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS (6020936629725666932) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS (6944873647584595489) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_SUCCESS (2526483514124121988) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS (7662200333621664621) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS (2861223407953766632) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS (5345648571175243272) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS (3725278343103422466) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS (6998502547560297983) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS (8555433771162560361) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS (3555767296933606232) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS (6778051818199974237) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS (4080108758498911429) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS (7873675303000794343) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS (1763198215069819523) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_SUCCESS (2053891977727320532) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS (8146602361895007345) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_SUCCESS (8058678548991999545) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_SUCCESS (2545608067978550571) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_SUCCESS (4352382949744625007) --> - <skip /> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ਸਿਮ ਨੈੱਟਵਰਕ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"ਸਿਮ ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"ਸਿਮ ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"ਸਿਮ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"ਸਿਮ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM ਨੈੱਟਵਰਕ1 ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM ਨੈੱਟਵਰਕ2 ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM hrpd ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"RUIM ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIM ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK ਦਾਖਲ ਕਰੋ"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP ਸਮਾਨ ਹੋਮ PLMN ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਪਿੰਨ"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"ਸਿਮ ਨੈੱਟਵਰਕ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"ਸਿਮ ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ …"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"ਸਿਮ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"ਸਿਮ ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"ਸਿਮ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM ਨੈੱਟਵਰਕ1 ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM ਨੈੱਟਵਰਕ2 ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM hrpd ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"RUIM ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP ਸਮਾਨ ਹੋਮ PLMN ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"ਸਿਮ ਨੈੱਟਵਰਕ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"ਸਿਮ ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"ਸਿਮ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"ਸਿਮ ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"ਸਿਮ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM ਨੈੱਟਵਰਕ1 ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM ਨੈੱਟਵਰਕ2 ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM Hrpd ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK ਅਣਲਾਕ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP ਸਮਾਨ ਹੋਮ PLMN ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਬੇਨਤੀ ਅਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"ਸਿਮ ਨੈੱਟਵਰਕ ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"ਸਿਮ ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"ਸਿਮ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"ਸਿਮ ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"ਸਿਮ ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM ਨੈੱਟਵਰਕ1 ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM ਨੈੱਟਵਰਕ2 ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM Hrpd ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਕਰਨ ਦੀ ਬੇਨਤੀ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"RUIM ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP ਸਮਾਨ ਹੋਮ PLMN ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਸਫਲ।"</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index e98e12024435..aa48ea6fa333 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1391,8 +1391,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Nośnik <xliff:g id="NAME">%s</xliff:g> nieobsługiwany"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"To urządzenie nie obsługuje <xliff:g id="NAME">%s</xliff:g>. Kliknij, by użyć obsługiwanego formatu."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"To urządzenie nie obsługuje nośnika <xliff:g id="NAME">%s</xliff:g>. Wybierz, by skonfigurować obsługiwany format."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"To urządzenie nie obsługuje <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g>: nieoczekiwane wyjęcie"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Zanim wyjmiesz nośnik, odłącz go, by uniknąć utraty danych"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> – odłączono"</string> @@ -2113,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Rozmowa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Rozmowa grupowa"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Osobiste"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Do pracy"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Widok osobisty"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 36b461573542..3400cb1bb0c3 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa em grupo"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Pessoal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Trabalho"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualização pessoal"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index e6dacdda89f7..6ad26b5476ca 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grupo"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"> <xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Pessoal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Trabalho"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista pessoal"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 36b461573542..3400cb1bb0c3 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa em grupo"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Pessoal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Trabalho"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualização pessoal"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 18429824c8f3..3dbc019fbb9e 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -2078,6 +2078,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversație"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversație de grup"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Serviciu"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Afișarea conținutului personal"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index ca2f8f293189..7f4f005e8efa 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1391,8 +1391,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> не поддерживается"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Устройство не поддерживает этот носитель (<xliff:g id="NAME">%s</xliff:g>). Нажмите, чтобы настроить."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Внешний носитель (<xliff:g id="NAME">%s</xliff:g>) не поддерживается на этом устройстве. Выберите, чтобы изменить формат."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"<xliff:g id="NAME">%s</xliff:g> не поддерживается на этом устройстве."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена неправильно"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Перед тем как извлечь накопитель, отключите его, чтобы избежать потери данных."</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"Накопитель (<xliff:g id="NAME">%s</xliff:g>) извлечен"</string> @@ -2113,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Чат"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групповой чат"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Личный"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Рабочий"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Просмотр личных данных"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 64d3f7049ca4..a2e556dd15a6 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -2046,6 +2046,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"සංවාදය"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"සමූහ සංවාදය"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"පුද්ගලික"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"කාර්යාල"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"පෞද්ගලික දසුන"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index e064c37aad29..8039c1afa014 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -2112,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konverzácia"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinová konverzácia"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Osobné"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Práca"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobné zobrazenie"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index b6ba6eed3fa2..2d742ef21e4b 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -2112,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Pogovor"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinski pogovor"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Osebno"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Služba"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Pogled osebnega profila"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index a1fcf3f1efa8..460287d64fac 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Biseda"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Bisedë në grup"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Puna"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Pamja personale"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 2e793a66f2e6..d72c209714ba 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1371,8 +1371,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"Уређај <xliff:g id="NAME">%s</xliff:g> није подржан"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Овај уређај не подржава овај уређај <xliff:g id="NAME">%s</xliff:g>. Додирните да бисте подесили подржани формат."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Овај уређај не подржава овај медиј (<xliff:g id="NAME">%s</xliff:g>). Изаберите да га подесите у подржаном формату."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Овај уређај не подржава: <xliff:g id="NAME">%s</xliff:g>."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"Уређај <xliff:g id="NAME">%s</xliff:g> је неочекивано уклоњен"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Избаците медијум пре него што га уклоните да не бисте изгубили садржај"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> је уклоњен/а"</string> @@ -2079,6 +2078,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Конверзација"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групна конверзација"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Лични"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Пословни"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Лични приказ"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 0b2962cee50b..9b7318bedfe0 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppkonversation"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Privat"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Jobb"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personlig vy"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 0360106c1f89..f6a831aa7275 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Mazungumzo"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Mazungumzo ya Kikundi"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Binafsi"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Kazini"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Mwonekano wa binafsi"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 6ec7c751ddd7..43eca0e927fb 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -299,7 +299,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"தொடர்புகளை அணுக வேண்டும்"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"இருப்பிடம்"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"இந்தச் சாதனத்தின் இருப்பிடத்தை அறிந்து கொள்ள"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"கேலெண்டர்"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"கேலெண்டரை அணுகலாம்"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string> @@ -443,8 +443,7 @@ <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> <skip /> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"கேமரா சாதனங்கள் திறக்கப்படும்போதோ மூடப்படும்போதோ அது குறித்த கால்பேக்குகளைப் பெற ஒரு ஆப்ஸையோ சேவையையோ அனுமதிக்கவும்."</string> - <!-- no translation found for permdesc_cameraOpenCloseListener (2002636131008772908) --> - <skip /> + <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"எந்தக் கேமரா சாதனமும் (எந்த ஆப்ஸாலும்) திறக்கப்படும்போதோ மூடப்படும்போதோ இந்த ஆப்ஸால் கால்பேக்குகளைப் பெற முடியும்."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"அதிர்வைக் கட்டுப்படுத்துதல்"</string> <string name="permdesc_vibrate" msgid="8733343234582083721">"அதிர்வைக் கட்டுப்படுத்தப் ஆப்ஸை அனுமதிக்கிறது."</string> <string name="permdesc_vibrator_state" msgid="7050024956594170724">"அதிர்வு நிலையை அணுக ஆப்ஸை அனுமதிக்கும்."</string> @@ -2066,11 +2065,10 @@ <string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"அணுகல்தன்மை மெனு"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸின் தலைப்புப் பட்டி."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> என்பதை வரம்பிடப்பட்ட பக்கெட்திற்குள் சேர்க்கப்பட்டது"</string> - <!-- no translation found for conversation_single_line_name_display (8958948312915255999) --> - <skip /> - <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) --> - <skip /> - <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) --> + <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> + <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"உரையாடல்"</string> + <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"குழு உரையாடல்"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"தனிப்பட்ட சுயவிவரம்"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"பணிச் சுயவிவரம்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 8bd07f35978a..f9e95a6ed9c4 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -237,10 +237,8 @@ <string name="global_actions" product="default" msgid="6410072189971495460">"ఫోన్ ఎంపికలు"</string> <string name="global_action_lock" msgid="6949357274257655383">"స్క్రీన్ లాక్"</string> <string name="global_action_power_off" msgid="4404936470711393203">"పవర్ ఆఫ్ చేయి"</string> - <!-- no translation found for global_action_power_options (1185286119330160073) --> - <skip /> - <!-- no translation found for global_action_restart (4678451019561687074) --> - <skip /> + <string name="global_action_power_options" msgid="1185286119330160073">"పవర్"</string> + <string name="global_action_restart" msgid="4678451019561687074">"రీస్టార్ట్ చేయి"</string> <string name="global_action_emergency" msgid="1387617624177105088">"అత్యవసరం"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"బగ్ నివేదిక"</string> <string name="global_action_logout" msgid="6093581310002476511">"సెషన్ను ముగించు"</string> @@ -299,7 +297,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"మీ పరిచయాలను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"స్థానం"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"క్యాలెండర్"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"మీ క్యాలెండర్ను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS సందేశాలను పంపడం మరియు వీక్షించడం"</string> @@ -440,10 +438,9 @@ <string name="permlab_camera" msgid="6320282492904119413">"చిత్రాలు మరియు వీడియోలు తీయడం"</string> <string name="permdesc_camera" msgid="1354600178048761499">"ఈ యాప్ కెమెరాను ఉపయోగించి ఎప్పుడైనా చిత్రాలను తీయగలదు మరియు వీడియోలను రికార్డ్ చేయగలదు."</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ఫోటోలు, వీడియోలు తీయడానికి సిస్టమ్ కెమెరాలకు యాప్, లేదా సేవా యాక్సెస్ను అనుమతించండి"</string> - <!-- no translation found for permdesc_systemCamera (5938360914419175986) --> - <skip /> + <string name="permdesc_systemCamera" msgid="5938360914419175986">"ఈ విశేష లేదా సిస్టమ్ యాప్ ఎప్పుడైనా సిస్టమ్ కెమెరాను ఉపయోగించి ఫోటోలు తీయగలదు, వీడియోలను రికార్డ్ చేయగలదు. యాప్కు android.permission.CAMERA అనుమతి ఇవ్వడం కూడా అవసరం"</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"కెమెరా పరికరాలు తెరుచుకుంటున్నప్పుడు లేదా మూసుకుంటున్నప్పుడు కాల్బ్యాక్లను స్వీకరించడానికి యాప్ను లేదా సర్వీస్ను అనుమతించండి."</string> - <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"ఏదైనా కెమెరా పరికరం తెరుచుకుంటున్నప్పుడు (ఏదైనా యాప్ ద్వారా) లేదా మూసుకుంటున్నప్పుడు ఈ సిగ్నేచర్ యాప్ కాల్బ్యాక్లను అందుకోగలదు."</string> + <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"ఏదైనా కెమెరా పరికరం తెరుచుకుంటున్నప్పుడు (ఏదైనా యాప్ ద్వారా) లేదా మూసుకుంటున్నప్పుడు ఈ యాప్ కాల్బ్యాక్లను అందుకోగలదు."</string> <string name="permlab_vibrate" msgid="8596800035791962017">"వైబ్రేషన్ను నియంత్రించడం"</string> <string name="permdesc_vibrate" msgid="8733343234582083721">"వైబ్రేటర్ను నియంత్రించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permdesc_vibrator_state" msgid="7050024956594170724">"వైబ్రేటర్ స్థితిని యాక్సెస్ చేసేందుకు యాప్ను అనుమతిస్తుంది."</string> @@ -1354,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g>కి మద్దతు లేదు"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>కి మద్దతు ఇవ్వదు. మద్దతు కలిగిన ఆకృతిలో సెటప్ చేయడానికి నొక్కండి."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>కి మద్దతు ఇవ్వదు. మద్దతు కలిగిన ఆకృతిలో సెటప్ చేయడానికి ఎంచుకోండి."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>ను సపోర్ట్ చేయదు."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ఊహించని విధంగా తీసివేయబడింది"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"కంటెంట్ని కోల్పోవడాన్ని నివారించాలంటే తీసివేయబోయే ముందు మీడియాని తొలగించండి"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది"</string> @@ -1623,24 +1619,15 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"వాల్యూమ్ను సిఫార్సు చేయబడిన స్థాయి కంటే ఎక్కువగా పెంచాలా?\n\nసుదీర్ఘ వ్యవధుల పాటు అధిక వాల్యూమ్లో వినడం వలన మీ వినికిడి శక్తి దెబ్బ తినవచ్చు."</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"యాక్సెస్ సామర్థ్యం షార్ట్కట్ను ఉపయోగించాలా?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"షార్ట్కట్ ఆన్ చేసి ఉన్నప్పుడు, రెండు వాల్యూమ్ బటన్లను 3 సెకన్ల పాటు నొక్కి ఉంచితే యాక్సెస్ సౌలభ్య ఫీచర్ ప్రారంభం అవుతుంది."</string> - <!-- no translation found for accessibility_shortcut_multiple_service_warning_title (8417489297036013065) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_warning (3740723309483706911) --> - <skip /> - <!-- no translation found for accessibility_shortcut_multiple_service_list (6935581470716541531) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning_title (3410100187167382427) --> - <skip /> - <!-- no translation found for accessibility_shortcut_talkback_warning (8412954203626349109) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning_title (2819109500943271385) --> - <skip /> - <!-- no translation found for accessibility_shortcut_single_service_warning (6363127705112844257) --> - <skip /> - <!-- no translation found for accessibility_shortcut_on (5463618449556111344) --> - <skip /> - <!-- no translation found for accessibility_shortcut_off (3651336255403648739) --> - <skip /> + <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"యాక్సెసిబిలిటీలను ఆన్ చేయాలా?"</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"రెండు వాల్యూమ్ కీలను కొంత సేపు నొక్కి పట్టుకోవడం ద్వారా యాక్సెసిబిలిటీలు ఆన్ అవుతాయి. ఇది మీ పరికరం పనిచేసే విధానాన్ని మార్చవచ్చు.\n\nప్రస్తుత ఫీచర్లు:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nఎంపిక చేసిన ఫీచర్లను మీరు సెట్టింగ్లు>యాక్సెసిబిలిటీలో మార్చవచ్చు."</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"\'TalkBack\'ను ఆన్ చేయాలా?"</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"రెండు వాల్యూమ్ కీలను కొన్ని సెకన్ల పాటు నొక్కి, పట్టుకోవడం ద్వారా TalkBack ఆన్ అవుతుంది, ఇది అంధులకు, చూపు సరిగా లేని వారికి ఉపయోగపడే స్క్రీన్ రీడర్. మీ పరికరం పని చేసే విధానాన్ని TalkBack పూర్తిగా మార్చివేస్తుంది.\n\nసెట్టింగ్లు > యాక్సెసిబిలిటీలో, వేరొక ఫీచర్ను ప్రారంభించేలా ఈ షార్ట్ కట్ను మీరు మార్చవచ్చు."</string> + <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> ఆన్ చేయాాలా?"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"రెండు వాల్యూమ్ కీలను కొన్ని సెకన్ల పాటు నొక్కి పట్టుకోవడం ద్వారా యాక్సెసిబిలిటీ అయిన <xliff:g id="SERVICE">%1$s</xliff:g> ఆన్ అవుతుంది. ఇది మీ పరికరం పని చేసే విధానాన్ని మార్చవచ్చు.\n\nసెట్టింగ్లు > యాక్సెసిబిలిటీలో, వేరొక ఫీచర్ను ప్రారంభించేలా ఈ షార్ట్ కట్ను మీరు మార్చవచ్చు."</string> + <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ఆన్ చేయి"</string> + <string name="accessibility_shortcut_off" msgid="3651336255403648739">"ఆన్ చేయకండి"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g>కి మీ పరికరంపై పూర్తి నియంత్రణను ఇవ్వాలనుకుంటున్నారా?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"మీరు <xliff:g id="SERVICE">%1$s</xliff:g>ని ఆన్ చేస్తే, డేటా ఎన్క్రిప్షన్ను మెరుగుపరచడానికి మీ పరికరం మీ స్క్రీన్ లాక్ను ఉపయోగించదు."</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"అవసరమైన యాక్సెస్ సామర్ధ్యం కోసం యాప్లకు పూర్తి నియంత్రణ ఇవ్వడం తగిన పనే అయినా, అన్ని యాప్లకు అలా ఇవ్వడం సరికాదు."</string> @@ -1651,10 +1638,8 @@ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"అనుమతించు"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"నిరాకరించు"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ఫీచర్ని ఉపయోగించడం ప్రారంభించడానికి, దాన్ని ట్యాప్ చేయండి:"</string> - <!-- no translation found for accessibility_edit_shortcut_menu_button_title (239446795930436325) --> - <skip /> - <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (1077294237378645981) --> - <skip /> + <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"యాక్సెసిబిలిటీ బటన్తో ఉపయోగించడానికి ఫీచర్లను ఎంచుకోండి"</string> + <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"వాల్యూమ్ కీ షార్ట్కట్తో ఉపయోగించడానికి ఫీచర్లను ఎంచుకోండి"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ఆఫ్ చేయబడింది"</string> <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"షార్ట్కట్లను ఎడిట్ చేయి"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"పూర్తయింది"</string> @@ -1662,23 +1647,15 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"సత్వరమార్గాన్ని ఉపయోగించు"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"రంగుల మార్పిడి"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"రంగు సవరణ"</string> - <!-- no translation found for accessibility_shortcut_enabling_service (5473495203759847687) --> - <skip /> - <!-- no translation found for accessibility_shortcut_disabling_service (8675244165062700619) --> - <skip /> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"వాల్యూమ్ కీలు నొక్కి ఉంచబడ్డాయి. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆన్ చేయబడింది"</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"వాల్యూమ్ కీలు నొక్కి ఉంచబడ్డాయి. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆఫ్ చేయబడింది"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ని ఉపయోగించడానికి వాల్యూమ్ కీలు రెండింటినీ 3 సెకన్లు నొక్కి ఉంచండి"</string> - <!-- no translation found for accessibility_button_prompt_text (8343213623338605305) --> - <skip /> - <!-- no translation found for accessibility_gesture_prompt_text (8742535972130563952) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_prompt_text (5211827854510660203) --> - <skip /> - <!-- no translation found for accessibility_button_instructional_text (8853928358872550500) --> - <skip /> - <!-- no translation found for accessibility_gesture_instructional_text (9196230728837090497) --> - <skip /> - <!-- no translation found for accessibility_gesture_3finger_instructional_text (3425123684990193765) --> - <skip /> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"యాక్సెస్ సామర్థ్య బటన్ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్ను ఎంచుకోండి:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక ఫీచర్ని ఎంచుకోండి (రెండు వేళ్లతో స్క్రీన్ను కింద నుండి పైకి స్వైప్ చేయండి):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక ఫీచర్ను ఎంచుకోండి (మూడు చేతి వేళ్లతో స్క్రీన్ను కింద నుండి పైకి స్వైప్ చేయండి):"</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ఫీచర్ల మధ్య మారడానికి, యాక్సెసిబిలిటీ బటన్ను నొక్కి & పట్టుకోండి."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ఫీచర్ల మధ్య మారడానికి, రెండు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ఫీచర్ల మధ్య మారడానికి, మూడు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"మాగ్నిఫికేషన్"</string> <string name="user_switched" msgid="7249833311585228097">"ప్రస్తుత వినియోగదారు <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>కి మారుస్తోంది…"</string> @@ -2049,8 +2026,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైల్లు</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ఫైల్</item> </plurals> - <!-- no translation found for chooser_no_direct_share_targets (1511722103987329028) --> - <skip /> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"షేర్ చేయకూడని వ్యక్తులు"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"యాప్ల జాబితా"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ఈ యాప్కు రికార్డ్ చేసే అనుమతి మంజూరు కాలేదు, అయినా ఈ USB పరికరం ద్వారా ఆడియోను క్యాప్చర్ చేయగలదు."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"హోమ్"</string> @@ -2068,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"సంభాషణ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"గ్రూప్ సంభాషణ"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"వ్యక్తిగతం"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"కార్యాలయం"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"వ్యక్తిగత వీక్షణ"</string> @@ -2086,220 +2064,112 @@ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"కార్యాలయ యాప్లు ఏవీ ఈ కంటెంట్ను తెరవలేవు"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"వ్యక్తిగత యాప్లు ఏవీ ఈ కంటెంట్ను సపోర్ట్ చేయలేవు"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"వ్యక్తిగత యాప్లు ఏవీ ఈ కంటెంట్ను తెరవలేవు"</string> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ENTRY (8050953231914637819) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY (7164399703751688214) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ENTRY (4447629474818217364) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY (973059024670737358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ENTRY (4487435301206073787) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY (768060297218652809) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY (7129527319490548930) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY (2876126640607573252) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY (8952595089930109282) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ENTRY (3013902515773728996) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ENTRY (2974411408893410289) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ENTRY (687618528751880721) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ENTRY (6810596579655575381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ENTRY (2715929642540980259) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY (8557791623303951590) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ENTRY (7382468767274580323) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY (6730880791104286987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY (6432126539782267026) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY (1730510161529488920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY (3369885925003346830) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY (9129139686191167829) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY (2869929685874615358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ENTRY (1238663472392741771) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY (3988705848553894358) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ENTRY (6186770686690993200) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ENTRY (7043865376145617024) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ENTRY (6144227308185112176) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS (4233355366318061180) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS (6742563947637715645) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS (2033399698172403560) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS (4795977251920732254) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS (1090425878157254446) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS (6476898876518094438) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS (6006806734293747731) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (6546680489620881893) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS (3506845511000727015) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_IN_PROGRESS (6709169861932992750) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS (4013870911606478520) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS (9032651188219523434) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS (6584576506344491207) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS (830981927724888114) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS (7851790973098894802) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_IN_PROGRESS (1149560739586960121) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS (5708964693522116025) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS (7288103122966483455) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS (4036752174056147753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS (5089536274515338566) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS (6737197986936251958) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS (5658767775619998623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS (665978313257653727) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS (3857142652251836850) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS (2695664012344346788) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS (2695678959963807782) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS (1230605365926493599) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_ERROR (1924844017037151535) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR (3372797822292089708) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR (1878443146720411381) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_ERROR (7664778312218023192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_ERROR (2472944311643350302) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_ERROR (828089694480999120) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_ERROR (17619001007092511) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_ERROR (807214229604353614) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_ERROR (8644184447744175747) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR (3801002648649640407) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_ERROR (707397021218680753) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR (894358680773257820) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR (352466878146726991) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR (7353389721907138671) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR (2655263155490857920) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_ERROR (6903740900892931310) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR (5165901670447518687) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR (2856763216589267623) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR (817542684437829139) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR (5178635064113393143) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR (5391587926974531008) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR (4895494864493315868) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_ERROR (9017576601595353649) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR (1116993930995545742) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_ERROR (7559167306794441462) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_ERROR (2782926139511136588) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_ERROR (1890493954453456758) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUCCESS (4886243367747126325) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS (4053809277733513987) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS (8249342930499801740) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_SUCCESS (2339794542560381270) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_SUCCESS (6975608174152828954) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS (2846699261330463192) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS (5335414726057102801) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_SUCCESS (8868100318474971969) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS (6020936629725666932) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS (6944873647584595489) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_SUCCESS (2526483514124121988) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS (7662200333621664621) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS (2861223407953766632) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS (5345648571175243272) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS (3725278343103422466) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS (6998502547560297983) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS (8555433771162560361) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS (3555767296933606232) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS (6778051818199974237) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS (4080108758498911429) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS (7873675303000794343) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS (1763198215069819523) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SPN_SUCCESS (2053891977727320532) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS (8146602361895007345) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_ICCID_SUCCESS (8058678548991999545) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_IMPI_SUCCESS (2545608067978550571) --> - <skip /> - <!-- no translation found for PERSOSUBSTATE_SIM_NS_SP_SUCCESS (4352382949744625007) --> - <skip /> + <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM నెట్వర్క్ అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM నెట్వర్క్ సబ్సెట్ అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM కార్పొరేట్ అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY" msgid="973059024670737358">"SIM సర్వీస్ ప్రొవైడర్ అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_SIM_ENTRY" msgid="4487435301206073787">"SIM అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY" msgid="768060297218652809">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY" msgid="7129527319490548930">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM నెట్వర్క్1 అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM నెట్వర్క్2 అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM hrpd అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"RUIM కార్పొరేట్ అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM సర్వీస్ ప్రొవైడర్ అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY" msgid="7382468767274580323">"RUIM అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY" msgid="6730880791104286987">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY" msgid="6432126539782267026">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY" msgid="1730510161529488920">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="3369885925003346830">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUKని నమోదు చేయండి"</string> + <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"SP Equivalent Home PLMN అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"నెట్వర్క్ సబ్సెట్ సర్వీస్ ప్రొవైడర్ అన్లాక్ పిన్"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS" msgid="4233355366318061180">"SIM నెట్వర్క్ అన్లాక్ను అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS" msgid="6742563947637715645">"SIM నెట్వర్క్ సబ్సెట్ అన్లాక్ను అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="2033399698172403560">"SIM సర్వీస్ ప్రొవైడర్ అన్లాక్ అభ్యర్థించబడుతోంది..."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS" msgid="4795977251920732254">"SIM కార్పొరేట్ అన్లాక్ను అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS" msgid="1090425878157254446">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS" msgid="6476898876518094438">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS" msgid="6006806734293747731">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM అన్లాక్ని అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM నెట్వర్క్1 అన్లాక్ అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM నెట్వర్క్2 అన్లాక్ అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM hrpd అన్లాక్ను అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM సర్వీస్ ప్రొవైడర్ అన్లాక్ను అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"RUIM కార్పొరేట్ అన్లాక్ను అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"SP Equivalent Home PLMN అన్లాక్ను అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"నెట్వర్క్ సబ్సెట్ సర్వీస్ ప్రొవైడర్ అన్లాక్ని అభ్యర్థిస్తోంది..."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS" msgid="6737197986936251958">"RUIM అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS" msgid="5658767775619998623">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS" msgid="665978313257653727">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS" msgid="3857142652251836850">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS" msgid="2695664012344346788">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="2695678959963807782">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS" msgid="1230605365926493599">"PUK అన్లాక్ను అభ్యర్థిస్తోంది…"</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"SIM నెట్వర్క్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"SIM నెట్వర్క్ సబ్సెట్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"SIM సర్వీస్ ప్రొవైడర్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"SIM కార్పొరేట్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM నెట్వర్క్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM నెట్వర్క్2 అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM Hrpd అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"RUIM కార్పొరేట్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM సర్వీస్ ప్రొవైడర్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"RUIM అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR" msgid="352466878146726991">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR" msgid="7353389721907138671">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR" msgid="2655263155490857920">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR" msgid="6903740900892931310">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR" msgid="5165901670447518687">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR" msgid="2856763216589267623">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK అన్లాక్ విజయవంతం కాలేదు."</string> + <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"SP Equivalent Home PLMN అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI నెట్వర్క్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"నెట్వర్క్ సబ్సెట్ సర్వీస్ ప్రొవైడర్ అన్లాక్ అభ్యర్థన విఫలమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS" msgid="4886243367747126325">"SIM నెట్వర్క్ అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS" msgid="4053809277733513987">"SIM నెట్వర్క్ సబ్సెట్ అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"SIM సర్వీస్ ప్రొవైడర్ అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"SIM కార్పొరేట్ అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM నెట్వర్క్1 అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM నెట్వర్క్2 అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM Hrpd అన్లాక్ అభ్యర్థన విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM సర్వీస్ ప్రొవైడర్ అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"RUIM కార్పొరేట్ అన్లాక్ అభ్యర్థన విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS" msgid="2526483514124121988">"RUIM అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS" msgid="7662200333621664621">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS" msgid="2861223407953766632">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS" msgid="5345648571175243272">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="3725278343103422466">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS" msgid="6998502547560297983">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS" msgid="8555433771162560361">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS" msgid="3555767296933606232">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS" msgid="6778051818199974237">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS" msgid="4080108758498911429">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS" msgid="7873675303000794343">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS" msgid="1763198215069819523">"PUK అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS" msgid="2053891977727320532">"SPN అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS" msgid="8146602361895007345">"SP Equivalent Home PLMN అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI అన్లాక్ విజయవంతమైంది."</string> + <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"నెట్వర్క్ సబ్సెట్ సర్వీస్ ప్రొవైడర్ అన్లాక్ విజయవంతమైంది."</string> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index d22f3e207aae..041423d9b0d8 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"อุปกรณ์นี้ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g> นี้ แตะเพื่อตั้งค่าในรูปแบบที่สนับสนุน"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"อุปกรณ์นี้ไม่รองรับ <xliff:g id="NAME">%s</xliff:g> นี้ เลือกเพื่อตั้งค่าในรูปแบบที่รองรับ"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"อุปกรณ์เครื่องนี้ไม่รองรับ <xliff:g id="NAME">%s</xliff:g> นี้"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ถูกนำออกไปโดยไม่คาดคิด"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"ยกเลิกการต่อเชื่อมสื่อก่อนที่จะนำออกเพื่อหลีกเลี่ยงไม่ให้เนื้อหาสูญหาย"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"นำ <xliff:g id="NAME">%s</xliff:g> ออกแล้ว"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"การสนทนา"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"บทสนทนากลุ่ม"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ส่วนตัว"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"งาน"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"มุมมองส่วนตัว"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 07e204e3a50f..0b1ee6549424 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Pag-uusap"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Panggrupong Pag-uusap"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Trabaho"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal na view"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 2433cb022025..5861589e5ff8 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Görüşme"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grup Görüşmesi"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Kişisel"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"İş"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Kişisel görünüm"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 659d1acff465..0cb185c11533 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -2112,6 +2112,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Чат"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Груповий чат"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Особисте"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Робоче"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Особистий перегляд"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 66074310c3d9..e71789802ba1 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"غیر تعاون یافتہ <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"یہ آلہ <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا۔ ایک سپورٹ یافتہ فارمیٹ میں سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"یہ آلہ اس <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا ہے۔ ایک سپورٹ یافتہ فارمیٹ میں سیٹ اپ کرنے کیلئے منتخب کریں۔"</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"یہ آلہ اس <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا ہے۔"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> غیر متوقع طور پر ہٹا دیا گیا"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"مواد کھونے سے بچنے کے لئے ہٹانے سے پہلے میڈیا خارج کریں"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> کو ہٹا دیا گیا"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"گفتگو"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"گروپ گفتگو"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"ذاتی"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"دفتر"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ذاتی ملاحظہ"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 442686f2546f..d2dde7104834 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -240,7 +240,7 @@ <string name="global_action_power_options" msgid="1185286119330160073">"Quvvat"</string> <string name="global_action_restart" msgid="4678451019561687074">"Qayta ishga tushirish"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Favqulodda chaqiruv"</string> - <string name="global_action_bug_report" msgid="5127867163044170003">"Nosozlik haqida ma’lumot berish"</string> + <string name="global_action_bug_report" msgid="5127867163044170003">"Xatoliklar hisoboti"</string> <string name="global_action_logout" msgid="6093581310002476511">"Seansni yakunlash"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Skrinshot"</string> <string name="bugreport_title" msgid="8549990811777373050">"Xatoliklar hisoboti"</string> @@ -1623,7 +1623,7 @@ <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Maxsus imkoniyatlarni yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nJoriy funksiyalar:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nTanlangan funksiyalarni Sozlamalar ichidagi Maxsus imkoniyatlar ustiga bosib oʻzgartirishingiz mumkin."</string> <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"TalkBack yoqilsinmi?"</string> - <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"TalkBack funksiyasini yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. U ekrandan oʻqish dasturi hisoblanib, koʻzi xira koʻradigan va koʻzi ojiz insonlar uchun juda foydali. TalkBack funksiyasi qulringizning ishlashini butunlay oʻzgartirib yuborishi mumkin.\n\nBu tezkor tugmalarni boshqa funksiyaga Sozlamalar ichidagi Maxsus imkoniyatlar orqali tayinlash mumkin."</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"TalkBack funksiyasini yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. U ekrandan oʻqish dasturi hisoblanib, koʻzi xira koʻradigan va koʻzi ojiz insonlar uchun juda foydali. TalkBack funksiyasi qurilmangiz ishlashini butunlay oʻzgartirib yuborishi mumkin.\n\nBu tezkor tugmalarni boshqa funksiyaga Sozlamalar ichidagi Maxsus imkoniyatlar orqali tayinlash mumkin."</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> yoqilsinmi?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"<xliff:g id="SERVICE">%1$s</xliff:g> funksiyasini yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nBu tezkor tugmalarni boshqa funksiyaga Sozlamalar ichidagi Maxsus imkoniyatlar orqali tayinlash mumkin."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Yoqilsin"</string> @@ -1653,7 +1653,7 @@ <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan funksiyani tanlang:"</string> <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan funksiyani tanlang (ikkita barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string> <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan funksiyani tanlang (uchta barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string> - <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Funksiyalarni almashtirihs uchun maxsus imkoniyatlar tugmasini bosib turing."</string> + <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Funksiyalarni almashtirish uchun maxsus imkoniyatlar tugmasini bosib turing."</string> <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Funksiyalarni almashtirish uchun ikkita barmoq bilan tepaga suring va bosib turing."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Funksiyalarni almashtirish uchun uchta barmoq bilan tepaga suring va bosib turing."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Kattalashtirish"</string> @@ -2026,7 +2026,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ta fayl</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ta fayl</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ulashish uchun hech qanday odam tavsiya qilinmagan"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ulashish uchun hech kim tavsiya qilinmagan"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Ilovalar roʻyxati"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Bu ilovaga yozib olish ruxsati berilmagan, lekin shu USB orqali ovozlarni yozib olishi mumkin."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Bosh sahifa"</string> @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Suhbat"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Guruh suhbati"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Shaxsiy"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Ish"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Shaxsiy rejim"</string> @@ -2072,8 +2073,8 @@ <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY" msgid="2876126640607573252">"PUK kodni kiriting"</string> <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY" msgid="8952595089930109282">"PUK kodni kiriting"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY" msgid="3013902515773728996">"PUK kodni kiriting"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM kartalaridagi tarmoq1 qulfini ochish uchun PIN kod"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM kartalaridagi tarmoq2 qulfini ochish uchun PIN kod"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY" msgid="2974411408893410289">"RUIM kartalaridagi network1 qulfini ochish uchun PIN kod"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY" msgid="687618528751880721">"RUIM kartalaridagi network2 qulfini ochish uchun PIN kod"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY" msgid="6810596579655575381">"RUIM HRPD kartalari qulfini ochish uchun PIN kod"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY" msgid="2715929642540980259">"Korporativ RUIM kartalar qulfini ochish uchun PIN kod"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY" msgid="8557791623303951590">"RUIM kartalari aloqa operatori qulfini ochish uchun PIN kod"</string> @@ -2085,7 +2086,7 @@ <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY" msgid="9129139686191167829">"PUK kodni kiriting"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY" msgid="2869929685874615358">"PUK kodni kiriting"</string> <string name="PERSOSUBSTATE_SIM_SPN_ENTRY" msgid="1238663472392741771">"SPN qulfini ochish uchun PIN kod"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"PLMN operatorining muqobil uy tarmoqlarini qulfini ochish uchun PIN kod"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY" msgid="3988705848553894358">"PLMN operatorining muqobil uy tarmoqlari qulfini ochish uchun PIN kod"</string> <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY" msgid="6186770686690993200">"ICCID qulfini ochish uchun PIN kod"</string> <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY" msgid="7043865376145617024">"IMPI qulfini ochish uchun PIN kod"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY" msgid="6144227308185112176">"SIM karta tarmoq qismi aloqa operatorini qulfdan chiqarish uchun PIN kod"</string> @@ -2099,13 +2100,13 @@ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS" msgid="6546680489620881893">"PUK kod bilan qulfni ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS" msgid="3506845511000727015">"PUK kod bilan qulfni ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS" msgid="6709169861932992750">"SIM karta qulfini ochish soʻralmoqda…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM kartalaridagi tarmoq1 qulfini ochish soʻralmoqda…"</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM kartalaridagi tarmoq2 qulfini ochish soʻralmoqda…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS" msgid="4013870911606478520">"RUIM kartalaridagi network1 qulfini ochish soʻralmoqda…"</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS" msgid="9032651188219523434">"RUIM kartalaridagi network2 qulfini ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS" msgid="6584576506344491207">"RUIM HRPD kartalari qulfini ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS" msgid="830981927724888114">"RUIM kartalari aloqa operatori qulfini ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS" msgid="7851790973098894802">"Korporativ RUIM kartalari qulfini ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS" msgid="1149560739586960121">"SPN qulfini ochish soʻralmoqda…"</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"PLMN operatorining muqobil uy tarmoqlarini qulfini ochish soʻralmoqda…"</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS" msgid="5708964693522116025">"PLMN operatorining muqobil uy tarmoqlari qulfini ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS" msgid="7288103122966483455">"ICCID qulfini ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS" msgid="4036752174056147753">"IMPI qulfini ochish soʻralmoqda…"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS" msgid="5089536274515338566">"Aloqa operatori tarmoq qismini qulfdan chiqarish soʻralmoqda…"</string> @@ -2121,8 +2122,8 @@ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"SIM karta tegishli aloqa operatori qulfini ochish soʻrovi yuborilmadi."</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"Korporativ SIM kartalar qulfini ochish soʻrovi yuborilmadi."</string> <string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"SIM karta qulfini ochish soʻrovi yuborilmadi."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM kartalaridagi tarmoq1 qulfini ochish soʻrovi yuborilmadi."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM kartalaridagi tarmoq2 qulfini ochish soʻrovi yuborilmadi."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"RUIM kartalaridagi network1 qulfini ochish soʻrovi yuborilmadi."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"RUIM kartalaridagi network2 qulfini ochish soʻrovi yuborilmadi."</string> <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"RUIM HRPD kartalari qulfini ochish soʻrovi yuborilmadi."</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"Korporativ RUIM kartalar qulfini ochish soʻrovi yuborilmadi."</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"RUIM kartalari aloqa operatori qulfini ochish soʻrovi yuborilmadi."</string> @@ -2139,7 +2140,7 @@ <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"PUK kod bilan qulf ochilmadi."</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"PUK kod bilan qulf ochilmadi."</string> <string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"SPN qulfini ochish soʻrovi yuborilmadi."</string> - <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"PLMN operatorining muqobil uy tarmoqlarini qulfi ochilmadi."</string> + <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"PLMN operatorining muqobil uy tarmoqlari qulfi ochilmadi."</string> <string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"ICCID qulfini ochish soʻrovi yuborilmadi."</string> <string name="PERSOSUBSTATE_SIM_IMPI_ERROR" msgid="2782926139511136588">"IMPI qulfini ochish soʻrovi yuborilmadi."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR" msgid="1890493954453456758">"Aloqa operatori tarmoq qismini qulfdan chiqarish soʻrovi yuborilmadi."</string> @@ -2148,8 +2149,8 @@ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS" msgid="8249342930499801740">"SIM karta tegishli aloqa operatori qulfi ochildi"</string> <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS" msgid="2339794542560381270">"Korporativ SIM kartalar qulfi ochildi."</string> <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS" msgid="6975608174152828954">"SIM karta qulfi ochildi."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM kartalaridagi tarmoq1 qulfi ochildi."</string> - <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM kartalaridagi tarmoq2 qulfi ochildi."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS" msgid="2846699261330463192">"RUIM kartalaridagi network1 qulfi ochildi."</string> + <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS" msgid="5335414726057102801">"RUIM kartalaridagi network2 qulfi ochildi."</string> <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS" msgid="8868100318474971969">"RUIM HRPD kartalari qulfi ochilmadi"</string> <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS" msgid="6020936629725666932">"RUIM kartalari aloqa operatori qulfi ochildi."</string> <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS" msgid="6944873647584595489">"Korporativ RUIM kartasi qulfi ochildi."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 1ddc27d899be..cbe131fca08c 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1309,9 +1309,9 @@ <string name="adb_active_notification_title" msgid="408390247354560331">"Đã kết nối chế độ gỡ lỗi qua USB"</string> <string name="adb_active_notification_message" msgid="5617264033476778211">"Nhấn để tắt chế độ gỡ lỗi qua USB"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Chọn để tắt chế độ gỡ lỗi qua USB."</string> - <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Đã kết nối tính năng gỡ lỗi không dây"</string> - <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Nhấn để tắt tính năng gỡ lỗi không dây"</string> - <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Chọn để tắt tính năng gỡ lỗi không dây."</string> + <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Đã kết nối tính năng gỡ lỗi qua Wi-Fi"</string> + <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Nhấn để tắt tính năng gỡ lỗi qua Wi-Fi"</string> + <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Chọn để tắt tính năng gỡ lỗi qua Wi-Fi."</string> <string name="test_harness_mode_notification_title" msgid="2282785860014142511">"Đã bật Chế độ khai thác kiểm thử"</string> <string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Khôi phục cài đặt gốc để tắt Chế độ khai thác kiểm thử."</string> <string name="console_running_notification_title" msgid="6087888939261635904">"Đã bật bảng điều khiển cổng nối tiếp"</string> @@ -1351,8 +1351,7 @@ <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> không được hỗ trợ"</string> <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"Thiết bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này. Nhấn để thiết lập ở định dạng được hỗ trợ."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="7744945987775645685">"Thiết bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này. Chọn để thiết lập ở định dạng được hỗ trợ."</string> - <!-- no translation found for ext_media_unsupported_notification_message (7657357085538772913) --> - <skip /> + <string name="ext_media_unsupported_notification_message" product="automotive" msgid="7657357085538772913">"Thiết bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này."</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"Đã tháo đột ngột <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"Hãy ngắt kết nối phương tiện trước khi tháo để tránh mất nội dung"</string> <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"Đã xóa <xliff:g id="NAME">%s</xliff:g>"</string> @@ -2045,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Cuộc trò chuyện"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Cuộc trò chuyện nhóm"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"Cá nhân"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Cơ quan"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Chế độ xem cá nhân"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 71005464b0f5..5f921bc65bdf 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"对话"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群组对话"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"个人"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"工作"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"个人视图"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 3ccadf10206a..d85b271a37c6 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"對話"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群組對話"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"個人"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"公司"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人檢視模式"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 02aa9640c3ca..88301a9cc41a 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -2044,6 +2044,8 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"對話"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群組對話"</string> + <!-- no translation found for unread_convo_overflow (920517615597353833) --> + <skip /> <string name="resolver_personal_tab" msgid="2051260504014442073">"個人"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"工作"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人檢視模式"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index c8e68392f16c..cd5cca27beb6 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -2044,6 +2044,7 @@ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Ingxoxo"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ingxoxo Yeqembu"</string> + <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Okomuntu siqu"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Umsebenzi"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ukubuka komuntu siqu"</string> diff --git a/core/tests/coretests/src/android/content/pm/ShortcutQueryWrapperTest.java b/core/tests/coretests/src/android/content/pm/ShortcutQueryWrapperTest.java new file mode 100644 index 000000000000..8f8488f8b287 --- /dev/null +++ b/core/tests/coretests/src/android/content/pm/ShortcutQueryWrapperTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import static org.junit.Assert.assertEquals; + +import android.content.ComponentName; +import android.content.LocusId; +import android.os.Parcel; +import android.platform.test.annotations.Presubmit; + +import androidx.test.runner.AndroidJUnit4; + +import com.google.android.collect.Lists; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +@RunWith(AndroidJUnit4.class) +@Presubmit +public class ShortcutQueryWrapperTest { + + private static final long CHANGED_SINCE = TimeUnit.SECONDS.toMillis(1); + private static final String PACKAGE_NAME = "com.android.test"; + private static final List<String> SHORTCUT_IDS = Lists.newArrayList("s1", "s2", "s3"); + private static final List<LocusId> LOCUS_IDS = Lists.newArrayList( + new LocusId("id1"), new LocusId("id2"), new LocusId("id3")); + private static final ComponentName COMPONENT_NAME = new ComponentName( + PACKAGE_NAME, "ShortcutQueryTest"); + private static final int QUERY_FLAG = LauncherApps.ShortcutQuery.FLAG_MATCH_ALL_KINDS; + + private ShortcutQueryWrapper mShortcutQuery; + + @Before + public void setUp() throws Exception { + mShortcutQuery = new ShortcutQueryWrapper(new LauncherApps.ShortcutQuery() + .setChangedSince(CHANGED_SINCE) + .setPackage(PACKAGE_NAME) + .setShortcutIds(SHORTCUT_IDS) + .setLocusIds(LOCUS_IDS) + .setActivity(COMPONENT_NAME) + .setQueryFlags(QUERY_FLAG)); + } + + @Test + public void testWriteAndReadFromParcel() { + Parcel p = Parcel.obtain(); + mShortcutQuery.writeToParcel(p, 0); + p.setDataPosition(0); + ShortcutQueryWrapper q = ShortcutQueryWrapper.CREATOR.createFromParcel(p); + assertEquals("Changed since doesn't match!", CHANGED_SINCE, q.getChangedSince()); + assertEquals("Package name doesn't match!", PACKAGE_NAME, q.getPackage()); + assertEquals("Shortcut ids doesn't match", SHORTCUT_IDS, q.getShortcutIds()); + assertEquals("Locus ids doesn't match", LOCUS_IDS, q.getLocusIds()); + assertEquals("Component name doesn't match", COMPONENT_NAME, q.getActivity()); + assertEquals("Query flag doesn't match", QUERY_FLAG, q.getQueryFlags()); + p.recycle(); + } +} diff --git a/core/tests/coretests/src/android/provider/DeviceConfigTest.java b/core/tests/coretests/src/android/provider/DeviceConfigTest.java index d649b945492b..61f58b0d27ce 100644 --- a/core/tests/coretests/src/android/provider/DeviceConfigTest.java +++ b/core/tests/coretests/src/android/provider/DeviceConfigTest.java @@ -645,14 +645,60 @@ public class DeviceConfigTest { Properties modifiedProperties2 = new Properties.Builder(namespaceToBan2).setString(KEY, VALUE) + .setString(KEY3, NULL_VALUE).setString(KEY4, VALUE2).build(); + DeviceConfig.setProperties(modifiedProperties2); + modifiedProperties2 = DeviceConfig.getProperties(namespaceToBan2); + assertThat(modifiedProperties2.getKeyset()).containsExactly(KEY, KEY3, KEY4); + assertThat(modifiedProperties2.getString(KEY, DEFAULT_VALUE)).isEqualTo(VALUE); + assertThat(modifiedProperties2.getString(KEY4, DEFAULT_VALUE)).isEqualTo(VALUE2); + // Since value is null DEFAULT_VALUE should be returned + assertThat(modifiedProperties2.getString(KEY3, DEFAULT_VALUE)).isEqualTo(DEFAULT_VALUE); + } + + @Test + public void allConfigsUnbannedIfAnyUnbannedConfigUpdated() + throws DeviceConfig.BadConfigException { + // Given namespaces will be permanently banned, thus they need to be different every time + final String namespaceToBan1 = NAMESPACE + System.currentTimeMillis(); + final String namespaceToBan2 = NAMESPACE + System.currentTimeMillis() + 1; + + // Set namespaces properties + Properties properties1 = new Properties.Builder(namespaceToBan1).setString(KEY, VALUE) + .setString(KEY4, NULL_VALUE).build(); + DeviceConfig.setProperties(properties1); + Properties properties2 = new Properties.Builder(namespaceToBan2).setString(KEY2, VALUE2) + .setString(KEY4, NULL_VALUE).build(); + DeviceConfig.setProperties(properties2); + + // Ban namespace with related properties + DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS, namespaceToBan1); + DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS, namespaceToBan2); + + // Verify given namespace properties are banned + assertThrows(DeviceConfig.BadConfigException.class, + () -> DeviceConfig.setProperties(properties1)); + assertThrows(DeviceConfig.BadConfigException.class, + () -> DeviceConfig.setProperties(properties2)); + + // Modify properties and verify we can set them + Properties modifiedProperties1 = new Properties.Builder(namespaceToBan1).setString(KEY, + VALUE) .setString(KEY4, NULL_VALUE).setString(KEY2, VALUE2).build(); DeviceConfig.setProperties(modifiedProperties1); - modifiedProperties2 = DeviceConfig.getProperties(namespaceToBan1); - assertThat(modifiedProperties2.getKeyset()).containsExactly(KEY, KEY2, KEY4); - assertThat(modifiedProperties2.getString(KEY, DEFAULT_VALUE)).isEqualTo(VALUE); - assertThat(modifiedProperties2.getString(KEY2, DEFAULT_VALUE)).isEqualTo(VALUE2); + modifiedProperties1 = DeviceConfig.getProperties(namespaceToBan1); + assertThat(modifiedProperties1.getKeyset()).containsExactly(KEY, KEY2, KEY4); + assertThat(modifiedProperties1.getString(KEY, DEFAULT_VALUE)).isEqualTo(VALUE); + assertThat(modifiedProperties1.getString(KEY2, DEFAULT_VALUE)).isEqualTo(VALUE2); + // Since value is null DEFAULT_VALUE should be returned + assertThat(modifiedProperties1.getString(KEY4, DEFAULT_VALUE)).isEqualTo(DEFAULT_VALUE); + + // verify that other banned namespaces are unbanned now. + DeviceConfig.setProperties(properties2); + Properties result = DeviceConfig.getProperties(namespaceToBan2); + assertThat(result.getKeyset()).containsExactly(KEY2, KEY4); + assertThat(result.getString(KEY2, DEFAULT_VALUE)).isEqualTo(VALUE2); // Since value is null DEFAULT_VALUE should be returned - assertThat(modifiedProperties2.getString(KEY4, DEFAULT_VALUE)).isEqualTo(DEFAULT_VALUE); + assertThat(result.getString(KEY4, DEFAULT_VALUE)).isEqualTo(DEFAULT_VALUE); } // TODO(mpape): resolve b/142727848 and re-enable listener tests diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index b75370486afe..07cf41560cf3 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -25,6 +25,12 @@ "group": "WM_DEBUG_REMOTE_ANIMATIONS", "at": "com\/android\/server\/wm\/RemoteAnimationController.java" }, + "-2101985723": { + "message": "Failed looking up window session=%s callers=%s", + "level": "WARN", + "group": "WM_ERROR", + "at": "com\/android\/server\/wm\/WindowManagerService.java" + }, "-2072089308": { "message": "Attempted to add window with token that is a sub-window: %s. Aborting.", "level": "WARN", @@ -655,12 +661,6 @@ "group": "WM_DEBUG_SCREEN_ON", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, - "-747671114": { - "message": "Failed looking up window callers=%s", - "level": "WARN", - "group": "WM_ERROR", - "at": "com\/android\/server\/wm\/WindowManagerService.java" - }, "-714291355": { "message": "Losing delayed focus: %s", "level": "INFO", diff --git a/media/java/android/media/tv/tuner/Lnb.java b/media/java/android/media/tv/tuner/Lnb.java index 9ce895e25b49..9913d23b3301 100644 --- a/media/java/android/media/tv/tuner/Lnb.java +++ b/media/java/android/media/tv/tuner/Lnb.java @@ -20,12 +20,12 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.content.Context; import android.hardware.tv.tuner.V1_0.Constants; import android.media.tv.tuner.Tuner.Result; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.concurrent.Executor; /** * LNB (low-noise block downconverter) for satellite tuner. @@ -145,7 +145,8 @@ public class Lnb implements AutoCloseable { int mId; LnbCallback mCallback; - Context mContext; + Executor mExecutor; + private native int nativeSetVoltage(int voltage); private native int nativeSetTone(int tone); @@ -159,10 +160,20 @@ public class Lnb implements AutoCloseable { mId = id; } - void setCallback(@Nullable LnbCallback callback) { + void setCallback(Executor executor, @Nullable LnbCallback callback) { mCallback = callback; - if (mCallback == null) { - return; + mExecutor = executor; + } + + private void onEvent(int eventType) { + if (mExecutor != null && mCallback != null) { + mExecutor.execute(() -> mCallback.onEvent(eventType)); + } + } + + private void onDiseqcMessage(byte[] diseqcMessage) { + if (mExecutor != null && mCallback != null) { + mExecutor.execute(() -> mCallback.onDiseqcMessage(diseqcMessage)); } } @@ -218,6 +229,9 @@ public class Lnb implements AutoCloseable { * Releases the LNB instance. */ public void close() { - nativeClose(); + int res = nativeClose(); + if (res != Tuner.RESULT_SUCCESS) { + TunerUtils.throwExceptionForResult(res, "Failed to close LNB"); + } } } diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index cf1f1b509ad6..dbba4eb320ba 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -829,6 +829,9 @@ public class Tuner implements AutoCloseable { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB); + if (mLnb != null) { + mLnb.setCallback(executor, cb); + } return mLnb; } @@ -847,7 +850,11 @@ public class Tuner implements AutoCloseable { Objects.requireNonNull(name, "LNB name must not be null"); Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); - return nativeOpenLnbByName(name); + mLnb = nativeOpenLnbByName(name); + if (mLnb != null) { + mLnb.setCallback(executor, cb); + } + return mLnb; } private boolean requestLnb() { @@ -872,12 +879,6 @@ public class Tuner implements AutoCloseable { return nativeOpenTimeFilter(); } - private void onLnbEvent(int eventType) { - if (mHandler != null) { - mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0)); - } - } - /** * Opens a Descrambler in tuner. * diff --git a/media/java/android/media/tv/tuner/TunerUtils.java b/media/java/android/media/tv/tuner/TunerUtils.java index 547a4923cf7b..c1589cf3fb1d 100644 --- a/media/java/android/media/tv/tuner/TunerUtils.java +++ b/media/java/android/media/tv/tuner/TunerUtils.java @@ -137,6 +137,8 @@ public final class TunerUtils { msg = ""; } switch (r) { + case Tuner.RESULT_SUCCESS: + return; case Tuner.RESULT_INVALID_ARGUMENT: throw new IllegalArgumentException(msg); case Tuner.RESULT_INVALID_STATE: diff --git a/media/java/android/media/tv/tuner/filter/TimeFilter.java b/media/java/android/media/tv/tuner/filter/TimeFilter.java index da77b50bc3e5..93599e65d170 100644 --- a/media/java/android/media/tv/tuner/filter/TimeFilter.java +++ b/media/java/android/media/tv/tuner/filter/TimeFilter.java @@ -83,7 +83,7 @@ public class TimeFilter implements AutoCloseable { @Result public int clearTimestamp() { int res = nativeClearTimestamp(); - if (res == 0) { + if (res == Tuner.RESULT_SUCCESS) { mEnable = false; } return res; diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 312e5fe14c37..5820be6db8ea 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -155,6 +155,7 @@ struct fields_t { jmethodID onFilterEventID; jmethodID lnbInitID; jmethodID onLnbEventID; + jmethodID onLnbDiseqcMessageID; jmethodID onDvrRecordStatusID; jmethodID onDvrPlaybackStatusID; jmethodID descramblerInitID; @@ -170,19 +171,31 @@ static int IP_V6_LENGTH = 16; namespace android { /////////////// LnbCallback /////////////////////// -LnbCallback::LnbCallback(jweak tunerObj, LnbId id) : mObject(tunerObj), mId(id) {} +LnbCallback::LnbCallback(jobject lnbObj, LnbId id) : mId(id) { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + mLnb = env->NewWeakGlobalRef(lnbObj); +} Return<void> LnbCallback::onEvent(LnbEventType lnbEventType) { ALOGD("LnbCallback::onEvent, type=%d", lnbEventType); JNIEnv *env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod( - mObject, + mLnb, gFields.onLnbEventID, (jint)lnbEventType); return Void(); } -Return<void> LnbCallback::onDiseqcMessage(const hidl_vec<uint8_t>& /*diseqcMessage*/) { +Return<void> LnbCallback::onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage) { ALOGD("LnbCallback::onDiseqcMessage"); + JNIEnv *env = AndroidRuntime::getJNIEnv(); + jbyteArray array = env->NewByteArray(diseqcMessage.size()); + env->SetByteArrayRegion( + array, 0, diseqcMessage.size(), reinterpret_cast<jbyte*>(diseqcMessage[0])); + + env->CallVoidMethod( + mLnb, + gFields.onLnbDiseqcMessageID, + array); return Void(); } @@ -875,6 +888,10 @@ jobject JTuner::openFrontendById(int id) { return NULL; } mFe = fe; + mFeId = id; + if (mDemux != NULL) { + mDemux->setFrontendDataSource(mFeId); + } sp<FrontendCallback> feCb = new FrontendCallback(mObject, id); fe->setCallback(feCb); @@ -1089,16 +1106,16 @@ jobject JTuner::getLnbIds() { jobject JTuner::openLnbById(int id) { sp<ILnb> iLnbSp; - mTuner->openLnbById(id, [&](Result, const sp<ILnb>& lnb) { + Result r; + mTuner->openLnbById(id, [&](Result res, const sp<ILnb>& lnb) { + r = res; iLnbSp = lnb; }); - if (iLnbSp == nullptr) { + if (r != Result::SUCCESS || iLnbSp == nullptr) { ALOGE("Failed to open lnb"); return NULL; } mLnb = iLnbSp; - sp<LnbCallback> lnbCb = new LnbCallback(mObject, id); - mLnb->setCallback(lnbCb); JNIEnv *env = AndroidRuntime::getJNIEnv(); jobject lnbObj = env->NewObject( @@ -1106,6 +1123,9 @@ jobject JTuner::openLnbById(int id) { gFields.lnbInitID, (jint) id); + sp<LnbCallback> lnbCb = new LnbCallback(lnbObj, id); + mLnb->setCallback(lnbCb); + sp<Lnb> lnbSp = new Lnb(iLnbSp, lnbObj); lnbSp->incStrong(lnbObj); env->SetLongField(lnbObj, gFields.lnbContext, (jlong) lnbSp.get()); @@ -1129,14 +1149,15 @@ jobject JTuner::openLnbByName(jstring name) { return NULL; } mLnb = iLnbSp; - sp<LnbCallback> lnbCb = new LnbCallback(mObject, id); - mLnb->setCallback(lnbCb); jobject lnbObj = env->NewObject( env->FindClass("android/media/tv/tuner/Lnb"), gFields.lnbInitID, id); + sp<LnbCallback> lnbCb = new LnbCallback(lnbObj, id); + mLnb->setCallback(lnbCb); + sp<Lnb> lnbSp = new Lnb(iLnbSp, lnbObj); lnbSp->incStrong(lnbObj); env->SetLongField(lnbObj, gFields.lnbContext, (jlong) lnbSp.get()); @@ -1206,12 +1227,21 @@ Result JTuner::openDemux() { return Result::SUCCESS; } Result res; + uint32_t id; + sp<IDemux> demuxSp; mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) { - mDemux = demux; - mDemuxId = demuxId; + demuxSp = demux; + id = demuxId; res = r; ALOGD("open demux, id = %d", demuxId); }); + if (res == Result::SUCCESS) { + mDemux = demuxSp; + mDemuxId = id; + if (mFe != NULL) { + mDemux->setFrontendDataSource(mFeId); + } + } return res; } @@ -2242,8 +2272,6 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { gFields.onFrontendEventID = env->GetMethodID(clazz, "onFrontendEvent", "(I)V"); - gFields.onLnbEventID = env->GetMethodID(clazz, "onLnbEvent", "(I)V"); - jclass frontendClazz = env->FindClass("android/media/tv/tuner/Tuner$Frontend"); gFields.frontendInitID = env->GetMethodID(frontendClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); @@ -2251,6 +2279,8 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb"); gFields.lnbContext = env->GetFieldID(lnbClazz, "mNativeContext", "J"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(I)V"); + gFields.onLnbEventID = env->GetMethodID(lnbClazz, "onEvent", "(I)V"); + gFields.onLnbDiseqcMessageID = env->GetMethodID(lnbClazz, "onDiseqcMessage", "([B)V"); jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter"); gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J"); @@ -3204,8 +3234,14 @@ static int android_media_tv_Tuner_lnb_send_diseqc_msg(JNIEnv* env, jobject lnb, return (jint) r; } -static int android_media_tv_Tuner_close_lnb(JNIEnv*, jobject) { - return 0; +static int android_media_tv_Tuner_close_lnb(JNIEnv* env, jobject lnb) { + sp<Lnb> lnbSp = getLnb(env, lnb); + Result r = lnbSp->getILnb()->close(); + if (r == Result::SUCCESS) { + lnbSp->decStrong(lnb); + env->SetLongField(lnb, gFields.lnbContext, 0); + } + return (jint) r; } static void android_media_tv_Tuner_dvr_set_fd(JNIEnv *env, jobject dvr, jobject jfd) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index e6f10b24c840..40fd644c62a0 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -70,7 +70,7 @@ struct LnbCallback : public ILnbCallback { LnbCallback(jweak tunerObj, LnbId id); virtual Return<void> onEvent(LnbEventType lnbEventType); virtual Return<void> onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage); - jweak mObject; + jweak mLnb; LnbId mId; }; @@ -199,6 +199,7 @@ private: static sp<ITuner> mTuner; hidl_vec<FrontendId> mFeIds; sp<IFrontend> mFe; + int mFeId; hidl_vec<LnbId> mLnbIds; sp<ILnb> mLnb; sp<IDemux> mDemux; diff --git a/media/packages/BluetoothMidiService/Android.bp b/media/packages/BluetoothMidiService/Android.bp index f45114a277aa..77e6a14e1f00 100644 --- a/media/packages/BluetoothMidiService/Android.bp +++ b/media/packages/BluetoothMidiService/Android.bp @@ -1,6 +1,35 @@ +// +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_library { + name: "BluetoothMidiLib", + srcs: [ + "src/**/*.java", + ], + platform_apis: true, + plugins: ["java_api_finder"], + manifest: "AndroidManifestBase.xml", +} + android_app { name: "BluetoothMidiService", - srcs: ["src/**/*.java"], + srcs: [ + "src/**/*.java", + ], platform_apis: true, certificate: "platform", + manifest: "AndroidManifest.xml", } diff --git a/media/packages/BluetoothMidiService/AndroidManifest.xml b/media/packages/BluetoothMidiService/AndroidManifest.xml index 1cfd55d556a9..4042ce8b93df 100644 --- a/media/packages/BluetoothMidiService/AndroidManifest.xml +++ b/media/packages/BluetoothMidiService/AndroidManifest.xml @@ -1,12 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +--> <manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" package="com.android.bluetoothmidiservice" + android:versionCode="1" + android:versionName="R-initial" > + <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> <uses-feature android:name="android.software.midi" android:required="true"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <application + tools:replace="android:label" android:label="@string/app_name"> <service android:name=".BluetoothMidiService" android:permission="android.permission.BIND_MIDI_DEVICE_SERVICE"> diff --git a/media/packages/BluetoothMidiService/AndroidManifestBase.xml b/media/packages/BluetoothMidiService/AndroidManifestBase.xml new file mode 100644 index 000000000000..ebe62b039434 --- /dev/null +++ b/media/packages/BluetoothMidiService/AndroidManifestBase.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.bluetoothmidiservice" + android:versionCode="1" + android:versionName="R-initial" + > + <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> + <application + android:label="BluetoothMidi" + android:defaultToDeviceProtectedStorage="true" + android:directBootAware="true"> + </application> +</manifest> diff --git a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketDecoder.java b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketDecoder.java index c51c8fa73c4e..8d18b77700b5 100644 --- a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketDecoder.java +++ b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketDecoder.java @@ -70,7 +70,9 @@ public class BluetoothPacketDecoder extends PacketDecoder { } byte header = buffer[0]; - if ((header & 0xC0) != 0x80) { + // Check for the header bit 7. + // Ignore the reserved bit 6. + if ((header & 0x80) != 0x80) { Log.e(TAG, "packet does not start with header"); return; } diff --git a/media/packages/BluetoothMidiService/tests/unit/Android.bp b/media/packages/BluetoothMidiService/tests/unit/Android.bp new file mode 100644 index 000000000000..4d4ae9e15532 --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/Android.bp @@ -0,0 +1,38 @@ +// +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test { + name: "BluetoothMidiTests", + srcs: ["src/**/*.java"], + certificate: "platform", + static_libs: [ + //"frameworks-base-testutils", + "android-support-test", + "androidx.test.core", + "androidx.test.ext.truth", + "androidx.test.runner", + "androidx.test.rules", + "platform-test-annotations", + "BluetoothMidiLib", + ], + test_suites: ["device-tests"], + libs: [ + "framework-res", + "android.test.runner", + "android.test.base", + "android.test.mock", + ], +} diff --git a/media/packages/BluetoothMidiService/tests/unit/AndroidManifest.xml b/media/packages/BluetoothMidiService/tests/unit/AndroidManifest.xml new file mode 100644 index 000000000000..4d27e1e7fe04 --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/AndroidManifest.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + package="com.android.bluetoothmidiservice.tests.unit"> + <uses-sdk + android:minSdkVersion="29" + android:targetSdkVersion="29" /> + + <application android:testOnly="true"> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation + android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.bluetoothmidiservice.tests.unit" + android:label="Bluetooth MIDI Service tests"> + </instrumentation> +</manifest> diff --git a/media/packages/BluetoothMidiService/tests/unit/AndroidTest.xml b/media/packages/BluetoothMidiService/tests/unit/AndroidTest.xml new file mode 100644 index 000000000000..02e7f0d55349 --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/AndroidTest.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<configuration description="Runs Bluetooth MIDI Service Tests."> + <option name="test-suite-tag" value="apct" /> + <option name="test-suite-tag" value="apct-instrumentation" /> + <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> + <option name="cleanup-apks" value="true" /> + <option name="install-arg" value="-t" /> + <option name="test-file-name" value="BluetoothMidiTests.apk" /> + </target_preparer> + + <option name="test-tag" value="BLEMidiTests" /> + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.bluetoothmidiservice.tests.unit" /> + <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> + <option name="hidden-api-checks" value="false" /> + </test> +</configuration> diff --git a/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/AccumulatingMidiReceiver.java b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/AccumulatingMidiReceiver.java new file mode 100644 index 000000000000..57859bc114d8 --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/AccumulatingMidiReceiver.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.bluetoothmidiservice; + +import android.media.midi.MidiReceiver; +import android.util.Log; + +import com.android.internal.midi.MidiFramer; + +import java.util.ArrayList; + +class AccumulatingMidiReceiver extends MidiReceiver { + private static final String TAG = "AccumulatingMidiReceiver"; + ArrayList<byte[]> mBuffers = new ArrayList<byte[]>(); + ArrayList<Long> mTimestamps = new ArrayList<Long>(); + + public void onSend(byte[] buffer, int offset, int count, long timestamp) { + Log.d(TAG, "onSend() passed " + MidiFramer.formatMidiData(buffer, offset, count)); + byte[] actualRow = new byte[count]; + System.arraycopy(buffer, offset, actualRow, 0, count); + mBuffers.add(actualRow); + mTimestamps.add(timestamp); + } + + byte[][] getBuffers() { + return mBuffers.toArray(new byte[mBuffers.size()][]); + } + + Long[] getTimestamps() { + return mTimestamps.toArray(new Long[mTimestamps.size()]); + } +} + diff --git a/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiCodecTest.java b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiCodecTest.java new file mode 100644 index 000000000000..3285f59e55c9 --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiCodecTest.java @@ -0,0 +1,257 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.bluetoothmidiservice; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.util.Log; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.midi.MidiFramer; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * End to end testing of the Bluetooth Encoder and Decoder + */ +@RunWith(AndroidJUnit4.class) +@SmallTest +public class BluetoothMidiCodecTest { + + private static final String TAG = "BluetoothMidiCodecTest"; + private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; + private static final long NANOS_PER_MSEC = 1000000L; + + static class EncoderDecoderChecker implements PacketEncoder.PacketReceiver { + BluetoothPacketEncoder mEncoder; + BluetoothPacketDecoder mDecoder; + AccumulatingMidiReceiver mReceiver; + MidiFramer mFramer; + AccumulatingMidiReceiver mBypassReceiver; + MidiFramer mBypassFramer; + int mMaxPacketsPerConnection; + int mConnectionIntervalMillis; + BlockingQueue<byte[]> mPacketQueue; + ScheduledExecutorService mScheduler; + + EncoderDecoderChecker() { + this(2, 15, 20); + } + + EncoderDecoderChecker( + int maxPacketsPerConnection, + int connectionIntervalMillis, + int maxBytesPerPacket) { + mMaxPacketsPerConnection = maxPacketsPerConnection; + mConnectionIntervalMillis = connectionIntervalMillis; + mEncoder = new BluetoothPacketEncoder(this, maxBytesPerPacket); + mDecoder = new BluetoothPacketDecoder(maxBytesPerPacket); + mReceiver = new AccumulatingMidiReceiver(); + mFramer = new MidiFramer(mReceiver); + mBypassReceiver = new AccumulatingMidiReceiver(); + mBypassFramer = new MidiFramer(mBypassReceiver); + mScheduler = Executors.newSingleThreadScheduledExecutor(); + mPacketQueue = new LinkedBlockingDeque<>(maxPacketsPerConnection); + } + + void processQueue() throws InterruptedException { + for (int i = 0; i < mMaxPacketsPerConnection; i++) { + byte[] packet = mPacketQueue.poll(0, TimeUnit.SECONDS); + if (packet == null) break; + Log.d(TAG, "decode " + MidiFramer.formatMidiData(packet, 0, packet.length)); + mDecoder.decodePacket(packet, mFramer); + } + Log.d(TAG, "call writeComplete()"); + mEncoder.writeComplete(); + } + + public void start() { + mScheduler.scheduleAtFixedRate( + () -> { + Log.d(TAG, "run scheduled task"); + try { + processQueue(); + } catch (Exception e) { + assertEquals(null, e); + } + }, + mConnectionIntervalMillis, // initial delay + mConnectionIntervalMillis, // period + TimeUnit.MILLISECONDS); + } + + public void stop() { + // TODO wait for queue to empty + mScheduler.shutdown(); + } + + // TODO Should this block? + // Store the packets and then write them from a periodic task. + @Override + public void writePacket(byte[] buffer, int count) { + Log.d(TAG, "writePacket() passed " + MidiFramer.formatMidiData(buffer, 0, count)); + byte[] packet = new byte[count]; + System.arraycopy(buffer, 0, packet, 0, count); + try { + mPacketQueue.put(packet); + } catch (Exception e) { + assertEquals(null, e); + } + Log.d(TAG, "writePacket() returns"); + } + + void test(final byte[][] midi) + throws IOException, InterruptedException { + test(midi, 2); + } + + // Send the MIDI messages through the encoder, + // then through the decoder, + // then gather the resulting MIDI and compare the results. + void test(final byte[][] midi, int intervalMillis) + throws IOException, InterruptedException { + start(); + long timestamp = 0; + // Send all of the MIDI messages and gather the response. + for (int i = 0; i < midi.length; i++) { + byte[] outMessage = midi[i]; + Log.d(TAG, "outMessage " + + MidiFramer.formatMidiData(outMessage, 0, outMessage.length)); + mEncoder.send(outMessage, 0, outMessage.length, timestamp); + timestamp += 2 * NANOS_PER_MSEC; + // Also send a copy through a MidiFramer to align the messages. + mBypassFramer.send(outMessage, 0, outMessage.length, timestamp); + } + Thread.sleep(200); + stop(); + + // Compare the gathered rows with the expected rows. + byte[][] expectedMessages = mBypassReceiver.getBuffers(); + byte[][] inMessages = mReceiver.getBuffers(); + Log.d(TAG, "expectedMessage length = " + expectedMessages.length + + ", inMessages length = " + inMessages.length); + assertEquals(expectedMessages.length, inMessages.length); + Long[] actualTimestamps = mReceiver.getTimestamps(); + long previousTime = 0; + for (int i = 0; i < expectedMessages.length; i++) { + byte[] expectedMessage = expectedMessages[i]; + Log.d(TAG, "expectedMessage = " + + MidiFramer.formatMidiData(expectedMessage, + 0, expectedMessage.length)); + byte[] actualMessage = inMessages[i]; + Log.d(TAG, "actualMessage = " + + MidiFramer.formatMidiData(actualMessage, 0, actualMessage.length)); + assertArrayEquals(expectedMessage, actualMessage); + // Are the timestamps monotonic? + long currentTime = actualTimestamps[i]; + Log.d(TAG, "previousTime = " + previousTime + + ", currentTime = " + currentTime); + assertTrue(currentTime >= previousTime); + previousTime = currentTime; + } + } + } + + @Test + public void testOneNoteOn() throws IOException, InterruptedException { + final byte[][] midi = { + {(byte) 0x90, 0x40, 0x64} + }; + EncoderDecoderChecker checker = new EncoderDecoderChecker(); + checker.test(midi); + } + + @Test + public void testTwoNoteOnSameTime() throws IOException, InterruptedException { + final byte[][] midi = { + {(byte) 0x90, 0x40, 0x64, (byte) 0x90, 0x47, 0x70} + }; + EncoderDecoderChecker checker = new EncoderDecoderChecker(); + checker.test(midi); + } + + @Test + public void testTwoNoteOnStaggered() throws IOException, InterruptedException { + final byte[][] midi = { + {(byte) 0x90, 0x40, 0x64}, + {(byte) 0x90, 0x47, 0x70} + }; + EncoderDecoderChecker checker = new EncoderDecoderChecker(); + checker.test(midi); + } + + public void checkNoteBurst(int maxPacketsPerConnection, + int period, + int maxBytesPerPacket) throws IOException, InterruptedException { + final int numNotes = 100; + final byte[][] midi = new byte[numNotes][]; + int channel = 2; + for (int i = 0; i < numNotes; i++) { + byte[] message = {(byte) (0x90 + channel), (byte) (i + 1), 0x64}; + midi[i] = message; + channel ^= 1; + } + EncoderDecoderChecker checker = new EncoderDecoderChecker( + maxPacketsPerConnection, 15, maxBytesPerPacket); + checker.test(midi, period); + } + + @Test + public void testNoteBurstM1P6() throws IOException, InterruptedException { + checkNoteBurst(1, 6, 20); + } + @Test + public void testNoteBurstM1P2() throws IOException, InterruptedException { + checkNoteBurst(1, 2, 20); + } + @Test + public void testNoteBurstM2P6() throws IOException, InterruptedException { + checkNoteBurst(2, 6, 20); + } + @Test + public void testNoteBurstM2P2() throws IOException, InterruptedException { + checkNoteBurst(2, 2, 20); + } + @Test + public void testNoteBurstM2P0() throws IOException, InterruptedException { + checkNoteBurst(2, 0, 20); + } + @Test + public void testNoteBurstM2P6B21() throws IOException, InterruptedException { + checkNoteBurst(2, 6, 21); + } + @Test + public void testNoteBurstM2P2B21() throws IOException, InterruptedException { + checkNoteBurst(2, 2, 21); + } + @Test + public void testNoteBurstM2P0B21() throws IOException, InterruptedException { + checkNoteBurst(2, 0, 21); + } +} diff --git a/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiDecoderTest.java b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiDecoderTest.java new file mode 100644 index 000000000000..6ecc53957eaa --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiDecoderTest.java @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.bluetoothmidiservice; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.util.Log; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.midi.MidiFramer; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class BluetoothMidiDecoderTest { + + private static final String TAG = "BluetoothMidiDecoderTest"; + private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; + private static final long NANOS_PER_MSEC = 1000000L; + + static class DecoderChecker { + AccumulatingMidiReceiver mReceiver; + BluetoothPacketDecoder mDecoder; + + DecoderChecker() { + mReceiver = new AccumulatingMidiReceiver(); + final int maxBytes = 20; + mDecoder = new BluetoothPacketDecoder(maxBytes); + } + + void compareWithExpected(final byte[][] expectedMessages) { + byte[][] actualRows = mReceiver.getBuffers(); + Long[] actualTimestamps = mReceiver.getTimestamps(); + long previousTime = 0; + // Compare the gathered with the expected. + assertEquals(expectedMessages.length, actualRows.length); + for (int i = 0; i < expectedMessages.length; i++) { + byte[] expectedRow = expectedMessages[i]; + Log.d(TAG, "expectedRow = " + + MidiFramer.formatMidiData(expectedRow, 0, expectedRow.length)); + byte[] actualRow = actualRows[i]; + Log.d(TAG, "actualRow = " + + MidiFramer.formatMidiData(actualRow, 0, actualRow.length)); + assertArrayEquals(expectedRow, actualRow); + // Are the timestamps monotonic? + long currentTime = actualTimestamps[i]; + Log.d(TAG, "previousTime = " + previousTime + ", currentTime = " + currentTime); + assertTrue(currentTime >= previousTime); + previousTime = currentTime; + } + } + + void decodePacket(byte[] packet) throws IOException { + mDecoder.decodePacket(packet, mReceiver); + } + + void decodePackets(byte[][] multiplePackets) throws IOException { + try { + for (int i = 0; i < multiplePackets.length; i++) { + byte[] packet = multiplePackets[i]; + mDecoder.decodePacket(packet, mReceiver); + } + } catch (Exception e) { + assertEquals(null, e); + } + } + + void test(byte[] encoded, byte[][] decoded) throws IOException { + decodePacket(encoded); + compareWithExpected(decoded); + } + + void test(byte[][] encoded, byte[][] decoded) throws IOException { + decodePackets(encoded); + compareWithExpected(decoded); + } + } + + @Test + public void testOneNoteOn() throws IOException { + final byte[] encoded = { + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x90, 0x40, 0x64 + }; + final byte[][] decoded = { + {(byte) 0x90, 0x40, 0x64} + }; + new DecoderChecker().test(encoded, decoded); + } + + @Test + public void testReservedHeaderBit() throws IOException { + final byte[] encoded = { + // Decoder should ignore the reserved bit. + (byte) (0x80 | 0x40), // set RESERVED bit in header! + (byte) 0x80, // high bit of timestamp + (byte) 0x90, 0x40, 0x64 + }; + final byte[][] decoded = { + {(byte) 0x90, 0x40, 0x64} + }; + new DecoderChecker().test(encoded, decoded); + } + + @Test + public void testTwoNotesOnRunning() throws IOException { + final byte[] encoded = { + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x90, 0x40, 0x64, + (byte) 0x85, // timestamp + (byte) 0x42, 0x70 + }; + final byte[][] decoded = { + {(byte) 0x90, 0x40, 0x64}, + {(byte) 0x42, 0x70} + }; + new DecoderChecker().test(encoded, decoded); + } + + @Test + public void testTwoNoteOnsTwoChannels() throws IOException { + final byte[] encoded = { + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x93, 0x40, 0x60, + // two channels so no running status + (byte) 0x80, // high bit of timestamp + (byte) 0x95, 0x47, 0x64 + }; + final byte[][] decoded = { + {(byte) 0x93, 0x40, 0x60, (byte) 0x95, 0x47, 0x64} + }; + new DecoderChecker().test(encoded, decoded); + } + + @Test + public void testTwoNoteOnsOverTime() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x98, 0x45, 0x60 + }, + { + (byte) 0x80, // high bit of header must be set + (byte) 0x82, // timestamp advanced by 2 msec + (byte) 0x90, 0x40, 0x64, + (byte) 0x84, // timestamp needed because of time delay + // encoder uses running status + 0x47, 0x72 + }}; + final byte[][] decoded = { + {(byte) 0x98, 0x45, 0x60}, + {(byte) 0x90, 0x40, 0x64}, + {(byte) 0x47, 0x72} + }; + new DecoderChecker().test(encoded, decoded); + } + + @Test + public void testSysExBasic() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // timestamp + (byte) 0xF0, 0x7D, // Begin prototyping SysEx + 0x01, 0x02, 0x03, 0x04, 0x05, + (byte) 0x80, // timestamp + (byte) 0xF7 // End SysEx + }}; + final byte[][] decoded = { + {(byte) 0xF0, 0x7D, // experimental SysEx + 0x01, 0x02, 0x03, 0x04, 0x05, (byte) 0xF7} + }; + new DecoderChecker().test(encoded, decoded); + } + + @Test + public void testSysExTwoPackets() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // timestamp + (byte) 0xF0, 0x7D, // Begin prototyping SysEx + 0x01, 0x02 + }, + { + (byte) 0x80, // high bit of header must be set + 0x03, 0x04, 0x05, + (byte) 0x80, // timestamp + (byte) 0xF7 // End SysEx + }}; + final byte[][] decoded = { + {(byte) 0xF0, 0x7D, 0x01, 0x02}, // experimental SysEx + {0x03, 0x04, 0x05, (byte) 0xF7} + }; + new DecoderChecker().test(encoded, decoded); + } + + @Test + public void testSysExThreePackets() throws IOException { + final byte[][] encoded = { + {(byte) 0x80, // high bit of header must be set + (byte) 0x80, // timestamp + (byte) 0xF0, 0x7D, // Begin prototyping SysEx + 0x01, 0x02 + }, + { + (byte) 0x80, // high bit of header must be set + 0x03, 0x04, 0x05, + }, + { + (byte) 0x80, // high bit of header must be set + 0x06, 0x07, 0x08, + (byte) 0x80, // timestamp + (byte) 0xF7 // End SysEx + }}; + final byte[][] decoded = { + {(byte) 0xF0, 0x7D, 0x01, 0x02}, // experimental SysEx + {0x03, 0x04, 0x05}, + {0x06, 0x07, 0x08, (byte) 0xF7} + }; + new DecoderChecker().test(encoded, decoded); + } + +} diff --git a/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiEncoderTest.java b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiEncoderTest.java new file mode 100644 index 000000000000..a169c0d7c7f9 --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiEncoderTest.java @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.bluetoothmidiservice; + +import static org.junit.Assert.assertEquals; + +import android.util.Log; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.midi.MidiFramer; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; +import java.util.ArrayList; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class BluetoothMidiEncoderTest { + + private static final String TAG = "BluetoothMidiEncoderTest"; + private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; + private static final long NANOS_PER_MSEC = 1000000L; + + static class AccumulatingPacketReceiver implements PacketEncoder.PacketReceiver { + ArrayList<byte[]> mBuffers = new ArrayList<byte[]>(); + + public void writePacket(byte[] buffer, int count) { + byte[] actualRow = new byte[count]; + Log.d(TAG, "writePacket() passed " + MidiFramer.formatMidiData(buffer, 0, count)); + System.arraycopy(buffer, 0, actualRow, 0, count); + mBuffers.add(actualRow); + } + + byte[][] getBuffers() { + return mBuffers.toArray(new byte[mBuffers.size()][]); + } + } + + static class EncoderChecker { + AccumulatingPacketReceiver mReceiver; + BluetoothPacketEncoder mEncoder; + + EncoderChecker() { + mReceiver = new AccumulatingPacketReceiver(); + final int maxBytes = 20; + mEncoder = new BluetoothPacketEncoder(mReceiver, maxBytes); + } + + void send(byte[] data) throws IOException { + send(data, 0); + } + + void send(byte[] data, long timestamp) throws IOException { + Log.d(TAG, "send " + MidiFramer.formatMidiData(data, 0, data.length)); + mEncoder.send(data, 0, data.length, timestamp); + } + + void compareWithExpected(final byte[][] expected) { + byte[][] actualRows = mReceiver.getBuffers(); + assertEquals(expected.length, actualRows.length); + // Compare the gathered rows with the expected rows. + for (int i = 0; i < expected.length; i++) { + byte[] expectedRow = expected[i]; + Log.d(TAG, "expectedRow = " + + MidiFramer.formatMidiData(expectedRow, 0, expectedRow.length)); + byte[] actualRow = actualRows[i]; + Log.d(TAG, "actualRow = " + + MidiFramer.formatMidiData(actualRow, 0, actualRow.length)); + assertEquals(expectedRow.length, actualRow.length); + for (int k = 0; k < expectedRow.length; k++) { + assertEquals(expectedRow[k], actualRow[k]); + } + } + } + + void writeComplete() { + mEncoder.writeComplete(); + } + + } + + @Test + public void testOneNoteOn() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x90, 0x40, 0x64 + }}; + EncoderChecker checker = new EncoderChecker(); + checker.send(new byte[] {(byte) 0x90, 0x40, 0x64}); + checker.compareWithExpected(encoded); + } + + @Test + public void testTwoNoteOnsSameChannel() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x90, 0x40, 0x64, + // encoder converts to running status + 0x47, 0x72 + }}; + EncoderChecker checker = new EncoderChecker(); + checker.send(new byte[] {(byte) 0x90, 0x40, 0x64, (byte) 0x90, 0x47, 0x72}); + checker.compareWithExpected(encoded); + } + + @Test + public void testTwoNoteOnsTwoChannels() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x93, 0x40, 0x60, + // two channels so no running status + (byte) 0x80, // high bit of timestamp + (byte) 0x95, 0x47, 0x64 + }}; + EncoderChecker checker = new EncoderChecker(); + checker.send(new byte[] {(byte) 0x93, 0x40, 0x60, (byte) 0x95, 0x47, 0x64}); + checker.compareWithExpected(encoded); + } + + @Test + public void testTwoNoteOnsOverTime() throws IOException { + final byte[][] encoded = { + { + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x98, 0x45, 0x60 + }, + { + (byte) 0x80, // high bit of header must be set + (byte) 0x82, // timestamp advanced by 2 msec + (byte) 0x90, 0x40, 0x64, + (byte) 0x84, // timestamp needed because of time delay + // encoder converts to running status + 0x47, 0x72 + }}; + EncoderChecker checker = new EncoderChecker(); + long timestamp = 0; + // Send one note. This will cause an immediate packet write + // because we don't know when the next one will arrive. + checker.send(new byte[] {(byte) 0x98, 0x45, 0x60}, timestamp); + + // Send two notes. These should accumulate into the + // same packet because we do not yet have a writeComplete. + timestamp += 2 * NANOS_PER_MSEC; + checker.send(new byte[] {(byte) 0x90, 0x40, 0x64}, timestamp); + timestamp += 2 * NANOS_PER_MSEC; + checker.send(new byte[] {(byte) 0x90, 0x47, 0x72}, timestamp); + // Tell the encoder that the first packet has been written to the + // hardware. So it can flush the two pending notes. + checker.writeComplete(); + checker.compareWithExpected(encoded); + } + + @Test + public void testSysExBasic() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // timestamp + (byte) 0xF0, 0x7D, // Begin prototyping SysEx + 0x01, 0x02, 0x03, 0x04, 0x05, + (byte) 0x80, // timestamp + (byte) 0xF7 // End SysEx + }}; + EncoderChecker checker = new EncoderChecker(); + checker.send(new byte[] {(byte) 0xF0, 0x7D, // experimental SysEx + 0x01, 0x02, 0x03, 0x04, 0x05, (byte) 0xF7}); + checker.compareWithExpected(encoded); + } + + @Test + public void testSysExTwoPackets() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // timestamp + (byte) 0xF0, 0x7D, // Begin prototyping SysEx + 0x01, 0x02 + }, + { + (byte) 0x80, // high bit of header must be set + 0x03, 0x04, 0x05, + (byte) 0x80, // timestamp + (byte) 0xF7 // End SysEx + }}; + EncoderChecker checker = new EncoderChecker(); + // Send in two messages. + checker.send(new byte[] {(byte) 0xF0, 0x7D, // experimental SysEx + 0x01, 0x02}); + checker.send(new byte[] {0x03, 0x04, 0x05, (byte) 0xF7}); + // Tell the encoder that the first packet has been written to the + // hardware. So it can flush the remaining data. + checker.writeComplete(); + checker.compareWithExpected(encoded); + } + + @Test + public void testSysExThreePackets() throws IOException { + final byte[][] encoded = {{ + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // timestamp + (byte) 0xF0, 0x7D, // Begin prototyping SysEx + 0x01, 0x02 + }, + { + (byte) 0x80, // high bit of header must be set + 0x03, 0x04, 0x05, + }, + { + (byte) 0x80, // high bit of header must be set + 0x06, 0x07, 0x08, + (byte) 0x80, // timestamp + (byte) 0xF7 // End SysEx + }}; + EncoderChecker checker = new EncoderChecker(); + // Send in three messages. + checker.send(new byte[] {(byte) 0xF0, 0x7D, // experimental SysEx + 0x01, 0x02}); + checker.send(new byte[] {0x03, 0x04, 0x05}); + checker.writeComplete(); + checker.send(new byte[] {0x06, 0x07, 0x08, (byte) 0xF7}); + checker.writeComplete(); + checker.compareWithExpected(encoded); + } +} diff --git a/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/MidiFramerTest.java b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/MidiFramerTest.java new file mode 100644 index 000000000000..8cda6eb3a3ea --- /dev/null +++ b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/MidiFramerTest.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.bluetoothmidiservice; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import android.util.Log; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.midi.MidiFramer; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class MidiFramerTest { + + private static final String TAG = "MidiFramerTest"; + private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; + + // For testing MidiFramer + // TODO move MidiFramer tests to their own file + static class FramerChecker { + AccumulatingMidiReceiver mReceiver; + MidiFramer mFramer; + + FramerChecker() { + mReceiver = new AccumulatingMidiReceiver(); + mFramer = new MidiFramer(mReceiver); + } + + void compareWithExpected(final byte[][] expected) { + byte[][] actualRows = mReceiver.getBuffers(); + assertEquals(expected.length, actualRows.length); + // Compare the gathered rows with the expected rows. + for (int i = 0; i < expected.length; i++) { + byte[] expectedRow = expected[i]; + Log.d(TAG, "expectedRow = " + + MidiFramer.formatMidiData(expectedRow, 0, expectedRow.length)); + byte[] actualRow = actualRows[i]; + Log.d(TAG, "actualRow = " + + MidiFramer.formatMidiData(actualRow, 0, actualRow.length)); + assertArrayEquals(expectedRow, actualRow); + } + } + + void send(byte[] data) throws IOException { + Log.d(TAG, "send " + MidiFramer.formatMidiData(data, 0, data.length)); + mFramer.send(data, 0, data.length, 0); + } + } + + @Test + public void testFramerTwoNoteOns() throws IOException { + final byte[][] expected = { + {(byte) 0x90, 0x40, 0x64}, + {(byte) 0x90, 0x47, 0x50} + }; + FramerChecker checker = new FramerChecker(); + checker.send(new byte[] {(byte) 0x90, 0x40, 0x64, (byte) 0x90, 0x47, 0x50}); + checker.compareWithExpected(expected); + } + + @Test + public void testFramerTwoNoteOnsRunning() throws IOException { + final byte[][] expected = { + {(byte) 0x90, 0x40, 0x64}, + {(byte) 0x90, 0x47, 0x70} + }; + FramerChecker checker = new FramerChecker(); + // Two notes with running status + checker.send(new byte[] {(byte) 0x90, 0x40, 0x64, 0x47, 0x70}); + checker.compareWithExpected(expected); + } + + @Test + public void testFramerPreGarbage() throws IOException { + final byte[][] expected = { + {(byte) 0x90, 0x40, 0x64}, + {(byte) 0x90, 0x47, 0x70} + }; + FramerChecker checker = new FramerChecker(); + // Garbage can come before the first status byte if you connect + // a MIDI cable in the middle of a message. + checker.send(new byte[] {0x01, 0x02, // garbage bytes + (byte) 0x90, 0x40, 0x64, 0x47, 0x70}); + checker.compareWithExpected(expected); + } +} diff --git a/packages/CarrierDefaultApp/res/values-fa/strings.xml b/packages/CarrierDefaultApp/res/values-fa/strings.xml index 37a3de87ba01..5328a03d9646 100644 --- a/packages/CarrierDefaultApp/res/values-fa/strings.xml +++ b/packages/CarrierDefaultApp/res/values-fa/strings.xml @@ -6,9 +6,7 @@ <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.format failed for translation --> - <!-- no translation found for no_data_notification_detail (3112125343857014825) --> - <skip /> + <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> diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml index 4d5dc4e3f4bf..30a193f25f54 100644 --- a/packages/InputDevices/res/values-eu/strings.xml +++ b/packages/InputDevices/res/values-eu/strings.xml @@ -9,14 +9,14 @@ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Ingelesa (AEB), Colemak estiloa"</string> <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Ingelesa (AEB), Dvorak estiloa"</string> <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"Ingelesa (AEB), Workman estiloa"</string> - <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Alemaniarra"</string> + <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Alemana"</string> <string name="keyboard_layout_french_label" msgid="813450119589383723">"Frantsesa"</string> <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Frantsesa (Kanada)"</string> <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Errusiarra"</string> <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Errusiarra, Mac estiloa"</string> <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Espainiarra"</string> <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Frantsesa (Suitza)"</string> - <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Alemaniarra (Suitza)"</string> + <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Alemana (Suitza)"</string> <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgikarra"</string> <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgariarra"</string> <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiarra"</string> @@ -36,8 +36,8 @@ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkiarra"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainarra"</string> <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabiarra"</string> - <string name="keyboard_layout_greek" msgid="7289253560162386040">"Greziera"</string> - <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreera"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Greziarra"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrearra"</string> <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituaniera"</string> <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Espainiera (Latinoamerika)"</string> <string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letoniera"</string> diff --git a/packages/InputDevices/res/values-mk/strings.xml b/packages/InputDevices/res/values-mk/strings.xml index 44069a25202d..220dd67e0df1 100644 --- a/packages/InputDevices/res/values-mk/strings.xml +++ b/packages/InputDevices/res/values-mk/strings.xml @@ -3,12 +3,12 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="8016145283189546017">"Влезни уреди"</string> <string name="keyboard_layouts_label" msgid="6688773268302087545">"Тастатура за Android"</string> - <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Англиски (О.К.)"</string> - <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Англиски (САД)"</string> - <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Англиски (САД), меѓународен стил"</string> - <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Англиски (САД), Colemak стил"</string> - <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Англиски (САД), Dvorak стил"</string> - <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"Англиски (САД), Workman стил"</string> + <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"англиски (О.К.)"</string> + <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"англиски (САД)"</string> + <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"англиски (САД), меѓународен стил"</string> + <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"англиски (САД), Colemak стил"</string> + <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"англиски (САД), Dvorak стил"</string> + <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"англиски (САД), Workman стил"</string> <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Германски"</string> <string name="keyboard_layout_french_label" msgid="813450119589383723">"Француски"</string> <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Француски (Канада)"</string> diff --git a/packages/OsuLogin/res/values-af/strings.xml b/packages/OsuLogin/res/values-af/strings.xml new file mode 100644 index 000000000000..bfeee10622ae --- /dev/null +++ b/packages/OsuLogin/res/values-af/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Sluit aanlyn aan"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Kon nie aanmeld nie"</string> +</resources> diff --git a/packages/OsuLogin/res/values-am/strings.xml b/packages/OsuLogin/res/values-am/strings.xml new file mode 100644 index 000000000000..e27c578343ef --- /dev/null +++ b/packages/OsuLogin/res/values-am/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"የመስመር ላይ ምዝገባ"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ምዝገባ አልተሳካም"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ar/strings.xml b/packages/OsuLogin/res/values-ar/strings.xml new file mode 100644 index 000000000000..b72d7c1b45f8 --- /dev/null +++ b/packages/OsuLogin/res/values-ar/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"الاشتراك على الإنترنت"</string> + <string name="sign_up_failed" msgid="837216244603867568">"تعذّر الاشتراك."</string> +</resources> diff --git a/packages/OsuLogin/res/values-as/strings.xml b/packages/OsuLogin/res/values-as/strings.xml new file mode 100644 index 000000000000..422de3222871 --- /dev/null +++ b/packages/OsuLogin/res/values-as/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"অনলাইনত ছাই আপ কৰক"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ছাইন আপ কৰিব পৰা নগ’ল"</string> +</resources> diff --git a/packages/OsuLogin/res/values-az/strings.xml b/packages/OsuLogin/res/values-az/strings.xml new file mode 100644 index 000000000000..977f93982619 --- /dev/null +++ b/packages/OsuLogin/res/values-az/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Onlayn Qeydiyyat"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Qeydiyyat alınmadı"</string> +</resources> diff --git a/packages/OsuLogin/res/values-b+sr+Latn/strings.xml b/packages/OsuLogin/res/values-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..6eb2cc119ef9 --- /dev/null +++ b/packages/OsuLogin/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Onlajn registracija"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registracija nije uspela"</string> +</resources> diff --git a/packages/OsuLogin/res/values-be/strings.xml b/packages/OsuLogin/res/values-be/strings.xml new file mode 100644 index 000000000000..158c3f22ce21 --- /dev/null +++ b/packages/OsuLogin/res/values-be/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Зарэгістравацца ў інтэрнэце"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Не ўдалося зарэгістравацца"</string> +</resources> diff --git a/packages/OsuLogin/res/values-bg/strings.xml b/packages/OsuLogin/res/values-bg/strings.xml new file mode 100644 index 000000000000..ea3145dcb87f --- /dev/null +++ b/packages/OsuLogin/res/values-bg/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Онлайн регистрация"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Регистрацията не бе успешна"</string> +</resources> diff --git a/packages/OsuLogin/res/values-bn/strings.xml b/packages/OsuLogin/res/values-bn/strings.xml new file mode 100644 index 000000000000..c9f615e2d017 --- /dev/null +++ b/packages/OsuLogin/res/values-bn/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"অনলাইনে সাইন-আপ করুন"</string> + <string name="sign_up_failed" msgid="837216244603867568">"সাইন-আপ করা যায়নি"</string> +</resources> diff --git a/packages/OsuLogin/res/values-bs/strings.xml b/packages/OsuLogin/res/values-bs/strings.xml new file mode 100644 index 000000000000..e9b9751c95cf --- /dev/null +++ b/packages/OsuLogin/res/values-bs/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online registracija"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registracija nije uspjela"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ca/strings.xml b/packages/OsuLogin/res/values-ca/strings.xml new file mode 100644 index 000000000000..7d9309616592 --- /dev/null +++ b/packages/OsuLogin/res/values-ca/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Registre en línia"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Ha fallat el registre"</string> +</resources> diff --git a/packages/OsuLogin/res/values-cs/strings.xml b/packages/OsuLogin/res/values-cs/strings.xml new file mode 100644 index 000000000000..b9cb7942bc79 --- /dev/null +++ b/packages/OsuLogin/res/values-cs/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online registrace"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registrace selhala"</string> +</resources> diff --git a/packages/OsuLogin/res/values-da/strings.xml b/packages/OsuLogin/res/values-da/strings.xml new file mode 100644 index 000000000000..68c93b78a46d --- /dev/null +++ b/packages/OsuLogin/res/values-da/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online registrering"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registrering mislykkedes"</string> +</resources> diff --git a/packages/OsuLogin/res/values-de/strings.xml b/packages/OsuLogin/res/values-de/strings.xml new file mode 100644 index 000000000000..7e5a3106db4a --- /dev/null +++ b/packages/OsuLogin/res/values-de/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online-Registrierung"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registrierung fehlgeschlagen"</string> +</resources> diff --git a/packages/OsuLogin/res/values-el/strings.xml b/packages/OsuLogin/res/values-el/strings.xml new file mode 100644 index 000000000000..a58e4817a3cb --- /dev/null +++ b/packages/OsuLogin/res/values-el/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Εγγραφή στο διαδίκτυο"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Αποτυχία εγγραφής"</string> +</resources> diff --git a/packages/OsuLogin/res/values-en-rAU/strings.xml b/packages/OsuLogin/res/values-en-rAU/strings.xml new file mode 100644 index 000000000000..fbbcab17c412 --- /dev/null +++ b/packages/OsuLogin/res/values-en-rAU/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string> +</resources> diff --git a/packages/OsuLogin/res/values-en-rCA/strings.xml b/packages/OsuLogin/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..fbbcab17c412 --- /dev/null +++ b/packages/OsuLogin/res/values-en-rCA/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string> +</resources> diff --git a/packages/OsuLogin/res/values-en-rGB/strings.xml b/packages/OsuLogin/res/values-en-rGB/strings.xml new file mode 100644 index 000000000000..fbbcab17c412 --- /dev/null +++ b/packages/OsuLogin/res/values-en-rGB/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string> +</resources> diff --git a/packages/OsuLogin/res/values-en-rIN/strings.xml b/packages/OsuLogin/res/values-en-rIN/strings.xml new file mode 100644 index 000000000000..fbbcab17c412 --- /dev/null +++ b/packages/OsuLogin/res/values-en-rIN/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string> +</resources> diff --git a/packages/OsuLogin/res/values-en-rXC/strings.xml b/packages/OsuLogin/res/values-en-rXC/strings.xml new file mode 100644 index 000000000000..af7ff67c86b2 --- /dev/null +++ b/packages/OsuLogin/res/values-en-rXC/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online Sign Up"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string> +</resources> diff --git a/packages/OsuLogin/res/values-es-rUS/strings.xml b/packages/OsuLogin/res/values-es-rUS/strings.xml new file mode 100644 index 000000000000..144804cd891c --- /dev/null +++ b/packages/OsuLogin/res/values-es-rUS/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Registrarse en línea"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Se produjo un error de registro"</string> +</resources> diff --git a/packages/OsuLogin/res/values-es/strings.xml b/packages/OsuLogin/res/values-es/strings.xml new file mode 100644 index 000000000000..3ad95cd8cdc9 --- /dev/null +++ b/packages/OsuLogin/res/values-es/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Registro online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Error al completar el registro"</string> +</resources> diff --git a/packages/OsuLogin/res/values-et/strings.xml b/packages/OsuLogin/res/values-et/strings.xml new file mode 100644 index 000000000000..94c5cea646a5 --- /dev/null +++ b/packages/OsuLogin/res/values-et/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Veebis registreerimine"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registreerimine ebaõnnestus"</string> +</resources> diff --git a/packages/OsuLogin/res/values-eu/strings.xml b/packages/OsuLogin/res/values-eu/strings.xml new file mode 100644 index 000000000000..30caa8740a1d --- /dev/null +++ b/packages/OsuLogin/res/values-eu/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Sarean izen-ematea"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Ezin izan da eman izena"</string> +</resources> diff --git a/packages/OsuLogin/res/values-fa/strings.xml b/packages/OsuLogin/res/values-fa/strings.xml new file mode 100644 index 000000000000..300520336037 --- /dev/null +++ b/packages/OsuLogin/res/values-fa/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ثبتنام آنلاین"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ثبتنام انجام نشد"</string> +</resources> diff --git a/packages/OsuLogin/res/values-fi/strings.xml b/packages/OsuLogin/res/values-fi/strings.xml new file mode 100644 index 000000000000..24eac8acc8d3 --- /dev/null +++ b/packages/OsuLogin/res/values-fi/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Rekisteröidy verkossa"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Rekisteröityminen ei onnistunut"</string> +</resources> diff --git a/packages/OsuLogin/res/values-fr-rCA/strings.xml b/packages/OsuLogin/res/values-fr-rCA/strings.xml new file mode 100644 index 000000000000..bcaa6621e803 --- /dev/null +++ b/packages/OsuLogin/res/values-fr-rCA/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Inscription en ligne"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Échec de l\'inscription"</string> +</resources> diff --git a/packages/OsuLogin/res/values-fr/strings.xml b/packages/OsuLogin/res/values-fr/strings.xml new file mode 100644 index 000000000000..bcaa6621e803 --- /dev/null +++ b/packages/OsuLogin/res/values-fr/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Inscription en ligne"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Échec de l\'inscription"</string> +</resources> diff --git a/packages/OsuLogin/res/values-gl/strings.xml b/packages/OsuLogin/res/values-gl/strings.xml new file mode 100644 index 000000000000..5fc44440d01d --- /dev/null +++ b/packages/OsuLogin/res/values-gl/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Rexistro en liña"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Produciuse un erro co rexistro"</string> +</resources> diff --git a/packages/OsuLogin/res/values-gu/strings.xml b/packages/OsuLogin/res/values-gu/strings.xml new file mode 100644 index 000000000000..8449963b1705 --- /dev/null +++ b/packages/OsuLogin/res/values-gu/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ઑનલાઇન સાઇન અપ કરો"</string> + <string name="sign_up_failed" msgid="837216244603867568">"સાઇન અપ નિષ્ફળ"</string> +</resources> diff --git a/packages/OsuLogin/res/values-hi/strings.xml b/packages/OsuLogin/res/values-hi/strings.xml new file mode 100644 index 000000000000..9e07438047f0 --- /dev/null +++ b/packages/OsuLogin/res/values-hi/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ऑनलाइन साइन अप करें"</string> + <string name="sign_up_failed" msgid="837216244603867568">"साइन अप नहीं किया जा सका"</string> +</resources> diff --git a/packages/OsuLogin/res/values-hr/strings.xml b/packages/OsuLogin/res/values-hr/strings.xml new file mode 100644 index 000000000000..e9b9751c95cf --- /dev/null +++ b/packages/OsuLogin/res/values-hr/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online registracija"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registracija nije uspjela"</string> +</resources> diff --git a/packages/OsuLogin/res/values-hu/strings.xml b/packages/OsuLogin/res/values-hu/strings.xml new file mode 100644 index 000000000000..cb0e036fbbd3 --- /dev/null +++ b/packages/OsuLogin/res/values-hu/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online regisztráció"</string> + <string name="sign_up_failed" msgid="837216244603867568">"A regisztráció nem sikerült"</string> +</resources> diff --git a/packages/OsuLogin/res/values-hy/strings.xml b/packages/OsuLogin/res/values-hy/strings.xml new file mode 100644 index 000000000000..ae1c36a0b341 --- /dev/null +++ b/packages/OsuLogin/res/values-hy/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Առցանց գրանցում"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Չհաջողվեց գրանցվել"</string> +</resources> diff --git a/packages/OsuLogin/res/values-in/strings.xml b/packages/OsuLogin/res/values-in/strings.xml new file mode 100644 index 000000000000..6aaf6942c25a --- /dev/null +++ b/packages/OsuLogin/res/values-in/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Pendaftaran Online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Pendaftaran gagal"</string> +</resources> diff --git a/packages/OsuLogin/res/values-is/strings.xml b/packages/OsuLogin/res/values-is/strings.xml new file mode 100644 index 000000000000..f1ae520a63ee --- /dev/null +++ b/packages/OsuLogin/res/values-is/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Skráning á netinu"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Skráning mistókst"</string> +</resources> diff --git a/packages/OsuLogin/res/values-it/strings.xml b/packages/OsuLogin/res/values-it/strings.xml new file mode 100644 index 000000000000..fbff7b0f4c75 --- /dev/null +++ b/packages/OsuLogin/res/values-it/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Registrazione online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registrazione non riuscita"</string> +</resources> diff --git a/packages/OsuLogin/res/values-iw/strings.xml b/packages/OsuLogin/res/values-iw/strings.xml new file mode 100644 index 000000000000..866ef880759c --- /dev/null +++ b/packages/OsuLogin/res/values-iw/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"הרשמה אונליין"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ההרשמה נכשלה"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ja/strings.xml b/packages/OsuLogin/res/values-ja/strings.xml new file mode 100644 index 000000000000..8a220d605afb --- /dev/null +++ b/packages/OsuLogin/res/values-ja/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"オンライン登録"</string> + <string name="sign_up_failed" msgid="837216244603867568">"登録できませんでした"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ka/strings.xml b/packages/OsuLogin/res/values-ka/strings.xml new file mode 100644 index 000000000000..bf08006c47b3 --- /dev/null +++ b/packages/OsuLogin/res/values-ka/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ონლაინ რეგისტრაცია"</string> + <string name="sign_up_failed" msgid="837216244603867568">"რეგისტრაცია ვერ მოხერხდა"</string> +</resources> diff --git a/packages/OsuLogin/res/values-kk/strings.xml b/packages/OsuLogin/res/values-kk/strings.xml new file mode 100644 index 000000000000..8b87356ad547 --- /dev/null +++ b/packages/OsuLogin/res/values-kk/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Онлайн тіркелу"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Тіркелмеді."</string> +</resources> diff --git a/packages/OsuLogin/res/values-km/strings.xml b/packages/OsuLogin/res/values-km/strings.xml new file mode 100644 index 000000000000..f58ccc330c5f --- /dev/null +++ b/packages/OsuLogin/res/values-km/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ការចុះឈ្មោះលើអ៊ីនធឺណិត"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ការចុះឈ្មោះមិនបានសម្រេច"</string> +</resources> diff --git a/packages/OsuLogin/res/values-kn/strings.xml b/packages/OsuLogin/res/values-kn/strings.xml new file mode 100644 index 000000000000..49a65627487e --- /dev/null +++ b/packages/OsuLogin/res/values-kn/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ಆನ್ಲೈನ್ ಸೈನ್ ಅಪ್"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ಸೈನ್ ಅಪ್ ವಿಫಲವಾಗಿದೆ"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ko/strings.xml b/packages/OsuLogin/res/values-ko/strings.xml new file mode 100644 index 000000000000..e647ca05f97a --- /dev/null +++ b/packages/OsuLogin/res/values-ko/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"온라인 가입"</string> + <string name="sign_up_failed" msgid="837216244603867568">"가입에 실패했습니다."</string> +</resources> diff --git a/packages/OsuLogin/res/values-ky/strings.xml b/packages/OsuLogin/res/values-ky/strings.xml new file mode 100644 index 000000000000..42da248ac9e5 --- /dev/null +++ b/packages/OsuLogin/res/values-ky/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Интернет аркылуу катталуу"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Катталган жоксуз"</string> +</resources> diff --git a/packages/OsuLogin/res/values-lo/strings.xml b/packages/OsuLogin/res/values-lo/strings.xml new file mode 100644 index 000000000000..9ff224170908 --- /dev/null +++ b/packages/OsuLogin/res/values-lo/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ສະໝັກອອນລາຍ"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ສະໝັກບໍ່ສຳເລັດ"</string> +</resources> diff --git a/packages/OsuLogin/res/values-lt/strings.xml b/packages/OsuLogin/res/values-lt/strings.xml new file mode 100644 index 000000000000..1a4c06e87955 --- /dev/null +++ b/packages/OsuLogin/res/values-lt/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Internetinis prisiregistravimas"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Nepavyko prisiregistruoti"</string> +</resources> diff --git a/packages/OsuLogin/res/values-lv/strings.xml b/packages/OsuLogin/res/values-lv/strings.xml new file mode 100644 index 000000000000..11cdb974440f --- /dev/null +++ b/packages/OsuLogin/res/values-lv/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Reģistrācija tiešsaistē"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Reģistrācija neizdevās."</string> +</resources> diff --git a/packages/OsuLogin/res/values-mk/strings.xml b/packages/OsuLogin/res/values-mk/strings.xml new file mode 100644 index 000000000000..de608e12cab7 --- /dev/null +++ b/packages/OsuLogin/res/values-mk/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Онлајн регистрација"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Регистрацијата не успеа"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ml/strings.xml b/packages/OsuLogin/res/values-ml/strings.xml new file mode 100644 index 000000000000..8e797c8e6e98 --- /dev/null +++ b/packages/OsuLogin/res/values-ml/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ഓൺലെെൻ സെെൻ അപ്പ്"</string> + <string name="sign_up_failed" msgid="837216244603867568">"സൈൻ അപ്പ് ചെയ്യാനായില്ല"</string> +</resources> diff --git a/packages/OsuLogin/res/values-mn/strings.xml b/packages/OsuLogin/res/values-mn/strings.xml new file mode 100644 index 000000000000..59d79d0c0a5d --- /dev/null +++ b/packages/OsuLogin/res/values-mn/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Онлайнаар бүртгүүлэх"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Бүртгүүлж чадсангүй"</string> +</resources> diff --git a/packages/OsuLogin/res/values-mr/strings.xml b/packages/OsuLogin/res/values-mr/strings.xml new file mode 100644 index 000000000000..15479a6e2735 --- /dev/null +++ b/packages/OsuLogin/res/values-mr/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ऑनलाइन साइन अप करा"</string> + <string name="sign_up_failed" msgid="837216244603867568">"साइन-अप करता आले नाही"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ms/strings.xml b/packages/OsuLogin/res/values-ms/strings.xml new file mode 100644 index 000000000000..7e1cf9535319 --- /dev/null +++ b/packages/OsuLogin/res/values-ms/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Pendaftaran Dalam Talian"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Pendaftaran gagal"</string> +</resources> diff --git a/packages/OsuLogin/res/values-my/strings.xml b/packages/OsuLogin/res/values-my/strings.xml new file mode 100644 index 000000000000..1bd992e8485b --- /dev/null +++ b/packages/OsuLogin/res/values-my/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"အွန်လိုင်း အကောင့်ဖွင့်ရန်"</string> + <string name="sign_up_failed" msgid="837216244603867568">"အကောင့်ဖွင့်၍ မရပါ"</string> +</resources> diff --git a/packages/OsuLogin/res/values-nb/strings.xml b/packages/OsuLogin/res/values-nb/strings.xml new file mode 100644 index 000000000000..2e0c47a18fca --- /dev/null +++ b/packages/OsuLogin/res/values-nb/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Registrering på nettet"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registreringen mislyktes"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ne/strings.xml b/packages/OsuLogin/res/values-ne/strings.xml new file mode 100644 index 000000000000..16bd92f57e23 --- /dev/null +++ b/packages/OsuLogin/res/values-ne/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"अनलाइन साइन अप"</string> + <string name="sign_up_failed" msgid="837216244603867568">"साइन अप गर्न सकिएन"</string> +</resources> diff --git a/packages/OsuLogin/res/values-nl/strings.xml b/packages/OsuLogin/res/values-nl/strings.xml new file mode 100644 index 000000000000..7cf8bd2da1ac --- /dev/null +++ b/packages/OsuLogin/res/values-nl/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online aanmelding"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Aanmelding mislukt"</string> +</resources> diff --git a/packages/OsuLogin/res/values-or/strings.xml b/packages/OsuLogin/res/values-or/strings.xml new file mode 100644 index 000000000000..e0584d716d66 --- /dev/null +++ b/packages/OsuLogin/res/values-or/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ଅନଲାଇନ୍ ସାଇନ୍ ଅପ୍ କରନ୍ତୁ"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ସାଇନ୍ ଅପ୍ ବିଫଳ ହୋଇଛି"</string> +</resources> diff --git a/packages/OsuLogin/res/values-pa/strings.xml b/packages/OsuLogin/res/values-pa/strings.xml new file mode 100644 index 000000000000..7e47d0e0960e --- /dev/null +++ b/packages/OsuLogin/res/values-pa/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ਆਨਲਾਈਨ ਸਾਈਨ-ਅੱਪ ਕਰੋ"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ਸਾਈਨ-ਅੱਪ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string> +</resources> diff --git a/packages/OsuLogin/res/values-pl/strings.xml b/packages/OsuLogin/res/values-pl/strings.xml new file mode 100644 index 000000000000..c0722ab6aaf6 --- /dev/null +++ b/packages/OsuLogin/res/values-pl/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Rejestracja online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Nie udało się zarejestrować"</string> +</resources> diff --git a/packages/OsuLogin/res/values-pt-rBR/strings.xml b/packages/OsuLogin/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000000..c9fe3772504d --- /dev/null +++ b/packages/OsuLogin/res/values-pt-rBR/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Inscrição on-line"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Falha na inscrição"</string> +</resources> diff --git a/packages/OsuLogin/res/values-pt-rPT/strings.xml b/packages/OsuLogin/res/values-pt-rPT/strings.xml new file mode 100644 index 000000000000..0059281416c8 --- /dev/null +++ b/packages/OsuLogin/res/values-pt-rPT/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Inscrição online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Falha na inscrição."</string> +</resources> diff --git a/packages/OsuLogin/res/values-pt/strings.xml b/packages/OsuLogin/res/values-pt/strings.xml new file mode 100644 index 000000000000..c9fe3772504d --- /dev/null +++ b/packages/OsuLogin/res/values-pt/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Inscrição on-line"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Falha na inscrição"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ro/strings.xml b/packages/OsuLogin/res/values-ro/strings.xml new file mode 100644 index 000000000000..eead127dd877 --- /dev/null +++ b/packages/OsuLogin/res/values-ro/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Înscriere online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Nu s-a înscris"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ru/strings.xml b/packages/OsuLogin/res/values-ru/strings.xml new file mode 100644 index 000000000000..a271ef7c00fc --- /dev/null +++ b/packages/OsuLogin/res/values-ru/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Регистрация в Интернете"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Не удалось зарегистрироваться."</string> +</resources> diff --git a/packages/OsuLogin/res/values-si/strings.xml b/packages/OsuLogin/res/values-si/strings.xml new file mode 100644 index 000000000000..52e5979e7078 --- /dev/null +++ b/packages/OsuLogin/res/values-si/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"සබැඳි ලියාපදිංචිය"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ලියාපදිංචිය අසාර්ථක විය"</string> +</resources> diff --git a/packages/OsuLogin/res/values-sk/strings.xml b/packages/OsuLogin/res/values-sk/strings.xml new file mode 100644 index 000000000000..f6b9f702d3b7 --- /dev/null +++ b/packages/OsuLogin/res/values-sk/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online registrácia"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registrácia zlyhala"</string> +</resources> diff --git a/packages/OsuLogin/res/values-sl/strings.xml b/packages/OsuLogin/res/values-sl/strings.xml new file mode 100644 index 000000000000..6e6b95ce07f1 --- /dev/null +++ b/packages/OsuLogin/res/values-sl/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Spletna registracija"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registracija ni uspela"</string> +</resources> diff --git a/packages/OsuLogin/res/values-sq/strings.xml b/packages/OsuLogin/res/values-sq/strings.xml new file mode 100644 index 000000000000..f67a2382bdac --- /dev/null +++ b/packages/OsuLogin/res/values-sq/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Regjistrimi në linjë"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Regjistrimi dështoi"</string> +</resources> diff --git a/packages/OsuLogin/res/values-sr/strings.xml b/packages/OsuLogin/res/values-sr/strings.xml new file mode 100644 index 000000000000..14e0828d5b83 --- /dev/null +++ b/packages/OsuLogin/res/values-sr/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Онлајн регистрација"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Регистрација није успела"</string> +</resources> diff --git a/packages/OsuLogin/res/values-sv/strings.xml b/packages/OsuLogin/res/values-sv/strings.xml new file mode 100644 index 000000000000..ea5fdfda7004 --- /dev/null +++ b/packages/OsuLogin/res/values-sv/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Registrering online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registreringen misslyckades"</string> +</resources> diff --git a/packages/OsuLogin/res/values-sw/strings.xml b/packages/OsuLogin/res/values-sw/strings.xml new file mode 100644 index 000000000000..c20a4023dda5 --- /dev/null +++ b/packages/OsuLogin/res/values-sw/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Kujisajili Mtandaoni"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Imeshindwa kukusajili"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ta/strings.xml b/packages/OsuLogin/res/values-ta/strings.xml new file mode 100644 index 000000000000..e2eb567ef92e --- /dev/null +++ b/packages/OsuLogin/res/values-ta/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ஆன்லைனில் பதிவு செய்"</string> + <string name="sign_up_failed" msgid="837216244603867568">"பதிவு செய்ய முடியவில்லை"</string> +</resources> diff --git a/packages/OsuLogin/res/values-te/strings.xml b/packages/OsuLogin/res/values-te/strings.xml new file mode 100644 index 000000000000..56b0b44d4802 --- /dev/null +++ b/packages/OsuLogin/res/values-te/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"ఆన్లైన్ సైన్ అప్"</string> + <string name="sign_up_failed" msgid="837216244603867568">"సైన్-అప్ విఫలమయ్యింది"</string> +</resources> diff --git a/packages/OsuLogin/res/values-th/strings.xml b/packages/OsuLogin/res/values-th/strings.xml new file mode 100644 index 000000000000..552dca2c15e3 --- /dev/null +++ b/packages/OsuLogin/res/values-th/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"การลงชื่อสมัครใช้ออนไลน์"</string> + <string name="sign_up_failed" msgid="837216244603867568">"ลงชื่อสมัครใช้ไม่สำเร็จ"</string> +</resources> diff --git a/packages/OsuLogin/res/values-tl/strings.xml b/packages/OsuLogin/res/values-tl/strings.xml new file mode 100644 index 000000000000..ba89e9654213 --- /dev/null +++ b/packages/OsuLogin/res/values-tl/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Pag-sign Up Online"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Hindi nakapag-sign up"</string> +</resources> diff --git a/packages/OsuLogin/res/values-tr/strings.xml b/packages/OsuLogin/res/values-tr/strings.xml new file mode 100644 index 000000000000..1d927fef4d16 --- /dev/null +++ b/packages/OsuLogin/res/values-tr/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Online Kaydolma"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Kaydolma işlemi başarısız oldu"</string> +</resources> diff --git a/packages/OsuLogin/res/values-uk/strings.xml b/packages/OsuLogin/res/values-uk/strings.xml new file mode 100644 index 000000000000..6e60ff008c0f --- /dev/null +++ b/packages/OsuLogin/res/values-uk/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Онлайн-реєстрація"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Не вдалося зареєструватись"</string> +</resources> diff --git a/packages/OsuLogin/res/values-ur/strings.xml b/packages/OsuLogin/res/values-ur/strings.xml new file mode 100644 index 000000000000..eed7686c4fe9 --- /dev/null +++ b/packages/OsuLogin/res/values-ur/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"آن لائن سائن اپ کریں"</string> + <string name="sign_up_failed" msgid="837216244603867568">"سائن اپ ناکام ہو گیا"</string> +</resources> diff --git a/packages/OsuLogin/res/values-uz/strings.xml b/packages/OsuLogin/res/values-uz/strings.xml new file mode 100644 index 000000000000..152d129fe05a --- /dev/null +++ b/packages/OsuLogin/res/values-uz/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Onlayn registratsiya"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Registratsiya qilinmadi"</string> +</resources> diff --git a/packages/OsuLogin/res/values-vi/strings.xml b/packages/OsuLogin/res/values-vi/strings.xml new file mode 100644 index 000000000000..845580760965 --- /dev/null +++ b/packages/OsuLogin/res/values-vi/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Đăng ký trực tuyến"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Không đăng ký được"</string> +</resources> diff --git a/packages/OsuLogin/res/values-zh-rCN/strings.xml b/packages/OsuLogin/res/values-zh-rCN/strings.xml new file mode 100644 index 000000000000..7f13647bfccd --- /dev/null +++ b/packages/OsuLogin/res/values-zh-rCN/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"在线注册"</string> + <string name="sign_up_failed" msgid="837216244603867568">"注册失败"</string> +</resources> diff --git a/packages/OsuLogin/res/values-zh-rHK/strings.xml b/packages/OsuLogin/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000000..873179189b24 --- /dev/null +++ b/packages/OsuLogin/res/values-zh-rHK/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"網上申請"</string> + <string name="sign_up_failed" msgid="837216244603867568">"無法申請"</string> +</resources> diff --git a/packages/OsuLogin/res/values-zh-rTW/strings.xml b/packages/OsuLogin/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000000..79208c8d7387 --- /dev/null +++ b/packages/OsuLogin/res/values-zh-rTW/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"線上註冊"</string> + <string name="sign_up_failed" msgid="837216244603867568">"註冊失敗"</string> +</resources> diff --git a/packages/OsuLogin/res/values-zu/strings.xml b/packages/OsuLogin/res/values-zu/strings.xml new file mode 100644 index 000000000000..27ac6bb755f9 --- /dev/null +++ b/packages/OsuLogin/res/values-zu/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8288271429327488421">"I-OsuLogin"</string> + <string name="action_bar_label" msgid="550995560341508693">"Ukubhalisa Okuku-inthanethi"</string> + <string name="sign_up_failed" msgid="837216244603867568">"Ukubhalisa kuhlulekile"</string> +</resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index fb8a0b7f63ca..3024b842c2be 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -146,6 +146,7 @@ public class LocalMediaManager implements BluetoothCallback { ((BluetoothMediaDevice) device).getCachedDevice(); if (!cachedDevice.isConnected() && !cachedDevice.isBusy()) { mOnTransferBluetoothDevice = connectDevice; + device.setState(MediaDeviceState.STATE_CONNECTING); cachedDevice.connect(); return; } @@ -220,7 +221,7 @@ public class LocalMediaManager implements BluetoothCallback { */ public MediaDevice getMediaDeviceById(List<MediaDevice> devices, String id) { for (MediaDevice mediaDevice : devices) { - if (mediaDevice.getId().equals(id)) { + if (TextUtils.equals(mediaDevice.getId(), id)) { return mediaDevice; } } @@ -236,7 +237,7 @@ public class LocalMediaManager implements BluetoothCallback { */ public MediaDevice getMediaDeviceById(String id) { for (MediaDevice mediaDevice : mMediaDevices) { - if (mediaDevice.getId().equals(id)) { + if (TextUtils.equals(mediaDevice.getId(), id)) { return mediaDevice; } } @@ -394,6 +395,7 @@ public class LocalMediaManager implements BluetoothCallback { dispatchDeviceListUpdate(); if (mOnTransferBluetoothDevice != null && mOnTransferBluetoothDevice.isConnected()) { connectDevice(mOnTransferBluetoothDevice); + mOnTransferBluetoothDevice.setState(MediaDeviceState.STATE_CONNECTED); mOnTransferBluetoothDevice = null; } } @@ -539,6 +541,14 @@ public class LocalMediaManager implements BluetoothCallback { @Override public void onDeviceAttributesChanged() { + if (mOnTransferBluetoothDevice != null + && !((BluetoothMediaDevice) mOnTransferBluetoothDevice).getCachedDevice() + .isBusy() + && !mOnTransferBluetoothDevice.isConnected()) { + // Failed to connect + mOnTransferBluetoothDevice.setState(MediaDeviceState.STATE_DISCONNECTED); + mOnTransferBluetoothDevice = null; + } dispatchDeviceAttributesChanged(); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java index 1c690724b1c1..7ddd64c15876 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java @@ -218,6 +218,26 @@ public class LocalMediaManagerTest { } @Test + public void getMediaDeviceById_idIsNull_shouldReturnNull() { + final MediaDevice device1 = mock(MediaDevice.class); + final MediaDevice device2 = mock(MediaDevice.class); + mLocalMediaManager.mMediaDevices.add(device1); + mLocalMediaManager.mMediaDevices.add(device2); + + when(device1.getId()).thenReturn(null); + when(device2.getId()).thenReturn(null); + + MediaDevice device = mLocalMediaManager + .getMediaDeviceById(mLocalMediaManager.mMediaDevices, TEST_CURRENT_DEVICE_ID); + + assertThat(device).isNull(); + + device = mLocalMediaManager.getMediaDeviceById(TEST_CURRENT_DEVICE_ID); + + assertThat(device).isNull(); + } + + @Test public void onDeviceAdded_addDevice() { final MediaDevice device = mock(MediaDevice.class); @@ -464,6 +484,26 @@ public class LocalMediaManagerTest { } @Test + public void onDeviceAttributesChanged_failingTransferring_shouldResetState() { + final MediaDevice currentDevice = mock(MediaDevice.class); + final MediaDevice device = mock(BluetoothMediaDevice.class); + final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); + mLocalMediaManager.mMediaDevices.add(device); + mLocalMediaManager.mMediaDevices.add(currentDevice); + when(device.getId()).thenReturn(TEST_DEVICE_ID_1); + when(currentDevice.getId()).thenReturn(TEST_CURRENT_DEVICE_ID); + when(((BluetoothMediaDevice) device).getCachedDevice()).thenReturn(cachedDevice); + when(cachedDevice.isConnected()).thenReturn(false); + when(cachedDevice.isBusy()).thenReturn(false); + + mLocalMediaManager.registerCallback(mCallback); + mLocalMediaManager.connectDevice(device); + + mLocalMediaManager.mDeviceAttributeChangeCallback.onDeviceAttributesChanged(); + verify(device).setState(LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED); + } + + @Test public void onRequestFailed_checkDevicesState() { mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice1); mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice2); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 2fde87c08ad5..d3d04e5a31d0 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2813,6 +2813,7 @@ public class SettingsProvider extends ContentProvider { if (settingsState.isNewConfigBannedLocked(prefix, keyValues)) { return false; } + settingsState.unbanAllConfigIfBannedConfigUpdatedLocked(prefix); List<String> changedSettings = settingsState.setSettingsLocked(prefix, keyValues, packageName); if (!changedSettings.isEmpty()) { diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index d93c0150410d..6b8219ea9c70 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -459,6 +459,16 @@ final class SettingsState { } @GuardedBy("mLock") + public void unbanAllConfigIfBannedConfigUpdatedLocked(String prefix) { + // If the prefix updated is a banned namespace, clear mNamespaceBannedHashes + // to unban all unbanned namespaces. + if (mNamespaceBannedHashes.get(prefix) != null) { + mNamespaceBannedHashes.clear(); + scheduleWriteIfNeededLocked(); + } + } + + @GuardedBy("mLock") public void banConfigurationLocked(String prefix, Map<String, String> keyValues) { if (prefix == null || keyValues.isEmpty()) { return; diff --git a/packages/Shell/res/values-it/strings.xml b/packages/Shell/res/values-it/strings.xml index 7d04eeb9165f..18ab908945ac 100644 --- a/packages/Shell/res/values-it/strings.xml +++ b/packages/Shell/res/values-it/strings.xml @@ -30,7 +30,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tocca per inviare la segnalazione del bug senza screenshot o attendi che lo screenshot sia completo"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Le segnalazioni di bug contengono dati recuperati da vari file di log del sistema e potrebbero includere dati considerati riservati (ad esempio dati relativi alla posizione e all\'utilizzo delle app). Condividi le segnalazioni di bug solo con persone e app attendibili."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Non mostrare più"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapporti sui bug"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"Segnalazioni di bug"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Impossibile leggere il file relativo alla segnalazione di bug"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Impossibile aggiungere i dettagli della segnalazione di bug al file zip"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"senza nome"</string> diff --git a/packages/Shell/res/values-or/strings.xml b/packages/Shell/res/values-or/strings.xml index bd2b6cd6a740..517183972e4d 100644 --- a/packages/Shell/res/values-or/strings.xml +++ b/packages/Shell/res/values-or/strings.xml @@ -35,7 +35,7 @@ <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_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> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index 022726e43e98..d956a79cb496 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -98,7 +98,7 @@ <string name="kg_password_pin_failed" msgid="5136259126330604009">"SIM-картанын PIN-кодун ачуу кыйрады!"</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM-картанын PUK-кодун ачуу кыйрады!"</string> <string name="kg_pin_accepted" msgid="1625501841604389716">"Код кабыл алынды!"</string> - <string name="keyguard_carrier_default" msgid="6359808469637388586">"Байланыш жок."</string> + <string name="keyguard_carrier_default" msgid="6359808469637388586">"Интернет жок."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Киргизүү ыкмасын өзгөртүү"</string> <string name="airplane_mode" msgid="2528005343938497866">"Учак режими"</string> <string name="kg_prompt_reason_prepare_for_update_pin" msgid="8878724145347297575">"Жаңыртууга даярдоо үчүн PIN код талап кылынат"</string> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 34633d30086d..5f1df3e109b1 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -54,7 +54,7 @@ <string name="keyguard_accessibility_sim_pin_area" msgid="6272116591533888062">"Miejsce na kod PIN karty SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="5537294043180237374">"Miejsce na kod PUK karty SIM"</string> <string name="keyguard_accessibility_next_alarm" msgid="4492876946798984630">"Następny alarm ustawiony na: <xliff:g id="ALARM">%1$s</xliff:g>"</string> - <string name="keyboardview_keycode_delete" msgid="8489719929424895174">"Usuwanie"</string> + <string name="keyboardview_keycode_delete" msgid="8489719929424895174">"Usuń"</string> <string name="disable_carrier_button_text" msgid="7153361131709275746">"Wyłącz eSIM"</string> <string name="error_disable_esim_title" msgid="3802652622784813119">"Nie można wyłączyć karty eSIM"</string> <string name="error_disable_esim_msg" msgid="2441188596467999327">"Nie można wyłączyć karty eSIM z powodu błędu."</string> diff --git a/packages/SystemUI/res/drawable/ic_empty_bubble_overflow_dark.xml b/packages/SystemUI/res/drawable/ic_empty_bubble_overflow_dark.xml new file mode 100644 index 000000000000..8f8f1b664692 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_empty_bubble_overflow_dark.xml @@ -0,0 +1,162 @@ +<!-- +Copyright (C) 2020 The Android Open Source Project + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT 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="412dp" + android:height="300dp" + android:viewportWidth="412" + android:viewportHeight="300"> + <group> + <clip-path + android:pathData="M206,150m-150,0a150,150 0,1 1,300 0a150,150 0,1 1,-300 0"/> + <path + android:pathData="M296,105.2h-9.6l-3.1,-2.5l-3.1,2.5H116c-1.7,0 -3,1.3 -3,3v111.7c0,1.7 1.3,3 3,3h180c1.7,0 3,-1.3 3,-3V108.2C299,106.6 297.7,105.2 296,105.2C296,105.2 296,105.2 296,105.2z" + android:fillColor="#3C4043"/> + <path + android:strokeWidth="1" + android:pathData="M252.4,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#D2E3FC" + android:strokeColor="#4285F4"/> + <path + android:pathData="M261.9,95.7m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" + android:fillColor="#4285F4"/> + <path + android:strokeWidth="1" + android:pathData="M160.6,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#FAD2CF" + android:strokeColor="#EA4335"/> + <path + android:pathData="M170.1,95.7m-4.6,0a4.6,4.6 0,1 1,9.2 0a4.6,4.6 0,1 1,-9.2 0" + android:fillColor="#EA4335"/> + <path + android:strokeWidth="1" + android:pathData="M192.1,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#FEEFC3" + android:strokeColor="#FBBC04"/> + <path + android:strokeWidth="1" + android:pathData="M221.8,85.4m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#CEEAD6" + android:strokeColor="#34A853"/> + <path + android:pathData="M201.6,95.7m-4.6,0a4.6,4.6 0,1 1,9.2 0a4.6,4.6 0,1 1,-9.2 0" + android:fillColor="#FBBC04"/> + <path + android:pathData="M231.4,95.7m-4.6,0a4.6,4.6 0,1 1,9.2 0a4.6,4.6 0,1 1,-9.2 0" + android:fillColor="#34A853"/> + <path + android:pathData="M282.8,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#3C4043"/> + <path + android:pathData="M278.7,85.7m-1.2,0a1.2,1.2 0,1 1,2.4 0a1.2,1.2 0,1 1,-2.4 0" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M282.8,85.7m-1.2,0a1.2,1.2 0,1 1,2.4 0a1.2,1.2 0,1 1,-2.4 0" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M286.9,85.7m-1.2,0a1.2,1.2 0,1 1,2.4 0a1.2,1.2 0,1 1,-2.4 0" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M129.2,72.9h-3.4l0.3,1c1,-0.3 2.1,-0.4 3.2,-0.4v-1V72.9zM122.6,74.8c-0.5,0.3 -1,0.6 -1.4,1l0,0l0,0l0,0l0,0h-0.6l0,0l0,0l0,0l0,0l0,0l0,0c-0.2,0.2 -0.3,0.3 -0.4,0.5l0.8,0.7c0.7,-0.8 1.5,-1.5 2.4,-2.1l-0.5,-0.8L122.6,74.8zM118,80L118,80L118,80L118,80L118,80L118,80L118,80L118,80c-0.5,1 -0.8,2 -1,3l1,0.2c0.2,-1 0.5,-2 1,-3L118,80zM117.8,86.7l-1,0.1c0.1,0.6 0.2,1.1 0.3,1.7l0,0l0,0h0.1l0,0l0,0l0,0l0,0c0.1,0.5 0.3,0.9 0.5,1.4l0.9,-0.4c-0.4,-1 -0.7,-2 -0.8,-3.1L117.8,86.7zM120.2,92.5l-0.8,0.6l0.2,0.3l0,0l0,0l0,0l0,0h0.3l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0.4,0.4l0,0l0,0l0,0l0,0h0.1l0,0l0,0l0,0l0,0l0,0h0.5l0,0l0,0l0,0l0,0l0,0l0,0l0.6,0.4l0.6,-0.8c-0.9,-0.6 -1.7,-1.4 -2.3,-2.2L120.2,92.5zM125.4,96.2l-0.3,0.9c1.1,0.4 2.2,0.6 3.4,0.7l0.1,-1C127.5,96.7 126.4,96.5 125.4,96.2zM134.7,95.4c-0.9,0.5 -2,0.9 -3,1.1l0.2,1h0.4c1,-0.3 2,-0.6 2.9,-1.2l-0.5,-0.9L134.7,95.4zM139.2,90.9c-0.5,0.9 -1.2,1.8 -1.9,2.5l0.7,0.7v-0.1h0.2l0,0l0,0c0.7,-0.7 1.3,-1.6 1.8,-2.4l-0.9,-0.5L139.2,90.9zM141.6,84.7h-1c0,0.2 0,0.4 0,0.6c0,0.9 -0.1,1.7 -0.3,2.6l1,0.2c0.1,-0.4 0.2,-0.8 0.2,-1.2l0,0v-0.1l0,0v-0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0c0,-0.2 0,-0.3 0,-0.5l0,0L141.6,84.7zM139.3,78.2l-0.8,0.6c0.6,0.9 1.1,1.8 1.5,2.8l0.9,-0.3c-0.1,-0.2 -0.2,-0.4 -0.2,-0.7l0,0l0,0h-0.1l0,0l0,0l0,0l0,0l0,0l0,0c-0.3,-0.7 -0.7,-1.4 -1.1,-2l0,0l0,0l0,0l0,0l0,0l0,0l0,0L139.3,78.2zM134,73.9l-0.4,0.9c1,0.4 1.9,1 2.7,1.6l0.6,-0.8l0,0l0,0l0,0l0,0l0,0c-0.3,-0.3 -0.7,-0.5 -1,-0.7l0,0h-0.1h-0.6c-0.4,-0.2 -0.8,-0.4 -1.2,-0.6L134,73.9zM129.2,72.9v1c0.4,0 0.9,0 1.3,0.1l0.1,-1l-0.9,-0.1L129.2,72.9L129.2,72.9z" + android:fillColor="#34A853"/> + <path + android:pathData="M206,252m-11.7,0a11.7,11.7 0,1 1,23.4 0a11.7,11.7 0,1 1,-23.4 0" + android:fillColor="#F1F3F4"/> + <path + android:pathData="M201.7,247.7L210.3,256.3" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#202124" + android:strokeLineCap="round"/> + <path + android:pathData="M210.3,247.7L201.7,256.3" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#202124" + android:strokeLineCap="round"/> + <path + android:strokeWidth="1" + android:pathData="M205.3,221.9m-10.4,0a10.4,10.4 0,1 1,20.8 0a10.4,10.4 0,1 1,-20.8 0" + android:fillColor="#CEEAD6" + android:strokeColor="#34A853"/> + <path + android:pathData="M481.4,292.2c48,58.3 119.8,125.8 58.6,162.9c-38.7,23.5 -53.9,24 -98.3,33.2c-43.8,9.1 -93.6,-89.8 -101.1,-134.5C329.6,288.6 452.6,257.2 481.4,292.2z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M458.2,320.7l-21.1,-71.4L400.5,193c-2.7,-5.1 -1.2,-11.4 3.5,-14.7l0,0c2.8,-2 6.6,-1.5 8.8,1.1c0,0 40.6,38.4 53.2,61.1l81.5,134.8l-69.9,-39.1L458.2,320.7z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M403.8,184.8l5.4,6.9c1.2,1.5 3.3,1.9 4.9,0.9l3,-1.8" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M420.9,325.8l-37.8,-88.6l-58.4,-37.8c-5.7,-5.4 -7.4,-13.8 -4.2,-21l0,0c2,-4.6 7.4,-6.7 12,-4.6c0.2,0.1 0.4,0.2 0.7,0.3c0,0 70.7,36.3 81.5,48.3l59.8,95.5l-49.9,24.9L420.9,325.8z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M324.6,183.9l8,6.2c2.1,1.7 5.2,1.4 7,-0.6l2.9,-3.3" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M392.4,231c3.8,-5.1 9.1,-8.9 15.1,-10.9" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + <path + android:pathData="M401.3,283.8L405.8,292.6" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + <path + android:pathData="M378.2,346.9l-34.7,-75.6l-60,-61.2c-6.3,-4.7 -9,-12.8 -6.7,-20.4l0,0c1.5,-4.8 6.5,-7.5 11.3,-6c0.2,0.1 0.4,0.1 0.7,0.2c0,0 73.5,48.2 82.6,61.7l64.1,95.7l-40.3,23.5L378.2,346.9z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M280.8,196.6l7.6,4.6c2.6,1.6 5.9,1.1 7.9,-1.1l4.1,-4.5" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M347.5,251c3.8,-5.1 9.1,-8.9 15.1,-10.9" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + <path + android:pathData="M207.2,234.1c-8.8,-11 4.7,-31.5 19.8,-19c17.7,14.7 74.7,64.3 74.7,64.3l103.8,101.8c0,0 -36.4,53.8 -44.5,42.3C287.8,319.3 234.4,267.9 207.2,234.1z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M209.6,226.2l9.3,9.5c1,0.8 3,0.4 3.1,-1c0.2,-2.2 4.6,-6.2 7,-6.6c1.1,-0.3 1.7,-1.4 1.4,-2.4c-0.1,-0.2 -0.2,-0.4 -0.3,-0.6l-4.4,-3.9" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M284.1,296.2c3.1,-5.5 7.8,-10 13.5,-12.8" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + </group> + <path + android:pathData="M206,4c80.6,0 146,65.4 146,146c0,38.7 -15.4,75.9 -42.8,103.2c-57,57 -149.5,57 -206.5,0s-57,-149.5 0,-206.5C130.1,19.3 167.3,3.9 206,4M206,0C123.2,0 56,67.2 56,150s67.2,150 150,150s150,-67.2 150,-150S288.8,0 206,0z" + android:fillColor="#D2E3FC"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_empty_bubble_overflow_light.xml b/packages/SystemUI/res/drawable/ic_empty_bubble_overflow_light.xml new file mode 100644 index 000000000000..5e02f67700e7 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_empty_bubble_overflow_light.xml @@ -0,0 +1,162 @@ +<!-- +Copyright (C) 2020 The Android Open Source Project + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT 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="412dp" + android:height="300dp" + android:viewportWidth="412" + android:viewportHeight="300"> + <group> + <clip-path + android:pathData="M206,150m-150,0a150,150 0,1 1,300 0a150,150 0,1 1,-300 0"/> + <path + android:pathData="M296,105.2h-9.6l-3.1,-2.5l-3.1,2.5H116c-1.7,0 -3,1.3 -3,3v111.7c0,1.7 1.3,3 3,3h180c1.7,0 3,-1.3 3,-3V108.2C299,106.6 297.7,105.2 296,105.2L296,105.2z" + android:fillColor="#F1F3F4"/> + <path + android:strokeWidth="1" + android:pathData="M252.4,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#D2E3FC" + android:strokeColor="#4285F4"/> + <path + android:pathData="M261.9,95.7m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" + android:fillColor="#4285F4"/> + <path + android:strokeWidth="1" + android:pathData="M160.6,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#FAD2CF" + android:strokeColor="#EA4335"/> + <path + android:pathData="M170.1,95.7m-4.6,0a4.6,4.6 0,1 1,9.2 0a4.6,4.6 0,1 1,-9.2 0" + android:fillColor="#EA4335"/> + <path + android:strokeWidth="1" + android:pathData="M192.1,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#FEEFC3" + android:strokeColor="#FBBC04"/> + <path + android:strokeWidth="1" + android:pathData="M221.8,85.4m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#CEEAD6" + android:strokeColor="#34A853"/> + <path + android:pathData="M201.6,95.7m-4.6,0a4.6,4.6 0,1 1,9.2 0a4.6,4.6 0,1 1,-9.2 0" + android:fillColor="#FBBC04"/> + <path + android:pathData="M231.4,95.7m-4.6,0a4.6,4.6 0,1 1,9.2 0a4.6,4.6 0,1 1,-9.2 0" + android:fillColor="#34A853"/> + <path + android:pathData="M282.8,85.3m-12.4,0a12.4,12.4 0,1 1,24.8 0a12.4,12.4 0,1 1,-24.8 0" + android:fillColor="#F1F3F4"/> + <path + android:pathData="M278.7,85.7m-1.2,0a1.2,1.2 0,1 1,2.4 0a1.2,1.2 0,1 1,-2.4 0" + android:fillColor="#3474E0"/> + <path + android:pathData="M282.8,85.7m-1.2,0a1.2,1.2 0,1 1,2.4 0a1.2,1.2 0,1 1,-2.4 0" + android:fillColor="#3474E0"/> + <path + android:pathData="M286.9,85.7m-1.2,0a1.2,1.2 0,1 1,2.4 0a1.2,1.2 0,1 1,-2.4 0" + android:fillColor="#3474E0"/> + <path + android:pathData="M129.2,72.9h-3.4l0.3,1c1,-0.3 2.1,-0.4 3.2,-0.4v-1v0.4H129.2zM122.6,74.8c-0.5,0.3 -1,0.6 -1.4,1l0,0l0,0l0,0l0,0h-0.6l0,0l0,0l0,0l0,0l0,0l0,0c-0.2,0.2 -0.3,0.3 -0.4,0.5L121,77c0.7,-0.8 1.5,-1.5 2.4,-2.1l-0.5,-0.8L122.6,74.8zM118,80L118,80L118,80L118,80L118,80L118,80L118,80L118,80c-0.5,1 -0.8,2 -1,3l1,0.2c0.2,-1 0.5,-2 1,-3L118,80zM117.8,86.7l-1,0.1c0.1,0.6 0.2,1.1 0.3,1.7l0,0l0,0h0.1l0,0l0,0l0,0l0,0c0.1,0.5 0.3,0.9 0.5,1.4l0.9,-0.4c-0.4,-1 -0.7,-2 -0.8,-3.1V86.7zM120.2,92.5l-0.8,0.6l0.2,0.3l0,0l0,0l0,0l0,0h0.3l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0.4,0.4l0,0l0,0l0,0l0,0h0.1l0,0l0,0l0,0l0,0l0,0h0.5l0,0l0,0l0,0l0,0l0,0l0,0l0.6,0.4l0.6,-0.8c-0.9,-0.6 -1.7,-1.4 -2.3,-2.2L120.2,92.5zM125.4,96.2l-0.3,0.9c1.1,0.4 2.2,0.6 3.4,0.7l0.1,-1C127.5,96.7 126.4,96.5 125.4,96.2zM134.7,95.4c-0.9,0.5 -2,0.9 -3,1.1l0.2,1h0.4c1,-0.3 2,-0.6 2.9,-1.2L134.7,95.4L134.7,95.4zM139.2,90.9c-0.5,0.9 -1.2,1.8 -1.9,2.5l0.7,0.7V94h0.2l0,0l0,0c0.7,-0.7 1.3,-1.6 1.8,-2.4l-0.9,-0.5L139.2,90.9zM141.6,84.7h-1c0,0.2 0,0.4 0,0.6c0,0.9 -0.1,1.7 -0.3,2.6l1,0.2c0.1,-0.4 0.2,-0.8 0.2,-1.2l0,0v-0.1l0,0v-0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0c0,-0.2 0,-0.3 0,-0.5l0,0L141.6,84.7zM139.3,78.2l-0.8,0.6c0.6,0.9 1.1,1.8 1.5,2.8l0.9,-0.3c-0.1,-0.2 -0.2,-0.4 -0.2,-0.7l0,0l0,0h-0.1l0,0l0,0l0,0l0,0l0,0l0,0c-0.3,-0.7 -0.7,-1.4 -1.1,-2l0,0l0,0l0,0l0,0l0,0l0,0l0,0L139.3,78.2zM134,73.9l-0.4,0.9c1,0.4 1.9,1 2.7,1.6l0.6,-0.8l0,0l0,0l0,0l0,0l0,0c-0.3,-0.3 -0.7,-0.5 -1,-0.7l0,0h-0.1h-0.6c-0.4,-0.2 -0.8,-0.4 -1.2,-0.6V73.9zM129.2,72.9v1c0.4,0 0.9,0 1.3,0.1l0.1,-1l-0.9,-0.1H129.2L129.2,72.9z" + android:fillColor="#34A853"/> + <path + android:pathData="M206,252m-11.7,0a11.7,11.7 0,1 1,23.4 0a11.7,11.7 0,1 1,-23.4 0" + android:fillColor="#9AA0A6"/> + <path + android:pathData="M201.7,247.7L210.3,256.3" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#F1F3F4" + android:strokeLineCap="round"/> + <path + android:pathData="M210.3,247.7L201.7,256.3" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#F1F3F4" + android:strokeLineCap="round"/> + <path + android:strokeWidth="1" + android:pathData="M205.3,221.9m-10.4,0a10.4,10.4 0,1 1,20.8 0a10.4,10.4 0,1 1,-20.8 0" + android:fillColor="#CEEAD6" + android:strokeColor="#34A853"/> + <path + android:pathData="M481.4,292.2c48,58.3 119.8,125.8 58.6,162.9c-38.7,23.5 -53.9,24 -98.3,33.2c-43.8,9.1 -93.6,-89.8 -101.1,-134.5C329.6,288.6 452.6,257.2 481.4,292.2z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M458.2,320.7l-21.1,-71.4L400.5,193c-2.7,-5.1 -1.2,-11.4 3.5,-14.7l0,0c2.8,-2 6.6,-1.5 8.8,1.1c0,0 40.6,38.4 53.2,61.1l81.5,134.8l-69.9,-39.1L458.2,320.7z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M403.8,184.8l5.4,6.9c1.2,1.5 3.3,1.9 4.9,0.9l3,-1.8" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M420.9,325.8l-37.8,-88.6l-58.4,-37.8c-5.7,-5.4 -7.4,-13.8 -4.2,-21l0,0c2,-4.6 7.4,-6.7 12,-4.6c0.2,0.1 0.4,0.2 0.7,0.3c0,0 70.7,36.3 81.5,48.3l59.8,95.5l-49.9,24.9L420.9,325.8z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M324.6,183.9l8,6.2c2.1,1.7 5.2,1.4 7,-0.6l2.9,-3.3" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M392.4,231c3.8,-5.1 9.1,-8.9 15.1,-10.9" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + <path + android:pathData="M401.3,283.8L405.8,292.6" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + <path + android:pathData="M378.2,346.9l-34.7,-75.6l-60,-61.2c-6.3,-4.7 -9,-12.8 -6.7,-20.4l0,0c1.5,-4.8 6.5,-7.5 11.3,-6c0.2,0.1 0.4,0.1 0.7,0.2c0,0 73.5,48.2 82.6,61.7l64.1,95.7l-40.3,23.5L378.2,346.9z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M280.8,196.6l7.6,4.6c2.6,1.6 5.9,1.1 7.9,-1.1l4.1,-4.5" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M347.5,251c3.8,-5.1 9.1,-8.9 15.1,-10.9" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + <path + android:pathData="M207.2,234.1c-8.8,-11 4.7,-31.5 19.8,-19c17.7,14.7 74.7,64.3 74.7,64.3l103.8,101.8c0,0 -36.4,53.8 -44.5,42.3C287.8,319.3 234.4,267.9 207.2,234.1z" + android:fillColor="#D2E3FC"/> + <path + android:pathData="M209.6,226.2l9.3,9.5c1,0.8 3,0.4 3.1,-1c0.2,-2.2 4.6,-6.2 7,-6.6c1.1,-0.3 1.7,-1.4 1.4,-2.4c-0.1,-0.2 -0.2,-0.4 -0.3,-0.6l-4.4,-3.9" + android:strokeLineJoin="bevel" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9" + android:strokeLineCap="square"/> + <path + android:pathData="M284.1,296.2c3.1,-5.5 7.8,-10 13.5,-12.8" + android:strokeWidth="1.75" + android:fillColor="#00000000" + android:strokeColor="#A0C2F9"/> + </group> + <path + android:pathData="M206,4c80.6,0 146,65.4 146,146c0,38.7 -15.4,75.9 -42.8,103.2c-57,57 -149.5,57 -206.5,0s-57,-149.5 0,-206.5C130.1,19.3 167.3,3.9 206,4M206,0C123.2,0 56,67.2 56,150s67.2,150 150,150s150,-67.2 150,-150S288.8,0 206,0z" + android:fillColor="#D2E3FC"/> +</vector> diff --git a/packages/SystemUI/res/layout/bubble_overflow_activity.xml b/packages/SystemUI/res/layout/bubble_overflow_activity.xml index b3c7cf74941a..306061911f8d 100644 --- a/packages/SystemUI/res/layout/bubble_overflow_activity.xml +++ b/packages/SystemUI/res/layout/bubble_overflow_activity.xml @@ -41,6 +41,13 @@ android:orientation="vertical" android:gravity="center"> + <ImageView + android:layout_width="@dimen/bubble_empty_overflow_image_height" + android:layout_height="@dimen/bubble_empty_overflow_image_height" + android:id="@+id/bubble_overflow_empty_state_image" + android:scaleType="fitCenter" + android:layout_gravity="center"/> + <TextView android:id="@+id/bubble_overflow_empty_title" android:text="@string/bubble_overflow_empty_title" @@ -59,6 +66,7 @@ android:text="@string/bubble_overflow_empty_subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingBottom="@dimen/bubble_empty_overflow_subtitle_padding" android:gravity="center"/> </LinearLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/people_strip.xml b/packages/SystemUI/res/layout/people_strip.xml index 7dcc46c3ca09..ec004296ff9d 100644 --- a/packages/SystemUI/res/layout/people_strip.xml +++ b/packages/SystemUI/res/layout/people_strip.xml @@ -43,6 +43,7 @@ android:forceHasOverlappingRendering="false"> <TextView + android:id="@+id/header_label" style="@style/TextAppearance.NotificationSectionHeaderButton" android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/packages/SystemUI/res/layout/qs_media_panel.xml b/packages/SystemUI/res/layout/qs_media_panel.xml index fe8557bfcce4..fc3bf941b27a 100644 --- a/packages/SystemUI/res/layout/qs_media_panel.xml +++ b/packages/SystemUI/res/layout/qs_media_panel.xml @@ -136,6 +136,47 @@ </LinearLayout> </LinearLayout> + <!-- Seek Bar --> + <SeekBar + android:id="@+id/media_progress_bar" + android:clickable="true" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:maxHeight="3dp" + android:paddingTop="24dp" + android:paddingBottom="24dp" + android:layout_marginBottom="-24dp" + android:layout_marginTop="-24dp" + android:splitTrack="false" + /> + + <FrameLayout + android:id="@+id/notification_media_progress_time" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + > + <!-- width is set to "match_parent" to avoid extra layout calls --> + <TextView + android:id="@+id/media_elapsed_time" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:fontFamily="@*android:string/config_bodyFontFamily" + android:textSize="14sp" + android:gravity="left" + /> + <TextView + android:id="@+id/media_total_time" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:fontFamily="@*android:string/config_bodyFontFamily" + android:layout_alignParentRight="true" + android:textSize="14sp" + android:gravity="right" + /> + </FrameLayout> + <!-- Controls --> <LinearLayout android:id="@+id/media_actions" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 2220b3610ac1..ca1af6765edf 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -154,8 +154,7 @@ <string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"نقش غير صحيح"</string> <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"كلمة مرور غير صحيحة"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"تم إجراء عدد كبير جدًا من المحاولات غير الصحيحة.\nأعد المحاولة خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية."</string> - <!-- no translation found for biometric_dialog_credential_attempts_before_wipe (6751859711975516999) --> - <skip /> + <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"يُرجى إعادة المحاولة. المحاولة <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> من <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g>"</string> <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"سيتم حذف بياناتك"</string> <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"عند إدخال نقش غير صحيح في المحاولة التالية، سيتم حذف بيانات هذا الجهاز."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"عند إدخال رقم تعريف شخصي غير صحيح في المحاولة التالية، سيتم حذف بيانات هذا الجهاز."</string> @@ -166,14 +165,10 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"عند إدخال نقش غير صحيح في المحاولة التالية، سيتم حذف ملفك الشخصي للعمل وبياناته."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"عند إدخال رقم تعريف شخصي غير صحيح في المحاولة التالية، سيتم حذف ملفك الشخصي للعمل وبياناته."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"عند إدخال كلمة مرور غير صحيحة في المحاولة التالية، سيتم حذف ملفك الشخصي للعمل وبياناته."</string> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_device (6585503524026243042) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_user (7015008539146949115) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_profile (5239378521440749682) --> - <skip /> - <!-- no translation found for biometric_dialog_now_wiping_dialog_dismiss (7189432882125106154) --> - <skip /> + <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"لقد استنفدت عدد المحاولات غير الصحيحة وسيتم حذف بيانات هذا الجهاز."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"لقد استنفدت عدد المحاولات غير الصحيحة وسيتم حذف هذا المستخدم."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"لقد استنفدت عدد المحاولات غير الصحيحة وسيتم حذف الملف الشخصي للعمل وبياناته."</string> + <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"إغلاق"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"المس زر استشعار بصمة الإصبع"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"رمز بصمة الإصبع"</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"جارٍ البحث عن وجهك…"</string> @@ -725,17 +720,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"يساعدك هذا الإشعار على التركيز بدون صوت أو اهتزاز."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"يلفت هذا الإشعار انتباهك باستخدام الصوت والاهتزاز."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"يلفِت هذا الإشعار انتباهك لهذا المحتوى باستخدام اختصار عائم."</string> - <!-- no translation found for notification_channel_summary_priority (7415770044553264622) --> - <skip /> - <!-- no translation found for notification_conversation_channel_all_bubble (5389290797101635297) --> - <skip /> - <!-- no translation found for notification_conversation_channel_settings (2409977688430606835) --> - <skip /> - <!-- no translation found for notification_priority_title (2079708866333537093) --> - <skip /> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"تظهر كفقاعة في أعلى قسم المحادثات"</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"تظهر كل المحادثات من تطبيق <xliff:g id="APP_NAME_0">%1$s</xliff:g> كفقاعات تلقائيًا. يمكنك إدارة هذا الإعداد في <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> + <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"الإعدادات"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ليس هناك فقاعات حديثة"</string> - <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) --> - <skip /> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ستظهر هنا أحدث الفقاعات والفقاعات التي تم إغلاقها."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"يتعذّر ضبط مجموعة الإشعارات هذه هنا."</string> <string name="notification_delegate_header" msgid="1264510071031479920">"إشعار مستند إلى خادم وكيل"</string> @@ -942,7 +932,7 @@ <string name="pip_pause" msgid="1139598607050555845">"إيقاف مؤقت"</string> <string name="pip_skip_to_next" msgid="3864212650579956062">"التخطي إلى التالي"</string> <string name="pip_skip_to_prev" msgid="3742589641443049237">"التخطي إلى السابق"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"تم إيقاف تفعيل الهاتف بسبب الحرارة"</string> + <string name="thermal_shutdown_title" msgid="2702966892682930264">"تم إيقاف الهاتف بسبب الحرارة"</string> <string name="thermal_shutdown_message" msgid="7432744214105003895">"يعمل هاتفك الآن بشكل طبيعي"</string> <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ارتفعت درجة حرارة هاتفك بشدة، لذا تم إيقاف تشغيله لخفض درجة حرارته. يعمل هاتفك الآن بشكل طبيعي.\n\nقد ترتفع بشدة درجة حرارة هاتفك إذا:\n • استخدمت تطبيقات كثيفة الاستخدام لموارد الجهاز (مثل الألعاب أو الفيديو أو تطبيقات التنقل)\n • نزَّلت أو حمَّلت ملفات كبيرة الحجم\n • استخدمت هاتفك وسط أجواء مرتفعة الحرارة"</string> <string name="high_temp_title" msgid="2218333576838496100">"تزداد درجة حرارة الهاتف"</string> @@ -1023,17 +1013,12 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"نقل إلى أسفل يمين الشاشة"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"نقل إلى أسفل اليسار"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"تجاهل"</string> - <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) --> - <skip /> - <!-- no translation found for bubbles_user_education_title (5547017089271445797) --> - <skip /> - <!-- no translation found for bubbles_user_education_description (1160281719576715211) --> - <skip /> - <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) --> - <skip /> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"عدم عرض المحادثة كفقاعة"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"الدردشة باستخدام الفقاعات"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"تظهر المحادثات الجديدة كرموز عائمة أو فقاعات. انقر عليها لفتحها كفقاعة أو اسحبها لتحريكها."</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"التحكّم في الفقاعات في أي وقت"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"انقر على \"إدارة\" لإيقاف الفقاعات من هذا التطبيق."</string> - <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"حسنًا"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"تم تحديث التنقل داخل النظام. لإجراء التغييرات، يُرجى الانتقال إلى \"الإعدادات\"."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string> @@ -1041,8 +1026,7 @@ <string name="magnification_window_title" msgid="4863914360847258333">"نافذة التكبير"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"عناصر التحكم في نافذة التكبير"</string> <string name="quick_controls_title" msgid="1686913115679255053">"عناصر التحكّم السريعة"</string> - <!-- no translation found for quick_controls_subtitle (1667408093326318053) --> - <skip /> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"إضافة عناصر تحكّم لأجهزتك المتصلة"</string> <string name="quick_controls_setup_title" msgid="9079435969373471268">"إعداد عناصر التحكّم السريعة"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"اضغط مع الاستمرار على زر التشغيل للوصول إلى عناصر التحكّم"</string> <string name="controls_providers_title" msgid="6879775889857085056">"اختيار تطبيق لإضافة عناصر التحكّم"</string> @@ -1055,45 +1039,28 @@ <item quantity="one">تمت إضافة عنصر تحكّم واحد (<xliff:g id="NUMBER_0">%s</xliff:g>).</item> </plurals> <string name="controls_favorite_default_title" msgid="967742178688938137">"عناصر التحكّم"</string> - <!-- no translation found for controls_favorite_subtitle (6604402232298443956) --> - <skip /> - <!-- no translation found for controls_favorite_rearrange (7364147066539766260) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"اختيار عناصر التحكّم التي تريد الوصول إليها من قائمة التشغيل"</string> + <string name="controls_favorite_rearrange" msgid="7364147066539766260">"اضغط مع الاستمرار على عنصر تحكّم واسحبه لتحريكه."</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"تعذّر تحميل قائمة كل عناصر التحكّم."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"غير ذلك"</string> - <!-- no translation found for controls_dialog_title (3475025327938684220) --> - <skip /> + <string name="controls_dialog_title" msgid="3475025327938684220">"إضافة إلى عناصر التحكم السريعة"</string> <string name="controls_dialog_ok" msgid="7011816381344485651">"إضافة إلى الإعدادات المفضّلة"</string> <string name="controls_dialog_message" msgid="6292099631702047540">"اقترح تطبيق <xliff:g id="APP">%s</xliff:g> إضافة عنصر التحكّم هذا إلى الإعدادات المفضّلة."</string> - <!-- no translation found for controls_dialog_confirmation (586517302736263447) --> - <skip /> + <string name="controls_dialog_confirmation" msgid="586517302736263447">"تم تعديل عناصر التحكّم."</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"يشتمل رقم التعريف الشخصي على أحرف أو رموز."</string> - <!-- no translation found for controls_pin_verify (3452778292918877662) --> - <skip /> - <!-- no translation found for controls_pin_verifying (3755045989392131746) --> - <skip /> + <string name="controls_pin_verify" msgid="3452778292918877662">"إثبات ملكية <xliff:g id="DEVICE">%s</xliff:g>"</string> + <string name="controls_pin_verifying" msgid="3755045989392131746">"جارٍ التحقّق…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"إدخال رقم التعريف الشخصي"</string> - <!-- no translation found for controls_pin_instructions_retry (1566667581012131046) --> - <skip /> - <!-- no translation found for controls_confirmation_confirming (2596071302617310665) --> - <skip /> - <!-- no translation found for controls_confirmation_message (7744104992609594859) --> - <skip /> - <!-- no translation found for controls_structure_tooltip (4355922222944447867) --> - <skip /> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"حاوِل إدخال رقم تعريف شخصي آخر"</string> + <string name="controls_confirmation_confirming" msgid="2596071302617310665">"جارٍ التأكيد…"</string> + <string name="controls_confirmation_message" msgid="7744104992609594859">"تأكيد التغيير لـ <xliff:g id="DEVICE">%s</xliff:g>"</string> + <string name="controls_structure_tooltip" msgid="4355922222944447867">"مرّر سريعًا لرؤية المزيد."</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"جارٍ تحميل الاقتراحات"</string> - <!-- no translation found for controls_media_close_session (9023534788828414585) --> - <skip /> - <!-- no translation found for controls_error_timeout (794197289772728958) --> - <skip /> - <!-- no translation found for controls_error_failed (960228639198558525) --> - <skip /> - <!-- no translation found for controls_in_progress (4421080500238215939) --> - <skip /> - <!-- no translation found for controls_added_tooltip (4842812921719153085) --> - <skip /> - <!-- no translation found for controls_menu_add (4447246119229920050) --> - <skip /> - <!-- no translation found for controls_menu_edit (890623986951347062) --> - <skip /> + <string name="controls_media_close_session" msgid="9023534788828414585">"إغلاق جلسة تشغيل الوسائط هذه"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"غير نشط، تحقّق من التطبيق."</string> + <string name="controls_error_failed" msgid="960228639198558525">"حدث خطأ، يُرجى إعادة المحاولة."</string> + <string name="controls_in_progress" msgid="4421080500238215939">"قيد التقدم"</string> + <string name="controls_added_tooltip" msgid="4842812921719153085">"اضغط مع الاستمرار على زر التشغيل لعرض عناصر التحكّم الجديدة."</string> + <string name="controls_menu_add" msgid="4447246119229920050">"إضافة عناصر تحكّم"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"تعديل عناصر التحكّم"</string> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 4e3b8993e91e..17dba435ffe1 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -155,26 +155,16 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"ভুল পাছৱৰ্ড"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"বহুসংখ্যক ভুল প্ৰয়াস।\n<xliff:g id="NUMBER">%d</xliff:g>ছেকেণ্ডত পুনৰ চেষ্টা কৰক।"</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"আকৌ চেষ্টা কৰক। <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> টাৰ প্ৰয়াসৰ ভিতৰত <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> টা প্ৰয়াস।"</string> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"আপোনাৰ ডেটা মচি পেলোৱা হ’ব"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল আৰ্হি দিলে, এই ডিভাইচটোৰ ডেটা মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পিন দিলে, এই ডিভাইচটোৰ ডেটা মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পাছৱৰ্ড দিলে, এই ডিভাইচটোৰ ডেটা মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল আৰ্হি দিলে, এই ব্যৱহাৰকাৰীক মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পিন দিলে, এই ব্যৱহাৰকাৰীক মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পাছৱৰ্ড দিলে, এই ব্যৱহাৰকাৰীক মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল আৰ্হি দিলে, আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইল আৰু ইয়াৰ ডেটা মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পিন দিলে, আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইল আৰু ইয়াৰ ডেটা মচি পেলোৱা হ’ব।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পাছৱৰ্ড দিলে, আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইল আৰু ইয়াৰ ডেটা মচি পেলোৱা হ’ব।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"বহুসংখ্যক ভুল প্ৰয়াস। এই ডিভাইচটোৰ ডেটা মচা হ\'ব।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"বহুসংখ্যক ভুল প্ৰয়াস। এই ব্যৱহাৰকাৰীক মচা হ\'ব।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"বহুসংখ্যক ভুল প্ৰয়াস। এই কৰ্মস্থানৰ প্ৰ\'ফাইলটো আৰু তাৰ লগত জড়িত ডেটা মচা হ\'ব।"</string> @@ -813,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"এছএমএছ"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"কেলেণ্ডাৰ"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"ভলিউম নিয়ন্ত্ৰণৰ সৈতে দেখুৱাওক"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"অসুবিধা নিদিব"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ভলিউম বুটামসমূহৰ শ্বৰ্টকাট"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index c67291efbfaf..047d00bfc962 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -155,26 +155,16 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"ভুল পাসওয়ার্ড"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"অনেকবার ভুল চেষ্টা করা হয়েছে। \n<xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।"</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"আবার চেষ্টা করুন। <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> বারের মধ্যে <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> বার চেষ্টা করা হয়েছে।"</string> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"আপনার ডেটা মুছে দেওয়া হবে"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"আপনি পরের বারও ভুল প্যাটার্ন আঁকলে এই ডিভাইসের ডেটা মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"আপনি পরের বারও ভুল পিন দিলে এই ডিভাইসের ডেটা মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"আপনি পরের বারও ভুল পাসওয়ার্ড দিলে এই ডিভাইসের ডেটা মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"আপনি পরের বারও ভুল প্যাটার্ন আঁকলে আপনাকে ব্যবহারকারীর তালিকা থেকে মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"আপনি পরের বারও ভুল পিন দিলে আপনাকে ব্যবহারকারীর তালিকা থেকে মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"আপনি পরের বারও ভুল পাসওয়ার্ড দিলে আপনাকে ব্যবহারকারীর তালিকা থেকে মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"আপনি পরের বারও ভুল প্যাটার্ন দিলে আপনার অফিস প্রোফাইল এবং তার ডেটা মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"আপনি পরের বারও ভুল পিন দিলে আপনার অফিস প্রোফাইল এবং তার ডেটা মুছে দেওয়া হবে।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"আপনি পরের বারও ভুল পাসওয়ার্ড দিলে আপনার অফিস প্রোফাইল এবং তার ডেটা মুছে দেওয়া হবে।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"বহুবার ভুল লেখা হয়েছে। এই ডিভাইসের ডেটা মুছে যাবে।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"বহুবার ভুল লেখা হয়েছে। এই ব্যবহারকারীর ডেটা মুছে যাবে।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"বহুবার ভুল লেখা হয়েছে। এই অফিসের প্রোফাইল ও সংশ্লিষ্ট ডেটা মুছে যাবে।"</string> @@ -813,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ক্যালেন্ডার"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"ভলিউম নিয়ন্ত্রণ সহ দেখান"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"বিরক্ত করবে না"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ভলিউম বোতামের শর্টকাট"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 16121c307f08..9e7bfb9a4ca7 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -168,7 +168,7 @@ <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"Hubo demasiados intentos incorrectos. Se borrarán los datos del dispositivo."</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"Hubo demasiados intentos incorrectos. Se borrará este usuario."</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Hubo demasiados intentos incorrectos. Se borrarán este perfil de trabajo y sus datos."</string> - <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ignorar"</string> + <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Descartar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ícono de huella digital"</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Autenticando tu rostro…"</string> @@ -508,7 +508,7 @@ <string name="manage_notifications_text" msgid="6885645344647733116">"Administrar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificaciones silenciosas"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificaciones que alertan"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificaciones de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo \"No interrumpir\""</string> @@ -708,12 +708,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"Te ayuda a concentrarte sin sonar ni vibrar."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"Capta tu atención con sonido o vibración."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Retiene tu atención con un acceso directo flotante a este contenido."</string> - <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece como una burbuja en la parte superior de la sección de conversación."</string> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece como una burbuja en la parte superior de la sección de la conversación."</string> <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Todas las conversaciones de <xliff:g id="APP_NAME_0">%1$s</xliff:g> se muestran como burbujas de forma predeterminada. Administra esta opción en <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> - <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las descartadas aparecerán aquí"</string> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las que se descartaron aparecerán aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"No se puede configurar aquí este grupo de notificaciones"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"Notificación almacenada en proxy"</string> @@ -993,9 +993,9 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Ubicar abajo a la izquierda"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Ubicar abajo a la derecha"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"Ignorar"</string> - <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"No colocar la conversación en burbuja"</string> - <string name="bubbles_user_education_title" msgid="5547017089271445797">"Chat mediante burbujas"</string> - <string name="bubbles_user_education_description" msgid="1160281719576715211">"Las conversaciones nuevas aparecen como íconos flotantes o burbujas. Pulsa para abrir la burbuja. Arrástrala para moverla."</string> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"No mostrar la conversación en burbujas"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"Chat con burbujas"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"Las conversaciones nuevas aparecen como elementos flotantes o burbujas. Presiona para abrir la burbuja. Arrástrala para moverla."</string> <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controla las burbujas en todo momento"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Presiona Administrar para desactivar las burbujas de esta app"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entendido"</string> @@ -1033,10 +1033,10 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Desliza el dedo para ver más elementos"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Cargando recomendaciones"</string> <string name="controls_media_close_session" msgid="9023534788828414585">"Cerrar esta sesión multimedia"</string> - <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo, verifica la app"</string> - <string name="controls_error_failed" msgid="960228639198558525">"Se produjo un error, vuelve a intentarlo."</string> + <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Verifica la app"</string> + <string name="controls_error_failed" msgid="960228639198558525">"Error. Vuelve a intentarlo."</string> <string name="controls_in_progress" msgid="4421080500238215939">"En curso"</string> - <string name="controls_added_tooltip" msgid="4842812921719153085">"Mantén pulsado el botón de encendido para ver los nuevos controles"</string> + <string name="controls_added_tooltip" msgid="4842812921719153085">"Mantén presionado el botón de encendido para ver los nuevos controles"</string> <string name="controls_menu_add" msgid="4447246119229920050">"Agregar controles"</string> <string name="controls_menu_edit" msgid="890623986951347062">"Editar controles"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 645d2bd88db1..d6700232cab9 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -88,7 +88,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La aplicación o tu organización no permiten realizar capturas de pantalla"</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Cerrar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="669177537416980449">"Abrir captura de pantalla"</string> - <string name="screenrecord_name" msgid="2596401223859996572">"Grabadora de pantalla"</string> + <string name="screenrecord_name" msgid="2596401223859996572">"Grabación de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación continua de una sesión de grabación de la pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Empezar a grabar?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Mientras grabas, el sistema Android puede capturar información sensible que se muestre o se reproduzca en tu dispositivo, como contraseñas, datos de pago, fotos, mensajes y audios."</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 1adf7c7e93a6..1688fc324a05 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -780,8 +780,8 @@ <string name="keyboard_key_media_previous" msgid="5637875709190955351">"Aurrekoa"</string> <string name="keyboard_key_media_rewind" msgid="3450387734224327577">"Atzeratu"</string> <string name="keyboard_key_media_fast_forward" msgid="3572444327046911822">"Aurreratu"</string> - <string name="keyboard_key_page_up" msgid="173914303254199845">"Orria gora"</string> - <string name="keyboard_key_page_down" msgid="9035902490071829731">"Orria behera"</string> + <string name="keyboard_key_page_up" msgid="173914303254199845">"Orrian gora"</string> + <string name="keyboard_key_page_down" msgid="9035902490071829731">"Orrian behera"</string> <string name="keyboard_key_forward_del" msgid="5325501825762733459">"Ezabatu"</string> <string name="keyboard_key_move_home" msgid="3496502501803911971">"Hasiera"</string> <string name="keyboard_key_move_end" msgid="99190401463834854">"Amaitu"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index c5f189744ecc..e719c538ca81 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -708,12 +708,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"به شما کمک میکند بدون صدا یا لرزش تمرکز کنید."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"با صدا یا لرزش توجه شما را جلب میکند."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"با میانبری شناور به این محتوا، توجهتان را جلب میکند."</string> - <string name="notification_channel_summary_priority" msgid="7415770044553264622">"در بالای بخش مکالمه نمایش داده میشود و بهصورت حباب نمایان میشود."</string> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"در بالای بخش مکالمه نمایش داده میشود و بهصورت ابزارک اعلان نمایان میشود."</string> <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"همه مکالمههای <xliff:g id="APP_NAME_0">%1$s</xliff:g>، بهطور پیشفرض در حباب نمایش داده میشوند. در <xliff:g id="APP_NAME_1">%2$s</xliff:g> مدیریت کنید."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"تنظیمات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"هیچ ابزارک اعلان جدیدی وجود ندارد"</string> - <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"حبابهای اخیر و حبابهای ردشده اینجا ظاهر خواهند شد"</string> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ابزارک اعلان اخیر و ابزارک اعلان ردشده اینجا ظاهر خواهند شد"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلانها قابل اصلاح نیستند."</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"نمیتوانید این گروه اعلانها را در اینجا پیکربندی کنید"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"اعلانهای دارای پراکسی"</string> @@ -994,10 +994,10 @@ <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"انتقال به پایین سمت چپ"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"رد کردن"</string> <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"مکالمه در حباب نشان داده نشود"</string> - <string name="bubbles_user_education_title" msgid="5547017089271445797">"گپ بااستفاده از حبابها"</string> - <string name="bubbles_user_education_description" msgid="1160281719576715211">"مکالمههای جدید بهصورت نمادهای شناور یا حباب نشان داده شوند. برای باز کردن حباب ضربه بزنید. برای جابهجایی، آن را بکشید."</string> - <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"کنترل حبابها در هرزمانی"</string> - <string name="bubbles_user_education_manage" msgid="1391639189507036423">"برای خاموش کردن «حبابها» از این برنامه، روی «مدیریت» ضربه بزنید"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"گپ بااستفاده از ابزارک اعلان"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"مکالمههای جدید بهصورت نمادهای شناور یا ابزارک اعلان نشان داده شوند. برای باز کردن ابزارک اعلان ضربه بزنید. برای جابهجایی، آن را بکشید."</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"کنترل ابزارک اعلان در هرزمانی"</string> + <string name="bubbles_user_education_manage" msgid="1391639189507036423">"برای خاموش کردن «ابزارک اعلان» از این برنامه، روی «مدیریت» ضربه بزنید"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"متوجهام"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"پیمایش سیستم بهروزرسانی شد. برای انجام تغییرات به «تنظیمات» بروید."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"برای بهروزرسانی پیمایش سیستم، به «تنظیمات» بروید"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 663ad0f3b790..bd86b0841a29 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -847,7 +847,7 @@ <string name="right_keycode" msgid="2480715509844798438">"Code de touche droit"</string> <string name="left_icon" msgid="5036278531966897006">"Icône à gauche"</string> <string name="right_icon" msgid="1103955040645237425">"Icône droite"</string> - <string name="drag_to_add_tiles" msgid="8933270127508303672">"Maint. doigt sur écran, puis glissez-le pour ajouter tuiles"</string> + <string name="drag_to_add_tiles" msgid="8933270127508303672">"Sélectionnez et faites glisser les tuiles pour les ajouter"</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Maint. doigt sur l\'écran, puis glissez-le pour réorg. tuiles"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Faites glisser les tuiles ici pour les supprimer"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Vous avez besoin d\'au moins <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> tuiles"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 26128d15530e..f781c3f542ea 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -154,36 +154,21 @@ <string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"ખોટી પૅટર્ન"</string> <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"ખોટો પાસવર્ડ"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"ઘણા વધારે ખોટા પ્રયત્નો. \n <xliff:g id="NUMBER">%d</xliff:g> સેકંડમાં ફરી પ્રયાસ કરો."</string> - <!-- no translation found for biometric_dialog_credential_attempts_before_wipe (6751859711975516999) --> - <skip /> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_device (6585503524026243042) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_user (7015008539146949115) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_profile (5239378521440749682) --> - <skip /> - <!-- no translation found for biometric_dialog_now_wiping_dialog_dismiss (7189432882125106154) --> - <skip /> + <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"ફરી પ્રયાસ કરો. <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> માંથી <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> પ્રયત્ન."</string> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"તમારો ડેટા ડિલીટ કરવામાં આવશે"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"જો તમે આગલા પ્રયત્નમાં ખોટી પૅટર્ન દાખલ કરશો, તો આ ડિવાઇસનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"જો તમે આગલા પ્રયત્નમાં ખોટો પિન દાખલ કરશો, તો આ ડિવાઇસનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"જો તમે આગલા પ્રયત્નમાં ખોટો પાસવર્ડ દાખલ કરશો, તો આ ડિવાઇસનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"જો તમે આગલા પ્રયત્નમાં ખોટી પૅટર્ન દાખલ કરશો, તો આ વપરાશકર્તાને ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"જો તમે આગલા પ્રયત્નમાં ખોટો પિન દાખલ કરશો, તો આ વપરાશકર્તાને ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"જો તમે આગલા પ્રયત્નમાં ખોટો પાસવર્ડ દાખલ કરશો, તો આ વપરાશકર્તાને ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"જો તમે આગલા પ્રયત્નમાં ખોટી પૅટર્ન દાખલ કરશો, તો તમારી કાર્યાલયની પ્રોફાઇલ અને તેનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"જો તમે આગલા પ્રયત્નમાં ખોટો પિન દાખલ કરશો, તો તમારી કાર્યાલયની પ્રોફાઇલ અને તેનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"જો તમે આગલા પ્રયત્નમાં ખોટો પાસવર્ડ દાખલ કરશો, તો તમારી કાર્યાલયની પ્રોફાઇલ અને તેનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"ઘણા બધા ખોટા પ્રયત્નો. આ ડિવાઇસનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"ઘણા બધા ખોટા પ્રયત્નો. આ વપરાશકર્તાને ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"ઘણા બધા ખોટા પ્રયત્નો. આ કાર્યાલયની પ્રોફાઇલ અને તેનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"છોડી દો"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ફિંગરપ્રિન્ટનું આઇકન"</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"તમારા માટે શોધી રહ્યાં છે..."</string> @@ -723,17 +708,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"તમને સાઉન્ડ અથવા વાઇબ્રેશન વિના ફોકસ કરવામાં સહાય કરે છે."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"સાઉન્ડ અથવા વાઇબ્રેશન વિના તમારું ધ્યાન દોરે છે."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ફ્લોટિંગ શૉર્ટકટથી આ કન્ટેન્ટ પર તમારું ધ્યાન દોરી રાખે છે."</string> - <!-- no translation found for notification_channel_summary_priority (7415770044553264622) --> - <skip /> - <!-- no translation found for notification_conversation_channel_all_bubble (5389290797101635297) --> - <skip /> - <!-- no translation found for notification_conversation_channel_settings (2409977688430606835) --> - <skip /> - <!-- no translation found for notification_priority_title (2079708866333537093) --> - <skip /> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"વાતચીત વિભાગની ટોચ પર બતાવે છે અને બબલ તરીકે દેખાય છે."</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>ની બધી વાતચીતને ડિફૉલ્ટ તરીકે બબલ કરવામાં આવે છે. <xliff:g id="APP_NAME_1">%2$s</xliff:g>માં મેનેજ કરો."</string> + <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"સેટિંગ"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"તાજેતરના કોઈ બબલ નથી"</string> - <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) --> - <skip /> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"પ્રૉક્સી નોટિફિકેશન"</string> @@ -823,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"સંગીત"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"કૅલેન્ડર"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"વૉલ્યૂમ નિયંત્રણ સાથે બતાવો"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ખલેલ પાડશો નહીં"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"વૉલ્યૂમ બટન્સ શૉર્ટકટ"</string> @@ -1013,77 +993,50 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"નીચે ડાબે ખસેડો"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"નીચે જમણે ખસેડો"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"છોડી દો"</string> - <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) --> - <skip /> - <!-- no translation found for bubbles_user_education_title (5547017089271445797) --> - <skip /> - <!-- no translation found for bubbles_user_education_description (1160281719576715211) --> - <skip /> - <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) --> - <skip /> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"વાતચીતને બબલ કરશો નહીં"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"બબલનો ઉપયોગ કરીને ચેટ કરો"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"નવી વાતચીત ફ્લોટિંગ આઇકન અથવા બબલ જેવી દેખાશે. બબલને ખોલવા માટે ટૅપ કરો. તેને ખસેડવા માટે ખેંચો."</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"બબલને કોઈપણ સમયે નિયંત્રિત કરો"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"આ ઍપમાંથી બબલને બંધ કરવા માટે મેનેજ કરો પર ટૅપ કરો"</string> - <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"સમજાઈ ગયું"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"સિસ્ટમ નૅવિગેશન અપડેટ કર્યું. ફેરફારો કરવા માટે, સેટિંગ પર જાઓ."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"વિસ્તૃતીકરણ ઓવરલે વિંડો"</string> <string name="magnification_window_title" msgid="4863914360847258333">"વિસ્તૃતીકરણ વિંડો"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"વિસ્તૃતીકરણ વિંડોના નિયંત્રણો"</string> - <!-- no translation found for quick_controls_title (1686913115679255053) --> - <skip /> - <!-- no translation found for quick_controls_subtitle (1667408093326318053) --> - <skip /> - <!-- no translation found for quick_controls_setup_title (9079435969373471268) --> - <skip /> - <!-- no translation found for quick_controls_setup_subtitle (1681506617879773824) --> - <skip /> - <!-- no translation found for controls_providers_title (6879775889857085056) --> - <skip /> + <string name="quick_controls_title" msgid="1686913115679255053">"ઝડપી નિયંત્રણો"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"તમારા કનેક્ટ કરેલા ડિવાઇસ માટે નિયંત્રણો ઉમેરો"</string> + <string name="quick_controls_setup_title" msgid="9079435969373471268">"ઝડપી નિયંત્રણો સેટઅપ કરો"</string> + <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"તમારા નિયંત્રણોને ઍક્સેસ કરવા માટે પાવર બટન દબાવી રાખો"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"નિયંત્રણો ઉમેરવા માટે ઍપ પસંદ કરો"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> નિયંત્રણ ઉમેર્યું.</item> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> નિયંત્રણો ઉમેર્યા.</item> </plurals> <string name="controls_favorite_default_title" msgid="967742178688938137">"નિયંત્રણો"</string> - <!-- no translation found for controls_favorite_subtitle (6604402232298443956) --> - <skip /> - <!-- no translation found for controls_favorite_rearrange (7364147066539766260) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"પાવર મેનૂમાંથી ઍક્સેસ કરવા માટેના નિયંત્રણોને પસંદ કરો"</string> + <string name="controls_favorite_rearrange" msgid="7364147066539766260">"નિયંત્રણને ખસેડવા માટે તેના પર આંગળી દબાવીને ખેંચો"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"બધા નિયંત્રણોની સૂચિ લોડ કરી શકાઈ નથી."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"અન્ય"</string> - <!-- no translation found for controls_dialog_title (3475025327938684220) --> - <skip /> + <string name="controls_dialog_title" msgid="3475025327938684220">"ઝડપી નિયંત્રણોમાં ઉમેરો"</string> <string name="controls_dialog_ok" msgid="7011816381344485651">"મનપસંદમાં ઉમેરો"</string> <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> એ આ નિયંત્રણને તમારા મનપસંદમાં ઉમેરવાનું સૂચવ્યું છે."</string> - <!-- no translation found for controls_dialog_confirmation (586517302736263447) --> - <skip /> + <string name="controls_dialog_confirmation" msgid="586517302736263447">"નિયંત્રણ અપડેટ કર્યા"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"પિનમાં અક્ષરો અથવા પ્રતીકોનો સમાવેશ થાય છે"</string> - <!-- no translation found for controls_pin_verify (3452778292918877662) --> - <skip /> - <!-- no translation found for controls_pin_verifying (3755045989392131746) --> - <skip /> + <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>ને ચકાસો"</string> + <string name="controls_pin_verifying" msgid="3755045989392131746">"ચકાસી રહ્યાં છીએ…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"પિન દાખલ કરો"</string> - <!-- no translation found for controls_pin_instructions_retry (1566667581012131046) --> - <skip /> - <!-- no translation found for controls_confirmation_confirming (2596071302617310665) --> - <skip /> - <!-- no translation found for controls_confirmation_message (7744104992609594859) --> - <skip /> - <!-- no translation found for controls_structure_tooltip (4355922222944447867) --> - <skip /> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"બીજા પિનને અજમાવી જુઓ"</string> + <string name="controls_confirmation_confirming" msgid="2596071302617310665">"કન્ફર્મ કરી રહ્યાં છે…"</string> + <string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> માટે ફેરફાર કન્ફર્મ કરો"</string> + <string name="controls_structure_tooltip" msgid="4355922222944447867">"વધુ જોવા માટે સ્વાઇપ કરો"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"સુઝાવ લોડ કરી રહ્યાં છીએ"</string> - <!-- no translation found for controls_media_close_session (9023534788828414585) --> - <skip /> - <!-- no translation found for controls_error_timeout (794197289772728958) --> - <skip /> - <!-- no translation found for controls_error_failed (960228639198558525) --> - <skip /> - <!-- no translation found for controls_in_progress (4421080500238215939) --> - <skip /> - <!-- no translation found for controls_added_tooltip (4842812921719153085) --> - <skip /> - <!-- no translation found for controls_menu_add (4447246119229920050) --> - <skip /> - <!-- no translation found for controls_menu_edit (890623986951347062) --> - <skip /> + <string name="controls_media_close_session" msgid="9023534788828414585">"આ મીડિયા સત્રને બંધ કરો"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"નિષ્ક્રિય, ઍપને ચેક કરો"</string> + <string name="controls_error_failed" msgid="960228639198558525">"ભૂલ, ફરીથી પ્રયાસ કરો"</string> + <string name="controls_in_progress" msgid="4421080500238215939">"પ્રક્રિયા ચાલુ છે"</string> + <string name="controls_added_tooltip" msgid="4842812921719153085">"નવા નિયંત્રણ જોવા માટે પાવર બટનને દબાવી રાખો"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"નિયંત્રણો ઉમેરો"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"નિયંત્રણોમાં ફેરફાર કરો"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index fcba17a7d2a7..107edb8ae716 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -159,9 +159,9 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"अगर आप फिर से गलत पैटर्न डालते हैं, तो इस डिवाइस का डेटा मिटा दिया जाएगा."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"अगर आप फिर से गलत पिन डालते हैं, तो इस डिवाइस का डेटा मिटा दिया जाएगा."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"अगर आप फिर से गलत पासवर्ड डालते हैं, तो इस डिवाइस का डेटा मिटा दिया जाएगा."</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"अगर आप फिर से गलत पैटर्न डालते हैं, तो इस उपयोगकर्ता का डेटा मिटा दिया जाएगा."</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"अगर आप फिर से गलत पिन डालते हैं, तो इस उपयोगकर्ता का डेटा मिटा दिया जाएगा."</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"अगर आप फिर से गलत पासवर्ड डालते हैं, तो इस उपयोगकर्ता का डेटा मिटा दिया जाएगा."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"अगर आप फिर से गलत पैटर्न डालते हैं, तो इस उपयोगकर्ता को हटा दिया जाएगा."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"अगर आप फिर से गलत पिन डालते हैं, तो इस उपयोगकर्ता को हटा दिया जाएगा."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"अगर आप फिर से गलत पासवर्ड डालते हैं, तो इस उपयोगकर्ता को हटा दिया जाएगा."</string> <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"अगर आप फिर से गलत पैटर्न डालते हैं, तो आपकी वर्क प्रोफ़ाइल और उसका डेटा मिटा दिया जाएगा."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"अगर आप फिर से गलत पिन डालते हैं, तो आपकी वर्क प्रोफ़ाइल और उसका डेटा मिटा दिया जाएगा."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"अगर आप फिर से गलत पासवर्ड डालते हैं, तो आपकी वर्क प्रोफ़ाइल और उसका डेटा मिटा दिया जाएगा."</string> @@ -1007,9 +1007,9 @@ <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification Overlay Window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"स्क्रीन को बड़ा करके दिखाने वाली विंडो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"स्क्रीन को बड़ा करके दिखाने वाली विंडो के नियंत्रण"</string> - <string name="quick_controls_title" msgid="1686913115679255053">"फटाफट कंट्रोल"</string> + <string name="quick_controls_title" msgid="1686913115679255053">"क्विक कंट्रोल"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"कनेक्ट किए गए डिवाइस के लिए कंट्रोल जोड़ें"</string> - <string name="quick_controls_setup_title" msgid="9079435969373471268">"फटाफट कंट्रोल सेट अप करें"</string> + <string name="quick_controls_setup_title" msgid="9079435969373471268">"क्विक कंट्रोल सेट अप करें"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"कंट्रोल ऐक्सेस करने के लिए पावर बटन को दबाकर रखें"</string> <string name="controls_providers_title" msgid="6879775889857085056">"कंट्रोल जोड़ने के लिए ऐप्लिकेशन चुनें"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index c3220e30580b..875bc4f39cc7 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -708,7 +708,7 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"Favorisce la tua concentrazione grazie all\'assenza di suono o vibrazione."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"Richiama la tua attenzione con suono o vibrazione."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantiene la tua attenzione con una scorciatoia mobile a questi contenuti."</string> - <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Visualizzata nella parte superiore della sezione della conversazione e viene mostrata come bolla."</string> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Appare in cima alla sezione delle conversazioni sotto forma di bolla."</string> <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Per impostazione predefinita, tutte le conversazioni di <xliff:g id="APP_NAME_0">%1$s</xliff:g> vengono mostrate come bolle. Gestisci in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Impostazioni"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 1ddecfbd730b..5c3dabb46757 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -154,36 +154,21 @@ <string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ"</string> <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"ಪಾಸ್ವರ್ಡ್ ತಪ್ಪಾಗಿದೆ"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"ಹಲವಾರು ತಪ್ಪು ಪ್ರಯತ್ನಗಳು.\nಮತ್ತೆ <xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿ."</string> - <!-- no translation found for biometric_dialog_credential_attempts_before_wipe (6751859711975516999) --> - <skip /> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_device (6585503524026243042) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_user (7015008539146949115) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_profile (5239378521440749682) --> - <skip /> - <!-- no translation found for biometric_dialog_now_wiping_dialog_dismiss (7189432882125106154) --> - <skip /> + <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ. <xliff:g id="ATTEMPTS_0">%1$d</xliff:g>/<xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> ಪ್ರಯತ್ನಗಳು."</string> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿದರೆ, ಈ ಸಾಧನದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಿನ್ ನಮೂದಿಸಿದರೆ, ಈ ಸಾಧನದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿದರೆ, ಈ ಸಾಧನದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿದರೆ, ಈ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಿನ್ ನಮೂದಿಸಿದರೆ, ಈ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿದರೆ, ಈ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿದರೆ, ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಿನ್ ನಮೂದಿಸಿದರೆ, ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದರ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿದರೆ, ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದರ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"ಹಲವಾರು ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಈ ಸಾಧನದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"ಹಲವಾರು ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಈ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಲಾಗುವುದು."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"ಹಲವಾರು ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಈ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದರ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ವಜಾಗೊಳಿಸಿ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string> @@ -723,17 +708,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"ಶಬ್ದ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಇರದಂತೆ ನಿಮಗೆ ಗಮನಹರಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"ಧ್ವನಿ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಮೂಲಕ ನಿಮ್ಮ ಗಮನವನ್ನು ಸೆಳೆಯುತ್ತದೆ."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ಈ ವಿಷಯಕ್ಕೆ ಲಿಂಕ್ ಮಾಡಿ ಕೊಂಡೊಯ್ಯುವ ಶಾರ್ಟ್ಕಟ್ ಕಡೆಗೆ ಗಮನ ಇರಿಸಿ."</string> - <!-- no translation found for notification_channel_summary_priority (7415770044553264622) --> - <skip /> - <!-- no translation found for notification_conversation_channel_all_bubble (5389290797101635297) --> - <skip /> - <!-- no translation found for notification_conversation_channel_settings (2409977688430606835) --> - <skip /> - <!-- no translation found for notification_priority_title (2079708866333537093) --> - <skip /> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಬಾಗದಲ್ಲಿ ಕಾಣಿಸುತ್ತದೆ ಮತ್ತು ಬಬಲ್ನಂತೆ ಗೋಚರಿಸುತ್ತದೆ."</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"ಡೀಫಾಲ್ಟ್ ಆಗಿ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ನ ಎಲ್ಲಾ ಸಂಭಾಷಣೆಗಳನ್ನು ಬಬಲ್ ಆಗಿ ತೋರಿಸಿ. <xliff:g id="APP_NAME_1">%2$s</xliff:g> ನಲ್ಲಿ ನಿರ್ವಹಿಸಿ."</string> + <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಗಳಿಲ್ಲ"</string> - <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) --> - <skip /> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಸ್ ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"ಪ್ರಾಕ್ಸಿ ಮಾಡಿದ ಅಧಿಸೂಚನೆಗಳು"</string> @@ -823,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ಎಸ್ಎಂಎಸ್"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ಸಂಗೀತ"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ಕ್ಯಾಲೆಂಡರ್"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳ ಜೊತೆಗೆ ತೋರಿಸು"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ಅಡಚಣೆ ಮಾಡಬೇಡ"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ವಾಲ್ಯೂಮ್ ಬಟನ್ಗಳ ಶಾರ್ಟ್ಕಟ್"</string> @@ -1013,77 +993,50 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ಸ್ಕ್ರೀನ್ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"ವಜಾಗೊಳಿಸಿ"</string> - <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) --> - <skip /> - <!-- no translation found for bubbles_user_education_title (5547017089271445797) --> - <skip /> - <!-- no translation found for bubbles_user_education_description (1160281719576715211) --> - <skip /> - <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) --> - <skip /> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"ಸಂಭಾಷಣೆಯನ್ನು ಬಬಲ್ ಮಾಡಬೇಡಿ"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"ಬಬಲ್ಸ್ ಬಳಸಿ ಚಾಟ್ ಮಾಡಿ"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"ಹೊಸ ಸಂಭಾಷಣೆಗಳು ತೇಲುವ ಐಕಾನ್ಗಳು ಅಥವಾ ಬಬಲ್ಸ್ ಆಗಿ ಗೋಚರಿಸುತ್ತವೆ. ಬಬಲ್ ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಅದನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಲು ಎಳೆಯಿರಿ."</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬಬಲ್ಸ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಿ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ಈ ಆ್ಯಪ್ನಿಂದ ಬಬಲ್ಗಳನ್ನು ಆಫ್ ಮಾಡಲು ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> - <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ಅರ್ಥವಾಯಿತು"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್ಬೈ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ವರ್ಧನೆಯ ಓವರ್ಲೇ ವಿಂಡೋ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ವರ್ಧನೆಯ ವಿಂಡೋ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ವರ್ಧನೆಯ ವಿಂಡೋ ನಿಯಂತ್ರಣಗಳು"</string> - <!-- no translation found for quick_controls_title (1686913115679255053) --> - <skip /> - <!-- no translation found for quick_controls_subtitle (1667408093326318053) --> - <skip /> - <!-- no translation found for quick_controls_setup_title (9079435969373471268) --> - <skip /> - <!-- no translation found for quick_controls_setup_subtitle (1681506617879773824) --> - <skip /> - <!-- no translation found for controls_providers_title (6879775889857085056) --> - <skip /> + <string name="quick_controls_title" msgid="1686913115679255053">"ತ್ವರಿತ ನಿಯಂತ್ರಣಗಳು"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"ನಿಮ್ಮ ಸಂಪರ್ಕಿತ ಸಾಧನಗಳಿಗೆ ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಿ"</string> + <string name="quick_controls_setup_title" msgid="9079435969373471268">"ತ್ವರಿತ ನಿಯಂತ್ರಣಗಳನ್ನು ಹೊಂದಿಸಿ"</string> + <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"ನಿಮ್ಮ ನಿಯಂತ್ರಣಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಪವರ್ ಬಟನ್ ಅನ್ನು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಲು ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ.</item> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ.</item> </plurals> <string name="controls_favorite_default_title" msgid="967742178688938137">"ನಿಯಂತ್ರಣಗಳು"</string> - <!-- no translation found for controls_favorite_subtitle (6604402232298443956) --> - <skip /> - <!-- no translation found for controls_favorite_rearrange (7364147066539766260) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ಪವರ್ ಮೆನುವಿನಿಂದ ಪ್ರವೇಶಿಸಲು ನಿಯಂತ್ರಣಗಳನ್ನು ಆರಿಸಿ"</string> + <string name="controls_favorite_rearrange" msgid="7364147066539766260">"ಅದನ್ನು ಸರಿಸಲು ನಿಯಂತ್ರಣವೊಂದನ್ನು ಹಿಡಿದುಕೊಂಡು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡಲು ಆಗಲಿಲ್ಲ."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ಇತರ"</string> - <!-- no translation found for controls_dialog_title (3475025327938684220) --> - <skip /> + <string name="controls_dialog_title" msgid="3475025327938684220">"ತ್ವರಿತ ನಿಯಂತ್ರಣಗಳಿಗೆ ಸೇರಿಸಿ"</string> <string name="controls_dialog_ok" msgid="7011816381344485651">"ಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸಿ"</string> <string name="controls_dialog_message" msgid="6292099631702047540">"ಈ ನಿಯಂತ್ರಣವನ್ನು ನಿಮ್ಮ ಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸಲು <xliff:g id="APP">%s</xliff:g> ಸೂಚಿಸಿದೆ."</string> - <!-- no translation found for controls_dialog_confirmation (586517302736263447) --> - <skip /> + <string name="controls_dialog_confirmation" msgid="586517302736263447">"ನಿಯಂತ್ರಣಗಳನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ಪಿನ್ ಅಕ್ಷರಗಳು ಅಥವಾ ಸಂಕೇತಗಳನ್ನು ಒಳಗೊಂಡಿದೆ"</string> - <!-- no translation found for controls_pin_verify (3452778292918877662) --> - <skip /> - <!-- no translation found for controls_pin_verifying (3755045989392131746) --> - <skip /> + <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ಅನ್ನು ಪರಿಶೀಲಿಸಿ"</string> + <string name="controls_pin_verifying" msgid="3755045989392131746">"ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"ಪಿನ್ ನಮೂದಿಸಿ"</string> - <!-- no translation found for controls_pin_instructions_retry (1566667581012131046) --> - <skip /> - <!-- no translation found for controls_confirmation_confirming (2596071302617310665) --> - <skip /> - <!-- no translation found for controls_confirmation_message (7744104992609594859) --> - <skip /> - <!-- no translation found for controls_structure_tooltip (4355922222944447867) --> - <skip /> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ಮತ್ತೊಂದು ಪಿನ್ ಅನ್ನು ಪ್ರಯತ್ನಿಸಿ"</string> + <string name="controls_confirmation_confirming" msgid="2596071302617310665">"ಖಚಿತಪಡಿಸಲಾಗುತ್ತಿದೆ…"</string> + <string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> ಸಾಧನಕ್ಕಾಗಿ ಬದಲಾವಣೆಯನ್ನು ದೃಢೀಕರಿಸಿ"</string> + <string name="controls_structure_tooltip" msgid="4355922222944447867">"ಇನ್ನಷ್ಟು ನೋಡಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"ಶಿಫಾರಸುಗಳು ಲೋಡ್ ಆಗುತ್ತಿವೆ"</string> - <!-- no translation found for controls_media_close_session (9023534788828414585) --> - <skip /> - <!-- no translation found for controls_error_timeout (794197289772728958) --> - <skip /> - <!-- no translation found for controls_error_failed (960228639198558525) --> - <skip /> - <!-- no translation found for controls_in_progress (4421080500238215939) --> - <skip /> - <!-- no translation found for controls_added_tooltip (4842812921719153085) --> - <skip /> - <!-- no translation found for controls_menu_add (4447246119229920050) --> - <skip /> - <!-- no translation found for controls_menu_edit (890623986951347062) --> - <skip /> + <string name="controls_media_close_session" msgid="9023534788828414585">"ಈ ಮಾಧ್ಯಮ ಸೆಶನ್ ಅನ್ನು ಮುಚ್ಚಿರಿ"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"ನಿಷ್ಕ್ರಿಯ, ಆ್ಯಪ್ ಪರಿಶೀಲಿಸಿ"</string> + <string name="controls_error_failed" msgid="960228639198558525">"ದೋಷ, ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string> + <string name="controls_in_progress" msgid="4421080500238215939">"ಪ್ರಗತಿಯಲ್ಲಿದೆ"</string> + <string name="controls_added_tooltip" msgid="4842812921719153085">"ಹೊಸ ನಿಯಂತ್ರಣಗಳನ್ನು ನೋಡಲು ಪವರ್ ಬಟನ್ ಹಿಡಿದುಕೊಳ್ಳಿ"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಿ"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"ನಿಯಂತ್ರಣಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 03cb32484e7e..07c2eddb2bbd 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -155,26 +155,16 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"പാസ്വേഡ് തെറ്റാണ്"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"നിരവധി തെറ്റായ ശ്രമങ്ങൾ. \n<xliff:g id="NUMBER">%d</xliff:g> സെക്കൻഡിൽ വീണ്ടും ശ്രമിക്കുക."</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"വീണ്ടും ശ്രമിക്കുക. <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> ശ്രമങ്ങളിൽ <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> ശ്രമം."</string> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"നിങ്ങളുടെ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാറ്റേൺ നൽകിയാൽ, ഈ ഉപകരണത്തിലെ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പിൻ നൽകിയാൽ, ഈ ഉപകരണത്തിലെ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാസ്വേഡ് നൽകിയാൽ, ഈ ഉപകരണത്തിലെ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാറ്റേൺ നൽകിയാൽ, ഈ ഉപയോക്താവ് ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പിൻ നൽകിയാൽ, ഈ ഉപയോക്താവ് ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാസ്വേഡ് നൽകിയാൽ, ഈ ഉപയോക്താവ് ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാറ്റേൺ നൽകിയാൽ, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും അതിന്റെ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പിൻ നൽകിയാൽ, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും അതിന്റെ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാസ്വേഡ് നൽകിയാൽ, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും അതിന്റെ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"ഒരുപാട് തെറ്റായ ശ്രമങ്ങൾ. ഈ ഉപകരണത്തിലെ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും."</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"ഒരുപാട് തെറ്റായ ശ്രമങ്ങൾ. ഈ ഉപയോക്താവ് ഇല്ലാതാക്കപ്പെടും."</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"ഒരുപാട് തെറ്റായ ശ്രമങ്ങൾ. ഈ ഔദ്യോഗിക പ്രൊഫൈലും അതിന്റെ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string> @@ -813,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS:"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"സംഗീതം"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"കലണ്ടർ"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"വോളിയം നിയന്ത്രണങ്ങളോടൊപ്പം കാണിക്കുക"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ശല്യപ്പെടുത്തരുത്"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"വോളിയം ബട്ടൺ കുറുക്കുവഴി"</string> @@ -1015,15 +1005,11 @@ <string name="magnification_overlay_title" msgid="6584179429612427958">"മാഗ്നിഫിക്കേഷൻ ഓവർലേ വിൻഡോ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ നിയന്ത്രണങ്ങൾ"</string> - <!-- no translation found for quick_controls_title (1686913115679255053) --> - <skip /> + <string name="quick_controls_title" msgid="1686913115679255053">"ദ്രുത നിയന്ത്രണങ്ങൾ"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"നിങ്ങളുടെ കണക്റ്റ് ചെയ്ത ഉപകരണങ്ങൾക്ക് നിയന്ത്രണങ്ങൾ ചേർക്കുക"</string> - <!-- no translation found for quick_controls_setup_title (9079435969373471268) --> - <skip /> - <!-- no translation found for quick_controls_setup_subtitle (1681506617879773824) --> - <skip /> - <!-- no translation found for controls_providers_title (6879775889857085056) --> - <skip /> + <string name="quick_controls_setup_title" msgid="9079435969373471268">"ദ്രുത നിയന്ത്രണങ്ങൾ സജ്ജീകരിക്കുക"</string> + <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"നിങ്ങളുടെ നിയന്ത്രണങ്ങൾ ആക്സസ് ചെയ്യാൻ പവർ ബട്ടണിൽ പിടിക്കുക"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"നിയന്ത്രണങ്ങൾ ചേർക്കാൻ ആപ്പ് തിരഞ്ഞെടുക്കുക"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> നിയന്ത്രണങ്ങൾ ചേർത്തു.</item> <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> നിയന്ത്രണം ചേർത്തു.</item> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 4b6cf07edb6d..c2ebfcd3d779 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -155,26 +155,16 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"चुकीचा पासवर्ड"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"बरेच चुकीचे प्रयत्न. \n <xliff:g id="NUMBER">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"पुन्हा प्रयत्न करा. <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> पैकी <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> प्रयत्न."</string> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"तुमचा डेटा हटवला जाईल"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"तुम्ही पुढील प्रयत्नात चुकीचा पॅटर्न एंटर केल्यास, या डिव्हाइसचा डेटा हटवला जाईल."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"तुम्ही पुढील प्रयत्नात चुकीचा पिन एंटर केल्यास, या डिव्हाइसचा डेटा हटवला जाईल."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"तुम्ही पुढील प्रयत्नात चुकीचा पासवर्ड एंटर केल्यास, या डिव्हाइसचा डेटा हटवला जाईल."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"तुम्ही पुढील प्रयत्नात चुकीचा पॅटर्न एंटर केल्यास, हा वापरकर्ता हटवला जाईल."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"तुम्ही पुढील प्रयत्नात चुकीचा पिन एंटर केल्यास, हा वापरकर्ता हटवला जाईल."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"तुम्ही पुढील प्रयत्नात चुकीचा पासवर्ड एंटर केल्यास, हा वापरकर्ता हटवला जाईल."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"तुम्ही पुढील प्रयत्नात चुकीचा पॅटर्न एंटर केल्यास, तुमची कार्य प्रोफाइल आणि तिचा डेटा हटवला जाईल."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"तुम्ही पुढील प्रयत्नात चुकीचा पिन एंटर केल्यास, तुमची कार्य प्रोफाइल आणि तिचा डेटा हटवला जाईल."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"तुम्ही पुढील प्रयत्नात चुकीचा पासवर्ड एंटर केल्यास, तुमची कार्य प्रोफाइल आणि तिचा डेटा हटवला जाईल."</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"बरेच चुकीचे प्रयत्न. या डिव्हाइसचा डेटा हटवला जाईल."</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"बरेच चुकीचे प्रयत्न. हा वापरकर्ता हटवला जाईल."</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"बरेच चुकीचे प्रयत्न. ही कार्य प्रोफाइल आणि त्यामधील डेटा हटवला जाईल."</string> @@ -813,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"संगीत"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"कॅलेंडर"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"आवाज नियंत्रणांसह दर्शवा"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"व्यत्यय आणू नका"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"आवाजाच्या बटणांचा शार्टकट"</string> @@ -1015,15 +1005,11 @@ <string name="magnification_overlay_title" msgid="6584179429612427958">"मॅग्निफिकेशन ओव्हरले विंडो"</string> <string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"मॅग्निफिकेशन विंडो नियंत्रणे"</string> - <!-- no translation found for quick_controls_title (1686913115679255053) --> - <skip /> + <string name="quick_controls_title" msgid="1686913115679255053">"क्विक नियंत्रणे"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"तुमच्या कनेक्ट केलेल्या डिव्हाइससाठी नियंत्रणे जोडा"</string> - <!-- no translation found for quick_controls_setup_title (9079435969373471268) --> - <skip /> - <!-- no translation found for quick_controls_setup_subtitle (1681506617879773824) --> - <skip /> - <!-- no translation found for controls_providers_title (6879775889857085056) --> - <skip /> + <string name="quick_controls_setup_title" msgid="9079435969373471268">"क्विक नियंत्रणे सेट करा"</string> + <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"तुमची नियंत्रणे अॅक्सेस करण्यासाठी पॉवर बटण दाबून ठेवा"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"नियंत्रणे जोडण्यासाठी ॲप निवडा"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> नियंत्रणे जोडली.</item> <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> नियंत्रण जोडले.</item> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 46c93a79b743..e9f2c07ba18a 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -155,29 +155,19 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"पासवर्ड मिलेन"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"अत्यन्तै धेरै पटक गलत प्रयास गरिए। \n <xliff:g id="NUMBER">%d</xliff:g>सेकेन्ड पछि पुनः प्रयास गर्नुहोस्।"</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"फेरि प्रयास गर्नुहोस्। <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> मध्ये <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> प्रयास।"</string> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"तपाईंको डेटा मेटाइने छ"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यो यन्त्रको डेटा मेटाइने छ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने यो यन्त्रको डेटा मेटाइने छ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने यो यन्त्रको डेटा मेटाइने छ।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यी प्रयोगकर्तालाई मेटाइने छ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने यी प्रयोगकर्तालाई मेटाइने छ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने यी प्रयोगकर्तालाई मेटाइने छ।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यो कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने तपाईंको कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने तपाईंको कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"अनलक गर्ने अत्याधिक गलत प्रयासहरू भए। यो यन्त्रको डेटा मेटाइने छ।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"अनलक गर्ने अत्याधिक गलत प्रयासहरू भए। यो प्रयोगकर्तालाई हटाइने छ।"</string> - <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"अनलक गर्ने अत्यधिक गलत प्रयासहरू भए। यो कार्य प्रोफाइल र यसको डेटा मेटाइने छ।"</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"अनलक गर्ने अत्यधिक गलत प्रयासहरू भए। यो कार्यलयको प्रोफाइल र यसको डेटा मेटाइने छ।"</string> <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"हटाउनुहोस्"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"फिंगरप्रिन्ट जनाउने आइकन"</string> @@ -718,8 +708,8 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"तपाईंलाई आवाज वा कम्पनविना ध्यान केन्द्रित गर्न मद्दत गर्छ।"</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"ध्वनि वा कम्पनमार्फत तपाईंको ध्यान आकर्षित गर्छ।"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।"</string> - <string name="notification_channel_summary_priority" msgid="7415770044553264622">"वार्तालापको खण्डको सिरानमा बबलका रूपमा देखा पर्छ।"</string> - <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> मार्फत भएका सबै वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखिन्छन्। <xliff:g id="APP_NAME_1">%2$s</xliff:g> मा व्यवस्थापन गर्नुहोस्।"</string> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"वार्तालाप खण्डको सिरानमा बबलका रूपमा देखा पर्छ।"</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> मार्फत भएका सबै वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखिन्छन्। <xliff:g id="APP_NAME_1">%2$s</xliff:g> मा गई व्यवस्थापन गर्नुहोस्।"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हालसालै खारेज गरिएको कुनै पनि बबल छैन"</string> @@ -1015,22 +1005,18 @@ <string name="magnification_overlay_title" msgid="6584179429612427958">"म्याग्निफिकेसन ओभरले विन्डो"</string> <string name="magnification_window_title" msgid="4863914360847258333">"म्याग्निफिकेसन विन्डो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"म्याग्निफिकेसन विन्डोका नियन्त्रणहरू"</string> - <!-- no translation found for quick_controls_title (1686913115679255053) --> - <skip /> + <string name="quick_controls_title" msgid="1686913115679255053">"द्रुत नियन्त्रणहरू"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"आफ्ना जोडिएका यन्त्रहरूका लागि नियन्त्रण सुविधाहरू थप्नुहोस्"</string> - <!-- no translation found for quick_controls_setup_title (9079435969373471268) --> - <skip /> - <!-- no translation found for quick_controls_setup_subtitle (1681506617879773824) --> - <skip /> - <!-- no translation found for controls_providers_title (6879775889857085056) --> - <skip /> + <string name="quick_controls_setup_title" msgid="9079435969373471268">"द्रुत नियन्त्रणहरू सेटअप गर्नुहोस्"</string> + <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"आफ्ना नियन्त्रणहरूमाथि पहुँच राख्न पावर बटन थिचिराख्नुहोस्"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"नियन्त्रणहरू थप्न अनुप्रयोग छनौट गर्नुहोस्"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> वटा नियन्त्र थपियो।</item> <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> नियन्त्र थपियो</item> </plurals> <string name="controls_favorite_default_title" msgid="967742178688938137">"नियन्त्रणहरू"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पावर मेनुबाट प्रयोग गर्न मिल्ने नियन्त्रण सुविधाहरू छान्नुहोस्"</string> - <string name="controls_favorite_rearrange" msgid="7364147066539766260">"कुनै नियन्त्रण सुविधा सार्न त्यसलाई थिचिराखेर ड्र्याग गर्नुहोस्"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पावर मेनुबाट प्रयोग गर्न चाहेका नियन्त्रण सुविधाहरू छान्नुहोस्"</string> + <string name="controls_favorite_rearrange" msgid="7364147066539766260">"कुनै नियन्त्रण सुविधा सार्न त्यसलाई थिचेर ड्र्याग गर्नुहोस्"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"सबै नियन्त्रणहरूको सूची लोड गर्न सकिएन।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string> <string name="controls_dialog_title" msgid="3475025327938684220">"द्रुत नियन्त्रणहरूमा थप्नुहोस्"</string> @@ -1047,7 +1033,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"थप हेर्न स्वाइप गर्नुहोस्"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"सिफारिसहरू लोड गर्दै"</string> <string name="controls_media_close_session" msgid="9023534788828414585">"यो मिडिया सत्र बन्द गर्नुहोस्"</string> - <string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय छ, अनुप्रयोगको जाँच गर्नु…"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय छ, अनुप्रयोग जाँच गर्नु…"</string> <string name="controls_error_failed" msgid="960228639198558525">"त्रुटि भयो, फेरि प्रयास गर्नु…"</string> <string name="controls_in_progress" msgid="4421080500238215939">"कार्य हुँदै छ"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"नयाँ नियन्त्रण सुविधाहरू हेर्न पावर बटन थिचिराख्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 4adc1ffba0de..d4796d69dd9e 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -154,36 +154,21 @@ <string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"ଭୁଲ ପାଟର୍ନ"</string> <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"ଭୁଲ ପାସ୍ୱାର୍ଡ"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"ଅନେକ ଥର ଭୁଲ ଚେଷ୍ଟା। \n <xliff:g id="NUMBER">%d</xliff:g>ସେକେଣ୍ଡରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> - <!-- no translation found for biometric_dialog_credential_attempts_before_wipe (6751859711975516999) --> - <skip /> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_device (6585503524026243042) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_user (7015008539146949115) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_profile (5239378521440749682) --> - <skip /> - <!-- no translation found for biometric_dialog_now_wiping_dialog_dismiss (7189432882125106154) --> - <skip /> + <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ। <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g>ଟିରୁ <xliff:g id="ATTEMPTS_0">%1$d</xliff:g>ଟି ପ୍ରଚେଷ୍ଟା।"</string> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"ଆପଣଙ୍କ ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାଟର୍ନ ପ୍ରବେଶ କଲେ, ଏହି ଡିଭାଇସର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ PIN ଲେଖିଲେ, ଏହି ଡିଭାଇସର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାସୱାର୍ଡ ଲେଖିଲେ, ଏହି ଡିଭାଇସର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାଟର୍ନ ପ୍ରବେଶ କଲେ, ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ PIN ଲେଖିଲେ, ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାସୱାର୍ଡ ଲେଖିଲେ, ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାଟର୍ନ ପ୍ରବେଶ କଲେ, ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଏବଂ ଏହାର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ PIN ଲେଖିଲେ, ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଏବଂ ଏହାର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାସୱାର୍ଡ ଲେଖିଲେ, ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଓ ଏହାର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"ଅନେକଗୁଡ଼ିଏ ଭୁଲ ପ୍ରଚେଷ୍ଟା। ଏହି ଡିଭାଇସର ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string> + <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"ଅନେକଗୁଡ଼ିଏ ଭୁଲ ପ୍ରଚେଷ୍ଟା। ଏହି ଉପଯୋଗକର୍ତ୍ତା ଡିଲିଟ୍ ହୋଇଯିବ।"</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"ଅନେକଗୁଡ଼ିଏ ଭୁଲ ପ୍ରଚେଷ୍ଟା। ଏହି ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଏବଂ ଏହାର ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string> + <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ଖାରଜ କରନ୍ତୁ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ଟିପଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ଟିପଚିହ୍ନ ଆଇକନ୍"</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string> @@ -723,17 +708,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"ବିନା ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ରେ ଆପଣଙ୍କୁ ଫୋକସ୍ କରିବାରେ ସାହାଯ୍ୟ କରେ।"</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ ମାଧ୍ୟମରେ ଆପଣଙ୍କର ଧ୍ୟାନ ଆକର୍ଷିତ କରିଥାଏ।"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ଏହି ବିଷୟବସ୍ତୁ ପାଇଁ ଏକ ଭାସମାନ ସର୍ଟକଟ୍ ସହ ଆପଣଙ୍କର ଧ୍ୟାନ ଦିଅନ୍ତୁ।"</string> - <!-- no translation found for notification_channel_summary_priority (7415770044553264622) --> - <skip /> - <!-- no translation found for notification_conversation_channel_all_bubble (5389290797101635297) --> - <skip /> - <!-- no translation found for notification_conversation_channel_settings (2409977688430606835) --> - <skip /> - <!-- no translation found for notification_priority_title (2079708866333537093) --> - <skip /> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ଏହା ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ।"</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>ରୁ ସମସ୍ତ ବାର୍ତ୍ତାଳାପ ଡିଫଲ୍ଟ ରୂପେ ବବଲରେ ଦେଖାଯାଏ। <xliff:g id="APP_NAME_1">%2$s</xliff:g>ରେ ପରିଚାଳନା କରନ୍ତୁ।"</string> + <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string> - <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) --> - <skip /> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ବର୍ତ୍ତମାନର ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବବଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"ବିଜ୍ଞପ୍ତି ପ୍ରକ୍ସୀ ହୋଇଛି"</string> @@ -1013,17 +993,12 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ତଳ ବାମକୁ ନିଅନ୍ତୁ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"ଖାରଜ କରନ୍ତୁ"</string> - <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) --> - <skip /> - <!-- no translation found for bubbles_user_education_title (5547017089271445797) --> - <skip /> - <!-- no translation found for bubbles_user_education_description (1160281719576715211) --> - <skip /> - <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) --> - <skip /> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"ବାର୍ତ୍ତାଳାପକୁ ବବଲ୍ କରନ୍ତୁ ନାହିଁ"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"ବବଲଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି ଚାଟ୍ କରନ୍ତୁ"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"ନୂଆ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଫ୍ଲୋଟିଂ ଆଇକନ୍ କିମ୍ବା ବବଲ୍ ଭାବେ ଦେଖାଯିବ। ବବଲ୍ ଖୋଲିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଏହାକୁ ମୁଭ୍ କରିବାକୁ ଟାଣନ୍ତୁ।"</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ଯେ କୌଣସି ସମୟରେ ବବଲଗୁଡ଼ିକ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ଏହି ଆପର ବବଲଗୁଡ଼ିକ ବନ୍ଦ କରିବା ପାଇଁ \'ପରିଚାଳନା କରନ୍ତୁ\' ବଟନରେ ଟାପ୍ କରନ୍ତୁ"</string> - <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ବୁଝିଗଲି"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string> @@ -1031,8 +1006,7 @@ <string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string> <string name="quick_controls_title" msgid="1686913115679255053">"ଦ୍ରୁତ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string> - <!-- no translation found for quick_controls_subtitle (1667408093326318053) --> - <skip /> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"ଆପଣଙ୍କ ସଂଯୁକ୍ତ ଥିବା ଡିଭାଇସଗୁଡ଼ିକ ପାଇଁ ନିୟନ୍ତ୍ରଣ ଯୋଗ କରନ୍ତୁ"</string> <string name="quick_controls_setup_title" msgid="9079435969373471268">"ଦ୍ରୁତ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"ଆପଣଙ୍କ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବାକୁ ପାୱାର ବଟନକୁ ଧରି ରଖନ୍ତୁ"</string> <string name="controls_providers_title" msgid="6879775889857085056">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ଯୋଗ କରିବାକୁ ଆପ୍ ବାଛନ୍ତୁ"</string> @@ -1041,45 +1015,28 @@ <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g>ଟି ନିୟନ୍ତ୍ରଣ ଯୋଗ କରାଯାଇଛି।</item> </plurals> <string name="controls_favorite_default_title" msgid="967742178688938137">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string> - <!-- no translation found for controls_favorite_subtitle (6604402232298443956) --> - <skip /> - <!-- no translation found for controls_favorite_rearrange (7364147066539766260) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ପାୱାର ମେନୁରୁ ଆକ୍ସେସ୍ କରିବାକୁ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ବାଛନ୍ତୁ"</string> + <string name="controls_favorite_rearrange" msgid="7364147066539766260">"ଏକ ନିୟନ୍ତ୍ରଣକୁ ମୁଭ୍ କରିବାକୁ ଏହାକୁ ଧରି ଟାଣନ୍ତୁ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"ସବୁ ନିୟନ୍ତ୍ରଣର ତାଲିକା ଲୋଡ୍ କରିପାରିଲା ନାହିଁ।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ଅନ୍ୟ"</string> - <!-- no translation found for controls_dialog_title (3475025327938684220) --> - <skip /> + <string name="controls_dialog_title" msgid="3475025327938684220">"ଦ୍ରୁତ ନିୟନ୍ତ୍ରଣରେ ଯୋଗ କରନ୍ତୁ"</string> <string name="controls_dialog_ok" msgid="7011816381344485651">"ପସନ୍ଦଗୁଡ଼ିକରେ ଯୋଗ କରନ୍ତୁ"</string> <string name="controls_dialog_message" msgid="6292099631702047540">"ଏହି ନିୟନ୍ତ୍ରଣକୁ ଆପଣଙ୍କ ପସନ୍ଦଗୁଡ଼ିକରେ ଯୋଗ କରିବାକୁ <xliff:g id="APP">%s</xliff:g> ପ୍ରସ୍ତାବ ଦେଇଛି।"</string> - <!-- no translation found for controls_dialog_confirmation (586517302736263447) --> - <skip /> + <string name="controls_dialog_confirmation" msgid="586517302736263447">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଅପଡେଟ୍ କରାଯାଇଛି"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PINରେ ଅକ୍ଷର କିମ୍ୱା ସଙ୍କେତଗୁଡ଼ିକ ଥାଏ"</string> - <!-- no translation found for controls_pin_verify (3452778292918877662) --> - <skip /> - <!-- no translation found for controls_pin_verifying (3755045989392131746) --> - <skip /> + <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ଯାଞ୍ଚ କରନ୍ତୁ"</string> + <string name="controls_pin_verifying" msgid="3755045989392131746">"ଯାଞ୍ଚ କରାଯାଉଛି…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"PIN ଲେଖନ୍ତୁ"</string> - <!-- no translation found for controls_pin_instructions_retry (1566667581012131046) --> - <skip /> - <!-- no translation found for controls_confirmation_confirming (2596071302617310665) --> - <skip /> - <!-- no translation found for controls_confirmation_message (7744104992609594859) --> - <skip /> - <!-- no translation found for controls_structure_tooltip (4355922222944447867) --> - <skip /> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ଅନ୍ୟ ଏକ PIN ଚେଷ୍ଟା କରି ଦେଖନ୍ତୁ"</string> + <string name="controls_confirmation_confirming" msgid="2596071302617310665">"ସୁନିଶ୍ଚିତ କରାଯାଉଛି…"</string> + <string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> ପାଇଁ ପରିବର୍ତ୍ତନ ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string> + <string name="controls_structure_tooltip" msgid="4355922222944447867">"ଅଧିକ ଦେଖିବାକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"ସୁପାରିଶଗୁଡ଼ିକ ଲୋଡ୍ କରାଯାଉଛି"</string> - <!-- no translation found for controls_media_close_session (9023534788828414585) --> - <skip /> - <!-- no translation found for controls_error_timeout (794197289772728958) --> - <skip /> - <!-- no translation found for controls_error_failed (960228639198558525) --> - <skip /> - <!-- no translation found for controls_in_progress (4421080500238215939) --> - <skip /> - <!-- no translation found for controls_added_tooltip (4842812921719153085) --> - <skip /> - <!-- no translation found for controls_menu_add (4447246119229920050) --> - <skip /> - <!-- no translation found for controls_menu_edit (890623986951347062) --> - <skip /> + <string name="controls_media_close_session" msgid="9023534788828414585">"ଏହି ମିଡିଆ ସେସନ୍ ବନ୍ଦ କରନ୍ତୁ"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"ନିଷ୍କ୍ରିୟ ଅଛି, ଆପ ଯାଞ୍ଚ କରନ୍ତୁ"</string> + <string name="controls_error_failed" msgid="960228639198558525">"ତ୍ରୁଟି ହୋଇଛି, ପୁଣି ଚେଷ୍ଟା କର"</string> + <string name="controls_in_progress" msgid="4421080500238215939">"ପ୍ରଗତିରେ ଅଛି"</string> + <string name="controls_added_tooltip" msgid="4842812921719153085">"ନୂଆ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ପାୱାର ବଟନକୁ ଧରି ରଖନ୍ତୁ"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଯୋଗ କରନ୍ତୁ"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ସମ୍ପାଦନ କରନ୍ତୁ"</string> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 89eee64d0013..9a7201bdbec1 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -155,26 +155,16 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"ਗਲਤ ਪਾਸਵਰਡ"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"ਬਹੁਤ ਸਾਰੀਆਂ ਗ਼ਲਤ ਕੋਸ਼ਿਸ਼ਾਂ।\n<xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ। <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> ਕੋਸ਼ਿਸ਼।"</string> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"ਤੁਹਾਡਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪੈਟਰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਿੰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪੈਟਰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਿੰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪੈਟਰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਇਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਿੰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਇਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਇਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"ਬਹੁਤ ਸਾਰੀਆਂ ਗਲਤ ਕੋਸ਼ਿਸ਼ਾਂ। ਇਸ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"ਬਹੁਤ ਸਾਰੀਆਂ ਗਲਤ ਕੋਸ਼ਿਸ਼ਾਂ। ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।"</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"ਬਹੁਤ ਸਾਰੀਆਂ ਗਲਤ ਕੋਸ਼ਿਸ਼ਾਂ। ਇਹ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਇਸਦਾ ਡਾਟਾ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।"</string> @@ -719,7 +709,7 @@ <string name="notification_channel_summary_default" msgid="3539949463907902037">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ।"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ਇਸ ਸਮੱਗਰੀ ਦੇ ਅਸਥਿਰ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਆਪਣਾ ਧਿਆਨ ਕੇਂਦਰਿਤ ਰੱਖੋ।"</string> <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਉੱਪਰ ਅਤੇ ਬੁਲਬੁਲਿਆਂ ਦੇ ਤੌਰ \'ਤੇ ਦਿਖਾਉਂਦਾ ਹੈ।"</string> - <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ਵੱਲੋਂ ਸਾਰੀਆਂ ਗੱਲਾਂਬਾਤਾਂ \'ਤੇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ \'ਤੇ ਬੁਲਬੁਲੇ ਲਾਏ ਗਏ ਹਨ। <xliff:g id="APP_NAME_1">%2$s</xliff:g> ਵਿੱਚ ਪ੍ਰਬੰਧਨ ਕਰੋ।"</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ਵੱਲੋਂ ਸਾਰੀਆਂ ਗੱਲਾਂਬਾਤਾਂ \'ਤੇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ \'ਤੇ ਬੁਲਬੁਲੇ ਲਾਏ ਜਾਂਦੇ ਹਨ। <xliff:g id="APP_NAME_1">%2$s</xliff:g> ਵਿੱਚ ਪ੍ਰਬੰਧਨ ਕਰੋ।"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ਸੈਟਿੰਗਾਂ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ਕੋਈ ਹਾਲੀਆ ਬੁਲਬੁਲਾ ਨਹੀਂ"</string> @@ -813,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ਸੰਗੀਤ"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ਕੈਲੰਡਰ"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"ਵੌਲਿਊਮ ਕੰਟਰੋਲਾਂ ਨਾਲ ਦਿਖਾਓ"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ਵੌਲਿਊਮ ਬਟਨ ਸ਼ਾਰਟਕੱਟ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index f1c1d8bdf59b..bf5a581d050e 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -88,7 +88,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nie możesz wykonać zrzutu ekranu, bo nie zezwala na to aplikacja lub Twoja organizacja."</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zamknij zrzut ekranu"</string> <string name="screenshot_preview_description" msgid="669177537416980449">"Otwórz zrzut ekranu"</string> - <string name="screenrecord_name" msgid="2596401223859996572">"Rejestrator ekranu"</string> + <string name="screenrecord_name" msgid="2596401223859996572">"Nagrywanie ekranu"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Rozpocząć rejestrowanie?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Podczas nagrywania system Android może rejestrować wszelkie informacji poufne wyświetlane na ekranie lub odtwarzane na urządzeniu. Dotyczy to m.in. haseł, szczegółów płatności, zdjęć, wiadomości i odtwarzanych dźwięków."</string> @@ -714,8 +714,8 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"Pomaga Ci się skupić, nie sygnalizując niczego dźwiękiem ani wibracjami."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"Przyciąga uwagę dźwiękiem lub wibracjami."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Przyciąga uwagę dzięki pływającym skrótom do treści."</string> - <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wyświetla się u góry sekcji wątków i ma postać dymku."</string> - <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Wszystkie wątki z aplikacji <xliff:g id="APP_NAME_0">%1$s</xliff:g> są domyślnie wyświetlane jako dymki. Zarządzaj w aplikacji <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wyświetla się u góry sekcji rozmów i ma postać dymku."</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Wszystkie rozmowy z aplikacji <xliff:g id="APP_NAME_0">%1$s</xliff:g> są domyślnie wyświetlane jako dymki. Zarządzaj w aplikacji <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ustawienia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorytet"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Brak ostatnich dymków"</string> @@ -741,7 +741,7 @@ <string name="notification_app_settings" msgid="8963648463858039377">"Dostosuj"</string> <string name="notification_done" msgid="6215117625922713976">"Gotowe"</string> <string name="inline_undo" msgid="9026953267645116526">"Cofnij"</string> - <string name="demote" msgid="6225813324237153980">"Nie oznaczaj tego powiadomienia jako wątku"</string> + <string name="demote" msgid="6225813324237153980">"Nie oznaczaj tego powiadomienia jako rozmowy"</string> <string name="notification_conversation_favorite" msgid="1905240206975921907">"Ważne rozmowy"</string> <string name="notification_conversation_unfavorite" msgid="181383708304763807">"Rozmowa nieoznaczona jako ważna"</string> <string name="notification_conversation_mute" msgid="268951550222925548">"Wyciszone"</string> @@ -1003,9 +1003,9 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Przenieś w lewy dolny róg"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Przenieś w prawy dolny róg"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"Zamknij"</string> - <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"Nie wyświetlaj wątków jako dymków."</string> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"Nie wyświetlaj rozmowy jako dymku"</string> <string name="bubbles_user_education_title" msgid="5547017089271445797">"Czatuj, korzystając z dymków"</string> - <string name="bubbles_user_education_description" msgid="1160281719576715211">"Nowe wątki będą wyświetlane jako pływające ikony lub dymki. Kliknij, by otworzyć dymek. Przeciągnij, by go przenieść."</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"Nowe rozmowy będą wyświetlane jako pływające ikony lub dymki. Kliknij, by otworzyć dymek. Przeciągnij, by go przenieść."</string> <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Zarządzaj dymkami w dowolnym momencie"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Kliknij Zarządzaj, aby wyłączyć dymki z tej aplikacji"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index c338f46d0a1b..27e9dc3c00a6 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -156,15 +156,15 @@ <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Слишком много неудачных попыток.\nПовторите через <xliff:g id="NUMBER">%d</xliff:g> сек."</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"Попробуйте ещё раз. Попытка <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> из <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g>."</string> <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"Осталась одна попытка"</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"Если вы неправильно введете графический ключ, с устройства будут удалены все данные."</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"Если вы неправильно введете PIN-код, с устройства будут удалены все данные."</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"Если вы неправильно введете пароль, с устройства будут удалены все данные."</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"Если вы неправильно введете графический ключ, этот пользователь будет удален."</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"Если вы неправильно введете PIN-код, этот пользователь будет удален."</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"Если вы неправильно введете пароль, этот пользователь будет удален."</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Если вы неправильно введете графический ключ, ваш рабочий профиль и его данные будут удалены."</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Если вы неправильно введете PIN-код, ваш рабочий профиль и его данные будут удалены."</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Если вы неправильно введете пароль, ваш рабочий профиль и его данные будут удалены."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"Если вы неправильно введете графический ключ ещё раз, с устройства будут удалены все данные."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"Если вы неправильно введете PIN-код ещё раз, с устройства будут удалены все данные."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"Если вы неправильно введете пароль ещё раз, с устройства будут удалены все данные."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"Если вы неправильно введете графический ключ ещё раз, этот пользователь будет удален."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"Если вы неправильно введете PIN-код ещё раз, этот пользователь будет удален."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"Если вы неправильно введете пароль ещё раз, этот пользователь будет удален."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Если вы неправильно введете графический ключ ещё раз, ваш рабочий профиль и его данные будут удалены."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Если вы неправильно введете PIN-код ещё раз, ваш рабочий профиль и его данные будут удалены."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Если вы неправильно введете пароль ещё раз, ваш рабочий профиль и его данные будут удалены."</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"Слишком много неудачных попыток. С устройства будут удалены все данные."</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"Слишком много неудачных попыток. Этот пользователь будет удален."</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Слишком много неудачных попыток. Этот рабочий профиль и его данные будут удалены."</string> @@ -514,7 +514,7 @@ <string name="manage_notifications_text" msgid="6885645344647733116">"Настроить"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"История"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучные уведомления"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"Уведомления со звуком или вибрацией"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"Оповещения"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Чаты"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Отклонить все беззвучные уведомления"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"В режиме \"Не беспокоить\" уведомления заблокированы"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index f7b948a61a1e..e742ec0f9a7e 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -88,7 +88,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Vytváranie snímok obrazovky je zakázané aplikáciou alebo vašou organizáciou"</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zavrieť snímku obrazovky"</string> <string name="screenshot_preview_description" msgid="669177537416980449">"Otvoriť snímku obrazovky"</string> - <string name="screenrecord_name" msgid="2596401223859996572">"Nahrávanie obrazovky"</string> + <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Zobrazuje sa upozornenie týkajúce sa relácie záznamu obrazovky"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Chcete spustiť nahrávanie?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Počas nahrávania zaznamená systém Android všetky citlivé údaje, ktoré sa zobrazia na obrazovke alebo prehrajú v zariadení. Zahrnuje to heslá, platobné údaje, fotky, správy a zvuky."</string> @@ -715,7 +715,7 @@ <string name="notification_channel_summary_default" msgid="3539949463907902037">"Upúta vás zvukom alebo vibráciami."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Upúta vás plávajúcim odkazom na tento obsah."</string> <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Zobrazuje sa v hornej časti konverzácie ako bublina."</string> - <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Predvolene zahrnúť všetky konverzácie z bubliny <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Spravujte v aplikácii <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Predvolene zobrazovať všetky konverzácie z aplikácie <xliff:g id="APP_NAME_0">%1$s</xliff:g> ako bubliny. Spravujte v aplikácii <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavenia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žiadne nedávne bubliny"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 7cbecf4c08b8..2d904e7e4ebe 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -86,10 +86,8 @@ <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"ஸ்கிரீன் ஷாட்டை மீண்டும் எடுக்க முயலவும்"</string> <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"போதுமான சேமிப்பிடம் இல்லாததால் ஸ்கிரீன்ஷாட்டைச் சேமிக்க முடியவில்லை"</string> <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, ஆப்ஸ் அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string> - <!-- no translation found for screenshot_dismiss_ui_description (934736855340147968) --> - <skip /> - <!-- no translation found for screenshot_preview_description (669177537416980449) --> - <skip /> + <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ஸ்கிரீன்ஷாட்டை நிராகரி"</string> + <string name="screenshot_preview_description" msgid="669177537416980449">"ஸ்கிரீன்ஷாட்டைத் திற"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ஸ்கிரீன் ரெக்கார்டர்"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ரெக்கார்டிங்கைத் தொடங்கவா?"</string> @@ -825,7 +823,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"மியூசிக்"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"கேலெண்டர்"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"ஒலிக் கட்டுப்பாடுகளுடன் காட்டு"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"தொந்தரவு செய்ய வேண்டாம்"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ஒலியளவுப் பொத்தான்களுக்கான ஷார்ட்கட்"</string> @@ -1073,8 +1071,7 @@ <skip /> <!-- no translation found for controls_structure_tooltip (4355922222944447867) --> <skip /> - <!-- no translation found for controls_seeding_in_progress (3033855341410264148) --> - <skip /> + <string name="controls_seeding_in_progress" msgid="3033855341410264148">"பரிந்துரைகளை ஏற்றுகிறது"</string> <!-- no translation found for controls_media_close_session (9023534788828414585) --> <skip /> <!-- no translation found for controls_error_timeout (794197289772728958) --> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index eba3ae5ddf16..92162aeea3a2 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -154,36 +154,21 @@ <string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"ఆకృతి తప్పు"</string> <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"పాస్వర్డ్ తప్పు"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"చాలా ఎక్కువ తప్పు ప్రయత్నాలు చేశారు.\n<xliff:g id="NUMBER">%d</xliff:g> సెకన్ల తర్వాత మళ్లీ ప్రయత్నించండి."</string> - <!-- no translation found for biometric_dialog_credential_attempts_before_wipe (6751859711975516999) --> - <skip /> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_device (6585503524026243042) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_user (7015008539146949115) --> - <skip /> - <!-- no translation found for biometric_dialog_failed_attempts_now_wiping_profile (5239378521440749682) --> - <skip /> - <!-- no translation found for biometric_dialog_now_wiping_dialog_dismiss (7189432882125106154) --> - <skip /> + <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"మళ్లీ ప్రయత్నించండి. <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g>లో <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> ప్రయత్నం చేశారు."</string> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"మీ డేటా తొలగించబడుతుంది"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు ఆకృతిని ఎంటర్ చేస్తే, ఈ పరికరం యొక్క డేటా తొలగించబడుతుంది."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పిన్ను ఎంటర్ చేస్తే, ఈ పరికరం యొక్క డేటా తొలగించబడుతుంది."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పాస్వర్డ్ను ఎంటర్ చేస్తే, ఈ పరికరం యొక్క డేటా తొలగించబడుతుంది."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు ఆకృతిని ఎంటర్ చేస్తే, ఈ యూజర్ తొలగించబడతారు."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పిన్ను ఎంటర్ చేస్తే, ఈ యూజర్ తొలగించబడతారు."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పాస్వర్డ్ను ఎంటర్ చేస్తే, ఈ యూజర్ తొలగించబడతారు."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు ఆకృతిని ఎంటర్ చేస్తే, మీ కార్యాలయ ప్రొఫైల్, అలాగే దాని డేటా తొలగించబడతాయి."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పిన్ను ఎంటర్ చేస్తే, మీ కార్యాలయ ప్రొఫైల్, అలాగే దాని డేటా తొలగించబడతాయి."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పాస్వర్డ్ను ఎంటర్ చేస్తే, మీ కార్యాలయ ప్రొఫైల్, అలాగే దాని డేటా తొలగించబడతాయి."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"చాలా ఎక్కువ తప్పు ప్రయత్నాలు చేశారు. ఈ పరికరం యొక్క డేటా తొలగించబడుతుంది."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"చాలా ఎక్కువ తప్పు ప్రయత్నాలు చేశారు. ఈ యూజర్ తొలగించబడతారు."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"చాలా ఎక్కువ తప్పు ప్రయత్నాలు చేశారు. ఈ కార్యాలయ ప్రొఫైల్ మరియు దీని డేటా తొలగించబడతాయి."</string> + <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"తీసివేయి"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"వేలిముద్ర సెన్సార్ను తాకండి"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"వేలిముద్ర చిహ్నం"</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"మీ కోసం చూస్తోంది…"</string> @@ -723,17 +708,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"శబ్దం లేదా వైబ్రేషన్ లేకుండా దృష్టి కేంద్రీకరించడానికి మీకు సహాయపడుతుంది."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"శబ్దం లేదా వైబ్రేషన్తో మీరు దృష్టి సారించేలా చేస్తుంది."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ఫ్లోటింగ్ షార్ట్కట్తో మీ దృష్టిని ఈ కంటెంట్పై నిలిపి ఉంచుతుంది."</string> - <!-- no translation found for notification_channel_summary_priority (7415770044553264622) --> - <skip /> - <!-- no translation found for notification_conversation_channel_all_bubble (5389290797101635297) --> - <skip /> - <!-- no translation found for notification_conversation_channel_settings (2409977688430606835) --> - <skip /> - <!-- no translation found for notification_priority_title (2079708866333537093) --> - <skip /> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"సంభాషణ విభాగానికి ఎగువున ఉంటుంది, బబుల్లాగా కనిపిస్తుంది."</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> నుండి అన్ని సంభాషణలు డిఫాల్ట్గా బబుల్గా ఉంటాయి. <xliff:g id="APP_NAME_1">%2$s</xliff:g>లో మేనేజ్ చేయండి"</string> + <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"సెట్టింగ్లు"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ఇటీవల బబుల్లు ఏవీ లేవు"</string> - <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) --> - <skip /> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ఇటీవలి బబుల్లు, తీసివేసిన బబుల్లు ఇక్కడ కనిపిస్తాయి"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్లను సవరించడం వీలుపడదు."</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"ఈ నోటిఫికేషన్ల సమూహాన్ని ఇక్కడ కాన్ఫిగర్ చేయలేము"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"ప్రాక్సీ చేయబడిన నోటిఫికేషన్"</string> @@ -823,7 +803,7 @@ <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"సంగీతం"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string> - <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"క్యాలెండర్"</string> + <string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string> <string name="tuner_full_zen_title" msgid="5120366354224404511">"వాల్యూమ్ నియంత్రణలతో చూపు"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"అంతరాయం కలిగించవద్దు"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"వాల్యూమ్ బటన్ల షార్ట్కట్"</string> @@ -1013,17 +993,12 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"దిగువ ఎడమవైపునకు తరలించు"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"దిగవు కుడివైపునకు జరుపు"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"విస్మరించు"</string> - <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) --> - <skip /> - <!-- no translation found for bubbles_user_education_title (5547017089271445797) --> - <skip /> - <!-- no translation found for bubbles_user_education_description (1160281719576715211) --> - <skip /> - <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) --> - <skip /> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"సంభాషణను బబుల్ చేయవద్దు"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"బబుల్లను ఉపయోగించి చాట్ చేయండి"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"కొత్త సంభాషణలు తేలియాడే చిహ్నాలుగా లేదా బబుల్లు లాగా కనిపిస్తాయి. బబుల్ని తెరవడానికి నొక్కండి. తరలించడానికి లాగండి."</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"బబుల్లను ఎప్పుడైనా నియంత్రించండి"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ఈ యాప్ నుండి వచ్చే బబుల్లను ఆఫ్ చేయడానికి మేనేజ్ బటన్ను ట్యాప్ చేయండి"</string> - <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"అర్థమైంది"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"సిస్టమ్ నావిగేషన్ అప్డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్లకు వెళ్లండి."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"సిస్టమ్ నావిగేషన్ను అప్డేట్ చేయడానికి సెట్టింగ్లకు వెళ్లండి"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string> @@ -1031,8 +1006,7 @@ <string name="magnification_window_title" msgid="4863914360847258333">"మాగ్నిఫికేషన్ విండో"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"మాగ్నిఫికేషన్ నియంత్రణల విండో"</string> <string name="quick_controls_title" msgid="1686913115679255053">"త్వరిత నియంత్రణలు"</string> - <!-- no translation found for quick_controls_subtitle (1667408093326318053) --> - <skip /> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"మీ కనెక్ట్ అయిన పరికరాలకు నియంత్రణలను జోడించండి"</string> <string name="quick_controls_setup_title" msgid="9079435969373471268">"త్వరిత నియంత్రణలను సెటప్ చేయండి"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"మీ నియంత్రణలను యాక్సెస్ చేయడానికి పవర్ బటన్ను నొక్కి పట్టుకోండి"</string> <string name="controls_providers_title" msgid="6879775889857085056">"నియంత్రణలను యాడ్ చేయడానికి యాప్ను ఎంచుకోండి"</string> @@ -1041,45 +1015,28 @@ <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> కంట్రోల్ యాడ్ అయింది.</item> </plurals> <string name="controls_favorite_default_title" msgid="967742178688938137">"నియంత్రణలు"</string> - <!-- no translation found for controls_favorite_subtitle (6604402232298443956) --> - <skip /> - <!-- no translation found for controls_favorite_rearrange (7364147066539766260) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"పవర్ మెనూ నుండి యాక్సెస్ చేయడానికి నియంత్రణలను ఎంచుకోండి"</string> + <string name="controls_favorite_rearrange" msgid="7364147066539766260">"తరలించడానికి నియంత్రణను పట్టుకొని, లాగండి"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"అన్ని నియంత్రణలు గల జాబితాను లోడ్ చేయలేకపోయాము."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ఇతరం"</string> - <!-- no translation found for controls_dialog_title (3475025327938684220) --> - <skip /> + <string name="controls_dialog_title" msgid="3475025327938684220">"త్వరిత నియంత్రణలకు జోడించండి"</string> <string name="controls_dialog_ok" msgid="7011816381344485651">"ఇష్టమైనవాటికి జోడించు"</string> <string name="controls_dialog_message" msgid="6292099631702047540">"మీ ఇష్టమైనవాటికి జోడించడానికి <xliff:g id="APP">%s</xliff:g> ఈ కంట్రోల్ను సూచించింది."</string> - <!-- no translation found for controls_dialog_confirmation (586517302736263447) --> - <skip /> + <string name="controls_dialog_confirmation" msgid="586517302736263447">"నియంత్రణలు అప్డేట్ అయ్యాయి"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"పిన్ అక్షరాలను లేదా చిహ్నాలను కలిగి ఉంది"</string> - <!-- no translation found for controls_pin_verify (3452778292918877662) --> - <skip /> - <!-- no translation found for controls_pin_verifying (3755045989392131746) --> - <skip /> + <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>ను వెరిఫై చేయండి"</string> + <string name="controls_pin_verifying" msgid="3755045989392131746">"వెరిఫై చేస్తోంది..."</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"పిన్ని ఎంటర్ చేయండి"</string> - <!-- no translation found for controls_pin_instructions_retry (1566667581012131046) --> - <skip /> - <!-- no translation found for controls_confirmation_confirming (2596071302617310665) --> - <skip /> - <!-- no translation found for controls_confirmation_message (7744104992609594859) --> - <skip /> - <!-- no translation found for controls_structure_tooltip (4355922222944447867) --> - <skip /> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"మరొక పిన్ని ప్రయత్నించండి"</string> + <string name="controls_confirmation_confirming" msgid="2596071302617310665">"నిర్ధారిస్తోంది..."</string> + <string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g>కి సంబంధించి మార్పును నిర్ధారించండి"</string> + <string name="controls_structure_tooltip" msgid="4355922222944447867">"మరిన్నింటిని చూడటం కోసం స్వైప్ చేయండి"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"సిఫార్సులు లోడ్ అవుతున్నాయి"</string> - <!-- no translation found for controls_media_close_session (9023534788828414585) --> - <skip /> - <!-- no translation found for controls_error_timeout (794197289772728958) --> - <skip /> - <!-- no translation found for controls_error_failed (960228639198558525) --> - <skip /> - <!-- no translation found for controls_in_progress (4421080500238215939) --> - <skip /> - <!-- no translation found for controls_added_tooltip (4842812921719153085) --> - <skip /> - <!-- no translation found for controls_menu_add (4447246119229920050) --> - <skip /> - <!-- no translation found for controls_menu_edit (890623986951347062) --> - <skip /> + <string name="controls_media_close_session" msgid="9023534788828414585">"ఈ మీడియా సెషన్ని మూసివేయండి"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"ఇన్యాక్టివ్, యాప్ చెక్ చేయండి"</string> + <string name="controls_error_failed" msgid="960228639198558525">"ఎర్రర్, మళ్లీ ప్రయత్నించండి"</string> + <string name="controls_in_progress" msgid="4421080500238215939">"పురోగతిలో ఉంది"</string> + <string name="controls_added_tooltip" msgid="4842812921719153085">"కొత్త నియంత్రణలను చూడడానికి పవర్ బటన్ని నొక్కి పట్టుకోండి"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"నియంత్రణలను జోడించండి"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"నియంత్రణలను ఎడిట్ చేయండి"</string> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 1a95fcfa9de7..3cf00dd4390a 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -88,7 +88,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ایپ یا آپ کی تنظیم کی جانب سے اسکرین شاٹس لینے کی اجازت نہیں ہے"</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"اسکرین شاٹ برخاست کریں"</string> <string name="screenshot_preview_description" msgid="669177537416980449">"اسکرین شاٹ کھولیں"</string> - <string name="screenrecord_name" msgid="2596401223859996572">"اسکرین ریکارڈر"</string> + <string name="screenrecord_name" msgid="2596401223859996572">"سکرین ریکارڈر"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ریکارڈنگ شروع کریں؟"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ریکارڈ کرنے کے دوران، Android سسٹم آپ کی اسکرین پر نظر آنے والی یا آپ کے آلہ پر چلنے والی کسی بھی حساس معلومات کو کیپچر کر سکتا ہے۔ اس میں پاس ورڈز، ادائیگی کی معلومات، تصاویر، پیغامات اور آڈیو شامل ہیں۔"</string> @@ -155,26 +155,16 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"غلط پاس ورڈ"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"کافی زیادہ غلط کوششیں کی گئیں۔\n <xliff:g id="NUMBER">%d</xliff:g> سیکنڈ بعد دوبارہ کوشش کریں۔"</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"دوبارہ کوشش کریں۔ کوشش <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> از <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g>۔"</string> - <!-- no translation found for biometric_dialog_last_attempt_before_wipe_dialog_title (2874250099278693477) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_device (6562299244825817598) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_device (9151756675698215723) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_device (2363778585575998317) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_user (8400180746043407270) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_user (4159878829962411168) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_user (4695682515465063885) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pattern_attempt_before_wipe_profile (6045224069529284686) --> - <skip /> - <!-- no translation found for biometric_dialog_last_pin_attempt_before_wipe_profile (545567685899091757) --> - <skip /> - <!-- no translation found for biometric_dialog_last_password_attempt_before_wipe_profile (8538032972389729253) --> - <skip /> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"آپ کا ڈیٹا حذف کر دیا جائے گا"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"اگر آپ نے اگلی کوشش میں غلط پیٹرن درج کیا تو اس آلے کا ڈیٹا حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"اگر آپ نے اگلی کوشش میں غلط PIN درج کیا تو اس آلے کا ڈیٹا حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"اگر آپ نے اگلی کوشش میں غلط پاس ورڈ درج کیا تو اس آلے کا ڈیٹا حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"اگر آپ نے اگلی کوشش میں غلط پیٹرن درج کیا تو اس صارف کو حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"اگر آپ نے اگلی کوشش میں غلط PIN درج کیا تو اس صارف کو حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"اگر آپ نے اگلی کوشش میں غلط پاس ورڈ درج کیا تو اس صارف کو حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"اگر آپ نے اگلی کوشش میں غلط پیٹرن درج کیا تو آپ کی دفتری پروفائل اور اس کا ڈیٹا حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"اگر آپ نے اگلی کوشش میں غلط PIN درج کیا تو آپ کی دفتری پروفائل اور اس کا ڈیٹا حذف کر دیا جائے گا۔"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"اگر آپ نے اگلی کوشش میں غلط پاس ورڈ درج کیا تو آپ کی دفتری پروفائل اور اس کا ڈیٹا حذف کر دیا جائے گا۔"</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"بہت زیادہ غلط کوششیں۔ اس آلے کا ڈیٹا حذف کر دیا جائے گا۔"</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"بہت زیادہ غلط کوششیں۔ اس صارف کو حذف کر دیا جائے گا۔"</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"بہت زیادہ غلط کوششیں۔ یہ دفتری پروفائل اور اس کا ڈیٹا حذف کر دیا جائے گا۔"</string> @@ -1005,7 +995,7 @@ <string name="bubble_dismiss_text" msgid="7071770411580452911">"برخاست کریں"</string> <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"بلبلہ گفتگو نہ کریں"</string> <string name="bubbles_user_education_title" msgid="5547017089271445797">"بلبلے کے ذریعے چیٹ کریں"</string> - <string name="bubbles_user_education_description" msgid="1160281719576715211">"نئی گفتگو فلوٹنگ آئیکن یا بلبلے کے طور پر ظاہر ہو گی۔ بلبلہ کھولنے کے لیے تھپتھپائیں۔ اسے منتقل کرنے کے لیے گھسیٹیں۔"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"نئی گفتگوئیں فلوٹنگ آئیکن یا بلبلے کے طور پر ظاہر ہوں گی۔ بلبلہ کھولنے کے لیے تھپتھپائیں۔ اسے منتقل کرنے کے لیے گھسیٹیں۔"</string> <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"کسی بھی وقت بلبلے کو کنٹرول کریں"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"اس ایپ سے بلبلوں کو آف کرنے کے لیے نظم کریں پر تھپتھپائیں"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"سمجھ آ گئی"</string> @@ -1015,15 +1005,11 @@ <string name="magnification_overlay_title" msgid="6584179429612427958">"میگنیفیکیشن اوورلے ونڈو"</string> <string name="magnification_window_title" msgid="4863914360847258333">"میگنیفکیشن ونڈو"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"میگنیفکیشن ونڈو کنٹرولز"</string> - <!-- no translation found for quick_controls_title (1686913115679255053) --> - <skip /> + <string name="quick_controls_title" msgid="1686913115679255053">"فوری کنٹرولز"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"اپنے منسلک آلات کے لیے کنٹرولز شامل کریں"</string> - <!-- no translation found for quick_controls_setup_title (9079435969373471268) --> - <skip /> - <!-- no translation found for quick_controls_setup_subtitle (1681506617879773824) --> - <skip /> - <!-- no translation found for controls_providers_title (6879775889857085056) --> - <skip /> + <string name="quick_controls_setup_title" msgid="9079435969373471268">"فوری کنٹرولز سیٹ اپ کریں"</string> + <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"اپنے کنٹرول تک رسائی حاصل کرنے کے ليے پاور بٹن کو دبائیں رکھیں"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"کنٹرولز شامل کرنے کے لیے ایپ منتخب کریں"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> کنٹرولز شامل کر دیے گئے۔</item> <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> کنٹرول شامل کر دیا گیا۔</item> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 0429135cd50f..b88c874bfd82 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -162,9 +162,9 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"Agar grafik kalitni xato kiritsangiz, bu foydalanuvchi oʻchirib tashlanadi."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"Agar PIN kodni xato kiritsangiz, bu foydalanuvchi oʻchirib tashlanadi."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"Agar parolni xato kiritsangiz, bu foydalanuvchi oʻchirib tashlanadi."</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Agar grafik kalitni xato kiritsangiz, ishchi profil va undagi maʼlumotlar oʻchirib tashlanadi."</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Agar PIN kodni xato kiritsangiz, ishchi profil va undagi maʼlumotlar oʻchirib tashlanadi."</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Agar parolni xato kiritsangiz, ishchi profil va undagi maʼlumotlar oʻchirib tashlanadi."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Agar grafik kalitni xato kiritsangiz, ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Agar PIN kodni xato kiritsangiz, ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Agar parolni xato kiritsangiz, ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu qurilmadagi maʼlumotlar oʻchirib tashlanadi."</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu foydalanuvchi oʻchirib tashlanadi."</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu ishchi profil va undagi maʼlumotlar oʻchirib tashlanadi."</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index eb6c825daf92..957bbd676367 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -63,12 +63,12 @@ <string name="usb_debugging_allow" msgid="1722643858015321328">"Cho phép"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Không cho phép chế độ gỡ lỗi qua USB"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"Cho phép gỡ lỗi không dây trên mạng này?"</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"Cho phép gỡ lỗi qua Wi-Fi trên mạng này?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Tên mạng (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nĐịa chỉ Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Luôn cho phép trên mạng này"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"Cho phép"</string> - <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"Không cho phép gỡ lỗi không dây"</string> - <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi không dây. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string> + <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"Không cho phép gỡ lỗi qua Wi-Fi"</string> + <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi qua Wi-Fi. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string> <string name="usb_contaminant_title" msgid="894052515034594113">"Đã tắt cổng USB"</string> <string name="usb_contaminant_message" msgid="7730476585174719805">"Để bảo vệ thiết bị của bạn khỏi chất lỏng hay mảnh vỡ, cổng USB sẽ tắt và không phát hiện được bất kỳ phụ kiện nào.\n\nBạn sẽ nhận được thông báo khi có thể sử dụng lại cổng USB."</string> <string name="usb_port_enabled" msgid="531823867664717018">"Đã bật cổng USB để phát hiện bộ sạc và phụ kiện"</string> @@ -712,8 +712,8 @@ <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Theo mặc định, tất cả các cuộc trò chuyện từ ứng dụng <xliff:g id="APP_NAME_0">%1$s</xliff:g> được phép hiển thị dưới dạng bong bóng. Quản lý trong phần <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cài đặt"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string> - <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Không có bong bóng nào gần đây"</string> - <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Bong bóng đã đóng và bong bóng gần đây sẽ xuất hiện ở đây"</string> + <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Không có bong bóng trò chuyện nào gần đây"</string> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Bong bóng trò chuyện đã đóng và bong bóng trò chuyện gần đây sẽ xuất hiện ở đây"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"Không thể định cấu hình nhóm thông báo này tại đây"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"Thông báo đã xử lý qua máy chủ proxy"</string> @@ -741,7 +741,7 @@ <string name="notification_conversation_mute" msgid="268951550222925548">"Bị tắt tiếng"</string> <string name="notification_conversation_unmute" msgid="2692255619510896710">"Thông báo"</string> <string name="notification_conversation_bubble" msgid="2242180995373949022">"Hiển thị bong bóng"</string> - <string name="notification_conversation_unbubble" msgid="6908427185031099868">"Xóa bong bóng"</string> + <string name="notification_conversation_unbubble" msgid="6908427185031099868">"Xóa bong bóng trò chuyện"</string> <string name="notification_conversation_home_screen" msgid="8347136037958438935">"Thêm vào màn hình chính"</string> <string name="notification_menu_accessibility" msgid="8984166825879886773">"<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="6429668976593634862">"điều khiển thông báo"</string> @@ -983,7 +983,7 @@ <string name="device_services" msgid="1549944177856658705">"Dịch vụ cho thiết bị"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Không có tiêu đề"</string> <string name="restart_button_description" msgid="6916116576177456480">"Nhấn để khởi động lại ứng dụng này và xem ở chế độ toàn màn hình."</string> - <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tùy chọn cài đặt cho bong bóng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tùy chọn cài đặt cho bong bóng trò chuyện <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Quản lý"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> của <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> từ <xliff:g id="APP_NAME">%2$s</xliff:g> và <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> bong bóng khác"</string> @@ -994,10 +994,10 @@ <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Chuyển tới dưới cùng bên phải"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"Loại bỏ"</string> <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"Dừng trò chuyện bằng bong bóng"</string> - <string name="bubbles_user_education_title" msgid="5547017089271445797">"Trò chuyện bằng bong bóng"</string> - <string name="bubbles_user_education_description" msgid="1160281719576715211">"Các cuộc trò chuyện mới hiển thị dưới dạng biểu tượng nổi hoặc bong bóng. Nhấn để mở bong bóng. Kéo để di chuyển bong bóng."</string> - <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kiểm soát các tùy chọn cài đặt bong bóng bất cứ lúc nào"</string> - <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Nhấn vào nút Quản lý để tắt bong bóng từ ứng dụng này"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"Trò chuyện bằng bong bóng trò chuyện"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"Các cuộc trò chuyện mới hiển thị dưới dạng biểu tượng nổi hoặc bong bóng trò chuyện. Nhấn để mở bong bóng trò chuyện. Kéo để di chuyển bong bóng trò chuyện."</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kiểm soát tùy chọn cài đặt bong bóng trò chuyện bất mọi lúc"</string> + <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Nhấn vào nút Quản lý để tắt bong bóng trò chuyện từ ứng dụng này"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Đã cập nhật chế độ di chuyển trên hệ thống. Để thay đổi, hãy chuyển đến phần Cài đặt."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 3dfc3bf189c9..791fe8dd74b2 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -88,7 +88,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"此应用或您所在的单位不允许进行屏幕截图"</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"关闭屏幕截图"</string> <string name="screenshot_preview_description" msgid="669177537416980449">"打开屏幕截图"</string> - <string name="screenrecord_name" msgid="2596401223859996572">"屏幕录制工具"</string> + <string name="screenrecord_name" msgid="2596401223859996572">"屏幕录制器"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持续显示屏幕录制会话通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"要开始录制吗?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"在录制内容时,Android 系统可以捕捉到您屏幕上显示或设备中播放的敏感信息,其中包括密码、付款信息、照片、消息和音频。"</string> @@ -708,12 +708,12 @@ <string name="notification_channel_summary_low" msgid="7300447764759926720">"不会发出提示音或振动,可帮助您保持专注。"</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"通过提示音或振动吸引您的注意。"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"通过可链接到这项内容的浮动快捷方式吸引您的注意。"</string> - <string name="notification_channel_summary_priority" msgid="7415770044553264622">"以气泡形式显示在会话部分顶部。"</string> - <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"默认情况下,<xliff:g id="APP_NAME_0">%1$s</xliff:g>中的所有会话都会以气泡形式显示。在“<xliff:g id="APP_NAME_1">%2$s</xliff:g>”中管理。"</string> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"以对话泡形式显示在对话部分顶部。"</string> + <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"默认情况下,<xliff:g id="APP_NAME_0">%1$s</xliff:g>中的所有对话都会以对话泡形式显示。在“<xliff:g id="APP_NAME_1">%2$s</xliff:g>”中管理。"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"设置"</string> <string name="notification_priority_title" msgid="2079708866333537093">"优先级"</string> - <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近没有气泡"</string> - <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"此处会显示最近的气泡和已关闭的气泡"</string> + <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近没有对话泡"</string> + <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"此处会显示最近的对话泡和已关闭的对话泡"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string> <string name="notification_multichannel_desc" msgid="7414593090056236179">"您无法在此处配置这组通知"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"代理通知"</string> @@ -741,7 +741,7 @@ <string name="notification_conversation_mute" msgid="268951550222925548">"已静音"</string> <string name="notification_conversation_unmute" msgid="2692255619510896710">"提醒"</string> <string name="notification_conversation_bubble" msgid="2242180995373949022">"显示气泡"</string> - <string name="notification_conversation_unbubble" msgid="6908427185031099868">"移除气泡"</string> + <string name="notification_conversation_unbubble" msgid="6908427185031099868">"移除对话泡"</string> <string name="notification_conversation_home_screen" msgid="8347136037958438935">"添加到主屏幕"</string> <string name="notification_menu_accessibility" msgid="8984166825879886773">"<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="6429668976593634862">"通知设置"</string> @@ -983,7 +983,7 @@ <string name="device_services" msgid="1549944177856658705">"设备服务"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"无标题"</string> <string name="restart_button_description" msgid="6916116576177456480">"点按即可重启此应用并进入全屏模式。"</string> - <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>气泡的相关设置"</string> + <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>对话泡的设置"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g>和另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 个应用:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -993,11 +993,11 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"移至左下角"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"移至右下角"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"关闭"</string> - <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"不以气泡形式显示会话"</string> - <string name="bubbles_user_education_title" msgid="5547017089271445797">"使用气泡聊天"</string> - <string name="bubbles_user_education_description" msgid="1160281719576715211">"新会话会以浮动图标或气泡形式显示。点按即可打开气泡。拖动即可移动气泡。"</string> - <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"随时控制气泡"</string> - <string name="bubbles_user_education_manage" msgid="1391639189507036423">"点按“管理”按钮,可关闭来自此应用的气泡"</string> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"不以对话泡形式显示对话"</string> + <string name="bubbles_user_education_title" msgid="5547017089271445797">"使用对话泡聊天"</string> + <string name="bubbles_user_education_description" msgid="1160281719576715211">"新对话会以浮动图标或对话泡形式显示。点按即可打开对话泡。拖动即可移动对话泡。"</string> + <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"随时控制对话泡"</string> + <string name="bubbles_user_education_manage" msgid="1391639189507036423">"点按“管理”按钮,可关闭来自此应用的对话泡"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"知道了"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系统导航已更新。要进行更改,请转到“设置”。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"转到“设置”即可更新系统导航"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 9074dad608ce..5b213edd5f0f 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1155,6 +1155,10 @@ <dimen name="bubble_overflow_padding">15dp</dimen> <!-- Padding of label for bubble overflow view --> <dimen name="bubble_overflow_text_padding">7dp</dimen> + <!-- Height of bubble overflow empty state illustration --> + <dimen name="bubble_empty_overflow_image_height">200dp</dimen> + <!-- Padding of bubble overflow empty state subtitle --> + <dimen name="bubble_empty_overflow_subtitle_padding">50dp</dimen> <!-- Height of the triangle that points to the expanded bubble --> <dimen name="bubble_pointer_height">4dp</dimen> <!-- Width of the triangle that points to the expanded bubble --> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl index 80fd826f28c6..35ad422c56b8 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl @@ -26,7 +26,7 @@ import com.android.systemui.shared.recents.IPinnedStackAnimationListener; /** * Temporary callbacks into SystemUI. - * Next id = 25 + * Next id = 26 */ interface ISystemUiProxy { @@ -140,4 +140,10 @@ interface ISystemUiProxy { * Sets listener to get pinned stack animation callbacks. */ void setPinnedStackAnimationListener(IPinnedStackAnimationListener listener) = 24; + + /** + * Notifies that quickstep will switch to a new task + * @param rotation indicates which Surface.Rotation the gesture was started in + */ + void onQuickSwitchToNewTask(int rotation) = 25; } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java index 29100ef8f70f..8bd7c790682d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java @@ -18,6 +18,7 @@ package com.android.systemui.shared.system; import android.content.Context; import android.graphics.PixelFormat; +import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.IBinder; import android.util.Size; @@ -59,6 +60,7 @@ public class SurfaceViewRequestReceiver { if (mSurfaceControlViewHost != null) { mSurfaceControlViewHost.die(); } + SurfaceControl surfaceControl = SurfaceViewRequestUtils.getSurfaceControl(bundle); if (surfaceControl != null) { if (viewSize == null) { @@ -70,8 +72,10 @@ public class SurfaceViewRequestReceiver { WindowlessWindowManager windowlessWindowManager = new WindowlessWindowManager(context.getResources().getConfiguration(), surfaceControl, hostToken); + DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); mSurfaceControlViewHost = new SurfaceControlViewHost(context, - context.getDisplayNoVerify(), windowlessWindowManager); + dm.getDisplay(SurfaceViewRequestUtils.getDisplayId(bundle)), + windowlessWindowManager); WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( viewSize.getWidth(), diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java index 4409276f8c27..6742a4dc06b7 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java @@ -26,30 +26,38 @@ import android.view.SurfaceView; public class SurfaceViewRequestUtils { private static final String KEY_HOST_TOKEN = "host_token"; private static final String KEY_SURFACE_CONTROL = "surface_control"; + private static final String KEY_DISPLAY_ID = "display_id"; /** Creates a SurfaceView based bundle that stores the input host token and surface control. */ public static Bundle createSurfaceBundle(SurfaceView surfaceView) { Bundle bundle = new Bundle(); bundle.putBinder(KEY_HOST_TOKEN, surfaceView.getHostToken()); bundle.putParcelable(KEY_SURFACE_CONTROL, surfaceView.getSurfaceControl()); + bundle.putInt(KEY_DISPLAY_ID, surfaceView.getDisplay().getDisplayId()); return bundle; } /** * Retrieves the SurfaceControl from a bundle created by * {@link #createSurfaceBundle(SurfaceView)}. - **/ + */ public static SurfaceControl getSurfaceControl(Bundle bundle) { return bundle.getParcelable(KEY_SURFACE_CONTROL); } /** - * Retrieves the input token from a bundle created by - * {@link #createSurfaceBundle(SurfaceView)}. - **/ + * Retrieves the input token from a bundle created by {@link #createSurfaceBundle(SurfaceView)}. + */ public static @Nullable IBinder getHostToken(Bundle bundle) { return bundle.getBinder(KEY_HOST_TOKEN); } + /** + * Retrieves the display id from a bundle created by {@link #createSurfaceBundle(SurfaceView)}. + */ + public static int getDisplayId(Bundle bundle) { + return bundle.getInt(KEY_DISPLAY_ID); + } + private SurfaceViewRequestUtils() {} } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index f6368c466e91..a876dee0e52d 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -482,8 +482,12 @@ public class AssistManager { } public void onLockscreenShown() { - // TODO(b/140052478) - whitelistIpcs(mAssistUtils::onLockscreenShown); + AsyncTask.execute(new Runnable() { + @Override + public void run() { + mAssistUtils.onLockscreenShown(); + } + }); } public long getAssistHandleShowAndGoRemainingDurationMs() { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java index 3f985ef37746..37841f24a3cf 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java @@ -21,18 +21,17 @@ import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; import android.app.Activity; -import android.app.Notification; -import android.app.Person; +import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; import android.os.Bundle; -import android.os.Parcelable; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -55,6 +54,7 @@ public class BubbleOverflowActivity extends Activity { private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleOverflowActivity" : TAG_BUBBLES; private LinearLayout mEmptyState; + private ImageView mEmptyStateImage; private BubbleController mBubbleController; private BubbleOverflowAdapter mAdapter; private RecyclerView mRecyclerView; @@ -73,6 +73,7 @@ public class BubbleOverflowActivity extends Activity { mEmptyState = findViewById(R.id.bubble_overflow_empty_state); mRecyclerView = findViewById(R.id.bubble_overflow_recycler); + mEmptyStateImage = findViewById(R.id.bubble_overflow_empty_state_image); Resources res = getResources(); final int columns = res.getInteger(R.integer.bubbles_overflow_columns); @@ -98,6 +99,31 @@ public class BubbleOverflowActivity extends Activity { mBubbleController.setOverflowCallback(() -> { onDataChanged(mBubbleController.getOverflowBubbles()); }); + onThemeChanged(); + } + + /** + * Handle theme changes. + */ + void onThemeChanged() { + final int mode = + getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + switch (mode) { + case Configuration.UI_MODE_NIGHT_NO: + if (DEBUG_OVERFLOW) { + Log.d(TAG, "Set overflow UI to light mode"); + } + mEmptyStateImage.setImageDrawable( + getResources().getDrawable(R.drawable.ic_empty_bubble_overflow_light)); + break; + case Configuration.UI_MODE_NIGHT_YES: + if (DEBUG_OVERFLOW) { + Log.d(TAG, "Set overflow UI to dark mode"); + } + mEmptyStateImage.setImageDrawable( + getResources().getDrawable(R.drawable.ic_empty_bubble_overflow_dark)); + break; + } } void setBackgroundColor() { @@ -138,6 +164,7 @@ public class BubbleOverflowActivity extends Activity { @Override public void onResume() { super.onResume(); + onThemeChanged(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 6a7b0da0d8d8..eff693436451 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -713,7 +713,7 @@ public class BubbleStackView extends FrameLayout { } else { mBubbleContainer.removeView(mBubbleOverflow.getBtn()); mBubbleOverflow.updateIcon(mContext, this); - overflowBtnIndex = mBubbleContainer.getChildCount() - 1; + overflowBtnIndex = mBubbleContainer.getChildCount(); } mBubbleContainer.addView(mBubbleOverflow.getBtn(), overflowBtnIndex, new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)); diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 6d99ef1829b2..fdd859373685 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -78,10 +78,13 @@ import android.widget.ImageView.ScaleType; import android.widget.TextView; import com.android.internal.R; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.colorextraction.drawable.ScrimDrawable; import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEvent; +import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.EmergencyAffordanceManager; @@ -171,6 +174,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final IActivityManager mIActivityManager; private final TelecomManager mTelecomManager; private final MetricsLogger mMetricsLogger; + private final UiEventLogger mUiEventLogger; private final NotificationShadeDepthController mDepthController; private final BlurUtils mBlurUtils; @@ -203,6 +207,23 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final ControlsListingController mControlsListingController; private boolean mAnyControlsProviders = false; + @VisibleForTesting + public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum { + @UiEvent(doc = "The global actions / power menu surface became visible on the screen.") + GA_POWER_MENU_OPEN(337); + + private final int mId; + + GlobalActionsEvent(int id) { + mId = id; + } + + @Override + public int getId() { + return mId; + } + } + /** * @param context everything needs a context :( */ @@ -223,7 +244,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, ControlsUiController controlsUiController, IWindowManager iWindowManager, @Background Executor backgroundExecutor, ControlsListingController controlsListingController, - ControlsController controlsController) { + ControlsController controlsController, UiEventLogger uiEventLogger) { mContext = new ContextThemeWrapper(context, com.android.systemui.R.style.qs_theme); mWindowManagerFuncs = windowManagerFuncs; mAudioManager = audioManager; @@ -240,6 +261,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mIActivityManager = iActivityManager; mTelecomManager = telecomManager; mMetricsLogger = metricsLogger; + mUiEventLogger = uiEventLogger; mDepthController = depthController; mSysuiColorExtractor = colorExtractor; mStatusBarService = statusBarService; @@ -997,6 +1019,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, */ public void onShow(DialogInterface dialog) { mMetricsLogger.visible(MetricsEvent.POWER_MENU); + mUiEventLogger.log(GlobalActionsEvent.GA_POWER_MENU_OPEN); } /** diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java index ce29859f12ca..15cf1a060f4c 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java @@ -98,8 +98,21 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks public void showShutdownUi(boolean isReboot, String reason) { ScrimDrawable background = new ScrimDrawable(); - Dialog d = new Dialog(mContext, + final Dialog d = new Dialog(mContext, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions); + + d.setOnShowListener(dialog -> { + if (mBlurUtils.supportsBlursOnWindows()) { + background.setAlpha((int) (ScrimController.BLUR_SCRIM_ALPHA * 255)); + mBlurUtils.applyBlur(d.getWindow().getDecorView().getViewRootImpl(), + mBlurUtils.blurRadiusOfRatio(1)); + } else { + float backgroundAlpha = mContext.getResources().getFloat( + com.android.systemui.R.dimen.shutdown_scrim_behind_alpha); + background.setAlpha((int) (backgroundAlpha * 255)); + } + }); + // Window initialization Window window = d.getWindow(); window.requestFeature(Window.FEATURE_NO_TITLE); @@ -146,16 +159,6 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks reasonView.setText(rebootReasonMessage); } - if (mBlurUtils.supportsBlursOnWindows()) { - background.setAlpha((int) (ScrimController.BLUR_SCRIM_ALPHA * 255)); - mBlurUtils.applyBlur(d.getWindow().getDecorView().getViewRootImpl(), - mBlurUtils.blurRadiusOfRatio(1)); - } else { - float backgroundAlpha = mContext.getResources().getFloat( - com.android.systemui.R.dimen.shutdown_scrim_behind_alpha); - background.setAlpha((int) (backgroundAlpha * 255)); - } - d.show(); } diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt new file mode 100644 index 000000000000..aa5ebaa22f2d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.media + +import android.content.res.ColorStateList +import android.text.format.DateUtils +import android.view.View +import android.widget.SeekBar +import android.widget.TextView +import androidx.annotation.UiThread +import androidx.lifecycle.Observer + +import com.android.systemui.R + +/** + * Observer for changes from SeekBarViewModel. + * + * <p>Updates the seek bar views in response to changes to the model. + */ +class SeekBarObserver(view: View) : Observer<SeekBarViewModel.Progress> { + + private val seekBarView: SeekBar + private val elapsedTimeView: TextView + private val totalTimeView: TextView + + init { + seekBarView = view.findViewById(R.id.media_progress_bar) + elapsedTimeView = view.findViewById(R.id.media_elapsed_time) + totalTimeView = view.findViewById(R.id.media_total_time) + } + + /** Updates seek bar views when the data model changes. */ + @UiThread + override fun onChanged(data: SeekBarViewModel.Progress) { + if (data.enabled && seekBarView.visibility == View.GONE) { + seekBarView.visibility = View.VISIBLE + elapsedTimeView.visibility = View.VISIBLE + totalTimeView.visibility = View.VISIBLE + } else if (!data.enabled && seekBarView.visibility == View.VISIBLE) { + seekBarView.visibility = View.GONE + elapsedTimeView.visibility = View.GONE + totalTimeView.visibility = View.GONE + return + } + + // TODO: update the style of the disabled progress bar + seekBarView.setEnabled(data.seekAvailable) + + data.color?.let { + var tintList = ColorStateList.valueOf(it) + seekBarView.setThumbTintList(tintList) + tintList = tintList.withAlpha(192) // 75% + seekBarView.setProgressTintList(tintList) + tintList = tintList.withAlpha(128) // 50% + seekBarView.setProgressBackgroundTintList(tintList) + elapsedTimeView.setTextColor(it) + totalTimeView.setTextColor(it) + } + + data.elapsedTime?.let { + seekBarView.setProgress(it) + elapsedTimeView.setText(DateUtils.formatElapsedTime( + it / DateUtils.SECOND_IN_MILLIS)) + } + + data.duration?.let { + seekBarView.setMax(it) + totalTimeView.setText(DateUtils.formatElapsedTime( + it / DateUtils.SECOND_IN_MILLIS)) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt new file mode 100644 index 000000000000..cf8f26841cf9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.media + +import android.media.MediaMetadata +import android.media.session.MediaController +import android.media.session.PlaybackState +import android.view.MotionEvent +import android.view.View +import android.widget.SeekBar +import androidx.annotation.AnyThread +import androidx.annotation.WorkerThread +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.LiveData + +import com.android.systemui.util.concurrency.DelayableExecutor + +private const val POSITION_UPDATE_INTERVAL_MILLIS = 100L + +/** ViewModel for seek bar in QS media player. */ +class SeekBarViewModel(val bgExecutor: DelayableExecutor) { + + private val _progress = MutableLiveData<Progress>().apply { + postValue(Progress(false, false, null, null, null)) + } + val progress: LiveData<Progress> + get() = _progress + private var controller: MediaController? = null + private var playbackState: PlaybackState? = null + + /** Listening state (QS open or closed) is used to control polling of progress. */ + var listening = true + set(value) { + if (value) { + checkPlaybackPosition() + } + } + + /** + * Handle request to change the current position in the media track. + * @param position Place to seek to in the track. + */ + @WorkerThread + fun onSeek(position: Long) { + controller?.transportControls?.seekTo(position) + } + + /** + * Updates media information. + * @param mediaController controller for media session + * @param color foreground color for UI elements + */ + @WorkerThread + fun updateController(mediaController: MediaController?, color: Int) { + controller = mediaController + playbackState = controller?.playbackState + val mediaMetadata = controller?.metadata + val seekAvailable = ((playbackState?.actions ?: 0L) and PlaybackState.ACTION_SEEK_TO) != 0L + val position = playbackState?.position?.toInt() + val duration = mediaMetadata?.getLong(MediaMetadata.METADATA_KEY_DURATION)?.toInt() + val enabled = if (duration != null && duration <= 0) false else true + _progress.postValue(Progress(enabled, seekAvailable, position, duration, color)) + if (shouldPollPlaybackPosition()) { + checkPlaybackPosition() + } + } + + @AnyThread + private fun checkPlaybackPosition(): Runnable = bgExecutor.executeDelayed({ + val currentPosition = controller?.playbackState?.position?.toInt() + if (currentPosition != null && _progress.value!!.elapsedTime != currentPosition) { + _progress.postValue(_progress.value!!.copy(elapsedTime = currentPosition)) + } + if (shouldPollPlaybackPosition()) { + checkPlaybackPosition() + } + }, POSITION_UPDATE_INTERVAL_MILLIS) + + @WorkerThread + private fun shouldPollPlaybackPosition(): Boolean { + val state = playbackState?.state + val moving = if (state == null) false else + state == PlaybackState.STATE_PLAYING || + state == PlaybackState.STATE_BUFFERING || + state == PlaybackState.STATE_FAST_FORWARDING || + state == PlaybackState.STATE_REWINDING + return moving && listening + } + + /** Gets a listener to attach to the seek bar to handle seeking. */ + val seekBarListener: SeekBar.OnSeekBarChangeListener + get() { + return SeekBarChangeListener(this, bgExecutor) + } + + /** Gets a listener to attach to the seek bar to disable touch intercepting. */ + val seekBarTouchListener: View.OnTouchListener + get() { + return SeekBarTouchListener() + } + + private class SeekBarChangeListener( + val viewModel: SeekBarViewModel, + val bgExecutor: DelayableExecutor + ) : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(bar: SeekBar, progress: Int, fromUser: Boolean) { + if (fromUser) { + bgExecutor.execute { + viewModel.onSeek(progress.toLong()) + } + } + } + override fun onStartTrackingTouch(bar: SeekBar) { + } + override fun onStopTrackingTouch(bar: SeekBar) { + val pos = bar.progress.toLong() + bgExecutor.execute { + viewModel.onSeek(pos) + } + } + } + + private class SeekBarTouchListener : View.OnTouchListener { + override fun onTouch(view: View, event: MotionEvent): Boolean { + view.parent.requestDisallowInterceptTouchEvent(true) + return view.onTouchEvent(event) + } + } + + /** State seen by seek bar UI. */ + data class Progress( + val enabled: Boolean, + val seekAvailable: Boolean, + val elapsedTime: Int?, + val duration: Int?, + val color: Int? + ) +} diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java index d219a9e65a3c..dba43430b490 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java @@ -319,6 +319,7 @@ public class PipAnimationController { getSurfaceTransactionHelper() .crop(tx, leash, getDestinationBounds()) .round(tx, leash, shouldApplyCornerRadius()); + tx.show(leash); tx.apply(); } }; @@ -359,6 +360,7 @@ public class PipAnimationController { getSurfaceTransactionHelper() .alpha(tx, leash, 1f) .round(tx, leash, shouldApplyCornerRadius()); + tx.show(leash); tx.apply(); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index 15c9dbad1680..8cff20ac31f7 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -37,7 +37,6 @@ import android.graphics.Rect; import android.os.Handler; import android.os.IBinder; import android.os.Looper; -import android.os.RemoteException; import android.util.Log; import android.util.Size; import android.view.SurfaceControl; @@ -541,7 +540,12 @@ public class PipTaskOrganizer extends TaskOrganizer { return null; } final ActivityInfo.WindowLayout windowLayout = activityInfo.windowLayout; - return new Size(windowLayout.minWidth, windowLayout.minHeight); + // -1 will be populated if an activity specifies defaultWidth/defaultHeight in <layout> + // without minWidth/minHeight + if (windowLayout.minWidth > 0 && windowLayout.minHeight > 0) { + return new Size(windowLayout.minWidth, windowLayout.minHeight); + } + return null; } private float getAspectRatioOrDefault(@Nullable PictureInPictureParams params) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java index 8922e146cc50..339a408d501a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java @@ -16,11 +16,14 @@ package com.android.systemui.qs; +import static com.android.systemui.util.SysuiLifecycle.viewAttachLifecycle; + import android.app.Notification; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; +import android.media.session.MediaController; import android.media.session.MediaSession; import android.util.Log; import android.view.View; @@ -28,12 +31,16 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.SeekBar; import android.widget.TextView; import com.android.settingslib.media.MediaDevice; import com.android.systemui.R; import com.android.systemui.media.MediaControlPanel; +import com.android.systemui.media.SeekBarObserver; +import com.android.systemui.media.SeekBarViewModel; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.util.concurrency.DelayableExecutor; import java.util.concurrent.Executor; @@ -54,6 +61,9 @@ public class QSMediaPlayer extends MediaControlPanel { }; private final QSPanel mParent; + private final DelayableExecutor mBackgroundExecutor; + private final SeekBarViewModel mSeekBarViewModel; + private final SeekBarObserver mSeekBarObserver; /** * Initialize quick shade version of player @@ -64,10 +74,20 @@ public class QSMediaPlayer extends MediaControlPanel { * @param backgroundExecutor */ public QSMediaPlayer(Context context, ViewGroup parent, NotificationMediaManager manager, - Executor foregroundExecutor, Executor backgroundExecutor) { + Executor foregroundExecutor, DelayableExecutor backgroundExecutor) { super(context, parent, manager, R.layout.qs_media_panel, QS_ACTION_IDS, foregroundExecutor, backgroundExecutor); mParent = (QSPanel) parent; + mBackgroundExecutor = backgroundExecutor; + mSeekBarViewModel = new SeekBarViewModel(backgroundExecutor); + mSeekBarObserver = new SeekBarObserver(getView()); + // Can't use the viewAttachLifecycle of media player because remove/add is used to adjust + // priority of players. As soon as it is removed, the lifecycle will end and the seek bar + // will stop updating. So, use the lifecycle of the parent instead. + mSeekBarViewModel.getProgress().observe(viewAttachLifecycle(parent), mSeekBarObserver); + SeekBar bar = getView().findViewById(R.id.media_progress_bar); + bar.setOnSeekBarChangeListener(mSeekBarViewModel.getSeekBarListener()); + bar.setOnTouchListener(mSeekBarViewModel.getSeekBarTouchListener()); } /** @@ -115,6 +135,11 @@ public class QSMediaPlayer extends MediaControlPanel { thisBtn.setVisibility(View.GONE); } + // Seek Bar + final MediaController controller = new MediaController(getContext(), token); + mBackgroundExecutor.execute( + () -> mSeekBarViewModel.updateController(controller, iconColor)); + // Set up long press menu View guts = mMediaNotifView.findViewById(R.id.media_guts); View options = mMediaNotifView.findViewById(R.id.qs_media_controls_options); @@ -155,4 +180,16 @@ public class QSMediaPlayer extends MediaControlPanel { return true; // consumed click }); } + + /** + * Sets the listening state of the player. + * + * Should be set to true when the QS panel is open. Otherwise, false. This is a signal to avoid + * unnecessary work when the QS panel is closed. + * + * @param listening True when player should be active. Otherwise, false. + */ + public void setListening(boolean listening) { + mSeekBarViewModel.setListening(listening); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 33cc086a8d9f..c8412fffd143 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -69,6 +69,7 @@ import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.BrightnessMirrorController.BrightnessMirrorListener; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; +import com.android.systemui.util.concurrency.DelayableExecutor; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -103,7 +104,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne private final NotificationMediaManager mNotificationMediaManager; private final LocalBluetoothManager mLocalBluetoothManager; private final Executor mForegroundExecutor; - private final Executor mBackgroundExecutor; + private final DelayableExecutor mBackgroundExecutor; private LocalMediaManager mLocalMediaManager; private MediaDevice mDevice; private boolean mUpdateCarousel = false; @@ -166,7 +167,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne QSLogger qsLogger, NotificationMediaManager notificationMediaManager, @Main Executor foregroundExecutor, - @Background Executor backgroundExecutor, + @Background DelayableExecutor backgroundExecutor, @Nullable LocalBluetoothManager localBluetoothManager ) { super(context, attrs); @@ -278,7 +279,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne Log.d(TAG, "creating new player"); player = new QSMediaPlayer(mContext, this, mNotificationMediaManager, mForegroundExecutor, mBackgroundExecutor); - + player.setListening(mListening); if (player.isPlaying()) { mMediaCarousel.addView(player.getView(), 0, lp); // add in front } else { @@ -584,6 +585,9 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne if (mListening) { refreshAllTiles(); } + for (QSMediaPlayer player : mMediaPlayers) { + player.setListening(mListening); + } } private String getTilesSpecs() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index be01d75552de..8fa64d3aaf0c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -43,6 +43,7 @@ import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; import com.android.systemui.util.Utils; +import com.android.systemui.util.concurrency.DelayableExecutor; import java.util.ArrayList; import java.util.Collection; @@ -81,7 +82,7 @@ public class QuickQSPanel extends QSPanel { QSLogger qsLogger, NotificationMediaManager notificationMediaManager, @Main Executor foregroundExecutor, - @Background Executor backgroundExecutor, + @Background DelayableExecutor backgroundExecutor, @Nullable LocalBluetoothManager localBluetoothManager ) { super(context, attrs, dumpManager, broadcastDispatcher, qsLogger, notificationMediaManager, diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index df85ed524536..66bc177da81d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -55,6 +55,7 @@ import android.os.UserHandle; import android.util.Log; import android.view.InputMonitor; import android.view.MotionEvent; +import android.view.Surface; import android.view.accessibility.AccessibilityManager; import com.android.internal.policy.ScreenDecorationsUtils; @@ -416,6 +417,19 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } } + @Override + public void onQuickSwitchToNewTask(@Surface.Rotation int rotation) { + if (!verifyCaller("onQuickSwitchToNewTask")) { + return; + } + long token = Binder.clearCallingIdentity(); + try { + mHandler.post(() -> notifyQuickSwitchToNewTask(rotation)); + } finally { + Binder.restoreCallingIdentity(token); + } + } + private boolean verifyCaller(String reason) { final int callerId = Binder.getCallingUserHandle().getIdentifier(); if (callerId != mCurrentBoundedUserId) { @@ -785,6 +799,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } } + private void notifyQuickSwitchToNewTask(@Surface.Rotation int rotation) { + for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { + mConnectionCallbacks.get(i).onQuickSwitchToNewTask(rotation); + } + } + public void notifyQuickScrubStarted() { for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { mConnectionCallbacks.get(i).onQuickScrubStarted(); @@ -850,6 +870,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis public interface OverviewProxyListener { default void onConnectionChanged(boolean isConnected) {} default void onQuickStepStarted() {} + default void onQuickSwitchToNewTask(@Surface.Rotation int rotation) {} default void onOverviewShown(boolean fromHome) {} default void onQuickScrubStarted() {} /** Notify changes in the nav bar button alpha */ diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 3879c164a84c..366ef931e1f5 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -21,6 +21,7 @@ import static android.view.PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; +import android.animation.AnimationHandler; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; @@ -32,10 +33,8 @@ import android.graphics.Region.Op; import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.Handler; -import android.os.Message; import android.util.AttributeSet; import android.util.Slog; -import android.view.Choreographer; import android.view.Display; import android.view.InsetsState; import android.view.MotionEvent; @@ -57,12 +56,12 @@ import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import android.widget.FrameLayout; +import com.android.internal.graphics.SfVsyncFrameCallbackProvider; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; import com.android.internal.policy.DockedDividerUtils; -import com.android.internal.view.SurfaceFlingerVsyncChoreographer; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -111,8 +110,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, private static final Interpolator IME_ADJUST_INTERPOLATOR = new PathInterpolator(0.2f, 0f, 0.1f, 1f); - private static final int MSG_RESIZE_STACK = 0; - private DividerHandleView mHandle; private View mBackground; private MinimizedDockShadow mMinimizedShadow; @@ -149,6 +146,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, private SplitDisplayLayout mSplitLayout; private DividerCallbacks mCallback; private final Rect mStableInsets = new Rect(); + private final AnimationHandler mAnimationHandler = new AnimationHandler(); private boolean mGrowRecents; private ValueAnimator mCurrentAnimator; @@ -159,7 +157,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, private boolean mHomeStackResizable; private boolean mAdjustedForIme; private DividerState mState; - private final SurfaceFlingerVsyncChoreographer mSfChoreographer; private SplitScreenTaskOrganizer mTiles; boolean mFirstLayout = true; @@ -173,18 +170,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, // used interact with keyguard. private boolean mSurfaceHidden = false; - private final Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_RESIZE_STACK: - resizeStackSurfaces(msg.arg1, msg.arg2, (SnapTarget) msg.obj); - break; - default: - super.handleMessage(msg); - } - } - }; + private final Handler mHandler = new Handler(); private final AccessibilityDelegate mHandleDelegate = new AccessibilityDelegate() { @Override @@ -277,11 +263,10 @@ public class DividerView extends FrameLayout implements OnTouchListener, public DividerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - mSfChoreographer = new SurfaceFlingerVsyncChoreographer(mHandler, context.getDisplay(), - Choreographer.getInstance()); final DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY); + mAnimationHandler.setProvider(new SfVsyncFrameCallbackProvider()); } @Override @@ -326,7 +311,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, void onDividerRemoved() { mRemoved = true; mCallback = null; - mHandler.removeMessages(MSG_RESIZE_STACK); } @Override @@ -548,7 +532,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, if (mMoving && mDockSide != WindowManager.DOCKED_INVALID) { SnapTarget snapTarget = getSnapAlgorithm().calculateSnapTarget( mStartPosition, 0 /* velocity */, false /* hardDismiss */); - resizeStackDelayed(calculatePosition(x, y), mStartPosition, snapTarget); + resizeStackSurfaces(calculatePosition(x, y), mStartPosition, snapTarget); } break; case MotionEvent.ACTION_UP: @@ -633,7 +617,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, if (DEBUG) Slog.d(TAG, "Getting fling " + position + "->" + snapTarget.position); final boolean taskPositionSameAtEnd = snapTarget.flag == SnapTarget.FLAG_NONE; ValueAnimator anim = ValueAnimator.ofInt(position, snapTarget.position); - anim.addUpdateListener(animation -> resizeStackDelayed((int) animation.getAnimatedValue(), + anim.addUpdateListener(animation -> resizeStackSurfaces((int) animation.getAnimatedValue(), taskPositionSameAtEnd && animation.getAnimatedFraction() == 1f ? TASK_POSITION_SAME : snapTarget.taskPosition, @@ -682,7 +666,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, @Override public void onAnimationCancel(Animator animation) { - mHandler.removeMessages(MSG_RESIZE_STACK); mCancelled = true; } @@ -693,8 +676,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, delay = endDelay; } else if (mCancelled) { delay = 0; - } else if (mSfChoreographer.getSurfaceFlingerOffsetMs() > 0) { - delay = mSfChoreographer.getSurfaceFlingerOffsetMs(); } if (delay == 0) { endAction.accept(mCancelled); @@ -705,6 +686,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, } } }); + anim.setAnimationHandler(mAnimationHandler); mCurrentAnimator = anim; return anim; } @@ -1047,13 +1029,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, mDividerSize); } - public void resizeStackDelayed(int position, int taskPosition, SnapTarget taskSnapTarget) { - Message message = mHandler.obtainMessage(MSG_RESIZE_STACK, position, taskPosition, - taskSnapTarget); - message.setAsynchronous(true); - mSfChoreographer.scheduleAtSfVsync(mHandler, message); - } - private void resizeStackSurfaces(SnapTarget taskSnapTarget) { resizeStackSurfaces(taskSnapTarget.position, taskSnapTarget.position, taskSnapTarget); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index fe2f1f3eefc5..1297f996b743 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -177,12 +177,32 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle currentUserId); ent.setSensitive(sensitive, deviceSensitive); ent.getRow().setNeedsRedaction(needsRedaction); - if (mGroupManager.isChildInGroupWithSummary(ent.getSbn())) { - NotificationEntry summary = mGroupManager.getGroupSummary(ent.getSbn()); - List<NotificationEntry> orderedChildren = mTmpChildOrderMap.get(summary); + boolean isChildInGroup = mGroupManager.isChildInGroupWithSummary(ent.getSbn()); + + boolean groupChangesAllowed = mVisualStabilityManager.areGroupChangesAllowed() + || !ent.hasFinishedInitialization(); + NotificationEntry parent = mGroupManager.getGroupSummary(ent.getSbn()); + if (!groupChangesAllowed) { + // We don't to change groups while the user is looking at them + boolean wasChildInGroup = ent.isChildInGroup(); + if (isChildInGroup && !wasChildInGroup) { + isChildInGroup = wasChildInGroup; + mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager); + } else if (!isChildInGroup && wasChildInGroup) { + // We allow grouping changes if the group was collapsed + if (mGroupManager.isLogicalGroupExpanded(ent.getSbn())) { + isChildInGroup = wasChildInGroup; + parent = ent.getRow().getNotificationParent().getEntry(); + mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager); + } + } + } + + if (isChildInGroup) { + List<NotificationEntry> orderedChildren = mTmpChildOrderMap.get(parent); if (orderedChildren == null) { orderedChildren = new ArrayList<>(); - mTmpChildOrderMap.put(summary, orderedChildren); + mTmpChildOrderMap.put(parent, orderedChildren); } orderedChildren.add(ent); } else { @@ -205,7 +225,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle } for (ExpandableNotificationRow viewToRemove : viewsToRemove) { - if (mGroupManager.isChildInGroupWithSummary(viewToRemove.getEntry().getSbn())) { + if (mEntryManager.getPendingOrActiveNotif(viewToRemove.getEntry().getKey()) != null) { // we are only transferring this notification to its parent, don't generate an // animation mListContainer.setChildTransferInProgress(true); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt index 7ef1d0eba3f1..1696f0715865 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt @@ -26,6 +26,7 @@ import com.android.internal.widget.ConversationLayout import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotificationContentView +import com.android.systemui.statusbar.phone.NotificationGroupManager import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject import javax.inject.Singleton @@ -60,6 +61,7 @@ class ConversationNotificationProcessor @Inject constructor( @Singleton class ConversationNotificationManager @Inject constructor( private val notificationEntryManager: NotificationEntryManager, + private val notificationGroupManager: NotificationGroupManager, private val context: Context ) { // Need this state to be thread safe, since it's accessed from the ui thread @@ -81,10 +83,19 @@ class ConversationNotificationManager @Inject constructor( if (rankingMap.getRanking(entry.sbn.key, ranking) && ranking.isConversation) { val important = ranking.channel.isImportantConversation + var changed = false entry.row?.layouts?.asSequence() ?.flatMap(::getLayouts) ?.mapNotNull { it as? ConversationLayout } - ?.forEach { it.setIsImportantConversation(important) } + ?.forEach { + if (important != it.isImportantConversation) { + it.setIsImportantConversation(important) + changed = true + } + } + if (changed) { + notificationGroupManager.updateIsolation(entry) + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index 77376e595819..295adae9c9ee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -252,7 +252,7 @@ public class NotificationEntryManager implements } @Override - public void onReorderingAllowed() { + public void onChangeAllowed() { updateNotifications("reordering is now allowed"); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java index b357ada7bcf1..7ac59954cb57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java @@ -42,12 +42,14 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl private static final long TEMPORARY_REORDERING_ALLOWED_DURATION = 1000; - private final ArrayList<Callback> mCallbacks = new ArrayList<>(); + private final ArrayList<Callback> mReorderingAllowedCallbacks = new ArrayList<>(); + private final ArrayList<Callback> mGroupChangesAllowedCallbacks = new ArrayList<>(); private final Handler mHandler; private boolean mPanelExpanded; private boolean mScreenOn; private boolean mReorderingAllowed; + private boolean mGroupChangedAllowed; private boolean mIsTemporaryReorderingAllowed; private long mTemporaryReorderingStart; private VisibilityLocationProvider mVisibilityLocationProvider; @@ -83,13 +85,22 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl /** * Add a callback to invoke when reordering is allowed again. - * @param callback */ public void addReorderingAllowedCallback(Callback callback) { - if (mCallbacks.contains(callback)) { + if (mReorderingAllowedCallbacks.contains(callback)) { return; } - mCallbacks.add(callback); + mReorderingAllowedCallbacks.add(callback); + } + + /** + * Add a callback to invoke when group changes are allowed again. + */ + public void addGroupChangesAllowedCallback(Callback callback) { + if (mGroupChangesAllowedCallbacks.contains(callback)) { + return; + } + mGroupChangesAllowedCallbacks.add(callback); } /** @@ -97,7 +108,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl */ public void setPanelExpanded(boolean expanded) { mPanelExpanded = expanded; - updateReorderingAllowed(); + updateAllowedStates(); } /** @@ -105,7 +116,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl */ public void setScreenOn(boolean screenOn) { mScreenOn = screenOn; - updateReorderingAllowed(); + updateAllowedStates(); } /** @@ -116,25 +127,30 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl return; } mPulsing = pulsing; - updateReorderingAllowed(); + updateAllowedStates(); } - private void updateReorderingAllowed() { + private void updateAllowedStates() { boolean reorderingAllowed = (!mScreenOn || !mPanelExpanded || mIsTemporaryReorderingAllowed) && !mPulsing; boolean changedToTrue = reorderingAllowed && !mReorderingAllowed; mReorderingAllowed = reorderingAllowed; if (changedToTrue) { - notifyCallbacks(); + notifyChangeAllowed(mReorderingAllowedCallbacks); + } + boolean groupChangesAllowed = (!mScreenOn || !mPanelExpanded) && !mPulsing; + changedToTrue = groupChangesAllowed && !mGroupChangedAllowed; + mGroupChangedAllowed = groupChangesAllowed; + if (changedToTrue) { + notifyChangeAllowed(mGroupChangesAllowedCallbacks); } } - private void notifyCallbacks() { - for (int i = 0; i < mCallbacks.size(); i++) { - Callback callback = mCallbacks.get(i); - callback.onReorderingAllowed(); + private void notifyChangeAllowed(ArrayList<Callback> callbacks) { + for (int i = 0; i < callbacks.size(); i++) { + callbacks.get(i).onChangeAllowed(); } - mCallbacks.clear(); + callbacks.clear(); } /** @@ -145,6 +161,13 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl } /** + * @return whether changes in the grouping should be allowed right now. + */ + public boolean areGroupChangesAllowed() { + return mGroupChangedAllowed; + } + + /** * @return whether a specific notification is allowed to reorder. Certain notifications are * allowed to reorder even if {@link #isReorderingAllowed()} returns false, like newly added * notifications or heads-up notifications that are out of view. @@ -197,12 +220,12 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl mTemporaryReorderingStart = SystemClock.elapsedRealtime(); } mIsTemporaryReorderingAllowed = true; - updateReorderingAllowed(); + updateAllowedStates(); } private final Runnable mOnTemporaryReorderingExpired = () -> { mIsTemporaryReorderingAllowed = false; - updateReorderingAllowed(); + updateAllowedStates(); }; /** @@ -229,9 +252,9 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl public interface Callback { /** - * Called when reordering is allowed again. + * Called when changing is allowed again. */ - void onReorderingAllowed(); + void onChangeAllowed(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index d22564b2a811..dd7be2775209 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -136,7 +136,6 @@ public final class NotificationEntry extends ListEntry { */ public EditedSuggestionInfo editedSuggestionInfo; - private NotificationEntry parent; // our parent (if we're in a group) private ExpandableNotificationRow row; // the outer expanded view private ExpandableNotificationRowController mRowController; @@ -710,7 +709,7 @@ public final class NotificationEntry extends ListEntry { } public boolean isChildInGroup() { - return parent == null; + return row != null && row.isChildInGroup(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt new file mode 100644 index 000000000000..1bac938a9fca --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.notification.collection.coordinator + +import com.android.systemui.statusbar.notification.collection.NotifPipeline +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter +import javax.inject.Inject +import javax.inject.Singleton + +/** + * A coordinator that elevates important conversation notifications + */ +@Singleton +class ConversationCoordinator @Inject constructor() : Coordinator { + + private val notificationPromoter = object : NotifPromoter(TAG) { + override fun shouldPromoteToTopLevel(entry: NotificationEntry): Boolean { + return entry.channel?.isImportantConversation == true + } + } + + override fun attach(pipeline: NotifPipeline) { + pipeline.addPromoter(notificationPromoter) + } + + companion object { + private const val TAG = "ConversationCoordinator" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java index 03c0ae6fde50..2b279bbd553a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java @@ -56,6 +56,7 @@ public class NotifCoordinators implements Dumpable { DeviceProvisionedCoordinator deviceProvisionedCoordinator, BubbleCoordinator bubbleCoordinator, HeadsUpCoordinator headsUpCoordinator, + ConversationCoordinator conversationCoordinator, PreparationCoordinator preparationCoordinator) { dumpManager.registerDumpable(TAG, this); mCoordinators.add(new HideLocallyDismissedNotifsCoordinator()); @@ -66,6 +67,7 @@ public class NotifCoordinators implements Dumpable { mCoordinators.add(deviceProvisionedCoordinator); mCoordinators.add(bubbleCoordinator); if (featureFlags.isNewNotifPipelineRenderingEnabled()) { + mCoordinators.add(conversationCoordinator); mCoordinators.add(headsUpCoordinator); mCoordinators.add(preparationCoordinator); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleNotificationIdentifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleNotificationIdentifier.kt index be3873a5fd77..88cca43fd1a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleNotificationIdentifier.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleNotificationIdentifier.kt @@ -96,7 +96,7 @@ class PeopleNotificationIdentifierImpl @Inject constructor( return TYPE_NON_PERSON } - val childTypes = groupManager.getLogicalChildren(statusBarNotification) + val childTypes = groupManager.getChildren(statusBarNotification) ?.asSequence() ?.map { getPeopleNotificationType(it.sbn, it.ranking) } ?: return TYPE_NON_PERSON diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index 8e2bfb84e2dd..6fc1264d69e2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -20,7 +20,6 @@ import static android.app.Notification.EXTRA_IS_GROUP_CONVERSATION; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; -import static android.provider.Settings.Secure.BUBBLE_IMPORTANT_CONVERSATIONS; import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN; @@ -44,7 +43,6 @@ import android.os.Handler; import android.os.Parcelable; import android.os.RemoteException; import android.os.UserHandle; -import android.provider.Settings; import android.service.notification.StatusBarNotification; import android.text.TextUtils; import android.transition.ChangeBounds; @@ -56,15 +54,12 @@ import android.util.Log; import android.util.Slog; import android.view.View; import android.view.accessibility.AccessibilityEvent; -import android.widget.Button; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.notification.ConversationIconFactory; -import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.notification.VisualStabilityManager; @@ -517,7 +512,6 @@ public class NotificationConversationInfo extends LinearLayout implements bgHandler.post( new UpdateChannelRunnable(mINotificationManager, mPackageName, mAppUid, mSelectedAction, mNotificationChannel)); - mVisualStabilityManager.temporarilyAllowReordering(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java index d38bc9f7a84d..d02037cf61fd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java @@ -20,6 +20,7 @@ import static com.android.systemui.statusbar.notification.stack.NotificationStac import static java.lang.annotation.RetentionPolicy.SOURCE; +import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.LayoutRes; import android.annotation.NonNull; @@ -555,6 +556,12 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section updateSectionBoundaries(); } + void setHeaderForegroundColor(@ColorInt int color) { + mPeopleHubView.setTextColor(color); + mGentleHeader.setForegroundColor(color); + mAlertingHeader.setForegroundColor(color); + } + /** * For now, declare the available notification buckets (sections) here so that other * presentation code can decide what to do based on an entry's buckets diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 823b18660bed..6054b507185e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -33,6 +33,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.TimeAnimator; import android.animation.ValueAnimator; +import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -3865,9 +3866,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd initVelocityTrackerIfNotExists(); mVelocityTracker.addMovement(ev); - final int action = ev.getAction(); + final int action = ev.getActionMasked(); + if (ev.findPointerIndex(mActivePointerId) == -1 && action != MotionEvent.ACTION_DOWN) { + // Incomplete gesture, possibly due to window swap mid-gesture. Ignore until a new + // one starts. + Log.e(TAG, "Invalid pointerId=" + mActivePointerId + " in onTouchEvent " + + MotionEvent.actionToString(ev.getActionMasked())); + return true; + } - switch (action & MotionEvent.ACTION_MASK) { + switch (action) { case MotionEvent.ACTION_DOWN: { if (getChildCount() == 0 || !isInContentBounds(ev)) { return false; @@ -4806,7 +4814,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mUsingLightTheme = lightTheme; Context context = new ContextThemeWrapper(mContext, lightTheme ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI); - final int textColor = Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor); + final @ColorInt int textColor = + Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor); + mSectionsManager.setHeaderForegroundColor(textColor); mFooterView.setTextColor(textColor); mEmptyShadeView.setTextColor(textColor); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/PeopleHubView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/PeopleHubView.kt index bc25c71e4fe5..a1d898fb84b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/PeopleHubView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/PeopleHubView.kt @@ -16,11 +16,13 @@ package com.android.systemui.statusbar.notification.stack +import android.annotation.ColorInt import android.content.Context import android.util.AttributeSet import android.view.View import android.view.ViewGroup import android.widget.ImageView +import android.widget.TextView import com.android.systemui.R import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin import com.android.systemui.statusbar.notification.people.DataListener @@ -31,12 +33,14 @@ class PeopleHubView(context: Context, attrs: AttributeSet) : StackScrollerDecorView(context, attrs), SwipeableView { private lateinit var contents: ViewGroup + private lateinit var label: TextView lateinit var personViewAdapters: Sequence<DataListener<PersonViewModel?>> private set override fun onFinishInflate() { contents = requireViewById(R.id.people_list) + label = requireViewById(R.id.header_label) personViewAdapters = (0 until contents.childCount) .asSequence() // so we can map .mapNotNull { idx -> @@ -49,6 +53,8 @@ class PeopleHubView(context: Context, attrs: AttributeSet) : setVisible(true /* nowVisible */, false /* animate */) } + fun setTextColor(@ColorInt color: Int) = label.setTextColor(color) + override fun findContentView(): View = contents override fun findSecondaryView(): View? = null diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java index a3d8eecdfd68..5777ba120ef0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java @@ -16,9 +16,11 @@ package com.android.systemui.statusbar.notification.stack; +import android.annotation.ColorInt; import android.annotation.Nullable; import android.annotation.StringRes; import android.content.Context; +import android.content.res.ColorStateList; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -124,4 +126,9 @@ public class SectionHeaderView extends StackScrollerDecorView { mLabelTextId = resId; mLabelView.setText(resId); } + + void setForegroundColor(@ColorInt int color) { + mLabelView.setTextColor(color); + mClearAllButton.setImageTintList(ColorStateList.valueOf(color)); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index 8efda213d659..f103bd01fc3f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -19,6 +19,7 @@ import static android.view.Display.INVALID_DISPLAY; import android.content.Context; import android.content.res.Resources; +import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.PointF; @@ -26,10 +27,14 @@ import android.graphics.Region; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; import android.hardware.input.InputManager; +import android.net.Uri; +import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; +import android.os.UserHandle; +import android.provider.Settings; import android.util.Log; import android.view.ISystemGestureExclusionListener; import android.view.InputChannel; @@ -40,6 +45,7 @@ import android.view.InputMonitor; import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.MotionEvent; +import android.view.Surface; import android.view.ViewConfiguration; import android.view.WindowManager; import android.view.WindowManagerGlobal; @@ -53,8 +59,10 @@ import com.android.systemui.plugins.NavigationEdgeBackPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.SysUiStatsLog; +import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.tracing.ProtoTraceable; import com.android.systemui.tracing.ProtoTracer; import com.android.systemui.tracing.nano.EdgeBackGestureHandlerProto; @@ -72,6 +80,8 @@ public class EdgeBackGestureHandler implements DisplayListener, private static final String TAG = "EdgeBackGestureHandler"; private static final int MAX_LONG_PRESS_TIMEOUT = SystemProperties.getInt( "gestures.back_timeout", 250); + private static final String FIXED_ROTATION_TRANSFORM_SETTING_NAME = "fixed_rotation_transform"; + private ISystemGestureExclusionListener mGestureExclusionListener = new ISystemGestureExclusionListener.Stub() { @@ -88,6 +98,33 @@ public class EdgeBackGestureHandler implements DisplayListener, } }; + private OverviewProxyService.OverviewProxyListener mQuickSwitchListener = + new OverviewProxyService.OverviewProxyListener() { + @Override + public void onQuickSwitchToNewTask(@Surface.Rotation int rotation) { + mStartingQuickstepRotation = rotation; + updateDisabledForQuickstep(); + } + }; + + private TaskStackChangeListener mTaskStackChangeListener = new TaskStackChangeListener() { + @Override + public void onRecentTaskListFrozenChanged(boolean frozen) { + if (!frozen) { + mStartingQuickstepRotation = -1; + mDisabledForQuickstep = false; + } + } + }; + + private final ContentObserver mFixedRotationObserver = new ContentObserver( + new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, Uri uri) { + updatedFixedRotation(); + } + }; + private final Context mContext; private final OverviewProxyService mOverviewProxyService; private PluginManager mPluginManager; @@ -110,6 +147,11 @@ public class EdgeBackGestureHandler implements DisplayListener, private final float mTouchSlop; // Duration after which we consider the event as longpress. private final int mLongPressTimeout; + private int mStartingQuickstepRotation = -1; + // We temporarily disable back gesture when user is quickswitching + // between apps of different orientations + private boolean mDisabledForQuickstep; + private boolean mFixedRotationFlagEnabled; private final PointF mDownPoint = new PointF(); private final PointF mEndPoint = new PointF(); @@ -193,6 +235,13 @@ public class EdgeBackGestureHandler implements DisplayListener, */ public void onNavBarAttached() { mIsAttached = true; + updatedFixedRotation(); + if (mFixedRotationFlagEnabled) { + setRotationCallbacks(true); + } + mContext.getContentResolver().registerContentObserver( + Settings.Global.getUriFor(FIXED_ROTATION_TRANSFORM_SETTING_NAME), + false /* notifyForDescendants */, mFixedRotationObserver, UserHandle.USER_ALL); updateIsEnabled(); } @@ -201,9 +250,25 @@ public class EdgeBackGestureHandler implements DisplayListener, */ public void onNavBarDetached() { mIsAttached = false; + if (mFixedRotationFlagEnabled) { + setRotationCallbacks(false); + } + mContext.getContentResolver().unregisterContentObserver(mFixedRotationObserver); updateIsEnabled(); } + private void setRotationCallbacks(boolean enable) { + if (enable) { + ActivityManagerWrapper.getInstance().registerTaskStackListener( + mTaskStackChangeListener); + mOverviewProxyService.addCallback(mQuickSwitchListener); + } else { + ActivityManagerWrapper.getInstance().unregisterTaskStackListener( + mTaskStackChangeListener); + mOverviewProxyService.removeCallback(mQuickSwitchListener); + } + } + public void onNavigationModeChanged(int mode, Context currentUserContext) { mIsGesturalModeEnabled = QuickStepContract.isGesturalMode(mode); updateIsEnabled(); @@ -405,7 +470,8 @@ public class EdgeBackGestureHandler implements DisplayListener, mLogGesture = false; mInRejectedExclusion = false; mAllowGesture = !QuickStepContract.isBackGestureDisabled(mSysUiFlags) - && isWithinTouchRegion((int) ev.getX(), (int) ev.getY()); + && isWithinTouchRegion((int) ev.getX(), (int) ev.getY()) + && !mDisabledForQuickstep; if (mAllowGesture) { mEdgeBackPlugin.setIsLeftPanel(mIsOnLeftEdge); mEdgeBackPlugin.onMotionEvent(ev); @@ -466,6 +532,11 @@ public class EdgeBackGestureHandler implements DisplayListener, Dependency.get(ProtoTracer.class).update(); } + private void updateDisabledForQuickstep() { + int rotation = mContext.getResources().getConfiguration().windowConfiguration.getRotation(); + mDisabledForQuickstep = mStartingQuickstepRotation != rotation; + } + @Override public void onDisplayAdded(int displayId) { } @@ -474,6 +545,10 @@ public class EdgeBackGestureHandler implements DisplayListener, @Override public void onDisplayChanged(int displayId) { + if (mStartingQuickstepRotation > -1) { + updateDisabledForQuickstep(); + } + if (displayId == mDisplayId) { updateDisplaySize(); } @@ -502,6 +577,17 @@ public class EdgeBackGestureHandler implements DisplayListener, InputManager.getInstance().injectInputEvent(ev, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } + private void updatedFixedRotation() { + boolean oldFlag = mFixedRotationFlagEnabled; + mFixedRotationFlagEnabled = Settings.Global.getInt(mContext.getContentResolver(), + FIXED_ROTATION_TRANSFORM_SETTING_NAME, 0) != 0; + if (oldFlag == mFixedRotationFlagEnabled) { + return; + } + + setRotationCallbacks(mFixedRotationFlagEnabled); + } + public void setInsets(int leftInset, int rightInset) { mLeftInset = leftInset; mRightInset = rightInset; @@ -514,6 +600,7 @@ public class EdgeBackGestureHandler implements DisplayListener, pw.println("EdgeBackGestureHandler:"); pw.println(" mIsEnabled=" + mIsEnabled); pw.println(" mAllowGesture=" + mAllowGesture); + pw.println(" mDisabledForQuickstep=" + mDisabledForQuickstep); pw.println(" mInRejectedExclusion" + mInRejectedExclusion); pw.println(" mExcludeRegion=" + mExcludeRegion); pw.println(" mUnrestrictedExcludeRegion=" + mUnrestrictedExcludeRegion); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index 63fe7005e703..6b0df95f54dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -337,7 +337,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, // VisualStabilityManager.Callback overrides: @Override - public void onReorderingAllowed() { + public void onChangeAllowed() { mAnimationStateHandler.setHeadsUpGoingAwayAnimationsAllowed(false); for (NotificationEntry entry : mEntriesToRemoveWhenReorderingAllowed) { if (isAlerting(entry.getKey())) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 6fd3bb2c8222..4462c7218a76 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -26,6 +26,7 @@ import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_FORCE_OPAQUE; import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; @@ -56,6 +57,8 @@ import android.content.IntentFilter; import android.content.res.Configuration; import android.database.ContentObserver; import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.hardware.display.DisplayManager; import android.inputmethodservice.InputMethodService; import android.net.Uri; import android.os.Binder; @@ -71,6 +74,7 @@ import android.telecom.TelecomManager; import android.text.TextUtils; import android.util.Log; import android.view.Display; +import android.view.Gravity; import android.view.InsetsState.InternalInsetsType; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -104,6 +108,7 @@ import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; +import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.CommandQueue; @@ -133,7 +138,7 @@ import dagger.Lazy; * on clicks and view states of the nav bar. */ public class NavigationBarFragment extends LifecycleFragment implements Callbacks, - NavigationModeController.ModeChangedListener { + NavigationModeController.ModeChangedListener, DisplayManager.DisplayListener { public static final String TAG = "NavigationBar"; private static final boolean DEBUG = false; @@ -141,6 +146,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private static final String EXTRA_DISABLE2_STATE = "disabled2_state"; private static final String EXTRA_APPEARANCE = "appearance"; private static final String EXTRA_TRANSIENT_STATE = "transient_state"; + private static final String FIXED_ROTATION_TRANSFORM_SETTING_NAME = "fixed_rotation_transform"; + /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; @@ -199,6 +206,23 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private boolean mIsOnDefaultDisplay; public boolean mHomeBlockedThisTouch; + /** + * When user is QuickSwitching between apps of different orientations, we'll draw a fake + * home handle on the orientation they originally touched down to start their swipe + * gesture to indicate to them that they can continue in that orientation without having to + * rotate the phone + * The secondary handle will show when we get + * {@link OverviewProxyListener#onQuickSwitchToNewTask(int)} callback with the + * original handle hidden and we'll flip the visibilities once the + * {@link #mTasksFrozenListener} fires + */ + private NavigationHandle mOrientationHandle; + private WindowManager.LayoutParams mOrientationParams; + private boolean mFrozenTasks; + private int mStartingQuickSwitchRotation; + private int mCurrentRotation; + private boolean mFixedRotationEnabled; + /** Only for default display */ @Nullable private AssistHandleViewController mAssistHandlerViewController; @@ -249,6 +273,12 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } @Override + public void onQuickSwitchToNewTask(@Surface.Rotation int rotation) { + mStartingQuickSwitchRotation = rotation; + orientSecondaryHomeHandle(); + } + + @Override public void startAssistant(Bundle bundle) { mAssistManager.startAssist(bundle); } @@ -271,6 +301,22 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } }; + private TaskStackChangeListener mTasksFrozenListener = new TaskStackChangeListener() { + @Override + public void onRecentTaskListFrozenChanged(boolean frozen) { + mFrozenTasks = frozen; + orientSecondaryHomeHandle(); + } + }; + + private NavigationBarTransitions.DarkIntensityListener mOrientationHandleIntensityListener = + new NavigationBarTransitions.DarkIntensityListener() { + @Override + public void onDarkIntensity(float darkIntensity) { + mOrientationHandle.setDarkIntensity(darkIntensity); + } + }; + private final ContextButtonListener mRotationButtonListener = (button, visible) -> { if (visible) { // If the button will actually become visible and the navbar is about to hide, @@ -294,6 +340,14 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } }; + private final ContentObserver mFixedRotationObserver = new ContentObserver( + new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, Uri uri) { + updatedFixedRotation(); + } + }; + private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = new DeviceConfig.OnPropertiesChangedListener() { @Override @@ -351,6 +405,10 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback Settings.Secure.getUriFor(Settings.Secure.ASSISTANT), false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL); + mContentResolver.registerContentObserver( + Settings.Global.getUriFor(FIXED_ROTATION_TRANSFORM_SETTING_NAME), + false /* notifyForDescendants */, mFixedRotationObserver, UserHandle.USER_ALL); + if (savedInstanceState != null) { mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0); mDisabledFlags2 = savedInstanceState.getInt(EXTRA_DISABLE2_STATE, 0); @@ -376,6 +434,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mNavigationModeController.removeListener(this); mAccessibilityManagerWrapper.removeCallback(mAccessibilityListener); mContentResolver.unregisterContentObserver(mAssistContentObserver); + mContentResolver.unregisterContentObserver(mFixedRotationObserver); DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); } @@ -406,6 +465,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } mNavigationBarView.setNavigationIconHints(mNavigationIconHints); mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); + updatedFixedRotation(); prepareNavigationBarView(); checkNavBarModes(); @@ -442,6 +502,9 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback new AssistHandleViewController(mHandler, mNavigationBarView); getBarTransitions().addDarkIntensityListener(mAssistHandlerViewController); } + + initSecondaryHomeHandleForRotation(); + ActivityManagerWrapper.getInstance().registerTaskStackListener(mTasksFrozenListener); } @Override @@ -458,6 +521,13 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } mOverviewProxyService.removeCallback(mOverviewProxyListener); mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver); + ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTasksFrozenListener); + if (mOrientationHandle != null) { + resetSecondaryHandle(); + getContext().getSystemService(DisplayManager.class).unregisterDisplayListener(this); + getBarTransitions().removeDarkIntensityListener(mOrientationHandleIntensityListener); + mWindowManager.removeView(mOrientationHandle); + } } @Override @@ -490,6 +560,88 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback repositionNavigationBar(); } + private void initSecondaryHomeHandleForRotation() { + if (!canShowSecondaryHandle()) { + return; + } + + getContext().getSystemService(DisplayManager.class) + .registerDisplayListener(this, new Handler(Looper.getMainLooper())); + + mOrientationHandle = new VerticalNavigationHandle(getContext()); + + getBarTransitions().addDarkIntensityListener(mOrientationHandleIntensityListener); + mOrientationParams = new WindowManager.LayoutParams(0, 0, + WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH + | WindowManager.LayoutParams.FLAG_SLIPPERY, + PixelFormat.TRANSLUCENT); + mWindowManager.addView(mOrientationHandle, mOrientationParams); + mOrientationHandle.setVisibility(View.GONE); + } + + private void orientSecondaryHomeHandle() { + if (!canShowSecondaryHandle()) { + return; + } + + if (!mFrozenTasks) { + resetSecondaryHandle(); + } else { + int deltaRotation = deltaRotation(mCurrentRotation, mStartingQuickSwitchRotation); + int height = 0; + int width = 0; + Rect dispSize = mWindowManager.getCurrentWindowMetrics().getBounds(); + switch (deltaRotation) { + case Surface.ROTATION_90: + case Surface.ROTATION_270: + height = dispSize.height(); + width = getResources() + .getDimensionPixelSize(R.dimen.navigation_bar_height); + break; + case Surface.ROTATION_180: + case Surface.ROTATION_0: + // TODO(b/152683657): Need to determine best UX for this + resetSecondaryHandle(); + return; + } + + mOrientationParams.gravity = + deltaRotation == Surface.ROTATION_90 ? Gravity.LEFT : Gravity.RIGHT; + mOrientationParams.height = height; + mOrientationParams.width = width; + mWindowManager.updateViewLayout(mOrientationHandle, mOrientationParams); + mNavigationBarView.setVisibility(View.GONE); + mOrientationHandle.setVisibility(View.VISIBLE); + } + } + + private void resetSecondaryHandle() { + if (mOrientationHandle != null) { + // Case where nav mode is changed w/o ever invoking a quickstep + // mOrientedHandle is initialized lazily + mOrientationHandle.setVisibility(View.GONE); + } + mNavigationBarView.setVisibility(View.VISIBLE); + } + + private int deltaRotation(int oldRotation, int newRotation) { + int delta = newRotation - oldRotation; + if (delta < 0) delta += 4; + return delta; + } + + private void updatedFixedRotation() { + mFixedRotationEnabled = Settings.Global.getInt(getContext().getContentResolver(), + FIXED_ROTATION_TRANSFORM_SETTING_NAME, 0) != 0; + if (!canShowSecondaryHandle()) { + resetSecondaryHandle(); + } + } + @Override public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) { if (mNavigationBarView != null) { @@ -1112,6 +1264,10 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mNavBarMode = mode; updateScreenPinningGestures(); + if (!canShowSecondaryHandle()) { + resetSecondaryHandle(); + } + // Workaround for b/132825155, for secondary users, we currently don't receive configuration // changes on overlay package change since SystemUI runs for the system user. In this case, // trigger a new configuration change to ensure that the nav bar is updated in the same way. @@ -1156,6 +1312,34 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private final AccessibilityServicesStateChangeListener mAccessibilityListener = this::updateAccessibilityServicesState; + @Override + public void onDisplayAdded(int displayId) { + + } + + @Override + public void onDisplayRemoved(int displayId) { + + } + + @Override + public void onDisplayChanged(int displayId) { + if (!canShowSecondaryHandle()) { + return; + } + + int rotation = getContext().getResources().getConfiguration() + .windowConfiguration.getRotation(); + if (rotation != mCurrentRotation) { + mCurrentRotation = rotation; + orientSecondaryHomeHandle(); + } + } + + private boolean canShowSecondaryHandle() { + return mFixedRotationEnabled && mNavBarMode == NAV_BAR_MODE_GESTURAL; + } + private final Consumer<Integer> mRotationWatcher = rotation -> { if (mNavigationBarView != null && mNavigationBarView.needsReorient(rotation)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java index abceb11b36e9..b87479505d00 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java @@ -32,11 +32,11 @@ import com.android.systemui.R; public class NavigationHandle extends View implements ButtonInterface { - private final Paint mPaint = new Paint(); + protected final Paint mPaint = new Paint(); private @ColorInt final int mLightColor; private @ColorInt final int mDarkColor; - private final int mRadius; - private final int mBottom; + protected final int mRadius; + protected final int mBottom; private boolean mRequiresInvalidate; public NavigationHandle(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index ccf670708e44..84dd48b6eb6b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import android.annotation.Nullable; +import android.app.NotificationChannel; import android.service.notification.StatusBarNotification; import android.util.ArraySet; import android.util.Log; @@ -85,6 +86,17 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State return group.expanded; } + /** + * @return if the group that this notification is associated with logically is expanded + */ + public boolean isLogicalGroupExpanded(StatusBarNotification sbn) { + NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); + if (group == null) { + return false; + } + return group.expanded; + } + public void setGroupExpanded(StatusBarNotification sbn, boolean expanded) { NotificationGroup group = mGroupMap.get(getGroupKey(sbn)); if (group == null) { @@ -147,7 +159,15 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State } } + /** + * Notify the group manager that a new entry was added + */ public void onEntryAdded(final NotificationEntry added) { + updateIsolation(added); + onEntryAddedInternal(added); + } + + private void onEntryAddedInternal(final NotificationEntry added) { if (added.isRowRemoved()) { added.setDebugThrowable(new Throwable()); } @@ -193,9 +213,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State } private void onEntryBecomingChild(NotificationEntry entry) { - if (shouldIsolate(entry)) { - isolateNotification(entry); - } + updateIsolation(entry); } private void updateSuppression(NotificationGroup group) { @@ -242,15 +260,6 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State return count; } - private NotificationEntry getIsolatedChild(String groupKey) { - for (StatusBarNotification sbn : mIsolatedEntries.values()) { - if (sbn.getGroupKey().equals(groupKey) && isIsolated(sbn.getKey())) { - return mGroupMap.get(sbn.getKey()).summary; - } - } - return null; - } - /** * Update an entry's group information * @param entry notification entry to update @@ -278,7 +287,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State if (mGroupMap.get(getGroupKey(entry.getKey(), oldGroupKey)) != null) { onEntryRemovedInternal(entry, oldGroupKey, oldIsGroup, oldIsGroupSummary); } - onEntryAdded(entry); + onEntryAddedInternal(entry); mIsUpdatingUnchangedGroup = false; if (isIsolated(entry.getSbn().getKey())) { mIsolatedEntries.put(entry.getKey(), entry.getSbn()); @@ -413,14 +422,29 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State return null; } ArrayList<NotificationEntry> children = new ArrayList<>(group.children.values()); - NotificationEntry isolatedChild = getIsolatedChild(summary.getGroupKey()); - if (isolatedChild != null) { - children.add(isolatedChild); + for (StatusBarNotification sbn : mIsolatedEntries.values()) { + if (sbn.getGroupKey().equals(summary.getGroupKey())) { + children.add(mGroupMap.get(sbn.getKey()).summary); + } } return children; } /** + * Get the children that are in the summary's group, not including those isolated. + * + * @param summary summary of a group + * @return list of the children + */ + public @Nullable ArrayList<NotificationEntry> getChildren(StatusBarNotification summary) { + NotificationGroup group = mGroupMap.get(summary.getGroupKey()); + if (group == null) { + return null; + } + return new ArrayList<>(group.children.values()); + } + + /** * If there is a {@link NotificationGroup} associated with the provided entry, this method * will update the suppression of that group. */ @@ -495,17 +519,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { - onAlertStateChanged(entry, isHeadsUp); - } - - private void onAlertStateChanged(NotificationEntry entry, boolean isAlerting) { - if (isAlerting) { - if (shouldIsolate(entry)) { - isolateNotification(entry); - } - } else { - stopIsolatingNotification(entry); - } + updateIsolation(entry); } /** @@ -519,13 +533,17 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State private boolean shouldIsolate(NotificationEntry entry) { StatusBarNotification sbn = entry.getSbn(); - NotificationGroup notificationGroup = mGroupMap.get(sbn.getGroupKey()); if (!sbn.isGroup() || sbn.getNotification().isGroupSummary()) { return false; } + NotificationChannel channel = entry.getChannel(); + if (channel != null && channel.isImportantConversation()) { + return true; + } if (mHeadsUpManager != null && !mHeadsUpManager.isAlerting(entry.getKey())) { return false; } + NotificationGroup notificationGroup = mGroupMap.get(sbn.getGroupKey()); return (sbn.getNotification().fullScreenIntent != null || notificationGroup == null || !notificationGroup.expanded @@ -545,7 +563,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State mIsolatedEntries.put(sbn.getKey(), sbn); - onEntryAdded(entry); + onEntryAddedInternal(entry); // We also need to update the suppression of the old group, because this call comes // even before the groupManager knows about the notification at all. // When the notification gets added afterwards it is already isolated and therefore @@ -557,17 +575,31 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State } /** + * Update the isolation of an entry, splitting it from the group. + */ + public void updateIsolation(NotificationEntry entry) { + boolean isIsolated = isIsolated(entry.getSbn().getKey()); + if (shouldIsolate(entry)) { + if (!isIsolated) { + isolateNotification(entry); + } + } else if (isIsolated) { + stopIsolatingNotification(entry); + } + } + + /** * Stop isolating a notification and re-group it with its original logical group. * * @param entry the notification to un-isolate */ private void stopIsolatingNotification(NotificationEntry entry) { StatusBarNotification sbn = entry.getSbn(); - if (mIsolatedEntries.containsKey(sbn.getKey())) { + if (isIsolated(sbn.getKey())) { // not isolated anymore, we need to update the groups onEntryRemovedInternal(entry, entry.getSbn()); mIsolatedEntries.remove(sbn.getKey()); - onEntryAdded(entry); + onEntryAddedInternal(entry); for (OnGroupChangeListener listener : mListeners) { listener.onGroupsChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/VerticalNavigationHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/VerticalNavigationHandle.java new file mode 100644 index 000000000000..a15ca9532a88 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/VerticalNavigationHandle.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import android.content.Context; +import android.graphics.Canvas; + +import com.android.systemui.R; + +/** Temporarily shown view when using QuickSwitch to switch between apps of different rotations */ +public class VerticalNavigationHandle extends NavigationHandle { + private final int mWidth; + + public VerticalNavigationHandle(Context context) { + super(context); + mWidth = context.getResources().getDimensionPixelSize(R.dimen.navigation_home_handle_width); + } + + @Override + protected void onDraw(Canvas canvas) { + int left; + int top; + int bottom; + int right; + + int radiusOffset = mRadius * 2; + right = getWidth() - mBottom; + top = getHeight() / 2 - (mWidth / 2); /* (height of screen / 2) - (height of bar / 2) */ + left = getWidth() - mBottom - radiusOffset; + bottom = getHeight() / 2 + (mWidth / 2); + canvas.drawRoundRect(left, top, right, bottom, mRadius, mRadius, mPaint); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/util/SysuiLifecycle.java b/packages/SystemUI/src/com/android/systemui/util/SysuiLifecycle.java index 711a0dfe1931..d73175310802 100644 --- a/packages/SystemUI/src/com/android/systemui/util/SysuiLifecycle.java +++ b/packages/SystemUI/src/com/android/systemui/util/SysuiLifecycle.java @@ -48,6 +48,9 @@ public class SysuiLifecycle { ViewLifecycle(View v) { v.addOnAttachStateChangeListener(this); + if (v.isAttachedToWindow()) { + mLifecycle.markState(RESUMED); + } } @NonNull diff --git a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java index 381ccdb50386..1140b9aa3abb 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java +++ b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java @@ -194,7 +194,9 @@ public class SystemWindows { return; } final Display display = mDisplayController.getDisplay(mDisplayId); - SurfaceControlViewHost viewRoot = new SurfaceControlViewHost(mContext, display, wwm); + SurfaceControlViewHost viewRoot = + new SurfaceControlViewHost(mContext, display, wwm, + true /* useSfChoreographer */); attrs.flags |= FLAG_HARDWARE_ACCELERATED; viewRoot.setView(view, attrs); mViewRoots.put(view, viewRoot); diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java new file mode 100644 index 000000000000..137a126f539d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.globalactions; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.app.IActivityManager; +import android.app.admin.DevicePolicyManager; +import android.app.trust.TrustManager; +import android.content.ContentResolver; +import android.content.res.Resources; +import android.media.AudioManager; +import android.net.ConnectivityManager; +import android.os.UserManager; +import android.service.dreams.IDreamManager; +import android.telephony.TelephonyManager; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.view.IWindowManager; + +import androidx.test.filters.SmallTest; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEventLogger; +import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.widget.LockPatternUtils; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.colorextraction.SysuiColorExtractor; +import com.android.systemui.controls.controller.ControlsController; +import com.android.systemui.controls.management.ControlsListingController; +import com.android.systemui.controls.ui.ControlsUiController; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.GlobalActions; +import com.android.systemui.statusbar.BlurUtils; +import com.android.systemui.statusbar.NotificationShadeDepthController; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; +import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.KeyguardStateController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.concurrent.Executor; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +public class GlobalActionsDialogTest extends SysuiTestCase { + private GlobalActionsDialog mGlobalActionsDialog; + + @Mock private GlobalActions.GlobalActionsManager mWindowManagerFuncs; + @Mock private AudioManager mAudioManager; + @Mock private IDreamManager mDreamManager; + @Mock private DevicePolicyManager mDevicePolicyManager; + @Mock private LockPatternUtils mLockPatternUtils; + @Mock private BroadcastDispatcher mBroadcastDispatcher; + @Mock private ConnectivityManager mConnectivityManager; + @Mock private TelephonyManager mTelephonyManager; + @Mock private ContentResolver mContentResolver; + @Mock private Resources mResources; + @Mock private ConfigurationController mConfigurationController; + @Mock private ActivityStarter mActivityStarter; + @Mock private KeyguardStateController mKeyguardStateController; + @Mock private UserManager mUserManager; + @Mock private TrustManager mTrustManager; + @Mock private IActivityManager mActivityManager; + @Mock private MetricsLogger mMetricsLogger; + @Mock private NotificationShadeDepthController mDepthController; + @Mock private SysuiColorExtractor mColorExtractor; + @Mock private IStatusBarService mStatusBarService; + @Mock private BlurUtils mBlurUtils; + @Mock private NotificationShadeWindowController mNotificationShadeWindowController; + @Mock private ControlsUiController mControlsUiController; + @Mock private IWindowManager mWindowManager; + @Mock private Executor mBackgroundExecutor; + @Mock private ControlsListingController mControlsListingController; + @Mock private ControlsController mControlsController; + @Mock private UiEventLogger mUiEventLogger; + + private TestableLooper mTestableLooper; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mTestableLooper = TestableLooper.get(this); + allowTestableLooperAsMainThread(); + mGlobalActionsDialog = new GlobalActionsDialog(mContext, + mWindowManagerFuncs, + mAudioManager, + mDreamManager, + mDevicePolicyManager, + mLockPatternUtils, + mBroadcastDispatcher, + mConnectivityManager, + mTelephonyManager, + mContentResolver, + null, + mResources, + mConfigurationController, + mActivityStarter, + mKeyguardStateController, + mUserManager, + mTrustManager, + mActivityManager, + null, + mMetricsLogger, + mDepthController, + mColorExtractor, + mStatusBarService, + mBlurUtils, + mNotificationShadeWindowController, + mControlsUiController, + mWindowManager, + mBackgroundExecutor, + mControlsListingController, + mControlsController, + mUiEventLogger + ); + } + @Test + public void testShouldLogVisibility() { + mGlobalActionsDialog.onShow(null); + verify(mUiEventLogger, times(1)) + .log(GlobalActionsDialog.GlobalActionsEvent.GA_POWER_MENU_OPEN); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarObserverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarObserverTest.kt new file mode 100644 index 000000000000..260f52070a70 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarObserverTest.kt @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.media + +import android.graphics.Color +import android.content.res.ColorStateList +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.View +import android.widget.SeekBar +import android.widget.TextView +import androidx.test.filters.SmallTest + +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat + +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.mock +import org.mockito.Mockito.`when` as whenever + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +public class SeekBarObserverTest : SysuiTestCase() { + + private lateinit var observer: SeekBarObserver + @Mock private lateinit var mockView: View + private lateinit var seekBarView: SeekBar + private lateinit var elapsedTimeView: TextView + private lateinit var totalTimeView: TextView + + @Before + fun setUp() { + mockView = mock(View::class.java) + seekBarView = SeekBar(context) + elapsedTimeView = TextView(context) + totalTimeView = TextView(context) + whenever<SeekBar>( + mockView.findViewById(R.id.media_progress_bar)).thenReturn(seekBarView) + whenever<TextView>( + mockView.findViewById(R.id.media_elapsed_time)).thenReturn(elapsedTimeView) + whenever<TextView>(mockView.findViewById(R.id.media_total_time)).thenReturn(totalTimeView) + observer = SeekBarObserver(mockView) + } + + @Test + fun seekBarGone() { + // WHEN seek bar is disabled + val isEnabled = false + val data = SeekBarViewModel.Progress(isEnabled, false, null, null, null) + observer.onChanged(data) + // THEN seek bar visibility is set to GONE + assertThat(seekBarView.getVisibility()).isEqualTo(View.GONE) + assertThat(elapsedTimeView.getVisibility()).isEqualTo(View.GONE) + assertThat(totalTimeView.getVisibility()).isEqualTo(View.GONE) + } + + @Test + fun seekBarVisible() { + // WHEN seek bar is enabled + val isEnabled = true + val data = SeekBarViewModel.Progress(isEnabled, true, 3000, 12000, -1) + observer.onChanged(data) + // THEN seek bar is visible + assertThat(seekBarView.getVisibility()).isEqualTo(View.VISIBLE) + assertThat(elapsedTimeView.getVisibility()).isEqualTo(View.VISIBLE) + assertThat(totalTimeView.getVisibility()).isEqualTo(View.VISIBLE) + } + + @Test + fun seekBarProgress() { + // WHEN seek bar progress is about half + val data = SeekBarViewModel.Progress(true, true, 3000, 120000, -1) + observer.onChanged(data) + // THEN seek bar is visible + assertThat(seekBarView.progress).isEqualTo(100) + assertThat(seekBarView.max).isEqualTo(120000) + assertThat(elapsedTimeView.getText()).isEqualTo("00:03") + assertThat(totalTimeView.getText()).isEqualTo("02:00") + } + + @Test + fun seekBarDisabledWhenSeekNotAvailable() { + // WHEN seek is not available + val isSeekAvailable = false + val data = SeekBarViewModel.Progress(true, isSeekAvailable, 3000, 120000, -1) + observer.onChanged(data) + // THEN seek bar is not enabled + assertThat(seekBarView.isEnabled()).isFalse() + } + + @Test + fun seekBarEnabledWhenSeekNotAvailable() { + // WHEN seek is available + val isSeekAvailable = true + val data = SeekBarViewModel.Progress(true, isSeekAvailable, 3000, 120000, -1) + observer.onChanged(data) + // THEN seek bar is not enabled + assertThat(seekBarView.isEnabled()).isTrue() + } + + @Test + fun seekBarColor() { + // WHEN data included color + val data = SeekBarViewModel.Progress(true, true, 3000, 120000, Color.RED) + observer.onChanged(data) + // THEN seek bar is colored + val red = ColorStateList.valueOf(Color.RED) + assertThat(elapsedTimeView.getTextColors()).isEqualTo(red) + assertThat(totalTimeView.getTextColors()).isEqualTo(red) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt new file mode 100644 index 000000000000..f316d0480fac --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt @@ -0,0 +1,375 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.media + +import android.graphics.Color +import android.media.MediaMetadata +import android.media.session.MediaController +import android.media.session.PlaybackState +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.widget.SeekBar +import androidx.arch.core.executor.ArchTaskExecutor +import androidx.arch.core.executor.TaskExecutor +import androidx.test.filters.SmallTest + +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.time.FakeSystemClock +import com.google.common.truth.Truth.assertThat + +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` as whenever + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +public class SeekBarViewModelTest : SysuiTestCase() { + + private lateinit var viewModel: SeekBarViewModel + private lateinit var fakeExecutor: FakeExecutor + private val taskExecutor: TaskExecutor = object : TaskExecutor() { + override fun executeOnDiskIO(runnable: Runnable) { + runnable.run() + } + override fun postToMainThread(runnable: Runnable) { + runnable.run() + } + override fun isMainThread(): Boolean { + return true + } + } + @Mock private lateinit var mockController: MediaController + @Mock private lateinit var mockTransport: MediaController.TransportControls + + @Before + fun setUp() { + fakeExecutor = FakeExecutor(FakeSystemClock()) + viewModel = SeekBarViewModel(fakeExecutor) + mockController = mock(MediaController::class.java) + mockTransport = mock(MediaController.TransportControls::class.java) + + // LiveData to run synchronously + ArchTaskExecutor.getInstance().setDelegate(taskExecutor) + } + + @After + fun tearDown() { + ArchTaskExecutor.getInstance().setDelegate(null) + } + + @Test + fun updateColor() { + viewModel.updateController(mockController, Color.RED) + assertThat(viewModel.progress.value!!.color).isEqualTo(Color.RED) + } + + @Test + fun updateDuration() { + // GIVEN that the duration is contained within the metadata + val duration = 12000L + val metadata = MediaMetadata.Builder().run { + putLong(MediaMetadata.METADATA_KEY_DURATION, duration) + build() + } + whenever(mockController.getMetadata()).thenReturn(metadata) + // WHEN the controller is updated + viewModel.updateController(mockController, Color.RED) + // THEN the duration is extracted + assertThat(viewModel.progress.value!!.duration).isEqualTo(duration) + assertThat(viewModel.progress.value!!.enabled).isTrue() + } + + @Test + fun updateDurationNegative() { + // GIVEN that the duration is negative + val duration = -1L + val metadata = MediaMetadata.Builder().run { + putLong(MediaMetadata.METADATA_KEY_DURATION, duration) + build() + } + whenever(mockController.getMetadata()).thenReturn(metadata) + // WHEN the controller is updated + viewModel.updateController(mockController, Color.RED) + // THEN the seek bar is disabled + assertThat(viewModel.progress.value!!.enabled).isFalse() + } + + @Test + fun updateDurationZero() { + // GIVEN that the duration is zero + val duration = 0L + val metadata = MediaMetadata.Builder().run { + putLong(MediaMetadata.METADATA_KEY_DURATION, duration) + build() + } + whenever(mockController.getMetadata()).thenReturn(metadata) + // WHEN the controller is updated + viewModel.updateController(mockController, Color.RED) + // THEN the seek bar is disabled + assertThat(viewModel.progress.value!!.enabled).isFalse() + } + + @Test + fun updateElapsedTime() { + // GIVEN that the PlaybackState contins the current position + val position = 200L + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_PLAYING, position, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + // WHEN the controller is updated + viewModel.updateController(mockController, Color.RED) + // THEN elapsed time is captured + assertThat(viewModel.progress.value!!.elapsedTime).isEqualTo(200.toInt()) + } + + @Test + fun updateSeekAvailable() { + // GIVEN that seek is included in actions + val state = PlaybackState.Builder().run { + setActions(PlaybackState.ACTION_SEEK_TO) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + // WHEN the controller is updated + viewModel.updateController(mockController, Color.RED) + // THEN seek is available + assertThat(viewModel.progress.value!!.seekAvailable).isTrue() + } + + @Test + fun updateSeekNotAvailable() { + // GIVEN that seek is not included in actions + val state = PlaybackState.Builder().run { + setActions(PlaybackState.ACTION_PLAY) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + // WHEN the controller is updated + viewModel.updateController(mockController, Color.RED) + // THEN seek is not available + assertThat(viewModel.progress.value!!.seekAvailable).isFalse() + } + + @Test + fun handleSeek() { + whenever(mockController.getTransportControls()).thenReturn(mockTransport) + viewModel.updateController(mockController, Color.RED) + // WHEN user input is dispatched + val pos = 42L + viewModel.onSeek(pos) + fakeExecutor.runAllReady() + // THEN transport controls should be used + verify(mockTransport).seekTo(pos) + } + + @Test + fun handleProgressChangedUser() { + whenever(mockController.getTransportControls()).thenReturn(mockTransport) + viewModel.updateController(mockController, Color.RED) + // WHEN user starts dragging the seek bar + val pos = 42 + viewModel.seekBarListener.onProgressChanged(SeekBar(context), pos, true) + fakeExecutor.runAllReady() + // THEN transport controls should be used + verify(mockTransport).seekTo(pos.toLong()) + } + + @Test + fun handleProgressChangedOther() { + whenever(mockController.getTransportControls()).thenReturn(mockTransport) + viewModel.updateController(mockController, Color.RED) + // WHEN user starts dragging the seek bar + val pos = 42 + viewModel.seekBarListener.onProgressChanged(SeekBar(context), pos, false) + fakeExecutor.runAllReady() + // THEN transport controls should be used + verify(mockTransport, never()).seekTo(pos.toLong()) + } + + @Test + fun handleStartTrackingTouch() { + whenever(mockController.getTransportControls()).thenReturn(mockTransport) + viewModel.updateController(mockController, Color.RED) + // WHEN user starts dragging the seek bar + val pos = 42 + val bar = SeekBar(context).apply { + progress = pos + } + viewModel.seekBarListener.onStartTrackingTouch(bar) + fakeExecutor.runAllReady() + // THEN transport controls should be used + verify(mockTransport, never()).seekTo(pos.toLong()) + } + + @Test + fun handleStopTrackingTouch() { + whenever(mockController.getTransportControls()).thenReturn(mockTransport) + viewModel.updateController(mockController, Color.RED) + // WHEN user ends drag + val pos = 42 + val bar = SeekBar(context).apply { + progress = pos + } + viewModel.seekBarListener.onStopTrackingTouch(bar) + fakeExecutor.runAllReady() + // THEN transport controls should be used + verify(mockTransport).seekTo(pos.toLong()) + } + + @Test + fun queuePollTaskWhenPlaying() { + // GIVEN that the track is playing + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_PLAYING, 100L, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + // WHEN the controller is updated + viewModel.updateController(mockController, Color.RED) + // THEN a task is queued + assertThat(fakeExecutor.numPending()).isEqualTo(1) + } + + @Test + fun noQueuePollTaskWhenStopped() { + // GIVEN that the playback state is stopped + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_STOPPED, 200L, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + // WHEN updated + viewModel.updateController(mockController, Color.RED) + // THEN an update task is not queued + assertThat(fakeExecutor.numPending()).isEqualTo(0) + } + + @Test + fun queuePollTaskWhenListening() { + // GIVEN listening + viewModel.listening = true + with(fakeExecutor) { + advanceClockToNext() + runAllReady() + } + // AND the playback state is playing + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_PLAYING, 200L, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + // WHEN updated + viewModel.updateController(mockController, Color.RED) + // THEN an update task is queued + assertThat(fakeExecutor.numPending()).isEqualTo(1) + } + + @Test + fun noQueuePollTaskWhenNotListening() { + // GIVEN not listening + viewModel.listening = false + with(fakeExecutor) { + advanceClockToNext() + runAllReady() + } + // AND the playback state is playing + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_STOPPED, 200L, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + // WHEN updated + viewModel.updateController(mockController, Color.RED) + // THEN an update task is not queued + assertThat(fakeExecutor.numPending()).isEqualTo(0) + } + + @Test + fun pollTaskQueuesAnotherPollTaskWhenPlaying() { + // GIVEN that the track is playing + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_PLAYING, 100L, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + viewModel.updateController(mockController, Color.RED) + // WHEN the next task runs + with(fakeExecutor) { + advanceClockToNext() + runAllReady() + } + // THEN another task is queued + assertThat(fakeExecutor.numPending()).isEqualTo(1) + } + + @Test + fun taskUpdatesProgress() { + // GIVEN that the PlaybackState contins the current position + val position = 200L + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_PLAYING, position, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + viewModel.updateController(mockController, Color.RED) + // AND the playback state advances + val nextPosition = 300L + val nextState = PlaybackState.Builder().run { + setState(PlaybackState.STATE_PLAYING, nextPosition, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(nextState) + // WHEN the task runs + with(fakeExecutor) { + advanceClockToNext() + runAllReady() + } + // THEN elapsed time is captured + assertThat(viewModel.progress.value!!.elapsedTime).isEqualTo(nextPosition.toInt()) + } + + @Test + fun startListeningQueuesPollTask() { + // GIVEN not listening + viewModel.listening = false + with(fakeExecutor) { + advanceClockToNext() + runAllReady() + } + // AND the playback state is playing + val state = PlaybackState.Builder().run { + setState(PlaybackState.STATE_STOPPED, 200L, 1f) + build() + } + whenever(mockController.getPlaybackState()).thenReturn(state) + viewModel.updateController(mockController, Color.RED) + // WHEN start listening + viewModel.listening = true + // THEN an update task is queued + assertThat(fakeExecutor.numPending()).isEqualTo(1) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java index 0d66340a3917..56a748497d4e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java @@ -51,7 +51,6 @@ public class PipAnimationControllerTest extends SysuiTestCase { private PipAnimationController mPipAnimationController; - @Mock private SurfaceControl mLeash; @Mock @@ -61,6 +60,10 @@ public class PipAnimationControllerTest extends SysuiTestCase { public void setUp() throws Exception { mPipAnimationController = new PipAnimationController( mContext, new PipSurfaceTransactionHelper(mContext)); + mLeash = new SurfaceControl.Builder() + .setContainerLayer() + .setName("FakeLeash") + .build(); MockitoAnnotations.initMocks(this); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java index dbbbaac66554..862ebe13bd93 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java @@ -44,6 +44,7 @@ import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.util.concurrency.DelayableExecutor; import org.junit.Before; import org.junit.Test; @@ -87,7 +88,7 @@ public class QSPanelTest extends SysuiTestCase { @Mock private Executor mForegroundExecutor; @Mock - private Executor mBackgroundExecutor; + private DelayableExecutor mBackgroundExecutor; @Mock private LocalBluetoothManager mLocalBluetoothManager; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java index ea68516e639c..e55ea41d94e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java @@ -98,6 +98,8 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { mLockscreenUserManager); mDependency.injectTestDependency(NotificationGroupManager.class, mGroupManager); mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager); + when(mVisualStabilityManager.areGroupChangesAllowed()).thenReturn(true); + when(mVisualStabilityManager.isReorderingAllowed()).thenReturn(true); mHelper = new NotificationTestHelper(mContext, mDependency, TestableLooper.get(this)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java index 9079223649ff..3d06c57cac37 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java @@ -110,7 +110,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase { mVisualStabilityManager.setScreenOn(true); mVisualStabilityManager.addReorderingAllowedCallback(mCallback); mVisualStabilityManager.setScreenOn(false); - verify(mCallback).onReorderingAllowed(); + verify(mCallback).onChangeAllowed(); } @Test @@ -119,7 +119,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase { mVisualStabilityManager.setScreenOn(true); mVisualStabilityManager.addReorderingAllowedCallback(mCallback); mVisualStabilityManager.setPanelExpanded(false); - verify(mCallback).onReorderingAllowed(); + verify(mCallback).onChangeAllowed(); } @Test @@ -130,7 +130,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase { mVisualStabilityManager.setScreenOn(false); mVisualStabilityManager.setScreenOn(true); mVisualStabilityManager.setScreenOn(false); - verify(mCallback).onReorderingAllowed(); + verify(mCallback).onChangeAllowed(); } @Test @@ -190,7 +190,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase { mVisualStabilityManager.setPulsing(true); mVisualStabilityManager.addReorderingAllowedCallback(mCallback); mVisualStabilityManager.setPulsing(false); - verify(mCallback).onReorderingAllowed(); + verify(mCallback).onChangeAllowed(); } @Test @@ -204,7 +204,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase { mVisualStabilityManager.temporarilyAllowReordering(); // THEN callbacks are notified that reordering is allowed - verify(mCallback).onReorderingAllowed(); + verify(mCallback).onChangeAllowed(); assertTrue(mVisualStabilityManager.isReorderingAllowed()); } @@ -218,7 +218,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase { mVisualStabilityManager.temporarilyAllowReordering(); // THEN reordering is still not allowed - verify(mCallback, never()).onReorderingAllowed(); + verify(mCallback, never()).onChangeAllowed(); assertFalse(mVisualStabilityManager.isReorderingAllowed()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt new file mode 100644 index 000000000000..dfc627e14d8c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.collection.coordinator + +import android.app.NotificationChannel +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.statusbar.notification.collection.NotifPipeline +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations +import org.mockito.Mockito.`when` as whenever + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +class ConversationCoordinatorTest : SysuiTestCase() { + + private var coordinator: ConversationCoordinator = ConversationCoordinator() + + // captured listeners and pluggables: + private var promoter: NotifPromoter? = null + + @Mock + private val pipeline: NotifPipeline? = null + @Mock + private val channel: NotificationChannel? = null + private var entry: NotificationEntry? = null + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + whenever(channel!!.isImportantConversation).thenReturn(true) + + coordinator.attach(pipeline!!) + + // capture arguments: + val notifPromoterCaptor = ArgumentCaptor.forClass(NotifPromoter::class.java) + verify(pipeline).addPromoter(notifPromoterCaptor.capture()) + promoter = notifPromoterCaptor.value + + entry = NotificationEntryBuilder().setChannel(channel).build() + } + + @Test + fun testPromotesCurrentHUN() { + + // only promote important conversations + assertTrue(promoter!!.shouldPromoteToTopLevel(entry)) + assertFalse(promoter!!.shouldPromoteToTopLevel(NotificationEntryBuilder().build())) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java index 6998edda3127..b6bd5e213dd4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java @@ -816,29 +816,4 @@ public class NotificationConversationInfoTest extends SysuiTestCase { verify(mMockINotificationManager, never()).createConversationNotificationChannelForPackage( anyString(), anyInt(), anyString(), any(), eq(CONVERSATION_ID)); } - - @Test - public void testAdjustImportanceTemporarilyAllowsReordering() { - mNotificationChannel.setImportance(IMPORTANCE_DEFAULT); - mConversationChannel.setImportance(IMPORTANCE_DEFAULT); - mNotificationInfo.bindNotification( - mShortcutManager, - mMockPackageManager, - mMockINotificationManager, - mVisualStabilityManager, - TEST_PACKAGE_NAME, - mNotificationChannel, - mEntry, - null, - null, - mIconFactory, - true); - - mNotificationInfo.findViewById(R.id.silence).performClick(); - mNotificationInfo.findViewById(R.id.done).performClick(); - - mTestableLooper.processAllMessages(); - - verify(mVisualStabilityManager).temporarilyAllowReordering(); - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java index ce8085aa4862..486939d1f08e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java @@ -25,6 +25,8 @@ import static androidx.lifecycle.Lifecycle.Event.ON_STOP; import static com.android.systemui.util.SysuiLifecycle.viewAttachLifecycle; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -35,12 +37,15 @@ import android.testing.TestableLooper.RunWithLooper; import android.testing.ViewUtils; import android.view.View; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleEventObserver; import androidx.lifecycle.LifecycleOwner; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,39 +54,122 @@ import org.junit.runner.RunWith; @SmallTest public class SysuiLifecycleTest extends SysuiTestCase { + private View mView; + + @Before + public void setUp() { + mView = new View(mContext); + } + + @After + public void tearDown() { + if (mView.isAttachedToWindow()) { + ViewUtils.detachView(mView); + TestableLooper.get(this).processAllMessages(); + } + } + @Test public void testAttach() { - View v = new View(mContext); LifecycleEventObserver observer = mock(LifecycleEventObserver.class); - LifecycleOwner lifecycle = viewAttachLifecycle(v); + LifecycleOwner lifecycle = viewAttachLifecycle(mView); lifecycle.getLifecycle().addObserver(observer); - ViewUtils.attachView(v); + ViewUtils.attachView(mView); TestableLooper.get(this).processAllMessages(); verify(observer).onStateChanged(eq(lifecycle), eq(ON_CREATE)); verify(observer).onStateChanged(eq(lifecycle), eq(ON_START)); verify(observer).onStateChanged(eq(lifecycle), eq(ON_RESUME)); - - ViewUtils.detachView(v); - TestableLooper.get(this).processAllMessages(); } @Test public void testDetach() { - View v = new View(mContext); LifecycleEventObserver observer = mock(LifecycleEventObserver.class); - LifecycleOwner lifecycle = viewAttachLifecycle(v); + LifecycleOwner lifecycle = viewAttachLifecycle(mView); lifecycle.getLifecycle().addObserver(observer); - ViewUtils.attachView(v); + ViewUtils.attachView(mView); TestableLooper.get(this).processAllMessages(); - ViewUtils.detachView(v); + ViewUtils.detachView(mView); TestableLooper.get(this).processAllMessages(); verify(observer).onStateChanged(eq(lifecycle), eq(ON_PAUSE)); verify(observer).onStateChanged(eq(lifecycle), eq(ON_STOP)); verify(observer).onStateChanged(eq(lifecycle), eq(ON_DESTROY)); } + + @Test + public void testStateBeforeAttach() { + // WHEN a lifecycle is obtained from a view + LifecycleOwner lifecycle = viewAttachLifecycle(mView); + // THEN the lifecycle state should be INITIAZED + assertThat(lifecycle.getLifecycle().getCurrentState()).isEqualTo( + Lifecycle.State.INITIALIZED); + } + + @Test + public void testStateAfterAttach() { + // WHEN a lifecycle is obtained from a view + LifecycleOwner lifecycle = viewAttachLifecycle(mView); + // AND the view is attached + ViewUtils.attachView(mView); + TestableLooper.get(this).processAllMessages(); + // THEN the lifecycle state should be RESUMED + assertThat(lifecycle.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.RESUMED); + } + + @Test + public void testStateAfterDetach() { + // WHEN a lifecycle is obtained from a view + LifecycleOwner lifecycle = viewAttachLifecycle(mView); + // AND the view is detached + ViewUtils.attachView(mView); + TestableLooper.get(this).processAllMessages(); + ViewUtils.detachView(mView); + TestableLooper.get(this).processAllMessages(); + // THEN the lifecycle state should be DESTROYED + assertThat(lifecycle.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.DESTROYED); + } + + @Test + public void testStateAfterReattach() { + // WHEN a lifecycle is obtained from a view + LifecycleOwner lifecycle = viewAttachLifecycle(mView); + // AND the view is re-attached + ViewUtils.attachView(mView); + TestableLooper.get(this).processAllMessages(); + ViewUtils.detachView(mView); + TestableLooper.get(this).processAllMessages(); + ViewUtils.attachView(mView); + TestableLooper.get(this).processAllMessages(); + // THEN the lifecycle state should still be DESTROYED, err RESUMED? + assertThat(lifecycle.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.RESUMED); + } + + @Test + public void testStateWhenViewAlreadyAttached() { + // GIVEN that a view is already attached + ViewUtils.attachView(mView); + TestableLooper.get(this).processAllMessages(); + // WHEN a lifecycle is obtained from a view + LifecycleOwner lifecycle = viewAttachLifecycle(mView); + // THEN the lifecycle state should be RESUMED + assertThat(lifecycle.getLifecycle().getCurrentState()).isEqualTo(Lifecycle.State.RESUMED); + } + + @Test + public void testStateWhenViewAlreadyDetached() { + // GIVEN that a view is already detached + ViewUtils.attachView(mView); + TestableLooper.get(this).processAllMessages(); + ViewUtils.detachView(mView); + TestableLooper.get(this).processAllMessages(); + // WHEN a lifecycle is obtained from a view + LifecycleOwner lifecycle = viewAttachLifecycle(mView); + // THEN the lifecycle state should be INITIALIZED + assertThat(lifecycle.getLifecycle().getCurrentState()).isEqualTo( + Lifecycle.State.INITIALIZED); + } } diff --git a/packages/Tethering/apex/Android.bp b/packages/Tethering/apex/Android.bp index 96a4d2007753..24df5f696077 100644 --- a/packages/Tethering/apex/Android.bp +++ b/packages/Tethering/apex/Android.bp @@ -17,6 +17,7 @@ apex { name: "com.android.tethering", updatable: true, + min_sdk_version: "R", java_libs: ["framework-tethering"], apps: ["Tethering"], manifest: "manifest.json", diff --git a/packages/VpnDialogs/res/values-ky/strings.xml b/packages/VpnDialogs/res/values-ky/strings.xml index 4e2f698bb1e5..23c9be8819a8 100644 --- a/packages/VpnDialogs/res/values-ky/strings.xml +++ b/packages/VpnDialogs/res/values-ky/strings.xml @@ -26,7 +26,7 @@ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> байт / <xliff:g id="NUMBER_1">%2$s</xliff:g> пакет"</string> <string name="always_on_disconnected_title" msgid="1906740176262776166">"Ар дайым күйүк VPN\'ге туташа албай жатат"</string> <string name="always_on_disconnected_message" msgid="555634519845992917">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> тармагына ар дайым туташып турсун деп жөндөлгөн, бирок учурда телефонуңуз ага туташа албай жатат. <xliff:g id="VPN_APP_1">%1$s</xliff:g> тармагына кайра туташканга чейин телефонуңуз жалпыга ачык тармакты пайдаланып турат."</string> - <string name="always_on_disconnected_message_lockdown" msgid="4232225539869452120">"<xliff:g id="VPN_APP">%1$s</xliff:g> тармагына ар дайым туташып турсун деп жөндөлгөн, бирок учурда телефонуңуз ага туташа албай жатат. VPN тармагына кайра туташмайынча, Интернет байланышыңыз жок болот."</string> + <string name="always_on_disconnected_message_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> diff --git a/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-ta/strings.xml b/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-ta/strings.xml new file mode 100644 index 000000000000..c896ee3aa8d1 --- /dev/null +++ b/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-ta/strings.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="display_cutout_emulation_overlay" msgid="7305489596221077240">"பஞ்ச் ஹோல் கட்அவுட்"</string> +</resources> diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index c8b6d8dfd1b7..132b6927badd 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -43,12 +43,10 @@ import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.graphics.GraphicBuffer; import android.graphics.ParcelableColorSpace; -import android.graphics.Point; -import android.graphics.Rect; import android.graphics.Region; import android.hardware.HardwareBuffer; import android.hardware.display.DisplayManager; -import android.hardware.display.DisplayManagerGlobal; +import android.hardware.display.DisplayManagerInternal; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -66,7 +64,6 @@ import android.util.SparseArray; import android.view.Display; import android.view.KeyEvent; import android.view.MagnificationSpec; -import android.view.SurfaceControl; import android.view.SurfaceControl.ScreenshotGraphicBuffer; import android.view.View; import android.view.WindowInfo; @@ -1010,53 +1007,29 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return; } - final Display display = DisplayManagerGlobal.getInstance() - .getRealDisplay(displayId); - if (display == null) { - sendScreenshotFailure(AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY, - callback); + // Private virtual displays are created by the ap and is not allowed to access by other + // aps. We assume the contents on this display should not be captured. + final DisplayManager displayManager = + (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); + final Display display = displayManager.getDisplay(displayId); + if ((display == null) || (display.getType() == Display.TYPE_VIRTUAL + && (display.getFlags() & Display.FLAG_PRIVATE) != 0)) { + sendScreenshotFailure( + AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY, callback); return; } - sendScreenshotSuccess(display, callback); - } - - private ScreenshotGraphicBuffer takeScreenshotBuffer(Display display) { - final Point displaySize = new Point(); - // TODO (b/145893483): calling new API with the display as a parameter - // when surface control supported. - final IBinder token = SurfaceControl.getInternalDisplayToken(); - final Rect crop = new Rect(0, 0, displaySize.x, displaySize.y); - final int rotation = display.getRotation(); - display.getRealSize(displaySize); - - return SurfaceControl.screenshotToBuffer(token, crop, displaySize.x, displaySize.y, - false, rotation); - } - - private void sendScreenshotSuccess(Display display, RemoteCallback callback) { final long identity = Binder.clearCallingIdentity(); try { mMainHandler.post(PooledLambda.obtainRunnable((nonArg) -> { - final ScreenshotGraphicBuffer screenshotBuffer = takeScreenshotBuffer(display); - final GraphicBuffer graphicBuffer = screenshotBuffer.getGraphicBuffer(); - try (HardwareBuffer hardwareBuffer = - HardwareBuffer.createFromGraphicBuffer(graphicBuffer)) { - final ParcelableColorSpace colorSpace = - new ParcelableColorSpace(screenshotBuffer.getColorSpace()); - - final Bundle payload = new Bundle(); - payload.putInt(KEY_ACCESSIBILITY_SCREENSHOT_STATUS, - AccessibilityService.TAKE_SCREENSHOT_SUCCESS); - payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER, - hardwareBuffer); - payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace); - payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP, - SystemClock.uptimeMillis()); - - // Send back the result. - callback.sendResult(payload); - hardwareBuffer.close(); + final ScreenshotGraphicBuffer screenshotBuffer = LocalServices + .getService(DisplayManagerInternal.class) + .screenshotWithoutSecureLayer(displayId); + if (screenshotBuffer != null) { + sendScreenshotSuccess(screenshotBuffer, callback); + } else { + sendScreenshotFailure( + AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY, callback); } }, null).recycleOnUse()); } finally { @@ -1064,6 +1037,29 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + private void sendScreenshotSuccess(ScreenshotGraphicBuffer screenshotBuffer, + RemoteCallback callback) { + final GraphicBuffer graphicBuffer = screenshotBuffer.getGraphicBuffer(); + try (HardwareBuffer hardwareBuffer = + HardwareBuffer.createFromGraphicBuffer(graphicBuffer)) { + final ParcelableColorSpace colorSpace = + new ParcelableColorSpace(screenshotBuffer.getColorSpace()); + + final Bundle payload = new Bundle(); + payload.putInt(KEY_ACCESSIBILITY_SCREENSHOT_STATUS, + AccessibilityService.TAKE_SCREENSHOT_SUCCESS); + payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER, + hardwareBuffer); + payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace); + payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP, + SystemClock.uptimeMillis()); + + // Send back the result. + callback.sendResult(payload); + hardwareBuffer.close(); + } + } + private void sendScreenshotFailure(@AccessibilityService.ScreenshotErrorCode int errorCode, RemoteCallback callback) { mMainHandler.post(PooledLambda.obtainRunnable((nonArg) -> { diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 55a92966eb29..12905696ff98 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -657,13 +657,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } /** - * Reads a new structure and then request a new fill response from the fill service. + * Clears the existing response for the partition, reads a new structure, and then requests a + * new fill response from the fill service. * * <p> Also asks the IME to make an inline suggestions request if it's enabled. */ @GuardedBy("mLock") private void requestNewFillResponseLocked(@NonNull ViewState viewState, int newState, int flags) { + final FillResponse existingResponse = viewState.getResponse(); + if (existingResponse != null) { + setViewStatesLocked( + existingResponse, + ViewState.STATE_INITIAL, + /* clearResponse= */ true); + } mExpiredResponse = false; if (mForAugmentedAutofillOnly || mRemoteFillService == null) { if (sVerbose) { @@ -3226,7 +3234,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } /** - * Sets the state of all views in the given dataset and response. + * Sets the state and response of all views in the given dataset. */ @GuardedBy("mLock") private void setViewStatesLocked(@Nullable FillResponse response, @NonNull Dataset dataset, @@ -3241,10 +3249,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (datasetId != null) { viewState.setDatasetId(datasetId); } - if (response != null) { - viewState.setResponse(response); - } else if (clearResponse) { + if (clearResponse) { viewState.setResponse(null); + } else if (response != null) { + viewState.setResponse(response); } } } diff --git a/services/core/java/android/os/UserManagerInternal.java b/services/core/java/android/os/UserManagerInternal.java index aedafbbf1662..94f5741fe828 100644 --- a/services/core/java/android/os/UserManagerInternal.java +++ b/services/core/java/android/os/UserManagerInternal.java @@ -23,6 +23,8 @@ import android.content.Context; import android.content.pm.UserInfo; import android.graphics.Bitmap; +import com.android.server.pm.RestrictionsSet; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -57,21 +59,18 @@ public abstract class UserManagerInternal { * Called by {@link com.android.server.devicepolicy.DevicePolicyManagerService} to set * restrictions enforced by the user. * - * @param originatingUserId user id of the user where the restriction originated. - * @param restrictions a bundle of user restrictions. - * @param restrictionOwnerType determines which admin {@code userId} corresponds to. - * The admin can be either - * {@link UserManagerInternal#OWNER_TYPE_DEVICE_OWNER}, - * {@link UserManagerInternal#OWNER_TYPE_PROFILE_OWNER}, - * {@link UserManagerInternal#OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE} - * or {@link UserManagerInternal#OWNER_TYPE_NO_OWNER}. - * If the admin is a DEVICE_OWNER or a PROFILE_OWNER_ORG_OWNED_DEVICE then - * a restriction may be applied globally depending on which restriction it is, - * otherwise it will be applied just on the current user. - * @see OwnerType + * @param originatingUserId user id of the user where the restrictions originated. + * @param global a bundle of global user restrictions. Global restrictions are + * restrictions that apply device-wide: to the managed profile, + * primary profile and secondary users and any profile created in + * any secondary user. + * @param local a restriction set of local user restrictions. The key is the user + * id of the user whom the restrictions are targeting. + * @param isDeviceOwner whether {@code originatingUserId} corresponds to device owner + * user id. */ public abstract void setDevicePolicyUserRestrictions(int originatingUserId, - @Nullable Bundle restrictions, @OwnerType int restrictionOwnerType); + @Nullable Bundle global, @Nullable RestrictionsSet local, boolean isDeviceOwner); /** * Returns the "base" user restrictions. diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 4ab035e7f44f..2eaa766ad32d 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -6313,7 +6313,8 @@ public class ConnectivityService extends IConnectivityManager.Stub && !nai.networkAgentConfig.allowBypass && nc.getOwnerUid() != Process.SYSTEM_UID && lp.getInterfaceName() != null - && (lp.hasIPv4DefaultRoute() || lp.hasIPv6DefaultRoute()); + && (lp.hasIPv4DefaultRoute() || lp.hasIpv4UnreachableDefaultRoute()) + && (lp.hasIPv6DefaultRoute() || lp.hasIpv6UnreachableDefaultRoute()); } private void updateUids(NetworkAgentInfo nai, NetworkCapabilities prevNc, diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java index 7aaf9be1fdd2..e1f9a7a150d8 100644 --- a/services/core/java/com/android/server/adb/AdbService.java +++ b/services/core/java/com/android/server/adb/AdbService.java @@ -137,12 +137,12 @@ public class AdbService extends IAdbManager.Stub { @Override public File getAdbKeysFile() { - return mDebuggingManager.getUserKeyFile(); + return mDebuggingManager == null ? null : mDebuggingManager.getUserKeyFile(); } @Override public File getAdbTempKeysFile() { - return mDebuggingManager.getAdbTempKeysFile(); + return mDebuggingManager == null ? null : mDebuggingManager.getAdbTempKeysFile(); } @Override diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 85d288317b6a..62d7eb1d0448 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -18376,7 +18376,18 @@ public class ActivityManagerService extends IActivityManager.Stub } } - proc.thread.dumpHeap(managed, mallocInfo, runGc, path, fd, finishCallback); + Process.enableFreezer(false); + + final RemoteCallback intermediateCallback = new RemoteCallback( + new RemoteCallback.OnResultListener() { + @Override + public void onResult(Bundle result) { + finishCallback.sendResult(result); + Process.enableFreezer(true); + } + }, null); + + proc.thread.dumpHeap(managed, mallocInfo, runGc, path, fd, intermediateCallback); fd = null; return true; } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 8e6ef75078b3..31bcceaba889 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -5853,10 +5853,6 @@ public class AppOpsService extends IAppOpsService.Stub { if (pkg == null) { return false; } - if (pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.Q) { - return false; - } - String[] requestedPermissions = pkg.requestedPermissions; if (requestedPermissions == null) { return false; diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 45b93834c1e2..4431abe43136 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -17,6 +17,7 @@ package com.android.server.biometrics; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE; +import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE; import android.app.ActivityManager; import android.app.ActivityTaskManager; @@ -43,6 +44,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.IHwBinder; import android.os.IRemoteCallback; +import android.os.Looper; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; @@ -52,6 +54,8 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.Slog; +import com.android.internal.R; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.FrameworkStatsLog; @@ -93,7 +97,22 @@ public abstract class BiometricServiceBase extends SystemService protected final Map<Integer, Long> mAuthenticatorIds = Collections.synchronizedMap(new HashMap<>()); protected final AppOpsManager mAppOps; - protected final H mHandler = new H(); + + /** + * Handler which all subclasses should post events to. + */ + protected final Handler mHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(android.os.Message msg) { + switch (msg.what) { + case MSG_USER_SWITCHING: + handleUserSwitching(msg.arg1); + break; + default: + Slog.w(getTag(), "Unknown message:" + msg.what); + } + } + }; private final IBinder mToken = new Binder(); // Used for internal enumeration private final ArrayList<UserTemplate> mUnknownHALTemplates = new ArrayList<>(); @@ -483,23 +502,6 @@ public abstract class BiometricServiceBase extends SystemService void resetLockout(byte[] token) throws RemoteException; } - /** - * Handler which all subclasses should post events to. - */ - protected final class H extends Handler { - @Override - public void handleMessage(android.os.Message msg) { - switch (msg.what) { - case MSG_USER_SWITCHING: - handleUserSwitching(msg.arg1); - break; - - default: - Slog.w(getTag(), "Unknown message:" + msg.what); - } - } - } - private final Runnable mOnTaskStackChangedRunnable = new Runnable() { @Override public void run() { @@ -647,8 +649,9 @@ public abstract class BiometricServiceBase extends SystemService mContext = context; mStatusBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); - mKeyguardPackage = ComponentName.unflattenFromString(context.getResources().getString( - com.android.internal.R.string.config_keyguardComponent)).getPackageName(); + final ComponentName keyguardComponent = ComponentName.unflattenFromString( + context.getResources().getString(R.string.config_keyguardComponent)); + mKeyguardPackage = keyguardComponent != null ? keyguardComponent.getPackageName() : null; mAppOps = context.getSystemService(AppOpsManager.class); mActivityTaskManager = ((ActivityTaskManager) context.getSystemService( Context.ACTIVITY_TASK_SERVICE)).getService(); @@ -671,8 +674,8 @@ public abstract class BiometricServiceBase extends SystemService // All client lifecycle must be managed on the handler. mHandler.post(() -> { - handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, - 0 /*vendorCode */); + Slog.e(getTag(), "Sending BIOMETRIC_ERROR_HW_UNAVAILABLE after HAL crash"); + handleError(getHalDeviceId(), BIOMETRIC_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); }); FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, @@ -798,9 +801,10 @@ public abstract class BiometricServiceBase extends SystemService } protected void handleEnumerate(BiometricAuthenticator.Identifier identifier, int remaining) { - ClientMonitor client = getCurrentClient(); - - client.onEnumerationResult(identifier, remaining); + ClientMonitor client = mCurrentClient; + if (client != null) { + client.onEnumerationResult(identifier, remaining); + } // All templates in the HAL for this user were enumerated if (remaining == 0) { @@ -818,7 +822,7 @@ public abstract class BiometricServiceBase extends SystemService } removeClient(client); startCleanupUnknownHALTemplates(); - } else { + } else if (client != null) { removeClient(client); } } @@ -898,12 +902,16 @@ public abstract class BiometricServiceBase extends SystemService protected void cancelAuthenticationInternal(final IBinder token, final String opPackageName, int callingUid, int callingPid, int callingUserId, boolean fromClient) { + + if (DEBUG) Slog.v(getTag(), "cancelAuthentication(" + opPackageName + ")"); if (fromClient) { // Only check this if cancel was called from the client (app). If cancel was called // from BiometricService, it means the dialog was dismissed due to user interaction. if (!canUseBiometric(opPackageName, true /* foregroundOnly */, callingUid, callingPid, callingUserId)) { - if (DEBUG) Slog.v(getTag(), "cancelAuthentication(): reject " + opPackageName); + if (DEBUG) { + Slog.v(getTag(), "cancelAuthentication(): reject " + opPackageName); + } return; } } @@ -1059,7 +1067,8 @@ public abstract class BiometricServiceBase extends SystemService * @param newClient the new client that wants to connect * @param initiatedByClient true for authenticate, remove and enroll */ - private void startClient(ClientMonitor newClient, boolean initiatedByClient) { + @VisibleForTesting + void startClient(ClientMonitor newClient, boolean initiatedByClient) { ClientMonitor currentClient = mCurrentClient; if (currentClient != null) { if (DEBUG) Slog.v(getTag(), "request stop current client " + @@ -1122,18 +1131,27 @@ public abstract class BiometricServiceBase extends SystemService Slog.e(getTag(), "Trying to start null client!"); return; } + if (DEBUG) Slog.v(getTag(), "starting client " + mCurrentClient.getClass().getSuperclass().getSimpleName() + "(" + mCurrentClient.getOwnerString() + ")" + " targetUserId: " + mCurrentClient.getTargetUserId() + " currentUserId: " + mCurrentUserId + " cookie: " + cookie + "/" + mCurrentClient.getCookie()); + if (cookie != mCurrentClient.getCookie()) { Slog.e(getTag(), "Mismatched cookie"); return; } - notifyClientActiveCallbacks(true); - mCurrentClient.start(); + + int status = mCurrentClient.start(); + if (status == 0) { + notifyClientActiveCallbacks(true); + } else { + mCurrentClient.onError(getHalDeviceId(), BIOMETRIC_ERROR_HW_UNAVAILABLE, + 0 /* vendorCode */); + removeClient(mCurrentClient); + } } protected void removeClient(ClientMonitor client) { @@ -1145,7 +1163,7 @@ public abstract class BiometricServiceBase extends SystemService } } if (mCurrentClient != null) { - if (DEBUG) Slog.v(getTag(), "Done with client: " + client.getOwnerString()); + if (DEBUG) Slog.v(getTag(), "Done with client: " + mCurrentClient.getOwnerString()); mCurrentClient = null; } if (mPendingClient == null) { diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 3afbf661f97e..d527a808a5ff 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1362,7 +1362,8 @@ public final class DisplayManagerService extends SystemService { return null; } - private SurfaceControl.ScreenshotGraphicBuffer screenshotInternal(int displayId) { + private SurfaceControl.ScreenshotGraphicBuffer screenshotInternal(int displayId, + boolean captureSecureLayer) { synchronized (mSyncRoot) { final IBinder token = getDisplayToken(displayId); if (token == null) { @@ -1374,9 +1375,15 @@ public final class DisplayManagerService extends SystemService { } final DisplayInfo displayInfo = logicalDisplay.getDisplayInfoLocked(); - return SurfaceControl.screenshotToBufferWithSecureLayersUnsafe(token, new Rect(), - displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight(), - false /* useIdentityTransform */, 0 /* rotation */); + if (captureSecureLayer) { + return SurfaceControl.screenshotToBufferWithSecureLayersUnsafe(token, new Rect(), + displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight(), + false /* useIdentityTransform */, 0 /* rotation */); + } else { + return SurfaceControl.screenshotToBuffer(token, new Rect(), + displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight(), + false /* useIdentityTransform */, 0 /* rotation */); + } } } @@ -2494,7 +2501,12 @@ public final class DisplayManagerService extends SystemService { @Override public SurfaceControl.ScreenshotGraphicBuffer screenshot(int displayId) { - return screenshotInternal(displayId); + return screenshotInternal(displayId, true); + } + + @Override + public SurfaceControl.ScreenshotGraphicBuffer screenshotWithoutSecureLayer(int displayId) { + return screenshotInternal(displayId, false); } @Override diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index e8d8ed7a462d..ed3b9f1fc265 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -6227,7 +6227,7 @@ public class NotificationManagerService extends SystemService { cancelNotificationLocked( r, mSendDelete, mReason, mRank, mCount, wasPosted, listenerName); cancelGroupChildrenLocked(r, mCallingUid, mCallingPid, listenerName, - mSendDelete, childrenFlagChecker); + mSendDelete, childrenFlagChecker, mReason); updateLightsLocked(); if (mShortcutHelper != null) { mShortcutHelper.maybeListenForShortcutChangesForBubbles(r, @@ -6687,7 +6687,7 @@ public class NotificationManagerService extends SystemService { // notification was a summary and its group key changed. if (oldIsSummary && (!isSummary || !oldGroup.equals(group))) { cancelGroupChildrenLocked(old, callingUid, callingPid, null, false /* sendDelete */, - null); + null, REASON_APP_CANCEL); } } @@ -7892,7 +7892,7 @@ public class NotificationManagerService extends SystemService { final int M = canceledNotifications.size(); for (int i = 0; i < M; i++) { cancelGroupChildrenLocked(canceledNotifications.get(i), callingUid, callingPid, - listenerName, false /* sendDelete */, flagChecker); + listenerName, false /* sendDelete */, flagChecker, reason); } updateLightsLocked(); } @@ -7963,7 +7963,7 @@ public class NotificationManagerService extends SystemService { // Warning: The caller is responsible for invoking updateLightsLocked(). @GuardedBy("mNotificationLock") private void cancelGroupChildrenLocked(NotificationRecord r, int callingUid, int callingPid, - String listenerName, boolean sendDelete, FlagChecker flagChecker) { + String listenerName, boolean sendDelete, FlagChecker flagChecker, int reason) { Notification n = r.getNotification(); if (!n.isGroupSummary()) { return; @@ -7977,30 +7977,33 @@ public class NotificationManagerService extends SystemService { } cancelGroupChildrenByListLocked(mNotificationList, r, callingUid, callingPid, listenerName, - sendDelete, true, flagChecker); + sendDelete, true, flagChecker, reason); cancelGroupChildrenByListLocked(mEnqueuedNotifications, r, callingUid, callingPid, - listenerName, sendDelete, false, flagChecker); + listenerName, sendDelete, false, flagChecker, reason); } @GuardedBy("mNotificationLock") private void cancelGroupChildrenByListLocked(ArrayList<NotificationRecord> notificationList, NotificationRecord parentNotification, int callingUid, int callingPid, - String listenerName, boolean sendDelete, boolean wasPosted, FlagChecker flagChecker) { + String listenerName, boolean sendDelete, boolean wasPosted, FlagChecker flagChecker, + int reason) { final String pkg = parentNotification.getSbn().getPackageName(); final int userId = parentNotification.getUserId(); - final int reason = REASON_GROUP_SUMMARY_CANCELED; + final int childReason = REASON_GROUP_SUMMARY_CANCELED; for (int i = notificationList.size() - 1; i >= 0; i--) { final NotificationRecord childR = notificationList.get(i); final StatusBarNotification childSbn = childR.getSbn(); if ((childSbn.isGroup() && !childSbn.getNotification().isGroupSummary()) && childR.getGroupKey().equals(parentNotification.getGroupKey()) && (childR.getFlags() & FLAG_FOREGROUND_SERVICE) == 0 - && (flagChecker == null || flagChecker.apply(childR.getFlags()))) { + && (flagChecker == null || flagChecker.apply(childR.getFlags())) + && (!childR.getChannel().isImportantConversation() + || reason != REASON_CANCEL)) { EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, childSbn.getId(), - childSbn.getTag(), userId, 0, 0, reason, listenerName); + childSbn.getTag(), userId, 0, 0, childReason, listenerName); notificationList.remove(i); mNotificationsByKey.remove(childR.getKey()); - cancelNotificationLocked(childR, sendDelete, reason, wasPosted, listenerName); + cancelNotificationLocked(childR, sendDelete, childReason, wasPosted, listenerName); } } } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 1b271a739777..1d5c30438870 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -47,6 +47,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutQueryWrapper; import android.content.pm.ShortcutServiceInternal; import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener; import android.content.pm.UserInfo; @@ -698,13 +699,19 @@ public class LauncherAppsService extends SystemService { } @Override - public ParceledListSlice getShortcuts(String callingPackage, long changedSince, - String packageName, List shortcutIds, List<LocusId> locusIds, - ComponentName componentName, int flags, UserHandle targetUser) { + public ParceledListSlice getShortcuts(@NonNull final String callingPackage, + @NonNull final ShortcutQueryWrapper query, @NonNull final UserHandle targetUser) { ensureShortcutPermission(callingPackage); if (!canAccessProfile(targetUser.getIdentifier(), "Cannot get shortcuts")) { return new ParceledListSlice<>(Collections.EMPTY_LIST); } + + final long changedSince = query.getChangedSince(); + final String packageName = query.getPackage(); + final List<String> shortcutIds = query.getShortcutIds(); + final List<LocusId> locusIds = query.getLocusIds(); + final ComponentName componentName = query.getActivity(); + final int flags = query.getQueryFlags(); if (shortcutIds != null && packageName == null) { throw new IllegalArgumentException( "To query by shortcut ID, package name must also be set"); @@ -723,16 +730,17 @@ public class LauncherAppsService extends SystemService { } @Override - public void registerShortcutChangeCallback(String callingPackage, long changedSince, - String packageName, List shortcutIds, List<LocusId> locusIds, - ComponentName componentName, int flags, IShortcutChangeCallback callback) { + public void registerShortcutChangeCallback(@NonNull final String callingPackage, + @NonNull final ShortcutQueryWrapper query, + @NonNull final IShortcutChangeCallback callback) { + ensureShortcutPermission(callingPackage); - if (shortcutIds != null && packageName == null) { + if (query.getShortcutIds() != null && query.getPackage() == null) { throw new IllegalArgumentException( "To query by shortcut ID, package name must also be set"); } - if (locusIds != null && packageName == null) { + if (query.getLocusIds() != null && query.getPackage() == null) { throw new IllegalArgumentException( "To query by locus ID, package name must also be set"); } @@ -744,10 +752,7 @@ public class LauncherAppsService extends SystemService { user = null; } - // TODO: When ShortcutQueryWrapper (ag/10323729) is available, pass that directly. - ShortcutChangeHandler.QueryInfo query = new ShortcutChangeHandler.QueryInfo( - changedSince, packageName, shortcutIds, locusIds, componentName, flags, user); - mShortcutChangeHandler.addShortcutChangeCallback(callback, query); + mShortcutChangeHandler.addShortcutChangeCallback(callback, query, user); } @Override @@ -1081,9 +1086,11 @@ public class LauncherAppsService extends SystemService { new RemoteCallbackList<>(); public synchronized void addShortcutChangeCallback(IShortcutChangeCallback callback, - QueryInfo query) { + ShortcutQueryWrapper query, UserHandle user) { mCallbacks.unregister(callback); - mCallbacks.register(callback, query); + mCallbacks.register(callback, new QueryInfo(query.getChangedSince(), + query.getPackage(), query.getShortcutIds(), query.getLocusIds(), + query.getActivity(), query.getQueryFlags(), user)); } public synchronized void removeShortcutChangeCallback( diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index e625aeffc0c6..e7d0c41c0fea 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -401,7 +401,8 @@ public class PackageDexOptimizer { return DEX_OPT_FAILED; } String classLoaderContext = null; - if (dexUseInfo.isUnknownClassLoaderContext() || dexUseInfo.isVariableClassLoaderContext()) { + if (dexUseInfo.isUnsupportedClassLoaderContext() + || dexUseInfo.isVariableClassLoaderContext()) { // If we have an unknown (not yet set), or a variable class loader chain. Just extract // the dex file. compilerFilter = "extract"; diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index d2443fa735e9..323ffcfc2a1c 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1716,27 +1716,6 @@ public class UserManagerService extends IUserManager.Stub { } } - private void setDevicePolicyUserRestrictionsInner(@UserIdInt int originatingUserId, - @Nullable Bundle restrictions, - @UserManagerInternal.OwnerType int restrictionOwnerType) { - final Bundle global = new Bundle(); - final Bundle local = new Bundle(); - - // Sort restrictions into local and global ensuring they don't overlap. - UserRestrictionsUtils.sortToGlobalAndLocal(restrictions, restrictionOwnerType, global, - local); - boolean isDeviceOwner = restrictionOwnerType == UserManagerInternal.OWNER_TYPE_DEVICE_OWNER; - - RestrictionsSet localRestrictionsSet; - if (UserRestrictionsUtils.isEmpty(local)) { - localRestrictionsSet = new RestrictionsSet(); - } else { - localRestrictionsSet = new RestrictionsSet(originatingUserId, local); - } - setDevicePolicyUserRestrictionsInner(originatingUserId, global, localRestrictionsSet, - isDeviceOwner); - } - /** * See {@link UserManagerInternal#setDevicePolicyUserRestrictions} */ @@ -4754,10 +4733,10 @@ public class UserManagerService extends IUserManager.Stub { private class LocalService extends UserManagerInternal { @Override public void setDevicePolicyUserRestrictions(@UserIdInt int originatingUserId, - @Nullable Bundle restrictions, - @OwnerType int restrictionOwnerType) { + @NonNull Bundle global, @NonNull RestrictionsSet local, + boolean isDeviceOwner) { UserManagerService.this.setDevicePolicyUserRestrictionsInner(originatingUserId, - restrictions, restrictionOwnerType); + global, local, isDeviceOwner); } @Override diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index eec6e024fef2..c0502b8a068c 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -233,6 +233,13 @@ public class UserRestrictionsUtils { ); /** + * Special user restrictions that profile owner of an organization-owned managed profile can + * set on the parent profile instance to apply them on the personal profile. + */ + private static final Set<String> PROFILE_OWNER_ORGANIZATION_OWNED_LOCAL_RESTRICTIONS = + Sets.newArraySet(); + + /** * User restrictions that default to {@code true} for managed profile owners. * * NB: {@link UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES} is also set by default but it is @@ -416,7 +423,8 @@ public class UserRestrictionsUtils { * @return true if a restriction is settable by profile owner of an organization owned device. */ public static boolean canProfileOwnerOfOrganizationOwnedDeviceChange(String restriction) { - return PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS.contains(restriction); + return PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS.contains(restriction) + || PROFILE_OWNER_ORGANIZATION_OWNED_LOCAL_RESTRICTIONS.contains(restriction); } /** @@ -427,31 +435,9 @@ public class UserRestrictionsUtils { } /** - * Takes restrictions that can be set by device owner, and sort them into what should be applied - * globally and what should be applied only on the current user. - */ - public static void sortToGlobalAndLocal(@Nullable Bundle in, - @UserManagerInternal.OwnerType int restrictionOwnerType, @NonNull Bundle global, - @NonNull Bundle local) { - if (in == null || in.size() == 0) { - return; - } - for (String key : in.keySet()) { - if (!in.getBoolean(key)) { - continue; - } - if (isGlobal(restrictionOwnerType, key)) { - global.putBoolean(key, true); - } else { - local.putBoolean(key, true); - } - } - } - - /** * Whether given user restriction should be enforced globally. */ - private static boolean isGlobal(@UserManagerInternal.OwnerType int restrictionOwnerType, + public static boolean isGlobal(@UserManagerInternal.OwnerType int restrictionOwnerType, String key) { return ((restrictionOwnerType == UserManagerInternal.OWNER_TYPE_DEVICE_OWNER) && ( PRIMARY_USER_ONLY_RESTRICTIONS.contains(key) || GLOBAL_RESTRICTIONS.contains(key))) @@ -463,6 +449,14 @@ public class UserRestrictionsUtils { } /** + * Whether given user restriction should be enforced locally. + */ + public static boolean isLocal(@UserManagerInternal.OwnerType int restrictionOwnerType, + String key) { + return !isGlobal(restrictionOwnerType, key); + } + + /** * @return true if two Bundles contain the same user restriction. * A null bundle and an empty bundle are considered to be equal. */ diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index 117cc5e8eb80..e8765ad973f3 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -45,6 +45,7 @@ import dalvik.system.VMRuntime; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -103,19 +104,6 @@ public class DexManager { private static int DEX_SEARCH_FOUND_SPLIT = 2; // dex file is a split apk private static int DEX_SEARCH_FOUND_SECONDARY = 3; // dex file is a secondary dex - /** - * We do not record packages that have no secondary dex files or that are not used by other - * apps. This is an optimization to reduce the amount of data that needs to be written to - * disk (apps will not usually be shared so this trims quite a bit the number we record). - * - * To make this behaviour transparent to the callers which need use information on packages, - * DexManager will return this DEFAULT instance from - * {@link DexManager#getPackageUseInfoOrDefault}. It has no data about secondary dex files and - * is marked as not being used by other apps. This reflects the intended behaviour when we don't - * find the package in the underlying data file. - */ - private final static PackageUseInfo DEFAULT_USE_INFO = new PackageUseInfo(); - public DexManager(Context context, IPackageManager pms, PackageDexOptimizer pdo, Installer installer, Object installLock) { mContext = context; @@ -194,6 +182,8 @@ public class DexManager { // If the dex file is the primary apk (or a split) and not isUsedByOtherApps // do not record it. This case does not bring any new usable information // and can be safely skipped. + // Note this is just an optimization that makes things easier to read in the + // package-dex-use file since we don't need to pollute it with redundant info. continue; } @@ -211,7 +201,7 @@ public class DexManager { // async write to disk to make sure we don't loose the data in case of a reboot. if (mPackageDexUsage.record(searchResult.mOwningPackageName, - dexPath, loaderUserId, loaderIsa, isUsedByOtherApps, primaryOrSplit, + dexPath, loaderUserId, loaderIsa, primaryOrSplit, loadingAppInfo.packageName, classLoaderContext)) { mPackageDexUsage.maybeWriteAsync(); } @@ -364,7 +354,9 @@ public class DexManager { try { mPackageDexUsage.read(); - mPackageDexUsage.syncData(packageToUsersMap, packageToCodePaths); + List<String> packagesToKeepDataAbout = new ArrayList<>(); + mPackageDexUsage.syncData( + packageToUsersMap, packageToCodePaths, packagesToKeepDataAbout); } catch (Exception e) { mPackageDexUsage.clear(); Slog.w(TAG, "Exception while loading package dex usage. " @@ -391,8 +383,17 @@ public class DexManager { * to access the package use. */ public PackageUseInfo getPackageUseInfoOrDefault(String packageName) { + // We do not record packages that have no secondary dex files or that are not used by other + // apps. This is an optimization to reduce the amount of data that needs to be written to + // disk (apps will not usually be shared so this trims quite a bit the number we record). + // + // To make this behaviour transparent to the callers which need use information on packages, + // DexManager will return this DEFAULT instance from + // {@link DexManager#getPackageUseInfoOrDefault}. It has no data about secondary dex files + // and is marked as not being used by other apps. This reflects the intended behaviour when + // we don't find the package in the underlying data file. PackageUseInfo useInfo = mPackageDexUsage.getPackageUseInfo(packageName); - return useInfo == null ? DEFAULT_USE_INFO : useInfo; + return useInfo == null ? new PackageUseInfo(packageName) : useInfo; } /** @@ -542,7 +543,7 @@ public class DexManager { // TODO(calin): questionable API in the presence of class loaders context. Needs amends as the // compilation happening here will use a pessimistic context. public RegisterDexModuleResult registerDexModule(ApplicationInfo info, String dexPath, - boolean isUsedByOtherApps, int userId) { + boolean isSharedModule, int userId) { // Find the owning package record. DexSearchResult searchResult = getDexPackage(info, dexPath, userId); @@ -559,11 +560,14 @@ public class DexManager { // We found the package. Now record the usage for all declared ISAs. boolean update = false; + // If this is a shared module set the loading package to an arbitrary package name + // so that we can mark that module as usedByOthers. + String loadingPackage = isSharedModule ? ".shared.module" : searchResult.mOwningPackageName; for (String isa : getAppDexInstructionSets(info.primaryCpuAbi, info.secondaryCpuAbi)) { boolean newUpdate = mPackageDexUsage.record(searchResult.mOwningPackageName, - dexPath, userId, isa, isUsedByOtherApps, /*primaryOrSplit*/ false, + dexPath, userId, isa, /*primaryOrSplit*/ false, searchResult.mOwningPackageName, - PackageDexUsage.UNKNOWN_CLASS_LOADER_CONTEXT); + PackageDexUsage.VARIABLE_CLASS_LOADER_CONTEXT); update |= newUpdate; } if (update) { diff --git a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java index 08763e729c71..10760f52a02b 100644 --- a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java +++ b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java @@ -39,10 +39,12 @@ import java.io.OutputStreamWriter; import java.io.Reader; import java.io.StringWriter; import java.io.Writer; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -51,25 +53,21 @@ import java.util.Set; * Stat file which store usage information about dex files. */ public class PackageDexUsage extends AbstractStatsBase<Void> { - private final static String TAG = "PackageDexUsage"; + private static final String TAG = "PackageDexUsage"; - // We support previous version to ensure that the usage list remains valid cross OTAs. - private final static int PACKAGE_DEX_USAGE_SUPPORTED_VERSION_1 = 1; - // Version 2 added: - // - the list of packages that load the dex files - // - class loader contexts for secondary dex files - // - usage for all code paths (including splits) - private final static int PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2 = 2; + // We are currently at version 2. + // Version 1 was introduced in Nougat and Version 2 in Oreo. + // We dropped version 1 support in R since all devices should have updated + // already. + private static final int PACKAGE_DEX_USAGE_VERSION = 2; - private final static int PACKAGE_DEX_USAGE_VERSION = PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2; - - private final static String PACKAGE_DEX_USAGE_VERSION_HEADER = + private static final String PACKAGE_DEX_USAGE_VERSION_HEADER = "PACKAGE_MANAGER__PACKAGE_DEX_USAGE__"; - private final static String SPLIT_CHAR = ","; - private final static String CODE_PATH_LINE_CHAR = "+"; - private final static String DEX_LINE_CHAR = "#"; - private final static String LOADING_PACKAGE_CHAR = "@"; + private static final String SPLIT_CHAR = ","; + private static final String CODE_PATH_LINE_CHAR = "+"; + private static final String DEX_LINE_CHAR = "#"; + private static final String LOADING_PACKAGE_CHAR = "@"; // One of the things we record about dex files is the class loader context that was used to // load them. That should be stable but if it changes we don't keep track of variable contexts. @@ -77,10 +75,6 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { // skip optimizations on that dex files. /*package*/ static final String VARIABLE_CLASS_LOADER_CONTEXT = "=VariableClassLoaderContext="; - // The markers used for unknown class loader contexts. This can happen if the dex file was - // recorded in a previous version and we didn't have a chance to update its usage. - /*package*/ static final String UNKNOWN_CLASS_LOADER_CONTEXT = - "=UnknownClassLoaderContext="; // The marker used for unsupported class loader contexts (no longer written, may occur in old // files so discarded on read). Note: this matches @@ -126,7 +120,7 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { * has been seen before. */ /* package */ boolean record(String owningPackageName, String dexPath, int ownerUserId, - String loaderIsa, boolean isUsedByOtherApps, boolean primaryOrSplit, + String loaderIsa, boolean primaryOrSplit, String loadingPackageName, String classLoaderContext) { if (!PackageManagerServiceUtils.checkISA(loaderIsa)) { throw new IllegalArgumentException("loaderIsa " + loaderIsa + " is unsupported"); @@ -135,20 +129,22 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { throw new IllegalArgumentException("Null classLoaderContext"); } if (classLoaderContext.equals(UNSUPPORTED_CLASS_LOADER_CONTEXT)) { + Slog.e(TAG, "Unsupported context?"); return false; } + boolean isUsedByOtherApps = !owningPackageName.equals(loadingPackageName); + synchronized (mPackageUseInfoMap) { PackageUseInfo packageUseInfo = mPackageUseInfoMap.get(owningPackageName); if (packageUseInfo == null) { // This is the first time we see the package. - packageUseInfo = new PackageUseInfo(); + packageUseInfo = new PackageUseInfo(owningPackageName); if (primaryOrSplit) { // If we have a primary or a split apk, set isUsedByOtherApps. // We do not need to record the loaderIsa or the owner because we compile // primaries for all users and all ISAs. - packageUseInfo.mergeCodePathUsedByOtherApps(dexPath, isUsedByOtherApps, - owningPackageName, loadingPackageName); + packageUseInfo.mergePrimaryCodePaths(dexPath, loadingPackageName); } else { // For secondary dex files record the loaderISA and the owner. We'll need // to know under which user to compile and for what ISA. @@ -164,9 +160,8 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { // We already have data on this package. Amend it. if (primaryOrSplit) { // We have a possible update on the primary apk usage. Merge - // isUsedByOtherApps information and return if there was an update. - return packageUseInfo.mergeCodePathUsedByOtherApps( - dexPath, isUsedByOtherApps, owningPackageName, loadingPackageName); + // dex path information and return if there was an update. + return packageUseInfo.mergePrimaryCodePaths(dexPath, loadingPackageName); } else { DexUseInfo newData = new DexUseInfo( isUsedByOtherApps, ownerUserId, classLoaderContext, loaderIsa); @@ -281,7 +276,7 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { // Write the code paths used by other apps. for (Map.Entry<String, Set<String>> codeEntry : - packageUseInfo.mCodePathsUsedByOtherApps.entrySet()) { + packageUseInfo.mPrimaryCodePaths.entrySet()) { String codePath = codeEntry.getKey(); Set<String> loadingPackages = codeEntry.getValue(); fpw.println(CODE_PATH_LINE_CHAR + codePath); @@ -339,7 +334,9 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { version = Integer.parseInt( versionLine.substring(PACKAGE_DEX_USAGE_VERSION_HEADER.length())); if (!isSupportedVersion(version)) { - throw new IllegalStateException("Unexpected version: " + version); + Slog.w(TAG, "Unexpected package-dex-use version: " + version + + ". Not reading from it"); + return; } } @@ -377,9 +374,8 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { throw new IllegalStateException("Invalid PackageDexUsage line: " + line); } - // In version 2 we added the loading packages and class loader context. - Set<String> loadingPackages = maybeReadLoadingPackages(in, version); - String classLoaderContext = maybeReadClassLoaderContext(in, version); + Set<String> loadingPackages = readLoadingPackages(in, version); + String classLoaderContext = readClassLoaderContext(in, version); if (UNSUPPORTED_CLASS_LOADER_CONTEXT.equals(classLoaderContext)) { // We used to record use of unsupported class loaders, but we no longer do. @@ -410,34 +406,16 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { } currentPackageData.mDexUseInfoMap.put(dexPath, dexUseInfo); } else if (line.startsWith(CODE_PATH_LINE_CHAR)) { - // This is a code path used by other apps line. - if (version < PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2) { - throw new IllegalArgumentException("Unexpected code path line when parsing " + - "PackageDexUseData: " + line); - } - // Expects 2 lines: // +code_paths // @loading_packages String codePath = line.substring(CODE_PATH_LINE_CHAR.length()); - Set<String> loadingPackages = maybeReadLoadingPackages(in, version); - currentPackageData.mCodePathsUsedByOtherApps.put(codePath, loadingPackages); + Set<String> loadingPackages = readLoadingPackages(in, version); + currentPackageData.mPrimaryCodePaths.put(codePath, loadingPackages); } else { // This is a package line. - if (version >= PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2) { - currentPackage = line; - currentPackageData = new PackageUseInfo(); - } else { - // Old version (<2) - // We expect it to be: `packageName,isUsedByOtherApps`. - String[] elems = line.split(SPLIT_CHAR); - if (elems.length != 2) { - throw new IllegalStateException("Invalid PackageDexUsage line: " + line); - } - currentPackage = elems[0]; - currentPackageData = new PackageUseInfo(); - currentPackageData.mUsedByOtherAppsBeforeUpgrade = readBoolean(elems[1]); - } + currentPackage = line; + currentPackageData = new PackageUseInfo(currentPackage); data.put(currentPackage, currentPackageData); } } @@ -449,46 +427,31 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { } /** - * Reads the class loader context encoding from the buffer {@code in} if - * {@code version} is at least {PACKAGE_DEX_USAGE_VERSION}. + * Reads the class loader context encoding from the buffer {@code in}. */ - private String maybeReadClassLoaderContext(BufferedReader in, int version) throws IOException { - String context = null; - if (version >= PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2) { - context = in.readLine(); - if (context == null) { - throw new IllegalStateException("Could not find the classLoaderContext line."); - } + private String readClassLoaderContext(BufferedReader in, int version) throws IOException { + String context = in.readLine(); + if (context == null) { + throw new IllegalStateException("Could not find the classLoaderContext line."); } - // The context might be empty if we didn't have the chance to update it after a version - // upgrade. In this case return the special marker so that we recognize this is an unknown - // context. - return context == null ? UNKNOWN_CLASS_LOADER_CONTEXT : context; + return context; } /** - * Reads the list of loading packages from the buffer {@code in} if - * {@code version} is at least {PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2}. + * Reads the list of loading packages from the buffer {@code in}. */ - private Set<String> maybeReadLoadingPackages(BufferedReader in, int version) + private Set<String> readLoadingPackages(BufferedReader in, int version) throws IOException { - if (version >= PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2) { - String line = in.readLine(); - if (line == null) { - throw new IllegalStateException("Could not find the loadingPackages line."); - } - // We expect that most of the times the list of loading packages will be empty. - if (line.length() == LOADING_PACKAGE_CHAR.length()) { - return Collections.emptySet(); - } else { - Set<String> result = new HashSet<>(); - Collections.addAll(result, - line.substring(LOADING_PACKAGE_CHAR.length()).split(SPLIT_CHAR)); - return result; - } - } else { - return Collections.emptySet(); + String line = in.readLine(); + if (line == null) { + throw new IllegalStateException("Could not find the loadingPackages line."); + } + Set<String> result = new HashSet<>(); + if (line.length() != LOADING_PACKAGE_CHAR.length()) { + Collections.addAll(result, + line.substring(LOADING_PACKAGE_CHAR.length()).split(SPLIT_CHAR)); } + return result; } /** @@ -501,21 +464,26 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { } private boolean isSupportedVersion(int version) { - return version == PACKAGE_DEX_USAGE_SUPPORTED_VERSION_1 - || version == PACKAGE_DEX_USAGE_SUPPORTED_VERSION_2; + return version == PACKAGE_DEX_USAGE_VERSION; } /** * Syncs the existing data with the set of available packages by removing obsolete entries. */ /*package*/ void syncData(Map<String, Set<Integer>> packageToUsersMap, - Map<String, Set<String>> packageToCodePaths) { + Map<String, Set<String>> packageToCodePaths, + List<String> packagesToKeepDataAbout) { synchronized (mPackageUseInfoMap) { Iterator<Map.Entry<String, PackageUseInfo>> pIt = mPackageUseInfoMap.entrySet().iterator(); while (pIt.hasNext()) { Map.Entry<String, PackageUseInfo> pEntry = pIt.next(); String packageName = pEntry.getKey(); + if (packagesToKeepDataAbout.contains(packageName)) { + // This is a package for which we should keep the data even if it's not + // in the list of user packages. + continue; + } PackageUseInfo packageUseInfo = pEntry.getValue(); Set<Integer> users = packageToUsersMap.get(packageName); if (users == null) { @@ -536,22 +504,31 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { // Sync the code paths. Set<String> codePaths = packageToCodePaths.get(packageName); - Iterator<Map.Entry<String, Set<String>>> codeIt = - packageUseInfo.mCodePathsUsedByOtherApps.entrySet().iterator(); - while (codeIt.hasNext()) { - if (!codePaths.contains(codeIt.next().getKey())) { - codeIt.remove(); + + Iterator<Map.Entry<String, Set<String>>> recordedIt = + packageUseInfo.mPrimaryCodePaths.entrySet().iterator(); + while (recordedIt.hasNext()) { + Map.Entry<String, Set<String>> entry = recordedIt.next(); + String recordedCodePath = entry.getKey(); + if (!codePaths.contains(recordedCodePath)) { + // Clean up a non existing code path. + recordedIt.remove(); + } else { + // Clean up a non existing loading package. + Set<String> recordedLoadingPackages = entry.getValue(); + Iterator<String> recordedLoadingPackagesIt = + recordedLoadingPackages.iterator(); + while (recordedLoadingPackagesIt.hasNext()) { + String recordedLoadingPackage = recordedLoadingPackagesIt.next(); + if (!packagesToKeepDataAbout.contains(recordedLoadingPackage) + && !packageToUsersMap.containsKey(recordedLoadingPackage)) { + recordedLoadingPackagesIt.remove(); + } + } } } - // In case the package was marked as used by other apps in a previous version - // propagate the flag to all the code paths. - // See mUsedByOtherAppsBeforeUpgrade docs on why it is important to do it. - if (packageUseInfo.mUsedByOtherAppsBeforeUpgrade) { - for (String codePath : codePaths) { - packageUseInfo.mergeCodePathUsedByOtherApps(codePath, true, null, null); - } - } else if (!packageUseInfo.isAnyCodePathUsedByOtherApps() + if (!packageUseInfo.isAnyCodePathUsedByOtherApps() && packageUseInfo.mDexUseInfoMap.isEmpty()) { // The package is not used by other apps and we removed all its dex files // records. Remove the entire package record as well. @@ -712,35 +689,26 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { * Stores data on how a package and its dex files are used. */ public static class PackageUseInfo { + // The name of the package this info belongs to. + private final String mPackageName; // The app's code paths that are used by other apps. // The key is the code path and the value is the set of loading packages. - private final Map<String, Set<String>> mCodePathsUsedByOtherApps; + private final Map<String, Set<String>> mPrimaryCodePaths; // Map dex paths to their data (isUsedByOtherApps, owner id, loader isa). private final Map<String, DexUseInfo> mDexUseInfoMap; - // Keeps track of whether or not this package was used by other apps before - // we upgraded to VERSION 4 which records the info for each code path separately. - // This is unwanted complexity but without it we risk to profile guide compile - // something that supposed to be shared. For example: - // 1) we determine that chrome is used by another app - // 2) we take an OTA which upgrades the way we keep track of usage data - // 3) chrome doesn't get used until the background job executes - // 4) as part of the backgound job we now think that chrome is not used by others - // and we speed-profile. - // 5) as a result the next time someone uses chrome it will extract from apk since - // the compiled code will be private. - private boolean mUsedByOtherAppsBeforeUpgrade; - - /*package*/ PackageUseInfo() { - mCodePathsUsedByOtherApps = new HashMap<>(); + /*package*/ PackageUseInfo(String packageName) { + mPrimaryCodePaths = new HashMap<>(); mDexUseInfoMap = new HashMap<>(); + mPackageName = packageName; } // Creates a deep copy of the `other`. private PackageUseInfo(PackageUseInfo other) { - mCodePathsUsedByOtherApps = new HashMap<>(); - for (Map.Entry<String, Set<String>> e : other.mCodePathsUsedByOtherApps.entrySet()) { - mCodePathsUsedByOtherApps.put(e.getKey(), new HashSet<>(e.getValue())); + mPackageName = other.mPackageName; + mPrimaryCodePaths = new HashMap<>(); + for (Map.Entry<String, Set<String>> e : other.mPrimaryCodePaths.entrySet()) { + mPrimaryCodePaths.put(e.getKey(), new HashSet<>(e.getValue())); } mDexUseInfoMap = new HashMap<>(); @@ -749,28 +717,29 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { } } - private boolean mergeCodePathUsedByOtherApps(String codePath, boolean isUsedByOtherApps, - String owningPackageName, String loadingPackage) { - if (!isUsedByOtherApps) { - // Nothing to update if the the code path is not used by other apps. - return false; - } - - boolean newCodePath = false; - Set<String> loadingPackages = mCodePathsUsedByOtherApps.get(codePath); + private boolean mergePrimaryCodePaths(String codePath, String loadingPackage) { + Set<String> loadingPackages = mPrimaryCodePaths.get(codePath); if (loadingPackages == null) { loadingPackages = new HashSet<>(); - mCodePathsUsedByOtherApps.put(codePath, loadingPackages); - newCodePath = true; + mPrimaryCodePaths.put(codePath, loadingPackages); } - boolean newLoadingPackage = loadingPackage != null - && !loadingPackage.equals(owningPackageName) - && loadingPackages.add(loadingPackage); - return newCodePath || newLoadingPackage; + return loadingPackages.add(loadingPackage); } public boolean isUsedByOtherApps(String codePath) { - return mCodePathsUsedByOtherApps.containsKey(codePath); + if (mPrimaryCodePaths.containsKey(codePath)) { + Set<String> loadingPackages = mPrimaryCodePaths.get(codePath); + if (loadingPackages.contains(mPackageName)) { + // If the owning package is in the list then this code path + // is used by others if there are other packages in the list. + return loadingPackages.size() > 1; + } else { + // The owning package is not in the loading packages. So if + // the list is non-empty then the code path is used by others. + return !loadingPackages.isEmpty(); + } + } + return false; } public Map<String, DexUseInfo> getDexUseInfoMap() { @@ -778,11 +747,11 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { } public Set<String> getLoadingPackages(String codePath) { - return mCodePathsUsedByOtherApps.getOrDefault(codePath, null); + return mPrimaryCodePaths.getOrDefault(codePath, null); } public boolean isAnyCodePathUsedByOtherApps() { - return !mCodePathsUsedByOtherApps.isEmpty(); + return !mPrimaryCodePaths.isEmpty(); } /** @@ -790,16 +759,16 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { * Returns whether or not there was an update. */ /*package*/ boolean clearCodePathUsedByOtherApps() { - // Update mUsedByOtherAppsBeforeUpgrade as well to be consistent with - // the new data. This is not saved to disk so we don't need to return it. - mUsedByOtherAppsBeforeUpgrade = true; - - if (mCodePathsUsedByOtherApps.isEmpty()) { - return false; - } else { - mCodePathsUsedByOtherApps.clear(); - return true; + boolean updated = false; + List<String> retainOnlyOwningPackage = new ArrayList<>(1); + retainOnlyOwningPackage.add(mPackageName); + for (Map.Entry<String, Set<String>> entry : mPrimaryCodePaths.entrySet()) { + // Remove or loading packages but the owning one. + if (entry.getValue().retainAll(retainOnlyOwningPackage)) { + updated = true; + } } + return updated; } } @@ -847,11 +816,9 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { boolean updateLoadingPackages = mLoadingPackages.addAll(dexUseInfo.mLoadingPackages); String oldClassLoaderContext = mClassLoaderContext; - if (isUnknownOrUnsupportedContext(mClassLoaderContext)) { - // Can happen if we read a previous version. + if (isUnsupportedContext(mClassLoaderContext)) { mClassLoaderContext = dexUseInfo.mClassLoaderContext; - } else if (!isUnknownOrUnsupportedContext(dexUseInfo.mClassLoaderContext) - && !Objects.equals(mClassLoaderContext, dexUseInfo.mClassLoaderContext)) { + } else if (!Objects.equals(mClassLoaderContext, dexUseInfo.mClassLoaderContext)) { // We detected a context change. mClassLoaderContext = VARIABLE_CLASS_LOADER_CONTEXT; } @@ -862,11 +829,8 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { || !Objects.equals(oldClassLoaderContext, mClassLoaderContext); } - private static boolean isUnknownOrUnsupportedContext(String context) { - // TODO: Merge UNKNOWN_CLASS_LOADER_CONTEXT & UNSUPPORTED_CLASS_LOADER_CONTEXT cases - // into UNSUPPORTED_CLASS_LOADER_CONTEXT. - return UNKNOWN_CLASS_LOADER_CONTEXT.equals(context) - || UNSUPPORTED_CLASS_LOADER_CONTEXT.equals(context); + private static boolean isUnsupportedContext(String context) { + return UNSUPPORTED_CLASS_LOADER_CONTEXT.equals(context); } public boolean isUsedByOtherApps() { @@ -887,10 +851,8 @@ public class PackageDexUsage extends AbstractStatsBase<Void> { public String getClassLoaderContext() { return mClassLoaderContext; } - public boolean isUnknownClassLoaderContext() { - // The class loader context may be unknown if we loaded the data from a previous version - // which didn't save the context. - return isUnknownOrUnsupportedContext(mClassLoaderContext); + public boolean isUnsupportedClassLoaderContext() { + return isUnsupportedContext(mClassLoaderContext); } public boolean isVariableClassLoaderContext() { diff --git a/services/core/java/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater.java b/services/core/java/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater.java new file mode 100644 index 000000000000..ee3c406fc448 --- /dev/null +++ b/services/core/java/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.pm.parsing.library; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.server.pm.parsing.pkg.ParsedPackage; + +/** + * Updates a package to remove dependency on com.google.android.maps library. + * + * @hide + */ +@VisibleForTesting +public class ComGoogleAndroidMapsUpdater extends PackageSharedLibraryUpdater { + + private static final String LIBRARY_NAME = "com.google.android.maps"; + + @Override + public void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp) { + parsedPackage.removeUsesLibrary(LIBRARY_NAME); + parsedPackage.removeUsesOptionalLibrary(LIBRARY_NAME); + } +} diff --git a/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java b/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java index 1d018c485e08..1405a7d613f1 100644 --- a/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java +++ b/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java @@ -45,6 +45,9 @@ public class PackageBackwardCompatibility extends PackageSharedLibraryUpdater { static { final List<PackageSharedLibraryUpdater> packageUpdaters = new ArrayList<>(); + // Remove com.google.android.maps library. + packageUpdaters.add(new ComGoogleAndroidMapsUpdater()); + // Automatically add the org.apache.http.legacy library to the app classpath if the app // targets < P. packageUpdaters.add(new OrgApacheHttpLegacyUpdater()); diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 24ab89b027b2..e9da2c4c8472 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -3039,7 +3039,7 @@ public class StatsPullAtomService extends SystemService { e.writeInt(message.getUid()); e.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true); e.writeString(message.getPackageName()); - e.writeString(message.getOp()); + e.writeString(""); if (message.getAttributionTag() == null) { e.writeString(""); } else { @@ -3047,6 +3047,7 @@ public class StatsPullAtomService extends SystemService { } e.writeString(message.getMessage()); e.writeInt(message.getSamplingStrategy()); + e.writeInt(AppOpsManager.strOpToOp(message.getOp())); pulledData.add(e.build()); } catch (Throwable t) { diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java index 778683369de5..c2ecd41e7dbf 100644 --- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java +++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java @@ -176,8 +176,12 @@ public class TestHarnessModeService extends SystemService { private void setUpAdbFiles(PersistentData persistentData) { AdbManagerInternal adbManager = LocalServices.getService(AdbManagerInternal.class); - writeBytesToFile(persistentData.mAdbKeys, adbManager.getAdbKeysFile().toPath()); - writeBytesToFile(persistentData.mAdbTempKeys, adbManager.getAdbTempKeysFile().toPath()); + if (adbManager.getAdbKeysFile() != null) { + writeBytesToFile(persistentData.mAdbKeys, adbManager.getAdbKeysFile().toPath()); + } + if (adbManager.getAdbTempKeysFile() != null) { + writeBytesToFile(persistentData.mAdbTempKeys, adbManager.getAdbTempKeysFile().toPath()); + } } private void configureUser() { @@ -310,12 +314,6 @@ public class TestHarnessModeService extends SystemService { AdbManagerInternal adbManager = LocalServices.getService(AdbManagerInternal.class); File adbKeys = adbManager.getAdbKeysFile(); File adbTempKeys = adbManager.getAdbTempKeysFile(); - if (adbKeys == null && adbTempKeys == null) { - // This should only be accessible on eng builds that haven't yet set up ADB keys - getErrPrintWriter() - .println("No ADB keys stored; not enabling test harness mode"); - return 1; - } try { byte[] adbKeysBytes = getBytesFromFile(adbKeys); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index ddf166eb0bd5..63952b086c1c 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1904,7 +1904,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub final WallpaperData fallback = new WallpaperData(wallpaper.userId, getWallpaperDir(wallpaper.userId), WALLPAPER_LOCK_ORIG, WALLPAPER_LOCK_CROP); - ensureSaneWallpaperData(fallback, DEFAULT_DISPLAY); + ensureSaneWallpaperData(fallback); bindWallpaperComponentLocked(mImageWallpaper, true, false, fallback, reply); mWaitingForUnlock = true; } @@ -2425,7 +2425,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (cropHint == null) { cropHint = new Rect(0, 0, 0, 0); } else { - if (cropHint.isEmpty() + if (cropHint.width() < 0 || cropHint.height() < 0 || cropHint.left < 0 || cropHint.top < 0) { throw new IllegalArgumentException("Invalid crop rect supplied: " + cropHint); @@ -3077,7 +3077,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub wallpaper = new WallpaperData(userId, getWallpaperDir(userId), WALLPAPER_LOCK_ORIG, WALLPAPER_LOCK_CROP); mLockWallpaperMap.put(userId, wallpaper); - ensureSaneWallpaperData(wallpaper, DEFAULT_DISPLAY); + ensureSaneWallpaperData(wallpaper); } else { // sanity fallback: we're in bad shape, but establishing a known // valid system+lock WallpaperData will keep us from dying. @@ -3085,7 +3085,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub wallpaper = new WallpaperData(userId, getWallpaperDir(userId), WALLPAPER, WALLPAPER_CROP); mWallpaperMap.put(userId, wallpaper); - ensureSaneWallpaperData(wallpaper, DEFAULT_DISPLAY); + ensureSaneWallpaperData(wallpaper); } } } @@ -3196,10 +3196,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } ensureSaneWallpaperDisplaySize(wpdData, DEFAULT_DISPLAY); - ensureSaneWallpaperData(wallpaper, DEFAULT_DISPLAY); + ensureSaneWallpaperData(wallpaper); WallpaperData lockWallpaper = mLockWallpaperMap.get(userId); if (lockWallpaper != null) { - ensureSaneWallpaperData(lockWallpaper, DEFAULT_DISPLAY); + ensureSaneWallpaperData(lockWallpaper); } } @@ -3215,15 +3215,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } - private void ensureSaneWallpaperData(WallpaperData wallpaper, int displayId) { - final DisplayData size = getDisplayDataOrCreate(displayId); - - if (displayId == DEFAULT_DISPLAY) { - // crop, if not previously specified - if (wallpaper.cropHint.width() <= 0 - || wallpaper.cropHint.height() <= 0) { - wallpaper.cropHint.set(0, 0, size.mWidth, size.mHeight); - } + private void ensureSaneWallpaperData(WallpaperData wallpaper) { + // Only overwrite cropHint if the rectangle is invalid. + if (wallpaper.cropHint.width() < 0 + || wallpaper.cropHint.height() < 0) { + wallpaper.cropHint.set(0, 0, 0, 0); } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index c1c844078d6f..a66741c90b1c 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -7411,7 +7411,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A */ boolean isResumedActivityOnDisplay() { final DisplayContent display = getDisplay(); - return display != null && this == display.mTaskContainers.getResumedActivity(); + if (display == null) { + return false; + } + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + final ActivityRecord resumedActivity = taskDisplayArea.getFocusedActivity(); + if (resumedActivity != null) { + return resumedActivity == this; + } + } + return false; } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 10b335e583b0..f5eba96a96d1 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -1119,8 +1119,8 @@ class ActivityStack extends Task { @Override public boolean isAttached() { - final DisplayContent display = getDisplay(); - return display != null && !display.isRemoved(); + final TaskDisplayArea taskDisplayArea = getDisplayArea(); + return taskDisplayArea != null && !taskDisplayArea.isRemoved(); } // TODO: Should each user have there own stacks? @@ -3553,9 +3553,8 @@ class ActivityStack extends Task { } } - void reparent(DisplayContent newParent, boolean onTop) { - // Real parent of stack is within display object, so we have to delegate re-parenting there. - newParent.moveStackToDisplay(this, onTop); + void reparent(TaskDisplayArea newParent, boolean onTop) { + reparent(newParent, onTop ? POSITION_TOP : POSITION_BOTTOM); } private void updateSurfaceBounds() { diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index 2c7ce9104c3c..02601ff4b6e3 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -385,15 +385,15 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { private final MoveTaskToFullscreenHelper mMoveTaskToFullscreenHelper = new MoveTaskToFullscreenHelper(); private class MoveTaskToFullscreenHelper { - private DisplayContent mToDisplay; + private TaskDisplayArea mToDisplayArea; private boolean mOnTop; private Task mTopTask; private boolean mSchedulePictureInPictureModeChange; - void process(ActivityStack fromStack, DisplayContent toDisplay, boolean onTop, + void process(ActivityStack fromStack, TaskDisplayArea toDisplayArea, boolean onTop, boolean schedulePictureInPictureModeChange) { mSchedulePictureInPictureModeChange = schedulePictureInPictureModeChange; - mToDisplay = toDisplay; + mToDisplayArea = toDisplayArea; mOnTop = onTop; mTopTask = fromStack.getTopMostTask(); @@ -401,7 +401,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { MoveTaskToFullscreenHelper::processLeafTask, this, PooledLambda.__(Task.class)); fromStack.forAllLeafTasks(c, false /* traverseTopToBottom */); c.recycle(); - mToDisplay = null; + mToDisplayArea = null; mTopTask = null; } @@ -411,19 +411,18 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { task.getActivityType())) { final ActivityStack stack = (ActivityStack) task; stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); - if (mToDisplay.getDisplayId() != stack.getDisplayId()) { - mToDisplay.moveStackToDisplay(stack, mOnTop); + if (mToDisplayArea.getDisplayId() != stack.getDisplayId()) { + stack.reparent(mToDisplayArea, mOnTop); } else if (mOnTop) { - mToDisplay.mTaskContainers.positionStackAtTop(stack, - false /* includingParents */); + mToDisplayArea.positionStackAtTop(stack, false /* includingParents */); } else { - mToDisplay.mTaskContainers.positionStackAtBottom(stack); + mToDisplayArea.positionStackAtBottom(stack); } return; } - final ActivityStack toStack = mToDisplay.mTaskContainers.getOrCreateStack( - null, mTmpOptions, task, task.getActivityType(), mOnTop); + final ActivityStack toStack = mToDisplayArea.getOrCreateStack(null, mTmpOptions, task, + task.getActivityType(), mOnTop); if (task == toStack) { // The task was reused as the root task. return; @@ -566,8 +565,8 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } void moveRecentsStackToFront(String reason) { - final ActivityStack recentsStack = mRootWindowContainer.getDefaultDisplay().getStack( - WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS); + final ActivityStack recentsStack = mRootWindowContainer.getDefaultTaskDisplayArea() + .getStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS); if (recentsStack != null) { recentsStack.moveToFront(reason); } @@ -1418,7 +1417,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { mRootWindowContainer.getLaunchStack(null, options, task, ON_TOP); if (stack != currentStack) { - moveHomeStackToFrontIfNeeded(flags, stack.getDisplay(), reason); + moveHomeStackToFrontIfNeeded(flags, stack.getDisplayArea(), reason); task.reparent(stack, ON_TOP, REPARENT_KEEP_STACK_AT_FRONT, !ANIMATE, DEFER_RESUME, reason); currentStack = stack; @@ -1437,7 +1436,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } if (!reparented) { - moveHomeStackToFrontIfNeeded(flags, currentStack.getDisplay(), reason); + moveHomeStackToFrontIfNeeded(flags, currentStack.getDisplayArea(), reason); } final ActivityRecord r = task.getTopNonFinishingActivity(); @@ -1451,15 +1450,16 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { currentStack, forceNonResizeable); } - private void moveHomeStackToFrontIfNeeded(int flags, DisplayContent display, String reason) { - final ActivityStack focusedStack = display.getFocusedStack(); + private void moveHomeStackToFrontIfNeeded(int flags, TaskDisplayArea taskDisplayArea, + String reason) { + final ActivityStack focusedStack = taskDisplayArea.getFocusedStack(); - if ((display.getWindowingMode() == WINDOWING_MODE_FULLSCREEN + if ((taskDisplayArea.getWindowingMode() == WINDOWING_MODE_FULLSCREEN && (flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) || (focusedStack != null && focusedStack.isActivityTypeRecents())) { - // We move home stack to front when we are on a fullscreen display and caller has + // We move home stack to front when we are on a fullscreen display area and caller has // requested the home activity to move with it. Or the previous stack is recents. - display.mTaskContainers.moveHomeStackToFront(reason); + taskDisplayArea.moveHomeStackToFront(reason); } } @@ -1511,15 +1511,15 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { mService.deferWindowLayout(); try { final int windowingMode = fromStack.getWindowingMode(); - final DisplayContent toDisplay = - mRootWindowContainer.getDisplayContent(toDisplayId); + final TaskDisplayArea toDisplayArea = mRootWindowContainer + .getDisplayContent(toDisplayId).getDefaultTaskDisplayArea(); if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { // We are moving all tasks from the docked stack to the fullscreen stack, // 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 = toDisplay.getStackCount() - 1; i >= 0; --i) { - final ActivityStack otherStack = toDisplay.getStackAt(i); + for (int i = toDisplayArea.getStackCount() - 1; i >= 0; --i) { + final ActivityStack otherStack = toDisplayArea.getStackAt(i); if (!otherStack.inSplitScreenSecondaryWindowingMode()) { continue; } @@ -1535,7 +1535,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { if (fromStack.hasChild()) { mTmpOptions.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN); mMoveTaskToFullscreenHelper.process( - fromStack, toDisplay, onTop, schedulePictureInPictureModeChange); + fromStack, toDisplayArea, onTop, schedulePictureInPictureModeChange); } mRootWindowContainer.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS); @@ -1546,6 +1546,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } void moveTasksToFullscreenStackLocked(ActivityStack fromStack, boolean onTop) { + // TODO(b/153089193): Support moving within the same task display area mWindowManager.inSurfaceTransaction(() -> moveTasksToFullscreenStackInSurfaceTransaction(fromStack, DEFAULT_DISPLAY, onTop)); } @@ -2613,7 +2614,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // from whatever is started from the recents activity, so move the home stack // forward. // TODO (b/115289124): Multi-display supports for recents. - mRootWindowContainer.getDefaultDisplay().mTaskContainers.moveHomeStackToFront( + mRootWindowContainer.getDefaultTaskDisplayArea().moveHomeStackToFront( "startActivityFromRecents"); } diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index 0a0049d1550d..d777f3fee1a2 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -189,9 +189,10 @@ public class ActivityStartController { mSupervisor.beginDeferResume(); final ActivityStack homeStack; try { + // TODO(multi-display-area): Support starting home in a task display area // Make sure home stack exist on display. - homeStack = display.mTaskContainers.getOrCreateStack(WINDOWING_MODE_FULLSCREEN, - ACTIVITY_TYPE_HOME, ON_TOP); + homeStack = display.getDefaultTaskDisplayArea().getOrCreateStack( + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); } finally { mSupervisor.endDeferResume(); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7803c7370dac..0b1968765300 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -4283,9 +4283,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { long ident = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { - final DisplayContent dc = mRootWindowContainer.getDefaultDisplay(); - final Task primary = dc.getRootSplitScreenPrimaryTask(); - final Task secondary = dc.getTask(t -> t.mCreatedByOrganizer && t.isRootTask() + final TaskDisplayArea tc = mRootWindowContainer.getDefaultTaskDisplayArea(); + final Task primary = tc.getRootSplitScreenPrimaryTask(); + final Task secondary = tc.getTask(t -> t.mCreatedByOrganizer && t.isRootTask() && t.inSplitScreenSecondaryWindowingMode()); if (primary == null || secondary == null) { return; @@ -4301,7 +4301,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { if (otherRect == null) { // Temporary estimation... again this is just for tests. otherRect = new Rect(secondary.getBounds()); - if (dc.getBounds().width() > dc.getBounds().height()) { + if (tc.getBounds().width() > tc.getBounds().height()) { otherRect.left = primaryRect.right + 6; } else { otherRect.top = primaryRect.bottom + 6; diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java index 682a14220dff..e8becfa27fac 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java +++ b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java @@ -54,7 +54,7 @@ import java.util.Map; * - DisplayArea.Root * - Magnification * - DisplayArea.Tokens (Wallpapers are attached here) - * - TaskContainers + * - TaskDisplayArea * - DisplayArea.Tokens (windows above Tasks up to IME are attached here) * - ImeContainers * - DisplayArea.Tokens (windows above IME up to TYPE_ACCESSIBILITY_OVERLAY attached here) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 55b7be779690..7931cd58d977 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -575,13 +575,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private RootWindowContainer mRootWindowContainer; - /** - * All of the stacks on this display. Order matters, topmost stack is in front of all other - * stacks, bottommost behind. Accessed directly by ActivityManager package classes. Any calls - * changing the list should also call {@link #onStackOrderChanged()}. - */ - private ArrayList<OnStackOrderChangedListener> mStackOrderChangedCallbacks = new ArrayList<>(); - /** Array of all UIDs that are present on the display. */ private IntArray mDisplayAccessUIDs = new IntArray(); @@ -2062,63 +2055,58 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return (mDisplay.getFlags() & FLAG_PRIVATE) != 0; } - ActivityStack getRootHomeTask() { - return mTaskContainers.getRootHomeTask(); - } - - /** @return The primary split-screen task, and {@code null} otherwise. */ - @Nullable ActivityStack getRootSplitScreenPrimaryTask() { - return mTaskContainers.getRootSplitScreenPrimaryTask(); - } - - ActivityStack getRootPinnedTask() { - return mTaskContainers.getRootPinnedTask(); - } - - boolean hasPinnedTask() { - return mTaskContainers.getRootPinnedTask() != null; - } - /** * Returns the topmost stack on the display that is compatible with the input windowing mode and * activity type. Null is no compatible stack on the display. */ ActivityStack getStack(int windowingMode, int activityType) { - return mTaskContainers.getStack(windowingMode, activityType); - } - - protected int getStackCount() { - return mTaskContainers.mChildren.size(); + for (int tdaNdx = getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final ActivityStack stack = getTaskDisplayAreaAt(tdaNdx) + .getStack(windowingMode, activityType); + if (stack != null) { + return stack; + } + } + return null; } - protected ActivityStack getStackAt(int index) { - return mTaskContainers.mChildren.get(index); + protected int getTaskDisplayAreaCount() { + // TODO(multi-display-area): Report actual display area count + return 1; } - int getIndexOf(ActivityStack stack) { - return mTaskContainers.getIndexOf(stack); + protected TaskDisplayArea getTaskDisplayAreaAt(int index) { + // TODO(multi-display-area): Report actual display area values + return mTaskContainers; } - void removeStack(ActivityStack stack) { - mTaskContainers.removeChild(stack); + ActivityStack getStack(int rootTaskId) { + for (int tdaNdx = getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final ActivityStack stack = getTaskDisplayAreaAt(tdaNdx).getStack(rootTaskId); + if (stack != null) { + return stack; + } + } + return null; } - @VisibleForTesting - WindowList<ActivityStack> getStacks() { - return mTaskContainers.mChildren; + protected int getStackCount() { + int totalStackCount = 0; + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + totalStackCount += getTaskDisplayAreaAt(i).getStackCount(); + } + return totalStackCount; } @VisibleForTesting ActivityStack getTopStack() { - return mTaskContainers.getTopStack(); - } - - ArrayList<Task> getVisibleTasks() { - return mTaskContainers.getVisibleTasks(); - } - - SurfaceControl getSplitScreenDividerAnchor() { - return mTaskContainers.getSplitScreenDividerAnchor(); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + final ActivityStack stack = getTaskDisplayAreaAt(i).getTopStack(); + if (stack != null) { + return stack; + } + } + return null; } /** @@ -2409,8 +2397,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo out.set(mDisplayFrames.mStable); } - void moveStackToDisplay(ActivityStack stack, boolean onTop) { - stack.reparent(mTaskContainers, onTop ? POSITION_TOP: POSITION_BOTTOM); + /** + * Get the default display area on the display dedicated to app windows. This one should be used + * only as a fallback location for activity launches when no target display area is specified, + * or for cases when multi-instance is not supported yet (like Split-screen, PiP or Recents). + */ + TaskDisplayArea getDefaultTaskDisplayArea() { + return mTaskContainers; } @Override @@ -2473,7 +2466,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo */ Task findTaskForResizePoint(int x, int y) { final int delta = dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, mDisplayMetrics); - return mTmpTaskForResizePointSearchResult.process(mTaskContainers, x, y, delta); + return mTmpTaskForResizePointSearchResult.process(getDefaultTaskDisplayArea(), x, y, delta); } void updateTouchExcludeRegion() { @@ -2489,7 +2482,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final PooledConsumer c = PooledLambda.obtainConsumer( DisplayContent::processTaskForTouchExcludeRegion, this, PooledLambda.__(Task.class), focusedTask, delta); - mTaskContainers.forAllTasks(c); + forAllTasks(c); c.recycle(); // If we removed the focused task above, add it back and only leave its @@ -2512,8 +2505,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mTouchExcludeRegion.op(mTmpRegion, Region.Op.UNION); } amendWindowTapExcludeRegion(mTouchExcludeRegion); - // TODO(multi-display): Support docked stacks on secondary displays. - if (mDisplayId == DEFAULT_DISPLAY && mTaskContainers.isSplitScreenModeActivated()) { + // TODO(multi-display): Support docked stacks on secondary displays & task containers. + if (mDisplayId == DEFAULT_DISPLAY + && getDefaultTaskDisplayArea().isSplitScreenModeActivated()) { mDividerControllerLocked.getTouchRegion(mTmpRect); mTmpRegion.set(mTmpRect); mTouchExcludeRegion.op(mTmpRegion, Op.UNION); @@ -2669,9 +2663,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void prepareFreezingTaskBounds() { - for (int stackNdx = mTaskContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = mTaskContainers.getChildAt(stackNdx); - stack.prepareFreezingTaskBounds(); + for (int tdaNdx = getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + getTaskDisplayAreaAt(tdaNdx).prepareFreezingTaskBounds(); } } @@ -2777,8 +2770,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final ActivityStack focusedStack = getFocusedStack(); if (focusedStack != null) { proto.write(FOCUSED_ROOT_TASK_ID, focusedStack.getRootTaskId()); - final ActivityRecord focusedActivity = focusedStack.getDisplay().mTaskContainers - .getResumedActivity(); + final ActivityRecord focusedActivity = focusedStack.getDisplayArea() + .getFocusedActivity(); if (focusedActivity != null) { focusedActivity.writeIdentifierToProto(proto, RESUMED_ACTIVITY); } @@ -2836,13 +2829,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo if (mLastFocus != mCurrentFocus) { pw.print(" mLastFocus="); pw.println(mLastFocus); } - if (mTaskContainers.mPreferredTopFocusableStack != null) { - pw.println(prefix + "mPreferredTopFocusableStack=" - + mTaskContainers.mPreferredTopFocusableStack); - } - if (mTaskContainers.mLastFocusedStack != null) { - pw.println(prefix + "mLastFocusedStack=" + mTaskContainers.mLastFocusedStack); - } if (mLosingFocus.size() > 0) { pw.println(); pw.println(" Windows losing focus:"); @@ -2876,10 +2862,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } pw.println(); - pw.println(prefix + "Application tokens in top down Z order:"); - for (int stackNdx = mTaskContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = mTaskContainers.getChildAt(stackNdx); - stack.dump(pw, prefix + " ", dumpAll); + pw.println(prefix + "Task display areas in top down Z order:"); + for (int tdaNdx = getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + getTaskDisplayAreaAt(tdaNdx).dump(pw, prefix + " ", dumpAll); } pw.println(); @@ -2908,20 +2893,22 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo pw.println(); // Dump stack references - final ActivityStack homeStack = getRootHomeTask(); + final ActivityStack homeStack = getDefaultTaskDisplayArea().getRootHomeTask(); if (homeStack != null) { pw.println(prefix + "homeStack=" + homeStack.getName()); } - final ActivityStack pinnedStack = getRootPinnedTask(); + final ActivityStack pinnedStack = getDefaultTaskDisplayArea().getRootPinnedTask(); if (pinnedStack != null) { pw.println(prefix + "pinnedStack=" + pinnedStack.getName()); } - final ActivityStack splitScreenPrimaryStack = getRootSplitScreenPrimaryTask(); + final ActivityStack splitScreenPrimaryStack = getDefaultTaskDisplayArea() + .getRootSplitScreenPrimaryTask(); if (splitScreenPrimaryStack != null) { pw.println(prefix + "splitScreenPrimaryStack=" + splitScreenPrimaryStack.getName()); } - final ActivityStack recentsStack = - getStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS); + // TODO: Support recents on non-default task containers + final ActivityStack recentsStack = getDefaultTaskDisplayArea().getStack( + WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS); if (recentsStack != null) { pw.println(prefix + "recentsStack=" + recentsStack.getName()); } @@ -2955,12 +2942,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return "Display " + mDisplayId + " name=\"" + mDisplayInfo.name + "\""; } - /** Returns true if the stack in the windowing mode is visible. */ - boolean isStackVisible(int windowingMode) { - final ActivityStack stack = mTaskContainers.getTopStackInWindowingMode(windowingMode); - return stack != null && stack.isVisible(); - } - /** Find the visible, touch-deliverable window under the given point */ WindowState getTouchableWinAtPointLocked(float xf, float yf) { final int x = (int) xf; @@ -4045,7 +4026,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } // Initialize state of exiting applications. - mTaskContainers.setExitingTokensHasVisible(hasVisible); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + getTaskDisplayAreaAt(i).setExitingTokensHasVisible(hasVisible); + } } void removeExistingTokensIfPossible() { @@ -4057,7 +4040,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } // Time to remove any exiting applications? - mTaskContainers.removeExistingAppTokensIfPossible(); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + getTaskDisplayAreaAt(i).removeExistingAppTokensIfPossible(); + } } @Override @@ -4367,7 +4352,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // We skip IME windows so they're processed just above their target, except // in split-screen mode where we process the IME containers above the docked divider. return dc.mInputMethodTarget != null - && !dc.mTaskContainers.isSplitScreenModeActivated(); + && !dc.getDefaultTaskDisplayArea().isSplitScreenModeActivated(); } /** Like {@link #forAllWindows}, but ignores {@link #skipImeWindowsDuringTraversal} */ @@ -4518,7 +4503,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void assignStackOrdering() { - mTaskContainers.assignStackOrdering(getPendingTransaction()); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + getTaskDisplayAreaAt(i).assignStackOrdering(getPendingTransaction()); + } } /** @@ -5045,13 +5032,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo || windowingMode == WINDOWING_MODE_MULTI_WINDOW); } - ActivityStack createStack(int windowingMode, int activityType, boolean onTop) { - return mTaskContainers.createStack(windowingMode, activityType, onTop, null /* info */, - null /* intent */, false /* createdByOrganizer */); - } - + @Nullable ActivityStack getFocusedStack() { - return mTaskContainers.getFocusedStack(); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + final ActivityStack stack = getTaskDisplayAreaAt(i).getFocusedStack(); + if (stack != null) { + return stack; + } + } + return null; } /** @@ -5059,11 +5048,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED */ void removeStacksInWindowingModes(int... windowingModes) { - mTaskContainers.removeStacksInWindowingModes(windowingModes); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + getTaskDisplayAreaAt(i).removeStacksInWindowingModes(windowingModes); + } } void removeStacksWithActivityTypes(int... activityTypes) { - mTaskContainers.removeStacksWithActivityTypes(activityTypes); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + getTaskDisplayAreaAt(i).removeStacksWithActivityTypes(activityTypes); + } } ActivityRecord topRunningActivity() { @@ -5080,7 +5073,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * @return The top running activity. {@code null} if none is available. */ ActivityRecord topRunningActivity(boolean considerKeyguardState) { - return mTaskContainers.topRunningActivity(considerKeyguardState); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + final ActivityRecord activity = getTaskDisplayAreaAt(i) + .topRunningActivity(considerKeyguardState); + if (activity != null) { + return activity; + } + } + return null; } boolean updateDisplayOverrideConfigurationLocked() { @@ -5192,7 +5192,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // The display may be about to rotate seamlessly, and the animation of closing apps may // still animate in old rotation. So make sure the outdated animation won't show on the // rotated display. - mTaskContainers.forAllActivities(a -> { + forAllActivities(a -> { if (a.nowVisible && a != mFixedRotationLaunchingApp && a.getWindowConfiguration().getRotation() != newRotation) { final WindowContainer<?> w = a.getAnimatingContainer(); @@ -5253,40 +5253,17 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void remove() { mRemoving = true; - final boolean destroyContentOnRemoval = shouldDestroyContentOnRemove(); ActivityStack lastReparentedStack = null; - mTaskContainers.mPreferredTopFocusableStack = null; - - // Stacks could be reparented from the removed display to other display. While - // reparenting the last stack of the removed display, the remove display is ready to be - // released (no more ActivityStack). But, we cannot release it at that moment or the - // related WindowContainer will also be removed. So, we set display as removed after - // reparenting stack finished. - final DisplayContent toDisplay = mRootWindowContainer.getDefaultDisplay(); + mRootWindowContainer.mStackSupervisor.beginDeferResume(); try { - int numStacks = getStackCount(); - // Keep the order from bottom to top. - for (int stackNdx = 0; stackNdx < numStacks; stackNdx++) { - final ActivityStack stack = getStackAt(stackNdx); - // Always finish non-standard type stacks. - if (destroyContentOnRemoval || !stack.isActivityTypeStandardOrUndefined()) { - stack.finishAllActivitiesImmediately(); - } else { - // If default display is in split-window mode, set windowing mode of the stack - // to split-screen secondary. Otherwise, set the windowing mode to undefined by - // default to let stack inherited the windowing mode from the new display. - final int windowingMode = toDisplay.mTaskContainers.isSplitScreenModeActivated() - ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY - : WINDOWING_MODE_UNDEFINED; - stack.reparent(toDisplay, true /* onTop */); - stack.setWindowingMode(windowingMode); - lastReparentedStack = stack; + int numTaskContainers = getTaskDisplayAreaCount(); + for (int tdaNdx = 0; tdaNdx < numTaskContainers; tdaNdx++) { + final ActivityStack lastReparentedStackFromArea = getTaskDisplayAreaAt(tdaNdx) + .remove(); + if (lastReparentedStackFromArea != null) { + lastReparentedStack = lastReparentedStackFromArea; } - // Stacks may be removed from this display. Ensure each stack will be processed and - // the loop will end. - stackNdx -= numStacks - getStackCount(); - numStacks = getStackCount(); } } finally { mRootWindowContainer.mStackSupervisor.endDeferResume(); @@ -5313,12 +5290,27 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return; } - final ActivityStack stack = getStackCount() == 1 ? getStackAt(0) : null; - if (stack != null && stack.isActivityTypeHome() && !stack.hasChild()) { - // Release this display if an empty home stack is the only thing left. - // Since it is the last stack, this display will be released along with the stack - // removal. - stack.removeIfPossible(); + // Check if all task display areas have only the empty home stacks left. + boolean onlyEmptyHomeStacksLeft = true; + for (int tdaNdx = getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = getTaskDisplayAreaAt(tdaNdx); + if (taskDisplayArea.getStackCount() != 1) { + onlyEmptyHomeStacksLeft = false; + break; + } + final ActivityStack stack = taskDisplayArea.getStackAt(0); + if (!stack.isActivityTypeHome() || stack.hasChild()) { + onlyEmptyHomeStacksLeft = false; + break; + } + } + if (onlyEmptyHomeStacksLeft) { + // Release this display if only empty home stack(s) are left. This display will be + // released along with the stack(s) removal. + for (int tdaNdx = getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final ActivityStack s = getTaskDisplayAreaAt(tdaNdx).getStackAt(0); + s.removeIfPossible(); + } } else if (getTopStack() == null) { removeIfPossible(); mRootWindowContainer.mStackSupervisor @@ -5377,10 +5369,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void ensureActivitiesVisible(ActivityRecord starting, int configChanges, boolean preserveWindows, boolean notifyClients) { - for (int stackNdx = getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = getStackAt(stackNdx); - stack.ensureActivitiesVisible(starting, configChanges, preserveWindows, - notifyClients); + for (int i = getTaskDisplayAreaCount() - 1; i >= 0; --i) { + getTaskDisplayAreaAt(i).ensureActivitiesVisible(starting, configChanges, + preserveWindows, notifyClients); } } @@ -5392,42 +5383,19 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mSleeping = asleep; } - /** - * Adds a listener to be notified whenever the stack order in the display changes. Currently - * only used by the {@link RecentsAnimation} to determine whether to interrupt and cancel the - * current animation when the system state changes. - */ - void registerStackOrderChangedListener(OnStackOrderChangedListener listener) { - if (!mStackOrderChangedCallbacks.contains(listener)) { - mStackOrderChangedCallbacks.add(listener); - } - } - - /** - * Removes a previously registered stack order change listener. - */ - void unregisterStackOrderChangedListener(OnStackOrderChangedListener listener) { - mStackOrderChangedCallbacks.remove(listener); - } - - /** - * Notifies of a stack order change - * @param stack The stack which triggered the order change - */ - void onStackOrderChanged(ActivityStack stack) { - for (int i = mStackOrderChangedCallbacks.size() - 1; i >= 0; i--) { - mStackOrderChangedCallbacks.get(i).onStackOrderChanged(stack); - } - } - void setDisplayToSingleTaskInstance() { - final int childCount = getStackCount(); - if (childCount > 1) { + final int taskDisplayAreaCount = getTaskDisplayAreaCount(); + if (taskDisplayAreaCount > 1) { + throw new IllegalArgumentException( + "Display already has multiple task display areas. display=" + this); + } + final int stackCount = getDefaultTaskDisplayArea().getStackCount(); + if (stackCount > 1) { throw new IllegalArgumentException("Display already has multiple stacks. display=" + this); } - if (childCount > 0) { - final ActivityStack stack = getStackAt(0); + if (stackCount > 0) { + final ActivityStack stack = getDefaultTaskDisplayArea().getStackAt(0); if (stack.getChildCount() > 1) { throw new IllegalArgumentException("Display stack already has multiple tasks." + " display=" + this + " stack=" + stack); @@ -5448,22 +5416,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } /** - * Callback for when the order of the stacks in the display changes. - */ - interface OnStackOrderChangedListener { - void onStackOrderChanged(ActivityStack stack); - } - - public void dumpStacks(PrintWriter pw) { - for (int i = getStackCount() - 1; i >= 0; --i) { - pw.print(getStackAt(i).getRootTaskId()); - if (i > 0) { - pw.print(","); - } - } - } - - /** * Similar to {@link RootWindowContainer#isAnyNonToastWindowVisibleForUid(int)}, but * used for pid. */ diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 221258e94cb2..f088dbcb0174 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2653,8 +2653,8 @@ public class DisplayPolicy { if (mStatusBarController.setBarShowingLw(true)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; } - } else if (topIsFullscreen - && !mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) { + } else if (topIsFullscreen && !mDisplayContent.getDefaultTaskDisplayArea() + .isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) { if (DEBUG_LAYOUT) Slog.v(TAG, "** HIDING status bar"); if (mStatusBarController.setBarShowingLw(false)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; @@ -3247,7 +3247,7 @@ public class DisplayPolicy { final int dockedAppearance = updateLightStatusBarAppearanceLw(0 /* vis */, mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState); final boolean inSplitScreen = - mService.mRoot.getDefaultDisplay().mTaskContainers.isSplitScreenModeActivated(); + mService.mRoot.getDefaultTaskDisplayArea().isSplitScreenModeActivated(); if (inSplitScreen) { mService.getStackBounds(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, mDockedStackBounds); @@ -3462,10 +3462,10 @@ public class DisplayPolicy { } private Pair<Integer, WindowState> updateSystemBarsLw(WindowState win, int oldVis, int vis) { - final boolean dockedStackVisible = - mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); - final boolean freeformStackVisible = - mDisplayContent.isStackVisible(WINDOWING_MODE_FREEFORM); + final boolean dockedStackVisible = mDisplayContent.getDefaultTaskDisplayArea() + .isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); + final boolean freeformStackVisible = mDisplayContent.getDefaultTaskDisplayArea() + .isStackVisible(WINDOWING_MODE_FREEFORM); final boolean resizing = mDisplayContent.getDockedDividerController().isResizing(); // We need to force system bars when the docked stack is visible, when the freeform stack @@ -3879,10 +3879,10 @@ public class DisplayPolicy { WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); lp.type = WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY; - lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN - | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + lp.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; + lp.setFitInsetsTypes(0); lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; if (ActivityManager.isHighEndGfx()) { lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index af89a05bfa62..bef80f0a230a 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -594,7 +594,8 @@ public class DisplayRotation { // In the presence of the PINNED stack or System Alert windows we unfortunately can not // seamlessly rotate. - if (mDisplayContent.hasPinnedTask() || mDisplayContent.hasAlertWindowSurfaces()) { + if (mDisplayContent.getDefaultTaskDisplayArea().hasPinnedTask() + || mDisplayContent.hasAlertWindowSurfaces()) { return false; } diff --git a/services/core/java/com/android/server/wm/InputConsumerImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java index a9a9df8458e2..a6066684d850 100644 --- a/services/core/java/com/android/server/wm/InputConsumerImpl.java +++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java @@ -153,10 +153,11 @@ class InputConsumerImpl implements IBinder.DeathRecipient { t.reparent(mInputSurface, wc.getSurfaceControl()); } - void disposeChannelsLw() { + void disposeChannelsLw(SurfaceControl.Transaction t) { mService.mInputManager.unregisterInputChannel(mServerChannel); mClientChannel.dispose(); mServerChannel.dispose(); + t.remove(mInputSurface); unlinkFromDeathRecipient(); } diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 18332b9484c0..8b34b9b8dd8f 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -112,8 +112,9 @@ final class InputMonitor { @Override public void dispose() { synchronized (mService.mGlobalLock) { - disposeChannelsLw(); + disposeChannelsLw(mInputMonitor.mInputTransaction); mInputEventReceiver.dispose(); + mInputMonitor.updateInputWindowsLw(true /* force */); } } } @@ -195,8 +196,7 @@ final class InputMonitor { private boolean disposeInputConsumer(InputConsumerImpl consumer) { if (consumer != null) { - consumer.disposeChannelsLw(); - consumer.hide(mInputTransaction); + consumer.disposeChannelsLw(mInputTransaction); return true; } return false; diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index 007af249c580..e4e57168efe7 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -295,10 +295,10 @@ class InsetsPolicy { } private boolean forceShowsSystemBarsForWindowingMode() { - final boolean isDockedStackVisible = - mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); - final boolean isFreeformStackVisible = - mDisplayContent.isStackVisible(WINDOWING_MODE_FREEFORM); + final boolean isDockedStackVisible = mDisplayContent.getDefaultTaskDisplayArea() + .isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); + final boolean isFreeformStackVisible = mDisplayContent.getDefaultTaskDisplayArea() + .isStackVisible(WINDOWING_MODE_FREEFORM); final boolean isResizing = mDisplayContent.getDockedDividerController().isResizing(); // We need to force system bars when the docked stack is visible, when the freeform stack diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index a936e74bf694..f672394251f2 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -406,11 +406,12 @@ class KeyguardController { // show on top of the lock screen. In this can we want to dismiss the docked // stack since it will be complicated/risky to try to put the activity on top // of the lock screen in the right fullscreen configuration. - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - if (!display.mTaskContainers.isSplitScreenModeActivated()) { + final TaskDisplayArea taskDisplayArea = mRootWindowContainer + .getDefaultTaskDisplayArea(); + if (!taskDisplayArea.isSplitScreenModeActivated()) { return; } - display.mTaskContainers.onSplitScreenModeDismissed(); + taskDisplayArea.onSplitScreenModeDismissed(); } } @@ -528,11 +529,14 @@ class KeyguardController { * occlusion state. */ private ActivityStack getStackForControllingOccluding(DisplayContent display) { - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - if (stack != null && stack.isFocusableAndVisible() - && !stack.inPinnedWindowingMode()) { - return stack; + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (stack != null && stack.isFocusableAndVisible() + && !stack.inPinnedWindowingMode()) { + return stack; + } } } return null; diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java index 66dbfd5f2a84..02a27410dc38 100644 --- a/services/core/java/com/android/server/wm/PinnedStackController.java +++ b/services/core/java/com/android/server/wm/PinnedStackController.java @@ -286,7 +286,8 @@ class PinnedStackController { } try { final Rect animatingBounds = new Rect(); - final ActivityStack pinnedStack = mDisplayContent.getRootPinnedTask(); + final ActivityStack pinnedStack = mDisplayContent.getDefaultTaskDisplayArea() + .getRootPinnedTask(); if (pinnedStack != null) { pinnedStack.getAnimationOrCurrentBounds(animatingBounds); } diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java index 08b0abf5e9be..a031fe82d48b 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimation.java +++ b/services/core/java/com/android/server/wm/RecentsAnimation.java @@ -52,14 +52,14 @@ import com.android.server.wm.RecentsAnimationController.RecentsAnimationCallback * cleanup. See {@link com.android.server.wm.RecentsAnimationController}. */ class RecentsAnimation implements RecentsAnimationCallbacks, - DisplayContent.OnStackOrderChangedListener { + TaskDisplayArea.OnStackOrderChangedListener { private static final String TAG = RecentsAnimation.class.getSimpleName(); private final ActivityTaskManagerService mService; private final ActivityStackSupervisor mStackSupervisor; private final ActivityStartController mActivityStartController; private final WindowManagerService mWindowManager; - private final DisplayContent mDefaultDisplay; + private final TaskDisplayArea mDefaultTaskDisplayArea; private final Intent mTargetIntent; private final ComponentName mRecentsComponent; private final @Nullable String mRecentsFeatureId; @@ -84,7 +84,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, int recentsUid, @Nullable WindowProcessController caller) { mService = atm; mStackSupervisor = stackSupervisor; - mDefaultDisplay = mService.mRootWindowContainer.getDefaultDisplay(); + mDefaultTaskDisplayArea = mService.mRootWindowContainer.getDefaultTaskDisplayArea(); mActivityStartController = activityStartController; mWindowManager = wm; mTargetIntent = targetIntent; @@ -107,7 +107,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, void preloadRecentsActivity() { ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "Preload recents with %s", mTargetIntent); - ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, + ActivityStack targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); ActivityRecord targetActivity = getTargetActivity(targetStack); if (targetActivity != null) { @@ -128,7 +128,8 @@ class RecentsAnimation implements RecentsAnimationCallbacks, // Create the activity record. Because the activity is invisible, this doesn't really // start the client. startRecentsActivityInBackground("preloadRecents"); - targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); + targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED, + mTargetActivityType); targetActivity = getTargetActivity(targetStack); if (targetActivity == null) { Slog.w(TAG, "Cannot start " + mTargetIntent); @@ -176,12 +177,11 @@ class RecentsAnimation implements RecentsAnimationCallbacks, } // If the activity is associated with the recents stack, then try and get that first - ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, + ActivityStack targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); ActivityRecord targetActivity = getTargetActivity(targetStack); final boolean hasExistingActivity = targetActivity != null; if (hasExistingActivity) { - final TaskDisplayArea taskDisplayArea = targetActivity.getDisplayArea(); mRestoreTargetBehindStack = getStackAbove(targetStack); if (mRestoreTargetBehindStack == null) { notifyAnimationCancelBeforeStart(recentsAnimationRunner); @@ -209,7 +209,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, try { if (hasExistingActivity) { // Move the recents activity into place for the animation if it is not top most - mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(targetStack); + mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(targetStack); ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "Moved stack=%s behind stack=%s", targetStack, getStackAbove(targetStack)); @@ -225,10 +225,10 @@ class RecentsAnimation implements RecentsAnimationCallbacks, startRecentsActivityInBackground("startRecentsActivity_noTargetActivity"); // Move the recents activity into place for the animation - targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, + targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); targetActivity = getTargetActivity(targetStack); - mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(targetStack); + mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(targetStack); ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "Moved stack=%s behind stack=%s", targetStack, getStackAbove(targetStack)); @@ -251,7 +251,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, mWindowManager.cancelRecentsAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, "startRecentsActivity"); mWindowManager.initializeRecentsAnimation(mTargetActivityType, recentsAnimationRunner, - this, mDefaultDisplay.getDisplayId(), + this, mDefaultTaskDisplayArea.getDisplayId(), mStackSupervisor.mRecentTasks.getRecentTaskIds(), targetActivity); // If we updated the launch-behind state, update the visibility of the activities after @@ -262,7 +262,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, START_TASK_TO_FRONT, targetActivity); // Register for stack order changes - mDefaultDisplay.registerStackOrderChangedListener(this); + mDefaultTaskDisplayArea.registerStackOrderChangedListener(this); } catch (Exception e) { Slog.e(TAG, "Failed to start recents activity", e); throw e; @@ -280,7 +280,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, mWindowManager.getRecentsAnimationController(), reorderMode); // Unregister for stack order changes - mDefaultDisplay.unregisterStackOrderChangedListener(this); + mDefaultTaskDisplayArea.unregisterStackOrderChangedListener(this); final RecentsAnimationController controller = mWindowManager.getRecentsAnimationController(); @@ -308,7 +308,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, try { mWindowManager.cleanupRecentsAnimation(reorderMode); - final ActivityStack targetStack = mDefaultDisplay.getStack( + final ActivityStack targetStack = mDefaultTaskDisplayArea.getStack( WINDOWING_MODE_UNDEFINED, mTargetActivityType); // Prefer to use the original target activity instead of top activity because // we may have moved another task to top (starting 3p launcher). @@ -422,7 +422,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, @Override public void onStackOrderChanged(ActivityStack stack) { ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "onStackOrderChanged(): stack=%s", stack); - if (mDefaultDisplay.getIndexOf(stack) == -1 || !stack.shouldBeVisible(null)) { + if (mDefaultTaskDisplayArea.getIndexOf(stack) == -1 || !stack.shouldBeVisible(null)) { // The stack is not visible, so ignore this change return; } @@ -480,8 +480,8 @@ class RecentsAnimation implements RecentsAnimationCallbacks, * @return The top stack that is not always-on-top. */ private ActivityStack getTopNonAlwaysOnTopStack() { - for (int i = mDefaultDisplay.getStackCount() - 1; i >= 0; i--) { - final ActivityStack s = mDefaultDisplay.getStackAt(i); + for (int i = mDefaultTaskDisplayArea.getStackCount() - 1; i >= 0; i--) { + final ActivityStack s = mDefaultTaskDisplayArea.getStackAt(i); if (s.getWindowConfiguration().isAlwaysOnTop()) { continue; } diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index a30b70de267d..6fda1170a3f5 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -340,9 +340,11 @@ public class RecentsAnimationController implements DeathRecipient { // Make leashes for each of the visible/target tasks and add it to the recents animation to // be started - final ArrayList<Task> visibleTasks = mDisplayContent.getVisibleTasks(); - final ActivityStack targetStack = mDisplayContent.getStack(WINDOWING_MODE_UNDEFINED, - targetActivityType); + // TODO(b/153090560): Support Recents on multiple task display areas + final ArrayList<Task> visibleTasks = mDisplayContent.getDefaultTaskDisplayArea() + .getVisibleTasks(); + final ActivityStack targetStack = mDisplayContent.getDefaultTaskDisplayArea() + .getStack(WINDOWING_MODE_UNDEFINED, targetActivityType); if (targetStack != null) { final PooledConsumer c = PooledLambda.obtainConsumer((t, outList) -> { if (!outList.contains(t)) outList.add(t); }, PooledLambda.__(Task.class), @@ -385,7 +387,8 @@ public class RecentsAnimationController implements DeathRecipient { } // Save the minimized home height - mMinimizedHomeBounds = mDisplayContent.getRootHomeTask().getBounds(); + mMinimizedHomeBounds = mDisplayContent.getDefaultTaskDisplayArea().getRootHomeTask() + .getBounds(); mService.mWindowPlacerLocked.performSurfacePlacement(); diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java index 770c08889ab9..32de699eaae9 100644 --- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java +++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java @@ -232,10 +232,11 @@ class ResetTargetTaskHelper { } final ActivityTaskManagerService atmService = mTargetStack.mAtmService; - DisplayContent display = mTargetStack.getDisplay(); - final boolean singleTaskInstanceDisplay = display.isSingleTaskInstance(); + TaskDisplayArea taskDisplayArea = mTargetStack.getDisplayArea(); + final boolean singleTaskInstanceDisplay = + taskDisplayArea.mDisplayContent.isSingleTaskInstance(); if (singleTaskInstanceDisplay) { - display = atmService.mRootWindowContainer.getDefaultDisplay(); + taskDisplayArea = atmService.mRootWindowContainer.getDefaultTaskDisplayArea(); } final int windowingMode = mTargetStack.getWindowingMode(); @@ -246,7 +247,7 @@ class ResetTargetTaskHelper { final boolean alwaysCreateTask = DisplayContent.alwaysCreateStack(windowingMode, activityType); final Task task = alwaysCreateTask - ? display.getBottomMostTask() : mTargetStack.getBottomMostTask(); + ? taskDisplayArea.getBottomMostTask() : mTargetStack.getBottomMostTask(); Task targetTask = null; if (task != null && r.taskAffinity.equals(task.affinity)) { // If the activity currently at the bottom has the same task affinity as @@ -257,7 +258,7 @@ class ResetTargetTaskHelper { } if (targetTask == null) { if (alwaysCreateTask) { - targetTask = display.mTaskContainers.getOrCreateStack(windowingMode, + targetTask = taskDisplayArea.getOrCreateStack(windowingMode, activityType, false /* onTop */); } else { targetTask = mTargetStack.reuseOrCreateTask(r.info, null /*intent*/, diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 2764b121cc00..e1ef76f128cd 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1369,11 +1369,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } calculateDefaultMinimalSizeOfResizeableTasks(); - final DisplayContent defaultDisplay = getDefaultDisplay(); - - defaultDisplay.mTaskContainers.getOrCreateStack(WINDOWING_MODE_FULLSCREEN, - ACTIVITY_TYPE_HOME, ON_TOP); - positionChildAt(POSITION_TOP, defaultDisplay, false /* includingParents */); + final TaskDisplayArea defaultTaskDisplayArea = getDefaultTaskDisplayArea(); + defaultTaskDisplayArea.getOrCreateStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, + ON_TOP); + positionChildAt(POSITION_TOP, defaultTaskDisplayArea.mDisplayContent, + false /* includingParents */); } // TODO(multi-display): Look at all callpoints to make sure they make sense in multi-display. @@ -1382,6 +1382,16 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } /** + * Get the default display area on the device dedicated to app windows. This one should be used + * only as a fallback location for activity launches when no target display area is specified, + * or for cases when multi-instance is not supported yet (like Split-screen, Freeform, PiP or + * Recents). + */ + TaskDisplayArea getDefaultTaskDisplayArea() { + return mDefaultDisplay.getDefaultTaskDisplayArea(); + } + + /** * Get an existing instance of {@link DisplayContent} that has the given uniqueId. Unique ID is * defined in {@link DisplayInfo#uniqueId}. * @@ -1436,12 +1446,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return displayContent; } - ActivityRecord getDefaultDisplayHomeActivity() { - return getDefaultDisplayHomeActivityForUser(mCurrentUser); - } - ActivityRecord getDefaultDisplayHomeActivityForUser(int userId) { - return getDisplayContent(DEFAULT_DISPLAY).mTaskContainers.getHomeActivityForUser(userId); + return getDefaultTaskDisplayArea().getHomeActivityForUser(userId); } boolean startHomeOnAllDisplays(int userId, String reason) { @@ -1637,7 +1643,9 @@ class RootWindowContainer extends WindowContainer<DisplayContent> displayId = DEFAULT_DISPLAY; } - final ActivityRecord r = getDisplayContent(displayId).mTaskContainers.getHomeActivity(); + // TODO(multi-display-area): Resume home on the right task container + final ActivityRecord r = getDisplayContent(displayId).getDefaultTaskDisplayArea() + .getHomeActivity(); final String myReason = reason + " resumeHomeActivity"; // Only resume home activity if isn't finishing. @@ -1794,19 +1802,23 @@ class RootWindowContainer extends WindowContainer<DisplayContent> final ArrayList<IBinder> topActivityTokens = new ArrayList<>(); final ActivityStack topFocusedStack = getTopDisplayFocusedStack(); // Traverse all displays. - for (int i = getChildCount() - 1; i >= 0; i--) { - final DisplayContent display = getChildAt(i); - // Traverse all stacks on a display. - for (int j = display.getStackCount() - 1; j >= 0; --j) { - final ActivityStack stack = display.getStackAt(j); - // Get top activity from a visible stack and add it to the list. - if (stack.shouldBeVisible(null /* starting */)) { - final ActivityRecord top = stack.getTopNonFinishingActivity(); - if (top != null) { - if (stack == topFocusedStack) { - topActivityTokens.add(0, top.appToken); - } else { - topActivityTokens.add(top.appToken); + for (int dNdx = getChildCount() - 1; dNdx >= 0; dNdx--) { + final DisplayContent display = getChildAt(dNdx); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = + display.getTaskDisplayAreaAt(tdaNdx); + // Traverse all stacks on a display area. + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + // Get top activity from a visible stack and add it to the list. + if (stack.shouldBeVisible(null /* starting */)) { + final ActivityRecord top = stack.getTopNonFinishingActivity(); + if (top != null) { + if (stack == topFocusedStack) { + topActivityTokens.add(0, top.appToken); + } else { + topActivityTokens.add(top.appToken); + } } } } @@ -1838,10 +1850,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // focus order. for (int i = getChildCount() - 1; i >= 0; --i) { final DisplayContent display = getChildAt(i); - final ActivityRecord resumedActivityOnDisplay = display.mTaskContainers - .getResumedActivity(); - if (resumedActivityOnDisplay != null) { - return resumedActivityOnDisplay; + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + final ActivityRecord resumedActivityOnTaskContainer = taskDisplayArea + .getFocusedActivity(); + if (resumedActivityOnTaskContainer != null) { + return resumedActivityOnTaskContainer; + } } } return null; @@ -1861,16 +1876,19 @@ class RootWindowContainer extends WindowContainer<DisplayContent> WindowProcessController fgApp = null; for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - if (isTopDisplayFocusedStack(stack)) { - final ActivityRecord resumedActivity = stack.getResumedActivity(); - if (resumedActivity != null) { - fgApp = resumedActivity.app; - } else if (stack.mPausingActivity != null) { - fgApp = stack.mPausingActivity.app; + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (isTopDisplayFocusedStack(stack)) { + final ActivityRecord resumedActivity = stack.getResumedActivity(); + if (resumedActivity != null) { + fgApp = resumedActivity.app; + } else if (stack.mPausingActivity != null) { + fgApp = stack.mPausingActivity.app; + } + break; } - break; } } } @@ -1972,8 +1990,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> final int focusStackId = topFocusedStack != null ? topFocusedStack.getRootTaskId() : INVALID_TASK_ID; // We dismiss the docked stack whenever we switch users. - if (getDefaultDisplay().mTaskContainers.isSplitScreenModeActivated()) { - getDefaultDisplay().mTaskContainers.onSplitScreenModeDismissed(); + if (getDefaultTaskDisplayArea().isSplitScreenModeActivated()) { + getDefaultTaskDisplayArea().onSplitScreenModeDismissed(); } // Also dismiss the pinned stack whenever we switch users. Removing the pinned stack will // also cause all tasks to be moved to the fullscreen stack at a position that is @@ -1986,16 +2004,19 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mStackSupervisor.mStartingUsers.add(uss); for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - stack.switchUser(userId); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + stack.switchUser(userId); + } } } final int restoreStackId = mUserStackInFront.get(userId); ActivityStack stack = getStack(restoreStackId); if (stack == null) { - stack = getDefaultDisplay().mTaskContainers.getOrCreateRootHomeTask(); + stack = getDefaultTaskDisplayArea().getOrCreateRootHomeTask(); } final boolean homeInFront = stack.isActivityTypeHome(); if (stack.isOnHomeDisplay()) { @@ -2018,7 +2039,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> void updateUserStack(int userId, ActivityStack stack) { if (userId != mCurrentUser) { if (stack == null) { - stack = getDefaultDisplay().mTaskContainers.getOrCreateRootHomeTask(); + stack = getDefaultTaskDisplayArea().getOrCreateRootHomeTask(); } mUserStackInFront.put(userId, stack.getRootTaskId()); @@ -2061,7 +2082,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return; } - stack.reparent(displayContent.mDisplayContent, onTop); + stack.reparent(displayContent.getDefaultTaskDisplayArea(), onTop); // TODO(multi-display): resize stacks properly if moved from split-screen. } @@ -2155,8 +2176,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // Looking up task on preferred display first final DisplayContent preferredDisplay = getDisplayContent(preferredDisplayId); if (preferredDisplay != null) { - preferredDisplay.mTaskContainers.findTaskLocked(r, true /* isPreferredDisplay */, - mTmpFindTaskResult); + preferredDisplay.getDefaultTaskDisplayArea().findTaskLocked(r, + true /* isPreferredDisplay */, mTmpFindTaskResult); if (mTmpFindTaskResult.mIdealMatch) { return mTmpFindTaskResult.mRecord; } @@ -2168,7 +2189,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> continue; } - display.mTaskContainers.findTaskLocked(r, false /* isPreferredDisplay */, + display.getDefaultTaskDisplayArea().findTaskLocked(r, false /* isPreferredDisplay */, mTmpFindTaskResult); if (mTmpFindTaskResult.mIdealMatch) { return mTmpFindTaskResult.mRecord; @@ -2190,13 +2211,17 @@ class RootWindowContainer extends WindowContainer<DisplayContent> ActivityStack focusedStack = getTopDisplayFocusedStack(); for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - // It is possible that request to finish activity might also remove its task and stack, - // so we need to be careful with indexes in the loop and check child count every time. - for (int stackNdx = 0; stackNdx < display.getStackCount(); ++stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - final Task t = stack.finishTopCrashedActivityLocked(app, reason); - if (stack == focusedStack || finishedTask == null) { - finishedTask = t; + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + // It is possible that request to finish activity might also remove its task and + // stack, so we need to be careful with indexes in the loop and check child count + // every time. + for (int stackNdx = 0; stackNdx < display.getStackCount(); ++stackNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(stackNdx); + final Task t = stack.finishTopCrashedActivityLocked(app, reason); + if (stack == focusedStack || finishedTask == null) { + finishedTask = t; + } } } } @@ -2223,26 +2248,29 @@ class RootWindowContainer extends WindowContainer<DisplayContent> for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { boolean resumedOnDisplay = false; final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - final ActivityRecord topRunningActivity = stack.topRunningActivity(); - if (!stack.isFocusableAndVisible() || topRunningActivity == null) { - continue; - } - if (stack == targetStack) { - // Simply update the result for targetStack because the targetStack had - // already resumed in above. We don't want to resume it again, especially in - // some cases, it would cause a second launch failure if app process was dead. - resumedOnDisplay |= result; - continue; - } - if (display.mTaskContainers.isTopStack(stack) - && topRunningActivity.isState(RESUMED)) { - // Kick off any lingering app transitions form the MoveTaskToFront operation, - // but only consider the top task and stack on that display. - stack.executeAppTransition(targetOptions); - } else { - resumedOnDisplay |= topRunningActivity.makeActiveIfNeeded(target); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + final ActivityRecord topRunningActivity = stack.topRunningActivity(); + if (!stack.isFocusableAndVisible() || topRunningActivity == null) { + continue; + } + if (stack == targetStack) { + // Simply update the result for targetStack because the targetStack had + // already resumed in above. We don't want to resume it again, especially in + // some cases, it would cause a second launch failure if app process was + // dead. + resumedOnDisplay |= result; + continue; + } + if (taskDisplayArea.isTopStack(stack) && topRunningActivity.isState(RESUMED)) { + // Kick off any lingering app transitions form the MoveTaskToFront + // operation, but only consider the top task and stack on that display. + stack.executeAppTransition(targetOptions); + } else { + resumedOnDisplay |= topRunningActivity.makeActiveIfNeeded(target); + } } } if (!resumedOnDisplay) { @@ -2278,32 +2306,37 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } // Set the sleeping state of the stacks on the display. - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - if (displayShouldSleep) { - stack.goToSleepIfPossible(false /* shuttingDown */); - } else { - // When the display which can only contain one task turns on, start a special - // transition. {@link AppTransitionController#handleAppTransitionReady} later - // picks up the transition, and schedules - // {@link ITaskStackListener#onSingleTaskDisplayDrawn} callback which is - // triggered after contents are drawn on the display. - if (display.isSingleTaskInstance()) { - display.mDisplayContent.prepareAppTransition( - TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false); - } - stack.awakeFromSleepingLocked(); - if (display.isSingleTaskInstance()) { - display.executeAppTransition(); - } - if (stack.isFocusedStackOnDisplay() - && !mStackSupervisor.getKeyguardController() - .isKeyguardOrAodShowing(display.mDisplayId)) { - // If the keyguard is unlocked - resume immediately. - // It is possible that the display will not be awake at the time we - // process the keyguard going away, which can happen before the sleep token - // is released. As a result, it is important we resume the activity here. - resumeFocusedStacksTopActivities(); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (displayShouldSleep) { + stack.goToSleepIfPossible(false /* shuttingDown */); + } else { + // When the display which can only contain one task turns on, start a + // special transition. + // {@link AppTransitionController#handleAppTransitionReady} later picks up + // the transition, and schedules + // {@link ITaskStackListener#onSingleTaskDisplayDrawn} callback which is + // triggered after contents are drawn on the display. + if (display.isSingleTaskInstance()) { + display.mDisplayContent.prepareAppTransition( + TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false); + } + stack.awakeFromSleepingLocked(); + if (display.isSingleTaskInstance()) { + display.executeAppTransition(); + } + if (stack.isFocusedStackOnDisplay() + && !mStackSupervisor.getKeyguardController() + .isKeyguardOrAodShowing(display.mDisplayId)) { + // If the keyguard is unlocked - resume immediately. + // It is possible that the display will not be awake at the time we + // process the keyguard going away, which can happen before the sleep + // token is released. As a result, it is important we resume the + // activity here. + resumeFocusedStacksTopActivities(); + } } } } @@ -2312,7 +2345,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> protected ActivityStack getStack(int stackId) { for (int i = getChildCount() - 1; i >= 0; --i) { - final ActivityStack stack = getChildAt(i).mTaskContainers.getStack(stackId); + final ActivityStack stack = getChildAt(i).getStack(stackId); if (stack != null) { return stack; } @@ -2408,9 +2441,12 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (displayId == INVALID_DISPLAY) { for (int displayNdx = 0; displayNdx < getChildCount(); ++displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - list.add(getStackInfo(stack)); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + list.add(getStackInfo(stack)); + } } } return list; @@ -2419,9 +2455,12 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (display == null) { return list; } - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - list.add(getStackInfo(stack)); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + list.add(getStackInfo(stack)); + } } return list; } @@ -2640,19 +2679,21 @@ class RootWindowContainer extends WindowContainer<DisplayContent> boolean allSleep = true; for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - // Stacks and activities could be removed while putting activities to sleep if - // the app process was gone. This prevents us getting exception by accessing an - // invalid stack index. - if (stackNdx >= display.getStackCount()) { - continue; - } - - final ActivityStack stack = display.getStackAt(stackNdx); - if (allowDelay) { - allSleep &= stack.goToSleepIfPossible(shuttingDown); - } else { - stack.goToSleep(); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + // Stacks and activities could be removed while putting activities to sleep if + // the app process was gone. This prevents us getting exception by accessing an + // invalid stack index. + if (sNdx >= taskDisplayArea.getStackCount()) { + continue; + } + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (allowDelay) { + allSleep &= stack.goToSleepIfPossible(shuttingDown); + } else { + stack.goToSleep(); + } } } } @@ -2788,8 +2829,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } final DisplayContent display = getDisplayContentOrCreate(displayId); if (display != null) { - stack = display.mTaskContainers.getOrCreateStack(r, options, candidateTask, - activityType, onTop); + // Falling back to default task container + final TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea(); + stack = taskDisplayArea.getOrCreateStack(r, options, candidateTask, activityType, + onTop); if (stack != null) { return stack; } @@ -2835,7 +2878,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (container == null || !canLaunchOnDisplay(r, container.mDisplayContent.mDisplayId)) { - container = getDefaultDisplay().mTaskContainers; + container = getDefaultTaskDisplayArea(); if (windowingMode == WindowConfiguration.WINDOWING_MODE_UNDEFINED) { windowingMode = container.resolveWindowingMode(r, options, candidateTask, activityType); @@ -2887,7 +2930,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // it to the target display. if (candidateTask.isRootTask()) { final ActivityStack stack = candidateTask.getStack(); - displayContent.moveStackToDisplay(stack, true /* onTop */); + stack.reparent(displayContent.getDefaultTaskDisplayArea(), true /* onTop */); return stack; } } @@ -2902,14 +2945,17 @@ class RootWindowContainer extends WindowContainer<DisplayContent> windowingMode = options != null ? options.getLaunchWindowingMode() : r.getWindowingMode(); } - windowingMode = displayContent.mTaskContainers.validateWindowingMode(windowingMode, r, - candidateTask, r.getActivityType()); // Return the topmost valid stack on the display. - for (int i = displayContent.getStackCount() - 1; i >= 0; --i) { - final ActivityStack stack = displayContent.getStackAt(i); - if (isValidLaunchStack(stack, r, windowingMode)) { - return stack; + for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx); + final int validatedWindowingMode = taskDisplayArea + .validateWindowingMode(windowingMode, r, candidateTask, r.getActivityType()); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (isValidLaunchStack(stack, r, validatedWindowingMode)) { + return stack; + } } } @@ -2918,7 +2964,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> final int activityType = options != null && options.getLaunchActivityType() != ACTIVITY_TYPE_UNDEFINED ? options.getLaunchActivityType() : r.getActivityType(); - return displayContent.createStack(windowingMode, activityType, true /*onTop*/); + final TaskDisplayArea taskDisplayArea = displayContent.getDefaultTaskDisplayArea(); + return taskDisplayArea.createStack(windowingMode, activityType, true /*onTop*/); } return null; @@ -2989,7 +3036,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (preferredDisplayArea == null) { // Stack is currently detached because it is being removed. Use the previous display it // was on. - preferredDisplayArea = getDisplayContent(currentFocus.mPrevDisplayId).mTaskContainers; + preferredDisplayArea = getDisplayContent(currentFocus.mPrevDisplayId) + .getDefaultTaskDisplayArea(); } final ActivityStack preferredFocusableStack = preferredDisplayArea.getNextFocusableStack( currentFocus, ignoreCurrent); @@ -3010,7 +3058,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // We've already checked this one continue; } - final ActivityStack nextFocusableStack = display.mTaskContainers + final ActivityStack nextFocusableStack = display.getDefaultTaskDisplayArea() .getNextFocusableStack(currentFocus, ignoreCurrent); if (nextFocusableStack != null) { return nextFocusableStack; @@ -3020,38 +3068,16 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return null; } - /** - * Get next valid stack for launching provided activity in the system. This will search across - * displays and stacks in last-focused order for a focusable and visible stack, except those - * that are on a currently focused display. - * - * @param r The activity that is being launched. - * @param currentFocus The display that previously had focus and thus needs to be ignored when - * searching for the next candidate. - * @return Next valid {@link ActivityStack}, null if not found. - */ - ActivityStack getNextValidLaunchStack(@NonNull ActivityRecord r, int currentFocus) { - for (int i = getChildCount() - 1; i >= 0; --i) { - final DisplayContent display = getChildAt(i); - if (display.mDisplayId == currentFocus) { - continue; - } - final ActivityStack stack = getValidLaunchStackOnDisplay(display.mDisplayId, r, - null /* options */, null /* launchParams */); - if (stack != null) { - return stack; - } - } - return null; - } - boolean handleAppDied(WindowProcessController app) { boolean hasVisibleActivities = false; for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - hasVisibleActivities |= stack.handleAppDied(app); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + hasVisibleActivities |= stack.handleAppDied(app); + } } } return hasVisibleActivities; @@ -3162,10 +3188,14 @@ class RootWindowContainer extends WindowContainer<DisplayContent> void finishVoiceTask(IVoiceInteractionSession session) { for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - final int numStacks = display.getStackCount(); - for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - stack.finishVoiceTask(session); + int numTaskContainers = display.getTaskDisplayAreaCount(); + for (int tdaNdx = 0; tdaNdx < numTaskContainers; tdaNdx++) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + final int numStacks = display.getStackCount(); + for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(stackNdx); + stack.finishVoiceTask(session); + } } } } @@ -3229,14 +3259,17 @@ class RootWindowContainer extends WindowContainer<DisplayContent> boolean foundResumed = false; for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - final ActivityRecord r = stack.getResumedActivity(); - if (r != null) { - if (!r.nowVisible) { - return false; + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + final ActivityRecord r = stack.getResumedActivity(); + if (r != null) { + if (!r.nowVisible) { + return false; + } + foundResumed = true; } - foundResumed = true; } } } @@ -3247,16 +3280,19 @@ class RootWindowContainer extends WindowContainer<DisplayContent> boolean pausing = true; for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - final ActivityRecord r = stack.mPausingActivity; - if (r != null && !r.isState(PAUSED, STOPPED, STOPPING)) { - if (DEBUG_STATES) { - Slog.d(TAG_STATES, - "allPausedActivitiesComplete: r=" + r + " state=" + r.getState()); - pausing = false; - } else { - return false; + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + final ActivityRecord r = stack.mPausingActivity; + if (r != null && !r.isState(PAUSED, STOPPED, STOPPING)) { + if (DEBUG_STATES) { + Slog.d(TAG_STATES, "allPausedActivitiesComplete: r=" + r + + " state=" + r.getState()); + pausing = false; + } else { + return false; + } } } } @@ -3312,9 +3348,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> void cancelInitializingActivities() { for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - stack.cancelInitializingActivities(); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + taskDisplayArea.getStackAt(sNdx).cancelInitializingActivities(); + } } } } @@ -3417,20 +3455,23 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } if (!sendHint) { // targetActivity != null - // Send power hint when the activity's process is different than the current resumed - // activity on all displays, or if there are no resumed activities in the system. + // Send power hint when the activity's process is different than the current top resumed + // activity on all display areas, or if there are no resumed activities in the system. boolean noResumedActivities = true; boolean allFocusedProcessesDiffer = true; for (int displayNdx = 0; displayNdx < getChildCount(); ++displayNdx) { - final DisplayContent displayContent = getChildAt(displayNdx); - final ActivityRecord resumedActivity = displayContent.mTaskContainers - .getResumedActivity(); - final WindowProcessController resumedActivityProcess = - resumedActivity == null ? null : resumedActivity.app; - - noResumedActivities &= resumedActivityProcess == null; - if (resumedActivityProcess != null) { - allFocusedProcessesDiffer &= !resumedActivityProcess.equals(targetActivity.app); + final DisplayContent dc = getChildAt(displayNdx); + for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx); + final ActivityRecord resumedActivity = taskDisplayArea.getFocusedActivity(); + final WindowProcessController resumedActivityProcess = + resumedActivity == null ? null : resumedActivity.app; + + noResumedActivities &= resumedActivityProcess == null; + if (resumedActivityProcess != null) { + allFocusedProcessesDiffer &= !resumedActivityProcess.equals( + targetActivity.app); + } } } sendHint = noResumedActivities || allFocusedProcessesDiffer; @@ -3477,10 +3518,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> int numDisplays = getChildCount(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { final DisplayContent display = getChildAt(displayNdx); - for (int stackNdx = display.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getStackAt(stackNdx); - if (!dumpVisibleStacksOnly || stack.shouldBeVisible(null)) { - activities.addAll(stack.getDumpActivitiesLocked(name)); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (!dumpVisibleStacksOnly || stack.shouldBeVisible(null)) { + activities.addAll(stack.getDumpActivitiesLocked(name)); + } } } } @@ -3520,14 +3564,21 @@ class RootWindowContainer extends WindowContainer<DisplayContent> DisplayContent displayContent = getChildAt(displayNdx); pw.print("Display #"); pw.print(displayContent.mDisplayId); pw.println(" (activities from top to bottom):"); - for (int stackNdx = displayContent.getStackCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = displayContent.getStackAt(stackNdx); - pw.println(); - printed = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, needSep); - needSep = printed; - } - printThisActivity(pw, displayContent.mTaskContainers.getResumedActivity(), dumpPackage, - needSep, " ResumedActivity:"); + for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + pw.println(); + printed = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, needSep); + needSep = printed; + } + } + pw.println(" (resumed activities in task display areas from top to bottom):"); + for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx); + printThisActivity(pw, taskDisplayArea.getFocusedActivity(), dumpPackage, needSep, + " ResumedActivity:"); + } } printed |= dumpHistoryList(fd, pw, mStackSupervisor.mFinishingActivities, " ", diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 7c6343c87232..c891c1166a06 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4131,6 +4131,17 @@ class Task extends WindowContainer<WindowContainer> { // Let the old organizer know it has lost control. sendTaskVanished(); mTaskOrganizer = organizer; + + // If the task is not yet visible when it is added to the task organizer, then we should + // hide it to allow the task organizer to show it when it is properly reparented. We skip + // this for tasks created by the organizer because they can synchronously update the leash + // before new children are added to the task. + if (!mCreatedByOrganizer && organizer != null + && (!getHasBeenVisible() || !hasVisibleChildren())) { + getPendingTransaction().hide(getSurfaceControl()); + commitPendingTransaction(); + } + sendTaskAppeared(); onTaskOrganizerChanged(); return true; diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 77ef01134292..1bc7244996ab 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -63,6 +63,7 @@ import com.android.internal.util.function.pooled.PooledLambda; import com.android.internal.util.function.pooled.PooledPredicate; import com.android.server.protolog.common.ProtoLog; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -127,6 +128,18 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { * the new stack becomes resumed after which it will be set to current focused stack. */ ActivityStack mLastFocusedStack; + /** + * All of the stacks on this display. Order matters, topmost stack is in front of all other + * stacks, bottommost behind. Accessed directly by ActivityManager package classes. Any calls + * changing the list should also call {@link #onStackOrderChanged()}. + */ + private ArrayList<OnStackOrderChangedListener> mStackOrderChangedCallbacks = new ArrayList<>(); + + /** + * The task display area is removed from the system and we are just waiting for all activities + * on it to be finished before removing this object. + */ + private boolean mRemoved; TaskDisplayArea(DisplayContent displayContent, WindowManagerService service) { super(service, Type.ANY, "TaskContainers", FEATURE_TASK_CONTAINER); @@ -336,9 +349,9 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { // Since a stack could be repositioned while being one of the child, return // current index if that's the same stack we are positioning and it is always on // top. - final boolean sameStack = mDisplayContent.getStacks().get(i) == stack; + final boolean sameStack = mChildren.get(i) == stack; if ((sameStack && stack.isAlwaysOnTop()) - || (!sameStack && !mDisplayContent.getStacks().get(i).isAlwaysOnTop())) { + || (!sameStack && !mChildren.get(i).isAlwaysOnTop())) { belowAlwaysOnTopPosition = i; break; } @@ -352,7 +365,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { if (stack.isAlwaysOnTop()) { if (hasPinnedTask()) { // Always-on-top stacks go below the pinned stack. - maxPosition = mDisplayContent.getStacks().indexOf(mRootPinnedTask) - 1; + maxPosition = mChildren.indexOf(mRootPinnedTask) - 1; } // Always-on-top stacks need to be above all other stacks. minPosition = belowAlwaysOnTopPosition @@ -375,7 +388,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { targetPosition = Math.min(targetPosition, maxPosition); targetPosition = Math.max(targetPosition, minPosition); - int prevPosition = mDisplayContent.getStacks().indexOf(stack); + int prevPosition = mChildren.indexOf(stack); // The positions we calculated above (maxPosition, minPosition) do not take into // consideration the following edge cases. // 1) We need to adjust the position depending on the value "adding". @@ -471,7 +484,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { @Override int getOrientation(int candidate) { - if (mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) { + if (isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)) { // Apps and their containers are not allowed to specify an orientation while using // root tasks...except for the home stack if it is not resizable and currently // visible (top of) its root task. @@ -637,7 +650,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { mPreferredTopFocusableStack = null; } mDisplayContent.releaseSelfIfNeeded(); - mDisplayContent.onStackOrderChanged(stack); + onStackOrderChanged(stack); } void positionStackAt(int position, ActivityStack child, boolean includingParents) { @@ -716,7 +729,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { } } - mDisplayContent.onStackOrderChanged(stack); + onStackOrderChanged(stack); } ActivityStack getStack(int rootTaskId) { @@ -749,7 +762,11 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { */ ActivityStack getOrCreateStack(int windowingMode, int activityType, boolean onTop, Intent intent, Task candidateTask) { - if (!alwaysCreateStack(windowingMode, activityType)) { + // Need to pass in a determined windowing mode to see if a new stack should be created, + // so use its parent's windowing mode if it is undefined. + if (!alwaysCreateStack( + windowingMode != WINDOWING_MODE_UNDEFINED ? windowingMode : getWindowingMode(), + activityType)) { ActivityStack stack = getStack(windowingMode, activityType); if (stack != null) { return stack; @@ -765,11 +782,11 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { } else if (stack.getParent() != launchRootTask) { stack.reparent(launchRootTask, position); } - } else if (stack.getDisplay() != mDisplayContent || !stack.isRootTask()) { + } else if (stack.getDisplayArea() != this || !stack.isRootTask()) { if (stack.getParent() == null) { addStack(stack, position); } else { - stack.reparent(mDisplayContent, onTop); + stack.reparent(this, onTop); } } // Update windowing mode if necessary, e.g. moving a pinned task to fullscreen. @@ -832,7 +849,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { // Create stack on default display instead since this display can only contain 1 stack. // TODO: Kinda a hack, but better that having the decision at each call point. Hoping // this goes away once ActivityView is no longer using virtual displays. - return mRootWindowContainer.getDefaultDisplay().mTaskContainers.createStack( + return mRootWindowContainer.getDefaultTaskDisplayArea().createStack( windowingMode, activityType, onTop, info, intent, createdByOrganizer); } @@ -980,7 +997,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { return candidate; } - ActivityRecord getResumedActivity() { + ActivityRecord getFocusedActivity() { final ActivityStack focusedStack = getFocusedStack(); if (focusedStack == null) { return null; @@ -1551,11 +1568,134 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { return (index < wc.mChildren.size()) ? (ActivityStack) wc.mChildren.get(index) : null; } + /** Returns true if the stack in the windowing mode is visible. */ + boolean isStackVisible(int windowingMode) { + final ActivityStack stack = getTopStackInWindowingMode(windowingMode); + return stack != null && stack.isVisible(); + } + + void removeStack(ActivityStack stack) { + removeChild(stack); + } + int getDisplayId() { return mDisplayContent.getDisplayId(); } boolean isRemoved() { - return mDisplayContent.isRemoved(); + return mRemoved; + } + + /** + * Adds a listener to be notified whenever the stack order in the display changes. Currently + * only used by the {@link RecentsAnimation} to determine whether to interrupt and cancel the + * current animation when the system state changes. + */ + void registerStackOrderChangedListener(OnStackOrderChangedListener listener) { + if (!mStackOrderChangedCallbacks.contains(listener)) { + mStackOrderChangedCallbacks.add(listener); + } + } + + /** + * Removes a previously registered stack order change listener. + */ + void unregisterStackOrderChangedListener(OnStackOrderChangedListener listener) { + mStackOrderChangedCallbacks.remove(listener); + } + + /** + * Notifies of a stack order change + * @param stack The stack which triggered the order change + */ + void onStackOrderChanged(ActivityStack stack) { + for (int i = mStackOrderChangedCallbacks.size() - 1; i >= 0; i--) { + mStackOrderChangedCallbacks.get(i).onStackOrderChanged(stack); + } + } + + /** + * Callback for when the order of the stacks in the display changes. + */ + interface OnStackOrderChangedListener { + void onStackOrderChanged(ActivityStack stack); + } + + void ensureActivitiesVisible(ActivityRecord starting, int configChanges, + boolean preserveWindows, boolean notifyClients) { + for (int stackNdx = getStackCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = getStackAt(stackNdx); + stack.ensureActivitiesVisible(starting, configChanges, preserveWindows, + notifyClients); + } + } + + void prepareFreezingTaskBounds() { + for (int stackNdx = getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = getChildAt(stackNdx); + stack.prepareFreezingTaskBounds(); + } + } + + /** + * Removes the stacks in the node applying the content removal node from the display. + * @return last reparented stack, or {@code null} if the stacks had to be destroyed. + */ + ActivityStack remove() { + mPreferredTopFocusableStack = null; + // TODO(b/153090332): Allow setting content removal mode per task display area + final boolean destroyContentOnRemoval = mDisplayContent.shouldDestroyContentOnRemove(); + final TaskDisplayArea toDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + ActivityStack lastReparentedStack = null; + + // Stacks could be reparented from the removed display area to other display area. After + // reparenting the last stack of the removed display area, the display area becomes ready to + // be released (no more ActivityStack-s). But, we cannot release it at that moment or the + // related WindowContainer will also be removed. So, we set display area as removed after + // reparenting stack finished. + // Keep the order from bottom to top. + int numStacks = getStackCount(); + for (int stackNdx = 0; stackNdx < numStacks; stackNdx++) { + final ActivityStack stack = getStackAt(stackNdx); + // Always finish non-standard type stacks. + if (destroyContentOnRemoval || !stack.isActivityTypeStandardOrUndefined()) { + stack.finishAllActivitiesImmediately(); + } else { + // If default display is in split-window mode, set windowing mode of the + // stack to split-screen secondary. Otherwise, set the windowing mode to + // undefined by default to let stack inherited the windowing mode from the + // new display. + final int windowingMode = toDisplayArea.isSplitScreenModeActivated() + ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY + : WINDOWING_MODE_UNDEFINED; + stack.reparent(toDisplayArea, true /* onTop */); + stack.setWindowingMode(windowingMode); + lastReparentedStack = stack; + } + // Stacks may be removed from this display. Ensure each stack will be processed + // and the loop will end. + stackNdx -= numStacks - getStackCount(); + numStacks = getStackCount(); + } + mRemoved = true; + + return lastReparentedStack; + } + + + @Override + void dump(PrintWriter pw, String prefix, boolean dumpAll) { + pw.println(prefix + "TaskDisplayArea " + getName()); + if (mPreferredTopFocusableStack != null) { + pw.println(prefix + " mPreferredTopFocusableStack=" + mPreferredTopFocusableStack); + } + if (mLastFocusedStack != null) { + pw.println(prefix + " mLastFocusedStack=" + mLastFocusedStack); + } + pw.println(prefix + " Application tokens in top down Z order:"); + for (int stackNdx = getChildCount() - 1; stackNdx >= 0; --stackNdx) { + final ActivityStack stack = getChildAt(stackNdx); + stack.dump(pw, prefix + " ", dumpAll); + } } } diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java index e6757e145f2f..da4401a68e7c 100644 --- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java +++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java @@ -705,14 +705,19 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { private void adjustBoundsToAvoidConflictInDisplay(@NonNull DisplayContent display, @NonNull Rect inOutBounds) { final List<Rect> taskBoundsToCheck = new ArrayList<>(); - for (int i = 0; i < display.getStackCount(); ++i) { - final ActivityStack stack = display.getStackAt(i); - if (!stack.inFreeformWindowingMode()) { - continue; - } + int numTaskContainers = display.getTaskDisplayAreaCount(); + for (int tdaNdx = 0; tdaNdx < numTaskContainers; tdaNdx++) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + int numStacks = taskDisplayArea.getStackCount(); + for (int sNdx = 0; sNdx < numStacks; ++sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (!stack.inFreeformWindowingMode()) { + continue; + } - for (int j = 0; j < stack.getChildCount(); ++j) { - taskBoundsToCheck.add(stack.getChildAt(j).getBounds()); + for (int j = 0; j < stack.getChildCount(); ++j) { + taskBoundsToCheck.add(stack.getChildAt(j).getBounds()); + } } } adjustBoundsToAvoidConflict(display.getBounds(), taskBoundsToCheck, inOutBounds); diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index b641e4c391ce..75f2e1f0a8ba 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -25,6 +25,7 @@ import static com.android.server.wm.WindowOrganizerController.CONTROLLABLE_CONFI import static com.android.server.wm.WindowOrganizerController.CONTROLLABLE_WINDOW_CONFIGS; import android.annotation.Nullable; +import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.WindowConfiguration; import android.content.Intent; @@ -38,6 +39,7 @@ import android.window.ITaskOrganizer; import android.window.ITaskOrganizerController; import android.window.WindowContainerToken; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import java.io.PrintWriter; @@ -46,6 +48,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.WeakHashMap; +import java.util.function.Consumer; /** * Stores the TaskOrganizers associated with a given windowing mode and @@ -81,17 +84,95 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { } } } - }; + } + + /** + * A wrapper class around ITaskOrganizer to ensure that the calls are made in the right + * lifecycle order since we may be updating the visibility of task surface controls in a pending + * transaction before they are presented to the task org. + */ + private class TaskOrganizerCallbacks { + final WindowManagerService mService; + final ITaskOrganizer mTaskOrganizer; + final Consumer<Runnable> mDeferTaskOrgCallbacksConsumer; + + TaskOrganizerCallbacks(WindowManagerService wm, ITaskOrganizer taskOrg, + Consumer<Runnable> deferTaskOrgCallbacksConsumer) { + mService = wm; + mDeferTaskOrgCallbacksConsumer = deferTaskOrgCallbacksConsumer; + mTaskOrganizer = taskOrg; + } + + IBinder getBinder() { + return mTaskOrganizer.asBinder(); + } + + void onTaskAppeared(Task task) { + final RunningTaskInfo taskInfo = task.getTaskInfo(); + mDeferTaskOrgCallbacksConsumer.accept(() -> { + try { + mTaskOrganizer.onTaskAppeared(taskInfo); + } catch (RemoteException e) { + Slog.e(TAG, "Exception sending onTaskAppeared callback", e); + } + }); + } + + + void onTaskVanished(Task task) { + final RunningTaskInfo taskInfo = task.getTaskInfo(); + mDeferTaskOrgCallbacksConsumer.accept(() -> { + try { + mTaskOrganizer.onTaskVanished(taskInfo); + } catch (RemoteException e) { + Slog.e(TAG, "Exception sending onTaskVanished callback", e); + } + }); + } + + void onTaskInfoChanged(Task task, ActivityManager.RunningTaskInfo taskInfo) { + mDeferTaskOrgCallbacksConsumer.accept(() -> { + if (!task.isOrganized()) { + // This is safe to ignore if the task is no longer organized + return; + } + try { + mTaskOrganizer.onTaskInfoChanged(taskInfo); + } catch (RemoteException e) { + Slog.e(TAG, "Exception sending onTaskInfoChanged callback", e); + } + }); + } + + void onBackPressedOnTaskRoot(Task task) { + mDeferTaskOrgCallbacksConsumer.accept(() -> { + if (!task.isOrganized()) { + // This is safe to ignore if the task is no longer organized + return; + } + try { + mTaskOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo()); + } catch (Exception e) { + Slog.e(TAG, "Exception sending onBackPressedOnTaskRoot callback", e); + } + }); + } + } private class TaskOrganizerState { - private final ITaskOrganizer mOrganizer; + private final TaskOrganizerCallbacks mOrganizer; private final DeathRecipient mDeathRecipient; private final ArrayList<Task> mOrganizedTasks = new ArrayList<>(); private final int mUid; private boolean mInterceptBackPressedOnTaskRoot; TaskOrganizerState(ITaskOrganizer organizer, int uid) { - mOrganizer = organizer; + final Consumer<Runnable> deferTaskOrgCallbacksConsumer = + mDeferTaskOrgCallbacksConsumer != null + ? mDeferTaskOrgCallbacksConsumer + : mService.mWindowManager.mAnimator::addAfterPrepareSurfacesRunnable; + mOrganizer = new TaskOrganizerCallbacks(mService.mWindowManager, organizer, + deferTaskOrgCallbacksConsumer); mDeathRecipient = new DeathRecipient(organizer); try { organizer.asBinder().linkToDeath(mDeathRecipient, 0); @@ -107,26 +188,18 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { void addTask(Task t) { mOrganizedTasks.add(t); - try { - mOrganizer.onTaskAppeared(t.getTaskInfo()); - } catch (Exception e) { - Slog.e(TAG, "Exception sending taskAppeared callback" + e); - } + mOrganizer.onTaskAppeared(t); } void removeTask(Task t) { - try { - mOrganizer.onTaskVanished(t.getTaskInfo()); - } catch (Exception e) { - Slog.e(TAG, "Exception sending taskVanished callback" + e); - } mOrganizedTasks.remove(t); + mOrganizer.onTaskVanished(t); } void dispose() { releaseTasks(); for (int i = mTaskOrganizersForWindowingMode.size() - 1; i >= 0; --i) { - mTaskOrganizersForWindowingMode.valueAt(i).remove(mOrganizer.asBinder()); + mTaskOrganizersForWindowingMode.valueAt(i).remove(mOrganizer.getBinder()); } } @@ -139,7 +212,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { } void unlinkDeath() { - mOrganizer.asBinder().unlinkToDeath(mDeathRecipient, 0); + mOrganizer.getBinder().unlinkToDeath(mDeathRecipient, 0); } } @@ -149,9 +222,10 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { private final WeakHashMap<Task, RunningTaskInfo> mLastSentTaskInfos = new WeakHashMap<>(); private final ArrayList<Task> mPendingTaskInfoChanges = new ArrayList<>(); - final ActivityTaskManagerService mService; + private final ActivityTaskManagerService mService; - RunningTaskInfo mTmpTaskInfo; + private RunningTaskInfo mTmpTaskInfo; + private Consumer<Runnable> mDeferTaskOrgCallbacksConsumer; TaskOrganizerController(ActivityTaskManagerService atm) { mService = atm; @@ -163,6 +237,15 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { } /** + * Specifies the consumer to run to defer the task org callbacks. Can be overridden while + * testing to allow the callbacks to be sent synchronously. + */ + @VisibleForTesting + public void setDeferTaskOrgCallbacksConsumer(Consumer<Runnable> consumer) { + mDeferTaskOrgCallbacksConsumer = consumer; + } + + /** * Register a TaskOrganizer to manage tasks as they enter the given windowing mode. * If there was already a TaskOrganizer for this windowing mode it will be evicted * but will continue to organize it's existing tasks. @@ -253,7 +336,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { if (state == null) { return null; } - return state.mOrganizer; + return state.mOrganizer.mTaskOrganizer; } void onTaskAppeared(ITaskOrganizer organizer, Task task) { @@ -277,7 +360,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { return null; } - final Task task = display.mTaskContainers.createStack(windowingMode, + final Task task = display.getDefaultTaskDisplayArea().createStack(windowingMode, ACTIVITY_TYPE_UNDEFINED, false /* onTop */, null /* info */, new Intent(), true /* createdByOrganizer */); RunningTaskInfo out = task.getTaskInfo(); @@ -358,11 +441,10 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { // change. mTmpTaskInfo = null; - if (task.mTaskOrganizer != null) { - try { - task.mTaskOrganizer.onTaskInfoChanged(newInfo); - } catch (RemoteException e) { - } + if (task.isOrganized()) { + final TaskOrganizerState state = mTaskOrganizerStates.get( + task.mTaskOrganizer.asBinder()); + state.mOrganizer.onTaskInfoChanged(task, newInfo); } } @@ -395,26 +477,27 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { - TaskDisplayArea taskDisplayArea = - mService.mRootWindowContainer.getDisplayContent(displayId).mTaskContainers; - if (taskDisplayArea == null) { + TaskDisplayArea defaultTaskDisplayArea = mService.mRootWindowContainer + .getDisplayContent(displayId).getDefaultTaskDisplayArea(); + if (defaultTaskDisplayArea == null) { return; } Task task = token == null ? null : WindowContainer.fromBinder(token.asBinder()).asTask(); if (task == null) { - taskDisplayArea.mLaunchRootTask = null; + defaultTaskDisplayArea.mLaunchRootTask = null; return; } if (!task.mCreatedByOrganizer) { throw new IllegalArgumentException("Attempt to set task not created by " + "organizer as launch root task=" + task); } - if (task.getDisplayArea() != taskDisplayArea) { + if (task.getDisplayArea() == null + || task.getDisplayArea().getDisplayId() != displayId) { throw new RuntimeException("Can't set launch root for display " + displayId + " to task on display " + task.getDisplayContent().getDisplayId()); } - taskDisplayArea.mLaunchRootTask = task; + task.getDisplayArea().mLaunchRootTask = task; } } finally { Binder.restoreCallingIdentity(origId); @@ -475,13 +558,16 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { throw new IllegalArgumentException("Display " + displayId + " doesn't exist"); } ArrayList<RunningTaskInfo> out = new ArrayList<>(); - for (int i = dc.getStackCount() - 1; i >= 0; --i) { - final Task task = dc.getStackAt(i); - if (activityTypes != null - && !ArrayUtils.contains(activityTypes, task.getActivityType())) { - continue; + for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final Task task = taskDisplayArea.getStackAt(sNdx); + if (activityTypes != null + && !ArrayUtils.contains(activityTypes, task.getActivityType())) { + continue; + } + out.add(task.getTaskInfo()); } - out.add(task.getTaskInfo()); } return out; } @@ -517,11 +603,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { return false; } - try { - state.mOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo()); - } catch (Exception e) { - Slog.e(TAG, "Exception sending interceptBackPressedOnTaskRoot callback" + e); - } + state.mOrganizer.onBackPressedOnTaskRoot(task); return true; } @@ -538,7 +620,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { final TaskOrganizerState state = mTaskOrganizerStates.get(taskOrgs.get(j)); final ArrayList<Task> tasks = state.mOrganizedTasks; pw.print(innerPrefix + " "); - pw.println(state.mOrganizer + " uid=" + state.mUid + ":"); + pw.println(state.mOrganizer.mTaskOrganizer + " uid=" + state.mUid + ":"); for (int k = 0; k < tasks.size(); k++) { pw.println(innerPrefix + " " + tasks.get(k)); } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index e43f4b485349..b9b6c0858031 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -510,7 +510,7 @@ class WallpaperController { private void findWallpaperTarget() { mFindResults.reset(); - if (mDisplayContent.isStackVisible(WINDOWING_MODE_FREEFORM)) { + if (mDisplayContent.getDefaultTaskDisplayArea().isStackVisible(WINDOWING_MODE_FREEFORM)) { // In freeform mode we set the wallpaper as its own target, so we don't need an // additional window to make it visible. mFindResults.setUseTopWallpaperAsTarget(true); diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 58119c2ab3c2..037b9c830a50 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -2180,6 +2180,11 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< private Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter, boolean isVoiceInteraction) { + if (isOrganized()) { + // Defer to the task organizer to run animations + return null; + } + final DisplayContent displayContent = getDisplayContent(); final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final int width = displayInfo.appWidth; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index dfaa0ec47155..a1e0eb730ff7 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5317,7 +5317,8 @@ public class WindowManagerService extends IWindowManager.Stub throw new IllegalArgumentException( "Requested window " + client + " does not exist"); } - ProtoLog.w(WM_ERROR, "Failed looking up window callers=%s", Debug.getCallers(3)); + ProtoLog.w(WM_ERROR, "Failed looking up window session=%s callers=%s", session, + Debug.getCallers(3)); return null; } if (session != null && win.mSession != session) { @@ -5325,7 +5326,8 @@ public class WindowManagerService extends IWindowManager.Stub throw new IllegalArgumentException("Requested window " + client + " is in session " + win.mSession + ", not " + session); } - ProtoLog.w(WM_ERROR, "Failed looking up window callers=%s", Debug.getCallers(3)); + ProtoLog.w(WM_ERROR, "Failed looking up window session=%s callers=%s", session, + Debug.getCallers(3)); return null; } @@ -6049,11 +6051,21 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mHasPermanentDpad="); pw.println(mHasPermanentDpad); mRoot.dumpTopFocusedDisplayId(pw); mRoot.forAllDisplays(dc -> { + final int displayId = dc.getDisplayId(); final WindowState inputMethodTarget = dc.mInputMethodTarget; if (inputMethodTarget != null) { - pw.print(" mInputMethodTarget in display# "); pw.print(dc.getDisplayId()); + pw.print(" mInputMethodTarget in display# "); pw.print(displayId); pw.print(' '); pw.println(inputMethodTarget); } + if (mAccessibilityController != null) { + final Region magnificationRegion = new Region(); + mAccessibilityController.getMagnificationRegionLocked(displayId, + magnificationRegion); + pw.print(" mMagnificationRegion in display# "); + pw.print(displayId); + pw.print(' '); + pw.println(magnificationRegion); + } }); pw.print(" mInTouchMode="); pw.println(mInTouchMode); pw.print(" mLastDisplayFreezeDuration="); @@ -7318,8 +7330,9 @@ public class WindowManagerService extends IWindowManager.Stub @Override public boolean isStackVisibleLw(int windowingMode) { - final DisplayContent dc = getDefaultDisplayContentLocked(); - return dc.isStackVisible(windowingMode); + // TODO(b/153090332): Support multiple task display areas & displays + final TaskDisplayArea tc = mRoot.getDefaultTaskDisplayArea(); + return tc.isStackVisible(windowingMode); } @Override diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index a332b6966291..3e2e9be24c4f 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -234,7 +234,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub if (task.getParent() != newParent) { if (newParent == null) { // Re-parent task to display as a root task. - dc.moveStackToDisplay(as, hop.getToTop()); + as.reparent(dc.getDefaultTaskDisplayArea(), hop.getToTop()); } else if (newParent.inMultiWindowMode() && !task.isResizeable() && task.isLeafTask()) { Slog.w(TAG, "Can't support task that doesn't support multi-window mode in" diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index b87d18143fc7..9baa12602c7b 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1516,7 +1516,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // Some system windows (e.g. "Power off" dialog) don't have a task, but we would still // associate them with some stack to enable dimming. final DisplayContent dc = getDisplayContent(); - return mAttrs.type >= FIRST_SYSTEM_WINDOW && dc != null ? dc.getRootHomeTask() : null; + return mAttrs.type >= FIRST_SYSTEM_WINDOW + && dc != null ? dc.getDefaultTaskDisplayArea().getRootHomeTask() : null; } /** @@ -3438,13 +3439,23 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP getMergedConfiguration(mLastReportedConfiguration); mLastConfigReportedToClient = true; + final boolean reportOrientation = mReportOrientationChanged; + // Always reset these states first, so if {@link IWindow#resized} fails, this + // window won't be added to {@link WindowManagerService#mResizingWindows} and set + // {@link #mOrientationChanging} to true again by {@link #updateResizingWindowIfNeeded} + // that may cause WINDOW_FREEZE_TIMEOUT because resizing the client keeps failing. + mReportOrientationChanged = false; + mDragResizingChangeReported = true; + mWinAnimator.mSurfaceResized = false; + mWindowFrames.resetInsetsChanged(); + final Rect frame = mWindowFrames.mCompatFrame; final Rect contentInsets = mWindowFrames.mLastContentInsets; final Rect visibleInsets = mWindowFrames.mLastVisibleInsets; final Rect stableInsets = mWindowFrames.mLastStableInsets; final MergedConfiguration mergedConfiguration = mLastReportedConfiguration; final boolean reportDraw = mWinAnimator.mDrawState == DRAW_PENDING; - final boolean forceRelayout = mReportOrientationChanged || isDragResizeChanged(); + final boolean forceRelayout = reportOrientation || isDragResizeChanged(); final int displayId = getDisplayId(); final DisplayCutout displayCutout = getWmDisplayCutout().getDisplayCutout(); @@ -3453,25 +3464,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mergedConfiguration, getBackdropFrame(frame), forceRelayout, getDisplayContent().getDisplayPolicy().areSystemBarsForcedShownLw(this), displayId, new DisplayCutout.ParcelableWrapper(displayCutout)); - mDragResizingChangeReported = true; if (mWmService.mAccessibilityController != null) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(displayId); } updateLocationInParentDisplayIfNeeded(); - - mWindowFrames.resetInsetsChanged(); - mWinAnimator.mSurfaceResized = false; - mReportOrientationChanged = false; } catch (RemoteException e) { + // Cancel orientation change of this window to avoid blocking unfreeze display. setOrientationChanging(false); mLastFreezeDuration = (int)(SystemClock.elapsedRealtime() - mWmService.mDisplayFreezeTime); - // We are assuming the hosting process is dead or in a zombie state. - Slog.w(TAG, "Failed to report 'resized' to the client of " + this - + ", removing this window."); - mWmService.mPendingRemove.add(this); - mWmService.mWindowPlacerLocked.requestTraversal(); + Slog.w(TAG, "Failed to report 'resized' to " + this + " due to " + e); } Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 3c2b6ec9711d..7457a1d05335 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -397,7 +397,8 @@ class WindowToken extends WindowContainer<WindowState> { void assignLayer(SurfaceControl.Transaction t, int layer) { if (windowType == TYPE_DOCK_DIVIDER) { // See {@link DisplayContent#mSplitScreenDividerAnchor} - super.assignRelativeLayer(t, mDisplayContent.getSplitScreenDividerAnchor(), 1); + super.assignRelativeLayer(t, + mDisplayContent.getDefaultTaskDisplayArea().getSplitScreenDividerAnchor(), 1); } else if (mRoundedCornerOverlay) { super.assignLayer(t, WindowManagerPolicy.COLOR_FADE_LAYER + 1); } else { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index eed39e182a33..d1c47d9feed7 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -87,6 +87,9 @@ import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK; +import static android.os.UserManagerInternal.OWNER_TYPE_DEVICE_OWNER; +import static android.os.UserManagerInternal.OWNER_TYPE_PROFILE_OWNER; +import static android.os.UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE; import static android.provider.Settings.Global.PRIVATE_DNS_MODE; import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER; import static android.provider.Telephony.Carriers.DPC_URI; @@ -284,6 +287,7 @@ import com.android.server.SystemService; import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo; import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.server.pm.RestrictionsSet; import com.android.server.pm.UserRestrictionsUtils; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.storage.DeviceStorageMonitorInternal; @@ -322,6 +326,7 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; +import java.util.function.Predicate; /** * Implementation of the device policy APIs. @@ -1828,6 +1833,50 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { info = deviceAdminInfo; } + Bundle addSyntheticRestrictions(Bundle restrictions) { + if (disableCamera) { + restrictions.putBoolean(UserManager.DISALLOW_CAMERA, true); + } else { + restrictions.remove(UserManager.DISALLOW_CAMERA); + } + return restrictions; + } + + static Bundle removeDeprecatedRestrictions(Bundle restrictions) { + for (String deprecatedRestriction: DEPRECATED_USER_RESTRICTIONS) { + restrictions.remove(deprecatedRestriction); + } + return restrictions; + } + + static Bundle filterRestrictions(Bundle restrictions, Predicate<String> filter) { + Bundle result = new Bundle(); + for (String key : restrictions.keySet()) { + if (!restrictions.getBoolean(key)) { + continue; + } + if (filter.test(key)) { + result.putBoolean(key, true); + } + } + return result; + } + + Bundle getEffectiveRestrictions() { + return addSyntheticRestrictions( + removeDeprecatedRestrictions(ensureUserRestrictions())); + } + + Bundle getLocalUserRestrictions(int adminType) { + return filterRestrictions(getEffectiveRestrictions(), + key -> UserRestrictionsUtils.isLocal(adminType, key)); + } + + Bundle getGlobalUserRestrictions(int adminType) { + return filterRestrictions(getEffectiveRestrictions(), + key -> UserRestrictionsUtils.isGlobal(adminType, key)); + } + void dump(IndentingPrintWriter pw) { pw.print("uid="); pw.println(getUid()); pw.print("testOnlyAdmin="); @@ -2772,7 +2821,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId) != 0) { profileOwner.ensureUserRestrictions().putBoolean( UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true); - saveUserRestrictionsLocked(userId, /* parent = */ false); + saveUserRestrictionsLocked(userId); mInjector.settingsSecurePutIntForUser( Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId); } @@ -2803,7 +2852,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } admin.defaultEnabledRestrictionsAlreadySet.addAll(restrictionsToSet); Slog.i(LOG_TAG, "Enabled the following restrictions by default: " + restrictionsToSet); - saveUserRestrictionsLocked(userId, /* parent = */ false); + saveUserRestrictionsLocked(userId); } } @@ -8222,9 +8271,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } // Tell the user manager that the restrictions have changed. - final int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle; - pushUserRestrictions(affectedUserId); + pushUserRestrictions(userHandle); + final int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle; if (SecurityLog.isLoggingEnabled()) { SecurityLog.writeEvent(SecurityLog.TAG_CAMERA_POLICY_SET, who.getPackageName(), userHandle, affectedUserId, disabled ? 1 : 0); @@ -10806,10 +10855,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { "Cannot use the parent instance in Device Owner mode"); } } else { - if (!(UserRestrictionsUtils.canProfileOwnerChange(key, userHandle) || ( - isProfileOwnerOfOrganizationOwnedDevice(activeAdmin) && parent - && UserRestrictionsUtils.canProfileOwnerOfOrganizationOwnedDeviceChange( - key)))) { + boolean profileOwnerCanChangeOnItself = !parent + && UserRestrictionsUtils.canProfileOwnerChange(key, userHandle); + boolean orgOwnedProfileOwnerCanChangesGlobally = parent + && isProfileOwnerOfOrganizationOwnedDevice(activeAdmin) + && UserRestrictionsUtils + .canProfileOwnerOfOrganizationOwnedDeviceChange(key); + + if (!profileOwnerCanChangeOnItself && !orgOwnedProfileOwnerCanChangesGlobally) { throw new SecurityException("Profile owner cannot set user restriction " + key); } } @@ -10821,7 +10874,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } else { restrictions.remove(key); } - saveUserRestrictionsLocked(userHandle, parent); + saveUserRestrictionsLocked(userHandle); } final int eventId = enabledFromThisOwner ? DevicePolicyEnums.ADD_USER_RESTRICTION @@ -10839,91 +10892,65 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - private void saveUserRestrictionsLocked(int userId, boolean parent) { + private void saveUserRestrictionsLocked(int userId) { saveSettingsLocked(userId); - pushUserRestrictions(parent ? getProfileParentId(userId) : userId); + pushUserRestrictions(userId); sendChangedNotification(userId); } - private void pushUserRestrictions(int userId) { + /** + * Pushes the user restrictions originating from a specific user. + * + * If called by the profile owner of an organization-owned device, the global and local + * user restrictions will be an accumulation of the global user restrictions from the profile + * owner active admin and its parent active admin. The key of the local user restrictions set + * will be the target user id. + */ + private void pushUserRestrictions(int originatingUserId) { + final Bundle global; + final RestrictionsSet local = new RestrictionsSet(); + final boolean isDeviceOwner; synchronized (getLockObject()) { - final boolean isDeviceOwner = mOwners.isDeviceOwnerUserId(userId); - Bundle userRestrictions = null; - final int restrictionOwnerType; - final int originatingUserId; - + isDeviceOwner = mOwners.isDeviceOwnerUserId(originatingUserId); if (isDeviceOwner) { final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked(); if (deviceOwner == null) { return; // Shouldn't happen. } - userRestrictions = addOrRemoveDisableCameraRestriction( - deviceOwner.userRestrictions, deviceOwner); - restrictionOwnerType = UserManagerInternal.OWNER_TYPE_DEVICE_OWNER; - originatingUserId = deviceOwner.getUserHandle().getIdentifier(); + global = deviceOwner.getGlobalUserRestrictions(OWNER_TYPE_DEVICE_OWNER); + local.updateRestrictions(originatingUserId, deviceOwner.getLocalUserRestrictions( + OWNER_TYPE_DEVICE_OWNER)); } else { - final ActiveAdmin profileOwnerOfOrganizationOwnedDevice = - getProfileOwnerOfOrganizationOwnedDeviceLocked(userId); - - // If profile owner of an organization owned device, the restrictions will be - // pushed to the parent instance. - if (profileOwnerOfOrganizationOwnedDevice != null && !isManagedProfile(userId)) { - restrictionOwnerType = - UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE; - final ActiveAdmin parent = profileOwnerOfOrganizationOwnedDevice - .getParentActiveAdmin(); - userRestrictions = parent.userRestrictions; - userRestrictions = addOrRemoveDisableCameraRestriction(userRestrictions, - parent); - originatingUserId = - profileOwnerOfOrganizationOwnedDevice.getUserHandle().getIdentifier(); - } else { - final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId); - - if (profileOwner != null) { - userRestrictions = profileOwner.userRestrictions; - restrictionOwnerType = UserManagerInternal.OWNER_TYPE_PROFILE_OWNER; - originatingUserId = profileOwner.getUserHandle().getIdentifier(); - } else { - restrictionOwnerType = UserManagerInternal.OWNER_TYPE_NO_OWNER; - originatingUserId = userId; - } - userRestrictions = addOrRemoveDisableCameraRestriction( - userRestrictions, userId); + final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(originatingUserId); + if (profileOwner == null) { + return; } - } - // Remove deprecated restrictions. - for (String deprecatedRestriction: DEPRECATED_USER_RESTRICTIONS) { - userRestrictions.remove(deprecatedRestriction); - } - mUserManagerInternal.setDevicePolicyUserRestrictions(originatingUserId, - userRestrictions, restrictionOwnerType); - } - } - - private Bundle addOrRemoveDisableCameraRestriction(Bundle userRestrictions, ActiveAdmin admin) { - if (userRestrictions == null) { - userRestrictions = new Bundle(); - } - if (admin.disableCamera) { - userRestrictions.putBoolean(UserManager.DISALLOW_CAMERA, true); - } else { - userRestrictions.remove(UserManager.DISALLOW_CAMERA); - } - return userRestrictions; - } - - private Bundle addOrRemoveDisableCameraRestriction(Bundle userRestrictions, int userId) { - if (userRestrictions == null) { - userRestrictions = new Bundle(); - } - if (getCameraDisabled(/* who= */ null, userId, /* mergeDeviceOwnerRestriction= */ - false)) { - userRestrictions.putBoolean(UserManager.DISALLOW_CAMERA, true); - } else { - userRestrictions.remove(UserManager.DISALLOW_CAMERA); - } - return userRestrictions; + global = profileOwner.getGlobalUserRestrictions(OWNER_TYPE_PROFILE_OWNER); + local.updateRestrictions(originatingUserId, profileOwner.getLocalUserRestrictions( + OWNER_TYPE_PROFILE_OWNER)); + // Global (device-wide) and local user restrictions set by the profile owner of an + // organization-owned device are stored in the parent ActiveAdmin instance. + if (isProfileOwnerOfOrganizationOwnedDevice( + profileOwner.getUserHandle().getIdentifier())) { + // The global restrictions set on the parent ActiveAdmin instance need to be + // merged with the global restrictions set on the profile owner ActiveAdmin + // instance, since both are to be applied device-wide. + UserRestrictionsUtils.merge(global, + profileOwner.getParentActiveAdmin().getGlobalUserRestrictions( + OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE)); + // The local restrictions set on the parent ActiveAdmin instance are only to be + // applied to the primary user. They therefore need to be added the local + // restriction set with the primary user id as the key, in this case the + // primary user id is the target user. + local.updateRestrictions( + getProfileParentId(profileOwner.getUserHandle().getIdentifier()), + profileOwner.getParentActiveAdmin().getLocalUserRestrictions( + OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE)); + } + } + } + mUserManagerInternal.setDevicePolicyUserRestrictions(originatingUserId, global, local, + isDeviceOwner); } @Override diff --git a/services/incremental/Android.bp b/services/incremental/Android.bp index b13d33054e19..02bb0bc3e49c 100644 --- a/services/incremental/Android.bp +++ b/services/incremental/Android.bp @@ -50,6 +50,7 @@ cc_defaults { "libbinder", "libcrypto", "libcutils", + "libdataloader", "libincfs", "liblog", "libz", diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 5e3c337da11e..0da167303ccd 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "IncrementalService" #include "IncrementalService.h" +#include "IncrementalServiceValidation.h" #include <android-base/file.h> #include <android-base/logging.h> @@ -35,6 +36,7 @@ #include <uuid/uuid.h> #include <zlib.h> +#include <charconv> #include <ctime> #include <filesystem> #include <iterator> @@ -49,6 +51,9 @@ using namespace std::literals; using namespace android::content::pm; namespace fs = std::filesystem; +constexpr const char* kDataUsageStats = "android.permission.LOADER_USAGE_STATS"; +constexpr const char* kOpUsage = "android:get_usage_stats"; + namespace android::incremental { namespace { @@ -231,6 +236,7 @@ IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_v : mVold(sm.getVoldService()), mDataLoaderManager(sm.getDataLoaderManager()), mIncFs(sm.getIncFs()), + mAppOpsManager(sm.getAppOpsManager()), mIncrementalDir(rootDir) { if (!mVold) { LOG(FATAL) << "Vold service is unavailable"; @@ -238,6 +244,9 @@ IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_v if (!mDataLoaderManager) { LOG(FATAL) << "DataLoaderManagerService is unavailable"; } + if (!mAppOpsManager) { + LOG(FATAL) << "AppOpsManager is unavailable"; + } mountExistingImages(); } @@ -275,12 +284,12 @@ void IncrementalService::onDump(int fd) { const IncFsMount& mnt = *ifs.get(); dprintf(fd, "\t[%d]:\n", id); dprintf(fd, "\t\tmountId: %d\n", mnt.mountId); + dprintf(fd, "\t\troot: %s\n", mnt.root.c_str()); dprintf(fd, "\t\tnextStorageDirNo: %d\n", mnt.nextStorageDirNo.load()); dprintf(fd, "\t\tdataLoaderStatus: %d\n", mnt.dataLoaderStatus.load()); - dprintf(fd, "\t\tconnectionLostTime: %s\n", toString(mnt.connectionLostTime)); - if (mnt.savedDataLoaderParams) { - const auto& params = mnt.savedDataLoaderParams.value(); - dprintf(fd, "\t\tsavedDataLoaderParams:\n"); + { + const auto& params = mnt.dataLoaderParams; + dprintf(fd, "\t\tdataLoaderParams:\n"); dprintf(fd, "\t\t\ttype: %s\n", toString(params.type).c_str()); dprintf(fd, "\t\t\tpackageName: %s\n", params.packageName.c_str()); dprintf(fd, "\t\t\tclassName: %s\n", params.className.c_str()); @@ -328,6 +337,7 @@ std::optional<std::future<void>> IncrementalService::onSystemReady() { } std::thread([this, mounts = std::move(mounts)]() { + /* TODO(b/151241369): restore data loaders on reboot. for (auto&& ifs : mounts) { if (prepareDataLoader(*ifs)) { LOG(INFO) << "Successfully started data loader for mount " << ifs->mountId; @@ -336,6 +346,7 @@ std::optional<std::future<void>> IncrementalService::onSystemReady() { LOG(WARNING) << "Failed to start data loader for mount " << ifs->mountId; } } + */ mPrepareDataLoaders.set_value_at_thread_exit(); }).detach(); return mPrepareDataLoaders.get_future(); @@ -455,13 +466,15 @@ StorageId IncrementalService::createStorage( return kInvalidStorageId; } + ifs->dataLoaderParams = std::move(dataLoaderParams); + { metadata::Mount m; m.mutable_storage()->set_id(ifs->mountId); - m.mutable_loader()->set_type((int)dataLoaderParams.type); - m.mutable_loader()->set_package_name(dataLoaderParams.packageName); - m.mutable_loader()->set_class_name(dataLoaderParams.className); - m.mutable_loader()->set_arguments(dataLoaderParams.arguments); + m.mutable_loader()->set_type((int)ifs->dataLoaderParams.type); + m.mutable_loader()->set_package_name(ifs->dataLoaderParams.packageName); + m.mutable_loader()->set_class_name(ifs->dataLoaderParams.className); + m.mutable_loader()->set_arguments(ifs->dataLoaderParams.arguments); const auto metadata = m.SerializeAsString(); m.mutable_loader()->release_arguments(); m.mutable_loader()->release_class_name(); @@ -489,7 +502,7 @@ StorageId IncrementalService::createStorage( // Done here as well, all data structures are in good state. secondCleanupOnFailure.release(); - if (!prepareDataLoader(*ifs, &dataLoaderParams, &dataLoaderStatusListener)) { + if (!prepareDataLoader(*ifs, &dataLoaderStatusListener)) { LOG(ERROR) << "prepareDataLoader() failed"; deleteStorageLocked(*ifs, std::move(l)); return kInvalidStorageId; @@ -569,11 +582,30 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog return -EINVAL; } + ifs->dataLoaderFilesystemParams.readLogsEnabled = enableReadLogs; + if (enableReadLogs) { + // We never unregister the callbacks, but given a restricted number of data loaders and even fewer asking for read log access, should be ok. + registerAppOpsCallback(ifs->dataLoaderParams.packageName); + } + + return applyStorageParams(*ifs); +} + +int IncrementalService::applyStorageParams(IncFsMount& ifs) { + const bool enableReadLogs = ifs.dataLoaderFilesystemParams.readLogsEnabled; + if (enableReadLogs) { + if (auto status = CheckPermissionForDataDelivery(kDataUsageStats, kOpUsage); + !status.isOk()) { + LOG(ERROR) << "CheckPermissionForDataDelivery failed: " << status.toString8(); + return fromBinderStatus(status); + } + } + using unique_fd = ::android::base::unique_fd; ::android::os::incremental::IncrementalFileSystemControlParcel control; - control.cmd.reset(unique_fd(dup(ifs->control.cmd()))); - control.pendingReads.reset(unique_fd(dup(ifs->control.pendingReads()))); - auto logsFd = ifs->control.logs(); + control.cmd.reset(unique_fd(dup(ifs.control.cmd()))); + control.pendingReads.reset(unique_fd(dup(ifs.control.pendingReads()))); + auto logsFd = ifs.control.logs(); if (logsFd >= 0) { control.log.reset(unique_fd(dup(logsFd))); } @@ -582,12 +614,7 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog const auto status = mVold->setIncFsMountOptions(control, enableReadLogs); if (!status.isOk()) { LOG(ERROR) << "Calling Vold::setIncFsMountOptions() failed: " << status.toString8(); - return status.exceptionCode() == binder::Status::EX_SERVICE_SPECIFIC - ? status.serviceSpecificErrorCode() > 0 ? -status.serviceSpecificErrorCode() - : status.serviceSpecificErrorCode() == 0 - ? -EFAULT - : status.serviceSpecificErrorCode() - : -EIO; + return fromBinderStatus(status); } return 0; @@ -987,13 +1014,13 @@ void IncrementalService::mountExistingImages() { continue; } const auto root = path::join(mIncrementalDir, name); - if (!mountExistingImage(root, name)) { + if (!mountExistingImage(root)) { IncFsMount::cleanupFilesystem(path); } } } -bool IncrementalService::mountExistingImage(std::string_view root, std::string_view key) { +bool IncrementalService::mountExistingImage(std::string_view root) { auto mountTarget = path::join(root, constants().mount); const auto backing = path::join(root, constants().backing); @@ -1011,16 +1038,26 @@ bool IncrementalService::mountExistingImage(std::string_view root, std::string_v auto ifs = std::make_shared<IncFsMount>(std::string(root), -1, std::move(control), *this); - auto m = parseFromIncfs<metadata::Mount>(mIncFs.get(), ifs->control, - path::join(mountTarget, constants().infoMdName)); - if (!m.has_loader() || !m.has_storage()) { + auto mount = parseFromIncfs<metadata::Mount>(mIncFs.get(), ifs->control, + path::join(mountTarget, constants().infoMdName)); + if (!mount.has_loader() || !mount.has_storage()) { LOG(ERROR) << "Bad mount metadata in mount at " << root; return false; } - ifs->mountId = m.storage().id(); + ifs->mountId = mount.storage().id(); mNextId = std::max(mNextId, ifs->mountId + 1); + // DataLoader params + { + auto& dlp = ifs->dataLoaderParams; + const auto& loader = mount.loader(); + dlp.type = (android::content::pm::DataLoaderType)loader.type(); + dlp.packageName = loader.package_name(); + dlp.className = loader.class_name(); + dlp.arguments = loader.arguments(); + } + std::vector<std::pair<std::string, metadata::BindPoint>> bindPoints; auto d = openDir(path::c_str(mountTarget)); while (auto e = ::readdir(d.get())) { @@ -1044,16 +1081,24 @@ bool IncrementalService::mountExistingImage(std::string_view root, std::string_v } auto name = std::string_view(e->d_name); if (name.starts_with(constants().storagePrefix)) { - auto md = parseFromIncfs<metadata::Storage>(mIncFs.get(), ifs->control, - path::join(mountTarget, name)); - auto [_, inserted] = mMounts.try_emplace(md.id(), ifs); + int storageId; + const auto res = std::from_chars(name.data() + constants().storagePrefix.size() + 1, + name.data() + name.size(), storageId); + if (res.ec != std::errc{} || *res.ptr != '_') { + LOG(WARNING) << "Ignoring storage with invalid name '" << name << "' for mount " + << root; + continue; + } + auto [_, inserted] = mMounts.try_emplace(storageId, ifs); if (!inserted) { - LOG(WARNING) << "Ignoring storage with duplicate id " << md.id() + LOG(WARNING) << "Ignoring storage with duplicate id " << storageId << " for mount " << root; continue; } - ifs->storages.insert_or_assign(md.id(), IncFsMount::Storage{std::string(name)}); - mNextId = std::max(mNextId, md.id() + 1); + ifs->storages.insert_or_assign(storageId, + IncFsMount::Storage{ + path::join(root, constants().mount, name)}); + mNextId = std::max(mNextId, storageId + 1); } } } @@ -1083,23 +1128,9 @@ bool IncrementalService::mountExistingImage(std::string_view root, std::string_v } bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs, - DataLoaderParamsParcel* params, const DataLoaderStatusListener* externalListener) { if (!mSystemReady.load(std::memory_order_relaxed)) { std::unique_lock l(ifs.lock); - if (params) { - if (ifs.savedDataLoaderParams) { - LOG(WARNING) << "Trying to pass second set of data loader parameters, ignored it"; - } else { - ifs.savedDataLoaderParams = std::move(*params); - } - } else { - if (!ifs.savedDataLoaderParams) { - LOG(ERROR) << "Mount " << ifs.mountId - << " is broken: no data loader params (system is not ready yet)"; - return false; - } - } return true; // eventually... } @@ -1109,12 +1140,6 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs, return true; } - auto* dlp = params ? params - : ifs.savedDataLoaderParams ? &ifs.savedDataLoaderParams.value() : nullptr; - if (!dlp) { - LOG(ERROR) << "Mount " << ifs.mountId << " is broken: no data loader params"; - return false; - } FileSystemControlParcel fsControlParcel; fsControlParcel.incremental = aidl::make_nullable<IncrementalFileSystemControlParcel>(); fsControlParcel.incremental->cmd.reset(base::unique_fd(::dup(ifs.control.cmd()))); @@ -1126,13 +1151,11 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs, externalListener ? *externalListener : DataLoaderStatusListener()); bool created = false; - auto status = mDataLoaderManager->initializeDataLoader(ifs.mountId, *dlp, fsControlParcel, - listener, &created); + auto status = mDataLoaderManager->initializeDataLoader(ifs.mountId, ifs.dataLoaderParams, fsControlParcel, listener, &created); if (!status.isOk() || !created) { LOG(ERROR) << "Failed to create a data loader for mount " << ifs.mountId; return false; } - ifs.savedDataLoaderParams.reset(); return true; } @@ -1256,6 +1279,42 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_ return success; } +void IncrementalService::registerAppOpsCallback(const std::string& packageName) { + if (packageName.empty()) { + return; + } + + { + std::unique_lock lock{mCallbacksLock}; + if (!mCallbackRegistered.insert(packageName).second) { + return; + } + } + + /* TODO(b/152633648): restore callback after it's not crashing Binder anymore. + sp<AppOpsListener> listener = new AppOpsListener(*this, packageName); + mAppOpsManager->startWatchingMode(AppOpsManager::OP_GET_USAGE_STATS, String16(packageName.c_str()), listener); + */ +} + +void IncrementalService::onAppOppChanged(const std::string& packageName) { + std::vector<IfsMountPtr> affected; + { + std::lock_guard l(mLock); + affected.reserve(mMounts.size()); + for (auto&& [id, ifs] : mMounts) { + if (ifs->dataLoaderFilesystemParams.readLogsEnabled && ifs->dataLoaderParams.packageName == packageName) { + affected.push_back(ifs); + } + } + } + /* TODO(b/152633648): restore callback after it's not crashing Kernel anymore. + for (auto&& ifs : affected) { + applyStorageParams(*ifs); + } + */ +} + binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChanged(MountId mountId, int newStatus) { if (externalListener) { @@ -1319,4 +1378,8 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange return binder::Status::ok(); } +void IncrementalService::AppOpsListener::opChanged(int32_t op, const String16&) { + incrementalService.onAppOppChanged(packageName); +} + } // namespace android::incremental diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index 90d58a7adcf0..ff69633e185b 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -40,6 +40,7 @@ #include "ServiceWrappers.h" #include "android/content/pm/BnDataLoaderStatusListener.h" #include "incfs.h" +#include "dataloader_ndk.h" #include "path.h" using namespace android::os::incremental; @@ -132,6 +133,7 @@ public: bool startLoading(StorageId storage) const; bool configureNativeBinaries(StorageId storage, std::string_view apkFullPath, std::string_view libDirRelativePath, std::string_view abi); + class IncrementalDataLoaderListener : public android::content::pm::BnDataLoaderStatusListener { public: IncrementalDataLoaderListener(IncrementalService& incrementalService, @@ -145,6 +147,16 @@ public: DataLoaderStatusListener externalListener; }; + class AppOpsListener : public android::BnAppOpsCallback { + public: + AppOpsListener(IncrementalService& incrementalService, std::string packageName) : incrementalService(incrementalService), packageName(std::move(packageName)) {} + void opChanged(int32_t op, const String16& packageName) override; + + private: + IncrementalService& incrementalService; + const std::string packageName; + }; + private: struct IncFsMount { struct Bind { @@ -169,11 +181,11 @@ private: /*const*/ MountId mountId; StorageMap storages; BindMap bindPoints; - std::optional<DataLoaderParamsParcel> savedDataLoaderParams; + DataLoaderParamsParcel dataLoaderParams; + DataLoaderFilesystemParams dataLoaderFilesystemParams; std::atomic<int> nextStorageDirNo{0}; std::atomic<int> dataLoaderStatus = -1; bool dataLoaderStartRequested = false; - TimePoint connectionLostTime = TimePoint(); const IncrementalService& incrementalService; IncFsMount(std::string root, MountId mountId, Control control, @@ -181,7 +193,9 @@ private: : root(std::move(root)), control(std::move(control)), mountId(mountId), - incrementalService(incrementalService) {} + incrementalService(incrementalService) { + dataLoaderFilesystemParams.readLogsEnabled = false; + } IncFsMount(IncFsMount&&) = delete; IncFsMount& operator=(IncFsMount&&) = delete; ~IncFsMount(); @@ -196,7 +210,7 @@ private: using BindPathMap = std::map<std::string, IncFsMount::BindMap::iterator, path::PathLess>; void mountExistingImages(); - bool mountExistingImage(std::string_view root, std::string_view key); + bool mountExistingImage(std::string_view root); IfsMountPtr getIfs(StorageId storage) const; const IfsMountPtr& getIfsLocked(StorageId storage) const; @@ -208,8 +222,7 @@ private: std::string&& source, std::string&& target, BindKind kind, std::unique_lock<std::mutex>& mainLock); - bool prepareDataLoader(IncFsMount& ifs, DataLoaderParamsParcel* params = nullptr, - const DataLoaderStatusListener* externalListener = nullptr); + bool prepareDataLoader(IncFsMount& ifs, const DataLoaderStatusListener* externalListener = nullptr); bool startDataLoader(MountId mountId) const; BindPathMap::const_iterator findStorageLocked(std::string_view path) const; @@ -221,10 +234,16 @@ private: std::string normalizePathToStorage(const IfsMountPtr incfs, StorageId storage, std::string_view path); + int applyStorageParams(IncFsMount& ifs); + + void registerAppOpsCallback(const std::string& packageName); + void onAppOppChanged(const std::string& packageName); + // Member variables - std::unique_ptr<VoldServiceWrapper> mVold; - std::unique_ptr<DataLoaderManagerWrapper> mDataLoaderManager; - std::unique_ptr<IncFsWrapper> mIncFs; + std::unique_ptr<VoldServiceWrapper> const mVold; + std::unique_ptr<DataLoaderManagerWrapper> const mDataLoaderManager; + std::unique_ptr<IncFsWrapper> const mIncFs; + std::unique_ptr<AppOpsManagerWrapper> const mAppOpsManager; const std::string mIncrementalDir; mutable std::mutex mLock; @@ -232,6 +251,9 @@ private: MountMap mMounts; BindPathMap mBindsByPath; + std::mutex mCallbacksLock; + std::set<std::string> mCallbackRegistered; + std::atomic_bool mSystemReady = false; StorageId mNextId = 0; std::promise<void> mPrepareDataLoaders; diff --git a/services/incremental/IncrementalServiceValidation.h b/services/incremental/IncrementalServiceValidation.h new file mode 100644 index 000000000000..24f9f7f94dfd --- /dev/null +++ b/services/incremental/IncrementalServiceValidation.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <android-base/stringprintf.h> +#include <binder/IPCThreadState.h> +#include <binder/PermissionCache.h> +#include <binder/PermissionController.h> +#include <binder/Status.h> + +namespace android::incremental { + +inline binder::Status Ok() { + return binder::Status::ok(); +} + +inline binder::Status Exception(uint32_t code, const std::string& msg) { + return binder::Status::fromExceptionCode(code, String8(msg.c_str())); +} + +inline int fromBinderStatus(const binder::Status& status) { + return status.exceptionCode() == binder::Status::EX_SERVICE_SPECIFIC + ? status.serviceSpecificErrorCode() > 0 ? -status.serviceSpecificErrorCode() + : status.serviceSpecificErrorCode() == 0 + ? -EFAULT + : status.serviceSpecificErrorCode() + : -EIO; +} + +inline binder::Status CheckPermissionForDataDelivery(const char* permission, const char* operation) { + using android::base::StringPrintf; + + int32_t pid; + int32_t uid; + + if (!PermissionCache::checkCallingPermission(String16(permission), &pid, &uid)) { + return Exception(binder::Status::EX_SECURITY, + StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission)); + } + + // Caller must also have op granted. + PermissionController pc; + // Package is a required parameter. Need to obtain one. + Vector<String16> packages; + pc.getPackagesForUid(uid, packages); + if (packages.empty()) { + return Exception(binder::Status::EX_SECURITY, + StringPrintf("UID %d / PID %d has no packages", uid, pid)); + } + switch (auto result = pc.noteOp(String16(operation), uid, packages[0]); result) { + case PermissionController::MODE_ALLOWED: + case PermissionController::MODE_DEFAULT: + return binder::Status::ok(); + default: + return Exception(binder::Status::EX_SECURITY, + StringPrintf("UID %d / PID %d lacks app-op %s, error %d", uid, pid, + operation, result)); + } +} + +} // namespace android::incremental diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp index 2e31ef1dcc2f..9f4192fbf531 100644 --- a/services/incremental/ServiceWrappers.cpp +++ b/services/incremental/ServiceWrappers.cpp @@ -59,4 +59,8 @@ std::unique_ptr<IncFsWrapper> RealServiceManager::getIncFs() { return std::make_unique<RealIncFs>(); } +std::unique_ptr<AppOpsManagerWrapper> RealServiceManager::getAppOpsManager() { + return std::make_unique<RealAppOpsManager>(); +} + } // namespace android::os::incremental diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h index c3300305f515..449b457045c6 100644 --- a/services/incremental/ServiceWrappers.h +++ b/services/incremental/ServiceWrappers.h @@ -24,6 +24,7 @@ #include <android/content/pm/IDataLoaderManager.h> #include <android/content/pm/IDataLoaderStatusListener.h> #include <android/os/IVold.h> +#include <binder/AppOpsManager.h> #include <binder/IServiceManager.h> #include <incfs.h> @@ -81,12 +82,19 @@ public: virtual ErrorCode writeBlocks(Span<const DataBlock> blocks) const = 0; }; +class AppOpsManagerWrapper { +public: + virtual ~AppOpsManagerWrapper() = default; + virtual void startWatchingMode(int32_t op, const String16& packageName, const sp<IAppOpsCallback>& callback) = 0; +}; + class ServiceManagerWrapper { public: virtual ~ServiceManagerWrapper() = default; virtual std::unique_ptr<VoldServiceWrapper> getVoldService() = 0; virtual std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() = 0; virtual std::unique_ptr<IncFsWrapper> getIncFs() = 0; + virtual std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() = 0; }; // --- Real stuff --- @@ -137,13 +145,24 @@ private: sp<content::pm::IDataLoaderManager> mInterface; }; +class RealAppOpsManager : public AppOpsManagerWrapper { +public: + ~RealAppOpsManager() = default; + void startWatchingMode(int32_t op, const String16& packageName, const sp<IAppOpsCallback>& callback) override { + mAppOpsManager.startWatchingMode(op, packageName, callback); + } +private: + android::AppOpsManager mAppOpsManager; +}; + class RealServiceManager : public ServiceManagerWrapper { public: RealServiceManager(sp<IServiceManager> serviceManager); ~RealServiceManager() = default; - std::unique_ptr<VoldServiceWrapper> getVoldService() override; - std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() override; - std::unique_ptr<IncFsWrapper> getIncFs() override; + std::unique_ptr<VoldServiceWrapper> getVoldService() final; + std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final; + std::unique_ptr<IncFsWrapper> getIncFs() final; + std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final; private: template <class INTERFACE> diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp index cde38fbb3ca2..5553f688060a 100644 --- a/services/incremental/test/IncrementalServiceTest.cpp +++ b/services/incremental/test/IncrementalServiceTest.cpp @@ -220,24 +220,32 @@ public: } }; +class MockAppOpsManager : public AppOpsManagerWrapper { + MOCK_METHOD3(startWatchingMode, void(int32_t, const String16&, const sp<IAppOpsCallback>&)); +}; + class MockServiceManager : public ServiceManagerWrapper { public: MockServiceManager(std::unique_ptr<MockVoldService> vold, std::unique_ptr<MockDataLoaderManager> manager, - std::unique_ptr<MockIncFs> incfs) + std::unique_ptr<MockIncFs> incfs, + std::unique_ptr<MockAppOpsManager> appOpsManager) : mVold(std::move(vold)), mDataLoaderManager(std::move(manager)), - mIncFs(std::move(incfs)) {} + mIncFs(std::move(incfs)), + mAppOpsManager(std::move(appOpsManager)) {} std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); } std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final { return std::move(mDataLoaderManager); } std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); } + std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final { return std::move(mAppOpsManager); } private: std::unique_ptr<MockVoldService> mVold; std::unique_ptr<MockDataLoaderManager> mDataLoaderManager; std::unique_ptr<MockIncFs> mIncFs; + std::unique_ptr<MockAppOpsManager> mAppOpsManager; }; // --- IncrementalServiceTest --- @@ -251,11 +259,13 @@ public: mDataLoaderManager = dataloaderManager.get(); auto incFs = std::make_unique<NiceMock<MockIncFs>>(); mIncFs = incFs.get(); + auto appOps = std::make_unique<NiceMock<MockAppOpsManager>>(); + mAppOpsManager = appOps.get(); mIncrementalService = std::make_unique<IncrementalService>(MockServiceManager(std::move(vold), - std::move( - dataloaderManager), - std::move(incFs)), + std::move(dataloaderManager), + std::move(incFs), + std::move(appOps)), mRootDir.path); mDataLoaderParcel.packageName = "com.test"; mDataLoaderParcel.arguments = "uri"; @@ -287,6 +297,7 @@ protected: NiceMock<MockVoldService>* mVold; NiceMock<MockIncFs>* mIncFs; NiceMock<MockDataLoaderManager>* mDataLoaderManager; + NiceMock<MockAppOpsManager>* mAppOpsManager; std::unique_ptr<IncrementalService> mIncrementalService; TemporaryDir mRootDir; DataLoaderParamsParcel mDataLoaderParcel; diff --git a/services/systemcaptions/java/com/android/server/systemcaptions/RemoteSystemCaptionsManagerService.java b/services/systemcaptions/java/com/android/server/systemcaptions/RemoteSystemCaptionsManagerService.java index 5480b6ced4e1..c225d3feb063 100644 --- a/services/systemcaptions/java/com/android/server/systemcaptions/RemoteSystemCaptionsManagerService.java +++ b/services/systemcaptions/java/com/android/server/systemcaptions/RemoteSystemCaptionsManagerService.java @@ -108,7 +108,8 @@ final class RemoteSystemCaptionsManagerService { } mBinding = true; - int flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE; + int flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE + | Context.BIND_INCLUDE_CAPABILITIES; boolean willBind = mContext.bindServiceAsUser(mIntent, mServiceConnection, flags, mHandler, new UserHandle(mUserId)); if (!willBind) { diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java index 7bf1d98d9a3f..0445bff8fd0d 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java @@ -16,7 +16,10 @@ package com.android.server.accessibility; +import static android.accessibilityservice.AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY; +import static android.accessibilityservice.AccessibilityService.ERROR_TAKE_SCREENSHOT_NO_ACCESSIBILITY_ACCESS; import static android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_HOME; +import static android.accessibilityservice.AccessibilityService.KEY_ACCESSIBILITY_SCREENSHOT_STATUS; import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_CONTROL_MAGNIFICATION; import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_PERFORM_GESTURES; import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS; @@ -69,6 +72,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.graphics.Region; +import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Handler; import android.os.IBinder; @@ -93,6 +97,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.Spy; @@ -162,6 +167,7 @@ public class AbstractAccessibilityServiceConnectionTest { @Mock private IAccessibilityInteractionConnectionCallback mMockCallback; @Mock private FingerprintGestureDispatcher mMockFingerprintGestureDispatcher; @Mock private MagnificationController mMockMagnificationController; + @Mock private RemoteCallback.OnResultListener mMockListener; @Before public void setup() { @@ -705,6 +711,38 @@ public class AbstractAccessibilityServiceConnectionTest { })); } + @Test + public void takeScreenshot_NoA11yAccess_returnErrorCode() throws InterruptedException { + // no checkAccessibilityAccess, should return error code. + when(mMockSecurityPolicy.canTakeScreenshotLocked(mServiceConnection)).thenReturn(true); + when(mMockSecurityPolicy.checkAccessibilityAccess(mServiceConnection)).thenReturn(false); + + mServiceConnection.takeScreenshot(Display.DEFAULT_DISPLAY, + new RemoteCallback(mMockListener)); + mHandler.sendLastMessage(); + + verify(mMockListener).onResult(Mockito.argThat( + bundle -> ERROR_TAKE_SCREENSHOT_NO_ACCESSIBILITY_ACCESS + == bundle.getInt(KEY_ACCESSIBILITY_SCREENSHOT_STATUS))); + } + + @Test + public void takeScreenshot_invalidDisplay_returnErrorCode() throws InterruptedException { + when(mMockSecurityPolicy.canTakeScreenshotLocked(mServiceConnection)).thenReturn(true); + when(mMockSecurityPolicy.checkAccessibilityAccess(mServiceConnection)).thenReturn(true); + + final DisplayManager displayManager = new DisplayManager(mMockContext); + when(mMockContext.getSystemService(Context.DISPLAY_SERVICE)).thenReturn(displayManager); + + mServiceConnection.takeScreenshot(Display.DEFAULT_DISPLAY + 1, + new RemoteCallback(mMockListener)); + mHandler.sendLastMessage(); + + verify(mMockListener).onResult(Mockito.argThat( + bundle -> ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY + == bundle.getInt(KEY_ACCESSIBILITY_SCREENSHOT_STATUS))); + } + private void updateServiceInfo(AccessibilityServiceInfo serviceInfo, int eventType, int feedbackType, int flags, String[] packageNames, int notificationTimeout) { serviceInfo.eventTypes = eventType; diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceBaseTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceBaseTest.java new file mode 100644 index 000000000000..4fe94583c8b3 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceBaseTest.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.biometrics; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; +import android.hardware.biometrics.BiometricAuthenticator; + +import androidx.test.filters.SmallTest; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.List; + +@SmallTest +public class BiometricServiceBaseTest { + private static class TestableBiometricServiceBase extends BiometricServiceBase { + TestableBiometricServiceBase(Context context) { + super(context); + } + + @Override + protected String getTag() { + return null; + } + + @Override + protected DaemonWrapper getDaemonWrapper() { + return null; + } + + @Override + protected BiometricUtils getBiometricUtils() { + return null; + } + + @Override + protected Constants getConstants() { + return null; + } + + @Override + protected boolean hasReachedEnrollmentLimit(int userId) { + return false; + } + + @Override + protected void updateActiveGroup(int userId, String clientPackage) { + } + + @Override + protected String getLockoutResetIntent() { + return null; + } + + @Override + protected String getLockoutBroadcastPermission() { + return null; + } + + @Override + protected long getHalDeviceId() { + return 0; + } + + @Override + protected boolean hasEnrolledBiometrics(int userId) { + return false; + } + + @Override + protected String getManageBiometricPermission() { + return null; + } + + @Override + protected void checkUseBiometricPermission() { + } + + @Override + protected boolean checkAppOps(int uid, String opPackageName) { + return false; + } + + @Override + protected List<? extends BiometricAuthenticator.Identifier> getEnrolledTemplates( + int userId) { + return null; + } + + @Override + protected int statsModality() { + return 0; + } + + @Override + protected int getLockoutMode() { + return 0; + } + } + + private static final int CLIENT_COOKIE = 0xc00c1e; + + private BiometricServiceBase mBiometricServiceBase; + + @Mock + private Context mContext; + @Mock + private Resources mResources; + @Mock + private BiometricAuthenticator.Identifier mIdentifier; + @Mock + private ClientMonitor mClient; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getString(anyInt())).thenReturn(""); + when(mClient.getCookie()).thenReturn(CLIENT_COOKIE); + + mBiometricServiceBase = new TestableBiometricServiceBase(mContext); + } + + @Test + public void testHandleEnumerate_doesNotCrash_withNullClient() { + mBiometricServiceBase.handleEnumerate(mIdentifier, 0 /* remaining */); + } + + @Test + public void testStartClient_sendsErrorAndRemovesClient_onNonzeroErrorCode() { + when(mClient.start()).thenReturn(1); + + mBiometricServiceBase.startClient(mClient, false /* initiatedByClient */); + + verify(mClient).onError(anyLong(), anyInt(), anyInt()); + verify(mClient).destroy(); + } +} 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 fe47cea6b693..d780370b9849 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -83,7 +83,6 @@ import android.os.Bundle; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; -import android.os.UserManagerInternal; import android.platform.test.annotations.Presubmit; import android.provider.Settings; import android.security.KeyChain; @@ -1170,7 +1169,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { () -> dpm.clearDeviceOwnerApp(admin1.getPackageName())); when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(true); - reset(getServices().userManagerInternal); dpm.clearDeviceOwnerApp(admin1.getPackageName()); // Now DO shouldn't be set. @@ -1181,9 +1179,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { MockUtils.checkUserHandle(UserHandle.USER_SYSTEM)); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(UserHandle.USER_SYSTEM), - MockUtils.checkUserRestrictions(), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(), + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( null, UserHandle.USER_SYSTEM); @@ -1745,15 +1742,16 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); reset(getServices().userManagerInternal); dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(UserHandle.USER_SYSTEM), - MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS, - UserManager.DISALLOW_ADD_USER), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER), + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM, + UserManager.DISALLOW_OUTGOING_CALLS), + eq(true)); reset(getServices().userManagerInternal); DpmTestUtils.assertRestrictions( @@ -1770,8 +1768,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADD_USER); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(UserHandle.USER_SYSTEM), - MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(), + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM, + UserManager.DISALLOW_OUTGOING_CALLS), + eq(true)); reset(getServices().userManagerInternal); DpmTestUtils.assertRestrictions( @@ -1787,7 +1787,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); reset(getServices().userManagerInternal); assertNoDeviceOwnerRestrictions(); @@ -1801,7 +1801,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME, UserManager.DISALLOW_UNMUTE_MICROPHONE), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); reset(getServices().userManagerInternal); dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME); @@ -1813,7 +1813,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); reset(getServices().userManagerInternal); dpm.addUserRestriction(admin1, UserManager.DISALLOW_FUN); @@ -1821,7 +1821,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN, UserManager.DISALLOW_ADD_USER), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); reset(getServices().userManagerInternal); dpm.setCameraDisabled(admin1, true); @@ -1830,7 +1830,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // DISALLOW_CAMERA will be applied globally. MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN, UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_CAMERA), - eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER)); + MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); reset(getServices().userManagerInternal); } @@ -1887,17 +1887,19 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.addUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(DpmMockContext.CALLER_USER_HANDLE), - MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER)); - reset(getServices().userManagerInternal); + MockUtils.checkUserRestrictions(), + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES), + eq(false)); dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(DpmMockContext.CALLER_USER_HANDLE), - MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, + MockUtils.checkUserRestrictions(), + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, UserManager.DISALLOW_OUTGOING_CALLS), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER)); - reset(getServices().userManagerInternal); + eq(false)); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions( @@ -1918,9 +1920,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.clearUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(DpmMockContext.CALLER_USER_HANDLE), - MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER)); - reset(getServices().userManagerInternal); + MockUtils.checkUserRestrictions(), + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + UserManager.DISALLOW_OUTGOING_CALLS), + eq(false)); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions( @@ -1940,8 +1943,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(DpmMockContext.CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER)); - reset(getServices().userManagerInternal); + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE), eq(false)); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(), @@ -1956,21 +1958,25 @@ public class DevicePolicyManagerTest extends DpmTestBase { // DISALLOW_ADJUST_VOLUME and DISALLOW_UNMUTE_MICROPHONE can be set by PO too, even // though when DO sets them they'll be applied globally. dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME); - reset(getServices().userManagerInternal); + dpm.addUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(DpmMockContext.CALLER_USER_HANDLE), - MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME, + MockUtils.checkUserRestrictions(), + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + UserManager.DISALLOW_ADJUST_VOLUME, UserManager.DISALLOW_UNMUTE_MICROPHONE), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER)); - reset(getServices().userManagerInternal); + eq(false)); dpm.setCameraDisabled(admin1, true); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(DpmMockContext.CALLER_USER_HANDLE), - MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME, - UserManager.DISALLOW_UNMUTE_MICROPHONE, UserManager.DISALLOW_CAMERA), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER)); + MockUtils.checkUserRestrictions(), + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + UserManager.DISALLOW_ADJUST_VOLUME, + UserManager.DISALLOW_UNMUTE_MICROPHONE, + UserManager.DISALLOW_CAMERA), + eq(false)); reset(getServices().userManagerInternal); // TODO Make sure restrictions are written to the file. @@ -2004,15 +2010,14 @@ public class DevicePolicyManagerTest extends DpmTestBase { ); public void testSetUserRestriction_asPoOfOrgOwnedDevice() throws Exception { - final int MANAGED_PROFILE_USER_ID = DpmMockContext.CALLER_USER_HANDLE; final int MANAGED_PROFILE_ADMIN_UID = - UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID); + UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID); mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1); configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); - when(getServices().userManager.getProfileParent(MANAGED_PROFILE_USER_ID)) + when(getServices().userManager.getProfileParent(DpmMockContext.CALLER_USER_HANDLE)) .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0)); for (String restriction : PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS) { @@ -2021,16 +2026,20 @@ public class DevicePolicyManagerTest extends DpmTestBase { parentDpm.setCameraDisabled(admin1, true); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(MANAGED_PROFILE_USER_ID), + eq(DpmMockContext.CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(UserManager.DISALLOW_CAMERA), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE)); - reset(getServices().userManagerInternal); + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE), + eq(false)); + DpmTestUtils.assertRestrictions( + DpmTestUtils.newRestrictions(UserManager.DISALLOW_CAMERA), + parentDpm.getUserRestrictions(admin1) + ); parentDpm.setCameraDisabled(admin1, false); - verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(MANAGED_PROFILE_USER_ID), - MockUtils.checkUserRestrictions(), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE)); + DpmTestUtils.assertRestrictions( + DpmTestUtils.newRestrictions(), + parentDpm.getUserRestrictions(admin1) + ); reset(getServices().userManagerInternal); } @@ -2039,13 +2048,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(DpmMockContext.CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(restriction), - eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE)); + MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE), + eq(false)); parentDpm.clearUserRestriction(admin1, restriction); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(), parentDpm.getUserRestrictions(admin1) ); - reset(getServices().userManagerInternal); } public void testNoDefaultEnabledUserRestrictions() throws Exception { diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java index 09a681913e45..15f3ed1be552 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java @@ -15,10 +15,6 @@ */ package com.android.server.devicepolicy; -import com.google.common.base.Objects; - -import com.android.server.pm.UserRestrictionsUtils; - import android.content.ComponentName; import android.content.Intent; import android.os.BaseBundle; @@ -26,6 +22,11 @@ import android.os.Bundle; import android.os.UserHandle; import android.util.ArraySet; +import com.android.server.pm.RestrictionsSet; +import com.android.server.pm.UserRestrictionsUtils; + +import com.google.common.base.Objects; + import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; @@ -106,11 +107,14 @@ public class MockUtils { } public static Bundle checkUserRestrictions(String... keys) { - final Bundle expected = DpmTestUtils.newRestrictions(java.util.Objects.requireNonNull(keys)); + final Bundle expected = DpmTestUtils.newRestrictions( + java.util.Objects.requireNonNull(keys)); final Matcher<Bundle> m = new BaseMatcher<Bundle>() { @Override public boolean matches(Object item) { - if (item == null) return false; + if (item == null) { + return false; + } return UserRestrictionsUtils.areEqual((Bundle) item, expected); } @@ -122,6 +126,26 @@ public class MockUtils { return MockitoHamcrest.argThat(m); } + public static RestrictionsSet checkUserRestrictions(int userId, String... keys) { + final RestrictionsSet expected = DpmTestUtils.newRestrictions(userId, + java.util.Objects.requireNonNull(keys)); + final Matcher<RestrictionsSet> m = new BaseMatcher<RestrictionsSet>() { + @Override + public boolean matches(Object item) { + if (item == null) return false; + RestrictionsSet actual = (RestrictionsSet) item; + return UserRestrictionsUtils.areEqual(expected.getRestrictions(userId), + actual.getRestrictions(userId)); + } + + @Override + public void describeTo(Description description) { + description.appendText("User restrictions=" + getRestrictionsAsString(expected)); + } + }; + return MockitoHamcrest.argThat(m); + } + public static Set<String> checkApps(String... adminApps) { final Matcher<Set<String>> m = new BaseMatcher<Set<String>>() { @Override @@ -146,6 +170,23 @@ public class MockUtils { return MockitoHamcrest.argThat(m); } + private static String getRestrictionsAsString(RestrictionsSet r) { + final StringBuilder sb = new StringBuilder(); + sb.append("{"); + + if (r != null) { + String sep = ""; + for (int i = 0; i < r.size(); i++) { + sb.append(sep); + sep = ","; + sb.append( + String.format("%s= %s", r.keyAt(i), getRestrictionsAsString(r.valueAt(i)))); + } + } + sb.append("}"); + return sb.toString(); + } + private static String getRestrictionsAsString(Bundle b) { final StringBuilder sb = new StringBuilder(); sb.append("["); diff --git a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java index 1c2313e3e32f..dc181a959d83 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java @@ -22,7 +22,6 @@ import static com.android.server.devicepolicy.DpmTestUtils.newRestrictions; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; -import android.os.UserManagerInternal; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.util.SparseArray; @@ -118,135 +117,6 @@ public class UserRestrictionsUtilsTest extends AndroidTestCase { UserManager.DISALLOW_ADJUST_VOLUME, user)); } - public void testSortToGlobalAndLocal() { - final Bundle local = new Bundle(); - final Bundle global = new Bundle(); - - UserRestrictionsUtils.sortToGlobalAndLocal(null, - UserManagerInternal.OWNER_TYPE_PROFILE_OWNER, - global, local); - assertEquals(0, global.size()); - assertEquals(0, local.size()); - - UserRestrictionsUtils.sortToGlobalAndLocal(Bundle.EMPTY, - UserManagerInternal.OWNER_TYPE_PROFILE_OWNER, - global, local); - assertEquals(0, global.size()); - assertEquals(0, local.size()); - - // Restrictions set by DO. - UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions( - UserManager.DISALLOW_ADJUST_VOLUME, - UserManager.DISALLOW_UNMUTE_MICROPHONE, - UserManager.DISALLOW_USB_FILE_TRANSFER, - UserManager.DISALLOW_CONFIG_TETHERING, - UserManager.DISALLOW_OUTGOING_BEAM, - UserManager.DISALLOW_APPS_CONTROL, - UserManager.ENSURE_VERIFY_APPS, - UserManager.DISALLOW_CAMERA - ), UserManagerInternal.OWNER_TYPE_DEVICE_OWNER, - global, local); - - - assertRestrictions(newRestrictions( - // This one is global no matter who sets it. - UserManager.ENSURE_VERIFY_APPS, - - // These can be set by PO too, but when DO sets them, they're global. - UserManager.DISALLOW_ADJUST_VOLUME, - UserManager.DISALLOW_UNMUTE_MICROPHONE, - - // These can only be set by DO. - UserManager.DISALLOW_USB_FILE_TRANSFER, - UserManager.DISALLOW_CONFIG_TETHERING, - - // This can be set by DO or PO of organisation owned device - UserManager.DISALLOW_CAMERA - ), global); - - assertRestrictions(newRestrictions( - // They can be set by both DO/PO. - UserManager.DISALLOW_OUTGOING_BEAM, - UserManager.DISALLOW_APPS_CONTROL - ), local); - - local.clear(); - global.clear(); - - // Restrictions set by PO. - UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions( - UserManager.DISALLOW_ADJUST_VOLUME, - UserManager.DISALLOW_UNMUTE_MICROPHONE, - UserManager.DISALLOW_USB_FILE_TRANSFER, - UserManager.DISALLOW_CONFIG_TETHERING, - UserManager.DISALLOW_OUTGOING_BEAM, - UserManager.DISALLOW_APPS_CONTROL, - UserManager.ENSURE_VERIFY_APPS, - UserManager.DISALLOW_CAMERA - ), UserManagerInternal.OWNER_TYPE_PROFILE_OWNER, - global, local); - - assertRestrictions(newRestrictions( - // This one is global no matter who sets it. - UserManager.ENSURE_VERIFY_APPS - ), global); - - assertRestrictions(newRestrictions( - // These can be set by PO too, but when PO sets them, they're local. - UserManager.DISALLOW_ADJUST_VOLUME, - UserManager.DISALLOW_UNMUTE_MICROPHONE, - - // They can be set by both DO/PO. - UserManager.DISALLOW_OUTGOING_BEAM, - UserManager.DISALLOW_APPS_CONTROL, - - // These can only be set by DO. - UserManager.DISALLOW_USB_FILE_TRANSFER, - UserManager.DISALLOW_CONFIG_TETHERING, - - // This can be set by DO or PO of organisation owned device - UserManager.DISALLOW_CAMERA - ), local); - - local.clear(); - global.clear(); - - // Restrictions set by PO of organisation owned device - UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions( - UserManager.DISALLOW_CONFIG_DATE_TIME - ), UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE, - global, local); - - assertRestrictions(newRestrictions( - // This user restriction is global when set by PO of org owned device - UserManager.DISALLOW_CONFIG_DATE_TIME - ), global); - assertEquals(0, local.size()); - } - - public void testSortToLocalAndGlobalWithCameraDisabled() { - final Bundle local = new Bundle(); - final Bundle global = new Bundle(); - - UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(UserManager.DISALLOW_CAMERA), - UserManagerInternal.OWNER_TYPE_DEVICE_OWNER, global, local); - assertRestrictions(newRestrictions(UserManager.DISALLOW_CAMERA), global); - assertEquals(0, local.size()); - global.clear(); - - UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(UserManager.DISALLOW_CAMERA), - UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE, global, - local); - assertRestrictions(newRestrictions(UserManager.DISALLOW_CAMERA), global); - assertEquals(0, local.size()); - global.clear(); - - UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(UserManager.DISALLOW_CAMERA), - UserManagerInternal.OWNER_TYPE_PROFILE_OWNER, global, local); - assertEquals(0, global.size()); - assertRestrictions(newRestrictions(UserManager.DISALLOW_CAMERA), local); - } - public void testMoveRestriction() { SparseArray<RestrictionsSet> localRestrictions = new SparseArray<>(); RestrictionsSet globalRestrictions = new RestrictionsSet(); diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java index 5df4509af885..adf4551e79a8 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java @@ -77,25 +77,25 @@ public class PackageDexUsageTests { String fooDataDir = "/data/user/0/com.google.foo/"; mFooBaseUser0 = new TestData(fooPackageName, - fooCodeDir + "base.apk", 0, ISA, false, true, fooPackageName); + fooCodeDir + "base.apk", 0, ISA, true, fooPackageName); mFooSplit1User0 = new TestData(fooPackageName, - fooCodeDir + "split-1.apk", 0, ISA, false, true, fooPackageName); + fooCodeDir + "split-1.apk", 0, ISA, true, fooPackageName); mFooSplit2UsedByOtherApps0 = new TestData(fooPackageName, - fooCodeDir + "split-2.apk", 0, ISA, true, true, "used.by.other.com"); + fooCodeDir + "split-2.apk", 0, ISA, true, "used.by.other.com"); mFooSecondary1User0 = new TestData(fooPackageName, - fooDataDir + "sec-1.dex", 0, ISA, false, false, fooPackageName); + fooDataDir + "sec-1.dex", 0, ISA, false, fooPackageName); mFooSecondary1User1 = new TestData(fooPackageName, - fooDataDir + "sec-1.dex", 1, ISA, false, false, fooPackageName); + fooDataDir + "sec-1.dex", 1, ISA, false, fooPackageName); mFooSecondary2UsedByOtherApps0 = new TestData(fooPackageName, - fooDataDir + "sec-2.dex", 0, ISA, true, false, "used.by.other.com"); + fooDataDir + "sec-2.dex", 0, ISA, false, "used.by.other.com"); mInvalidIsa = new TestData(fooPackageName, - fooCodeDir + "base.apk", 0, "INVALID_ISA", false, true, "INALID_USER"); + fooCodeDir + "base.apk", 0, "INVALID_ISA", true, "INALID_USER"); String barPackageName = "com.google.bar"; String barCodeDir = "/data/app/com.google.bar/"; @@ -103,11 +103,11 @@ public class PackageDexUsageTests { String barDataDir1 = "/data/user/1/com.google.bar/"; mBarBaseUser0 = new TestData(barPackageName, - barCodeDir + "base.apk", 0, ISA, false, true, barPackageName); + barCodeDir + "base.apk", 0, ISA, true, barPackageName); mBarSecondary1User0 = new TestData(barPackageName, - barDataDir + "sec-1.dex", 0, ISA, false, false, barPackageName); + barDataDir + "sec-1.dex", 0, ISA, false, barPackageName); mBarSecondary2User1 = new TestData(barPackageName, - barDataDir1 + "sec-2.dex", 1, ISA, false, false, barPackageName); + barDataDir1 + "sec-2.dex", 1, ISA, false, barPackageName); } @Test @@ -134,7 +134,9 @@ public class PackageDexUsageTests { public void testRecordSplitPrimarySequence() { // Assert new information. assertTrue(record(mFooBaseUser0)); - // Assert no new information. + assertTrue(record(mFooSplit1User0)); + // Assert no new information if we add again + assertFalse(record(mFooBaseUser0)); assertFalse(record(mFooSplit1User0)); assertPackageDexUsage(mFooBaseUser0); @@ -192,7 +194,7 @@ public class PackageDexUsageTests { for (int i = 1; i <= tooManyFiles; i++) { String fooPackageName = "com.google.foo"; TestData testData = new TestData(fooPackageName, - "/data/user/0/" + fooPackageName + "/sec-" + i + "1.dex", 0, ISA, false, false, + "/data/user/0/" + fooPackageName + "/sec-" + i + "1.dex", 0, ISA, false, fooPackageName); if (i < tooManyFiles) { assertTrue("Adding " + testData.mDexFile, record(testData)); @@ -200,7 +202,11 @@ public class PackageDexUsageTests { } else { assertFalse("Adding " + testData.mDexFile, record(testData)); } - assertPackageDexUsage(mPackageDexUsage, null, null, expectedSecondaries); + assertPackageDexUsage( + mPackageDexUsage, + /* usdeBy=*/ (Set<String>) null, + /* primaryDex= */ null, + expectedSecondaries); } } @@ -276,7 +282,7 @@ public class PackageDexUsageTests { Map<String, Set<String>> packageToCodePaths = new HashMap<>(); packageToCodePaths.put(mBarBaseUser0.mPackageName, new HashSet<>(Arrays.asList(mBarBaseUser0.mDexFile))); - mPackageDexUsage.syncData(packageToUsersMap, packageToCodePaths); + mPackageDexUsage.syncData(packageToUsersMap, packageToCodePaths, new ArrayList<String>()); // Assert that only user 1 files are there. assertPackageDexUsage(mBarBaseUser0, mBarSecondary2User1); @@ -284,6 +290,41 @@ public class PackageDexUsageTests { } @Test + public void testSyncDataKeepPackages() { + PackageDexUsage packageDexUsage = new PackageDexUsage(); + // Write the record we want to keep and which won't be keep by default. + Set<String> fooUsers = new HashSet<>(Arrays.asList( + new String[] {mFooBaseUser0.mPackageName})); + assertTrue(record(packageDexUsage, mFooBaseUser0, fooUsers)); + // Write a record that would be kept by default. + Set<String> barUsers = new HashSet<>(Arrays.asList( + new String[] {"another.package", mFooBaseUser0.mPackageName})); + assertTrue(record(packageDexUsage, mBarBaseUser0, barUsers)); + + // Construct the user packages and their code paths (things that will be + // kept by default during sync). + Map<String, Set<Integer>> packageToUsersMap = new HashMap<>(); + packageToUsersMap.put(mBarBaseUser0.mPackageName, + new HashSet<>(Arrays.asList(mBarBaseUser0.mOwnerUserId))); + Map<String, Set<String>> packageToCodePaths = new HashMap<>(); + packageToCodePaths.put(mBarBaseUser0.mPackageName, + new HashSet<>(Arrays.asList(mBarBaseUser0.mDexFile))); + + // Sync data. + List<String> keepData = new ArrayList<String>(); + keepData.add(mFooBaseUser0.mPackageName); + packageDexUsage.syncData(packageToUsersMap, packageToCodePaths, keepData); + + // Assert that both packages are kept + assertPackageDexUsage(packageDexUsage, fooUsers, mFooBaseUser0); + // "another.package" should not be in the loading packages after sync. + Set<String> expectedBarUsers = new HashSet<>(Arrays.asList( + new String[] {mFooBaseUser0.mPackageName})); + assertPackageDexUsage(packageDexUsage, expectedBarUsers, + mBarBaseUser0.updateUsedBy(mFooBaseUser0.mPackageName)); + } + + @Test public void testRemovePackage() { // Record Bar secondaries for two different users. assertTrue(record(mBarSecondary1User0)); @@ -345,9 +386,8 @@ public class PackageDexUsageTests { mFooSplit2UsedByOtherApps0.mDexFile, mFooSplit2UsedByOtherApps0.mOwnerUserId, mFooSplit2UsedByOtherApps0.mLoaderIsa, - /*mIsUsedByOtherApps*/false, mFooSplit2UsedByOtherApps0.mPrimaryOrSplit, - mFooSplit2UsedByOtherApps0.mUsedBy); + /*usedBy=*/ null); assertPackageDexUsage(noLongerUsedByOtherApps); } @@ -371,19 +411,19 @@ public class PackageDexUsageTests { assertTrue(record(packageDexUsageRecordUsers, mFooSplit2UsedByOtherApps0, users)); assertTrue(record(packageDexUsageRecordUsers, mFooSplit2UsedByOtherApps0, usersExtra)); - assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, users)); - assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, usersExtra)); + assertTrue(record(packageDexUsageRecordUsers, mFooSecondary2UsedByOtherApps0, users)); + assertTrue(record(packageDexUsageRecordUsers, mFooSecondary2UsedByOtherApps0, usersExtra)); packageDexUsageRecordUsers = writeAndReadBack(packageDexUsageRecordUsers); // Verify that the users were recorded. Set<String> userAll = new HashSet<>(users); userAll.addAll(usersExtra); assertPackageDexUsage(packageDexUsageRecordUsers, userAll, mFooSplit2UsedByOtherApps0, - mFooSecondary1User0); + mFooSecondary2UsedByOtherApps0); } @Test - public void testRecordDexFileUsersNotTheOwningPackage() { + public void testRecordDexFileUsersAndTheOwningPackage() { PackageDexUsage packageDexUsageRecordUsers = new PackageDexUsage(); Set<String> users = new HashSet<>(Arrays.asList( new String[] {mFooSplit2UsedByOtherApps0.mPackageName})); @@ -393,13 +433,13 @@ public class PackageDexUsageTests { assertTrue(record(packageDexUsageRecordUsers, mFooSplit2UsedByOtherApps0, users)); assertTrue(record(packageDexUsageRecordUsers, mFooSplit2UsedByOtherApps0, usersExtra)); - assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, users)); - assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, usersExtra)); - packageDexUsageRecordUsers = writeAndReadBack(packageDexUsageRecordUsers); - // Verify that only the non owning packages were recorded. - assertPackageDexUsage(packageDexUsageRecordUsers, usersExtra, mFooSplit2UsedByOtherApps0, - mFooSecondary1User0); + + Set<String> expectedUsers = new HashSet<>(users); + expectedUsers.addAll(usersExtra); + // Verify that all loading packages were recorded. + assertPackageDexUsage( + packageDexUsageRecordUsers, expectedUsers, mFooSplit2UsedByOtherApps0); } @Test @@ -421,44 +461,97 @@ public class PackageDexUsageTests { } @Test - public void testRecordClassLoaderContextTransitionFromUnknown() { - // Record a secondary dex file. - TestData unknownContext = mFooSecondary1User0.updateClassLoaderContext( - PackageDexUsage.UNKNOWN_CLASS_LOADER_CONTEXT); - assertTrue(record(unknownContext)); - - assertPackageDexUsage(null, unknownContext); - writeAndReadBack(); - assertPackageDexUsage(null, unknownContext); - - // Now update the secondary dex record with a class loader context. This simulates the - // version 2 to version 3 upgrade. - - assertTrue(record(mFooSecondary1User0)); - - assertPackageDexUsage(null, mFooSecondary1User0); - writeAndReadBack(); - assertPackageDexUsage(null, mFooSecondary1User0); - } - - @Test public void testDexUsageClassLoaderContext() { final boolean isUsedByOtherApps = false; final int userId = 0; PackageDexUsage.DexUseInfo validContext = new DexUseInfo(isUsedByOtherApps, userId, "valid_context", "arm"); - assertFalse(validContext.isUnknownClassLoaderContext()); + assertFalse(validContext.isUnsupportedClassLoaderContext()); assertFalse(validContext.isVariableClassLoaderContext()); PackageDexUsage.DexUseInfo variableContext = new DexUseInfo(isUsedByOtherApps, userId, PackageDexUsage.VARIABLE_CLASS_LOADER_CONTEXT, "arm"); - assertFalse(variableContext.isUnknownClassLoaderContext()); + assertFalse(variableContext.isUnsupportedClassLoaderContext()); assertTrue(variableContext.isVariableClassLoaderContext()); + } - PackageDexUsage.DexUseInfo unknownContext = new DexUseInfo(isUsedByOtherApps, userId, - PackageDexUsage.UNKNOWN_CLASS_LOADER_CONTEXT, "arm"); - assertTrue(unknownContext.isUnknownClassLoaderContext()); - assertFalse(unknownContext.isVariableClassLoaderContext()); + @Test + public void testRead() { + String isa = VMRuntime.getInstructionSet(Build.SUPPORTED_ABIS[0]); + // Equivalent to + // record(mFooSplit2UsedByOtherApps0); + // record(mFooSecondary1User0); + // record(mFooSecondary2UsedByOtherApps0); + // record(mBarBaseUser0); + // record(mBarSecondary1User0); + String content = "PACKAGE_MANAGER__PACKAGE_DEX_USAGE__2\n" + + "com.google.foo\n" + + "+/data/app/com.google.foo/split-2.apk\n" + + "@used.by.other.com\n" + + "#/data/user/0/com.google.foo/sec-2.dex\n" + + "0,1," + ISA + "\n" + + "@used.by.other.com\n" + + "PCL[/data/user/0/com.google.foo/sec-2.dex]\n" + + "#/data/user/0/com.google.foo/sec-1.dex\n" + + "0,0," + ISA + "\n" + + "@\n" + + "PCL[/data/user/0/com.google.foo/sec-1.dex]\n" + + "com.google.bar\n" + + "+/data/app/com.google.bar/base.apk\n" + + "@com.google.bar\n" + + "#/data/user/0/com.google.bar/sec-1.dex\n" + + "0,0," + ISA + "\n" + + "@\n" + + "PCL[/data/user/0/com.google.bar/sec-1.dex]"; + + PackageDexUsage packageDexUsage = new PackageDexUsage(); + try { + packageDexUsage.read(new StringReader(content)); + } catch (IOException e) { + fail(); + } + + // After the read we must sync the data to fill the missing information on the code paths. + Map<String, Set<Integer>> packageToUsersMap = new HashMap<>(); + Map<String, Set<String>> packageToCodePaths = new HashMap<>(); + + // Handle foo package. + packageToUsersMap.put( + mFooSplit2UsedByOtherApps0.mPackageName, + new HashSet<>(Arrays.asList(mFooSplit2UsedByOtherApps0.mOwnerUserId))); + packageToCodePaths.put( + mFooSplit2UsedByOtherApps0.mPackageName, + new HashSet<>(Arrays.asList(mFooSplit2UsedByOtherApps0.mDexFile, + mFooSplit1User0.mDexFile, mFooBaseUser0.mDexFile))); + // Handle bar package. + packageToUsersMap.put( + mBarBaseUser0.mPackageName, + new HashSet<>(Arrays.asList(mBarBaseUser0.mOwnerUserId))); + packageToCodePaths.put( + mBarBaseUser0.mPackageName, + new HashSet<>(Arrays.asList(mBarBaseUser0.mDexFile))); + // Handle the loading package. + packageToUsersMap.put( + mFooSplit2UsedByOtherApps0.mUsedBy, + new HashSet<>(Arrays.asList(mFooSplit2UsedByOtherApps0.mOwnerUserId))); + + // Sync the data. + packageDexUsage.syncData(packageToUsersMap, packageToCodePaths, new ArrayList<>()); + + // Assert foo code paths. + assertPackageDexUsage( + packageDexUsage, + /*nonDefaultUsers=*/ null, + mFooSplit2UsedByOtherApps0, + mFooSecondary2UsedByOtherApps0, + mFooSecondary1User0); + + // Assert bar code paths. + assertPackageDexUsage( + packageDexUsage, + /*nonDefaultUsers=*/ null, + mBarBaseUser0, + mBarSecondary1User0); } @Test @@ -483,77 +576,19 @@ public class PackageDexUsageTests { } @Test - public void testReadVersion1() { + public void testEnsureLoadingPackagesCanBeExtended() { String isa = VMRuntime.getInstructionSet(Build.SUPPORTED_ABIS[0]); - // Equivalent to - // record(mFooSplit2UsedByOtherApps0); - // record(mFooSecondary1User0); - // record(mFooSecondary2UsedByOtherApps0); - // record(mBarBaseUser0); - // record(mBarSecondary1User0); - String content = "PACKAGE_MANAGER__PACKAGE_DEX_USAGE__1\n" - + "com.google.foo,1\n" - + "#/data/user/0/com.google.foo/sec-1.dex\n" - + "0,0," + isa + "\n" - + "#/data/user/0/com.google.foo/sec-2.dex\n" - + "0,1," + isa + "\n" - + "com.google.bar,0\n" - + "#/data/user/0/com.google.bar/sec-1.dex\n" - + "0,0," + isa + "\n"; - + String content = "PACKAGE_MANAGER__PACKAGE_DEX_USAGE__2\n" + + "com.google.foo\n" + + "+/data/app/com.google.foo/split-2.apk\n" + + "@\n"; PackageDexUsage packageDexUsage = new PackageDexUsage(); try { packageDexUsage.read(new StringReader(content)); } catch (IOException e) { fail(); } - - // After the read we must sync the data to fill the missing information on the code paths. - Map<String, Set<Integer>> packageToUsersMap = new HashMap<>(); - Map<String, Set<String>> packageToCodePaths = new HashMap<>(); - - // Handle foo package. - packageToUsersMap.put(mFooSplit2UsedByOtherApps0.mPackageName, - new HashSet<>(Arrays.asList(mFooSplit2UsedByOtherApps0.mOwnerUserId))); - packageToCodePaths.put(mFooSplit2UsedByOtherApps0.mPackageName, - new HashSet<>(Arrays.asList(mFooSplit2UsedByOtherApps0.mDexFile, - mFooSplit1User0.mDexFile, mFooBaseUser0.mDexFile))); - // Handle bar package. - packageToUsersMap.put(mBarBaseUser0.mPackageName, - new HashSet<>(Arrays.asList(mBarBaseUser0.mOwnerUserId))); - packageToCodePaths.put(mBarBaseUser0.mPackageName, - new HashSet<>(Arrays.asList(mBarBaseUser0.mDexFile))); - - // Sync the data. - packageDexUsage.syncData(packageToUsersMap, packageToCodePaths); - - // Update the class loaders to unknown before asserting if needed. Before version 2 we - // didn't have any. - String unknown = PackageDexUsage.UNKNOWN_CLASS_LOADER_CONTEXT; - TestData fooBaseUser0 = mFooBaseUser0.updateClassLoaderContext(unknown); - TestData fooSplit1User0 = mFooSplit1User0.updateClassLoaderContext(unknown); - TestData fooSplit2UsedByOtherApps0 = - mFooSplit2UsedByOtherApps0.updateClassLoaderContext(unknown); - TestData fooSecondary1User0 = mFooSecondary1User0.updateClassLoaderContext(unknown); - TestData fooSecondary2UsedByOtherApps0 = - mFooSecondary2UsedByOtherApps0.updateClassLoaderContext(unknown); - TestData barBaseUser0 = mBarBaseUser0.updateClassLoaderContext(unknown); - TestData barSecondary1User0 = mBarSecondary1User0.updateClassLoaderContext(unknown); - - // Assert foo code paths. Note that we ignore the users during upgrade. - final Set<String> ignoredUsers = null; - assertPackageDexUsage(packageDexUsage, ignoredUsers, - fooSplit2UsedByOtherApps0, fooSecondary1User0, fooSecondary2UsedByOtherApps0); - // Because fooSplit2UsedByOtherApps0 is used by others, all the other code paths must - // share the same data. - assertPackageDexUsage(packageDexUsage, ignoredUsers, - fooSplit1User0.updateUseByOthers(true), - fooSecondary1User0, fooSecondary2UsedByOtherApps0); - assertPackageDexUsage(packageDexUsage, ignoredUsers, fooBaseUser0.updateUseByOthers(true), - fooSecondary1User0, fooSecondary2UsedByOtherApps0); - - // Assert bar code paths. Note that we ignore the users during upgrade. - assertPackageDexUsage(packageDexUsage, ignoredUsers, barBaseUser0, barSecondary1User0); + record(packageDexUsage, mFooSplit2UsedByOtherApps0, mFooSplit2UsedByOtherApps0.getUsedBy()); } private void assertPackageDexUsage(TestData primary, TestData... secondaries) { @@ -570,16 +605,18 @@ public class PackageDexUsageTests { String packageName = primary == null ? secondaries.get(0).mPackageName : primary.mPackageName; - boolean primaryUsedByOtherApps = primary != null && primary.mUsedByOtherApps; + boolean primaryUsedByOtherApps = primary != null && primary.isUsedByOtherApps(); PackageUseInfo pInfo = packageDexUsage.getPackageUseInfo(packageName); // Check package use info assertNotNull(pInfo); if (primary != null) { - assertEquals(primaryUsedByOtherApps, pInfo.isUsedByOtherApps(primary.mDexFile)); if (users != null) { assertEquals(pInfo.getLoadingPackages(primary.mDexFile), users); + } else if (pInfo.getLoadingPackages(primary.mDexFile) != null) { + assertEquals(pInfo.getLoadingPackages(primary.mDexFile), primary.getUsedBy()); } + assertEquals(primaryUsedByOtherApps, pInfo.isUsedByOtherApps(primary.mDexFile)); } Map<String, DexUseInfo> dexUseInfoMap = pInfo.getDexUseInfoMap(); @@ -589,13 +626,15 @@ public class PackageDexUsageTests { for (TestData testData : secondaries) { DexUseInfo dInfo = dexUseInfoMap.get(testData.mDexFile); assertNotNull(dInfo); - assertEquals(testData.mUsedByOtherApps, dInfo.isUsedByOtherApps()); + if (users != null) { + assertEquals(testData.mDexFile, dInfo.getLoadingPackages(), users); + } else { + assertEquals(testData.mDexFile, dInfo.getLoadingPackages(), testData.getUsedBy()); + } + assertEquals(testData.isUsedByOtherApps(), dInfo.isUsedByOtherApps()); assertEquals(testData.mOwnerUserId, dInfo.getOwnerUserId()); assertEquals(1, dInfo.getLoaderIsas().size()); assertTrue(dInfo.getLoaderIsas().contains(testData.mLoaderIsa)); - if (users != null) { - assertEquals(dInfo.getLoadingPackages(), users); - } assertEquals(testData.mClassLoaderContext, dInfo.getClassLoaderContext()); } @@ -603,7 +642,7 @@ public class PackageDexUsageTests { private boolean record(TestData testData) { return mPackageDexUsage.record(testData.mPackageName, testData.mDexFile, - testData.mOwnerUserId, testData.mLoaderIsa, testData.mUsedByOtherApps, + testData.mOwnerUserId, testData.mLoaderIsa, testData.mPrimaryOrSplit, testData.mUsedBy, testData.mClassLoaderContext); } @@ -611,7 +650,7 @@ public class PackageDexUsageTests { boolean result = true; for (String user : users) { result = result && packageDexUsage.record(testData.mPackageName, testData.mDexFile, - testData.mOwnerUserId, testData.mLoaderIsa, testData.mUsedByOtherApps, + testData.mOwnerUserId, testData.mLoaderIsa, testData.mPrimaryOrSplit, user, testData.mClassLoaderContext); } return result; @@ -640,37 +679,49 @@ public class PackageDexUsageTests { private final String mDexFile; private final int mOwnerUserId; private final String mLoaderIsa; - private final boolean mUsedByOtherApps; private final boolean mPrimaryOrSplit; private final String mUsedBy; private final String mClassLoaderContext; private TestData(String packageName, String dexFile, int ownerUserId, - String loaderIsa, boolean isUsedByOtherApps, boolean primaryOrSplit, String usedBy) { - this(packageName, dexFile, ownerUserId, loaderIsa, isUsedByOtherApps, primaryOrSplit, - usedBy, "DefaultClassLoaderContextFor_" + dexFile); + String loaderIsa, boolean primaryOrSplit, String usedBy) { + this(packageName, dexFile, ownerUserId, loaderIsa, primaryOrSplit, + usedBy, "PCL[" + dexFile + "]"); } private TestData(String packageName, String dexFile, int ownerUserId, - String loaderIsa, boolean isUsedByOtherApps, boolean primaryOrSplit, String usedBy, + String loaderIsa, boolean primaryOrSplit, String usedBy, String classLoaderContext) { mPackageName = packageName; mDexFile = dexFile; mOwnerUserId = ownerUserId; mLoaderIsa = loaderIsa; - mUsedByOtherApps = isUsedByOtherApps; mPrimaryOrSplit = primaryOrSplit; mUsedBy = usedBy; mClassLoaderContext = classLoaderContext; } private TestData updateClassLoaderContext(String newContext) { - return new TestData(mPackageName, mDexFile, mOwnerUserId, mLoaderIsa, mUsedByOtherApps, + return new TestData(mPackageName, mDexFile, mOwnerUserId, mLoaderIsa, mPrimaryOrSplit, mUsedBy, newContext); } - private TestData updateUseByOthers(boolean newUsedByOthers) { - return new TestData(mPackageName, mDexFile, mOwnerUserId, mLoaderIsa, newUsedByOthers, - mPrimaryOrSplit, mUsedBy, mClassLoaderContext); + private TestData updateUsedBy(String newUsedBy) { + return new TestData(mPackageName, mDexFile, mOwnerUserId, mLoaderIsa, + mPrimaryOrSplit, newUsedBy, mClassLoaderContext); + } + + private boolean isUsedByOtherApps() { + return mUsedBy != null && !mPackageName.equals(mUsedBy); + } + + private Set<String> getUsedBy() { + Set<String> users = new HashSet<>(); + if ((mUsedBy != null) && (mPrimaryOrSplit || isUsedByOtherApps())) { + // We do not store the loading package for secondary dex files + // which are not used by others. + users.add(mUsedBy); + } + return users; } } } diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdaterTest.java new file mode 100644 index 000000000000..404f29c118d0 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdaterTest.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.pm.parsing.library; + +import android.os.Build; +import android.platform.test.annotations.Presubmit; + +import androidx.test.filters.SmallTest; + +import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.PackageImpl; +import com.android.server.pm.parsing.pkg.ParsedPackage; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Test for {@link ComGoogleAndroidMapsUpdater} + */ +@Presubmit +@SmallTest +@RunWith(JUnit4.class) +public class ComGoogleAndroidMapsUpdaterTest extends PackageSharedLibraryUpdaterTest { + + @Test + public void otherUsesLibraries() { + ParsedPackage before = ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.O) + .addUsesLibrary("other") + .addUsesOptionalLibrary("optional") + .addUsesLibrary("com.google.android.maps") + .hideAsParsed()); + AndroidPackage after = ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.O) + .addUsesLibrary("other") + .addUsesOptionalLibrary("optional") + .hideAsParsed()) + .hideAsFinal(); + checkBackwardsCompatibility(before, after); + } + + @Test + public void in_usesLibraries() { + ParsedPackage before = ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.CUR_DEVELOPMENT) + .addUsesLibrary("com.google.android.maps") + .hideAsParsed()); + + AndroidPackage after = ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.CUR_DEVELOPMENT) + .hideAsParsed()) + .hideAsFinal(); + + // No change is required because the package explicitly requests org.apache.http.legacy + // and is targeted at the current version so does not need backwards compatibility. + checkBackwardsCompatibility(before, after); + } + + @Test + public void in_usesOptionalLibraries() { + ParsedPackage before = ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.CUR_DEVELOPMENT) + .addUsesOptionalLibrary("com.google.android.maps") + .hideAsParsed()); + + AndroidPackage after = ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.CUR_DEVELOPMENT) + .hideAsParsed()) + .hideAsFinal(); + + // No change is required because the package explicitly requests org.apache.http.legacy + // and is targeted at the current version so does not need backwards compatibility. + checkBackwardsCompatibility(before, after); + } + + private void checkBackwardsCompatibility(ParsedPackage before, AndroidPackage after) { + checkBackwardsCompatibility(before, after, ComGoogleAndroidMapsUpdater::new); + } +} diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java index ca3886092cf1..09c8142105cc 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java @@ -148,6 +148,23 @@ public class PackageBackwardCompatibilityTest extends PackageSharedLibraryUpdate checkBackwardsCompatibility(before, ((ParsedPackage) after.hideAsParsed()).hideAsFinal()); } + /** + * Ensures that the {@link PackageBackwardCompatibility} uses a + * {@link ComGoogleAndroidMapsUpdater}. + */ + @Test + public void com_google_android_maps_in_usesLibraries() { + ParsedPackage before = ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.CUR_DEVELOPMENT) + .addUsesLibrary("com.google.android.maps") + .hideAsParsed()); + + ParsingPackage after = PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(Build.VERSION_CODES.CUR_DEVELOPMENT); + + checkBackwardsCompatibility(before, ((ParsedPackage) after.hideAsParsed()).hideAsFinal()); + } + private void checkBackwardsCompatibility(ParsedPackage before, AndroidPackage after) { checkBackwardsCompatibility(before, after, PackageBackwardCompatibility::getInstance); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java index 05604b2b9aeb..1debd8c9ffb1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java @@ -61,19 +61,20 @@ public class ActivityDisplayTests extends ActivityTestsBase { @Test public void testLastFocusedStackIsUpdatedWhenMovingStack() { // Create a stack at bottom. - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); + final TaskDisplayArea taskDisplayAreas = + mRootWindowContainer.getDefaultDisplay().getDefaultTaskDisplayArea(); final ActivityStack stack = new StackBuilder(mRootWindowContainer).setOnTop(!ON_TOP).build(); - final ActivityStack prevFocusedStack = display.getFocusedStack(); + final ActivityStack prevFocusedStack = taskDisplayAreas.getFocusedStack(); stack.moveToFront("moveStackToFront"); // After moving the stack to front, the previous focused should be the last focused. assertTrue(stack.isFocusedStackOnDisplay()); - assertEquals(prevFocusedStack, display.mTaskContainers.getLastFocusedStack()); + assertEquals(prevFocusedStack, taskDisplayAreas.getLastFocusedStack()); stack.moveToBack("moveStackToBack", null /* task */); // After moving the stack to back, the stack should be the last focused. - assertEquals(stack, display.mTaskContainers.getLastFocusedStack()); + assertEquals(stack, taskDisplayAreas.getLastFocusedStack()); } /** @@ -83,8 +84,8 @@ public class ActivityDisplayTests extends ActivityTestsBase { @Test public void testFullscreenStackCanBeFocusedWhenFocusablePinnedStackExists() { // Create a pinned stack and move to front. - final ActivityStack pinnedStack = mRootWindowContainer.getDefaultDisplay().createStack( - WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, ON_TOP); + final ActivityStack pinnedStack = mRootWindowContainer.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, ON_TOP); final Task pinnedTask = new TaskBuilder(mService.mStackSupervisor) .setStack(pinnedStack).build(); new ActivityBuilder(mService).setActivityFlags(FLAG_ALWAYS_FOCUSABLE) @@ -104,8 +105,8 @@ public class ActivityDisplayTests extends ActivityTestsBase { } /** - * Test {@link DisplayContent#mPreferredTopFocusableStack} will be cleared when the stack is - * removed or moved to back, and the focused stack will be according to z-order. + * Test {@link TaskDisplayArea#mPreferredTopFocusableStack} will be cleared when + * the stack is removed or moved to back, and the focused stack will be according to z-order. */ @Test public void testStackShouldNotBeFocusedAfterMovingToBackOrRemoving() { @@ -124,7 +125,7 @@ public class ActivityDisplayTests extends ActivityTestsBase { assertTrue(stack1.isFocusedStackOnDisplay()); // Stack2 should be focused after removing stack1. - display.removeStack(stack1); + stack1.getDisplayArea().removeStack(stack1); assertTrue(stack2.isFocusedStackOnDisplay()); } @@ -156,7 +157,7 @@ public class ActivityDisplayTests extends ActivityTestsBase { } private ActivityStack createFullscreenStackWithSimpleActivityAt(DisplayContent display) { - final ActivityStack fullscreenStack = display.createStack( + final ActivityStack fullscreenStack = display.getDefaultTaskDisplayArea().createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, ON_TOP); final Task fullscreenTask = new TaskBuilder(mService.mStackSupervisor) .setStack(fullscreenStack).build(); @@ -219,58 +220,56 @@ public class ActivityDisplayTests extends ActivityTestsBase { */ @Test public void testAlwaysOnTopStackLocation() { - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - final ActivityStack alwaysOnTopStack = display.createStack(WINDOWING_MODE_FREEFORM, + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + final ActivityStack alwaysOnTopStack = taskDisplayArea.createStack(WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityRecord activity = new ActivityBuilder(mService).setCreateTask(true) .setStack(alwaysOnTopStack).build(); alwaysOnTopStack.setAlwaysOnTop(true); - display.mTaskContainers.positionStackAtTop(alwaysOnTopStack, false /* includingParents */); + taskDisplayArea.positionStackAtTop(alwaysOnTopStack, false /* includingParents */); assertTrue(alwaysOnTopStack.isAlwaysOnTop()); // Ensure always on top state is synced to the children of the stack. assertTrue(alwaysOnTopStack.getTopNonFinishingActivity().isAlwaysOnTop()); - assertEquals(alwaysOnTopStack, display.getTopStack()); + assertEquals(alwaysOnTopStack, taskDisplayArea.getTopStack()); - final ActivityStack pinnedStack = display.createStack( + final ActivityStack pinnedStack = taskDisplayArea.createStack( WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */); - assertEquals(pinnedStack, display.getRootPinnedTask()); - assertEquals(pinnedStack, display.getTopStack()); + assertEquals(pinnedStack, taskDisplayArea.getRootPinnedTask()); + assertEquals(pinnedStack, taskDisplayArea.getTopStack()); - final ActivityStack anotherAlwaysOnTopStack = display.createStack( + final ActivityStack anotherAlwaysOnTopStack = taskDisplayArea.createStack( WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); anotherAlwaysOnTopStack.setAlwaysOnTop(true); - display.mTaskContainers.positionStackAtTop(anotherAlwaysOnTopStack, - false /* includingParents */); + taskDisplayArea.positionStackAtTop(anotherAlwaysOnTopStack, false /* includingParents */); assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop()); - int topPosition = display.getStackCount() - 1; + int topPosition = taskDisplayArea.getStackCount() - 1; // Ensure the new alwaysOnTop stack is put below the pinned stack, but on top of the // existing alwaysOnTop stack. - assertEquals(anotherAlwaysOnTopStack, display.getStackAt(topPosition - 1)); + assertEquals(anotherAlwaysOnTopStack, taskDisplayArea.getStackAt(topPosition - 1)); - final ActivityStack nonAlwaysOnTopStack = display.createStack( + final ActivityStack nonAlwaysOnTopStack = taskDisplayArea.createStack( WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); - assertEquals(display, nonAlwaysOnTopStack.getDisplay()); - topPosition = display.getStackCount() - 1; + assertEquals(taskDisplayArea, nonAlwaysOnTopStack.getDisplayArea()); + topPosition = taskDisplayArea.getStackCount() - 1; // Ensure the non-alwaysOnTop stack is put below the three alwaysOnTop stacks, but above the // existing other non-alwaysOnTop stacks. - assertEquals(nonAlwaysOnTopStack, display.getStackAt(topPosition - 3)); + assertEquals(nonAlwaysOnTopStack, taskDisplayArea.getStackAt(topPosition - 3)); anotherAlwaysOnTopStack.setAlwaysOnTop(false); - display.mTaskContainers.positionStackAtTop(anotherAlwaysOnTopStack, - false /* includingParents */); + taskDisplayArea.positionStackAtTop(anotherAlwaysOnTopStack, false /* includingParents */); assertFalse(anotherAlwaysOnTopStack.isAlwaysOnTop()); // Ensure, when always on top is turned off for a stack, the stack is put just below all // other always on top stacks. - assertEquals(anotherAlwaysOnTopStack, display.getStackAt(topPosition - 2)); + assertEquals(anotherAlwaysOnTopStack, taskDisplayArea.getStackAt(topPosition - 2)); anotherAlwaysOnTopStack.setAlwaysOnTop(true); // Ensure always on top state changes properly when windowing mode changes. anotherAlwaysOnTopStack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); assertFalse(anotherAlwaysOnTopStack.isAlwaysOnTop()); - assertEquals(anotherAlwaysOnTopStack, display.getStackAt(topPosition - 2)); + assertEquals(anotherAlwaysOnTopStack, taskDisplayArea.getStackAt(topPosition - 2)); anotherAlwaysOnTopStack.setWindowingMode(WINDOWING_MODE_FREEFORM); assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop()); - assertEquals(anotherAlwaysOnTopStack, display.getStackAt(topPosition - 1)); + assertEquals(anotherAlwaysOnTopStack, taskDisplayArea.getStackAt(topPosition - 1)); } @Test @@ -286,14 +285,14 @@ public class ActivityDisplayTests extends ActivityTestsBase { } private void removeStackTests(Runnable runnable) { - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - final ActivityStack stack1 = display.createStack(WINDOWING_MODE_FULLSCREEN, + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + final ActivityStack stack1 = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, ON_TOP); - final ActivityStack stack2 = display.createStack(WINDOWING_MODE_FULLSCREEN, + final ActivityStack stack2 = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, ON_TOP); - final ActivityStack stack3 = display.createStack(WINDOWING_MODE_FULLSCREEN, + final ActivityStack stack3 = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, ON_TOP); - final ActivityStack stack4 = display.createStack(WINDOWING_MODE_FULLSCREEN, + final ActivityStack stack4 = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, ON_TOP); final Task task1 = new TaskBuilder(mService.mStackSupervisor).setStack(stack1).build(); final Task task2 = new TaskBuilder(mService.mStackSupervisor).setStack(stack2).build(); @@ -302,13 +301,13 @@ public class ActivityDisplayTests extends ActivityTestsBase { // Reordering stacks while removing stacks. doAnswer(invocation -> { - display.mTaskContainers.positionStackAtTop(stack3, false); + taskDisplayArea.positionStackAtTop(stack3, false); return true; }).when(mSupervisor).removeTask(eq(task4), anyBoolean(), anyBoolean(), any()); // Removing stacks from the display while removing stacks. doAnswer(invocation -> { - display.removeStack(stack2); + taskDisplayArea.removeStack(stack2); return true; }).when(mSupervisor).removeTask(eq(task2), anyBoolean(), anyBoolean(), any()); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 747ae949c97e..08f6409cb902 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -82,6 +82,7 @@ import android.os.PersistableBundle; import android.platform.test.annotations.Presubmit; import android.util.MergedConfiguration; import android.util.MutableBoolean; +import android.view.DisplayInfo; import android.view.IRemoteAnimationFinishedCallback; import android.view.IRemoteAnimationRunner.Stub; import android.view.RemoteAnimationAdapter; @@ -399,6 +400,16 @@ public class ActivityRecordTests extends ActivityTestsBase { mStack.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM); final Rect stableRect = new Rect(); mStack.getDisplay().mDisplayContent.getStableRect(stableRect); + + // Carve out non-decor insets from stableRect + final Rect insets = new Rect(); + final DisplayInfo displayInfo = mStack.getDisplay().getDisplayInfo(); + final DisplayPolicy policy = mStack.getDisplay().getDisplayPolicy(); + policy.getNonDecorInsetsLw(displayInfo.rotation, displayInfo.logicalWidth, + displayInfo.logicalHeight, displayInfo.displayCutout, insets); + policy.convertNonDecorInsetsToStableInsets(insets, displayInfo.rotation); + Task.intersectWithInsetsIfFits(stableRect, stableRect, insets); + final boolean isScreenPortrait = stableRect.width() <= stableRect.height(); final Rect bounds = new Rect(stableRect); if (isScreenPortrait) { @@ -427,7 +438,17 @@ public class ActivityRecordTests extends ActivityTestsBase { public void ignoreRequestedOrientationInSplitWindows() { mStack.setWindowingMode(WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); final Rect stableRect = new Rect(); - mStack.getDisplay().mDisplayContent.getStableRect(stableRect); + mStack.getDisplay().getStableRect(stableRect); + + // Carve out non-decor insets from stableRect + final Rect insets = new Rect(); + final DisplayInfo displayInfo = mStack.getDisplay().getDisplayInfo(); + final DisplayPolicy policy = mStack.getDisplay().getDisplayPolicy(); + policy.getNonDecorInsetsLw(displayInfo.rotation, displayInfo.logicalWidth, + displayInfo.logicalHeight, displayInfo.displayCutout, insets); + policy.convertNonDecorInsetsToStableInsets(insets, displayInfo.rotation); + Task.intersectWithInsetsIfFits(stableRect, stableRect, insets); + final boolean isScreenPortrait = stableRect.width() <= stableRect.height(); final Rect bounds = new Rect(stableRect); if (isScreenPortrait) { @@ -1379,8 +1400,8 @@ public class ActivityRecordTests extends ActivityTestsBase { display = new TestDisplayContent.Builder(mService, 2000, 1000).setDensityDpi(300) .setPosition(DisplayContent.POSITION_TOP).build(); } - final ActivityStack stack = display.createStack(WINDOWING_MODE_UNDEFINED, - ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack stack = display.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */); final Task task = new TaskBuilder(mSupervisor).setStack(stack).build(); return new ActivityBuilder(mService).setTask(task).setUseProcess(process).build(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java index e8c0362c9f32..22d7fcbb4162 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java @@ -60,7 +60,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - mFullscreenStack = mRootWindowContainer.getDefaultDisplay().createStack( + mFullscreenStack = mRootWindowContainer.getDefaultTaskDisplayArea().createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index af5afff4bed1..3d15401cdfb9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -82,15 +82,15 @@ import org.junit.runner.RunWith; @Presubmit @RunWith(WindowTestRunner.class) public class ActivityStackTests extends ActivityTestsBase { - private DisplayContent mDefaultDisplay; + private TaskDisplayArea mDefaultTaskDisplayArea; private ActivityStack mStack; private Task mTask; @Before public void setUp() throws Exception { - mDefaultDisplay = mRootWindowContainer.getDefaultDisplay(); - mStack = mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, - true /* onTop */); + mDefaultTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + mStack = mDefaultTaskDisplayArea.createStack(WINDOWING_MODE_UNDEFINED, + ACTIVITY_TYPE_STANDARD, true /* onTop */); spyOn(mStack); mTask = new TaskBuilder(mSupervisor).setStack(mStack).build(); } @@ -112,7 +112,7 @@ public class ActivityStackTests extends ActivityTestsBase { r.setState(RESUMED, "testResumedActivityFromTaskReparenting"); assertEquals(r, mStack.getResumedActivity()); - final ActivityStack destStack = mRootWindowContainer.getDefaultDisplay().createStack( + final ActivityStack destStack = mDefaultTaskDisplayArea.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); mTask.reparent(destStack, true /* toTop */, Task.REPARENT_KEEP_STACK_AT_FRONT, @@ -130,7 +130,7 @@ public class ActivityStackTests extends ActivityTestsBase { r.setState(RESUMED, "testResumedActivityFromActivityReparenting"); assertEquals(r, mStack.getResumedActivity()); - final ActivityStack destStack = mRootWindowContainer.getDefaultDisplay().createStack( + final ActivityStack destStack = mDefaultTaskDisplayArea.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); mTask.reparent(destStack, true /*toTop*/, REPARENT_MOVE_STACK_TO_FRONT, false, false, "testResumedActivityFromActivityReparenting"); @@ -143,7 +143,7 @@ public class ActivityStackTests extends ActivityTestsBase { public void testPrimarySplitScreenRestoresWhenMovedToBack() { // Create primary splitscreen stack. This will create secondary stacks and places the // existing fullscreen stack on the bottom. - final ActivityStack primarySplitScreen = mDefaultDisplay.createStack( + final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack( WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Assert windowing mode. @@ -154,7 +154,7 @@ public class ActivityStackTests extends ActivityTestsBase { null /* task */); // Assert that stack is at the bottom. - assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen)); + assertEquals(0, mDefaultTaskDisplayArea.getIndexOf(primarySplitScreen)); // Ensure no longer in splitscreen. assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode()); @@ -167,7 +167,7 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testPrimarySplitScreenRestoresPreviousWhenMovedToBack() { // This time, start with a fullscreen activitystack - final ActivityStack primarySplitScreen = mDefaultDisplay.createStack( + final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); primarySplitScreen.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); @@ -180,7 +180,7 @@ public class ActivityStackTests extends ActivityTestsBase { null /* task */); // Assert that stack is at the bottom. - assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen)); + assertEquals(0, mDefaultTaskDisplayArea.getIndexOf(primarySplitScreen)); // Ensure that the override mode is restored to what it was (fullscreen) assertEquals(WINDOWING_MODE_FULLSCREEN, @@ -189,14 +189,14 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testStackInheritsDisplayWindowingMode() { - final ActivityStack primarySplitScreen = mDefaultDisplay.createStack( + final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack( WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */); assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode()); assertEquals(WINDOWING_MODE_UNDEFINED, primarySplitScreen.getRequestedOverrideWindowingMode()); - mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM); + mDefaultTaskDisplayArea.setWindowingMode(WINDOWING_MODE_FREEFORM); assertEquals(WINDOWING_MODE_FREEFORM, primarySplitScreen.getWindowingMode()); assertEquals(WINDOWING_MODE_UNDEFINED, primarySplitScreen.getRequestedOverrideWindowingMode()); @@ -204,7 +204,7 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testStackOverridesDisplayWindowingMode() { - final ActivityStack primarySplitScreen = mDefaultDisplay.createStack( + final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack( WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */); assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode()); @@ -216,7 +216,7 @@ public class ActivityStackTests extends ActivityTestsBase { assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getRequestedOverrideWindowingMode()); - mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM); + mDefaultTaskDisplayArea.setWindowingMode(WINDOWING_MODE_FREEFORM); assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode()); } @@ -283,10 +283,11 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testMoveStackToBackIncludingParent() { - final DisplayContent display = addNewDisplayContentAt(DisplayContent.POSITION_TOP); - final ActivityStack stack1 = createStackForShouldBeVisibleTest(display, + final TaskDisplayArea taskDisplayArea = addNewDisplayContentAt(DisplayContent.POSITION_TOP) + .getDefaultTaskDisplayArea(); + final ActivityStack stack1 = createStackForShouldBeVisibleTest(taskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - final ActivityStack stack2 = createStackForShouldBeVisibleTest(display, + final ActivityStack stack2 = createStackForShouldBeVisibleTest(taskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Do not move display to back because there is still another stack. @@ -294,16 +295,16 @@ public class ActivityStackTests extends ActivityTestsBase { verify(stack2).positionChildAtBottom(any(), eq(false) /* includingParents */); // Also move display to back because there is only one stack left. - display.removeStack(stack1); + taskDisplayArea.removeStack(stack1); stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.getTopMostTask()); verify(stack2).positionChildAtBottom(any(), eq(true) /* includingParents */); } @Test public void testShouldBeVisible_Fullscreen() { - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); - final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Add an activity to the pinned stack so it isn't considered empty for visibility check. final ActivityRecord pinnedActivity = new ActivityBuilder(mService) @@ -314,8 +315,9 @@ public class ActivityStackTests extends ActivityTestsBase { assertTrue(homeStack.shouldBeVisible(null /* starting */)); assertTrue(pinnedStack.shouldBeVisible(null /* starting */)); - final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay, - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest( + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + true /* onTop */); // Home stack shouldn't be visible behind an opaque fullscreen stack, but pinned stack // should be visible since it is always on-top. doReturn(false).when(fullscreenStack).isTranslucent(any()); @@ -331,15 +333,15 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testShouldBeVisible_SplitScreen() { - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); // Home stack should always be fullscreen for this test. doReturn(false).when(homeStack).supportsSplitScreenWindowingMode(); final ActivityStack splitScreenPrimary = - createStackForShouldBeVisibleTest(mDefaultDisplay, + createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack splitScreenSecondary = - createStackForShouldBeVisibleTest(mDefaultDisplay, + createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Home stack shouldn't be visible if both halves of split-screen are opaque. @@ -367,7 +369,7 @@ public class ActivityStackTests extends ActivityTestsBase { splitScreenSecondary.getVisibility(null /* starting */)); final ActivityStack splitScreenSecondary2 = - createStackForShouldBeVisibleTest(mDefaultDisplay, + createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); // First split-screen secondary shouldn't be visible behind another opaque split-split // secondary. @@ -389,8 +391,9 @@ public class ActivityStackTests extends ActivityTestsBase { assertEquals(STACK_VISIBILITY_VISIBLE, splitScreenSecondary2.getVisibility(null /* starting */)); - final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay, - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */); + final ActivityStack assistantStack = createStackForShouldBeVisibleTest( + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, + true /* onTop */); // Split-screen stacks shouldn't be visible behind an opaque fullscreen stack. doReturn(false).when(assistantStack).isTranslucent(any()); @@ -530,7 +533,7 @@ public class ActivityStackTests extends ActivityTestsBase { final ActivityStack translucentStack = createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN, true /* translucent */); - final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */); assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT, @@ -547,7 +550,7 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testShouldBeVisible_Finishing() { - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); ActivityRecord topRunningHomeActivity = homeStack.topRunningActivity(); if (topRunningHomeActivity == null) { @@ -558,7 +561,7 @@ public class ActivityStackTests extends ActivityTestsBase { } final ActivityStack translucentStack = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); doReturn(true).when(translucentStack).isTranslucent(any()); @@ -580,7 +583,7 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testShouldBeVisible_FullscreenBehindTranslucentInHomeStack() { - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); final ActivityRecord firstActivity = new ActivityBuilder(mService) @@ -601,74 +604,77 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindFullscreen() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); - final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay, - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest( + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + true /* onTop */); doReturn(false).when(homeStack).isTranslucent(any()); doReturn(false).when(fullscreenStack).isTranslucent(any()); // Ensure that we don't move the home stack if it is already behind the top fullscreen stack - int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack); + int homeStackIndex = mDefaultTaskDisplayArea.getIndexOf(homeStack); assertEquals(fullscreenStack, getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(homeStack); - assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack)); + mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(homeStack); + assertEquals(homeStackIndex, mDefaultTaskDisplayArea.getIndexOf(homeStack)); } @Test public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindTranslucent() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); - final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest( + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); doReturn(false).when(homeStack).isTranslucent(any()); doReturn(true).when(fullscreenStack).isTranslucent(any()); // Ensure that we don't move the home stack if it is already behind the top fullscreen stack - int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack); + int homeStackIndex = mDefaultTaskDisplayArea.getIndexOf(homeStack); assertEquals(fullscreenStack, getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(homeStack); - assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack)); + mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(homeStack); + assertEquals(homeStackIndex, mDefaultTaskDisplayArea.getIndexOf(homeStack)); } @Test public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeOnTop() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); - final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay, - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest( + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + true /* onTop */); + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); doReturn(false).when(homeStack).isTranslucent(any()); doReturn(false).when(fullscreenStack).isTranslucent(any()); // Ensure we don't move the home stack if it is already on top - int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack); + int homeStackIndex = mDefaultTaskDisplayArea.getIndexOf(homeStack); assertNull(getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(homeStack); - assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack)); + mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(homeStack); + assertEquals(homeStackIndex, mDefaultTaskDisplayArea.getIndexOf(homeStack)); } @Test public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreen() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */); doReturn(false).when(homeStack).isTranslucent(any()); @@ -678,22 +684,22 @@ public class ActivityStackTests extends ActivityTestsBase { // Ensure that we move the home stack behind the bottom most fullscreen stack, ignoring the // pinned stack assertEquals(fullscreenStack1, getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(homeStack); + mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(homeStack); assertEquals(fullscreenStack2, getStackAbove(homeStack)); } @Test public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); doReturn(false).when(homeStack).isTranslucent(any()); @@ -703,21 +709,21 @@ public class ActivityStackTests extends ActivityTestsBase { // Ensure that we move the home stack behind the bottom most non-translucent fullscreen // stack assertEquals(fullscreenStack1, getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindBottomMostVisibleStack(homeStack); + mDefaultTaskDisplayArea.moveStackBehindBottomMostVisibleStack(homeStack); assertEquals(fullscreenStack1, getStackAbove(homeStack)); } @Test public void testMoveHomeStackBehindStack_BehindHomeStack() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); doReturn(false).when(homeStack).isTranslucent(any()); @@ -725,50 +731,50 @@ public class ActivityStackTests extends ActivityTestsBase { doReturn(false).when(fullscreenStack2).isTranslucent(any()); // Ensure we don't move the home stack behind itself - int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack); - mDefaultDisplay.mTaskContainers.moveStackBehindStack(homeStack, homeStack); - assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack)); + int homeStackIndex = mDefaultTaskDisplayArea.getIndexOf(homeStack); + mDefaultTaskDisplayArea.moveStackBehindStack(homeStack, homeStack); + assertEquals(homeStackIndex, mDefaultTaskDisplayArea.getIndexOf(homeStack)); } @Test public void testMoveHomeStackBehindStack() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack fullscreenStack3 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack fullscreenStack4 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); - mDefaultDisplay.mTaskContainers.moveStackBehindStack(homeStack, fullscreenStack1); + mDefaultTaskDisplayArea.moveStackBehindStack(homeStack, fullscreenStack1); assertEquals(fullscreenStack1, getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindStack(homeStack, fullscreenStack2); + mDefaultTaskDisplayArea.moveStackBehindStack(homeStack, fullscreenStack2); assertEquals(fullscreenStack2, getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindStack(homeStack, fullscreenStack4); + mDefaultTaskDisplayArea.moveStackBehindStack(homeStack, fullscreenStack4); assertEquals(fullscreenStack4, getStackAbove(homeStack)); - mDefaultDisplay.mTaskContainers.moveStackBehindStack(homeStack, fullscreenStack2); + mDefaultTaskDisplayArea.moveStackBehindStack(homeStack, fullscreenStack2); assertEquals(fullscreenStack2, getStackAbove(homeStack)); } @Test public void testSetAlwaysOnTop() { - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); - final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */); assertEquals(pinnedStack, getStackAbove(homeStack)); final ActivityStack alwaysOnTopStack = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); alwaysOnTopStack.setAlwaysOnTop(true); assertTrue(alwaysOnTopStack.isAlwaysOnTop()); @@ -776,13 +782,13 @@ public class ActivityStackTests extends ActivityTestsBase { assertEquals(pinnedStack, getStackAbove(alwaysOnTopStack)); final ActivityStack nonAlwaysOnTopStack = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Ensure non always on top stack is put below always on top stacks. assertEquals(alwaysOnTopStack, getStackAbove(nonAlwaysOnTopStack)); final ActivityStack alwaysOnTopStack2 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */); alwaysOnTopStack2.setAlwaysOnTop(true); assertTrue(alwaysOnTopStack2.isAlwaysOnTop()); @@ -807,13 +813,14 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testSplitScreenMoveToFront() { final ActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, - true /* onTop */); + mDefaultTaskDisplayArea, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, + ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, + ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack assistantStack = createStackForShouldBeVisibleTest( + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */); - final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay, - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */); doReturn(false).when(splitScreenPrimary).isTranslucent(any()); doReturn(false).when(splitScreenSecondary).isTranslucent(any()); @@ -832,7 +839,7 @@ public class ActivityStackTests extends ActivityTestsBase { private ActivityStack createStandardStackForVisibilityTest(int windowingMode, boolean translucent) { - final ActivityStack stack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack stack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, windowingMode, ACTIVITY_TYPE_STANDARD, true /* onTop */); doReturn(translucent).when(stack).isTranslucent(any()); return stack; @@ -840,20 +847,20 @@ public class ActivityStackTests extends ActivityTestsBase { @SuppressWarnings("TypeParameterUnusedInFormals") private ActivityStack createStackForShouldBeVisibleTest( - DisplayContent display, int windowingMode, int activityType, boolean onTop) { + TaskDisplayArea taskDisplayArea, int windowingMode, int activityType, boolean onTop) { final ActivityStack stack; if (activityType == ACTIVITY_TYPE_HOME) { // Home stack and activity are created in ActivityTestsBase#setupActivityManagerService - stack = mDefaultDisplay.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME); + stack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME); if (onTop) { - mDefaultDisplay.mTaskContainers.positionStackAtTop(stack, + mDefaultTaskDisplayArea.positionStackAtTop(stack, false /* includingParents */); } else { - mDefaultDisplay.mTaskContainers.positionStackAtBottom(stack); + mDefaultTaskDisplayArea.positionStackAtBottom(stack); } } else { stack = new StackBuilder(mRootWindowContainer) - .setDisplay(display) + .setTaskDisplayArea(taskDisplayArea) .setWindowingMode(windowingMode) .setActivityType(activityType) .setOnTop(onTop) @@ -1005,7 +1012,7 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testWontFinishHomeStackImmediately() { - final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay, + final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */); ActivityRecord activity = homeStack.topRunningActivity(); @@ -1025,9 +1032,11 @@ public class ActivityStackTests extends ActivityTestsBase { public void testFinishCurrentActivity() { // Create 2 activities on a new display. final DisplayContent display = addNewDisplayContentAt(DisplayContent.POSITION_TOP); - final ActivityStack stack1 = createStackForShouldBeVisibleTest(display, + final ActivityStack stack1 = createStackForShouldBeVisibleTest( + display.getDefaultTaskDisplayArea(), WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - final ActivityStack stack2 = createStackForShouldBeVisibleTest(display, + final ActivityStack stack2 = createStackForShouldBeVisibleTest( + display.getDefaultTaskDisplayArea(), WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); // There is still an activity1 in stack1 so the activity2 should be added to finishing list @@ -1075,26 +1084,26 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testStackOrderChangedOnRemoveStack() { StackOrderChangedListener listener = new StackOrderChangedListener(); - mDefaultDisplay.registerStackOrderChangedListener(listener); + mDefaultTaskDisplayArea.registerStackOrderChangedListener(listener); try { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); } finally { - mDefaultDisplay.unregisterStackOrderChangedListener(listener); + mDefaultTaskDisplayArea.unregisterStackOrderChangedListener(listener); } assertTrue(listener.mChanged); } @Test public void testStackOrderChangedOnAddPositionStack() { - mDefaultDisplay.removeStack(mStack); + mDefaultTaskDisplayArea.removeStack(mStack); StackOrderChangedListener listener = new StackOrderChangedListener(); - mDefaultDisplay.registerStackOrderChangedListener(listener); + mDefaultTaskDisplayArea.registerStackOrderChangedListener(listener); try { mStack.mReparenting = true; - mDefaultDisplay.mTaskContainers.addStack(mStack, 0); + mDefaultTaskDisplayArea.addStack(mStack, 0); } finally { - mDefaultDisplay.unregisterStackOrderChangedListener(listener); + mDefaultTaskDisplayArea.unregisterStackOrderChangedListener(listener); } assertTrue(listener.mChanged); } @@ -1104,12 +1113,12 @@ public class ActivityStackTests extends ActivityTestsBase { StackOrderChangedListener listener = new StackOrderChangedListener(); try { final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest( - mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); - mDefaultDisplay.registerStackOrderChangedListener(listener); - mDefaultDisplay.mTaskContainers.positionStackAtBottom(fullscreenStack1); + mDefaultTaskDisplayArea.registerStackOrderChangedListener(listener); + mDefaultTaskDisplayArea.positionStackAtBottom(fullscreenStack1); } finally { - mDefaultDisplay.unregisterStackOrderChangedListener(listener); + mDefaultTaskDisplayArea.unregisterStackOrderChangedListener(listener); } assertTrue(listener.mChanged); } @@ -1189,7 +1198,7 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testClearUnknownAppVisibilityBehindFullscreenActivity() { final UnknownAppVisibilityController unknownAppVisibilityController = - mDefaultDisplay.mDisplayContent.mUnknownAppVisibilityController; + mDefaultTaskDisplayArea.mDisplayContent.mUnknownAppVisibilityController; final KeyguardController keyguardController = mSupervisor.getKeyguardController(); doReturn(true).when(keyguardController).isKeyguardLocked(); @@ -1254,7 +1263,7 @@ public class ActivityStackTests extends ActivityTestsBase { } private static class StackOrderChangedListener - implements DisplayContent.OnStackOrderChangedListener { + implements TaskDisplayArea.OnStackOrderChangedListener { public boolean mChanged = false; @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java index 76a761ce0e10..27782f5b3683 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java @@ -77,8 +77,8 @@ public class ActivityStartControllerTests extends ActivityTestsBase { .setCreateTask(true) .build(); final int startFlags = random.nextInt(); - final ActivityStack stack = mService.mRootWindowContainer.getDefaultDisplay().createStack( - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack stack = mService.mRootWindowContainer.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final WindowProcessController wpc = new WindowProcessController(mService, mService.mContext.getApplicationInfo(), "name", 12345, UserHandle.getUserId(12345), mock(Object.class), diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 1d952bfcef2a..bdba4b6c8ac8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -326,8 +326,9 @@ public class ActivityStarterTests extends ActivityTestsBase { if (mockGetLaunchStack) { // Instrument the stack and task used. - final ActivityStack stack = mRootWindowContainer.getDefaultDisplay().createStack( - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack stack = mRootWindowContainer.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, + true /* onTop */); // Direct starter to use spy stack. doReturn(stack).when(mRootWindowContainer) @@ -494,9 +495,12 @@ public class ActivityStarterTests extends ActivityTestsBase { } private void assertNoTasks(DisplayContent display) { - for (int i = display.getStackCount() - 1; i >= 0; --i) { - final ActivityStack stack = display.getStackAt(i); - assertFalse(stack.hasChild()); + for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + assertFalse(stack.hasChild()); + } } } @@ -742,7 +746,7 @@ public class ActivityStarterTests extends ActivityTestsBase { final TestDisplayContent secondaryDisplay = new TestDisplayContent.Builder(mService, 1000, 1500) .setPosition(POSITION_BOTTOM).build(); - final TaskDisplayArea secondaryTaskContainer = secondaryDisplay.mTaskContainers; + final TaskDisplayArea secondaryTaskContainer = secondaryDisplay.getDefaultTaskDisplayArea(); final ActivityStack stack = secondaryTaskContainer.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); @@ -783,7 +787,7 @@ public class ActivityStarterTests extends ActivityTestsBase { new TestDisplayContent.Builder(mService, 1000, 1500).build(); mRootWindowContainer.positionChildAt(POSITION_TOP, secondaryDisplay, false /* includingParents */); - final TaskDisplayArea secondaryTaskContainer = secondaryDisplay.mTaskContainers; + final TaskDisplayArea secondaryTaskContainer = secondaryDisplay.getDefaultTaskDisplayArea(); final ActivityRecord singleTaskActivity = createSingleTaskActivityOn( secondaryTaskContainer.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */)); @@ -835,7 +839,7 @@ public class ActivityStarterTests extends ActivityTestsBase { // Create a secondary display at bottom. final TestDisplayContent secondaryDisplay = addNewDisplayContentAt(POSITION_BOTTOM); - final TaskDisplayArea secondaryTaskContainer = secondaryDisplay.mTaskContainers; + final TaskDisplayArea secondaryTaskContainer = secondaryDisplay.getDefaultTaskDisplayArea(); secondaryTaskContainer.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); @@ -951,7 +955,7 @@ public class ActivityStarterTests extends ActivityTestsBase { final ActivityStarter starter = prepareStarter(0 /* flags */); starter.mStartActivity = new ActivityBuilder(mService).build(); final Task task = new TaskBuilder(mService.mStackSupervisor) - .setStack(mService.mRootWindowContainer.getDefaultDisplay().createStack( + .setStack(mService.mRootWindowContainer.getDefaultTaskDisplayArea().createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */)) .setUserId(10) .build(); @@ -1041,10 +1045,14 @@ public class ActivityStarterTests extends ActivityTestsBase { // move everything to secondary because test expects this but usually sysui // does it. DisplayContent dc = mService.mRootWindowContainer.getDisplayContent(mDisplayId); - for (int i = dc.getStackCount() - 1; i >= 0; --i) { - if (!WindowConfiguration.isSplitScreenWindowingMode( - dc.getStackAt(i).getWindowingMode())) { - dc.getStackAt(i).reparent(mSecondary, POSITION_BOTTOM); + for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); + if (!WindowConfiguration.isSplitScreenWindowingMode( + stack.getWindowingMode())) { + stack.reparent(mSecondary, POSITION_BOTTOM); + } } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 9240b2222cd6..67d4769522b0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -372,7 +372,7 @@ class ActivityTestsBase extends SystemServiceTestsBase { Task build() { if (mStack == null && mCreateStack) { - mStack = mSupervisor.mRootWindowContainer.getDefaultDisplay().createStack( + mStack = mSupervisor.mRootWindowContainer.getDefaultTaskDisplayArea().createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); spyOn(mStack); } @@ -408,6 +408,7 @@ class ActivityTestsBase extends SystemServiceTestsBase { static class StackBuilder { private final RootWindowContainer mRootWindowContainer; private DisplayContent mDisplay; + private TaskDisplayArea mTaskDisplayArea; private int mStackId = -1; private int mWindowingMode = WINDOWING_MODE_UNDEFINED; private int mActivityType = ACTIVITY_TYPE_STANDARD; @@ -419,6 +420,7 @@ class ActivityTestsBase extends SystemServiceTestsBase { StackBuilder(RootWindowContainer root) { mRootWindowContainer = root; mDisplay = mRootWindowContainer.getDefaultDisplay(); + mTaskDisplayArea = mDisplay.getDefaultTaskDisplayArea(); } StackBuilder setWindowingMode(int windowingMode) { @@ -436,8 +438,20 @@ class ActivityTestsBase extends SystemServiceTestsBase { return this; } + /** + * Set the parent {@link DisplayContent} and use the default task display area. Overrides + * the task display area, if was set before. + */ StackBuilder setDisplay(DisplayContent display) { mDisplay = display; + mTaskDisplayArea = mDisplay.getDefaultTaskDisplayArea(); + return this; + } + + /** Set the parent {@link TaskDisplayArea}. Overrides the display, if was set before. */ + StackBuilder setTaskDisplayArea(TaskDisplayArea taskDisplayArea) { + mTaskDisplayArea = taskDisplayArea; + mDisplay = mTaskDisplayArea.mDisplayContent; return this; } @@ -462,9 +476,8 @@ class ActivityTestsBase extends SystemServiceTestsBase { } ActivityStack build() { - final int stackId = mStackId >= 0 ? mStackId - : mDisplay.mTaskContainers.getNextStackId(); - final ActivityStack stack = mDisplay.mTaskContainers.createStackUnchecked( + final int stackId = mStackId >= 0 ? mStackId : mTaskDisplayArea.getNextStackId(); + final ActivityStack stack = mTaskDisplayArea.createStackUnchecked( mWindowingMode, mActivityType, stackId, mOnTop, mInfo, mIntent, false /* createdByOrganizer */); final ActivityStackSupervisor supervisor = mRootWindowContainer.mStackSupervisor; diff --git a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java index 4cb50c7a9e4d..9b7ffd69da15 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java @@ -147,7 +147,7 @@ public class AppChangeTransitionTests extends WindowTestsBase { // Reparenting to a display with different windowing mode may trigger // a change transition internally, but it should be cleaned-up once // the display change is complete. - mStack.reparent(mDisplayContent, true); + mStack.reparent(mDisplayContent.getDefaultTaskDisplayArea(), true); assertEquals(WINDOWING_MODE_FULLSCREEN, mTask.getWindowingMode()); diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java index 8b91c7e5d5f3..8c8fd0516623 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java @@ -169,7 +169,7 @@ public class AppTransitionTests extends WindowTestsBase { assertTrue(dc1.mOpeningApps.size() > 0); // Move stack to another display. - stack1.reparent(dc2, true); + stack1.reparent(dc2.getDefaultTaskDisplayArea(), true); // Verify if token are cleared from both pending transition list in former display. assertFalse(dc1.mOpeningApps.contains(activity1)); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 38b3d76b447d..a901d1ebd890 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -281,7 +281,7 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(dc, activity.getDisplayContent()); // Move stack to first display. - mDisplayContent.moveStackToDisplay(stack, true /* onTop */); + stack.reparent(mDisplayContent.getDefaultTaskDisplayArea(), true /* onTop */); assertEquals(mDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId()); assertEquals(mDisplayContent, stack.getDisplayContent()); assertEquals(mDisplayContent, task.getDisplayContent()); @@ -753,7 +753,7 @@ public class DisplayContentTests extends WindowTestsBase { doReturn(true).when(freeformStack).isVisible(); freeformStack.getTopChild().setBounds(100, 100, 300, 400); - assertTrue(dc.isStackVisible(WINDOWING_MODE_FREEFORM)); + assertTrue(dc.getDefaultTaskDisplayArea().isStackVisible(WINDOWING_MODE_FREEFORM)); freeformStack.getTopNonFinishingActivity().setOrientation(SCREEN_ORIENTATION_LANDSCAPE); stack.getTopNonFinishingActivity().setOrientation(SCREEN_ORIENTATION_PORTRAIT); @@ -1096,8 +1096,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testGetOrCreateRootHomeTask_defaultDisplay() { - DisplayContent defaultDisplay = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY); - TaskDisplayArea defaultTaskDisplayArea = defaultDisplay.mTaskContainers; + TaskDisplayArea defaultTaskDisplayArea = mWm.mRoot.getDefaultTaskDisplayArea(); // Remove the current home stack if it exists so a new one can be created below. ActivityStack homeTask = defaultTaskDisplayArea.getRootHomeTask(); @@ -1116,7 +1115,7 @@ public class DisplayContentTests extends WindowTestsBase { doReturn(false).when(display).isUntrustedVirtualDisplay(); // Remove the current home stack if it exists so a new one can be created below. - TaskDisplayArea taskDisplayArea = display.mTaskContainers; + TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea(); ActivityStack homeTask = taskDisplayArea.getRootHomeTask(); if (homeTask != null) { taskDisplayArea.removeChild(homeTask); @@ -1129,7 +1128,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testGetOrCreateRootHomeTask_unsupportedSystemDecorations() { DisplayContent display = createNewDisplay(); - TaskDisplayArea taskDisplayArea = display.mTaskContainers; + TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea(); doReturn(false).when(display).supportsSystemDecorations(); assertNull(taskDisplayArea.getRootHomeTask()); @@ -1139,7 +1138,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testGetOrCreateRootHomeTask_untrustedVirtualDisplay() { DisplayContent display = createNewDisplay(); - TaskDisplayArea taskDisplayArea = display.mTaskContainers; + TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea(); doReturn(true).when(display).isUntrustedVirtualDisplay(); assertNull(taskDisplayArea.getRootHomeTask()); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java index cf7411e67135..9b2a2db5d3a8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java @@ -860,6 +860,8 @@ public class DisplayRotationTests { mMockDisplayContent.isDefaultDisplay = mIsDefaultDisplay; when(mMockDisplayContent.calculateDisplayCutoutForRotation(anyInt())) .thenReturn(WmDisplayCutout.NO_CUTOUT); + when(mMockDisplayContent.getDefaultTaskDisplayArea()) + .thenReturn(mock(TaskDisplayArea.class)); mMockDisplayPolicy = mock(DisplayPolicy.class); diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java index ae467c0c811d..6a71a7dd24dd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java @@ -114,8 +114,8 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase { when(mRootWindowContainer.getDisplayContent(eq(mDisplayUniqueId))) .thenReturn(mTestDisplay); - ActivityStack stack = mTestDisplay.createStack(TEST_WINDOWING_MODE, - ACTIVITY_TYPE_STANDARD, /* onTop */ true); + ActivityStack stack = mTestDisplay.getDefaultTaskDisplayArea() + .createStack(TEST_WINDOWING_MODE, ACTIVITY_TYPE_STANDARD, /* onTop */ true); mTestTask = new TaskBuilder(mSupervisor).setComponent(TEST_COMPONENT).setStack(stack) .build(); mTestTask.mUserId = TEST_USER_ID; @@ -337,8 +337,8 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase { public void testClearsRecordsOfTheUserOnUserCleanUp() { mTarget.saveTask(mTestTask); - ActivityStack stack = mTestDisplay.createStack(TEST_WINDOWING_MODE, - ACTIVITY_TYPE_STANDARD, /* onTop */ true); + ActivityStack stack = mTestDisplay.getDefaultTaskDisplayArea().createStack( + TEST_WINDOWING_MODE, ACTIVITY_TYPE_STANDARD, /* onTop */ true); final Task anotherTaskOfTheSameUser = new TaskBuilder(mSupervisor) .setComponent(ALTERNATIVE_COMPONENT) .setUserId(TEST_USER_ID) @@ -349,7 +349,7 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase { anotherTaskOfTheSameUser.setHasBeenVisible(true); mTarget.saveTask(anotherTaskOfTheSameUser); - stack = mTestDisplay.createStack(TEST_WINDOWING_MODE, + stack = mTestDisplay.getDefaultTaskDisplayArea().createStack(TEST_WINDOWING_MODE, ACTIVITY_TYPE_STANDARD, /* onTop */ true); final Task anotherTaskOfDifferentUser = new TaskBuilder(mSupervisor) .setComponent(TEST_COMPONENT) diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 071386fa9cbd..add4e9cf3948 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -28,7 +28,6 @@ import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; -import static android.view.Display.DEFAULT_DISPLAY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -119,7 +118,7 @@ public class RecentTasksTest extends ActivityTestsBase { public void setUp() throws Exception { mTaskPersister = new TestTaskPersister(mContext.getFilesDir()); spyOn(mTaskPersister); - mTaskContainer = mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY).mTaskContainers; + mTaskContainer = mRootWindowContainer.getDefaultTaskDisplayArea(); // Set the recent tasks we should use for testing in this class. mRecentTasks = new TestRecentTasks(mService, mTaskPersister); @@ -687,8 +686,8 @@ public class RecentTasksTest extends ActivityTestsBase { mRecentTasks.setOnlyTestVisibleRange(); mRecentTasks.setParameters(-1 /* min */, 3 /* max */, -1 /* ms */); - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - final Task alwaysOnTopTask = display.createStack(WINDOWING_MODE_MULTI_WINDOW, + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + final Task alwaysOnTopTask = taskDisplayArea.createStack(WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, true /* onTop */); alwaysOnTopTask.setAlwaysOnTop(true); @@ -863,8 +862,8 @@ public class RecentTasksTest extends ActivityTestsBase { final ActivityStack homeStack = mTaskContainer.getRootHomeTask(); final DisplayContent otherDisplay = addNewDisplayContentAt(DisplayContent.POSITION_TOP); - final ActivityStack otherDisplayStack = otherDisplay.createStack( - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack otherDisplayStack = otherDisplay.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Add a number of tasks (beyond the max) on each display, ensure that the tasks are not // removed diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java index da07baca3ce1..6d2b7b1e86fe 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -105,7 +105,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { mDefaultDisplay = mWm.mRoot.getDefaultDisplay(); mController = spy(new RecentsAnimationController(mWm, mMockRunner, mAnimationCallbacks, DEFAULT_DISPLAY)); - mRootHomeTask = mDefaultDisplay.getRootHomeTask(); + mRootHomeTask = mDefaultDisplay.getDefaultTaskDisplayArea().getRootHomeTask(); assertNotNull(mRootHomeTask); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java index 6810f6442c66..881561f5750b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -88,7 +88,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { @Test public void testRecentsActivityVisiblility() { - TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultDisplay().mTaskContainers; + TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); ActivityStack recentsStack = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_RECENTS, true /* onTop */); ActivityRecord recentActivity = new ActivityBuilder(mService) @@ -116,8 +116,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { @Test public void testPreloadRecentsActivity() { - TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer.getDefaultDisplay() - .mTaskContainers; + TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); final ActivityStack homeStack = defaultTaskDisplayArea.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME); defaultTaskDisplayArea.positionStackAtTop(homeStack, false /* includingParents */); @@ -178,8 +177,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { @Test public void testRestartRecentsActivity() throws Exception { // Have a recents activity that is not attached to its process (ActivityRecord.app = null). - TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer.getDefaultDisplay() - .mTaskContainers; + TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); ActivityStack recentsStack = defaultTaskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_RECENTS, true /* onTop */); ActivityRecord recentActivity = new ActivityBuilder(mService).setComponent( @@ -208,7 +206,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { @Test public void testSetLaunchTaskBehindOfTargetActivity() { - TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultDisplay().mTaskContainers; + TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); ActivityStack homeStack = taskDisplayArea.getRootHomeTask(); // Assume the home activity support recents. ActivityRecord targetActivity = homeStack.getTopNonFinishingActivity(); @@ -253,7 +251,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { @Test public void testCancelAnimationOnVisibleStackOrderChange() { - TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultDisplay().mTaskContainers; + TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); ActivityStack fullscreenStack = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); new ActivityBuilder(mService) @@ -298,7 +296,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { @Test public void testKeepAnimationOnHiddenStackOrderChange() { - TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultDisplay().mTaskContainers; + TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); ActivityStack fullscreenStack = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); new ActivityBuilder(mService) @@ -334,7 +332,8 @@ public class RecentsAnimationTest extends ActivityTestsBase { @Test public void testMultipleUserHomeActivity_findUserHomeTask() { - TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultDisplay().mTaskContainers; + TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultDisplay() + .getDefaultTaskDisplayArea(); ActivityStack homeStack = taskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME); ActivityRecord otherUserHomeActivity = new ActivityBuilder(mService) diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index 836310496d0b..b648346eeb28 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -89,7 +89,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - mFullscreenStack = mRootWindowContainer.getDefaultDisplay().createStack( + mFullscreenStack = mRootWindowContainer.getDefaultTaskDisplayArea().createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); doNothing().when(mService).updateSleepIfNeededLocked(); } @@ -129,8 +129,8 @@ public class RootActivityContainerTests extends ActivityTestsBase { mRootWindowContainer.moveActivityToPinnedStack(firstActivity, sourceBounds, 0f /*aspectRatio*/, "initialMove"); - final DisplayContent display = mFullscreenStack.getDisplay(); - ActivityStack pinnedStack = display.getRootPinnedTask(); + final TaskDisplayArea taskDisplayArea = mFullscreenStack.getDisplayArea(); + ActivityStack pinnedStack = taskDisplayArea.getRootPinnedTask(); // Ensure a task has moved over. ensureStackPlacement(pinnedStack, firstActivity); ensureStackPlacement(mFullscreenStack, secondActivity); @@ -140,8 +140,9 @@ public class RootActivityContainerTests extends ActivityTestsBase { 0f /*aspectRatio*/, "secondMove"); // Need to get stacks again as a new instance might have been created. - pinnedStack = display.getRootPinnedTask(); - mFullscreenStack = display.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + pinnedStack = taskDisplayArea.getRootPinnedTask(); + mFullscreenStack = taskDisplayArea.getStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD); // Ensure stacks have swapped tasks. ensureStackPlacement(pinnedStack, secondActivity); ensureStackPlacement(mFullscreenStack, firstActivity); @@ -215,6 +216,8 @@ public class RootActivityContainerTests extends ActivityTestsBase { doReturn(isFocusedStack).when(stack).isFocusedStackOnDisplay(); doReturn(isFocusedStack ? stack : null).when(display).getFocusedStack(); + TaskDisplayArea defaultTaskDisplayArea = display.getDefaultTaskDisplayArea(); + doReturn(isFocusedStack ? stack : null).when(defaultTaskDisplayArea).getFocusedStack(); mRootWindowContainer.applySleepTokens(true); verify(stack, times(expectWakeFromSleep ? 1 : 0)).awakeFromSleepingLocked(); verify(stack, times(expectResumeTopActivity ? 1 : 0)).resumeTopActivityUncheckedLocked( @@ -226,26 +229,29 @@ public class RootActivityContainerTests extends ActivityTestsBase { */ @Test public void testRemovingStackOnAppCrash() { - final DisplayContent defaultDisplay = mRootWindowContainer.getDefaultDisplay(); - final int originalStackCount = defaultDisplay.getStackCount(); - final ActivityStack stack = mRootWindowContainer.getDefaultDisplay().createStack( + final TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer + .getDefaultTaskDisplayArea(); + final int originalStackCount = defaultTaskDisplayArea.getStackCount(); + final ActivityStack stack = defaultTaskDisplayArea.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */); final ActivityRecord firstActivity = new ActivityBuilder(mService).setCreateTask(true) .setStack(stack).build(); - assertEquals(originalStackCount + 1, defaultDisplay.getStackCount()); + assertEquals(originalStackCount + 1, defaultTaskDisplayArea.getStackCount()); // Let's pretend that the app has crashed. firstActivity.app.setThread(null); mRootWindowContainer.finishTopCrashedActivities(firstActivity.app, "test"); // Verify that the stack was removed. - assertEquals(originalStackCount, defaultDisplay.getStackCount()); + assertEquals(originalStackCount, defaultTaskDisplayArea.getStackCount()); } @Test public void testFocusability() { - final ActivityStack stack = mRootWindowContainer.getDefaultDisplay().createStack( + final TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer + .getDefaultTaskDisplayArea(); + final ActivityStack stack = defaultTaskDisplayArea.createStack( WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityRecord activity = new ActivityBuilder(mService).setCreateTask(true) .setStack(stack).build(); @@ -259,7 +265,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { assertFalse(stack.isTopActivityFocusable()); assertFalse(activity.isFocusable()); - final ActivityStack pinnedStack = mRootWindowContainer.getDefaultDisplay().createStack( + final ActivityStack pinnedStack = defaultTaskDisplayArea.createStack( WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */); final ActivityRecord pinnedActivity = new ActivityBuilder(mService).setCreateTask(true) .setStack(pinnedStack).build(); @@ -288,7 +294,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testSplitScreenPrimaryChosenWhenTopActivityLaunchedToSecondary() { // Create primary split-screen stack with a task and an activity. - final ActivityStack primaryStack = mRootWindowContainer.getDefaultDisplay() + final ActivityStack primaryStack = mRootWindowContainer.getDefaultTaskDisplayArea() .createStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */); final Task task = new TaskBuilder(mSupervisor).setStack(primaryStack).build(); @@ -311,7 +317,6 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testFindTaskToMoveToFrontWhenRecentsOnTop() { // Create stack/task on default display. - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); final ActivityStack targetStack = new StackBuilder(mRootWindowContainer) .setOnTop(false) .build(); @@ -325,7 +330,7 @@ public class RootActivityContainerTests extends ActivityTestsBase { mSupervisor.findTaskToMoveToFront(targetTask, 0, ActivityOptions.makeBasic(), reason, false); - final TaskDisplayArea taskDisplayArea = display.mTaskContainers; + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); verify(taskDisplayArea).moveHomeStackToFront(contains(reason)); } @@ -336,16 +341,16 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testFindTaskToMoveToFrontWhenRecentsOnOtherDisplay() { // Create stack/task on default display. - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - final ActivityStack targetStack = display.createStack(WINDOWING_MODE_FULLSCREEN, + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + final ActivityStack targetStack = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */); final Task targetTask = new TaskBuilder(mSupervisor).setStack(targetStack).build(); // Create Recents on secondary display. final TestDisplayContent secondDisplay = addNewDisplayContentAt( DisplayContent.POSITION_TOP); - final ActivityStack stack = secondDisplay.createStack(WINDOWING_MODE_FULLSCREEN, - ACTIVITY_TYPE_RECENTS, true /* onTop */); + final ActivityStack stack = secondDisplay.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_RECENTS, true /* onTop */); final Task task = new TaskBuilder(mSupervisor).setStack(stack).build(); new ActivityBuilder(mService).setTask(task).build(); @@ -353,7 +358,6 @@ public class RootActivityContainerTests extends ActivityTestsBase { mSupervisor.findTaskToMoveToFront(targetTask, 0, ActivityOptions.makeBasic(), reason, false); - final TaskDisplayArea taskDisplayArea = display.mTaskContainers; verify(taskDisplayArea, never()).moveHomeStackToFront(contains(reason)); } @@ -364,12 +368,12 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testResumeActivityWhenNonTopmostStackIsTopFocused() { // Create a stack at bottom. - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - final ActivityStack targetStack = spy(display.createStack(WINDOWING_MODE_FULLSCREEN, + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + final ActivityStack targetStack = spy(taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */)); final Task task = new TaskBuilder(mSupervisor).setStack(targetStack).build(); final ActivityRecord activity = new ActivityBuilder(mService).setTask(task).build(); - display.mTaskContainers.positionStackAtBottom(targetStack); + taskDisplayArea.positionStackAtBottom(targetStack); // Assume the stack is not at the topmost position (e.g. behind always-on-top stacks) but it // is the current top focused stack. @@ -392,10 +396,9 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testResumeFocusedStacksStartsHomeActivity_NoActivities() { mFullscreenStack.removeIfPossible(); - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY).getRootHomeTask() - .removeIfPossible(); - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY) - .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + taskDisplayArea.getRootHomeTask().removeIfPossible(); + taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); doReturn(true).when(mRootWindowContainer).resumeHomeActivity(any(), any(), anyInt()); @@ -415,16 +418,15 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testResumeFocusedStacksStartsHomeActivity_ActivityOnSecondaryScreen() { mFullscreenStack.removeIfPossible(); - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY).getRootHomeTask() - .removeIfPossible(); - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY) - .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + taskDisplayArea.getRootHomeTask().removeIfPossible(); + taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); // Create an activity on secondary display. final TestDisplayContent secondDisplay = addNewDisplayContentAt( DisplayContent.POSITION_TOP); - final ActivityStack stack = secondDisplay.createStack(WINDOWING_MODE_FULLSCREEN, - ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityStack stack = secondDisplay.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final Task task = new TaskBuilder(mSupervisor).setStack(stack).build(); new ActivityBuilder(mService).setTask(task).build(); @@ -446,8 +448,8 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testResumeActivityLingeringTransition() { // Create a stack at top. - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - final ActivityStack targetStack = spy(display.createStack(WINDOWING_MODE_FULLSCREEN, + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + final ActivityStack targetStack = spy(taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */)); final Task task = new TaskBuilder(mSupervisor).setStack(targetStack).build(); final ActivityRecord activity = new ActivityBuilder(mService).setTask(task).build(); @@ -466,13 +468,13 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Test public void testResumeActivityLingeringTransition_notExecuted() { // Create a stack at bottom. - final DisplayContent display = mRootWindowContainer.getDefaultDisplay(); - final ActivityStack targetStack = spy(display.createStack(WINDOWING_MODE_FULLSCREEN, + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + final ActivityStack targetStack = spy(taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */)); final Task task = new TaskBuilder(mSupervisor).setStack(targetStack).build(); final ActivityRecord activity = new ActivityBuilder(mService).setTask(task).build(); activity.setState(ActivityState.RESUMED, "test"); - display.mTaskContainers.positionStackAtBottom(targetStack); + taskDisplayArea.positionStackAtBottom(targetStack); // Assume the stack is at the topmost position assertFalse(targetStack.isTopStackInDisplayArea()); @@ -809,20 +811,20 @@ public class RootActivityContainerTests extends ActivityTestsBase { public void testSwitchUser_missingHomeRootTask() { doReturn(mFullscreenStack).when(mRootWindowContainer).getTopDisplayFocusedStack(); - DisplayContent defaultDisplay = mRootWindowContainer.getDefaultDisplay(); - ActivityStack homeStack = defaultDisplay.getRootHomeTask(); + final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); + ActivityStack homeStack = taskDisplayArea.getRootHomeTask(); if (homeStack != null) { homeStack.removeImmediately(); } - assertNull(defaultDisplay.getRootHomeTask()); + assertNull(taskDisplayArea.getRootHomeTask()); int currentUser = mRootWindowContainer.mCurrentUser; int otherUser = currentUser + 1; mRootWindowContainer.switchUser(otherUser, null); - assertNotNull(defaultDisplay.getRootHomeTask()); - assertEquals(defaultDisplay.getTopStack(), defaultDisplay.getRootHomeTask()); + assertNotNull(taskDisplayArea.getRootHomeTask()); + assertEquals(taskDisplayArea.getTopStack(), taskDisplayArea.getRootHomeTask()); } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java index d6a67abc9e76..3d3a0f148db5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java @@ -72,7 +72,8 @@ public class RunningTasksTest extends ActivityTestsBase { final int numTasks = 10; int activeTime = 0; for (int i = 0; i < numTasks; i++) { - createTask(display.getStackAt(i % numStacks), ".Task" + i, i, activeTime++, null); + createTask(display.getDefaultTaskDisplayArea().getStackAt(i % numStacks), + ".Task" + i, i, activeTime++, null); } // Ensure that the latest tasks were returned in order of decreasing last active time, diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 893a14541c48..673469474709 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -189,7 +189,7 @@ public class SizeCompatTests extends ActivityTestsBase { final int originalDpi = mActivity.getConfiguration().densityDpi; // Move the non-resizable activity to the new display. - mStack.reparent(newDisplay.mDisplayContent, true /* onTop */); + mStack.reparent(newDisplay.getDefaultTaskDisplayArea(), true /* onTop */); assertEquals(originalBounds.width(), mActivity.getBounds().width()); assertEquals(originalBounds.height(), mActivity.getBounds().height()); @@ -257,7 +257,7 @@ public class SizeCompatTests extends ActivityTestsBase { .setCanRotate(false).setNotch(notchHeight).build(); // Move the non-resizable activity to the new display. - mStack.reparent(newDisplay, true /* onTop */); + mStack.reparent(newDisplay.getDefaultTaskDisplayArea(), true /* onTop */); // The configuration bounds should keep the same. assertEquals(origWidth, configBounds.width()); assertEquals(origHeight, configBounds.height()); diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java index af76e7fc0b76..af3ec38631ae 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java @@ -316,7 +316,7 @@ public class SystemServicesTestRule implements TestRule { // that the default display is in fullscreen mode. display.setDisplayWindowingMode(WINDOWING_MODE_FULLSCREEN); spyOn(display); - final TaskDisplayArea taskDisplayArea = display.mTaskContainers; + final TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea(); spyOn(taskDisplayArea); final ActivityStack homeStack = taskDisplayArea.getStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java index 19824bf73c1c..9625ffdac052 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java @@ -16,8 +16,18 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM; +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_FREEFORM; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +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.WINDOWING_MODE_UNDEFINED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; @@ -27,6 +37,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import android.platform.test.annotations.Presubmit; @@ -134,4 +147,48 @@ public class TaskDisplayAreaTests extends WindowTestsBase { assertEquals("The testing DisplayContent should be moved to top with task", mWm.mRoot.getChildCount() - 1, indexOfDisplayWithPinnedStack); } + + @Test + public void testReuseTaskAsStack() { + final Task candidateTask = createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, mDisplayContent); + final Task newStack = createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, mDisplayContent); + doReturn(newStack).when(mDisplayContent.mTaskContainers).createStack(anyInt(), + anyInt(), anyBoolean(), any(), any(), anyBoolean()); + + final int type = ACTIVITY_TYPE_STANDARD; + assertGetOrCreateStack(WINDOWING_MODE_FULLSCREEN, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_UNDEFINED, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_FREEFORM, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_MULTI_WINDOW, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, type, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_PINNED, type, candidateTask, + false /* reuseCandidate */); + + final int windowingMode = WINDOWING_MODE_FULLSCREEN; + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_HOME, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_RECENTS, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_ASSISTANT, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_DREAM, candidateTask, + false /* reuseCandidate */); + } + + private void assertGetOrCreateStack(int windowingMode, int activityType, Task candidateTask, + boolean reuseCandidate) { + final TaskDisplayArea taskDisplayArea = (TaskDisplayArea) candidateTask.getParent(); + final ActivityStack stack = taskDisplayArea.getOrCreateStack(windowingMode, activityType, + false /* onTop */, null /* intent */, candidateTask /* candidateTask */); + assertEquals(reuseCandidate, stack == candidateTask); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java index a3446d16d9f3..1a38ff283477 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java @@ -1312,14 +1312,14 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { } private ActivityRecord createSourceActivity(TestDisplayContent display) { - final ActivityStack stack = display.createStack(display.getWindowingMode(), - ACTIVITY_TYPE_STANDARD, true); + final ActivityStack stack = display.getDefaultTaskDisplayArea() + .createStack(display.getWindowingMode(), ACTIVITY_TYPE_STANDARD, true); return new ActivityBuilder(mService).setStack(stack).setCreateTask(true).build(); } private void addFreeformTaskTo(TestDisplayContent display, Rect bounds) { - final ActivityStack stack = display.createStack(display.getWindowingMode(), - ACTIVITY_TYPE_STANDARD, true); + final ActivityStack stack = display.getDefaultTaskDisplayArea() + .createStack(display.getWindowingMode(), ACTIVITY_TYPE_STANDARD, true); stack.setWindowingMode(WINDOWING_MODE_FREEFORM); final Task task = new TaskBuilder(mSupervisor).setStack(stack).build(); // Just work around the unnecessary adjustments for bounds. diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java index 6ef714ebd0d9..62d311ae7b36 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java @@ -69,6 +69,8 @@ import android.window.WindowContainerTransaction; import androidx.test.filters.SmallTest; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -117,6 +119,13 @@ public class TaskOrganizerTests extends WindowTestsBase { return createTaskStackOnDisplay(mDisplayContent); } + @Before + public void setUp() { + // We defer callbacks since we need to adjust task surface visibility, but for these tests, + // just run the callbacks synchronously + mWm.mAtmService.mTaskOrganizerController.setDeferTaskOrgCallbacksConsumer((r) -> r.run()); + } + @Test public void testAppearVanish() throws RemoteException { final ActivityStack stack = createStack(); @@ -618,9 +627,12 @@ public class TaskOrganizerTests extends WindowTestsBase { private List<Task> getTasksCreatedByOrganizer(DisplayContent dc) { ArrayList<Task> out = new ArrayList<>(); - for (int i = dc.getStackCount() - 1; i >= 0; --i) { - final Task t = dc.getStackAt(i); - if (t.mCreatedByOrganizer) out.add(t); + for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { + final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx); + for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { + final Task t = taskDisplayArea.getStackAt(sNdx); + if (t.mCreatedByOrganizer) out.add(t); + } } return out; } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java index f76809b06510..519ac780bd6b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java @@ -203,9 +203,9 @@ public class TaskRecordTests extends ActivityTestsBase { @Test public void testFitWithinBounds() { final Rect parentBounds = new Rect(10, 10, 200, 200); - DisplayContent display = mService.mRootWindowContainer.getDefaultDisplay(); - ActivityStack stack = display.createStack(WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, - true /* onTop */); + TaskDisplayArea taskDisplayArea = mService.mRootWindowContainer.getDefaultTaskDisplayArea(); + ActivityStack stack = taskDisplayArea.createStack(WINDOWING_MODE_FREEFORM, + ACTIVITY_TYPE_STANDARD, true /* onTop */); Task task = new TaskBuilder(mSupervisor).setStack(stack).build(); final Configuration parentConfig = stack.getConfiguration(); parentConfig.windowConfiguration.setBounds(parentBounds); @@ -354,7 +354,7 @@ public class TaskRecordTests extends ActivityTestsBase { spyOn(parentWindowContainer); parentWindowContainer.setBounds(fullScreenBounds); doReturn(parentWindowContainer).when(task).getParent(); - doReturn(display.mTaskContainers).when(task).getDisplayArea(); + doReturn(display.getDefaultTaskDisplayArea()).when(task).getDisplayArea(); doReturn(stack).when(task).getStack(); doReturn(true).when(parentWindowContainer).handlesOrientationChangeFromDescendant(); @@ -438,9 +438,9 @@ public class TaskRecordTests extends ActivityTestsBase { @Test public void testInsetDisregardedWhenFreeformOverlapsNavBar() { - DisplayContent display = mService.mRootWindowContainer.getDefaultDisplay(); - ActivityStack stack = display.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, - true /* onTop */); + TaskDisplayArea taskDisplayArea = mService.mRootWindowContainer.getDefaultTaskDisplayArea(); + ActivityStack stack = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, true /* onTop */); DisplayInfo displayInfo = new DisplayInfo(); mService.mContext.getDisplay().getDisplayInfo(displayInfo); final int displayHeight = displayInfo.logicalHeight; @@ -959,8 +959,8 @@ public class TaskRecordTests extends ActivityTestsBase { private void testStackBoundsConfiguration(int windowingMode, Rect parentBounds, Rect bounds, Rect expectedConfigBounds) { - DisplayContent display = mService.mRootWindowContainer.getDefaultDisplay(); - ActivityStack stack = display.createStack(windowingMode, ACTIVITY_TYPE_STANDARD, + TaskDisplayArea taskDisplayArea = mService.mRootWindowContainer.getDefaultTaskDisplayArea(); + ActivityStack stack = taskDisplayArea.createStack(windowingMode, ACTIVITY_TYPE_STANDARD, true /* onTop */); Task task = new TaskBuilder(mSupervisor).setStack(stack).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java index 6387a3b7c474..d48e82723295 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java @@ -171,7 +171,7 @@ public class TaskStackTests extends WindowTestsBase { // Reparent clearInvocations(task1); // reset the number of onDisplayChanged for task. - stack1.reparent(dc, true /* onTop */); + stack1.reparent(dc.getDefaultTaskDisplayArea(), true /* onTop */); assertEquals(dc, stack1.getDisplayContent()); final int stack1PositionInParent = stack1.getParent().mChildren.indexOf(stack1); final int stack2PositionInParent = stack1.getParent().mChildren.indexOf(stack2); diff --git a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java index 900f014a0218..a4f1487dde1e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java @@ -254,7 +254,7 @@ public class WallpaperControllerTests extends WindowTestsBase { private WindowState createWallpaperTargetWindow(DisplayContent dc) { final ActivityRecord homeActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService) - .setStack(dc.getRootHomeTask()) + .setStack(dc.getDefaultTaskDisplayArea().getRootHomeTask()) .setCreateTask(true) .build(); homeActivity.setVisibility(true); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java index 27ea37dfeb19..118c2e4db208 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java @@ -780,8 +780,8 @@ public class WindowContainerTests extends WindowTestsBase { WindowTestUtils.createActivityRecordInTask(mDisplayContent, task); final DisplayContent newDc = createNewDisplay(); - mDisplayContent.removeStack(stack); - newDc.mTaskContainers.addChild(stack, POSITION_TOP); + stack.getDisplayArea().removeStack(stack); + newDc.getDefaultTaskDisplayArea().addChild(stack, POSITION_TOP); verify(stack).onDisplayChanged(newDc); verify(task).onDisplayChanged(newDc); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 820d3816a6f6..71b35b62366e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -40,6 +40,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doThrow; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; @@ -47,6 +48,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.google.common.truth.Truth.assertThat; + import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; @@ -55,6 +58,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; @@ -65,6 +69,7 @@ import android.graphics.Insets; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.util.Size; import android.view.DisplayCutout; @@ -568,6 +573,36 @@ public class WindowStateTests extends WindowTestsBase { } @Test + public void testReportResizedWithRemoteException() { + final WindowState win = mChildAppWindowAbove; + makeWindowVisible(win, win.getParentWindow()); + win.mLayoutSeq = win.getDisplayContent().mLayoutSeq; + win.updateResizingWindowIfNeeded(); + + assertThat(mWm.mResizingWindows).contains(win); + assertTrue(win.getOrientationChanging()); + + mWm.mResizingWindows.remove(win); + spyOn(win.mClient); + try { + doThrow(new RemoteException("test")).when(win.mClient).resized(any() /* frame */, + any() /* contentInsets */, any() /* visibleInsets */, any() /* stableInsets */, + anyBoolean() /* reportDraw */, any() /* mergedConfig */, + any() /* backDropFrame */, anyBoolean() /* forceLayout */, + anyBoolean() /* alwaysConsumeSystemBars */, anyInt() /* displayId */, + any() /* displayCutout */); + } catch (RemoteException ignored) { + } + win.reportResized(); + win.updateResizingWindowIfNeeded(); + + // Even "resized" throws remote exception, it is still considered as reported. So the window + // shouldn't be resized again (which may block unfreeze in real case). + assertThat(mWm.mResizingWindows).doesNotContain(win); + assertFalse(win.getOrientationChanging()); + } + + @Test public void testGetTransformationMatrix() { final int PARENT_WINDOW_OFFSET = 1; final int DISPLAY_IN_PARENT_WINDOW_OFFSET = 2; diff --git a/startop/iorap/functional_tests/Android.bp b/startop/iorap/functional_tests/Android.bp index ce9dc325c76d..ad85f1430bdf 100644 --- a/startop/iorap/functional_tests/Android.bp +++ b/startop/iorap/functional_tests/Android.bp @@ -15,6 +15,7 @@ android_test { name: "iorap-functional-tests", srcs: ["src/**/*.java"], + data: ["test_data/*"], static_libs: [ // Non-test dependencies // library under test diff --git a/startop/iorap/functional_tests/AndroidTest.xml b/startop/iorap/functional_tests/AndroidTest.xml index 3d5a2294f8d5..31d4f6c47b11 100644 --- a/startop/iorap/functional_tests/AndroidTest.xml +++ b/startop/iorap/functional_tests/AndroidTest.xml @@ -45,6 +45,20 @@ <option name="run-command" value="sleep 1" /> </target_preparer> + <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"> + <option name="cleanup" value="true" /> + <option name="abort-on-push-failure" value="true" /> + <option name="push-file" + key="iorap_test_app_v1.apk" + value="/data/misc/iorapd/iorap_test_app_v1.apk" /> + <option name="push-file" + key="iorap_test_app_v2.apk" + value="/data/misc/iorapd/iorap_test_app_v2.apk" /> + <option name="push-file" + key="iorap_test_app_v3.apk" + value="/data/misc/iorapd/iorap_test_app_v3.apk" /> + </target_preparer> + <test class="com.android.tradefed.testtype.AndroidJUnitTest" > <option name="package" value="com.google.android.startop.iorap.tests" /> <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> diff --git a/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java b/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java index 9abbcd71cfd2..c35dd3b783b1 100644 --- a/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java +++ b/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java @@ -37,45 +37,46 @@ import androidx.test.uiautomator.By; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.Until; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.Duration; import java.util.ArrayList; import java.util.concurrent.TimeUnit; +import java.util.Date; import java.util.function.BooleanSupplier; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.List; - +import java.text.SimpleDateFormat; /** * Test for the work flow of iorap. * - * <p> This test tests the function of iorap from perfetto collection -> compilation -> - * prefetching. - * </p> + * <p> This test tests the function of iorap from: + * perfetto collection -> compilation -> prefetching -> version update -> perfetto collection. */ @RunWith(AndroidJUnit4.class) public class IorapWorkFlowTest { - private static final String TAG = "IorapWorkFlowTest"; - private static final String TEST_PACKAGE_NAME = "com.android.settings"; - private static final String TEST_ACTIVITY_NAME = "com.android.settings.Settings"; + private static final String TEST_APP_VERSION_ONE_PATH = "/data/misc/iorapd/iorap_test_app_v1.apk"; + private static final String TEST_APP_VERSION_TWO_PATH = "/data/misc/iorapd/iorap_test_app_v2.apk"; + private static final String TEST_APP_VERSION_THREE_PATH = "/data/misc/iorapd/iorap_test_app_v3.apk"; private static final String DB_PATH = "/data/misc/iorapd/sqlite.db"; private static final Duration TIMEOUT = Duration.ofSeconds(300L); - private static final String READAHEAD_INDICATOR = - "Description = /data/misc/iorapd/com.android.settings/-?\\d+/com.android.settings.Settings/compiled_traces/compiled_trace.pb"; - private UiDevice mDevice; @Before - public void startMainActivityFromHomeScreen() throws Exception { + public void setUp() throws Exception { // Initialize UiDevice instance mDevice = UiDevice.getInstance(getInstrumentation()); @@ -88,21 +89,81 @@ public class IorapWorkFlowTest { mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), TIMEOUT.getSeconds()); } + @After + public void tearDown() throws Exception { + String packageName = "com.example.ioraptestapp"; + uninstallApk(packageName); + } + @Test (timeout = 300000) - public void testApp() throws Exception { + public void testNormalWorkFlow() throws Exception { assertThat(mDevice, notNullValue()); + // Install test app version one + installApk(TEST_APP_VERSION_ONE_PATH); + String packageName = "com.example.ioraptestapp"; + String activityName = "com.example.ioraptestapp.MainActivity"; + // Perfetto trace collection phase. - assertTrue(startAppForPerfettoTrace(/*expectPerfettoTraceCount=*/1)); - assertTrue(startAppForPerfettoTrace(/*expectPerfettoTraceCount=*/2)); - assertTrue(startAppForPerfettoTrace(/*expectPerfettoTraceCount=*/3)); - assertTrue(checkPerfettoTracesExistence(TIMEOUT, 3)); + assertTrue(startAppForPerfettoTrace( + packageName, activityName, /*version=*/1L)); + assertTrue(startAppForPerfettoTrace( + packageName, activityName, /*version=*/1L)); + assertTrue(startAppForPerfettoTrace( + packageName, activityName, /*version=*/1L)); // Trigger maintenance service for compilation. - assertTrue(compile(TIMEOUT)); + TimeUnit.SECONDS.sleep(5L); + assertTrue(compile(packageName, activityName, /*version=*/1L)); - // Check if prefetching works. - assertTrue(waitForPrefetchingFromLogcat(/*expectPerfettoTraceCount=*/3)); + // Run app with prefetching + assertTrue(startAppWithCompiledTrace( + packageName, activityName, /*version=*/1L)); + } + + @Test (timeout = 300000) + public void testUpdateApp() throws Exception { + assertThat(mDevice, notNullValue()); + + // Install test app version two, + String packageName = "com.example.ioraptestapp"; + String activityName = "com.example.ioraptestapp.MainActivity"; + installApk(TEST_APP_VERSION_TWO_PATH); + + // Perfetto trace collection phase. + assertTrue(startAppForPerfettoTrace( + packageName, activityName, /*version=*/2L)); + assertTrue(startAppForPerfettoTrace( + packageName, activityName, /*version=*/2L)); + assertTrue(startAppForPerfettoTrace( + packageName, activityName, /*version=*/2L)); + + // Trigger maintenance service for compilation. + TimeUnit.SECONDS.sleep(5L); + assertTrue(compile(packageName, activityName, /*version=*/2L)); + + // Run app with prefetching + assertTrue(startAppWithCompiledTrace( + packageName, activityName, /*version=*/2L)); + + // Update test app to version 3 + installApk(TEST_APP_VERSION_THREE_PATH); + + // Rerun app, should do pefetto tracing. + assertTrue(startAppForPerfettoTrace( + packageName, activityName, /*version=*/3L)); + } + + private static void installApk(String apkPath) throws Exception { + // Disable the selinux to allow pm install apk in the dir. + executeShellCommand("setenforce 0"); + executeShellCommand("pm install -r -d " + apkPath); + executeShellCommand("setenforce 1"); + + } + + private static void uninstallApk(String apkPath) throws Exception { + executeShellCommand("pm uninstall " + apkPath); } /** @@ -110,43 +171,81 @@ public class IorapWorkFlowTest { * * @param expectPerfettoTraceCount is the expected count of perfetto traces. */ - private boolean startAppForPerfettoTrace(long expectPerfettoTraceCount) + private boolean startAppForPerfettoTrace( + String packageName, String activityName, long version) + throws Exception { + LogcatTimestamp timestamp = runAppOnce(packageName, activityName); + return waitForPerfettoTraceSavedFromLogcat( + packageName, activityName, version, timestamp); + } + + private boolean startAppWithCompiledTrace( + String packageName, String activityName, long version) throws Exception { + LogcatTimestamp timestamp = runAppOnce(packageName, activityName); + return waitForPrefetchingFromLogcat( + packageName, activityName, version, timestamp); + } + + private LogcatTimestamp runAppOnce(String packageName, String activityName) throws Exception { // Close the specified app if it's open - closeApp(); + closeApp(packageName); + LogcatTimestamp timestamp = new LogcatTimestamp(); // Launch the specified app - startApp(); + startApp(packageName, activityName); // Wait for the app to appear - mDevice.wait(Until.hasObject(By.pkg(TEST_PACKAGE_NAME).depth(0)), TIMEOUT.getSeconds()); - - String sql = "SELECT COUNT(*) FROM activities " - + "JOIN app_launch_histories ON activities.id = app_launch_histories.activity_id " - + "JOIN raw_traces ON raw_traces.history_id = app_launch_histories.id " - + "WHERE activities.name = ?"; - return checkAndWaitEntriesNum(sql, new String[]{TEST_ACTIVITY_NAME}, expectPerfettoTraceCount, - TIMEOUT); + mDevice.wait(Until.hasObject(By.pkg(packageName).depth(0)), TIMEOUT.getSeconds()); + return timestamp; } // Invokes the maintenance to compile the perfetto traces to compiled trace. - private boolean compile(Duration timeout) throws Exception { + private boolean compile( + String packageName, String activityName, long version) throws Exception { // The job id (283673059) is defined in class IorapForwardingService. - executeShellCommand("cmd jobscheduler run -f android 283673059"); - - // Wait for the compilation. - String sql = "SELECT COUNT(*) FROM activities JOIN prefetch_files ON " - + "activities.id = prefetch_files.activity_id " - + "WHERE activities.name = ?"; - boolean result = checkAndWaitEntriesNum(sql, new String[]{TEST_ACTIVITY_NAME}, /*count=*/1, - timeout); - if (!result) { - return false; + executeShellCommandViaTmpFile("cmd jobscheduler run -f android 283673059"); + return waitForFileExistence(getCompiledTracePath(packageName, activityName, version)); + } + + private String getCompiledTracePath( + String packageName, String activityName, long version) { + return String.format( + "/data/misc/iorapd/%s/%d/%s/compiled_traces/compiled_trace.pb", + packageName, version, activityName); + } + + /** + * Starts the testing app. + */ + private void startApp(String packageName, String activityName) throws Exception { + executeShellCommandViaTmpFile( + String.format("am start %s/%s", packageName, activityName)); + } + + /** + * Closes the testing app. + * <p> Keep trying to kill the process of the app until no process of the app package + * appears.</p> + */ + private void closeApp(String packageName) throws Exception { + while (true) { + String pid = executeShellCommand("pidof " + packageName); + if (pid.isEmpty()) { + Log.i(TAG, "Closed app " + packageName); + return; + } + executeShellCommand("kill -9 " + pid); + TimeUnit.SECONDS.sleep(1L); } + } - return retryWithTimeout(timeout, () -> { + /** Waits for a file to appear. */ + private boolean waitForFileExistence(String fileName) throws Exception { + return retryWithTimeout(TIMEOUT, () -> { try { - String compiledTrace = getCompiledTraceFilePath(); - File compiledTraceLocal = copyFileToLocal(compiledTrace, "compiled_trace.tmp"); - return compiledTraceLocal.exists(); + String fileExists = executeShellCommandViaTmpFile( + String.format("test -f %s; echo $?", fileName)); + Log.i(TAG, fileName + " existence is " + fileExists); + return fileExists.trim().equals("0"); } catch (Exception e) { Log.i(TAG, e.getMessage()); return false; @@ -154,92 +253,96 @@ public class IorapWorkFlowTest { }); } - /** - * Check if all the perfetto traces in the db exist. - */ - private boolean checkPerfettoTracesExistence(Duration timeout, int expectPerfettoTraceCount) + /** Waits for the perfetto trace saved message from logcat. */ + private boolean waitForPerfettoTraceSavedFromLogcat( + String packageName, String activityName, long version, LogcatTimestamp timestamp) throws Exception { - return retryWithTimeout(timeout, () -> { + Pattern p = Pattern.compile(".*" + + getPerfettoTraceSavedIndicator(packageName, activityName, version) + + "(.*[.]perfetto_trace[.]pb)\n.*", Pattern.DOTALL); + + return retryWithTimeout(TIMEOUT, () -> { try { - File dbFile = getIorapDb(); - List<String> traces = getPerfettoTracePaths(dbFile); - assertEquals(traces.size(), expectPerfettoTraceCount); - - int count = 0; - for (String trace : traces) { - File tmp = copyFileToLocal(trace, "perfetto_trace.tmp" + count); - ++count; - Log.i(TAG, "Check perfetto trace: " + trace); - if (!tmp.exists()) { - Log.i(TAG, "Perfetto trace does not exist: " + trace); - return false; - } + String log = timestamp.getLogcatAfter(); + Matcher m = p.matcher(log); + Log.d(TAG, "Tries to find perfetto trace..."); + if (!m.matches()) { + Log.i(TAG, "Cannot find perfetto trace saved in log."); + return false; } + String filePath = m.group(1); + Log.i(TAG, "Perfetto trace is saved to " + filePath); return true; - } catch (Exception e) { - Log.i(TAG, e.getMessage()); + } catch(Exception e) { + Log.e(TAG, e.getMessage()); return false; } - }); - } - - /** - * Gets the perfetto traces file path from the db. - */ - private List<String> getPerfettoTracePaths(File dbFile) throws Exception { - String sql = "SELECT raw_traces.file_path FROM activities " - + "JOIN app_launch_histories ON activities.id = app_launch_histories.activity_id " - + "JOIN raw_traces ON raw_traces.history_id = app_launch_histories.id " - + "WHERE activities.name = ?"; - - List<String> perfettoTraces = new ArrayList<>(); - try (SQLiteDatabase db = SQLiteDatabase - .openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY)) { - Cursor cursor = db.rawQuery(sql, new String[]{TEST_ACTIVITY_NAME}); - while (cursor.moveToNext()) { - perfettoTraces.add(cursor.getString(0)); - } - } - return perfettoTraces; + }); } - private String getCompiledTraceFilePath() throws Exception { - File dbFile = getIorapDb(); - try (SQLiteDatabase db = SQLiteDatabase - .openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY)) { - String sql = "SELECT prefetch_files.file_path FROM activities JOIN prefetch_files ON " - + "activities.id = prefetch_files.activity_id " - + "WHERE activities.name = ?"; - return DatabaseUtils.stringForQuery(db, sql, new String[]{TEST_ACTIVITY_NAME}); - } + private String getPerfettoTraceSavedIndicator( + String packageName, String activityName, long version) { + return String.format( + "Perfetto TraceBuffer saved to file: /data/misc/iorapd/%s/%d/%s/raw_traces/", + packageName, version, activityName); } /** - * Checks the number of entries in the database table. + * Waits for the prefetching log in the logcat. * - * <p> Keep checking until the timeout. + * <p> When prefetching works, the perfetto traces should not be collected. </p> */ - private boolean checkAndWaitEntriesNum(String sql, String[] selectionArgs, long count, - Duration timeout) + private boolean waitForPrefetchingFromLogcat( + String packageName, String activityName, long version, LogcatTimestamp timestamp) throws Exception { - return retryWithTimeout(timeout, () -> { + Pattern p = Pattern.compile( + ".*" + getReadaheadIndicator(packageName, activityName, version) + + ".*Total File Paths=(\\d+) \\(good: (\\d+[.]?\\d*)%\\)\n" + + ".*Total Entries=(\\d+) \\(good: (\\d+[.]?\\d*)%\\)\n" + + ".*Total Bytes=(\\d+) \\(good: (\\d+[.]?\\d*)%\\).*", + Pattern.DOTALL); + + return retryWithTimeout(TIMEOUT, () -> { try { - File db = getIorapDb(); - long curCount = getEntriesNum(db, selectionArgs, sql); - Log.i(TAG, String - .format("For %s, current count is %d, expected count is :%d.", sql, curCount, - count)); - return curCount == count; - } catch (Exception e) { - Log.i(TAG, e.getMessage()); + String log = timestamp.getLogcatAfter(); + Matcher m = p.matcher(log); + if (!m.matches()) { + Log.i(TAG, "Cannot find readahead log."); + return false; + } + + int totalFilePath = Integer.parseInt(m.group(1)); + float totalFilePathGoodRate = Float.parseFloat(m.group(2)) / 100; + int totalEntries = Integer.parseInt(m.group(3)); + float totalEntriesGoodRate = Float.parseFloat(m.group(4)) / 100; + int totalBytes = Integer.parseInt(m.group(5)); + float totalBytesGoodRate = Float.parseFloat(m.group(6)) / 100; + + Log.i(TAG, String.format( + "totalFilePath: %d (good %.2f) totalEntries: %d (good %.2f) totalBytes: %d (good %.2f)", + totalFilePath, totalFilePathGoodRate, totalEntries, totalEntriesGoodRate, totalBytes, + totalBytesGoodRate)); + + return totalFilePath > 0 && + totalEntries > 0 && + totalBytes > 0 && + totalFilePathGoodRate > 0.5 && + totalEntriesGoodRate > 0.5 && + totalBytesGoodRate > 0.5; + } catch(Exception e) { return false; } - }); + }); } - /** - * Retry until timeout. - */ + private static String getReadaheadIndicator( + String packageName, String activityName, long version) { + return String.format( + "Description = /data/misc/iorapd/%s/%d/%s/compiled_traces/compiled_trace.pb", + packageName, version, activityName); + } + + /** Retry until timeout. */ private boolean retryWithTimeout(Duration timeout, BooleanSupplier supplier) throws Exception { long totalSleepTimeSeconds = 0L; long sleepIntervalSeconds = 2L; @@ -256,113 +359,28 @@ public class IorapWorkFlowTest { } /** - * Gets the number of entries in the query of sql. - */ - private long getEntriesNum(File dbFile, String[] selectionArgs, String sql) throws Exception { - try (SQLiteDatabase db = SQLiteDatabase - .openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY)) { - return DatabaseUtils.longForQuery(db, sql, selectionArgs); - } - } - - /** - * Gets the iorapd sqlite db file. + * Executes command in adb shell via a tmp file. * - * <p> The test cannot access the db file directly under "/data/misc/iorapd". - * Copy it to the local directory and change the mode. - */ - private File getIorapDb() throws Exception { - File tmpDb = copyFileToLocal("/data/misc/iorapd/sqlite.db", "tmp.db"); - // Change the mode of the file to allow the access from test. - executeShellCommand("chmod 777 " + tmpDb.getPath()); - return tmpDb; - } - - /** - * Copys a file to local directory. - */ - private File copyFileToLocal(String src, String tgtFileName) throws Exception { - File localDir = getApplicationContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE); - File localFile = new File(localDir, tgtFileName); - executeShellCommand(String.format("cp %s %s", src, localFile.getPath())); - return localFile; - } - - /** - * Starts the testing app. - */ - private void startApp() throws Exception { - Context context = getApplicationContext(); - final Intent intent = context.getPackageManager() - .getLaunchIntentForPackage(TEST_PACKAGE_NAME); - context.startActivity(intent); - Log.i(TAG, "Started app " + TEST_PACKAGE_NAME); - } - - /** - * Closes the testing app. - * <p> Keep trying to kill the process of the app until no process of the app package - * appears.</p> + * <p> This should be run as root.</p> */ - private void closeApp() throws Exception { - while (true) { - String pid = executeShellCommand("pidof " + TEST_PACKAGE_NAME); - if (pid.isEmpty()) { - Log.i(TAG, "Closed app " + TEST_PACKAGE_NAME); - return; + private static String executeShellCommandViaTmpFile(String cmd) throws Exception { + Log.i(TAG, "Execute via tmp file: " + cmd); + Path tmp = null; + try { + tmp = Files.createTempFile(/*prefix=*/null, /*suffix=*/".sh"); + Files.write(tmp, cmd.getBytes(StandardCharsets.UTF_8)); + tmp.toFile().setExecutable(true); + return UiDevice.getInstance( + InstrumentationRegistry.getInstrumentation()). + executeShellCommand(tmp.toString()); + } finally { + if (tmp != null) { + Files.delete(tmp); } - executeShellCommand("kill -9 " + pid); - TimeUnit.SECONDS.sleep(1L); } } /** - * Waits for the prefetching log in the logcat. - * - * <p> When prefetching works, the perfetto traces should not be collected. </p> - */ - private boolean waitForPrefetchingFromLogcat(long expectPerfettoTraceCount) throws Exception { - if (!startAppForPerfettoTrace(expectPerfettoTraceCount)) { - return false; - } - - String log = executeShellCommand("logcat -d"); - - Pattern p = Pattern.compile( - ".*" + READAHEAD_INDICATOR - + ".*Total File Paths=(\\d+) \\(good: (\\d+[.]?\\d*)%\\)\n" - + ".*Total Entries=(\\d+) \\(good: (\\d+[.]?\\d*)%\\)\n" - + ".*Total Bytes=(\\d+) \\(good: (\\d+[.]?\\d*)%\\).*", - Pattern.DOTALL); - Matcher m = p.matcher(log); - - if (!m.matches()) { - Log.i(TAG, "Cannot find readahead log."); - return false; - } - - int totalFilePath = Integer.parseInt(m.group(1)); - float totalFilePathGoodRate = Float.parseFloat(m.group(2)) / 100; - int totalEntries = Integer.parseInt(m.group(3)); - float totalEntriesGoodRate = Float.parseFloat(m.group(4)) / 100; - int totalBytes = Integer.parseInt(m.group(5)); - float totalBytesGoodRate = Float.parseFloat(m.group(6)) / 100; - - Log.i(TAG, String.format( - "totalFilePath: %d (good %.2f) totalEntries: %d (good %.2f) totalBytes: %d (good %.2f)", - totalFilePath, totalFilePathGoodRate, totalEntries, totalEntriesGoodRate, totalBytes, - totalBytesGoodRate)); - - return totalFilePath > 0 && - totalEntries > 0 && - totalBytes > 100000 && - totalFilePathGoodRate > 0.5 && - totalEntriesGoodRate > 0.5 && - totalBytesGoodRate > 0.5; - } - - - /** * Executes command in adb shell. * * <p> This should be run as root.</p> @@ -372,6 +390,27 @@ public class IorapWorkFlowTest { return UiDevice.getInstance( InstrumentationRegistry.getInstrumentation()).executeShellCommand(cmd); } -} + static class LogcatTimestamp { + private String epochTime; + + public LogcatTimestamp() throws Exception{ + long currentTimeMillis = System.currentTimeMillis(); + epochTime = String.format( + "%d.%d", currentTimeMillis/1000, currentTimeMillis%1000); + Log.i(TAG, "Current logcat timestamp is " + epochTime); + } + + // For example, 1585264100.000 + public String getEpochTime() { + return epochTime; + } + + // Gets the logcat after this epoch time. + public String getLogcatAfter() throws Exception { + return executeShellCommandViaTmpFile( + "logcat -v epoch -t '" + epochTime + "'"); + } + } +} diff --git a/startop/iorap/functional_tests/test_data/iorap_test_app_v1.apk b/startop/iorap/functional_tests/test_data/iorap_test_app_v1.apk new file mode 120000 index 000000000000..1c1a437f6a55 --- /dev/null +++ b/startop/iorap/functional_tests/test_data/iorap_test_app_v1.apk @@ -0,0 +1 @@ +../../../../../../packages/modules/ArtPrebuilt/iorap/test/iorap_test_app_v1.apk
\ No newline at end of file diff --git a/startop/iorap/functional_tests/test_data/iorap_test_app_v2.apk b/startop/iorap/functional_tests/test_data/iorap_test_app_v2.apk new file mode 120000 index 000000000000..7cd41c48ba3a --- /dev/null +++ b/startop/iorap/functional_tests/test_data/iorap_test_app_v2.apk @@ -0,0 +1 @@ +../../../../../../packages/modules/ArtPrebuilt/iorap/test/iorap_test_app_v2.apk
\ No newline at end of file diff --git a/startop/iorap/functional_tests/test_data/iorap_test_app_v3.apk b/startop/iorap/functional_tests/test_data/iorap_test_app_v3.apk new file mode 120000 index 000000000000..7f4e996e57d0 --- /dev/null +++ b/startop/iorap/functional_tests/test_data/iorap_test_app_v3.apk @@ -0,0 +1 @@ +../../../../../../packages/modules/ArtPrebuilt/iorap/test/iorap_test_app_v3.apk
\ No newline at end of file diff --git a/tests/net/common/java/android/net/LinkPropertiesTest.java b/tests/net/common/java/android/net/LinkPropertiesTest.java index 8de27e8eb281..0fc9be32f4cf 100644 --- a/tests/net/common/java/android/net/LinkPropertiesTest.java +++ b/tests/net/common/java/android/net/LinkPropertiesTest.java @@ -16,6 +16,8 @@ package android.net; +import static android.net.RouteInfo.RTN_UNREACHABLE; + import static com.android.testutils.ParcelUtilsKt.assertParcelSane; import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless; import static com.android.testutils.ParcelUtilsKt.parcelingRoundTrip; @@ -46,6 +48,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.net.Inet4Address; +import java.net.Inet6Address; import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; @@ -1257,4 +1260,26 @@ public class LinkPropertiesTest { final LinkProperties Ipv6 = makeIpv6LinkProperties(); assertTrue(Ipv6.hasIpv6DnsServer()); } + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + public void testHasIpv4UnreachableDefaultRoute() { + final LinkProperties lp = makeTestObject(); + assertFalse(lp.hasIpv4UnreachableDefaultRoute()); + assertFalse(lp.hasIpv6UnreachableDefaultRoute()); + + lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE)); + assertTrue(lp.hasIpv4UnreachableDefaultRoute()); + assertFalse(lp.hasIpv6UnreachableDefaultRoute()); + } + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + public void testHasIpv6UnreachableDefaultRoute() { + final LinkProperties lp = makeTestObject(); + assertFalse(lp.hasIpv6UnreachableDefaultRoute()); + assertFalse(lp.hasIpv4UnreachableDefaultRoute()); + + lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); + assertTrue(lp.hasIpv6UnreachableDefaultRoute()); + assertFalse(lp.hasIpv4UnreachableDefaultRoute()); + } } diff --git a/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt b/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt new file mode 100644 index 000000000000..ef15b668e24c --- /dev/null +++ b/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net + +import android.net.wifi.aware.DiscoverySession +import android.net.wifi.aware.PeerHandle +import android.net.wifi.aware.WifiAwareNetworkSpecifier +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 + +import com.android.testutils.assertParcelSane + +import java.lang.IllegalStateException + +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito + +@RunWith(AndroidJUnit4::class) +@SmallTest +class MatchAllNetworkSpecifierTest { + @Test + fun testParcel() { + assertParcelSane(MatchAllNetworkSpecifier(), 0) + } + + @Test(expected = IllegalStateException::class) + fun testSatisfiedBy() { + val specifier = MatchAllNetworkSpecifier() + val discoverySession = Mockito.mock(DiscoverySession::class.java) + val peerHandle = Mockito.mock(PeerHandle::class.java) + val wifiAwareNetworkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, + peerHandle).build() + specifier.satisfiedBy(wifiAwareNetworkSpecifier) + } +} diff --git a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java index 316a83adf45e..6e9dc8eaf2dc 100644 --- a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java +++ b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java @@ -55,6 +55,10 @@ import android.util.ArraySet; import androidx.core.os.BuildCompat; import androidx.test.runner.AndroidJUnit4; +import com.android.testutils.DevSdkIgnoreRule; +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; + +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -67,6 +71,9 @@ public class NetworkCapabilitiesTest { private static final String TEST_SSID = "TEST_SSID"; private static final String DIFFERENT_TEST_SSID = "DIFFERENT_TEST_SSID"; + @Rule + public DevSdkIgnoreRule mDevSdkIgnoreRule = new DevSdkIgnoreRule(); + private boolean isAtLeastR() { // BuildCompat.isAtLeastR() is used to check the Android version before releasing Android R. // Build.VERSION.SDK_INT > Build.VERSION_CODES.Q is used to check the Android version after @@ -441,7 +448,7 @@ public class NetworkCapabilitiesTest { return range; } - @Test + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) public void testSetAdministratorUids() { NetworkCapabilities nc = new NetworkCapabilities().setAdministratorUids(new int[] {2, 1, 3}); @@ -449,7 +456,7 @@ public class NetworkCapabilitiesTest { assertArrayEquals(new int[] {1, 2, 3}, nc.getAdministratorUids()); } - @Test + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) public void testSetAdministratorUidsWithDuplicates() { try { new NetworkCapabilities().setAdministratorUids(new int[] {1, 1}); @@ -510,6 +517,12 @@ public class NetworkCapabilitiesTest { assertFalse(nc2.appliesToUid(12)); assertTrue(nc1.appliesToUid(22)); assertTrue(nc2.appliesToUid(22)); + } + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + public void testCombineCapabilities_AdministratorUids() { + final NetworkCapabilities nc1 = new NetworkCapabilities(); + final NetworkCapabilities nc2 = new NetworkCapabilities(); final int[] adminUids = {3, 6, 12}; nc1.setAdministratorUids(adminUids); @@ -518,7 +531,7 @@ public class NetworkCapabilitiesTest { assertArrayEquals(nc2.getAdministratorUids(), adminUids); final int[] adminUidsOtherOrder = {3, 12, 6}; - nc1.setAdministratorUids(adminUids); + nc1.setAdministratorUids(adminUidsOtherOrder); assertTrue(nc2.equalsAdministratorUids(nc1)); final int[] adminUids2 = {11, 1, 12, 3, 6}; diff --git a/tests/net/common/java/android/net/RouteInfoTest.java b/tests/net/common/java/android/net/RouteInfoTest.java index 1658262c17f6..8204b494bbb8 100644 --- a/tests/net/common/java/android/net/RouteInfoTest.java +++ b/tests/net/common/java/android/net/RouteInfoTest.java @@ -31,6 +31,7 @@ import static org.junit.Assert.fail; import android.os.Build; +import androidx.core.os.BuildCompat; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -62,6 +63,11 @@ public class RouteInfoTest { return new IpPrefix(prefix); } + private static boolean isAtLeastR() { + // BuildCompat.isAtLeastR is documented to return false on release SDKs (including R) + return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR(); + } + @Test public void testConstructor() { RouteInfo r; @@ -195,78 +201,130 @@ public class RouteInfoTest { assertTrue(r.isDefaultRoute()); assertTrue(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("::/0"), Address("::"), "wlan0"); assertFalse(r.isHostRoute()); assertTrue(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertTrue(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("192.0.2.0/24"), null, "wlan0"); assertFalse(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("2001:db8::/48"), null, "wlan0"); assertFalse(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("192.0.2.0/32"), Address("0.0.0.0"), "wlan0"); assertTrue(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("2001:db8::/128"), Address("::"), "wlan0"); assertTrue(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("192.0.2.0/32"), null, "wlan0"); assertTrue(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("2001:db8::/128"), null, "wlan0"); assertTrue(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("::/128"), Address("fe80::"), "wlan0"); assertTrue(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("0.0.0.0/32"), Address("192.0.2.1"), "wlan0"); assertTrue(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(Prefix("0.0.0.0/32"), Address("192.0.2.1"), "wlan0"); assertTrue(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE); assertFalse(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertTrue(r.isIPv4UnreachableDefault()); + assertFalse(r.isIPv6UnreachableDefault()); + } r = new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE); assertFalse(r.isHostRoute()); assertFalse(r.isDefaultRoute()); assertFalse(r.isIPv4Default()); assertFalse(r.isIPv6Default()); + if (isAtLeastR()) { + assertFalse(r.isIPv4UnreachableDefault()); + assertTrue(r.isIPv6UnreachableDefault()); + } } @Test diff --git a/tests/net/common/java/android/net/netstats/NetworkStatsApiTest.kt b/tests/net/common/java/android/net/netstats/NetworkStatsApiTest.kt new file mode 100644 index 000000000000..9119d62fb023 --- /dev/null +++ b/tests/net/common/java/android/net/netstats/NetworkStatsApiTest.kt @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.netstats + +import android.net.NetworkStats +import android.net.NetworkStats.DEFAULT_NETWORK_NO +import android.net.NetworkStats.DEFAULT_NETWORK_YES +import android.net.NetworkStats.Entry +import android.net.NetworkStats.IFACE_VT +import android.net.NetworkStats.METERED_NO +import android.net.NetworkStats.METERED_YES +import android.net.NetworkStats.ROAMING_NO +import android.net.NetworkStats.ROAMING_YES +import android.net.NetworkStats.SET_DEFAULT +import android.net.NetworkStats.SET_FOREGROUND +import android.net.NetworkStats.TAG_NONE +import android.os.Build +import androidx.test.filters.SmallTest +import com.android.testutils.DevSdkIgnoreRule +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo +import com.android.testutils.assertFieldCountEquals +import com.android.testutils.assertNetworkStatsEquals +import com.android.testutils.assertParcelingIsLossless +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import kotlin.test.assertEquals + +@RunWith(JUnit4::class) +@SmallTest +class NetworkStatsApiTest { + @Rule + @JvmField + val ignoreRule = DevSdkIgnoreRule() + + private val testStatsEmpty = NetworkStats(0L, 0) + + // stats1 and stats2 will have some entries with common keys, which are expected to + // be merged if performing add on these 2 stats. + private val testStats1 = NetworkStats(0L, 0) + // Entries which only appear in set1. + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, 20, 3, 57, 40, 3)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_YES, DEFAULT_NETWORK_NO, 31, 7, 24, 5, 8)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_YES, ROAMING_NO, DEFAULT_NETWORK_NO, 25, 3, 47, 8, 2)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_FOREGROUND, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 37, 52, 1, 10, 4)) + // Entries which are common for set1 and set2. + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 101, 2, 103, 4, 5)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, 0x80, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 17, 2, 11, 1, 0)) + .addEntry(Entry(TEST_IFACE, TEST_UID2, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 40, 1, 0, 0, 8)) + .addEntry(Entry(IFACE_VT, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 3, 1, 6, 2, 0)) + + private val testStats2 = NetworkStats(0L, 0) + // Entries which are common for set1 and set2. + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, 0x80, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 3, 15, 2, 31, 1)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_FOREGROUND, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 13, 61, 10, 1, 45)) + .addEntry(Entry(TEST_IFACE, TEST_UID2, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 11, 2, 3, 4, 7)) + .addEntry(Entry(IFACE_VT, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 4, 3, 2, 1, 0)) + // Entry which only appears in set2. + .addEntry(Entry(IFACE_VT, TEST_UID2, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 2, 3, 7, 8, 0)) + + // This is a result of adding stats1 and stats2, while the merging of common key items is + // subject to test later, this should not be initialized with for a loop to add stats1 + // and stats2 above. + private val testStats3 = NetworkStats(0L, 9) + // Entries which are unique either in stats1 or stats2. + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 101, 2, 103, 4, 5)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_YES, DEFAULT_NETWORK_NO, 31, 7, 24, 5, 8)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_YES, ROAMING_NO, DEFAULT_NETWORK_NO, 25, 3, 47, 8, 2)) + .addEntry(Entry(IFACE_VT, TEST_UID2, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 2, 3, 7, 8, 0)) + // Entries which are common for stats1 and stats2 are being merged. + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, 20, 3, 57, 40, 3)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, 0x80, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 20, 17, 13, 32, 1)) + .addEntry(Entry(TEST_IFACE, TEST_UID1, SET_FOREGROUND, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 50, 113, 11, 11, 49)) + .addEntry(Entry(TEST_IFACE, TEST_UID2, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 51, 3, 3, 4, 15)) + .addEntry(Entry(IFACE_VT, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 7, 4, 8, 3, 0)) + + companion object { + private const val TEST_IFACE = "test0" + private const val TEST_UID1 = 1001 + private const val TEST_UID2 = 1002 + } + + @Before + fun setUp() { + assertEquals(8, testStats1.size()) + assertEquals(5, testStats2.size()) + assertEquals(9, testStats3.size()) + } + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testAddEntry() { + val expectedEntriesInStats2 = arrayOf( + Entry(TEST_IFACE, TEST_UID1, SET_DEFAULT, 0x80, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 3, 15, 2, 31, 1), + Entry(TEST_IFACE, TEST_UID1, SET_FOREGROUND, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 13, 61, 10, 1, 45), + Entry(TEST_IFACE, TEST_UID2, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 11, 2, 3, 4, 7), + Entry(IFACE_VT, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 4, 3, 2, 1, 0), + Entry(IFACE_VT, TEST_UID2, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 2, 3, 7, 8, 0)) + + // While testStats* are already initialized with addEntry, verify content added + // matches expectation. + for (i in expectedEntriesInStats2.indices) { + val entry = testStats2.getValues(i, null) + assertEquals(expectedEntriesInStats2[i], entry) + } + + // Verify entry updated with addEntry. + val stats = testStats2.addEntry(Entry(IFACE_VT, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 12, -5, 7, 0, 9)) + assertEquals(Entry(IFACE_VT, TEST_UID1, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 16, -2, 9, 1, 9), + stats.getValues(3, null)) + } + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testAdd() { + var stats = NetworkStats(0L, 0) + assertNetworkStatsEquals(testStatsEmpty, stats) + stats = stats.add(testStats2) + assertNetworkStatsEquals(testStats2, stats) + stats = stats.add(testStats1) + // EMPTY + STATS2 + STATS1 = STATS3 + assertNetworkStatsEquals(testStats3, stats) + } + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testParcelUnparcel() { + assertParcelingIsLossless(testStatsEmpty) + assertParcelingIsLossless(testStats1) + assertParcelingIsLossless(testStats2) + assertFieldCountEquals(15, NetworkStats::class.java) + } + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testDescribeContents() { + assertEquals(0, testStatsEmpty.describeContents()) + assertEquals(0, testStats1.describeContents()) + assertEquals(0, testStats2.describeContents()) + assertEquals(0, testStats3.describeContents()) + } + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testSubtract() { + // STATS3 - STATS2 = STATS1 + assertNetworkStatsEquals(testStats1, testStats3.subtract(testStats2)) + // STATS3 - STATS1 = STATS2 + assertNetworkStatsEquals(testStats2, testStats3.subtract(testStats1)) + } + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testMethodsDontModifyReceiver() { + listOf(testStatsEmpty, testStats1, testStats2, testStats3).forEach { + val origStats = it.clone() + it.addEntry(Entry(TEST_IFACE, TEST_UID1, SET_FOREGROUND, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 13, 61, 10, 1, 45)) + it.add(testStats3) + it.subtract(testStats1) + assertNetworkStatsEquals(origStats, it) + } + } +}
\ No newline at end of file diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java index e71d5995255d..98f705f45e98 100644 --- a/tests/net/java/android/net/NetworkStatsTest.java +++ b/tests/net/java/android/net/NetworkStatsTest.java @@ -503,6 +503,53 @@ public class NetworkStatsTest { } @Test + public void testRemoveEmptyEntries() throws Exception { + // Test empty stats. + final NetworkStats statsEmpty = new NetworkStats(TEST_START, 3); + assertEquals(0, statsEmpty.removeEmptyEntries().size()); + + // Test stats with non-zero entry. + final NetworkStats statsNonZero = new NetworkStats(TEST_START, 1) + .insertEntry(TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO, + ROAMING_NO, DEFAULT_NETWORK_NO, 1L, 128L, 0L, 2L, 20L); + assertEquals(1, statsNonZero.size()); + final NetworkStats expectedNonZero = statsNonZero.removeEmptyEntries(); + assertEquals(1, expectedNonZero.size()); + assertValues(expectedNonZero, 0, TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO, + ROAMING_NO, DEFAULT_NETWORK_NO, 1L, 128L, 0L, 2L, 20L); + + // Test stats with empty entry. + final NetworkStats statsZero = new NetworkStats(TEST_START, 1) + .insertEntry(TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO, + ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L); + assertEquals(1, statsZero.size()); + final NetworkStats expectedZero = statsZero.removeEmptyEntries(); + assertEquals(1, statsZero.size()); // Assert immutable. + assertEquals(0, expectedZero.size()); + + // Test stats with multiple entries. + final NetworkStats statsMultiple = new NetworkStats(TEST_START, 0) + .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 2L, 64L, 0L, 2L, 20L) + .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 4L, 32L, 0L, 0L, 0L) + .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 0L, 0L) + .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 0L, 0L) + .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L) + .insertEntry(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 0L, 8L, 0L, 0L, 0L) + .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 4L, 0L, 0L) + .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 2L, 0L) + .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 0L, 1L); + assertEquals(9, statsMultiple.size()); + final NetworkStats expectedMultiple = statsMultiple.removeEmptyEntries(); + assertEquals(9, statsMultiple.size()); // Assert immutable. + assertEquals(7, expectedMultiple.size()); + assertValues(expectedMultiple.getTotalIncludingTags(null), 14L, 104L, 4L, 4L, 21L); + + // Test stats with multiple empty entries. + assertEquals(statsMultiple.size(), statsMultiple.subtract(statsMultiple).size()); + assertEquals(0, statsMultiple.subtract(statsMultiple).removeEmptyEntries().size()); + } + + @Test public void testClone() throws Exception { final NetworkStats original = new NetworkStats(TEST_START, 5) .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index b02398d1f1f5..912a27f08f30 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -6336,6 +6336,7 @@ public class ConnectivityServiceTest { LinkProperties lp = new LinkProperties(); lp.setInterfaceName("tun0"); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); + lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); // The uid range needs to cover the test app so the network is visible to it. final Set<UidRange> vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, vpnRange); @@ -6361,6 +6362,7 @@ public class ConnectivityServiceTest { public void testLegacyVpnDoesNotResultInInterfaceFilteringRule() throws Exception { LinkProperties lp = new LinkProperties(); lp.setInterfaceName("tun0"); + lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final Set<UidRange> vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); @@ -6392,6 +6394,7 @@ public class ConnectivityServiceTest { LinkProperties lp = new LinkProperties(); lp.setInterfaceName("tun0"); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); + lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final Set<UidRange> vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, vpnRange); @@ -6428,6 +6431,7 @@ public class ConnectivityServiceTest { reset(mMockNetd); lp = new LinkProperties(); lp.setInterfaceName("tun1"); + lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); vpnNetworkAgent.sendLinkProperties(lp); waitForIdle(); @@ -6440,6 +6444,7 @@ public class ConnectivityServiceTest { public void testUidUpdateChangesInterfaceFilteringRule() throws Exception { LinkProperties lp = new LinkProperties(); lp.setInterfaceName("tun0"); + lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final UidRange vpnRange = UidRange.createForUser(VPN_USER); diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp index 1387bb5f7bc6..526876f5ec26 100644 --- a/tools/stats_log_api_gen/Collation.cpp +++ b/tools/stats_log_api_gen/Collation.cpp @@ -50,7 +50,7 @@ AtomDecl::AtomDecl(const AtomDecl& that) primaryFields(that.primaryFields), exclusiveField(that.exclusiveField), defaultState(that.defaultState), - resetState(that.resetState), + triggerStateReset(that.triggerStateReset), nested(that.nested), uidField(that.uidField), whitelisted(that.whitelisted), @@ -153,7 +153,8 @@ void collate_enums(const EnumDescriptor& enumDescriptor, AtomField* atomField) { } static void addAnnotationToAtomDecl(AtomDecl* atomDecl, const int fieldNumber, - const int annotationId, const AnnotationType annotationType, + const AnnotationId annotationId, + const AnnotationType annotationType, const AnnotationValue annotationValue) { if (dbg) { printf(" Adding annotation to %s: [%d] = {id: %d, type: %d}\n", atomDecl->name.c_str(), @@ -168,23 +169,35 @@ static int collate_field_annotations(AtomDecl* atomDecl, const FieldDescriptor* int errorCount = 0; if (field->options().HasExtension(os::statsd::state_field_option)) { - const int option = field->options().GetExtension(os::statsd::state_field_option).option(); - if (option != STATE_OPTION_UNSET) { - addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_STATE_OPTION, - ANNOTATION_TYPE_INT, AnnotationValue(option)); + const os::statsd::StateAtomFieldOption& stateFieldOption = + field->options().GetExtension(os::statsd::state_field_option); + const bool primaryField = stateFieldOption.primary_field(); + const bool exclusiveState = stateFieldOption.exclusive_state(); + const bool primaryFieldFirstUid = stateFieldOption.primary_field_first_uid(); + + // Check the field is only one of primaryField, exclusiveState, or primaryFieldFirstUid. + if (primaryField + primaryFieldFirstUid + exclusiveState > 1) { + print_error(field, + "Field can be max 1 of primary_field, exclusive_state, " + "or primary_field_first_uid: '%s'\n", + atomDecl->message.c_str()); + errorCount++; } - if (option == STATE_OPTION_PRIMARY) { + if (primaryField) { if (javaType == JAVA_TYPE_UNKNOWN || javaType == JAVA_TYPE_ATTRIBUTION_CHAIN || javaType == JAVA_TYPE_OBJECT || javaType == JAVA_TYPE_BYTE_ARRAY) { print_error(field, "Invalid primary state field: '%s'\n", atomDecl->message.c_str()); errorCount++; + } else { + atomDecl->primaryFields.push_back(fieldNumber); + addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_PRIMARY_FIELD, + ANNOTATION_TYPE_BOOL, AnnotationValue(true)); } - atomDecl->primaryFields.push_back(fieldNumber); } - if (option == STATE_OPTION_PRIMARY_FIELD_FIRST_UID) { + if (primaryFieldFirstUid) { if (javaType != JAVA_TYPE_ATTRIBUTION_CHAIN) { print_error(field, "PRIMARY_FIELD_FIRST_UID annotation is only for AttributionChains: " @@ -193,10 +206,13 @@ static int collate_field_annotations(AtomDecl* atomDecl, const FieldDescriptor* errorCount++; } else { atomDecl->primaryFields.push_back(FIRST_UID_IN_CHAIN_ID); + addAnnotationToAtomDecl(atomDecl, fieldNumber, + ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, ANNOTATION_TYPE_BOOL, + AnnotationValue(true)); } } - if (option == STATE_OPTION_EXCLUSIVE) { + if (exclusiveState) { if (javaType == JAVA_TYPE_UNKNOWN || javaType == JAVA_TYPE_ATTRIBUTION_CHAIN || javaType == JAVA_TYPE_OBJECT || javaType == JAVA_TYPE_BYTE_ARRAY) { print_error(field, "Invalid exclusive state field: '%s'\n", @@ -204,43 +220,36 @@ static int collate_field_annotations(AtomDecl* atomDecl, const FieldDescriptor* errorCount++; } - if (atomDecl->exclusiveField == 0) { - atomDecl->exclusiveField = fieldNumber; - } else { + if (atomDecl->exclusiveField != 0) { print_error(field, "Cannot have more than one exclusive state field in an " "atom: '%s'\n", atomDecl->message.c_str()); errorCount++; + } else { + atomDecl->exclusiveField = fieldNumber; + addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_EXCLUSIVE_STATE, + ANNOTATION_TYPE_BOOL, AnnotationValue(true)); } - if (field->options() - .GetExtension(os::statsd::state_field_option) - .has_default_state_value()) { - const int defaultState = field->options() - .GetExtension(os::statsd::state_field_option) - .default_state_value(); + if (stateFieldOption.has_default_state_value()) { + const int defaultState = stateFieldOption.default_state_value(); atomDecl->defaultState = defaultState; addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_DEFAULT_STATE, ANNOTATION_TYPE_INT, AnnotationValue(defaultState)); } - if (field->options() - .GetExtension(os::statsd::state_field_option) - .has_reset_state_value()) { - const int resetState = field->options() - .GetExtension(os::statsd::state_field_option) - .reset_state_value(); + if (stateFieldOption.has_trigger_state_reset_value()) { + const int triggerStateReset = stateFieldOption.trigger_state_reset_value(); - atomDecl->resetState = resetState; - addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_RESET_STATE, - ANNOTATION_TYPE_INT, AnnotationValue(resetState)); + atomDecl->triggerStateReset = triggerStateReset; + addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_TRIGGER_STATE_RESET, + ANNOTATION_TYPE_INT, AnnotationValue(triggerStateReset)); } - if (field->options().GetExtension(os::statsd::state_field_option).has_nested()) { - const bool nested = - field->options().GetExtension(os::statsd::state_field_option).nested(); + if (stateFieldOption.has_nested()) { + const bool nested = stateFieldOption.nested(); atomDecl->nested = nested; addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_STATE_NESTED, diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h index b1cf1347a98d..d56f2be7ecb3 100644 --- a/tools/stats_log_api_gen/Collation.h +++ b/tools/stats_log_api_gen/Collation.h @@ -18,6 +18,7 @@ #define ANDROID_STATS_LOG_API_GEN_COLLATION_H #include <google/protobuf/descriptor.h> +#include <stdint.h> #include <map> #include <set> @@ -40,17 +41,16 @@ const int PULL_ATOM_START_ID = 10000; const int FIRST_UID_IN_CHAIN_ID = 0; -const unsigned char ANNOTATION_ID_IS_UID = 1; -const unsigned char ANNOTATION_ID_TRUNCATE_TIMESTAMP = 2; -const unsigned char ANNOTATION_ID_STATE_OPTION = 3; -const unsigned char ANNOTATION_ID_DEFAULT_STATE = 4; -const unsigned char ANNOTATION_ID_RESET_STATE = 5; -const unsigned char ANNOTATION_ID_STATE_NESTED = 6; - -const int STATE_OPTION_UNSET = os::statsd::StateField::STATE_FIELD_UNSET; -const int STATE_OPTION_EXCLUSIVE = os::statsd::StateField::EXCLUSIVE_STATE; -const int STATE_OPTION_PRIMARY_FIELD_FIRST_UID = os::statsd::StateField::PRIMARY_FIELD_FIRST_UID; -const int STATE_OPTION_PRIMARY = os::statsd::StateField::PRIMARY_FIELD; +enum AnnotationId : uint8_t { + ANNOTATION_ID_IS_UID = 1, + ANNOTATION_ID_TRUNCATE_TIMESTAMP = 2, + ANNOTATION_ID_PRIMARY_FIELD = 3, + ANNOTATION_ID_EXCLUSIVE_STATE = 4, + ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID = 5, + ANNOTATION_ID_DEFAULT_STATE = 6, + ANNOTATION_ID_TRIGGER_STATE_RESET = 7, + ANNOTATION_ID_STATE_NESTED = 8, +}; const int ATOM_ID_FIELD_NUMBER = -1; @@ -93,12 +93,12 @@ union AnnotationValue { }; struct Annotation { - const unsigned char annotationId; + const AnnotationId annotationId; const int atomId; AnnotationType type; AnnotationValue value; - inline Annotation(unsigned char annotationId, int atomId, AnnotationType type, + inline Annotation(AnnotationId annotationId, int atomId, AnnotationType type, AnnotationValue value) : annotationId(annotationId), atomId(atomId), type(type), value(value) { } @@ -159,7 +159,7 @@ struct AtomDecl { vector<int> primaryFields; int exclusiveField = 0; int defaultState = INT_MAX; - int resetState = INT_MAX; + int triggerStateReset = INT_MAX; bool nested; int uidField = 0; diff --git a/tools/stats_log_api_gen/atoms_info_writer.cpp b/tools/stats_log_api_gen/atoms_info_writer.cpp index 862fed4656b4..23a0f7278271 100644 --- a/tools/stats_log_api_gen/atoms_info_writer.cpp +++ b/tools/stats_log_api_gen/atoms_info_writer.cpp @@ -151,8 +151,8 @@ static void write_atoms_info_cpp_body(FILE* out, const Atoms& atoms) { fprintf(out, " opt->defaultState = UNSET_VALUE;\n"); } - if ((*atomIt)->resetState != INT_MAX) { - fprintf(out, " opt->resetState = %d;\n", (*atomIt)->resetState); + if ((*atomIt)->triggerStateReset != INT_MAX) { + fprintf(out, " opt->resetState = %d;\n", (*atomIt)->triggerStateReset); } else { fprintf(out, " opt->resetState = UNSET_VALUE;\n"); } diff --git a/tools/stats_log_api_gen/java_writer.cpp b/tools/stats_log_api_gen/java_writer.cpp index 54c5b9059fb0..556cf5e12d01 100644 --- a/tools/stats_log_api_gen/java_writer.cpp +++ b/tools/stats_log_api_gen/java_writer.cpp @@ -63,11 +63,10 @@ static void write_annotations(FILE* out, int argIndex, int resetState = -1; int defaultState = -1; for (const shared_ptr<Annotation>& annotation : annotations) { - const string& annotationConstant = - ANNOTATION_ID_CONSTANTS.at(annotation->annotationId); + const string& annotationConstant = ANNOTATION_ID_CONSTANTS.at(annotation->annotationId); switch (annotation->type) { case ANNOTATION_TYPE_INT: - if (ANNOTATION_ID_RESET_STATE == annotation->annotationId) { + if (ANNOTATION_ID_TRIGGER_STATE_RESET == annotation->annotationId) { resetState = annotation->value.intValue; } else if (ANNOTATION_ID_DEFAULT_STATE == annotation->annotationId) { defaultState = annotation->value.intValue; @@ -87,7 +86,7 @@ static void write_annotations(FILE* out, int argIndex, } if (defaultState != -1 && resetState != -1) { const string& annotationConstant = - ANNOTATION_ID_CONSTANTS.at(ANNOTATION_ID_RESET_STATE); + ANNOTATION_ID_CONSTANTS.at(ANNOTATION_ID_TRIGGER_STATE_RESET); fprintf(out, " if (arg%d == %d) {\n", argIndex, resetState); fprintf(out, " builder.addIntAnnotation(%s, %d);\n", annotationConstant.c_str(), defaultState); diff --git a/tools/stats_log_api_gen/native_writer.cpp b/tools/stats_log_api_gen/native_writer.cpp index d8db62087f8f..0c6c0099e459 100644 --- a/tools/stats_log_api_gen/native_writer.cpp +++ b/tools/stats_log_api_gen/native_writer.cpp @@ -30,7 +30,6 @@ static void write_native_annotation_constants(FILE* out) { fprintf(out, "\n"); } - static void write_annotations(FILE* out, int argIndex, const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet, const string& methodPrefix, const string& methodSuffix) { @@ -47,11 +46,10 @@ static void write_annotations(FILE* out, int argIndex, int resetState = -1; int defaultState = -1; for (const shared_ptr<Annotation>& annotation : annotations) { - const string& annotationConstant = - ANNOTATION_ID_CONSTANTS.at(annotation->annotationId); + const string& annotationConstant = ANNOTATION_ID_CONSTANTS.at(annotation->annotationId); switch (annotation->type) { case ANNOTATION_TYPE_INT: - if (ANNOTATION_ID_RESET_STATE == annotation->annotationId) { + if (ANNOTATION_ID_TRIGGER_STATE_RESET == annotation->annotationId) { resetState = annotation->value.intValue; } else if (ANNOTATION_ID_DEFAULT_STATE == annotation->annotationId) { defaultState = annotation->value.intValue; @@ -74,7 +72,7 @@ static void write_annotations(FILE* out, int argIndex, } if (defaultState != -1 && resetState != -1) { const string& annotationConstant = - ANNOTATION_ID_CONSTANTS.at(ANNOTATION_ID_RESET_STATE); + ANNOTATION_ID_CONSTANTS.at(ANNOTATION_ID_TRIGGER_STATE_RESET); fprintf(out, " if (arg%d == %d) {\n", argIndex, resetState); fprintf(out, " %saddInt32Annotation(%s%s, %d);\n", methodPrefix.c_str(), methodSuffix.c_str(), annotationConstant.c_str(), defaultState); diff --git a/tools/stats_log_api_gen/test.proto b/tools/stats_log_api_gen/test.proto index 480442fe9d3d..d22acc6e6598 100644 --- a/tools/stats_log_api_gen/test.proto +++ b/tools/stats_log_api_gen/test.proto @@ -149,42 +149,42 @@ message GoodStateAtoms { // The atom has only primary field but no exclusive state field. message BadStateAtom1 { - optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY_FIELD]; + optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true]; } // Only primative types can be annotated. message BadStateAtom2 { repeated android.os.statsd.AttributionNode attribution = 1 - [(android.os.statsd.state_field_option).option = PRIMARY_FIELD]; - optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE_STATE]; + [(android.os.statsd.state_field_option).primary_field = true]; + optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true]; } // Having 2 exclusive state field in the atom means the atom is badly designed. // E.g., putting bluetooth state and wifi state in the same atom. message BadStateAtom3 { - optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY_FIELD]; - optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE_STATE]; - optional int32 state2 = 3 [(android.os.statsd.state_field_option).option = EXCLUSIVE_STATE]; + optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true]; + optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true]; + optional int32 state2 = 3 [(android.os.statsd.state_field_option).exclusive_state = true]; } message GoodStateAtom1 { - optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY_FIELD]; - optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE_STATE]; + optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true]; + optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true]; } // Atoms can have exclusive state field, but no primary field. That means // the state is globally exclusive (e.g., DisplayState). message GoodStateAtom2 { optional int32 uid = 1; - optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE_STATE]; + optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true]; } // We can have more than one primary fields. That means their combination is a // primary key. message GoodStateAtom3 { - optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY_FIELD]; - optional int32 tid = 2 [(android.os.statsd.state_field_option).option = PRIMARY_FIELD]; - optional int32 state = 3 [(android.os.statsd.state_field_option).option = EXCLUSIVE_STATE]; + optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true]; + optional int32 tid = 2 [(android.os.statsd.state_field_option).primary_field = true]; + optional int32 state = 3 [(android.os.statsd.state_field_option).exclusive_state = true]; } message WhitelistedAtom { @@ -214,7 +214,7 @@ message ModuleTwoAtom { } message ModuleOneAndTwoAtom { - optional int32 field = 1 [(android.os.statsd.state_field_option).option = EXCLUSIVE_STATE]; + optional int32 field = 1 [(android.os.statsd.state_field_option).exclusive_state = true]; } message NoModuleAtom { diff --git a/tools/stats_log_api_gen/test_collation.cpp b/tools/stats_log_api_gen/test_collation.cpp index c654a1b03051..150475223bfa 100644 --- a/tools/stats_log_api_gen/test_collation.cpp +++ b/tools/stats_log_api_gen/test_collation.cpp @@ -308,10 +308,10 @@ TEST(CollationTest, RecognizeModuleAtom) { EXPECT_EQ(1ul, annotationSet->size()); annotationSetIt = annotationSet->begin(); annotation = annotationSetIt->get(); - EXPECT_EQ(ANNOTATION_ID_STATE_OPTION, annotation->annotationId); + EXPECT_EQ(ANNOTATION_ID_EXCLUSIVE_STATE, annotation->annotationId); EXPECT_EQ(3, annotation->atomId); - EXPECT_EQ(ANNOTATION_TYPE_INT, annotation->type); - EXPECT_EQ(os::statsd::StateField::EXCLUSIVE_STATE, annotation->value.intValue); + EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type); + EXPECT_TRUE(annotation->value.boolValue); signatureInfoMapIt++; signature = &signatureInfoMapIt->first; @@ -378,10 +378,10 @@ TEST(CollationTest, RecognizeModule1Atom) { EXPECT_EQ(1ul, annotationSet->size()); annotationSetIt = annotationSet->begin(); annotation = annotationSetIt->get(); - EXPECT_EQ(ANNOTATION_ID_STATE_OPTION, annotation->annotationId); + EXPECT_EQ(ANNOTATION_ID_EXCLUSIVE_STATE, annotation->annotationId); EXPECT_EQ(3, annotation->atomId); - EXPECT_EQ(ANNOTATION_TYPE_INT, annotation->type); - EXPECT_EQ(os::statsd::StateField::EXCLUSIVE_STATE, annotation->value.intValue); + EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type); + EXPECT_TRUE(annotation->value.boolValue); } } // namespace stats_log_api_gen diff --git a/tools/stats_log_api_gen/utils.h b/tools/stats_log_api_gen/utils.h index 1f644426ffa9..7d6d08ebbcbe 100644 --- a/tools/stats_log_api_gen/utils.h +++ b/tools/stats_log_api_gen/utils.h @@ -38,13 +38,14 @@ const int JAVA_MODULE_REQUIRES_FLOAT = 0x01; const int JAVA_MODULE_REQUIRES_ATTRIBUTION = 0x02; const int JAVA_MODULE_REQUIRES_KEY_VALUE_PAIRS = 0x04; -const map<unsigned char, string> ANNOTATION_ID_CONSTANTS = { - { ANNOTATION_ID_IS_UID, "ANNOTATION_ID_IS_UID" }, - { ANNOTATION_ID_TRUNCATE_TIMESTAMP, "ANNOTATION_ID_TRUNCATE_TIMESTAMP" }, - { ANNOTATION_ID_STATE_OPTION, "ANNOTATION_ID_STATE_OPTION" }, - { ANNOTATION_ID_RESET_STATE, "ANNOTATION_ID_RESET_STATE" }, - { ANNOTATION_ID_STATE_NESTED, "ANNOTATION_ID_STATE_NESTED" } -}; +const map<AnnotationId, string> ANNOTATION_ID_CONSTANTS = { + {ANNOTATION_ID_IS_UID, "ANNOTATION_ID_IS_UID"}, + {ANNOTATION_ID_TRUNCATE_TIMESTAMP, "ANNOTATION_ID_TRUNCATE_TIMESTAMP"}, + {ANNOTATION_ID_PRIMARY_FIELD, "ANNOTATION_ID_PRIMARY_FIELD"}, + {ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, "ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID"}, + {ANNOTATION_ID_EXCLUSIVE_STATE, "ANNOTATION_ID_EXCLUSIVE_STATE"}, + {ANNOTATION_ID_TRIGGER_STATE_RESET, "ANNOTATION_ID_TRIGGER_STATE_RESET"}, + {ANNOTATION_ID_STATE_NESTED, "ANNOTATION_ID_STATE_NESTED"}}; string make_constant_name(const string& str); diff --git a/wifi/java/android/net/wifi/EasyConnectStatusCallback.java b/wifi/java/android/net/wifi/EasyConnectStatusCallback.java index de2f5d9a3fe4..6c2e6ddf5dd2 100644 --- a/wifi/java/android/net/wifi/EasyConnectStatusCallback.java +++ b/wifi/java/android/net/wifi/EasyConnectStatusCallback.java @@ -42,7 +42,7 @@ public abstract class EasyConnectStatusCallback { public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 0; /** - * East Connect R2 Success event: Configuration applied by Enrollee (Configurator mode). + * Easy Connect R2 Success event: Configuration applied by Enrollee (Configurator mode). * This is the last and final Easy Connect event when both the local device and remote device * implement R2. If either the local device or remote device implement R1, this event will never * be received, and the {@link #EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT} will be received. diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index dfeea9f4b52e..f1be8b20eb53 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -1887,12 +1887,20 @@ public class WifiManager { * <li> If user reset network settings, all added suggestions will be discarded. Apps can use * {@link #getNetworkSuggestions()} to check if their suggestions are in the device.</li> * <li> In-place modification of existing suggestions are allowed. - * If the provided suggestions {@link WifiNetworkSuggestion#equals(Object)} any previously - * provided suggestions by the app. Previous suggestions will be updated</li> + * <li>If the provided suggestions includes any previously provided suggestions by the app, + * previous suggestions will be updated.</li> + * <li>If one of the provided suggestions marks a previously unmetered suggestion as metered and + * the device is currently connected to that suggested network, then the device will disconnect + * from that network. The system will immediately re-evaluate all the network candidates + * and possibly reconnect back to the same suggestion. This disconnect is to make sure that any + * traffic flowing over unmetered networks isn't accidentally continued over a metered network. + * </li> + * </li> * * @param networkSuggestions List of network suggestions provided by the app. * @return Status code for the operation. One of the STATUS_NETWORK_SUGGESTIONS_ values. * @throws {@link SecurityException} if the caller is missing required permissions. + * @see WifiNetworkSuggestion#equals(Object) */ @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public @NetworkSuggestionsStatusCode int addNetworkSuggestions( @@ -4152,6 +4160,10 @@ public class WifiManager { * * This function is used instead of a enableNetwork() and reconnect() * + * <li> This API will cause reconnect if the credentials of the current active + * connection has been changed.</li> + * <li> This API will cause reconnect if the current active connection is marked metered.</li> + * * @param networkId the ID of the network as returned by {@link #addNetwork} or {@link * getConfiguredNetworks}. * @param listener for callbacks on success or failure. Can be null. @@ -4180,8 +4192,9 @@ public class WifiManager { * * For an existing network, it accomplishes the task of updateNetwork() * - * This API will cause reconnect if the crecdentials of the current active - * connection has been changed. + * <li> This API will cause reconnect if the credentials of the current active + * connection has been changed.</li> + * <li> This API will cause disconnect if the current active connection is marked metered.</li> * * @param config the set of variables that describe the configuration, * contained in a {@link WifiConfiguration} object. diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java index 4c524f49e4df..cedf9b0b872d 100644 --- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java +++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java @@ -543,7 +543,7 @@ public final class WifiNetworkSuggestion implements Parcelable { wifiConfiguration.priority = mPriority; wifiConfiguration.meteredOverride = mIsMetered ? WifiConfiguration.METERED_OVERRIDE_METERED - : WifiConfiguration.METERED_OVERRIDE_NONE; + : WifiConfiguration.METERED_OVERRIDE_NOT_METERED; wifiConfiguration.carrierId = mCarrierId; wifiConfiguration.trusted = !mIsNetworkUntrusted; return wifiConfiguration; diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java index ac2f6b26aa00..aca190910ed1 100644 --- a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java +++ b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java @@ -56,7 +56,7 @@ public class WifiNetworkSuggestionTest { .get(WifiConfiguration.KeyMgmt.NONE)); assertTrue(suggestion.isAppInteractionRequired); assertFalse(suggestion.isUserInteractionRequired); - assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE, + assertEquals(WifiConfiguration.METERED_OVERRIDE_NOT_METERED, suggestion.wifiConfiguration.meteredOverride); assertEquals(-1, suggestion.wifiConfiguration.priority); assertFalse(suggestion.isUserAllowedToManuallyConnect); @@ -86,7 +86,7 @@ public class WifiNetworkSuggestionTest { suggestion.wifiConfiguration.preSharedKey); assertTrue(suggestion.isAppInteractionRequired); assertFalse(suggestion.isUserInteractionRequired); - assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE, + assertEquals(WifiConfiguration.METERED_OVERRIDE_NOT_METERED, suggestion.wifiConfiguration.meteredOverride); assertEquals(0, suggestion.wifiConfiguration.priority); assertFalse(suggestion.isUserAllowedToManuallyConnect); |