diff options
462 files changed, 7678 insertions, 4137 deletions
diff --git a/api/current.txt b/api/current.txt index 3ec7f447e8b9..9c90ee67cdf7 100644 --- a/api/current.txt +++ b/api/current.txt @@ -47843,6 +47843,7 @@ package android.util { field public static final int DENSITY_400 = 400; // 0x190 field public static final int DENSITY_420 = 420; // 0x1a4 field public static final int DENSITY_440 = 440; // 0x1b8 + field public static final int DENSITY_450 = 450; // 0x1c2 field public static final int DENSITY_560 = 560; // 0x230 field public static final int DENSITY_600 = 600; // 0x258 field public static final int DENSITY_DEFAULT = 160; // 0xa0 diff --git a/api/test-current.txt b/api/test-current.txt index 1a912a1c69b1..be92106e119e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -646,6 +646,7 @@ package android.content { method public void setContentCaptureOptions(@Nullable android.content.ContentCaptureOptions); field public static final String BUGREPORT_SERVICE = "bugreport"; field public static final String CONTENT_CAPTURE_MANAGER_SERVICE = "content_capture"; + field public static final String PERMISSION_SERVICE = "permission"; field public static final String ROLLBACK_SERVICE = "rollback"; field public static final String STATUS_BAR_SERVICE = "statusbar"; field public static final String TEST_NETWORK_SERVICE = "test_network"; @@ -2214,6 +2215,18 @@ package android.permission { method public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>); } + public final class PermissionManager { + method @IntRange(from=0) @RequiresPermission("android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY") public int getRuntimePermissionsVersion(); + method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions(); + method @RequiresPermission("android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY") public void setRuntimePermissionsVersion(@IntRange(from=0) int); + } + + public static final class PermissionManager.SplitPermissionInfo { + method @NonNull public java.util.List<java.lang.String> getNewPermissions(); + method @NonNull public String getSplitPermission(); + method public int getTargetSdk(); + } + public final class RuntimePermissionPresentationInfo implements android.os.Parcelable { ctor public RuntimePermissionPresentationInfo(@NonNull CharSequence, boolean, boolean); method public int describeContents(); diff --git a/cmds/incident_helper/src/main.cpp b/cmds/incident_helper/src/main.cpp index 809a77163fb4..ff5fd86cf11e 100644 --- a/cmds/incident_helper/src/main.cpp +++ b/cmds/incident_helper/src/main.cpp @@ -72,6 +72,8 @@ static TextParserBase* selectParser(int section) { return new PsParser(); case 2006: return new BatteryTypeParser(); + case 3026: // system_trace is already a serialized protobuf + return new NoopParser(); default: // Return no op parser when no specific ones are implemented. return new NoopParser(); diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp index a8b99ceecd7f..a52726396b53 100644 --- a/cmds/incidentd/src/IncidentService.cpp +++ b/cmds/incidentd/src/IncidentService.cpp @@ -564,7 +564,8 @@ status_t IncidentService::dump(int fd, const Vector<String16>& args) { int skipped[] = SKIPPED_SECTIONS; for (const Section** section = SECTION_LIST; *section; section++) { const int id = (*section)->id; - if (std::find(std::begin(skipped), std::end(skipped), id) == std::end(skipped)) { + if (std::find(std::begin(skipped), std::end(skipped), id) == std::end(skipped) + && !section_requires_specific_mention(id)) { incidentArgs.addSection(id); } } diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp index 85c5a20174c3..1572114c639f 100644 --- a/cmds/incidentd/src/Section.cpp +++ b/cmds/incidentd/src/Section.cpp @@ -67,6 +67,8 @@ bool section_requires_specific_mention(int sectionId) { switch (sectionId) { case 3025: // restricted_images return true; + case 3026: // system_trace + return true; default: return false; } diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index ce75f78c04ea..f0db1b0128a1 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -272,6 +272,7 @@ private: FRIEND_TEST(MetricActivationE2eTest, TestCountMetric); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations); + FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithSameDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations); FRIEND_TEST(DurationMetricE2eTest, TestOneBucket); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 495a09f2e99a..e9208437ff07 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -303,6 +303,8 @@ message Atom { ContentCaptureSessionEvents content_capture_session_events = 208; ContentCaptureFlushed content_capture_flushed = 209; LocationManagerApiUsageReported location_manager_api_usage_reported = 210; + ReviewPermissionsFragmentResultReported review_permissions_fragment_result_reported + = 211 [(log_from_module) = "permissioncontroller"]; } // Pulled events will start at field 10000. @@ -6544,3 +6546,24 @@ message LocationManagerApiUsageReported { // Categorized to 3 types that are interesting from location's perspective. optional android.stats.location.ActivityImportance activiy_importance = 12; } + +/** + * Information about a permission grant or denial made by user inside ReviewPermissionsFragment + */ +message ReviewPermissionsFragmentResultReported { + // unique value identifying a permission group change. A permission group change might result + // in multiple of these atoms + optional int64 change_id = 1; + + // UID of package the permission belongs to + optional int32 uid = 2 [(is_uid) = true]; + + // Name of package the permission belongs to + optional string package_name = 3; + + // The permission to be granted + optional string permission_name = 4; + + // The result of the permission grant + optional bool permission_granted = 5; +} diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h index 8b39f5f3f37c..42d9e96c8cab 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.h +++ b/cmds/statsd/src/guardrail/StatsdStats.h @@ -170,6 +170,12 @@ public: // Vendor pulled atom start id. static const int32_t kVendorPulledAtomStartTag = 150000; + // Beginning of range for timestamp truncation. + static const int32_t kTimestampTruncationStartTag = 300000; + + // End of range for timestamp truncation. + static const int32_t kTimestampTruncationEndTag = 304999; + // Max accepted atom id. static const int32_t kMaxAtomTag = 200000; diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp index 69816cbbd92f..96133bd0a38d 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.cpp +++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp @@ -146,16 +146,9 @@ void EventMetricProducer::onMatchedLogEventInternalLocked( uint64_t wrapperToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA); - const bool truncateTimestamp = - android::util::AtomsInfo::kNotTruncatingTimestampAtomWhiteList.find(event.GetTagId()) == - android::util::AtomsInfo::kNotTruncatingTimestampAtomWhiteList.end(); - if (truncateTimestamp) { - mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS, - (long long)truncateTimestampNsToFiveMinutes(event.GetElapsedTimestampNs())); - } else { - mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS, - (long long)event.GetElapsedTimestampNs()); - } + const int64_t elapsedTimeNs = truncateTimestampIfNecessary( + event.GetTagId(), event.GetElapsedTimestampNs()); + mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS, (long long) elapsedTimeNs); uint64_t eventToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOMS); event.ToProto(*mProto); diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp index 7a87f0381676..a64bbc1056e0 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp @@ -283,14 +283,9 @@ void GaugeMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs, writeFieldValueTreeToStream(mAtomId, *(atom.mFields), protoOutput); protoOutput->end(atomsToken); } - const bool truncateTimestamp = - android::util::AtomsInfo::kNotTruncatingTimestampAtomWhiteList.find( - mAtomId) == - android::util::AtomsInfo::kNotTruncatingTimestampAtomWhiteList.end(); for (const auto& atom : bucket.mGaugeAtoms) { - const int64_t elapsedTimestampNs = truncateTimestamp ? - truncateTimestampNsToFiveMinutes(atom.mElapsedTimestamps) : - atom.mElapsedTimestamps; + const int64_t elapsedTimestampNs = + truncateTimestampIfNecessary(mAtomId, atom.mElapsedTimestamps); protoOutput->write( FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED | FIELD_ID_ELAPSED_ATOM_TIMESTAMP, (long long)elapsedTimestampNs); diff --git a/cmds/statsd/src/metrics/MetricProducer.cpp b/cmds/statsd/src/metrics/MetricProducer.cpp index 8cbc9c45ca27..92752b29ecda 100644 --- a/cmds/statsd/src/metrics/MetricProducer.cpp +++ b/cmds/statsd/src/metrics/MetricProducer.cpp @@ -124,7 +124,8 @@ void MetricProducer::addActivation(int activationTrackerIndex, const ActivationT std::make_shared<Activation>(activationType, ttl_seconds * NS_PER_SEC); mEventActivationMap.emplace(activationTrackerIndex, activation); if (-1 != deactivationTrackerIndex) { - mEventDeactivationMap.emplace(deactivationTrackerIndex, activation); + auto& deactivationList = mEventDeactivationMap[deactivationTrackerIndex]; + deactivationList.push_back(activation); } } @@ -155,7 +156,9 @@ void MetricProducer::cancelEventActivationLocked(int deactivationTrackerIndex) { if (it == mEventDeactivationMap.end()) { return; } - it->second->state = ActivationState::kNotActive; + for (auto activationToCancelIt : it->second) { + activationToCancelIt->state = ActivationState::kNotActive; + } } void MetricProducer::loadActiveMetricLocked(const ActiveMetric& activeMetric, @@ -171,7 +174,9 @@ void MetricProducer::loadActiveMetricLocked(const ActiveMetric& activeMetric, continue; } auto& activation = it->second; - if (activeEventActivation.state() == ActiveEventActivation::ACTIVE) { + // If the event activation does not have a state, assume it is active. + if (!activeEventActivation.has_state() || + activeEventActivation.state() == ActiveEventActivation::ACTIVE) { // We don't want to change the ttl for future activations, so we set the start_ns // such that start_ns + ttl_ns == currentTimeNs + remaining_ttl_nanos activation->start_ns = diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h index aa757618435c..09ad2903fa4c 100644 --- a/cmds/statsd/src/metrics/MetricProducer.h +++ b/cmds/statsd/src/metrics/MetricProducer.h @@ -407,8 +407,8 @@ protected: // whether the metric producer is ready to generate metrics. std::unordered_map<int, std::shared_ptr<Activation>> mEventActivationMap; - // Maps index of atom matcher for deactivation to Activation struct. - std::unordered_map<int, std::shared_ptr<Activation>> mEventDeactivationMap; + // Maps index of atom matcher for deactivation to a list of Activation structs. + std::unordered_map<int, std::vector<std::shared_ptr<Activation>>> mEventDeactivationMap; bool mIsActive; @@ -422,6 +422,7 @@ protected: FRIEND_TEST(MetricActivationE2eTest, TestCountMetric); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations); + FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithSameDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index 6fc2c1379645..8efca1e10de5 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -283,6 +283,7 @@ private: FRIEND_TEST(MetricActivationE2eTest, TestCountMetric); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations); + FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithSameDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index 01362b6b4fed..0e33a0f9f29b 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -109,7 +109,8 @@ ValueMetricProducer::ValueMetricProducer( mMaxPullDelayNs(metric.max_pull_delay_sec() > 0 ? metric.max_pull_delay_sec() * NS_PER_SEC : StatsdStats::kPullMaxDelayNs), mSplitBucketForAppUpgrade(metric.split_bucket_for_app_upgrade()), - mConditionTimer(mIsActive && mCondition == ConditionState::kTrue, timeBaseNs) { + // Condition timer will be set in prepareFirstBucketLocked. + mConditionTimer(false, timeBaseNs) { int64_t bucketSizeMills = 0; if (metric.has_bucket()) { bucketSizeMills = TimeUnitToBucketSizeInMillisGuardrailed(key.GetUid(), metric.bucket()); @@ -175,6 +176,9 @@ void ValueMetricProducer::prepareFirstBucketLocked() { if (mIsActive && mIsPulled && mCondition == ConditionState::kTrue && mUseDiff) { pullAndMatchEventsLocked(mCurrentBucketStartTimeNs, mCondition); } + // Now that activations are processed, start the condition timer if needed. + mConditionTimer.onConditionChanged(mIsActive && mCondition == ConditionState::kTrue, + mCurrentBucketStartTimeNs); } void ValueMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition, diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp index 31f160d99944..67625eb82454 100644 --- a/cmds/statsd/src/stats_log_util.cpp +++ b/cmds/statsd/src/stats_log_util.cpp @@ -545,8 +545,15 @@ int64_t getWallClockMillis() { return time(nullptr) * MS_PER_SEC; } -int64_t truncateTimestampNsToFiveMinutes(int64_t timestampNs) { - return timestampNs / NS_PER_SEC / (5 * 60) * NS_PER_SEC * (5 * 60); +int64_t truncateTimestampIfNecessary(int atomId, int64_t timestampNs) { + if (AtomsInfo::kTruncatingTimestampAtomBlackList.find(atomId) != + AtomsInfo::kTruncatingTimestampAtomBlackList.end() || + (atomId >= StatsdStats::kTimestampTruncationStartTag && + atomId <= StatsdStats::kTimestampTruncationEndTag)) { + return timestampNs / NS_PER_SEC / (5 * 60) * NS_PER_SEC * (5 * 60); + } else { + return timestampNs; + } } int64_t NanoToMillis(const int64_t nano) { diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h index 53dd5b792539..bfb84cf4d1b9 100644 --- a/cmds/statsd/src/stats_log_util.h +++ b/cmds/statsd/src/stats_log_util.h @@ -89,8 +89,9 @@ bool parseProtoOutputStream(util::ProtoOutputStream& protoOutput, T* message) { return message->ParseFromArray(pbBytes.c_str(), pbBytes.size()); } -// Returns the truncated timestamp. -int64_t truncateTimestampNsToFiveMinutes(int64_t timestampNs); +// Checks the blacklist of atoms as well as the blacklisted range of 300,000 - 304,999. +// Returns the truncated timestamp to the nearest 5 minutes if needed. +int64_t truncateTimestampIfNecessary(int atomId, int64_t timestampNs); inline bool isVendorPulledAtom(int atomId) { return atomId >= StatsdStats::kVendorPulledAtomStartTag && atomId < StatsdStats::kMaxAtomTag; diff --git a/cmds/statsd/tests/e2e/MetricActivation_e2e_test.cpp b/cmds/statsd/tests/e2e/MetricActivation_e2e_test.cpp index d99d281afc68..f1b6029f0ab0 100644 --- a/cmds/statsd/tests/e2e/MetricActivation_e2e_test.cpp +++ b/cmds/statsd/tests/e2e/MetricActivation_e2e_test.cpp @@ -134,6 +134,42 @@ StatsdConfig CreateStatsdConfigWithTwoDeactivations() { return config; } +StatsdConfig CreateStatsdConfigWithSameDeactivations() { + StatsdConfig config; + config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. + auto saverModeMatcher = CreateBatterySaverModeStartAtomMatcher(); + auto crashMatcher = CreateProcessCrashAtomMatcher(); + auto screenOnMatcher = CreateScreenTurnedOnAtomMatcher(); + auto brightnessChangedMatcher = CreateScreenBrightnessChangedAtomMatcher(); + + *config.add_atom_matcher() = saverModeMatcher; + *config.add_atom_matcher() = crashMatcher; + *config.add_atom_matcher() = screenOnMatcher; + *config.add_atom_matcher() = brightnessChangedMatcher; + + int64_t metricId = 123456; + auto countMetric = config.add_count_metric(); + countMetric->set_id(metricId); + countMetric->set_what(crashMatcher.id()); + countMetric->set_bucket(FIVE_MINUTES); + countMetric->mutable_dimensions_in_what()->set_field( + android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED); + countMetric->mutable_dimensions_in_what()->add_child()->set_field(1); // uid field + + auto metric_activation1 = config.add_metric_activation(); + metric_activation1->set_metric_id(metricId); + auto event_activation1 = metric_activation1->add_event_activation(); + event_activation1->set_atom_matcher_id(saverModeMatcher.id()); + event_activation1->set_ttl_seconds(60 * 6); // 6 minutes + event_activation1->set_deactivation_atom_matcher_id(brightnessChangedMatcher.id()); + auto event_activation2 = metric_activation1->add_event_activation(); + event_activation2->set_atom_matcher_id(screenOnMatcher.id()); + event_activation2->set_ttl_seconds(60 * 2); // 2 minutes + event_activation2->set_deactivation_atom_matcher_id(brightnessChangedMatcher.id()); + + return config; +} + StatsdConfig CreateStatsdConfigWithTwoMetricsTwoDeactivations() { StatsdConfig config; config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. @@ -467,7 +503,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); EXPECT_EQ(eventDeactivationMap.size(), 1u); EXPECT_TRUE(eventDeactivationMap.find(3) != eventDeactivationMap.end()); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3].size(), 1u); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); std::unique_ptr<LogEvent> event; @@ -491,7 +528,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, 0); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // First processed event. event = CreateAppCrashEvent(222, bucketStartTimeNs + 15); @@ -509,7 +546,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // 2nd processed event. // The activation by screen_on event expires, but the one by battery save mode is still active. @@ -523,7 +560,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // No new broadcast since the config should still be active. EXPECT_EQ(broadcastCount, 1); @@ -545,7 +582,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // Re-activate metric via screen on. event = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, @@ -562,7 +599,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // 4th processed event. event = CreateAppCrashEvent(666, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 1); @@ -582,7 +619,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // 5th processed event. event = CreateAppCrashEvent(777, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 40); @@ -602,7 +639,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // Screen-on activation expired. event = CreateAppCrashEvent(888, bucketStartTimeNs + NS_PER_SEC * 60 * 13); @@ -618,7 +655,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); event = CreateAppCrashEvent(999, bucketStartTimeNs + NS_PER_SEC * 60 * 14 + 1); processor.OnLogEvent(event.get()); @@ -637,7 +674,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); // Cancel battery saver mode activation. event = CreateScreenBrightnessChangedEvent(140, bucketStartTimeNs + NS_PER_SEC * 60 * 16); @@ -652,7 +689,7 @@ TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); ConfigMetricsReportList reports; vector<uint8_t> buffer; @@ -790,8 +827,10 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventDeactivationMap.size(), 2u); EXPECT_TRUE(eventDeactivationMap.find(3) != eventDeactivationMap.end()); EXPECT_TRUE(eventDeactivationMap.find(4) != eventDeactivationMap.end()); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3].size(), 1u); + EXPECT_EQ(eventDeactivationMap[4].size(), 1u); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); std::unique_ptr<LogEvent> event; @@ -815,8 +854,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, 0); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // First processed event. event = CreateAppCrashEvent(222, bucketStartTimeNs + 15); @@ -834,8 +873,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // 2nd processed event. // The activation by screen_on event expires, but the one by battery save mode is still active. @@ -849,8 +888,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // No new broadcast since the config should still be active. EXPECT_EQ(broadcastCount, 1); @@ -872,8 +911,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // Re-activate metric via screen on. event = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, @@ -890,8 +929,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // 4th processed event. event = CreateAppCrashEvent(666, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 1); @@ -911,8 +950,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // 5th processed event. event = CreateAppCrashEvent(777, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 40); @@ -932,8 +971,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // Screen-on activation expired. event = CreateAppCrashEvent(888, bucketStartTimeNs + NS_PER_SEC * 60 * 13); @@ -948,8 +987,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); event = CreateAppCrashEvent(999, bucketStartTimeNs + NS_PER_SEC * 60 * 14 + 1); processor.OnLogEvent(event.get()); @@ -968,8 +1007,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); // Cancel battery saver mode and screen on activation. event = CreateScreenBrightnessChangedEvent(140, bucketStartTimeNs + NS_PER_SEC * 60 * 16); @@ -984,8 +1023,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); ConfigMetricsReportList reports; vector<uint8_t> buffer; @@ -1066,6 +1105,203 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations) { data.bucket_info(0).end_bucket_elapsed_nanos()); } +TEST(MetricActivationE2eTest, TestCountMetricWithSameDeactivation) { + auto config = CreateStatsdConfigWithSameDeactivations(); + + int64_t bucketStartTimeNs = NS_PER_SEC * 10; // 10 secs + int64_t bucketSizeNs = + TimeUnitToBucketSizeInMillis(config.count_metric(0).bucket()) * 1000LL * 1000LL; + + int uid = 12345; + int64_t cfgId = 98765; + ConfigKey cfgKey(uid, cfgId); + + sp<UidMap> m = new UidMap(); + sp<StatsPullerManager> pullerManager = new StatsPullerManager(); + sp<AlarmMonitor> anomalyAlarmMonitor; + sp<AlarmMonitor> subscriberAlarmMonitor; + vector<int64_t> activeConfigsBroadcast; + + long timeBase1 = 1; + int broadcastCount = 0; + StatsLogProcessor processor(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, + bucketStartTimeNs, [](const ConfigKey& key) { return true; }, + [&uid, &broadcastCount, &activeConfigsBroadcast](const int& broadcastUid, + const vector<int64_t>& activeConfigs) { + broadcastCount++; + EXPECT_EQ(broadcastUid, uid); + activeConfigsBroadcast.clear(); + activeConfigsBroadcast.insert(activeConfigsBroadcast.end(), + activeConfigs.begin(), activeConfigs.end()); + return true; + }); + + processor.OnConfigUpdated(bucketStartTimeNs, cfgKey, config); + + EXPECT_EQ(processor.mMetricsManagers.size(), 1u); + sp<MetricsManager> metricsManager = processor.mMetricsManagers.begin()->second; + EXPECT_TRUE(metricsManager->isConfigValid()); + EXPECT_EQ(metricsManager->mAllMetricProducers.size(), 1); + sp<MetricProducer> metricProducer = metricsManager->mAllMetricProducers[0]; + auto& eventActivationMap = metricProducer->mEventActivationMap; + auto& eventDeactivationMap = metricProducer->mEventDeactivationMap; + + EXPECT_FALSE(metricsManager->isActive()); + EXPECT_FALSE(metricProducer->mIsActive); + // Two activations: one is triggered by battery saver mode (tracker index 0), the other is + // triggered by screen on event (tracker index 2). + EXPECT_EQ(eventActivationMap.size(), 2u); + EXPECT_TRUE(eventActivationMap.find(0) != eventActivationMap.end()); + EXPECT_TRUE(eventActivationMap.find(2) != eventActivationMap.end()); + EXPECT_EQ(eventActivationMap[0]->state, ActivationState::kNotActive); + EXPECT_EQ(eventActivationMap[0]->start_ns, 0); + EXPECT_EQ(eventActivationMap[0]->ttl_ns, 60 * 6 * NS_PER_SEC); + EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); + EXPECT_EQ(eventActivationMap[2]->start_ns, 0); + EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); + EXPECT_EQ(eventDeactivationMap.size(), 1u); + EXPECT_TRUE(eventDeactivationMap.find(3) != eventDeactivationMap.end()); + EXPECT_EQ(eventDeactivationMap[3].size(), 2u); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[3][1], eventActivationMap[2]); + EXPECT_EQ(broadcastCount, 0); + + std::unique_ptr<LogEvent> event; + + // Event that should be ignored. + event = CreateAppCrashEvent(111, bucketStartTimeNs + 1); + processor.OnLogEvent(event.get()); + + // Activate metric via screen on for 2 minutes. + event = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, bucketStartTimeNs + 10); + processor.OnLogEvent(event.get()); + EXPECT_TRUE(metricsManager->isActive()); + EXPECT_TRUE(metricProducer->mIsActive); + EXPECT_EQ(broadcastCount, 1); + EXPECT_EQ(activeConfigsBroadcast.size(), 1); + EXPECT_EQ(activeConfigsBroadcast[0], cfgId); + EXPECT_EQ(eventActivationMap[0]->state, ActivationState::kNotActive); + EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); + EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 10); + + // 1st processed event. + event = CreateAppCrashEvent(222, bucketStartTimeNs + 15); + processor.OnLogEvent(event.get()); + + // Enable battery saver mode activation for 5 minutes. + event = CreateBatterySaverOnEvent(bucketStartTimeNs + NS_PER_SEC * 60 + 10); + processor.OnLogEvent(event.get()); + EXPECT_TRUE(metricsManager->isActive()); + EXPECT_TRUE(metricProducer->mIsActive); + EXPECT_EQ(broadcastCount, 1); + EXPECT_EQ(eventActivationMap[0]->state, ActivationState::kActive); + EXPECT_EQ(eventActivationMap[0]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 + 10); + EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); + EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 10); + + // 2nd processed event. + event = CreateAppCrashEvent(333, bucketStartTimeNs + NS_PER_SEC * 60 + 40); + processor.OnLogEvent(event.get()); + + // Cancel battery saver mode and screen on activation. + int64_t firstDeactivation = bucketStartTimeNs + NS_PER_SEC * 61; + event = CreateScreenBrightnessChangedEvent(64, firstDeactivation); + processor.OnLogEvent(event.get()); + EXPECT_FALSE(metricsManager->isActive()); + EXPECT_FALSE(metricProducer->mIsActive); + // New broadcast since the config is no longer active. + EXPECT_EQ(broadcastCount, 2); + EXPECT_EQ(activeConfigsBroadcast.size(), 0); + EXPECT_EQ(eventActivationMap[0]->state, ActivationState::kNotActive); + EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); + + // Should be ignored + event = CreateAppCrashEvent(444, bucketStartTimeNs + NS_PER_SEC * 61 + 80); + processor.OnLogEvent(event.get()); + + // Re-enable battery saver mode activation. + event = CreateBatterySaverOnEvent(bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 15); + processor.OnLogEvent(event.get()); + EXPECT_TRUE(metricsManager->isActive()); + EXPECT_TRUE(metricProducer->mIsActive); + EXPECT_EQ(broadcastCount, 3); + EXPECT_EQ(activeConfigsBroadcast.size(), 1); + EXPECT_EQ(activeConfigsBroadcast[0], cfgId); + EXPECT_EQ(eventActivationMap[0]->state, ActivationState::kActive); + EXPECT_EQ(eventActivationMap[0]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 15); + EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); + + // 3rd processed event. + event = CreateAppCrashEvent(555, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 80); + processor.OnLogEvent(event.get()); + + // Cancel battery saver mode activation. + int64_t secondDeactivation = bucketStartTimeNs + NS_PER_SEC * 60 * 13; + event = CreateScreenBrightnessChangedEvent(140, secondDeactivation); + processor.OnLogEvent(event.get()); + EXPECT_FALSE(metricsManager->isActive()); + EXPECT_FALSE(metricProducer->mIsActive); + EXPECT_EQ(broadcastCount, 4); + EXPECT_EQ(activeConfigsBroadcast.size(), 0); + EXPECT_EQ(eventActivationMap[0]->state, ActivationState::kNotActive); + EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); + + // Should be ignored. + event = CreateAppCrashEvent(666, bucketStartTimeNs + NS_PER_SEC * 60 * 13 + 80); + processor.OnLogEvent(event.get()); + + ConfigMetricsReportList reports; + vector<uint8_t> buffer; + processor.onDumpReport(cfgKey, bucketStartTimeNs + NS_PER_SEC * 60 * 15 + 1, false, true, + ADB_DUMP, FAST, &buffer); + EXPECT_TRUE(buffer.size() > 0); + EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); + backfillDimensionPath(&reports); + backfillStartEndTimestamp(&reports); + EXPECT_EQ(1, reports.reports_size()); + EXPECT_EQ(1, reports.reports(0).metrics_size()); + EXPECT_EQ(3, reports.reports(0).metrics(0).count_metrics().data_size()); + + StatsLogReport::CountMetricDataWrapper countMetrics; + sortMetricDataByDimensionsValue( + reports.reports(0).metrics(0).count_metrics(), &countMetrics); + EXPECT_EQ(3, countMetrics.data_size()); + + auto data = countMetrics.data(0); + EXPECT_EQ(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, data.dimensions_in_what().field()); + EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size()); + EXPECT_EQ(1 /* uid field */, + data.dimensions_in_what().value_tuple().dimensions_value(0).field()); + EXPECT_EQ(222, data.dimensions_in_what().value_tuple().dimensions_value(0).value_int()); + EXPECT_EQ(1, data.bucket_info_size()); + EXPECT_EQ(1, data.bucket_info(0).count()); + EXPECT_EQ(bucketStartTimeNs, data.bucket_info(0).start_bucket_elapsed_nanos()); + EXPECT_EQ(firstDeactivation, data.bucket_info(0).end_bucket_elapsed_nanos()); + + data = countMetrics.data(1); + EXPECT_EQ(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, data.dimensions_in_what().field()); + EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size()); + EXPECT_EQ(1 /* uid field */, + data.dimensions_in_what().value_tuple().dimensions_value(0).field()); + EXPECT_EQ(333, data.dimensions_in_what().value_tuple().dimensions_value(0).value_int()); + EXPECT_EQ(1, data.bucket_info_size()); + EXPECT_EQ(1, data.bucket_info(0).count()); + EXPECT_EQ(bucketStartTimeNs, data.bucket_info(0).start_bucket_elapsed_nanos()); + EXPECT_EQ(firstDeactivation, data.bucket_info(0).end_bucket_elapsed_nanos()); + + data = countMetrics.data(2); + EXPECT_EQ(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, data.dimensions_in_what().field()); + EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size()); + EXPECT_EQ(1 /* uid field */, + data.dimensions_in_what().value_tuple().dimensions_value(0).field()); + EXPECT_EQ(555, data.dimensions_in_what().value_tuple().dimensions_value(0).value_int()); + EXPECT_EQ(1, data.bucket_info_size()); + EXPECT_EQ(1, data.bucket_info(0).count()); + // Partial bucket as metric is deactivated. + EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos()); + EXPECT_EQ(secondDeactivation, data.bucket_info(0).end_bucket_elapsed_nanos()); +} + TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { auto config = CreateStatsdConfigWithTwoMetricsTwoDeactivations(); @@ -1127,8 +1363,10 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventDeactivationMap.size(), 2u); EXPECT_TRUE(eventDeactivationMap.find(3) != eventDeactivationMap.end()); EXPECT_TRUE(eventDeactivationMap.find(4) != eventDeactivationMap.end()); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3].size(), 1u); + EXPECT_EQ(eventDeactivationMap[4].size(), 1u); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_EQ(eventActivationMap2.size(), 2u); EXPECT_TRUE(eventActivationMap2.find(0) != eventActivationMap2.end()); @@ -1142,8 +1380,10 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventDeactivationMap2.size(), 2u); EXPECT_TRUE(eventDeactivationMap2.find(3) != eventDeactivationMap2.end()); EXPECT_TRUE(eventDeactivationMap2.find(4) != eventDeactivationMap2.end()); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap[3].size(), 1u); + EXPECT_EQ(eventDeactivationMap[4].size(), 1u); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); std::unique_ptr<LogEvent> event; @@ -1170,8 +1410,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, 0); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_TRUE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + 10); @@ -1179,8 +1419,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, 0); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // First processed event. event = CreateAppCrashEvent(222, bucketStartTimeNs + 15); @@ -1200,8 +1440,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_TRUE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + 10); @@ -1209,8 +1449,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // 2nd processed event. // The activation by screen_on event expires, but the one by battery save mode is still active. @@ -1226,8 +1466,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_TRUE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + 10); @@ -1235,8 +1475,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // No new broadcast since the config should still be active. EXPECT_EQ(broadcastCount, 1); @@ -1262,8 +1502,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_FALSE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + 10); @@ -1271,8 +1511,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + 20); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // Re-activate metric via screen on. event = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, @@ -1289,8 +1529,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_TRUE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + 10); @@ -1298,8 +1538,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // 4th processed event. event = CreateAppCrashEvent(666, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 1); @@ -1321,8 +1561,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_TRUE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 15); @@ -1330,8 +1570,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // 5th processed event. event = CreateAppCrashEvent(777, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 40); @@ -1353,8 +1593,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_FALSE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 15); @@ -1362,8 +1602,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // Screen-on activation expired. event = CreateAppCrashEvent(888, bucketStartTimeNs + NS_PER_SEC * 60 * 13); @@ -1380,8 +1620,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_FALSE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 11 + 15); @@ -1389,8 +1629,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); event = CreateAppCrashEvent(999, bucketStartTimeNs + NS_PER_SEC * 60 * 14 + 1); processor.OnLogEvent(event.get()); @@ -1411,8 +1651,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_TRUE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 15 + 15); @@ -1420,8 +1660,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); // Cancel battery saver mode and screen on activation. event = CreateScreenBrightnessChangedEvent(140, bucketStartTimeNs + NS_PER_SEC * 60 * 16); @@ -1436,8 +1676,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap[3], eventActivationMap[0]); - EXPECT_EQ(eventDeactivationMap[4], eventActivationMap[2]); + EXPECT_EQ(eventDeactivationMap[3][0], eventActivationMap[0]); + EXPECT_EQ(eventDeactivationMap[4][0], eventActivationMap[2]); EXPECT_FALSE(metricProducer2->mIsActive); EXPECT_EQ(eventActivationMap2[0]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[0]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 15 + 15); @@ -1445,8 +1685,8 @@ TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations) { EXPECT_EQ(eventActivationMap2[2]->state, ActivationState::kNotActive); EXPECT_EQ(eventActivationMap2[2]->start_ns, bucketStartTimeNs + NS_PER_SEC * 60 * 10 + 10); EXPECT_EQ(eventActivationMap2[2]->ttl_ns, 60 * 2 * NS_PER_SEC); - EXPECT_EQ(eventDeactivationMap2[3], eventActivationMap2[0]); - EXPECT_EQ(eventDeactivationMap2[4], eventActivationMap2[2]); + EXPECT_EQ(eventDeactivationMap2[3][0], eventActivationMap2[0]); + EXPECT_EQ(eventDeactivationMap2[4][0], eventActivationMap2[2]); ConfigMetricsReportList reports; vector<uint8_t> buffer; diff --git a/config/dirty-image-objects b/config/dirty-image-objects index 9e2230b288c8..ec2568dc4ad8 100644 --- a/config/dirty-image-objects +++ b/config/dirty-image-objects @@ -28,147 +28,359 @@ # Then, grep for lines containing "Private dirty object" from the output. # This particular file was generated by dumping systemserver and systemui. # -java.lang.System -java.net.Inet4Address -java.lang.Thread -java.lang.Throwable -java.util.Collections -javax.net.ssl.SSLContext -java.nio.charset.Charset -java.security.Provider -javax.net.ssl.HttpsURLConnection -javax.net.ssl.SSLSocketFactory -java.util.TimeZone -java.util.Locale -java.util.function.ToIntFunction -sun.misc.FormattedFloatingDecimal -java.util.stream.IntStream -android.icu.util.TimeZone -org.apache.harmony.luni.internal.util.TimezoneGetter -dalvik.system.SocketTagger -dalvik.system.CloseGuard -java.lang.ref.FinalizerReference -com.android.org.conscrypt.ct.CTLogStoreImpl -com.android.org.conscrypt.SSLParametersImpl -com.android.org.conscrypt.OpenSSLContextImpl -com.android.org.conscrypt.SSLParametersImpl$AliasChooser -com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks -com.android.org.conscrypt.NativeCrypto$SSLHandshakeCallbacks -com.android.okhttp.OkHttpClient -com.android.okhttp.okio.SegmentPool -com.android.okhttp.okio.AsyncTimeout -com.android.okhttp.HttpUrl -android.os.StrictMode -com.android.internal.os.BinderInternal -android.os.storage.StorageManager -android.os.Trace +android.accounts.Account +android.accounts.OnAccountsUpdateListener +android.animation.LayoutTransition android.app.ActivityManager -android.media.MediaRouter -android.os.Environment -android.view.ThreadedRenderer -android.media.AudioManager -android.app.AlarmManager -android.telephony.TelephonyManager -android.bluetooth.BluetoothAdapter -com.android.internal.os.SomeArgs -android.os.LocaleList -android.view.WindowManagerGlobal -android.media.AudioSystem -android.ddm.DdmHandleAppName -android.provider.Settings -android.view.ViewRootImpl -android.net.ConnectivityManager +android.app.ActivityManager$OnUidImportanceListener +android.app.ActivityTaskManager android.app.ActivityThread -android.os.BaseBundle -android.util.ArraySet -android.view.View -android.os.ServiceManager -android.view.ViewTreeObserver -android.hardware.input.InputManager -android.os.UEventObserver -android.app.NotificationManager -android.hardware.display.DisplayManagerGlobal -android.os.Binder +android.app.admin.DevicePolicyManager +android.app.AlarmManager +android.app.Application android.app.AppOpsManager -android.content.ContentResolver android.app.backup.BackupManager -android.util.ArrayMap -android.os.Looper -android.graphics.Bitmap -android.view.textservice.TextServicesManager -com.android.internal.inputmethod.InputMethodUtils +android.app.ContextImpl +android.app.INotificationManager +android.app.Notification$BigPictureStyle +android.app.Notification$BigTextStyle +android.app.Notification$InboxStyle +android.app.NotificationChannel +android.app.NotificationChannelGroup +android.app.NotificationManager +android.app.PendingIntent +android.app.PendingIntent$OnFinished android.app.QueuedWork -android.graphics.TemporaryBuffer -android.widget.ImageView +android.app.ResourcesManager +android.app.WallpaperManager +android.app.WindowConfiguration +android.bluetooth.BluetoothAdapter +android.bluetooth.BluetoothDevice +android.bluetooth.BluetoothProfile +android.bluetooth.IBluetoothA2dp +android.bluetooth.IBluetoothHeadsetPhone +android.bluetooth.IBluetoothHidDevice +android.bluetooth.IBluetoothHidHost +android.bluetooth.IBluetoothMap +android.bluetooth.IBluetoothPan +android.bluetooth.IBluetoothPbap +android.bluetooth.IBluetoothSap +android.content.ClipboardManager$OnPrimaryClipChangedListener +android.content.ComponentName +android.content.ContentProvider$PipeDataWriter +android.content.ContentResolver +android.content.Context +android.content.Intent +android.content.pm.PackageManager$OnPermissionsChangedListener +android.content.pm.VersionedPackage +android.content.res.Configuration +android.content.SharedPreferences$OnSharedPreferenceChangeListener +android.database.CursorWindow +android.database.sqlite.SQLiteCompatibilityWalFlags +android.database.sqlite.SQLiteDatabase$CursorFactory android.database.sqlite.SQLiteGlobal -android.view.autofill.Helper -android.text.method.SingleLineTransformationMethod -com.android.internal.os.RuntimeInit -android.view.inputmethod.InputMethodManager +android.database.sqlite.SQLiteTransactionListener +android.ddm.DdmHandleAppName +android.graphics.Bitmap +android.graphics.Canvas +android.graphics.drawable.AdaptiveIconDrawable +android.graphics.drawable.ColorDrawable +android.graphics.drawable.GradientDrawable +android.graphics.drawable.Icon +android.graphics.drawable.InsetDrawable +android.graphics.drawable.RippleDrawable +android.graphics.drawable.VectorDrawable$VGroup +android.graphics.ImageDecoder +android.graphics.Rect +android.graphics.TemporaryBuffer +android.hardware.biometrics.BiometricSourceType +android.hardware.display.ColorDisplayManager$ColorDisplayManagerInternal +android.hardware.display.DisplayManagerGlobal +android.hardware.display.NightDisplayListener$Callback +android.hardware.input.InputManager +android.hardware.input.InputManager$InputDeviceListener +android.hardware.SensorPrivacyManager android.hardware.SystemSensorManager -android.database.CursorWindow -android.text.TextUtils +android.icu.impl.OlsonTimeZone +android.icu.text.BreakIterator +android.icu.text.Collator +android.icu.text.DateFormat$BooleanAttribute +android.icu.text.DateTimePatternGenerator$DTPGflags +android.icu.text.PluralRules$Operand +android.icu.util.TimeZone +android.location.GpsStatus$Listener +android.location.LocationListener +android.media.AudioManager +android.media.MediaRouter android.media.PlayerBase -android.app.ResourcesManager -android.os.Message -android.view.accessibility.AccessibilityManager -android.app.Notification -android.provider.ContactsContract$ContactNameColumns -android.provider.CalendarContract$EventsColumns -android.provider.CalendarContract$CalendarColumns -android.provider.CalendarContract$SyncColumns -android.provider.ContactsContract$ContactsColumns -android.content.pm.PackageManager$OnPermissionsChangedListener -android.net.IpConfiguration$ProxySettings -android.provider.ContactsContract$ContactOptionsColumns -android.net.wifi.SupplicantState -android.provider.ContactsContract$ContactStatusColumns -android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener -android.provider.CalendarContract$CalendarSyncColumns -android.bluetooth.BluetoothProfile$ServiceListener -android.provider.ContactsContract$ContactCounts +android.media.session.MediaSessionManager +android.net.apf.ApfCapabilities +android.net.ConnectivityManager +android.net.ConnectivityManager$OnNetworkActiveListener +android.net.ConnectivityThread$Singleton android.net.IpConfiguration$IpAssignment -android.text.TextWatcher -android.graphics.Bitmap$CompressFormat -android.location.LocationListener -sun.security.jca.Providers -java.lang.CharSequence -android.icu.util.ULocale -dalvik.system.BaseDexClassLoader -android.icu.text.BreakIterator -libcore.net.NetworkSecurityPolicy -android.icu.text.UnicodeSet -com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder -android.app.SearchManager -android.os.Build -android.app.ContextImpl -android.app.WallpaperManager -android.security.net.config.ApplicationConfig -android.animation.LayoutTransition -android.widget.TextView -com.android.internal.logging.MetricsLogger -android.renderscript.RenderScriptCacheDir -android.os.Process +android.net.IpConfiguration$ProxySettings +android.net.IpPrefix +android.net.LinkAddress +android.net.LinkProperties +android.net.Network +android.net.NetworkCapabilities +android.net.NetworkInfo +android.net.NetworkInfo$State +android.net.NetworkRequest +android.net.NetworkRequest$Type +android.net.RouteInfo +android.net.StringNetworkSpecifier +android.net.TrafficStats +android.net.UidRange +android.net.Uri$HierarchicalUri +android.net.Uri$StringUri +android.net.wifi.WifiManager +android.net.wifi.WifiManager$SoftApCallback +android.os.AsyncResult +android.os.AsyncTask +android.os.BinderProxy +android.os.Bundle +android.os.DeadObjectException +android.os.Environment +android.os.FileObserver android.os.Handler -android.content.Context -android.graphics.drawable.AdaptiveIconDrawable +android.os.IDeviceIdleController +android.os.LocaleList +android.os.Looper +android.os.Message +android.os.ParcelUuid +android.os.Process +android.os.RecoverySystem +android.os.ServiceManager +android.os.storage.StorageManager +android.os.StrictMode +android.os.Trace +android.os.WorkSource +android.os.WorkSource$WorkChain +android.permission.PermissionManager android.provider.FontsContract -android.text.style.SuggestionSpan -android.graphics.drawable.VectorDrawable$VGroup -android.view.ViewStub -android.text.style.MetricAffectingSpan -android.content.SharedPreferences$OnSharedPreferenceChangeListener -android.app.PendingIntent +android.provider.Settings$SettingNotFoundException +android.renderscript.RenderScriptCacheDir +android.security.IKeyChainService +android.security.keystore.AndroidKeyStoreProvider +android.security.net.config.ApplicationConfig +android.security.net.config.SystemCertificateSource$NoPreloadHolder +android.telecom.PhoneAccountHandle +android.telephony.AnomalyReporter +android.telephony.CellSignalStrengthCdma +android.telephony.CellSignalStrengthGsm +android.telephony.CellSignalStrengthLte +android.telephony.CellSignalStrengthNr +android.telephony.CellSignalStrengthTdscdma +android.telephony.CellSignalStrengthWcdma +android.telephony.DataSpecificRegistrationInfo +android.telephony.emergency.EmergencyNumber +android.telephony.ims.ImsMmTelManager$CapabilityCallback$CapabilityBinder +android.telephony.ims.ImsMmTelManager$RegistrationCallback$RegistrationBinder +android.telephony.ims.ImsReasonInfo +android.telephony.ims.ProvisioningManager$Callback$CallbackBinder +android.telephony.ModemActivityInfo +android.telephony.ModemInfo +android.telephony.NetworkRegistrationInfo +android.telephony.NetworkService +android.telephony.TelephonyManager +android.telephony.VoiceSpecificRegistrationInfo +android.text.format.DateFormat +android.text.method.SingleLineTransformationMethod +android.text.Selection$MemoryTextWatcher android.text.SpanWatcher -android.widget.FrameLayout -android.net.NetworkRequest$Type -android.net.NetworkInfo$State -android.graphics.drawable.GradientDrawable android.text.style.AlignmentSpan -android.widget.LinearLayout android.text.style.CharacterStyle -android.view.View$OnApplyWindowInsetsListener -android.view.MenuItem +android.text.style.LeadingMarginSpan +android.text.style.LineBackgroundSpan +android.text.style.LineHeightSpan +android.text.style.MetricAffectingSpan android.text.style.ReplacementSpan -android.graphics.drawable.Icon +android.text.style.SuggestionSpan +android.text.style.TabStopSpan +android.text.TextUtils +android.text.TextWatcher +android.transition.ChangeClipBounds +android.transition.ChangeImageTransform +android.transition.ChangeTransform +android.util.ArrayMap +android.util.ArraySet +android.util.DisplayMetrics +android.util.EventLog +android.util.Log +android.util.Patterns +android.view.AbsSavedState$1 +android.view.accessibility.AccessibilityManager +android.view.accessibility.AccessibilityManager$AccessibilityServicesStateChangeListener +android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener +android.view.accessibility.AccessibilityNodeIdManager +android.view.autofill.AutofillManager +android.view.autofill.Helper +android.view.Choreographer +android.view.inputmethod.InputMethodManager +android.view.IWindowManager +android.view.PointerIcon +android.view.RemoteAnimationAdapter +android.view.ThreadedRenderer +android.view.View +android.view.View$OnHoverListener +android.view.ViewRootImpl +android.view.ViewStub +android.view.ViewStub$OnInflateListener +android.view.ViewTreeObserver +android.view.WindowManager$LayoutParams +android.view.WindowManagerGlobal +android.widget.ActionMenuPresenter$OverflowMenuButton +android.widget.ActionMenuView android.widget.Button +android.widget.CheckBox +android.widget.FrameLayout +android.widget.ImageButton +android.widget.ImageView +android.widget.LinearLayout +android.widget.RelativeLayout +android.widget.SeekBar +android.widget.Space +android.widget.TextView +android.widget.Toolbar +byte[] +com.android.ims.ImsManager +com.android.internal.logging.MetricsLogger +com.android.internal.os.BackgroundThread +com.android.internal.os.BinderInternal +com.android.internal.os.BinderInternal$BinderProxyLimitListener +com.android.internal.os.RuntimeInit +com.android.internal.os.SomeArgs +com.android.internal.policy.DecorView +com.android.internal.statusbar.IStatusBarService +com.android.internal.telephony.AppSmsManager +com.android.internal.telephony.CallerInfoAsyncQuery$OnQueryCompleteListener +com.android.internal.telephony.CarrierActionAgent +com.android.internal.telephony.cat.CatService +com.android.internal.telephony.cat.IconLoader +com.android.internal.telephony.cat.RilMessageDecoder +com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager +com.android.internal.telephony.cdma.EriManager +com.android.internal.telephony.CellularNetworkValidator +com.android.internal.telephony.CommandException +com.android.internal.telephony.dataconnection.DataConnection$DcActivatingState +com.android.internal.telephony.dataconnection.DataConnection$DcActiveState +com.android.internal.telephony.dataconnection.DataConnection$DcInactiveState +com.android.internal.telephony.dataconnection.DataEnabledSettings +com.android.internal.telephony.dataconnection.DcTracker +com.android.internal.telephony.euicc.EuiccCardController +com.android.internal.telephony.euicc.EuiccController +com.android.internal.telephony.GsmAlphabet +com.android.internal.telephony.GsmCdmaCallTracker +com.android.internal.telephony.GsmCdmaPhone +com.android.internal.telephony.IccPhoneBookInterfaceManager +com.android.internal.telephony.IccSmsInterfaceManager +com.android.internal.telephony.ims.ImsResolver +com.android.internal.telephony.imsphone.ImsExternalCallTracker +com.android.internal.telephony.imsphone.ImsPhone +com.android.internal.telephony.imsphone.ImsPhoneCallTracker +com.android.internal.telephony.ims.RcsMessageStoreController +com.android.internal.telephony.IntentBroadcaster +com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy +com.android.internal.telephony.metrics.TelephonyMetrics +com.android.internal.telephony.MultiSimSettingController +com.android.internal.telephony.nano.CarrierIdProto$CarrierAttribute +com.android.internal.telephony.nano.CarrierIdProto$CarrierId +com.android.internal.telephony.nano.TelephonyProto$RilDataCall +com.android.internal.telephony.nano.TelephonyProto$SmsSession$Event +com.android.internal.telephony.nano.TelephonyProto$TelephonyCallSession$Event$RilCall +com.android.internal.telephony.NitzStateMachine +com.android.internal.telephony.PhoneConfigurationManager +com.android.internal.telephony.PhoneFactory +com.android.internal.telephony.PhoneSwitcher +com.android.internal.telephony.ProxyController +com.android.internal.telephony.RadioConfig +com.android.internal.telephony.RIL +com.android.internal.telephony.RILRequest +com.android.internal.telephony.RilWakelockInfo +com.android.internal.telephony.ServiceStateTracker +com.android.internal.telephony.SimActivationTracker +com.android.internal.telephony.SmsApplication +com.android.internal.telephony.SmsBroadcastUndelivered +com.android.internal.telephony.SmsStorageMonitor +com.android.internal.telephony.SmsUsageMonitor +com.android.internal.telephony.SubscriptionController +com.android.internal.telephony.SubscriptionInfoUpdater +com.android.internal.telephony.TelephonyComponentFactory +com.android.internal.telephony.TelephonyDevController +com.android.internal.telephony.TelephonyTester +com.android.internal.telephony.uicc.AdnRecordCache +com.android.internal.telephony.uicc.UiccCardApplication +com.android.internal.telephony.uicc.UiccController +com.android.internal.telephony.uicc.UiccProfile +com.android.internal.telephony.uicc.UiccStateChangedLauncher +com.android.internal.telephony.uicc.UsimFileHandler +com.android.internal.telephony.uicc.VoiceMailConstants +com.android.internal.util.LatencyTracker +com.android.internal.util.StateMachine$SmHandler +com.android.okhttp.OkHttpClient +com.android.okhttp.okio.AsyncTimeout +com.android.okhttp.okio.SegmentPool +com.android.phone.ecc.nano.ProtobufEccData$CountryInfo +com.android.phone.ecc.nano.ProtobufEccData$EccInfo +com.android.server.sip.SipWakeupTimer +com.android.server.SystemConfig +dalvik.system.BaseDexClassLoader +dalvik.system.BlockGuard +dalvik.system.CloseGuard +dalvik.system.RuntimeHooks +dalvik.system.SocketTagger +java.io.BufferedReader +java.lang.AssertionError +java.lang.Boolean +java.lang.Byte +java.lang.Character +java.lang.CharSequence +java.lang.Class +java.lang.IllegalAccessException +java.lang.IllegalStateException +java.lang.NoSuchMethodException +java.lang.NullPointerException +java.lang.Object +java.lang.Object[] +java.lang.ref.FinalizerReference +java.lang.Runnable +java.lang.SecurityException +java.lang.Short +java.lang.String[] +java.lang.System +java.lang.Thread +java.lang.Throwable +java.lang.UnsatisfiedLinkError +java.net.Inet6Address +java.net.Socket +java.net.SocketException +java.nio.Bits +java.nio.charset.Charset +java.security.interfaces.RSAPrivateKey +java.security.Provider +java.util.Collections +java.util.concurrent.Executor +java.util.GregorianCalendar +java.util.Locale +java.util.Locale$NoImagePreloadHolder +java.util.Scanner +java.util.Set +java.util.TimeZone +javax.net.SocketFactory +javax.net.ssl.HttpsURLConnection +javax.net.ssl.HttpsURLConnection$NoPreloadHolder +javax.net.ssl.SSLContext +javax.net.ssl.SSLSessionContext +javax.net.ssl.SSLSocketFactory +libcore.io.Libcore +libcore.io.Memory +libcore.net.NetworkSecurityPolicy +libcore.timezone.TimeZoneFinder +org.apache.http.params.HttpParams +sun.misc.Cleaner +sun.nio.ch.FileChannelImpl +sun.nio.ch.FileChannelImpl$Unmapper +sun.nio.fs.UnixChannelFactory +sun.security.jca.Providers diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index c08ed268833b..dc52c52cca1f 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2330,7 +2330,7 @@ public class Activity extends ContextThemeWrapper * calling {@link VoiceInteractor#notifyDirectActionsChanged()}. * * <p>To get the voice interactor you need to call {@link #getVoiceInteractor()} - * which would return non <code>null<c/ode> only if there is an ongoing voice + * which would return non <code>null</code> only if there is an ongoing voice * interaction session. You an also detect when the voice interactor is no * longer valid because the voice interaction session that is backing is finished * by calling {@link VoiceInteractor#registerOnDestroyedCallback(Executor, Runnable)}. @@ -2339,7 +2339,7 @@ public class Activity extends ContextThemeWrapper * before {@link #onStop()} is being called. * * <p>You should pass to the callback the currently supported direct actions which - * cannot be <code>null</code> or contain <code>null</null> elements. + * cannot be <code>null</code> or contain <code>null</code> elements. * * <p>You should return the action list as soon as possible to ensure the consumer, * for example the assistant, is as responsive as possible which would improve user @@ -3681,7 +3681,7 @@ public class Activity extends ContextThemeWrapper ActivityTaskManager.getService().onBackPressedOnTaskRoot(mToken, new IRequestFinishCallback.Stub() { public void requestFinish() { - finishAfterTransition(); + mHandler.post(() -> finishAfterTransition()); } }); } catch (RemoteException e) { diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 685eedc31303..769fd487c2a9 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2754,12 +2754,11 @@ public class ApplicationPackageManager extends PackageManager { public Drawable loadUnbadgedItemIcon(@NonNull PackageItemInfo itemInfo, @Nullable ApplicationInfo appInfo) { if (itemInfo.showUserIcon != UserHandle.USER_NULL) { - Bitmap bitmap = getUserManager().getUserIcon(itemInfo.showUserIcon); - if (bitmap == null) { - return UserIcons.getDefaultUserIcon( - mContext.getResources(), itemInfo.showUserIcon, /* light= */ false); - } - return new BitmapDrawable(bitmap); + // Indicates itemInfo is for a different user (e.g. a profile's parent), so use a + // generic user icon (users generally lack permission to view each other's actual icons) + int targetUserId = itemInfo.showUserIcon; + return UserIcons.getDefaultUserIcon( + mContext.getResources(), targetUserId, /* light= */ false); } Drawable dr = null; if (itemInfo.packageName != null) { diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 3f7b29109b3d..4b9aebd17794 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -16,6 +16,8 @@ package android.app.admin; +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; + import android.Manifest.permission; import android.annotation.CallbackExecutor; import android.annotation.ColorInt; @@ -88,6 +90,7 @@ import android.util.Log; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BackgroundThread; import com.android.internal.util.Preconditions; import com.android.org.conscrypt.TrustedCertificateStore; @@ -275,7 +278,6 @@ public class DevicePolicyManager { * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li> * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li> * <li>{@link #EXTRA_PROVISIONING_DISCLAIMERS}, optional</li> - * <li>{@link #EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS}, optional</li> * </ul> * * <p>When device owner provisioning has completed, an intent of the type @@ -383,7 +385,6 @@ public class DevicePolicyManager { * <li>{@link #EXTRA_PROVISIONING_ORGANIZATION_NAME}, optional</li> * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li> * <li>{@link #EXTRA_PROVISIONING_USE_MOBILE_DATA}, optional </li> - * <li>{@link #EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS}, optional</li> * </ul> * * @hide @@ -423,7 +424,6 @@ public class DevicePolicyManager { * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li> * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li> * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li> - * <li>{@link #EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS}, optional</li> * </ul> * * <p>When device owner provisioning has completed, an intent of the type @@ -1149,11 +1149,11 @@ public class DevicePolicyManager { * A boolean extra indicating if the education screens from the provisioning flow should be * skipped. If unspecified, defaults to {@code false}. * + * <p>This extra can only be set by the admin app when performing the admin-integrated + * provisioning flow as a result of the {@link #ACTION_GET_PROVISIONING_MODE} activity. + * * <p>If the education screens are skipped, it is the admin application's responsibility * to display its own user education screens. - * - * <p>It can be used when provisioning a fully managed device via - * {@link #ACTION_PROVISION_MANAGED_DEVICE}. */ public static final String EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS = "android.app.extra.PROVISIONING_SKIP_EDUCATION_SCREENS"; @@ -2263,6 +2263,10 @@ public class DevicePolicyManager { * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE}</li> * </ul> * + * <p>If performing fully-managed device provisioning and the admin app desires to show its + * own education screens, the target activity can additionally return + * {@link #EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS} set to <code>true</code>. + * * <p>The target activity may also return the account that needs to be migrated from primary * user to managed profile in case of a profile owner provisioning in * {@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE} as result. @@ -6392,6 +6396,7 @@ public class DevicePolicyManager { /** * @hide */ + @UnsupportedAppUsage public @Nullable ComponentName getProfileOwnerAsUser(final int userId) { if (mService != null) { try { @@ -8809,6 +8814,11 @@ public class DevicePolicyManager { mService.setPermissionGrantState(admin, mContext.getPackageName(), packageName, permission, grantState, new RemoteCallback((b) -> result.complete(b != null))); + // Timeout + BackgroundThread.getHandler().sendMessageDelayed( + obtainMessage(CompletableFuture::complete, result, false), + 20_000); + return result.get(); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 941eda8bcf1f..529677aea653 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4126,6 +4126,7 @@ public abstract class Context { * @see #getSystemService(String) * @hide */ + @TestApi @SystemApi public static final String PERMISSION_SERVICE = "permission"; diff --git a/core/java/android/content/om/TEST_MAPPING b/core/java/android/content/om/TEST_MAPPING new file mode 100644 index 000000000000..d35dfdbf32c8 --- /dev/null +++ b/core/java/android/content/om/TEST_MAPPING @@ -0,0 +1,26 @@ +{ + "presubmit": [ + { + "name": "FrameworksServicesTests", + "options": [ + { + "include-filter": "com.android.server.om" + } + ] + }, + { + "name": "OverlayDeviceTests" + }, + { + "name": "OverlayHostTests" + }, + { + "name": "CtsAppSecurityHostTestCases", + "options": [ + { + "include-filter": "android.appsecurity.cts.OverlayHostTest" + } + ] + } + ] +} diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 081c5ad78762..d0ab8f713de8 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -159,7 +159,7 @@ public class PackageItemInfo { public Bundle metaData; /** - * If different of UserHandle.USER_NULL, The icon of this item will be the one of that user. + * If different of UserHandle.USER_NULL, The icon of this item will represent that user. * @hide */ public int showUserIcon; diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 666508af0207..672994e79134 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -994,4 +994,9 @@ public abstract class PackageManagerInternal { */ public abstract void setRuntimePermissionsFingerPrint(@NonNull String fingerPrint, @UserIdInt int userId); + + /** + * Migrates legacy obb data to its new location. + */ + public abstract void migrateLegacyObbData(); } diff --git a/core/java/android/hardware/SensorAdditionalInfo.java b/core/java/android/hardware/SensorAdditionalInfo.java index 5ff627f48017..12edc5eb7e33 100644 --- a/core/java/android/hardware/SensorAdditionalInfo.java +++ b/core/java/android/hardware/SensorAdditionalInfo.java @@ -119,12 +119,50 @@ public class SensorAdditionalInfo { public static final int TYPE_VEC3_CALIBRATION = 0x10002; /** - * Sensor placement. Describes location and installation angle of the sensor device. + * Sensor placement. * - * Payload: - * floatValues[0..11]: First 3 rows of homogeneous matrix in row major order that describes - * the location and orientation of the sensor. Origin of reference will be the mobile device - * geometric sensor. Reference frame is defined as the same as Android sensor frame. + * Provides the orientation and location of the sensor element in terms of the + * Android coordinate system. This data is given as a 3x4 matrix consisting of a 3x3 rotation + * matrix (R) concatenated with a 3x1 location vector (t). The rotation matrix provides the + * orientation of the Android device coordinate frame relative to the local coordinate frame of + * the sensor. Note that assuming the axes conventions of the sensor are the same as Android, + * this is the inverse of the matrix applied to raw samples read from the sensor to convert them + * into the Android representation. The location vector represents the translation from the + * origin of the Android sensor coordinate system to the geometric center of the sensor, + * specified in millimeters (mm). + * <p> + * <b>Payload</b>: + * <code>floatValues[0..11]</code>: 3x4 matrix in row major order [R; t] + * </p> + * <p> + * <b>Example</b>: + * This raw buffer: <code>{0, 1, 0, 0, -1, 0, 0, 10, 0, 0, 1, -2.5}</code><br> + * Corresponds to this 3x4 matrix: + * <table> + * <thead> + * <tr><td colspan="3">Orientation</td><td>Location</tr> + * </thead> + * <tbody> + * <tr><td>0</td><td>1</td><td>0</td><td>0</td></tr> + * <tr><td>-1</td><td>0</td><td>0</td><td>10</td></tr> + * <tr><td>0</td><td>0</td><td>1</td><td>-2.5</td></tr> + * </tbody> + * </table> + * The sensor is oriented such that: + * <ul> + * <li>The device X axis corresponds to the sensor's local -Y axis + * <li>The device Y axis corresponds to the sensor's local X axis + * <li>The device Z axis and sensor's local Z axis are equivalent + * </ul> + * In other words, if viewing the origin of the Android coordinate system from the positive + * Z direction, the device coordinate frame is to be rotated 90° counter-clockwise about the + * Z axis to align with the sensor's local coordinate frame. Equivalently, a vector in the + * Android coordinate frame may be multiplied with R to rotate it 90° clockwise (270° + * counter-clockwise), yielding its representation in the sensor's coordinate frame. + * Relative to the origin of the Android coordinate system, the physical center of the + * sensor is located 10mm in the positive Y direction, and 2.5mm in the negative Z + * direction. + * </p> */ public static final int TYPE_SENSOR_PLACEMENT = 0x10003; diff --git a/core/java/android/net/DnsResolver.java b/core/java/android/net/DnsResolver.java index 7a85dcbfc830..0b1a84534e38 100644 --- a/core/java/android/net/DnsResolver.java +++ b/core/java/android/net/DnsResolver.java @@ -34,6 +34,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.CancellationSignal; import android.os.Looper; +import android.os.MessageQueue; import android.system.ErrnoException; import android.util.Log; @@ -466,10 +467,20 @@ public final class DnsResolver { private void registerFDListener(@NonNull Executor executor, @NonNull FileDescriptor queryfd, @NonNull Callback<? super byte[]> answerCallback, @Nullable CancellationSignal cancellationSignal, @NonNull Object lock) { - Looper.getMainLooper().getQueue().addOnFileDescriptorEventListener( + final MessageQueue mainThreadMessageQueue = Looper.getMainLooper().getQueue(); + mainThreadMessageQueue.addOnFileDescriptorEventListener( queryfd, FD_EVENTS, (fd, events) -> { + // b/134310704 + // Unregister fd event listener before resNetworkResult is called to prevent + // race condition caused by fd reused. + // For example when querying v4 and v6, it's possible that the first query ends + // and the fd is closed before the second request starts, which might return + // the same fd for the second request. By that time, the looper must have + // unregistered the fd, otherwise another event listener can't be registered. + mainThreadMessageQueue.removeOnFileDescriptorEventListener(fd); + executor.execute(() -> { DnsResponse resp = null; ErrnoException exception = null; @@ -490,7 +501,11 @@ public final class DnsResolver { } answerCallback.onAnswer(resp.answerbuf, resp.rcode); }); - // Unregister this fd listener + + // The file descriptor has already been unregistered, so it does not really + // matter what is returned here. In spirit 0 (meaning "unregister this FD") + // is still the closest to what the looper needs to do. When returning 0, + // Looper knows to ignore the fd if it has already been unregistered. return 0; }); } diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index bb344e289657..e892b650bf40 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -18,7 +18,6 @@ package android.net; import static android.os.Process.CLAT_UID; -import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -34,7 +33,6 @@ import libcore.util.EmptyArray; import java.io.CharArrayWriter; import java.io.PrintWriter; import java.util.Arrays; -import java.util.function.Predicate; import java.util.HashSet; import java.util.Map; import java.util.Objects; @@ -995,33 +993,23 @@ public class NetworkStats implements Parcelable { if (limitUid == UID_ALL && limitTag == TAG_ALL && limitIfaces == INTERFACES_ALL) { return; } - filter(e -> (limitUid == UID_ALL || limitUid == e.uid) - && (limitTag == TAG_ALL || limitTag == e.tag) - && (limitIfaces == INTERFACES_ALL - || ArrayUtils.contains(limitIfaces, e.iface))); - } - - /** - * Only keep entries with {@link #set} value less than {@link #SET_DEBUG_START}. - * - * <p>This mutates the original structure in place. - */ - public void filterDebugEntries() { - filter(e -> e.set < SET_DEBUG_START); - } - private void filter(Predicate<Entry> predicate) { Entry entry = new Entry(); int nextOutputEntry = 0; for (int i = 0; i < size; i++) { entry = getValues(i, entry); - if (predicate.test(entry)) { - if (nextOutputEntry != i) { - setValues(nextOutputEntry, entry); - } + final boolean matches = + (limitUid == UID_ALL || limitUid == entry.uid) + && (limitTag == TAG_ALL || limitTag == entry.tag) + && (limitIfaces == INTERFACES_ALL + || ArrayUtils.contains(limitIfaces, entry.iface)); + + if (matches) { + setValues(nextOutputEntry, entry); nextOutputEntry++; } } + size = nextOutputEntry; } @@ -1187,221 +1175,133 @@ public class NetworkStats implements Parcelable { /** * VPN accounting. Move some VPN's underlying traffic to other UIDs that use tun0 iface. * - * <p>This method should only be called on delta NetworkStats. Do not call this method on a - * snapshot {@link NetworkStats} object because the tunUid and/or the underlyingIface may change - * over time. + * This method should only be called on delta NetworkStats. Do not call this method on a + * snapshot {@link NetworkStats} object because the tunUid and/or the underlyingIface may + * change over time. + * + * This method performs adjustments for one active VPN package and one VPN iface at a time. * - * <p>This method performs adjustments for one active VPN package and one VPN iface at a time. + * It is possible for the VPN software to use multiple underlying networks. This method + * only migrates traffic for the primary underlying network. * * @param tunUid uid of the VPN application * @param tunIface iface of the vpn tunnel - * @param underlyingIfaces underlying network ifaces used by the VPN application + * @param underlyingIface the primary underlying network iface used by the VPN application + * @return true if it successfully adjusts the accounting for VPN, false otherwise */ - public void migrateTun(int tunUid, @NonNull String tunIface, - @NonNull String[] underlyingIfaces) { - // Combined usage by all apps using VPN. - final Entry tunIfaceTotal = new Entry(); - // Usage by VPN, grouped by its {@code underlyingIfaces}. - final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.length]; - // Usage by VPN, summed across all its {@code underlyingIfaces}. - final Entry underlyingIfacesTotal = new Entry(); - - for (int i = 0; i < perInterfaceTotal.length; i++) { - perInterfaceTotal[i] = new Entry(); - } + public boolean migrateTun(int tunUid, String tunIface, String underlyingIface) { + Entry tunIfaceTotal = new Entry(); + Entry underlyingIfaceTotal = new Entry(); - tunAdjustmentInit(tunUid, tunIface, underlyingIfaces, tunIfaceTotal, perInterfaceTotal, - underlyingIfacesTotal); + tunAdjustmentInit(tunUid, tunIface, underlyingIface, tunIfaceTotal, underlyingIfaceTotal); - // If tunIface < underlyingIfacesTotal, it leaves the overhead traffic in the VPN app. - // If tunIface > underlyingIfacesTotal, the VPN app doesn't get credit for data compression. + // If tunIface < underlyingIface, it leaves the overhead traffic in the VPN app. + // If tunIface > underlyingIface, the VPN app doesn't get credit for data compression. // Negative stats should be avoided. - final Entry[] moved = - addTrafficToApplications(tunUid, tunIface, underlyingIfaces, tunIfaceTotal, - perInterfaceTotal, underlyingIfacesTotal); - deductTrafficFromVpnApp(tunUid, underlyingIfaces, moved); + Entry pool = tunGetPool(tunIfaceTotal, underlyingIfaceTotal); + if (pool.isEmpty()) { + return true; + } + Entry moved = + addTrafficToApplications(tunUid, tunIface, underlyingIface, tunIfaceTotal, pool); + deductTrafficFromVpnApp(tunUid, underlyingIface, moved); + + if (!moved.isEmpty()) { + Slog.wtf(TAG, "Failed to deduct underlying network traffic from VPN package. Moved=" + + moved); + return false; + } + return true; } /** * Initializes the data used by the migrateTun() method. * - * <p>This is the first pass iteration which does the following work: - * - * <ul> - * <li>Adds up all the traffic through the tunUid's underlyingIfaces (both foreground and - * background). - * <li>Adds up all the traffic through tun0 excluding traffic from the vpn app itself. - * </ul> - * - * @param tunUid uid of the VPN application - * @param tunIface iface of the vpn tunnel - * @param underlyingIfaces underlying network ifaces used by the VPN application - * @param tunIfaceTotal output parameter; combined data usage by all apps using VPN - * @param perInterfaceTotal output parameter; data usage by VPN app, grouped by its {@code - * underlyingIfaces} - * @param underlyingIfacesTotal output parameter; data usage by VPN, summed across all of its - * {@code underlyingIfaces} + * This is the first pass iteration which does the following work: + * (1) Adds up all the traffic through the tunUid's underlyingIface + * (both foreground and background). + * (2) Adds up all the traffic through tun0 excluding traffic from the vpn app itself. */ - private void tunAdjustmentInit(int tunUid, @NonNull String tunIface, - @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, - @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { - final Entry recycle = new Entry(); + private void tunAdjustmentInit(int tunUid, String tunIface, String underlyingIface, + Entry tunIfaceTotal, Entry underlyingIfaceTotal) { + Entry recycle = new Entry(); for (int i = 0; i < size; i++) { getValues(i, recycle); if (recycle.uid == UID_ALL) { throw new IllegalStateException( "Cannot adjust VPN accounting on an iface aggregated NetworkStats."); - } - if (recycle.set == SET_DBG_VPN_IN || recycle.set == SET_DBG_VPN_OUT) { + } if (recycle.set == SET_DBG_VPN_IN || recycle.set == SET_DBG_VPN_OUT) { throw new IllegalStateException( "Cannot adjust VPN accounting on a NetworkStats containing SET_DBG_VPN_*"); } - if (recycle.tag != TAG_NONE) { - // TODO(b/123666283): Take all tags for tunUid into account. - continue; + + if (recycle.uid == tunUid && recycle.tag == TAG_NONE + && Objects.equals(underlyingIface, recycle.iface)) { + underlyingIfaceTotal.add(recycle); } - if (recycle.uid == tunUid) { - // Add up traffic through tunUid's underlying interfaces. - for (int j = 0; j < underlyingIfaces.length; j++) { - if (Objects.equals(underlyingIfaces[j], recycle.iface)) { - perInterfaceTotal[j].add(recycle); - underlyingIfacesTotal.add(recycle); - break; - } - } - } else if (tunIface.equals(recycle.iface)) { + if (recycle.uid != tunUid && recycle.tag == TAG_NONE + && Objects.equals(tunIface, recycle.iface)) { // Add up all tunIface traffic excluding traffic from the vpn app itself. tunIfaceTotal.add(recycle); } } } - /** - * Distributes traffic across apps that are using given {@code tunIface}, and returns the total - * traffic that should be moved off of {@code tunUid} grouped by {@code underlyingIfaces}. - * - * @param tunUid uid of the VPN application - * @param tunIface iface of the vpn tunnel - * @param underlyingIfaces underlying network ifaces used by the VPN application - * @param tunIfaceTotal combined data usage across all apps using {@code tunIface} - * @param perInterfaceTotal data usage by VPN app, grouped by its {@code underlyingIfaces} - * @param underlyingIfacesTotal data usage by VPN, summed across all of its {@code - * underlyingIfaces} - */ - private Entry[] addTrafficToApplications(int tunUid, @NonNull String tunIface, - @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, - @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { - // Traffic that should be moved off of each underlying interface for tunUid (see - // deductTrafficFromVpnApp below). - final Entry[] moved = new Entry[underlyingIfaces.length]; - for (int i = 0; i < underlyingIfaces.length; i++) { - moved[i] = new Entry(); - } + private static Entry tunGetPool(Entry tunIfaceTotal, Entry underlyingIfaceTotal) { + Entry pool = new Entry(); + pool.rxBytes = Math.min(tunIfaceTotal.rxBytes, underlyingIfaceTotal.rxBytes); + pool.rxPackets = Math.min(tunIfaceTotal.rxPackets, underlyingIfaceTotal.rxPackets); + pool.txBytes = Math.min(tunIfaceTotal.txBytes, underlyingIfaceTotal.txBytes); + pool.txPackets = Math.min(tunIfaceTotal.txPackets, underlyingIfaceTotal.txPackets); + pool.operations = Math.min(tunIfaceTotal.operations, underlyingIfaceTotal.operations); + return pool; + } - final Entry tmpEntry = new Entry(); - final int origSize = size; - for (int i = 0; i < origSize; i++) { - if (!Objects.equals(iface[i], tunIface)) { - // Consider only entries that go onto the VPN interface. - continue; - } - if (uid[i] == tunUid) { - // Exclude VPN app from the redistribution, as it can choose to create packet - // streams by writing to itself. - continue; - } - tmpEntry.uid = uid[i]; - tmpEntry.tag = tag[i]; - tmpEntry.metered = metered[i]; - tmpEntry.roaming = roaming[i]; - tmpEntry.defaultNetwork = defaultNetwork[i]; - - // In a first pass, compute this entry's total share of data across all - // underlyingIfaces. This is computed on the basis of the share of this entry's usage - // over tunIface. - // TODO: Consider refactoring first pass into a separate helper method. - long totalRxBytes = 0; - if (tunIfaceTotal.rxBytes > 0) { - // Note - The multiplication below should not overflow since NetworkStatsService - // processes this every time device has transmitted/received amount equivalent to - // global threshold alert (~ 2MB) across all interfaces. - final long rxBytesAcrossUnderlyingIfaces = - underlyingIfacesTotal.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; - // app must not be blamed for more than it consumed on tunIface - totalRxBytes = Math.min(rxBytes[i], rxBytesAcrossUnderlyingIfaces); - } - long totalRxPackets = 0; - if (tunIfaceTotal.rxPackets > 0) { - final long rxPacketsAcrossUnderlyingIfaces = - underlyingIfacesTotal.rxPackets * rxPackets[i] / tunIfaceTotal.rxPackets; - totalRxPackets = Math.min(rxPackets[i], rxPacketsAcrossUnderlyingIfaces); - } - long totalTxBytes = 0; - if (tunIfaceTotal.txBytes > 0) { - final long txBytesAcrossUnderlyingIfaces = - underlyingIfacesTotal.txBytes * txBytes[i] / tunIfaceTotal.txBytes; - totalTxBytes = Math.min(txBytes[i], txBytesAcrossUnderlyingIfaces); - } - long totalTxPackets = 0; - if (tunIfaceTotal.txPackets > 0) { - final long txPacketsAcrossUnderlyingIfaces = - underlyingIfacesTotal.txPackets * txPackets[i] / tunIfaceTotal.txPackets; - totalTxPackets = Math.min(txPackets[i], txPacketsAcrossUnderlyingIfaces); - } - long totalOperations = 0; - if (tunIfaceTotal.operations > 0) { - final long operationsAcrossUnderlyingIfaces = - underlyingIfacesTotal.operations * operations[i] / tunIfaceTotal.operations; - totalOperations = Math.min(operations[i], operationsAcrossUnderlyingIfaces); - } - // In a second pass, distribute these values across interfaces in the proportion that - // each interface represents of the total traffic of the underlying interfaces. - for (int j = 0; j < underlyingIfaces.length; j++) { - tmpEntry.iface = underlyingIfaces[j]; - tmpEntry.rxBytes = 0; - // Reset 'set' to correct value since it gets updated when adding debug info below. - tmpEntry.set = set[i]; - if (underlyingIfacesTotal.rxBytes > 0) { - tmpEntry.rxBytes = - totalRxBytes - * perInterfaceTotal[j].rxBytes - / underlyingIfacesTotal.rxBytes; + private Entry addTrafficToApplications(int tunUid, String tunIface, String underlyingIface, + Entry tunIfaceTotal, Entry pool) { + Entry moved = new Entry(); + Entry tmpEntry = new Entry(); + tmpEntry.iface = underlyingIface; + for (int i = 0; i < size; i++) { + // the vpn app is excluded from the redistribution but all moved traffic will be + // deducted from the vpn app (see deductTrafficFromVpnApp below). + if (Objects.equals(iface[i], tunIface) && uid[i] != tunUid) { + if (tunIfaceTotal.rxBytes > 0) { + tmpEntry.rxBytes = pool.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; + } else { + tmpEntry.rxBytes = 0; } - tmpEntry.rxPackets = 0; - if (underlyingIfacesTotal.rxPackets > 0) { - tmpEntry.rxPackets = - totalRxPackets - * perInterfaceTotal[j].rxPackets - / underlyingIfacesTotal.rxPackets; + if (tunIfaceTotal.rxPackets > 0) { + tmpEntry.rxPackets = pool.rxPackets * rxPackets[i] / tunIfaceTotal.rxPackets; + } else { + tmpEntry.rxPackets = 0; } - tmpEntry.txBytes = 0; - if (underlyingIfacesTotal.txBytes > 0) { - tmpEntry.txBytes = - totalTxBytes - * perInterfaceTotal[j].txBytes - / underlyingIfacesTotal.txBytes; + if (tunIfaceTotal.txBytes > 0) { + tmpEntry.txBytes = pool.txBytes * txBytes[i] / tunIfaceTotal.txBytes; + } else { + tmpEntry.txBytes = 0; } - tmpEntry.txPackets = 0; - if (underlyingIfacesTotal.txPackets > 0) { - tmpEntry.txPackets = - totalTxPackets - * perInterfaceTotal[j].txPackets - / underlyingIfacesTotal.txPackets; + if (tunIfaceTotal.txPackets > 0) { + tmpEntry.txPackets = pool.txPackets * txPackets[i] / tunIfaceTotal.txPackets; + } else { + tmpEntry.txPackets = 0; } - tmpEntry.operations = 0; - if (underlyingIfacesTotal.operations > 0) { + if (tunIfaceTotal.operations > 0) { tmpEntry.operations = - totalOperations - * perInterfaceTotal[j].operations - / underlyingIfacesTotal.operations; + pool.operations * operations[i] / tunIfaceTotal.operations; + } else { + tmpEntry.operations = 0; } - // tmpEntry now contains the migrated data of the i-th entry for the j-th underlying - // interface. Add that data usage to this object. + tmpEntry.uid = uid[i]; + tmpEntry.tag = tag[i]; + tmpEntry.set = set[i]; + tmpEntry.metered = metered[i]; + tmpEntry.roaming = roaming[i]; + tmpEntry.defaultNetwork = defaultNetwork[i]; combineValues(tmpEntry); if (tag[i] == TAG_NONE) { - // Add the migrated data to moved so it is deducted from the VPN app later. - moved[j].add(tmpEntry); + moved.add(tmpEntry); // Add debug info tmpEntry.set = SET_DBG_VPN_IN; combineValues(tmpEntry); @@ -1411,45 +1311,38 @@ public class NetworkStats implements Parcelable { return moved; } - private void deductTrafficFromVpnApp( - int tunUid, - @NonNull String[] underlyingIfaces, - @NonNull Entry[] moved) { - for (int i = 0; i < underlyingIfaces.length; i++) { - moved[i].uid = tunUid; - // Add debug info - moved[i].set = SET_DBG_VPN_OUT; - moved[i].tag = TAG_NONE; - moved[i].iface = underlyingIfaces[i]; - moved[i].metered = METERED_ALL; - moved[i].roaming = ROAMING_ALL; - moved[i].defaultNetwork = DEFAULT_NETWORK_ALL; - combineValues(moved[i]); - - // Caveat: if the vpn software uses tag, the total tagged traffic may be greater than - // the TAG_NONE traffic. - // - // Relies on the fact that the underlying traffic only has state ROAMING_NO and - // METERED_NO, which should be the case as it comes directly from the /proc file. - // We only blend in the roaming data after applying these adjustments, by checking the - // NetworkIdentity of the underlying iface. - final int idxVpnBackground = findIndex(underlyingIfaces[i], tunUid, SET_DEFAULT, - TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); - if (idxVpnBackground != -1) { - // Note - tunSubtract also updates moved[i]; whatever traffic that's left is removed - // from foreground usage. - tunSubtract(idxVpnBackground, this, moved[i]); - } + private void deductTrafficFromVpnApp(int tunUid, String underlyingIface, Entry moved) { + // Add debug info + moved.uid = tunUid; + moved.set = SET_DBG_VPN_OUT; + moved.tag = TAG_NONE; + moved.iface = underlyingIface; + moved.metered = METERED_ALL; + moved.roaming = ROAMING_ALL; + moved.defaultNetwork = DEFAULT_NETWORK_ALL; + combineValues(moved); + + // Caveat: if the vpn software uses tag, the total tagged traffic may be greater than + // the TAG_NONE traffic. + // + // Relies on the fact that the underlying traffic only has state ROAMING_NO and METERED_NO, + // which should be the case as it comes directly from the /proc file. We only blend in the + // roaming data after applying these adjustments, by checking the NetworkIdentity of the + // underlying iface. + int idxVpnBackground = findIndex(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); + if (idxVpnBackground != -1) { + tunSubtract(idxVpnBackground, this, moved); + } - final int idxVpnForeground = findIndex(underlyingIfaces[i], tunUid, SET_FOREGROUND, - TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); - if (idxVpnForeground != -1) { - tunSubtract(idxVpnForeground, this, moved[i]); - } + int idxVpnForeground = findIndex(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, + METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); + if (idxVpnForeground != -1) { + tunSubtract(idxVpnForeground, this, moved); } } - private static void tunSubtract(int i, @NonNull NetworkStats left, @NonNull Entry right) { + private static void tunSubtract(int i, NetworkStats left, Entry right) { long rxBytes = Math.min(left.rxBytes[i], right.rxBytes); left.rxBytes[i] -= rxBytes; right.rxBytes -= rxBytes; diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 3716b3edaed4..0ee9a1192a5f 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -16,6 +16,7 @@ package android.os; +import android.Manifest; import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; @@ -25,6 +26,7 @@ import android.app.AppOpsManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; import android.provider.MediaStore; @@ -1159,11 +1161,36 @@ public class Environment { */ public static boolean isExternalStorageLegacy(@NonNull File path) { final Context context = AppGlobals.getInitialApplication(); + final int uid = context.getApplicationInfo().uid; + if (Process.isIsolated(uid)) { + return false; + } + + final PackageManager packageManager = context.getPackageManager(); + if (packageManager.isInstantApp()) { + return false; + } + + if (packageManager.checkPermission(Manifest.permission.WRITE_MEDIA_STORAGE, + context.getPackageName()) == PackageManager.PERMISSION_GRANTED) { + return true; + } + + if (packageManager.checkPermission(Manifest.permission.INSTALL_PACKAGES, + context.getPackageName()) == PackageManager.PERMISSION_GRANTED) { + return true; + } final AppOpsManager appOps = context.getSystemService(AppOpsManager.class); + final String[] packagesForUid = packageManager.getPackagesForUid(uid); + for (String packageName : packagesForUid) { + if (appOps.checkOpNoThrow(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES, + uid, packageName) == AppOpsManager.MODE_ALLOWED) { + return true; + } + } return appOps.checkOpNoThrow(AppOpsManager.OP_LEGACY_STORAGE, - context.getApplicationInfo().uid, - context.getOpPackageName()) == AppOpsManager.MODE_ALLOWED; + uid, context.getOpPackageName()) == AppOpsManager.MODE_ALLOWED; } static File getDirectory(String variableName, String defaultPath) { diff --git a/core/java/android/os/ExternalVibration.java b/core/java/android/os/ExternalVibration.java index b93bef8b33ef..37ca868598f5 100644 --- a/core/java/android/os/ExternalVibration.java +++ b/core/java/android/os/ExternalVibration.java @@ -114,6 +114,24 @@ public class ExternalVibration implements Parcelable { return true; } + /** + * Links a recipient to death against this external vibration token + */ + public void linkToDeath(IBinder.DeathRecipient recipient) { + try { + mToken.linkToDeath(recipient, 0); + } catch (RemoteException e) { + return; + } + } + + /** + * Unlinks a recipient to death against this external vibration token + */ + public void unlinkToDeath(IBinder.DeathRecipient recipient) { + mToken.unlinkToDeath(recipient, 0); + } + @Override public boolean equals(Object o) { if (o == null || !(o instanceof ExternalVibration)) { diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 24a147783669..ce1942cc6d91 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -33,11 +33,13 @@ import android.widget.Toast; import dalvik.system.VMRuntime; +import java.io.BufferedReader; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -62,6 +64,7 @@ public class GraphicsEnvironment { private static final String SYSTEM_DRIVER_VERSION_NAME = ""; private static final long SYSTEM_DRIVER_VERSION_CODE = 0; private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; + private static final String PROPERTY_GFX_DRIVER_PRERELEASE = "ro.gfx.driver.1"; private static final String PROPERTY_GFX_DRIVER_BUILD_TIME = "ro.gfx.driver_build_time"; private static final String METADATA_DRIVER_BUILD_TIME = "com.android.gamedriver.build_time"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; @@ -71,16 +74,19 @@ public class GraphicsEnvironment { "android.app.action.ANGLE_FOR_ANDROID_TOAST_MESSAGE"; private static final String INTENT_KEY_A4A_TOAST_MESSAGE = "A4A Toast Message"; private static final String GAME_DRIVER_WHITELIST_ALL = "*"; + private static final String GAME_DRIVER_SPHAL_LIBRARIES_FILENAME = "sphal_libraries.txt"; private static final int VULKAN_1_0 = 0x00400000; private static final int VULKAN_1_1 = 0x00401000; // GAME_DRIVER_ALL_APPS // 0: Default (Invalid values fallback to default as well) // 1: All apps use Game Driver - // 2: All apps use system graphics driver + // 2: All apps use Prerelease Driver + // 3: All apps use system graphics driver private static final int GAME_DRIVER_GLOBAL_OPT_IN_DEFAULT = 0; - private static final int GAME_DRIVER_GLOBAL_OPT_IN_ALL = 1; - private static final int GAME_DRIVER_GLOBAL_OPT_IN_NONE = 2; + private static final int GAME_DRIVER_GLOBAL_OPT_IN_GAME_DRIVER = 1; + private static final int GAME_DRIVER_GLOBAL_OPT_IN_PRERELEASE_DRIVER = 2; + private static final int GAME_DRIVER_GLOBAL_OPT_IN_OFF = 3; private ClassLoader mClassLoader; private String mLayerPath; @@ -114,65 +120,6 @@ public class GraphicsEnvironment { public static native void hintActivityLaunch(); /** - * Allow to query whether an application will use Game Driver. - */ - public static boolean shouldUseGameDriver(Context context, Bundle coreSettings, - ApplicationInfo applicationInfo) { - final String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); - if (driverPackageName == null || driverPackageName.isEmpty()) { - return false; - } - - // To minimize risk of driver updates crippling the device beyond user repair, never use an - // updated driver for privileged or non-updated system apps. Presumably pre-installed apps - // were tested thoroughly with the pre-installed driver. - if (applicationInfo.isPrivilegedApp() || (applicationInfo.isSystemApp() - && !applicationInfo.isUpdatedSystemApp())) { - if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app"); - return false; - } - final ContentResolver contentResolver = context.getContentResolver(); - final String packageName = applicationInfo.packageName; - final int globalOptIn; - if (coreSettings != null) { - globalOptIn = coreSettings.getInt(Settings.Global.GAME_DRIVER_ALL_APPS, 0); - } else { - globalOptIn = Settings.Global.getInt(contentResolver, - Settings.Global.GAME_DRIVER_ALL_APPS, 0); - } - if (globalOptIn == GAME_DRIVER_GLOBAL_OPT_IN_ALL) { - return true; - } - if (globalOptIn == GAME_DRIVER_GLOBAL_OPT_IN_NONE) { - return false; - } - - // GAME_DRIVER_OPT_OUT_APPS has higher priority than GAME_DRIVER_OPT_IN_APPS - if (getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_OPT_OUT_APPS).contains(packageName)) { - return false; - } - final boolean isOptIn = getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_OPT_IN_APPS).contains(packageName); - final List<String> whitelist = getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_WHITELIST); - if (!isOptIn && whitelist.indexOf(GAME_DRIVER_WHITELIST_ALL) != 0 - && !whitelist.contains(packageName)) { - return false; - } - - // If the application is not opted-in, then check whether it's on the blacklist, - // terminate early if it's on the blacklist and fallback to system driver. - if (!isOptIn - && getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_BLACKLIST) - .contains(packageName)) { - return false; - } - return true; - } - - /** * Query to determine if ANGLE should be used */ public static boolean shouldUseAngle(Context context, Bundle coreSettings, @@ -742,12 +689,102 @@ public class GraphicsEnvironment { } /** + * Return the driver package name to use. Return null for system driver. + */ + private static String chooseDriverInternal(Context context, Bundle coreSettings) { + final String gameDriver = SystemProperties.get(PROPERTY_GFX_DRIVER); + final boolean hasGameDriver = gameDriver != null && !gameDriver.isEmpty(); + + final String prereleaseDriver = SystemProperties.get(PROPERTY_GFX_DRIVER_PRERELEASE); + final boolean hasPrereleaseDriver = prereleaseDriver != null && !prereleaseDriver.isEmpty(); + + if (!hasGameDriver && !hasPrereleaseDriver) { + if (DEBUG) Log.v(TAG, "Neither Game Driver nor prerelease driver is supported."); + return null; + } + + // To minimize risk of driver updates crippling the device beyond user repair, never use an + // updated driver for privileged or non-updated system apps. Presumably pre-installed apps + // were tested thoroughly with the pre-installed driver. + final ApplicationInfo ai = context.getApplicationInfo(); + if (ai.isPrivilegedApp() || (ai.isSystemApp() && !ai.isUpdatedSystemApp())) { + if (DEBUG) Log.v(TAG, "Ignoring driver package for privileged/non-updated system app."); + return null; + } + + // Priority for Game Driver settings global on confliction (Higher priority comes first): + // 1. GAME_DRIVER_ALL_APPS + // 2. GAME_DRIVER_OPT_OUT_APPS + // 3. GAME_DRIVER_PRERELEASE_OPT_IN_APPS + // 4. GAME_DRIVER_OPT_IN_APPS + // 5. GAME_DRIVER_BLACKLIST + // 6. GAME_DRIVER_WHITELIST + switch (coreSettings.getInt(Settings.Global.GAME_DRIVER_ALL_APPS, 0)) { + case GAME_DRIVER_GLOBAL_OPT_IN_OFF: + if (DEBUG) Log.v(TAG, "Game Driver is turned off on this device."); + return null; + case GAME_DRIVER_GLOBAL_OPT_IN_GAME_DRIVER: + if (DEBUG) Log.v(TAG, "All apps opt in to use Game Driver."); + return hasGameDriver ? gameDriver : null; + case GAME_DRIVER_GLOBAL_OPT_IN_PRERELEASE_DRIVER: + if (DEBUG) Log.v(TAG, "All apps opt in to use prerelease driver."); + return hasPrereleaseDriver ? prereleaseDriver : null; + case GAME_DRIVER_GLOBAL_OPT_IN_DEFAULT: + default: + break; + } + + final String appPackageName = ai.packageName; + if (getGlobalSettingsString(null, coreSettings, Settings.Global.GAME_DRIVER_OPT_OUT_APPS) + .contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App opts out for Game Driver."); + return null; + } + + if (getGlobalSettingsString( + null, coreSettings, Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS) + .contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App opts in for prerelease Game Driver."); + return hasPrereleaseDriver ? prereleaseDriver : null; + } + + // Early return here since the rest logic is only for Game Driver. + if (!hasGameDriver) { + if (DEBUG) Log.v(TAG, "Game Driver is not supported on the device."); + return null; + } + + final boolean isOptIn = + getGlobalSettingsString(null, coreSettings, Settings.Global.GAME_DRIVER_OPT_IN_APPS) + .contains(appPackageName); + final List<String> whitelist = + getGlobalSettingsString(null, coreSettings, Settings.Global.GAME_DRIVER_WHITELIST); + if (!isOptIn && whitelist.indexOf(GAME_DRIVER_WHITELIST_ALL) != 0 + && !whitelist.contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App is not on the whitelist for Game Driver."); + return null; + } + + // If the application is not opted-in, then check whether it's on the blacklist, + // terminate early if it's on the blacklist and fallback to system driver. + if (!isOptIn + && getGlobalSettingsString( + null, coreSettings, Settings.Global.GAME_DRIVER_BLACKLIST) + .contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App is on the blacklist for Game Driver."); + return null; + } + + return gameDriver; + } + + /** * Choose whether the current process should use the builtin or an updated driver. */ private static boolean chooseDriver( Context context, Bundle coreSettings, PackageManager pm, String packageName) { - final String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); - if (driverPackageName == null || driverPackageName.isEmpty()) { + final String driverPackageName = chooseDriverInternal(context, coreSettings); + if (driverPackageName == null) { return false; } @@ -770,10 +807,6 @@ public class GraphicsEnvironment { return false; } - if (!shouldUseGameDriver(context, coreSettings, context.getApplicationInfo())) { - return false; - } - final String abi = chooseAbi(driverAppInfo); if (abi == null) { if (DEBUG) { @@ -792,10 +825,7 @@ public class GraphicsEnvironment { .append("!/lib/") .append(abi); final String paths = sb.toString(); - - final String sphalLibraries = - coreSettings.getString(Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES); - + final String sphalLibraries = getSphalLibraries(context, driverPackageName); if (DEBUG) { Log.v(TAG, "gfx driver package search path: " + paths @@ -832,6 +862,29 @@ public class GraphicsEnvironment { return null; } + private static String getSphalLibraries(Context context, String driverPackageName) { + try { + final Context driverContext = + context.createPackageContext(driverPackageName, Context.CONTEXT_RESTRICTED); + final BufferedReader reader = new BufferedReader(new InputStreamReader( + driverContext.getAssets().open(GAME_DRIVER_SPHAL_LIBRARIES_FILENAME))); + final ArrayList<String> assetStrings = new ArrayList<>(); + for (String assetString; (assetString = reader.readLine()) != null;) { + assetStrings.add(assetString); + } + return String.join(":", assetStrings); + } catch (PackageManager.NameNotFoundException e) { + if (DEBUG) { + Log.w(TAG, "Driver package '" + driverPackageName + "' not installed"); + } + } catch (IOException e) { + if (DEBUG) { + Log.w(TAG, "Failed to load '" + GAME_DRIVER_SPHAL_LIBRARIES_FILENAME + "'"); + } + } + return ""; + } + private static native int getCanLoadSystemLibraries(); private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index e50ab6cfc017..74c89d6898e5 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -511,7 +511,6 @@ public class Process { * @param appDataDir null-ok the data directory of the app. * @param invokeWith null-ok the command to invoke with. * @param packageName null-ok the name of the package this process belongs to. - * @param useSystemGraphicsDriver whether the process uses system graphics driver. * * @param zygoteArgs Additional arguments to supply to the zygote process. * @return An object that describes the result of the attempt to start the process. @@ -531,13 +530,11 @@ public class Process { @Nullable String appDataDir, @Nullable String invokeWith, @Nullable String packageName, - boolean useSystemGraphicsDriver, @Nullable String[] zygoteArgs) { return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ true, - useSystemGraphicsDriver, zygoteArgs); + /*useUsapPool=*/ true, zygoteArgs); } /** @hide */ @@ -553,13 +550,11 @@ public class Process { @Nullable String appDataDir, @Nullable String invokeWith, @Nullable String packageName, - boolean useSystemGraphicsDriver, @Nullable String[] zygoteArgs) { return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ false, - useSystemGraphicsDriver, zygoteArgs); + /*useUsapPool=*/ false, zygoteArgs); } /** diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index 035061b614f8..702b41beb071 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -330,18 +330,25 @@ public abstract class VibrationEffect implements Parcelable { @TestApi @Nullable public static VibrationEffect get(Uri uri, Context context) { + final ContentResolver cr = context.getContentResolver(); + Uri uncanonicalUri = cr.uncanonicalize(uri); + if (uncanonicalUri == null) { + // If we already had an uncanonical URI, it's possible we'll get null back here. In + // this case, just use the URI as passed in since it wasn't canonicalized in the first + // place. + uncanonicalUri = uri; + } String[] uris = context.getResources().getStringArray( com.android.internal.R.array.config_ringtoneEffectUris); for (int i = 0; i < uris.length && i < RINGTONES.length; i++) { if (uris[i] == null) { continue; } - ContentResolver cr = context.getContentResolver(); Uri mappedUri = cr.uncanonicalize(Uri.parse(uris[i])); if (mappedUri == null) { continue; } - if (mappedUri.equals(uri)) { + if (mappedUri.equals(uncanonicalUri)) { return get(RINGTONES[i]); } } diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index d42478e5031d..9bcdceef61f1 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -307,7 +307,6 @@ public class ZygoteProcess { * @param invokeWith null-ok the command to invoke with. * @param packageName null-ok the name of the package this process belongs to. * @param zygoteArgs Additional arguments to supply to the zygote process. - * @param useSystemGraphicsDriver whether the process uses system graphics driver. * * @return An object that describes the result of the attempt to start the process. * @throws RuntimeException on fatal start failure @@ -324,7 +323,6 @@ public class ZygoteProcess { @Nullable String invokeWith, @Nullable String packageName, boolean useUsapPool, - boolean useSystemGraphicsDriver, @Nullable String[] zygoteArgs) { // TODO (chriswailes): Is there a better place to check this value? if (fetchUsapPoolEnabledPropWithMinInterval()) { @@ -335,7 +333,7 @@ public class ZygoteProcess { return startViaZygote(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false, - packageName, useUsapPool, useSystemGraphicsDriver, zygoteArgs); + packageName, useUsapPool, zygoteArgs); } catch (ZygoteStartFailedEx ex) { Log.e(LOG_TAG, "Starting VM process through Zygote failed"); @@ -554,7 +552,6 @@ public class ZygoteProcess { boolean startChildZygote, @Nullable String packageName, boolean useUsapPool, - boolean useSystemGraphicsDriver, @Nullable String[] extraArgs) throws ZygoteStartFailedEx { ArrayList<String> argsForZygote = new ArrayList<>(); @@ -636,7 +633,7 @@ public class ZygoteProcess { // The USAP pool can not be used if the application will not use the systems graphics // driver. If that driver is requested use the Zygote application start path. return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), - useUsapPool && useSystemGraphicsDriver, + useUsapPool, argsForZygote); } } @@ -1147,8 +1144,7 @@ public class ZygoteProcess { gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo, abi, instructionSet, null /* appDataDir */, null /* invokeWith */, true /* startChildZygote */, null /* packageName */, - false /* useUsapPool */, false /*useSystemGraphicsDriver*/, - extraArgs); + false /* useUsapPool */, extraArgs); } catch (ZygoteStartFailedEx ex) { throw new RuntimeException("Starting child-zygote through Zygote failed", ex); } diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index e15659db90a8..182a2ffa5221 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -39,6 +39,7 @@ import java.util.Objects; * * @hide */ +@TestApi @SystemApi @SystemService(Context.PERMISSION_SERVICE) public final class PermissionManager { @@ -140,12 +141,13 @@ public final class PermissionManager { if (o == null || getClass() != o.getClass()) return false; SplitPermissionInfo that = (SplitPermissionInfo) o; return mTargetSdk == that.mTargetSdk - && Objects.equals(mSplitPerm, that.mSplitPerm); + && mSplitPerm.equals(that.mSplitPerm) + && mNewPerms.equals(that.mNewPerms); } @Override public int hashCode() { - return Objects.hash(mSplitPerm, mTargetSdk); + return Objects.hash(mSplitPerm, mNewPerms, mTargetSdk); } /** diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index 9a11104b30c1..19dbc6a2ec00 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -48,6 +48,8 @@ import java.util.concurrent.Executor; /** * Device level configuration parameters which can be tuned by a separate configuration service. + * Namespaces that end in "_native" such as {@link #NAMESPACE_NETD_NATIVE} are intended to be used + * by native code and should be pushed to system properties to make them accessible. * * @hide */ diff --git a/core/java/android/provider/OWNERS b/core/java/android/provider/OWNERS new file mode 100644 index 000000000000..8b7d6ad851f9 --- /dev/null +++ b/core/java/android/provider/OWNERS @@ -0,0 +1,4 @@ +per-file DeviceConfig.java = svetoslavganov@google.com +per-file DeviceConfig.java = hackbod@google.com + + diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 5432e33bacf8..383d8dbce791 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -12665,6 +12665,14 @@ public final class Settings { public static final String GAME_DRIVER_OPT_IN_APPS = "game_driver_opt_in_apps"; /** + * List of Apps selected to use prerelease Game Driver. + * i.e. <pkg1>,<pkg2>,...,<pkgN> + * @hide + */ + public static final String GAME_DRIVER_PRERELEASE_OPT_IN_APPS = + "game_driver_prerelease_opt_in_apps"; + + /** * List of Apps selected not to use Game Driver. * i.e. <pkg1>,<pkg2>,...,<pkgN> * @hide @@ -13569,39 +13577,6 @@ public final class Settings { "location_global_kill_switch"; /** - * If set to 1, the device identifier check will be relaxed to the previous READ_PHONE_STATE - * permission check for 3P apps. - * - * STOPSHIP: Remove this once we ship with the new device identifier check enabled. - * - * @hide - */ - public static final String PRIVILEGED_DEVICE_IDENTIFIER_3P_CHECK_RELAXED = - "privileged_device_identifier_3p_check_relaxed"; - - /** - * If set to 1, the device identifier check will be relaxed to the previous READ_PHONE_STATE - * permission check for preloaded non-privileged apps. - * - * STOPSHIP: Remove this once we ship with the new device identifier check enabled. - * - * @hide - */ - public static final String PRIVILEGED_DEVICE_IDENTIFIER_NON_PRIV_CHECK_RELAXED = - "privileged_device_identifier_non_priv_check_relaxed"; - - /** - * If set to 1, the device identifier check will be relaxed to the previous READ_PHONE_STATE - * permission check for preloaded privileged apps. - * - * STOPSHIP: Remove this once we ship with the new device identifier check enabled. - * - * @hide - */ - public static final String PRIVILEGED_DEVICE_IDENTIFIER_PRIV_CHECK_RELAXED = - "privileged_device_identifier_priv_check_relaxed"; - - /** * If set to 1, SettingsProvider's restoreAnyVersion="true" attribute will be ignored * and restoring to lower version of platform API will be skipped. * diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 3ec21e39e514..b44c9d59ebe5 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -42,7 +42,6 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Build; -import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -53,7 +52,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.Log; import android.widget.RemoteViews; @@ -64,8 +62,8 @@ import com.android.internal.os.SomeArgs; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.Objects; /** * A service that receives calls from the system when new notifications are @@ -1201,20 +1199,25 @@ public abstract class NotificationListenerService extends Service { } } - /** Convert new-style Icons to legacy representations for pre-M clients. */ - private void createLegacyIconExtras(Notification n) { - Icon smallIcon = n.getSmallIcon(); - Icon largeIcon = n.getLargeIcon(); - if (smallIcon != null && smallIcon.getType() == Icon.TYPE_RESOURCE) { - n.extras.putInt(Notification.EXTRA_SMALL_ICON, smallIcon.getResId()); - n.icon = smallIcon.getResId(); - } - if (largeIcon != null) { - Drawable d = largeIcon.loadDrawable(getContext()); - if (d != null && d instanceof BitmapDrawable) { - final Bitmap largeIconBits = ((BitmapDrawable) d).getBitmap(); - n.extras.putParcelable(Notification.EXTRA_LARGE_ICON, largeIconBits); - n.largeIcon = largeIconBits; + /** + * Convert new-style Icons to legacy representations for pre-M clients. + * @hide + */ + public final void createLegacyIconExtras(Notification n) { + if (getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.M) { + Icon smallIcon = n.getSmallIcon(); + Icon largeIcon = n.getLargeIcon(); + if (smallIcon != null && smallIcon.getType() == Icon.TYPE_RESOURCE) { + n.extras.putInt(Notification.EXTRA_SMALL_ICON, smallIcon.getResId()); + n.icon = smallIcon.getResId(); + } + if (largeIcon != null) { + Drawable d = largeIcon.loadDrawable(getContext()); + if (d != null && d instanceof BitmapDrawable) { + final Bitmap largeIconBits = ((BitmapDrawable) d).getBitmap(); + n.extras.putParcelable(Notification.EXTRA_LARGE_ICON, largeIconBits); + n.largeIcon = largeIconBits; + } } } } @@ -1442,7 +1445,7 @@ public abstract class NotificationListenerService extends Service { */ @GuardedBy("mLock") public final void applyUpdateLocked(NotificationRankingUpdate update) { - mRankingMap = new RankingMap(update); + mRankingMap = update.getRankingMap(); } /** @hide */ @@ -1480,14 +1483,14 @@ public abstract class NotificationListenerService extends Service { */ public static final int USER_SENTIMENT_POSITIVE = 1; - /** @hide */ + /** @hide */ @IntDef(prefix = { "USER_SENTIMENT_" }, value = { USER_SENTIMENT_NEGATIVE, USER_SENTIMENT_NEUTRAL, USER_SENTIMENT_POSITIVE }) @Retention(RetentionPolicy.SOURCE) public @interface UserSentiment {} - private String mKey; + private @NonNull String mKey; private int mRank = -1; private boolean mIsAmbient; private boolean mMatchesInterruptionFilter; @@ -1512,7 +1515,70 @@ public abstract class NotificationListenerService extends Service { private ArrayList<CharSequence> mSmartReplies; private boolean mCanBubble; - public Ranking() {} + private static final int PARCEL_VERSION = 2; + + public Ranking() { } + + // You can parcel it, but it's not Parcelable + /** @hide */ + @VisibleForTesting + public void writeToParcel(Parcel out, int flags) { + final long start = out.dataPosition(); + out.writeInt(PARCEL_VERSION); + out.writeString(mKey); + out.writeInt(mRank); + out.writeBoolean(mIsAmbient); + out.writeBoolean(mMatchesInterruptionFilter); + out.writeInt(mVisibilityOverride); + out.writeInt(mSuppressedVisualEffects); + out.writeInt(mImportance); + out.writeCharSequence(mImportanceExplanation); + out.writeString(mOverrideGroupKey); + out.writeParcelable(mChannel, flags); + out.writeStringList(mOverridePeople); + out.writeTypedList(mSnoozeCriteria, flags); + out.writeBoolean(mShowBadge); + out.writeInt(mUserSentiment); + out.writeBoolean(mHidden); + out.writeLong(mLastAudiblyAlertedMs); + out.writeBoolean(mNoisy); + out.writeTypedList(mSmartActions, flags); + out.writeCharSequenceList(mSmartReplies); + out.writeBoolean(mCanBubble); + } + + /** @hide */ + @VisibleForTesting + public Ranking(Parcel in) { + final ClassLoader cl = getClass().getClassLoader(); + + final int version = in.readInt(); + if (version != PARCEL_VERSION) { + throw new IllegalArgumentException("malformed Ranking parcel: " + in + " version " + + version + ", expected " + PARCEL_VERSION); + } + mKey = in.readString(); + mRank = in.readInt(); + mIsAmbient = in.readBoolean(); + mMatchesInterruptionFilter = in.readBoolean(); + mVisibilityOverride = in.readInt(); + mSuppressedVisualEffects = in.readInt(); + mImportance = in.readInt(); + mImportanceExplanation = in.readCharSequence(); // may be null + mOverrideGroupKey = in.readString(); // may be null + mChannel = (NotificationChannel) in.readParcelable(cl); // may be null + mOverridePeople = in.createStringArrayList(); + mSnoozeCriteria = in.createTypedArrayList(SnoozeCriterion.CREATOR); + mShowBadge = in.readBoolean(); + mUserSentiment = in.readInt(); + mHidden = in.readBoolean(); + mLastAudiblyAlertedMs = in.readLong(); + mNoisy = in.readBoolean(); + mSmartActions = in.createTypedArrayList(Notification.Action.CREATOR); + mSmartReplies = in.readCharSequenceList(); + mCanBubble = in.readBoolean(); + } + /** * Returns the key of the notification this Ranking applies to. @@ -1737,6 +1803,31 @@ public abstract class NotificationListenerService extends Service { } /** + * @hide + */ + public void populate(Ranking other) { + populate(other.mKey, + other.mRank, + other.mMatchesInterruptionFilter, + other.mVisibilityOverride, + other.mSuppressedVisualEffects, + other.mImportance, + other.mImportanceExplanation, + other.mOverrideGroupKey, + other.mChannel, + other.mOverridePeople, + other.mSnoozeCriteria, + other.mShowBadge, + other.mUserSentiment, + other.mHidden, + other.mLastAudiblyAlertedMs, + other.mNoisy, + other.mSmartActions, + other.mSmartReplies, + other.mCanBubble); + } + + /** * {@hide} */ public static String importanceToString(int importance) { @@ -1758,6 +1849,35 @@ public abstract class NotificationListenerService extends Service { return "UNKNOWN(" + String.valueOf(importance) + ")"; } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Ranking other = (Ranking) o; + return Objects.equals(mKey, other.mKey) + && Objects.equals(mRank, other.mRank) + && Objects.equals(mMatchesInterruptionFilter, other.mMatchesInterruptionFilter) + && Objects.equals(mVisibilityOverride, other.mVisibilityOverride) + && Objects.equals(mSuppressedVisualEffects, other.mSuppressedVisualEffects) + && Objects.equals(mImportance, other.mImportance) + && Objects.equals(mImportanceExplanation, other.mImportanceExplanation) + && Objects.equals(mOverrideGroupKey, other.mOverrideGroupKey) + && Objects.equals(mChannel, other.mChannel) + && Objects.equals(mOverridePeople, other.mOverridePeople) + && Objects.equals(mSnoozeCriteria, other.mSnoozeCriteria) + && Objects.equals(mShowBadge, other.mShowBadge) + && Objects.equals(mUserSentiment, other.mUserSentiment) + && Objects.equals(mHidden, other.mHidden) + && Objects.equals(mLastAudiblyAlertedMs, other.mLastAudiblyAlertedMs) + && Objects.equals(mNoisy, other.mNoisy) + // Action.equals() doesn't exist so let's just compare list lengths + && ((mSmartActions == null ? 0 : mSmartActions.size()) + == (other.mSmartActions == null ? 0 : other.mSmartActions.size())) + && Objects.equals(mSmartReplies, other.mSmartReplies) + && Objects.equals(mCanBubble, other.mCanBubble); + } } /** @@ -1769,413 +1889,66 @@ public abstract class NotificationListenerService extends Service { * notifications active at the time of retrieval. */ public static class RankingMap implements Parcelable { - private final NotificationRankingUpdate mRankingUpdate; - private ArrayMap<String,Integer> mRanks; - private ArraySet<Object> mIntercepted; - private ArrayMap<String, Integer> mVisibilityOverrides; - private ArrayMap<String, Integer> mSuppressedVisualEffects; - private ArrayMap<String, Integer> mImportance; - private ArrayMap<String, String> mImportanceExplanation; - private ArrayMap<String, String> mOverrideGroupKeys; - private ArrayMap<String, NotificationChannel> mChannels; - private ArrayMap<String, ArrayList<String>> mOverridePeople; - private ArrayMap<String, ArrayList<SnoozeCriterion>> mSnoozeCriteria; - private ArrayMap<String, Boolean> mShowBadge; - private ArrayMap<String, Integer> mUserSentiment; - private ArrayMap<String, Boolean> mHidden; - private ArrayMap<String, Long> mLastAudiblyAlerted; - private ArrayMap<String, Boolean> mNoisy; - private ArrayMap<String, ArrayList<Notification.Action>> mSmartActions; - private ArrayMap<String, ArrayList<CharSequence>> mSmartReplies; - private boolean[] mCanBubble; - - private RankingMap(NotificationRankingUpdate rankingUpdate) { - mRankingUpdate = rankingUpdate; - } - - /** - * Request the list of notification keys in their current ranking - * order. - * - * @return An array of active notification keys, in their ranking order. - */ - public String[] getOrderedKeys() { - return mRankingUpdate.getOrderedKeys(); - } + private ArrayList<String> mOrderedKeys = new ArrayList<>(); + // Note: all String keys should be intern'd as pointers into mOrderedKeys + private ArrayMap<String, Ranking> mRankings = new ArrayMap<>(); /** - * Populates outRanking with ranking information for the notification - * with the given key. - * - * @return true if a valid key has been passed and outRanking has - * been populated; false otherwise + * @hide */ - public boolean getRanking(String key, Ranking outRanking) { - int rank = getRank(key); - outRanking.populate(key, rank, !isIntercepted(key), - getVisibilityOverride(key), getSuppressedVisualEffects(key), - getImportance(key), getImportanceExplanation(key), getOverrideGroupKey(key), - getChannel(key), getOverridePeople(key), getSnoozeCriteria(key), - getShowBadge(key), getUserSentiment(key), getHidden(key), - getLastAudiblyAlerted(key), getNoisy(key), getSmartActions(key), - getSmartReplies(key), canBubble(key)); - return rank >= 0; - } - - private int getRank(String key) { - synchronized (this) { - if (mRanks == null) { - buildRanksLocked(); - } + public RankingMap(Ranking[] rankings) { + for (int i = 0; i < rankings.length; i++) { + final String key = rankings[i].getKey(); + mOrderedKeys.add(key); + mRankings.put(key, rankings[i]); } - Integer rank = mRanks.get(key); - return rank != null ? rank : -1; } - private boolean isIntercepted(String key) { - synchronized (this) { - if (mIntercepted == null) { - buildInterceptedSetLocked(); - } - } - return mIntercepted.contains(key); - } + // -- parcelable interface -- - private int getVisibilityOverride(String key) { - synchronized (this) { - if (mVisibilityOverrides == null) { - buildVisibilityOverridesLocked(); - } - } - Integer override = mVisibilityOverrides.get(key); - if (override == null) { - return Ranking.VISIBILITY_NO_OVERRIDE; + private RankingMap(Parcel in) { + final ClassLoader cl = getClass().getClassLoader(); + final int count = in.readInt(); + mOrderedKeys.ensureCapacity(count); + mRankings.ensureCapacity(count); + for (int i = 0; i < count; i++) { + final Ranking r = new Ranking(in); + final String key = r.getKey(); + mOrderedKeys.add(key); + mRankings.put(key, r); } - return override.intValue(); } - private int getSuppressedVisualEffects(String key) { - synchronized (this) { - if (mSuppressedVisualEffects == null) { - buildSuppressedVisualEffectsLocked(); - } - } - Integer suppressed = mSuppressedVisualEffects.get(key); - if (suppressed == null) { - return 0; - } - return suppressed.intValue(); - } - - private int getImportance(String key) { - synchronized (this) { - if (mImportance == null) { - buildImportanceLocked(); - } - } - Integer importance = mImportance.get(key); - if (importance == null) { - return NotificationManager.IMPORTANCE_DEFAULT; - } - return importance.intValue(); - } - - private String getImportanceExplanation(String key) { - synchronized (this) { - if (mImportanceExplanation == null) { - buildImportanceExplanationLocked(); - } - } - return mImportanceExplanation.get(key); - } - - private String getOverrideGroupKey(String key) { - synchronized (this) { - if (mOverrideGroupKeys == null) { - buildOverrideGroupKeys(); - } - } - return mOverrideGroupKeys.get(key); - } - - private NotificationChannel getChannel(String key) { - synchronized (this) { - if (mChannels == null) { - buildChannelsLocked(); - } - } - return mChannels.get(key); - } - - private ArrayList<String> getOverridePeople(String key) { - synchronized (this) { - if (mOverridePeople == null) { - buildOverridePeopleLocked(); - } - } - return mOverridePeople.get(key); - } - - private ArrayList<SnoozeCriterion> getSnoozeCriteria(String key) { - synchronized (this) { - if (mSnoozeCriteria == null) { - buildSnoozeCriteriaLocked(); - } - } - return mSnoozeCriteria.get(key); - } - - private boolean getShowBadge(String key) { - synchronized (this) { - if (mShowBadge == null) { - buildShowBadgeLocked(); - } - } - Boolean showBadge = mShowBadge.get(key); - return showBadge == null ? false : showBadge.booleanValue(); - } - - private int getUserSentiment(String key) { - synchronized (this) { - if (mUserSentiment == null) { - buildUserSentimentLocked(); - } - } - Integer userSentiment = mUserSentiment.get(key); - return userSentiment == null - ? Ranking.USER_SENTIMENT_NEUTRAL : userSentiment.intValue(); - } - - private boolean getHidden(String key) { - synchronized (this) { - if (mHidden == null) { - buildHiddenLocked(); - } - } - Boolean hidden = mHidden.get(key); - return hidden == null ? false : hidden.booleanValue(); - } - - private long getLastAudiblyAlerted(String key) { - synchronized (this) { - if (mLastAudiblyAlerted == null) { - buildLastAudiblyAlertedLocked(); - } - } - Long lastAudibleAlerted = mLastAudiblyAlerted.get(key); - return lastAudibleAlerted == null ? -1 : lastAudibleAlerted.longValue(); - } - - private boolean getNoisy(String key) { - synchronized (this) { - if (mNoisy == null) { - buildNoisyLocked(); - } - } - Boolean noisy = mNoisy.get(key); - return noisy == null ? false : noisy.booleanValue(); - } - - private ArrayList<Notification.Action> getSmartActions(String key) { - synchronized (this) { - if (mSmartActions == null) { - buildSmartActions(); - } - } - return mSmartActions.get(key); - } - - private ArrayList<CharSequence> getSmartReplies(String key) { - synchronized (this) { - if (mSmartReplies == null) { - buildSmartReplies(); - } - } - return mSmartReplies.get(key); - } - - private boolean canBubble(String key) { - synchronized (this) { - if (mRanks == null) { - buildRanksLocked(); - } - if (mCanBubble == null) { - mCanBubble = mRankingUpdate.getCanBubble(); - } - } - int keyIndex = mRanks.getOrDefault(key, -1); - return keyIndex >= 0 ? mCanBubble[keyIndex] : false; - } - - // Locked by 'this' - private void buildRanksLocked() { - String[] orderedKeys = mRankingUpdate.getOrderedKeys(); - mRanks = new ArrayMap<>(orderedKeys.length); - for (int i = 0; i < orderedKeys.length; i++) { - String key = orderedKeys[i]; - mRanks.put(key, i); - } - } - - // Locked by 'this' - private void buildInterceptedSetLocked() { - String[] dndInterceptedKeys = mRankingUpdate.getInterceptedKeys(); - mIntercepted = new ArraySet<>(dndInterceptedKeys.length); - Collections.addAll(mIntercepted, dndInterceptedKeys); - } - - private ArrayMap<String, Integer> buildIntMapFromBundle(Bundle bundle) { - ArrayMap<String, Integer> newMap = new ArrayMap<>(bundle.size()); - for (String key : bundle.keySet()) { - newMap.put(key, bundle.getInt(key)); - } - return newMap; - } - - private ArrayMap<String, String> buildStringMapFromBundle(Bundle bundle) { - ArrayMap<String, String> newMap = new ArrayMap<>(bundle.size()); - for (String key : bundle.keySet()) { - newMap.put(key, bundle.getString(key)); - } - return newMap; - } - - private ArrayMap<String, Boolean> buildBooleanMapFromBundle(Bundle bundle) { - ArrayMap<String, Boolean> newMap = new ArrayMap<>(bundle.size()); - for (String key : bundle.keySet()) { - newMap.put(key, bundle.getBoolean(key)); - } - return newMap; - } - - private ArrayMap<String, Long> buildLongMapFromBundle(Bundle bundle) { - ArrayMap<String, Long> newMap = new ArrayMap<>(bundle.size()); - for (String key : bundle.keySet()) { - newMap.put(key, bundle.getLong(key)); - } - return newMap; - } - - // Locked by 'this' - private void buildVisibilityOverridesLocked() { - mVisibilityOverrides = buildIntMapFromBundle(mRankingUpdate.getVisibilityOverrides()); - } - - // Locked by 'this' - private void buildSuppressedVisualEffectsLocked() { - mSuppressedVisualEffects = - buildIntMapFromBundle(mRankingUpdate.getSuppressedVisualEffects()); - } - - // Locked by 'this' - private void buildImportanceLocked() { - String[] orderedKeys = mRankingUpdate.getOrderedKeys(); - int[] importance = mRankingUpdate.getImportance(); - mImportance = new ArrayMap<>(orderedKeys.length); - for (int i = 0; i < orderedKeys.length; i++) { - String key = orderedKeys[i]; - mImportance.put(key, importance[i]); - } - } - - // Locked by 'this' - private void buildImportanceExplanationLocked() { - mImportanceExplanation = - buildStringMapFromBundle(mRankingUpdate.getImportanceExplanation()); - } - - // Locked by 'this' - private void buildOverrideGroupKeys() { - mOverrideGroupKeys = buildStringMapFromBundle(mRankingUpdate.getOverrideGroupKeys()); - } - - // Locked by 'this' - private void buildChannelsLocked() { - Bundle channels = mRankingUpdate.getChannels(); - mChannels = new ArrayMap<>(channels.size()); - for (String key : channels.keySet()) { - mChannels.put(key, channels.getParcelable(key)); - } - } - - // Locked by 'this' - private void buildOverridePeopleLocked() { - Bundle overridePeople = mRankingUpdate.getOverridePeople(); - mOverridePeople = new ArrayMap<>(overridePeople.size()); - for (String key : overridePeople.keySet()) { - mOverridePeople.put(key, overridePeople.getStringArrayList(key)); - } - } - - // Locked by 'this' - private void buildSnoozeCriteriaLocked() { - Bundle snoozeCriteria = mRankingUpdate.getSnoozeCriteria(); - mSnoozeCriteria = new ArrayMap<>(snoozeCriteria.size()); - for (String key : snoozeCriteria.keySet()) { - mSnoozeCriteria.put(key, snoozeCriteria.getParcelableArrayList(key)); - } - } - - // Locked by 'this' - private void buildShowBadgeLocked() { - mShowBadge = buildBooleanMapFromBundle(mRankingUpdate.getShowBadge()); - } - - // Locked by 'this' - private void buildUserSentimentLocked() { - mUserSentiment = buildIntMapFromBundle(mRankingUpdate.getUserSentiment()); - } - - // Locked by 'this' - private void buildHiddenLocked() { - mHidden = buildBooleanMapFromBundle(mRankingUpdate.getHidden()); - } - - // Locked by 'this' - private void buildLastAudiblyAlertedLocked() { - mLastAudiblyAlerted = buildLongMapFromBundle(mRankingUpdate.getLastAudiblyAlerted()); - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; - // Locked by 'this' - private void buildNoisyLocked() { - mNoisy = buildBooleanMapFromBundle(mRankingUpdate.getNoisy()); - } + RankingMap other = (RankingMap) o; - // Locked by 'this' - private void buildSmartActions() { - Bundle smartActions = mRankingUpdate.getSmartActions(); - mSmartActions = new ArrayMap<>(smartActions.size()); - for (String key : smartActions.keySet()) { - mSmartActions.put(key, smartActions.getParcelableArrayList(key)); - } - } + return mOrderedKeys.equals(other.mOrderedKeys) + && mRankings.equals(other.mRankings); - // Locked by 'this' - private void buildSmartReplies() { - Bundle smartReplies = mRankingUpdate.getSmartReplies(); - mSmartReplies = new ArrayMap<>(smartReplies.size()); - for (String key : smartReplies.keySet()) { - mSmartReplies.put(key, smartReplies.getCharSequenceArrayList(key)); - } } - // ----------- Parcelable - @Override public int describeContents() { return 0; } @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeParcelable(mRankingUpdate, flags); + public void writeToParcel(Parcel out, int flags) { + final int count = mOrderedKeys.size(); + out.writeInt(count); + for (int i = 0; i < count; i++) { + mRankings.get(mOrderedKeys.get(i)).writeToParcel(out, flags); + } } public static final @android.annotation.NonNull Creator<RankingMap> CREATOR = new Creator<RankingMap>() { @Override public RankingMap createFromParcel(Parcel source) { - NotificationRankingUpdate rankingUpdate = source.readParcelable(null); - return new RankingMap(rankingUpdate); + return new RankingMap(source); } @Override @@ -2183,6 +1956,42 @@ public abstract class NotificationListenerService extends Service { return new RankingMap[size]; } }; + + /** + * Request the list of notification keys in their current ranking + * order. + * + * @return An array of active notification keys, in their ranking order. + */ + public String[] getOrderedKeys() { + return mOrderedKeys.toArray(new String[0]); + } + + /** + * Populates outRanking with ranking information for the notification + * with the given key. + * + * @return true if a valid key has been passed and outRanking has + * been populated; false otherwise + */ + public boolean getRanking(String key, Ranking outRanking) { + if (mRankings.containsKey(key)) { + outRanking.populate(mRankings.get(key)); + return true; + } + return false; + } + + /** + * Get a reference to the actual Ranking object corresponding to the key. + * Used only by unit tests. + * + * @hide + */ + @VisibleForTesting + public Ranking getRawRankingObject(String key) { + return mRankings.get(key); + } } private final class MyHandler extends Handler { diff --git a/core/java/android/service/notification/NotificationRankingUpdate.java b/core/java/android/service/notification/NotificationRankingUpdate.java index c5c70f808325..675c5cd63100 100644 --- a/core/java/android/service/notification/NotificationRankingUpdate.java +++ b/core/java/android/service/notification/NotificationRankingUpdate.java @@ -15,7 +15,6 @@ */ package android.service.notification; -import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -23,73 +22,18 @@ import android.os.Parcelable; * @hide */ public class NotificationRankingUpdate implements Parcelable { - // TODO: Support incremental updates. - private final String[] mKeys; - private final String[] mInterceptedKeys; - private final Bundle mVisibilityOverrides; - private final Bundle mSuppressedVisualEffects; - private final int[] mImportance; - private final Bundle mImportanceExplanation; - private final Bundle mOverrideGroupKeys; - private final Bundle mChannels; - private final Bundle mOverridePeople; - private final Bundle mSnoozeCriteria; - private final Bundle mShowBadge; - private final Bundle mUserSentiment; - private final Bundle mHidden; - private final Bundle mSmartActions; - private final Bundle mSmartReplies; - private final Bundle mLastAudiblyAlerted; - private final Bundle mNoisy; - private final boolean[] mCanBubble; + private final NotificationListenerService.RankingMap mRankingMap; - public NotificationRankingUpdate(String[] keys, String[] interceptedKeys, - Bundle visibilityOverrides, Bundle suppressedVisualEffects, - int[] importance, Bundle explanation, Bundle overrideGroupKeys, - Bundle channels, Bundle overridePeople, Bundle snoozeCriteria, - Bundle showBadge, Bundle userSentiment, Bundle hidden, Bundle smartActions, - Bundle smartReplies, Bundle lastAudiblyAlerted, Bundle noisy, boolean[] canBubble) { - mKeys = keys; - mInterceptedKeys = interceptedKeys; - mVisibilityOverrides = visibilityOverrides; - mSuppressedVisualEffects = suppressedVisualEffects; - mImportance = importance; - mImportanceExplanation = explanation; - mOverrideGroupKeys = overrideGroupKeys; - mChannels = channels; - mOverridePeople = overridePeople; - mSnoozeCriteria = snoozeCriteria; - mShowBadge = showBadge; - mUserSentiment = userSentiment; - mHidden = hidden; - mSmartActions = smartActions; - mSmartReplies = smartReplies; - mLastAudiblyAlerted = lastAudiblyAlerted; - mNoisy = noisy; - mCanBubble = canBubble; + public NotificationRankingUpdate(NotificationListenerService.Ranking[] rankings) { + mRankingMap = new NotificationListenerService.RankingMap(rankings); } public NotificationRankingUpdate(Parcel in) { - mKeys = in.readStringArray(); - mInterceptedKeys = in.readStringArray(); - mVisibilityOverrides = in.readBundle(); - mSuppressedVisualEffects = in.readBundle(); - mImportance = new int[mKeys.length]; - in.readIntArray(mImportance); - mImportanceExplanation = in.readBundle(); - mOverrideGroupKeys = in.readBundle(); - mChannels = in.readBundle(); - mOverridePeople = in.readBundle(); - mSnoozeCriteria = in.readBundle(); - mShowBadge = in.readBundle(); - mUserSentiment = in.readBundle(); - mHidden = in.readBundle(); - mSmartActions = in.readBundle(); - mSmartReplies = in.readBundle(); - mLastAudiblyAlerted = in.readBundle(); - mNoisy = in.readBundle(); - mCanBubble = new boolean[mKeys.length]; - in.readBooleanArray(mCanBubble); + mRankingMap = in.readParcelable(getClass().getClassLoader()); + } + + public NotificationListenerService.RankingMap getRankingMap() { + return mRankingMap; } @Override @@ -98,25 +42,17 @@ public class NotificationRankingUpdate implements Parcelable { } @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + NotificationRankingUpdate other = (NotificationRankingUpdate) o; + return mRankingMap.equals(other.mRankingMap); + } + + @Override public void writeToParcel(Parcel out, int flags) { - out.writeStringArray(mKeys); - out.writeStringArray(mInterceptedKeys); - out.writeBundle(mVisibilityOverrides); - out.writeBundle(mSuppressedVisualEffects); - out.writeIntArray(mImportance); - out.writeBundle(mImportanceExplanation); - out.writeBundle(mOverrideGroupKeys); - out.writeBundle(mChannels); - out.writeBundle(mOverridePeople); - out.writeBundle(mSnoozeCriteria); - out.writeBundle(mShowBadge); - out.writeBundle(mUserSentiment); - out.writeBundle(mHidden); - out.writeBundle(mSmartActions); - out.writeBundle(mSmartReplies); - out.writeBundle(mLastAudiblyAlerted); - out.writeBundle(mNoisy); - out.writeBooleanArray(mCanBubble); + out.writeParcelable(mRankingMap, flags); } public static final @android.annotation.NonNull Parcelable.Creator<NotificationRankingUpdate> CREATOR @@ -129,76 +65,4 @@ public class NotificationRankingUpdate implements Parcelable { return new NotificationRankingUpdate[size]; } }; - - public String[] getOrderedKeys() { - return mKeys; - } - - public String[] getInterceptedKeys() { - return mInterceptedKeys; - } - - public Bundle getVisibilityOverrides() { - return mVisibilityOverrides; - } - - public Bundle getSuppressedVisualEffects() { - return mSuppressedVisualEffects; - } - - public int[] getImportance() { - return mImportance; - } - - public Bundle getImportanceExplanation() { - return mImportanceExplanation; - } - - public Bundle getOverrideGroupKeys() { - return mOverrideGroupKeys; - } - - public Bundle getChannels() { - return mChannels; - } - - public Bundle getOverridePeople() { - return mOverridePeople; - } - - public Bundle getSnoozeCriteria() { - return mSnoozeCriteria; - } - - public Bundle getShowBadge() { - return mShowBadge; - } - - public Bundle getUserSentiment() { - return mUserSentiment; - } - - public Bundle getHidden() { - return mHidden; - } - - public Bundle getSmartActions() { - return mSmartActions; - } - - public Bundle getSmartReplies() { - return mSmartReplies; - } - - public Bundle getLastAudiblyAlerted() { - return mLastAudiblyAlerted; - } - - public Bundle getNoisy() { - return mNoisy; - } - - public boolean[] getCanBubble() { - return mCanBubble; - } } diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java index 50e7ec30ec3a..df54209bc043 100644 --- a/core/java/android/text/util/Linkify.java +++ b/core/java/android/text/util/Linkify.java @@ -67,6 +67,14 @@ import java.util.regex.Pattern; * create <code>http://example.com</code> when the clickable URL link is * created. * + * <p class="note"><b>Note:</b> When using {@link #MAP_ADDRESSES} or {@link #ALL} + * to match street addresses on API level {@link android.os.Build.VERSION_CODES#O_MR1} + * and earlier, methods in this class may throw + * {@link android.util.AndroidRuntimeException} or other exceptions if the + * device's WebView implementation is currently being updated, because + * {@link android.webkit.WebView#findAddress} is required to match street + * addresses. + * * @see MatchFilter * @see TransformFilter */ @@ -95,10 +103,11 @@ public class Linkify { /** * Bit field indicating that street addresses should be matched in methods that - * take an options mask. Note that this uses the - * {@link android.webkit.WebView#findAddress(String) findAddress()} method in - * {@link android.webkit.WebView} for finding addresses, which has various - * limitations and has been deprecated. + * take an options mask. Note that this should be avoided, as it uses the + * {@link android.webkit.WebView#findAddress(String)} method, which has various + * limitations and has been deprecated: see the documentation for + * {@link android.webkit.WebView#findAddress(String)} for more information. + * * @deprecated use {@link android.view.textclassifier.TextClassifier#generateLinks( * TextLinks.Request)} instead and avoid it even when targeting API levels where no alternative * is available. diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index 1bcfc05224ca..7c7223c04b59 100755 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -157,6 +157,14 @@ public class DisplayMetrics { public static final int DENSITY_440 = 440; /** + * Intermediate density for screens that sit somewhere between + * {@link #DENSITY_XHIGH} (320 dpi) and {@link #DENSITY_XXHIGH} (480 dpi). + * This is not a density that applications should target, instead relying + * on the system to scale their {@link #DENSITY_XXHIGH} assets for them. + */ + public static final int DENSITY_450 = 450; + + /** * Standard quantized DPI for extra-extra-high-density screens. */ public static final int DENSITY_XXHIGH = 480; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7a3609a61614..3adddc790c67 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2002,18 +2002,9 @@ public final class ViewRootImpl implements ViewParent, mDisplay.getRealSize(size); desiredWindowWidth = size.x; desiredWindowHeight = size.y; - } else if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT - || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) { - // For wrap content, we have to remeasure later on anyways. Use size consistent with - // below so we get best use of the measure cache. - desiredWindowWidth = dipToPx(config.screenWidthDp); - desiredWindowHeight = dipToPx(config.screenHeightDp); } else { - // After addToDisplay, the frame contains the frameHint from window manager, which - // for most windows is going to be the same size as the result of relayoutWindow. - // Using this here allows us to avoid remeasuring after relayoutWindow - desiredWindowWidth = frame.width(); - desiredWindowHeight = frame.height(); + desiredWindowWidth = mWinFrame.width(); + desiredWindowHeight = mWinFrame.height(); } // We used to use the following condition to choose 32 bits drawing caches: diff --git a/core/java/android/view/accessibility/AccessibilityNodeIdManager.java b/core/java/android/view/accessibility/AccessibilityNodeIdManager.java index 0f5e950582dd..d78dadd294ca 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeIdManager.java +++ b/core/java/android/view/accessibility/AccessibilityNodeIdManager.java @@ -16,12 +16,11 @@ package android.view.accessibility; -import android.util.SparseArray; import android.view.View; /** @hide */ public final class AccessibilityNodeIdManager { - private SparseArray<View> mIdsToViews = new SparseArray<>(); + private WeakSparseArray<View> mIdsToViews = new WeakSparseArray<View>(); private static AccessibilityNodeIdManager sIdManager; /** diff --git a/core/java/android/view/accessibility/WeakSparseArray.java b/core/java/android/view/accessibility/WeakSparseArray.java new file mode 100644 index 000000000000..04a4cc7f062b --- /dev/null +++ b/core/java/android/view/accessibility/WeakSparseArray.java @@ -0,0 +1,63 @@ +/* + * 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 android.view.accessibility; + +import android.util.SparseArray; + +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; + + +final class WeakSparseArray<E> { + + private final ReferenceQueue<E> mRefQueue = new ReferenceQueue<>(); + private final SparseArray<WeakReferenceWithId<E>> mSparseArray = new SparseArray<>(); + + public void append(int key, E value) { + removeUnreachableValues(); + mSparseArray.append(key, new WeakReferenceWithId(value, mRefQueue, key)); + } + + public void remove(int key) { + removeUnreachableValues(); + mSparseArray.remove(key); + } + + public E get(int key) { + removeUnreachableValues(); + WeakReferenceWithId<E> ref = mSparseArray.get(key); + return ref != null ? ref.get() : null; + } + + private void removeUnreachableValues() { + for (Reference ref = mRefQueue.poll(); ref != null; ref = mRefQueue.poll()) { + mSparseArray.remove(((WeakReferenceWithId) ref).mId); + } + } + + private static class WeakReferenceWithId<E> extends WeakReference<E> { + + final int mId; + + WeakReferenceWithId(E referent, ReferenceQueue<? super E> q, int id) { + super(referent, q); + mId = id; + } + } +} + diff --git a/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java b/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java index 9c268f2d18a8..3ed48f655d47 100644 --- a/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java +++ b/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java @@ -19,7 +19,9 @@ package android.view.textclassifier; import android.annotation.Nullable; import android.app.Person; import android.app.RemoteAction; +import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Pair; @@ -200,10 +202,12 @@ public final class ActionsSuggestionsHelper { if (remoteAction == null) { return null; } + Intent actionIntent = ExtrasUtils.getActionIntent(conversationAction.getExtras()); + ComponentName componentName = actionIntent.getComponent(); + // Action without a component name will be considered as from the same app. + String packageName = componentName == null ? null : componentName.getPackageName(); return new Pair<>( - conversationAction.getAction().getTitle().toString(), - ExtrasUtils.getActionIntent( - conversationAction.getExtras()).getComponent().getPackageName()); + conversationAction.getAction().getTitle().toString(), packageName); } private static final class PersonEncoder { diff --git a/core/java/android/view/textclassifier/intent/LabeledIntent.java b/core/java/android/view/textclassifier/intent/LabeledIntent.java index b4bc8d39d562..30fc20ea86a1 100644 --- a/core/java/android/view/textclassifier/intent/LabeledIntent.java +++ b/core/java/android/view/textclassifier/intent/LabeledIntent.java @@ -118,14 +118,16 @@ public final class LabeledIntent { return null; } Intent resolvedIntent = new Intent(intent); - resolvedIntent.setComponent(new ComponentName(packageName, className)); resolvedIntent.putExtra( TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, getFromTextClassifierExtra(textLanguagesBundle)); - boolean shouldShowIcon = false; Icon icon = null; if (!"android".equals(packageName)) { + // We only set the component name when the package name is not resolved to "android" + // to workaround a bug that explicit intent with component name == ResolverActivity + // can't be launched on keyguard. + resolvedIntent.setComponent(new ComponentName(packageName, className)); if (resolveInfo.activityInfo.getIconResource() != 0) { icon = Icon.createWithResource( packageName, resolveInfo.activityInfo.getIconResource()); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 137b67c6e63e..14be73dec41c 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -1603,9 +1603,9 @@ public class WebView extends AbsoluteLayout } /** - * Gets the first substring consisting of the address of a physical - * location. Currently, only addresses in the United States are detected, - * and consist of: + * Gets the first substring which appears to be the address of a physical + * location. Only addresses in the United States can be detected, which + * must consist of: * <ul> * <li>a house number</li> * <li>a street name</li> @@ -1621,9 +1621,17 @@ public class WebView extends AbsoluteLayout * or abbreviated using USPS standards. The house number may not exceed * five digits. * + * <p class="note"><b>Note:</b> This function is deprecated and should be + * avoided on all API levels, as it cannot detect addresses outside of the + * United States and has a high rate of false positives. On API level + * {@link android.os.Build.VERSION_CODES#O_MR1} and earlier, it also causes + * the entire WebView implementation to be loaded and initialized, which + * can throw {@link android.util.AndroidRuntimeException} or other exceptions + * if the WebView implementation is currently being updated. + * * @param addr the string to search for addresses * @return the address, or if no address is found, {@code null} - * @deprecated this method is superseded by {@link TextClassifier#generateLinks( + * @deprecated This method is superseded by {@link TextClassifier#generateLinks( * android.view.textclassifier.TextLinks.Request)}. Avoid using this method even when targeting * API levels where no alternative is available. */ diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 4cb552d29c32..85e9e4950cba 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2553,34 +2553,42 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te final boolean isItemEnabled; final ViewGroup.LayoutParams lp = view.getLayoutParams(); if (lp instanceof AbsListView.LayoutParams) { - isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled; + isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled && isEnabled(); } else { isItemEnabled = false; } - if (!isEnabled() || !isItemEnabled) { - info.setEnabled(false); - return; - } + info.setEnabled(isItemEnabled); if (position == getSelectedItemPosition()) { info.setSelected(true); - info.addAction(AccessibilityAction.ACTION_CLEAR_SELECTION); - } else { - info.addAction(AccessibilityAction.ACTION_SELECT); + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_CLEAR_SELECTION); + } else { + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_SELECT); } if (isItemClickable(view)) { - info.addAction(AccessibilityAction.ACTION_CLICK); + addAccessibilityActionIfEnabled(info, isItemEnabled, AccessibilityAction.ACTION_CLICK); info.setClickable(true); } if (isLongClickable()) { - info.addAction(AccessibilityAction.ACTION_LONG_CLICK); + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_LONG_CLICK); info.setLongClickable(true); } } + + private void addAccessibilityActionIfEnabled(AccessibilityNodeInfo info, boolean enabled, + AccessibilityAction action) { + if (enabled) { + info.addAction(action); + } + } + private boolean isItemClickable(View view) { return !view.hasExplicitFocusable(); } diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index 18c6abb3f5f1..50bb6883b903 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -38,6 +38,11 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.inspector.InspectableProperty; import com.android.internal.R; +import com.android.internal.util.Preconditions; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** @@ -91,6 +96,10 @@ public abstract class AbsSeekBar extends ProgressBar { @UnsupportedAppUsage private boolean mIsDragging; + private List<Rect> mUserGestureExclusionRects = Collections.emptyList(); + private final List<Rect> mGestureExclusionRects = new ArrayList<>(); + private final Rect mThumbRect = new Rect(); + public AbsSeekBar(Context context) { super(context); } @@ -735,6 +744,27 @@ public abstract class AbsSeekBar extends ProgressBar { // Canvas will be translated, so 0,0 is where we start drawing thumb.setBounds(left, top, right, bottom); + updateGestureExclusionRects(); + } + + @Override + public void setSystemGestureExclusionRects(@NonNull List<Rect> rects) { + Preconditions.checkNotNull(rects, "rects must not be null"); + mUserGestureExclusionRects = rects; + updateGestureExclusionRects(); + } + + private void updateGestureExclusionRects() { + final Drawable thumb = mThumb; + if (thumb == null) { + super.setSystemGestureExclusionRects(mUserGestureExclusionRects); + return; + } + mGestureExclusionRects.clear(); + thumb.copyBounds(mThumbRect); + mGestureExclusionRects.add(mThumbRect); + mGestureExclusionRects.addAll(mUserGestureExclusionRects); + super.setSystemGestureExclusionRects(mGestureExclusionRects); } /** diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index c9ef038b78de..cac75cfd8432 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -134,6 +134,7 @@ import java.lang.annotation.RetentionPolicy; import java.text.BreakIterator; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -5097,6 +5098,12 @@ public class Editor { void onHandleMoved() {} public void onDetached() {} + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + setSystemGestureExclusionRects(Collections.singletonList(new Rect(0, 0, w, h))); + } } private class InsertionHandleView extends HandleView { diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index 365638f5a96a..efc5eb373e00 100644 --- a/core/java/android/widget/RemoteViewsAdapter.java +++ b/core/java/android/widget/RemoteViewsAdapter.java @@ -28,7 +28,9 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.res.Configuration; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -555,6 +557,12 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } /** + * Config diff flags for which the cache should be reset + */ + private static final int CACHE_RESET_CONFIG_FLAGS = ActivityInfo.CONFIG_FONT_SCALE + | ActivityInfo.CONFIG_UI_MODE | ActivityInfo.CONFIG_DENSITY + | ActivityInfo.CONFIG_ASSETS_PATHS; + /** * */ private static class FixedSizeRemoteViewsCache { @@ -587,7 +595,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // farthest items from when we hit the memory limit private int mLastRequestedIndex; - // The lower and upper bounds of the preloaded range private int mPreloadLowerBound; private int mPreloadUpperBound; @@ -602,12 +609,17 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback private static final float sMaxCountSlackPercent = 0.75f; private static final int sMaxMemoryLimitInBytes = 2 * 1024 * 1024; - public FixedSizeRemoteViewsCache(int maxCacheSize) { + // Configuration for which the cache was created + private final Configuration mConfiguration; + + FixedSizeRemoteViewsCache(int maxCacheSize, Configuration configuration) { mMaxCount = maxCacheSize; mMaxCountSlack = Math.round(sMaxCountSlackPercent * (mMaxCount / 2)); mPreloadLowerBound = 0; mPreloadUpperBound = -1; mLastRequestedIndex = -1; + + mConfiguration = new Configuration(configuration); } public void insert(int position, RemoteViews v, long itemId, int[] visibleWindow) { @@ -852,7 +864,12 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback mAppWidgetId); synchronized(sCachedRemoteViewsCaches) { - if (sCachedRemoteViewsCaches.containsKey(key)) { + FixedSizeRemoteViewsCache cache = sCachedRemoteViewsCaches.get(key); + Configuration config = context.getResources().getConfiguration(); + if (cache == null + || (cache.mConfiguration.diff(config) & CACHE_RESET_CONFIG_FLAGS) != 0) { + mCache = new FixedSizeRemoteViewsCache(DEFAULT_CACHE_SIZE, config); + } else { mCache = sCachedRemoteViewsCaches.get(key); synchronized (mCache.mMetaData) { if (mCache.mMetaData.count > 0) { @@ -861,8 +878,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback mDataReady = true; } } - } else { - mCache = new FixedSizeRemoteViewsCache(DEFAULT_CACHE_SIZE); } if (!mDataReady) { requestBindService(); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index a9e183ad5bf2..62598fce5947 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -1011,6 +1011,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ TypedArray a = theme.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TextViewAppearance, defStyleAttr, defStyleRes); + saveAttributeDataForStyleable(context, com.android.internal.R.styleable.TextViewAppearance, + attrs, a, defStyleAttr, defStyleRes); TypedArray appearance = null; int ap = a.getResourceId( com.android.internal.R.styleable.TextViewAppearance_textAppearance, -1); @@ -1018,6 +1020,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (ap != -1) { appearance = theme.obtainStyledAttributes( ap, com.android.internal.R.styleable.TextAppearance); + saveAttributeDataForStyleable(context, com.android.internal.R.styleable.TextAppearance, + null, appearance, 0, ap); } if (appearance != null) { readTextAppearance(context, appearance, attributes, false /* styleArray */); @@ -4960,6 +4964,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * android.text.util.Linkify#ALL Linkify.ALL} and peers for * possible values. * + * <p class="note"><b>Note:</b> + * {@link android.text.util.Linkify#MAP_ADDRESSES Linkify.MAP_ADDRESSES} + * is deprecated and should be avoided; see its documentation. + * * @attr ref android.R.styleable#TextView_autoLink */ @android.view.RemotableViewMethod diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index dc3099de5015..5294714c05ae 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -110,6 +110,7 @@ import android.widget.Toast; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; +import com.android.internal.content.PackageMonitor; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.ImageUtils; @@ -125,8 +126,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** * The Chooser Activity handles intent resolution specifically for sharing intents - @@ -185,7 +188,6 @@ public class ChooserActivity extends ResolverActivity { private static final int SHARE_TARGET_QUERY_PACKAGE_LIMIT = 20; private static final int QUERY_TARGET_SERVICE_LIMIT = 5; - private static final int WATCHDOG_TIMEOUT_MILLIS = 5000; private static final int DEFAULT_SALT_EXPIRATION_DAYS = 7; private int mMaxHashSaltDays = DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, @@ -211,6 +213,8 @@ public class ChooserActivity extends ResolverActivity { private ChooserRowAdapter mChooserRowAdapter; private int mChooserRowServiceSpacing; + private int mCurrAvailableWidth = 0; + /** {@link ChooserActivity#getBaseScore} */ private static final float CALLER_TARGET_SCORE_BOOST = 900.f; /** {@link ChooserActivity#getBaseScore} */ @@ -220,12 +224,7 @@ public class ChooserActivity extends ResolverActivity { private static final int MAX_RANKED_TARGETS = 4; private final List<ChooserTargetServiceConnection> mServiceConnections = new ArrayList<>(); - - private static final int CHOOSER_TARGET_SERVICE_RESULT = 1; - private static final int CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT = 2; - private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT = 3; - private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED = 4; - private static final int LIST_VIEW_UPDATE_MESSAGE = 5; + private final Set<ComponentName> mServicesRequested = new HashSet<>(); private static final int MAX_LOG_RANK_POSITION = 12; @@ -255,11 +254,13 @@ public class ChooserActivity extends ResolverActivity { private ContentPreviewCoordinator mPreviewCoord; private class ContentPreviewCoordinator { - private static final int IMAGE_LOAD_TIMEOUT_MILLIS = 300; private static final int IMAGE_FADE_IN_MILLIS = 150; private static final int IMAGE_LOAD_TIMEOUT = 1; private static final int IMAGE_LOAD_INTO_VIEW = 2; + private final int mImageLoadTimeoutMillis = + getResources().getInteger(R.integer.config_shortAnimTime); + private final View mParentView; private boolean mHideParentOnFail; private boolean mAtLeastOneLoaded = false; @@ -328,7 +329,7 @@ public class ChooserActivity extends ResolverActivity { private void loadUriIntoView(final int imageResourceId, final Uri uri, final int extraImages) { - mHandler.sendEmptyMessageDelayed(IMAGE_LOAD_TIMEOUT, IMAGE_LOAD_TIMEOUT_MILLIS); + mHandler.sendEmptyMessageDelayed(IMAGE_LOAD_TIMEOUT, mImageLoadTimeoutMillis); AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { final Bitmap bmp = loadThumbnail(uri, new Size(200, 200)); @@ -347,7 +348,7 @@ public class ChooserActivity extends ResolverActivity { private void maybeHideContentPreview() { if (!mAtLeastOneLoaded && mHideParentOnFail) { Log.i(TAG, "Hiding image preview area. Timed out waiting for preview to load" - + " within " + IMAGE_LOAD_TIMEOUT_MILLIS + "ms."); + + " within " + mImageLoadTimeoutMillis + "ms."); collapseParentView(); if (mChooserRowAdapter != null) { mChooserRowAdapter.hideContentPreview(); @@ -369,7 +370,59 @@ public class ChooserActivity extends ResolverActivity { } } - private final Handler mChooserHandler = new Handler() { + private final ChooserHandler mChooserHandler = new ChooserHandler(); + + private class ChooserHandler extends Handler { + private static final int CHOOSER_TARGET_SERVICE_RESULT = 1; + private static final int CHOOSER_TARGET_SERVICE_WATCHDOG_MIN_TIMEOUT = 2; + private static final int CHOOSER_TARGET_SERVICE_WATCHDOG_MAX_TIMEOUT = 3; + private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT = 4; + private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED = 5; + private static final int LIST_VIEW_UPDATE_MESSAGE = 6; + + private static final int WATCHDOG_TIMEOUT_MAX_MILLIS = 10000; + private static final int WATCHDOG_TIMEOUT_MIN_MILLIS = 3000; + + private boolean mMinTimeoutPassed = false; + + private void removeAllMessages() { + removeMessages(LIST_VIEW_UPDATE_MESSAGE); + removeMessages(CHOOSER_TARGET_SERVICE_WATCHDOG_MIN_TIMEOUT); + removeMessages(CHOOSER_TARGET_SERVICE_WATCHDOG_MAX_TIMEOUT); + removeMessages(CHOOSER_TARGET_SERVICE_RESULT); + removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT); + removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED); + } + + private void restartServiceRequestTimer() { + mMinTimeoutPassed = false; + removeMessages(CHOOSER_TARGET_SERVICE_WATCHDOG_MIN_TIMEOUT); + removeMessages(CHOOSER_TARGET_SERVICE_WATCHDOG_MAX_TIMEOUT); + + if (DEBUG) { + Log.d(TAG, "queryTargets setting watchdog timer for " + + WATCHDOG_TIMEOUT_MIN_MILLIS + "-" + + WATCHDOG_TIMEOUT_MAX_MILLIS + "ms"); + } + + sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_MIN_TIMEOUT, + WATCHDOG_TIMEOUT_MIN_MILLIS); + sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_MAX_TIMEOUT, + WATCHDOG_TIMEOUT_MAX_MILLIS); + } + + private void maybeStopServiceRequestTimer() { + // Set a minimum timeout threshold, to ensure both apis, sharing shortcuts + // and older-style direct share services, have had time to load, otherwise + // just checking mServiceConnections could force us to end prematurely + if (mMinTimeoutPassed && mServiceConnections.isEmpty()) { + logDirectShareTargetReceived( + MetricsEvent.ACTION_DIRECT_SHARE_TARGETS_LOADED_CHOOSER_SERVICE); + sendVoiceChoicesIfNeeded(); + mChooserListAdapter.completeServiceTargetLoading(); + } + } + @Override public void handleMessage(Message msg) { if (mChooserListAdapter == null || isDestroyed()) { @@ -393,23 +446,17 @@ public class ChooserActivity extends ResolverActivity { unbindService(sri.connection); sri.connection.destroy(); mServiceConnections.remove(sri.connection); - if (mServiceConnections.isEmpty()) { - logDirectShareTargetReceived( - MetricsEvent.ACTION_DIRECT_SHARE_TARGETS_LOADED_CHOOSER_SERVICE); - sendVoiceChoicesIfNeeded(); - } + maybeStopServiceRequestTimer(); break; - case CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT: - if (DEBUG) { - Log.d(TAG, "CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT; unbinding services"); - } + case CHOOSER_TARGET_SERVICE_WATCHDOG_MIN_TIMEOUT: + mMinTimeoutPassed = true; + maybeStopServiceRequestTimer(); + break; + case CHOOSER_TARGET_SERVICE_WATCHDOG_MAX_TIMEOUT: unbindRemainingServices(); - logDirectShareTargetReceived( - MetricsEvent.ACTION_DIRECT_SHARE_TARGETS_LOADED_CHOOSER_SERVICE); - sendVoiceChoicesIfNeeded(); - mChooserListAdapter.completeServiceTargetLoading(); + maybeStopServiceRequestTimer(); break; case LIST_VIEW_UPDATE_MESSAGE: @@ -669,6 +716,17 @@ public class ChooserActivity extends ResolverActivity { .getUserInfo(UserHandle.myUserId()).isManagedProfile(); } + @Override + protected PackageMonitor createPackageMonitor() { + return new PackageMonitor() { + @Override + public void onSomePackagesChanged() { + mAdapter.handlePackagesChanged(); + bindProfileView(); + } + }; + } + private void onCopyButtonClicked(View v) { Intent targetIntent = getTargetIntent(); if (targetIntent == null) { @@ -1065,11 +1123,7 @@ public class ChooserActivity extends ResolverActivity { mRefinementResultReceiver = null; } unbindRemainingServices(); - mChooserHandler.removeMessages(LIST_VIEW_UPDATE_MESSAGE); - mChooserHandler.removeMessages(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT); - mChooserHandler.removeMessages(CHOOSER_TARGET_SERVICE_RESULT); - mChooserHandler.removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT); - mChooserHandler.removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED); + mChooserHandler.removeAllMessages(); if (mPreviewCoord != null) mPreviewCoord.cancelLoads(); @@ -1307,6 +1361,7 @@ public class ChooserActivity extends ResolverActivity { final PackageManager pm = getPackageManager(); ShortcutManager sm = (ShortcutManager) getSystemService(ShortcutManager.class); int targetsToQuery = 0; + for (int i = 0, N = adapter.getDisplayResolveInfoCount(); i < N; i++) { final DisplayResolveInfo dri = adapter.getDisplayResolveInfo(i); if (adapter.getScore(dri) == 0) { @@ -1326,6 +1381,12 @@ public class ChooserActivity extends ResolverActivity { if (serviceName != null) { final ComponentName serviceComponent = new ComponentName( ai.packageName, serviceName); + + if (mServicesRequested.contains(serviceComponent)) { + continue; + } + mServicesRequested.add(serviceComponent); + final Intent serviceIntent = new Intent(ChooserTargetService.SERVICE_INTERFACE) .setComponent(serviceComponent); @@ -1376,16 +1437,7 @@ public class ChooserActivity extends ResolverActivity { } } - if (DEBUG) { - Log.d(TAG, "queryTargets setting watchdog timer for " - + WATCHDOG_TIMEOUT_MILLIS + "ms"); - } - mChooserHandler.sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT, - WATCHDOG_TIMEOUT_MILLIS); - - if (mServiceConnections.isEmpty()) { - sendVoiceChoicesIfNeeded(); - } + mChooserHandler.restartServiceRequestTimer(); } private IntentFilter getTargetIntentFilter() { @@ -1493,7 +1545,7 @@ public class ChooserActivity extends ResolverActivity { continue; } final Message msg = Message.obtain(); - msg.what = SHORTCUT_MANAGER_SHARE_TARGET_RESULT; + msg.what = ChooserHandler.SHORTCUT_MANAGER_SHARE_TARGET_RESULT; msg.obj = new ServiceResultInfo(driList.get(i), chooserTargets, null); mChooserHandler.sendMessage(msg); resultMessageSent = true; @@ -1506,7 +1558,7 @@ public class ChooserActivity extends ResolverActivity { private void sendShortcutManagerShareTargetResultCompleted() { final Message msg = Message.obtain(); - msg.what = SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED; + msg.what = ChooserHandler.SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED; mChooserHandler.sendMessage(msg); } @@ -1574,6 +1626,7 @@ public class ChooserActivity extends ResolverActivity { unbindService(conn); conn.destroy(); } + mServicesRequested.clear(); mServiceConnections.clear(); } @@ -2198,10 +2251,12 @@ public class ChooserActivity extends ResolverActivity { return; } - int availableWidth = right - left - v.getPaddingLeft() - v.getPaddingRight(); + final int availableWidth = right - left - v.getPaddingLeft() - v.getPaddingRight(); if (mChooserRowAdapter.consumeLayoutRequest() || mChooserRowAdapter.calculateChooserTargetWidth(availableWidth) - || mAdapterView.getAdapter() == null) { + || mAdapterView.getAdapter() == null + || availableWidth != mCurrAvailableWidth) { + mCurrAvailableWidth = availableWidth; mAdapterView.setAdapter(mChooserRowAdapter); getMainThreadHandler().post(() -> { @@ -2282,7 +2337,6 @@ public class ChooserActivity extends ResolverActivity { private ChooserTargetInfo mPlaceHolderTargetInfo = new PlaceHolderTargetInfo(); private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>(); private final List<TargetInfo> mCallerTargets = new ArrayList<>(); - private boolean mTargetsNeedPruning = false; private final BaseChooserTargetComparator mBaseTargetComparator = new BaseChooserTargetComparator(); @@ -2351,9 +2405,21 @@ public class ChooserActivity extends ResolverActivity { } @Override + public void handlePackagesChanged() { + if (DEBUG) { + Log.d(TAG, "clearing queryTargets on package change"); + } + createPlaceHolders(); + mServicesRequested.clear(); + notifyDataSetChanged(); + + super.handlePackagesChanged(); + } + + @Override public void notifyDataSetChanged() { if (!mListViewDataChanged) { - mChooserHandler.sendEmptyMessageDelayed(LIST_VIEW_UPDATE_MESSAGE, + mChooserHandler.sendEmptyMessageDelayed(ChooserHandler.LIST_VIEW_UPDATE_MESSAGE, LIST_VIEW_UPDATE_INTERVAL_IN_MILLIS); mListViewDataChanged = true; } @@ -2368,6 +2434,7 @@ public class ChooserActivity extends ResolverActivity { private void createPlaceHolders() { + mNumShortcutResults = 0; mServiceTargets.clear(); for (int i = 0; i < MAX_SERVICE_TARGETS; i++) { mServiceTargets.add(mPlaceHolderTargetInfo); @@ -2410,16 +2477,6 @@ public class ChooserActivity extends ResolverActivity { return; } - if (mServiceTargets != null) { - if (getDisplayResolveInfoCount() == 0) { - // b/109676071: When packages change, onListRebuilt() is called before - // ResolverActivity.mDisplayList is re-populated; pruning now would cause the - // list to disappear briefly, so instead we detect this case (the - // set of targets suddenly dropping to zero) and remember to prune later. - mTargetsNeedPruning = true; - } - } - if (USE_SHORTCUT_MANAGER_FOR_DIRECT_TARGETS || USE_PREDICTION_MANAGER_FOR_DIRECT_TARGETS) { if (DEBUG) { @@ -2476,7 +2533,7 @@ public class ChooserActivity extends ResolverActivity { } public int getServiceTargetCount() { - if (isSendAction(getTargetIntent())) { + if (isSendAction(getTargetIntent()) && !ActivityManager.isLowRamDeviceStatic()) { return Math.min(mServiceTargets.size(), MAX_SERVICE_TARGETS); } @@ -2588,19 +2645,6 @@ public class ChooserActivity extends ResolverActivity { return; } - if (mTargetsNeedPruning) { - // First proper update since we got an onListRebuilt() with (transient) 0 items. - // Clear out the target list and rebuild. - createPlaceHolders(); - mTargetsNeedPruning = false; - - // Add back any app-supplied direct share targets that may have been - // wiped by this clear - if (mCallerChooserTargets != null) { - addServiceResults(null, Lists.newArrayList(mCallerChooserTargets), false); - } - } - final float baseScore = getBaseScore(origTarget, isShortcutResult); Collections.sort(targets, mBaseTargetComparator); @@ -3445,7 +3489,7 @@ public class ChooserActivity extends ResolverActivity { mChooserActivity.filterServiceTargets( mOriginalTarget.getResolveInfo().activityInfo.packageName, targets); final Message msg = Message.obtain(); - msg.what = CHOOSER_TARGET_SERVICE_RESULT; + msg.what = ChooserHandler.CHOOSER_TARGET_SERVICE_RESULT; msg.obj = new ServiceResultInfo(mOriginalTarget, targets, ChooserTargetServiceConnection.this); mChooserActivity.mChooserHandler.sendMessage(msg); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 0a01beba659f..7cc812889e0a 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -146,19 +146,7 @@ public class ResolverActivity extends Activity { /** See {@link #setRetainInOnStop}. */ private boolean mRetainInOnStop; - private final PackageMonitor mPackageMonitor = new PackageMonitor() { - @Override public void onSomePackagesChanged() { - mAdapter.handlePackagesChanged(); - bindProfileView(); - } - - @Override - public boolean onPackageChanged(String packageName, int uid, String[] components) { - // We care about all package changes, not just the whole package itself which is - // default behavior. - return true; - } - }; + private final PackageMonitor mPackageMonitor = createPackageMonitor(); /** * Get the string resource to be used as a label for the link to the resolver activity for an @@ -234,6 +222,23 @@ public class ResolverActivity extends Activity { } } + protected PackageMonitor createPackageMonitor() { + return new PackageMonitor() { + @Override + public void onSomePackagesChanged() { + mAdapter.handlePackagesChanged(); + bindProfileView(); + } + + @Override + public boolean onPackageChanged(String packageName, int uid, String[] components) { + // We care about all package changes, not just the whole package itself which is + // default behavior. + return true; + } + }; + } + private Intent makeMyIntent() { Intent intent = new Intent(getIntent()); intent.setComponent(null); @@ -398,6 +403,8 @@ public class ResolverActivity extends Activity { mSystemWindowInsets.bottom)); ((ListView) mAdapterView).addFooterView(mFooterSpacer); + resetButtonBar(); + return insets.consumeSystemWindowInsets(); } diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index d9fd3b5bd6d8..b27c11b524e5 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -53,11 +53,13 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener protected WallpaperColors mLockColors; public ColorExtractor(Context context) { - this(context, new Tonal(context), true /* immediately */); + this(context, new Tonal(context), true /* immediately */, + context.getSystemService(WallpaperManager.class)); } @VisibleForTesting - public ColorExtractor(Context context, ExtractionType extractionType, boolean immediately) { + public ColorExtractor(Context context, ExtractionType extractionType, boolean immediately, + WallpaperManager wallpaperManager) { mContext = context; mExtractionType = extractionType; @@ -72,7 +74,6 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener mOnColorsChangedListeners = new ArrayList<>(); - WallpaperManager wallpaperManager = mContext.getSystemService(WallpaperManager.class); if (wallpaperManager == null) { Log.w(TAG, "Can't listen to color changes!"); } else { @@ -110,7 +111,7 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } } - private void extractWallpaperColors() { + protected void extractWallpaperColors() { GradientColors[] systemColors = mGradientColors.get(WallpaperManager.FLAG_SYSTEM); GradientColors[] lockColors = mGradientColors.get(WallpaperManager.FLAG_LOCK); extractInto(mSystemColors, diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 48ca766f0da2..8b9072266d16 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -120,6 +120,26 @@ public final class SystemUiDeviceConfigFlags { "assist_handles_show_and_go_duration_ms"; /** + * (long) How long, in milliseconds, to wait before showing the Assist Handles temporarily when + * performing a short delayed show. + */ + public static final String ASSIST_HANDLES_SHOW_AND_GO_DELAYED_SHORT_DELAY_MS = + "assist_handles_show_and_go_delayed_short_delay_ms"; + + /** + * (long) How long, in milliseconds, to wait before showing the Assist Handles temporarily when + * performing a long delayed show. + */ + public static final String ASSIST_HANDLES_SHOW_AND_GO_DELAYED_LONG_DELAY_MS = + "assist_handles_show_and_go_delayed_long_delay_ms"; + + /** + * (long) How long, in milliseconds, to wait before resetting delayed show delay times. + */ + public static final String ASSIST_HANDLES_SHOW_AND_GO_DELAY_RESET_TIMEOUT_MS = + "assist_handles_show_and_go_delay_reset_timeout_ms"; + + /** * (long) How long, in milliseconds, to wait before displaying Assist Handles temporarily after * hiding them. */ @@ -138,5 +158,23 @@ public final class SystemUiDeviceConfigFlags { */ public static final String ASSIST_HANDLES_LEARN_COUNT = "assist_handles_learn_count"; + /** + * (bool) Whether to suppress handles on lockscreen." + */ + public static final String ASSIST_HANDLES_SUPPRESS_ON_LOCKSCREEN = + "assist_handles_suppress_on_lockscreen"; + + /** + * (bool) Whether to suppress handles on launcher." + */ + public static final String ASSIST_HANDLES_SUPPRESS_ON_LAUNCHER = + "assist_handles_suppress_on_launcher"; + + /** + * (bool) Whether to suppress handles on apps." + */ + public static final String ASSIST_HANDLES_SUPPRESS_ON_APPS = + "assist_handles_suppress_on_apps"; + private SystemUiDeviceConfigFlags() { } } diff --git a/core/java/com/android/internal/net/VpnInfo.java b/core/java/com/android/internal/net/VpnInfo.java index e74af5eb50de..b1a412871bd2 100644 --- a/core/java/com/android/internal/net/VpnInfo.java +++ b/core/java/com/android/internal/net/VpnInfo.java @@ -19,8 +19,6 @@ package com.android.internal.net; import android.os.Parcel; import android.os.Parcelable; -import java.util.Arrays; - /** * A lightweight container used to carry information of the ongoing VPN. * Internal use only.. @@ -30,14 +28,14 @@ import java.util.Arrays; public class VpnInfo implements Parcelable { public int ownerUid; public String vpnIface; - public String[] underlyingIfaces; + public String primaryUnderlyingIface; @Override public String toString() { return "VpnInfo{" + "ownerUid=" + ownerUid + ", vpnIface='" + vpnIface + '\'' - + ", underlyingIfaces='" + Arrays.toString(underlyingIfaces) + '\'' + + ", primaryUnderlyingIface='" + primaryUnderlyingIface + '\'' + '}'; } @@ -50,7 +48,7 @@ public class VpnInfo implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(ownerUid); dest.writeString(vpnIface); - dest.writeStringArray(underlyingIfaces); + dest.writeString(primaryUnderlyingIface); } public static final Parcelable.Creator<VpnInfo> CREATOR = new Parcelable.Creator<VpnInfo>() { @@ -59,7 +57,7 @@ public class VpnInfo implements Parcelable { VpnInfo info = new VpnInfo(); info.ownerUid = source.readInt(); info.vpnIface = source.readString(); - info.underlyingIfaces = source.readStringArray(); + info.primaryUnderlyingIface = source.readString(); return info; } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index e52f8e1f4362..3a7caa4c2fc0 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -188,6 +188,7 @@ public class BatteryStatsImpl extends BatteryStats { static final long DELAY_UPDATE_WAKELOCKS = 5*1000; private static final double MILLISECONDS_IN_HOUR = 3600 * 1000; + private static final long MILLISECONDS_IN_YEAR = 365 * 24 * 3600 * 1000L; private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader(); private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats(); @@ -3608,8 +3609,8 @@ public class BatteryStatsImpl extends BatteryStats { public void createFakeHistoryEvents(long numEvents) { for(long i = 0; i < numEvents; i++) { - noteWifiOnLocked(); - noteWifiOffLocked(); + noteLongPartialWakelockStart("name1", "historyName1", 1000); + noteLongPartialWakelockFinish("name1", "historyName1", 1000); } } @@ -3692,9 +3693,10 @@ public class BatteryStatsImpl extends BatteryStats { mHistoryBufferLastPos = -1; final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); + HistoryItem newItem = new HistoryItem(); + newItem.setTo(cur); startRecordingHistory(elapsedRealtime, uptime, false); - - addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur); + addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, newItem); return; } @@ -3955,25 +3957,11 @@ public class BatteryStatsImpl extends BatteryStats { addHistoryEventLocked(elapsedRealtime, uptime, code, name, uid); } - boolean ensureStartClockTime(final long currentTime) { - final long ABOUT_ONE_YEAR = 365*24*60*60*1000L; - if ((currentTime > ABOUT_ONE_YEAR && mStartClockTime < (currentTime-ABOUT_ONE_YEAR)) - || (mStartClockTime > currentTime)) { - // If the start clock time has changed by more than a year, then presumably - // the previous time was completely bogus. So we are going to figure out a - // new time based on how much time has elapsed since we started counting. - mStartClockTime = currentTime - (mClocks.elapsedRealtime()-(mRealtimeStart/1000)); - return true; - } - return false; - } - public void noteCurrentTimeChangedLocked() { final long currentTime = System.currentTimeMillis(); final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); recordCurrentTimeChangeLocked(currentTime, elapsedRealtime, uptime); - ensureStartClockTime(currentTime); } public void noteProcessStartLocked(String name, int uid) { @@ -6452,9 +6440,15 @@ public class BatteryStatsImpl extends BatteryStats { @Override public long getStartClockTime() { final long currentTime = System.currentTimeMillis(); - if (ensureStartClockTime(currentTime)) { + if ((currentTime > MILLISECONDS_IN_YEAR + && mStartClockTime < (currentTime - MILLISECONDS_IN_YEAR)) + || (mStartClockTime > currentTime)) { + // If the start clock time has changed by more than a year, then presumably + // the previous time was completely bogus. So we are going to figure out a + // new time based on how much time has elapsed since we started counting. recordCurrentTimeChangeLocked(currentTime, mClocks.elapsedRealtime(), mClocks.uptimeMillis()); + return currentTime - (mClocks.elapsedRealtime() - (mRealtimeStart / 1000)); } return mStartClockTime; } @@ -14022,7 +14016,7 @@ public class BatteryStatsImpl extends BatteryStats { // Pull the clock time. This may update the time and make a new history entry // if we had originally pulled a time before the RTC was set. - long startClockTime = getStartClockTime(); + getStartClockTime(); final long NOW_SYS = mClocks.uptimeMillis() * 1000; final long NOWREAL_SYS = mClocks.elapsedRealtime() * 1000; @@ -14046,7 +14040,7 @@ public class BatteryStatsImpl extends BatteryStats { out.writeInt(mStartCount); out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED)); out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); - out.writeLong(startClockTime); + out.writeLong(mStartClockTime); out.writeString(mStartPlatformVersion); out.writeString(mEndPlatformVersion); mOnBatteryTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS); @@ -14759,7 +14753,7 @@ public class BatteryStatsImpl extends BatteryStats { // Pull the clock time. This may update the time and make a new history entry // if we had originally pulled a time before the RTC was set. - long startClockTime = getStartClockTime(); + getStartClockTime(); final long uSecUptime = mClocks.uptimeMillis() * 1000; final long uSecRealtime = mClocks.elapsedRealtime() * 1000; @@ -14772,7 +14766,7 @@ public class BatteryStatsImpl extends BatteryStats { mBatteryStatsHistory.writeToParcel(out); out.writeInt(mStartCount); - out.writeLong(startClockTime); + out.writeLong(mStartClockTime); out.writeString(mStartPlatformVersion); out.writeString(mEndPlatformVersion); out.writeLong(mUptime); diff --git a/core/java/com/android/internal/os/BinderDeathDispatcher.java b/core/java/com/android/internal/os/BinderDeathDispatcher.java new file mode 100644 index 000000000000..0c93f7f160e4 --- /dev/null +++ b/core/java/com/android/internal/os/BinderDeathDispatcher.java @@ -0,0 +1,147 @@ +/* + * 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.internal.os; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.IBinder; +import android.os.IBinder.DeathRecipient; +import android.os.IInterface; +import android.os.RemoteException; +import android.util.ArrayMap; +import android.util.ArraySet; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; + +import java.io.PrintWriter; + +/** + * Multiplexes multiple binder death recipients on the same binder objects, so that at the native + * level, we only need to keep track of one death recipient reference. This will help reduce the + * number of JNI strong references. + * + * test with: atest FrameworksCoreTests:BinderDeathDispatcherTest + */ +public class BinderDeathDispatcher<T extends IInterface> { + private static final String TAG = "BinderDeathDispatcher"; + + private final Object mLock = new Object(); + + @GuardedBy("mLock") + private final ArrayMap<IBinder, RecipientsInfo> mTargets = new ArrayMap<>(); + + @VisibleForTesting + class RecipientsInfo implements DeathRecipient { + final IBinder mTarget; + + /** + * Recipient list. If it's null, {@link #mTarget} has already died, but in that case + * this RecipientsInfo instance is removed from {@link #mTargets}. + */ + @GuardedBy("mLock") + @Nullable + ArraySet<DeathRecipient> mRecipients = new ArraySet<>(); + + private RecipientsInfo(IBinder target) { + mTarget = target; + } + + @Override + public void binderDied() { + final ArraySet<DeathRecipient> copy; + synchronized (mLock) { + copy = mRecipients; + mRecipients = null; + + // Also remove from the targets. + mTargets.remove(mTarget); + } + if (copy == null) { + return; + } + // Let's call it without holding the lock. + final int size = copy.size(); + for (int i = 0; i < size; i++) { + copy.valueAt(i).binderDied(); + } + } + } + + /** + * Add a {@code recipient} to the death recipient list on {@code target}. + * + * @return # of recipients in the recipient list, including {@code recipient}. Or, -1 + * if {@code target} is already dead, in which case recipient's + * {@link DeathRecipient#binderDied} won't be called. + */ + public int linkToDeath(@NonNull T target, @NonNull DeathRecipient recipient) { + final IBinder ib = target.asBinder(); + synchronized (mLock) { + RecipientsInfo info = mTargets.get(ib); + if (info == null) { + info = new RecipientsInfo(ib); + + // First recipient; need to link to death. + try { + ib.linkToDeath(info, 0); + } catch (RemoteException e) { + return -1; // Already dead. + } + mTargets.put(ib, info); + } + info.mRecipients.add(recipient); + return info.mRecipients.size(); + } + } + + public void unlinkToDeath(@NonNull T target, @NonNull DeathRecipient recipient) { + final IBinder ib = target.asBinder(); + + synchronized (mLock) { + final RecipientsInfo info = mTargets.get(ib); + if (info == null) { + return; + } + if (info.mRecipients.remove(recipient) && info.mRecipients.size() == 0) { + info.mTarget.unlinkToDeath(info, 0); + mTargets.remove(info.mTarget); + } + } + } + + public void dump(PrintWriter pw, String indent) { + synchronized (mLock) { + pw.print(indent); + pw.print("# of watched binders: "); + pw.println(mTargets.size()); + + pw.print(indent); + pw.print("# of death recipients: "); + int n = 0; + for (RecipientsInfo info : mTargets.values()) { + n += info.mRecipients.size(); + } + pw.println(n); + } + } + + @VisibleForTesting + public ArrayMap<IBinder, RecipientsInfo> getTargetsForTest() { + return mTargets; + } +} diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 2736c6a7149f..2ba9cf1961e9 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -512,13 +512,13 @@ public final class Zygote { Credentials peerCredentials = null; ZygoteArguments args = null; - // Load resources - ZygoteInit.nativePreloadGraphicsDriver(); - while (true) { try { sessionSocket = usapPoolSocket.accept(); + // Block SIGTERM so we won't be killed if the Zygote flushes the USAP pool. + blockSigTerm(); + BufferedReader usapReader = new BufferedReader(new InputStreamReader(sessionSocket.getInputStream())); usapOutputStream = @@ -537,87 +537,116 @@ public final class Zygote { } else { Log.e("USAP", "Truncated command received."); IoUtils.closeQuietly(sessionSocket); + + // Re-enable SIGTERM so the USAP can be flushed from the pool if necessary. + unblockSigTerm(); } } catch (Exception ex) { Log.e("USAP", ex.getMessage()); IoUtils.closeQuietly(sessionSocket); + + // Re-enable SIGTERM so the USAP can be flushed from the pool if necessary. + unblockSigTerm(); } } - applyUidSecurityPolicy(args, peerCredentials); - applyDebuggerSystemProperty(args); + try { + // SIGTERM is blocked on loop exit. This prevents a USAP that is specializing from + // being killed during a pool flush. - int[][] rlimits = null; + applyUidSecurityPolicy(args, peerCredentials); + applyDebuggerSystemProperty(args); - if (args.mRLimits != null) { - rlimits = args.mRLimits.toArray(INT_ARRAY_2D); - } + int[][] rlimits = null; - // This must happen before the SELinux policy for this process is - // changed when specializing. - try { - // Used by ZygoteProcess.zygoteSendArgsAndGetResult to fill in a - // Process.ProcessStartResult object. - usapOutputStream.writeInt(pid); - } catch (IOException ioEx) { - Log.e("USAP", "Failed to write response to session socket: " + ioEx.getMessage()); - System.exit(-1); - } finally { - IoUtils.closeQuietly(sessionSocket); + if (args.mRLimits != null) { + rlimits = args.mRLimits.toArray(INT_ARRAY_2D); + } + // This must happen before the SELinux policy for this process is + // changed when specializing. try { - // This socket is closed using Os.close due to an issue with the implementation of - // LocalSocketImp.close. Because the raw FD is created by init and then loaded from - // an environment variable (as opposed to being created by the LocalSocketImpl - // itself) the current implementation will not actually close the underlying FD. - // - // See b/130309968 for discussion of this issue. - Os.close(usapPoolSocket.getFileDescriptor()); - } catch (ErrnoException ex) { - Log.e("USAP", "Failed to close USAP pool socket: " + ex.getMessage()); + // Used by ZygoteProcess.zygoteSendArgsAndGetResult to fill in a + // Process.ProcessStartResult object. + usapOutputStream.writeInt(pid); + } catch (IOException ioEx) { + Log.e("USAP", "Failed to write response to session socket: " + + ioEx.getMessage()); + throw new RuntimeException(ioEx); + } finally { + IoUtils.closeQuietly(sessionSocket); + + try { + // This socket is closed using Os.close due to an issue with the implementation + // of LocalSocketImp.close(). Because the raw FD is created by init and then + // loaded from an environment variable (as opposed to being created by the + // LocalSocketImpl itself) the current implementation will not actually close + // the underlying FD. + // + // See b/130309968 for discussion of this issue. + Os.close(usapPoolSocket.getFileDescriptor()); + } catch (ErrnoException ex) { + Log.e("USAP", "Failed to close USAP pool socket"); + throw new RuntimeException(ex); + } } - } - try { - ByteArrayOutputStream buffer = - new ByteArrayOutputStream(Zygote.USAP_MANAGEMENT_MESSAGE_BYTES); - DataOutputStream outputStream = new DataOutputStream(buffer); - - // This is written as a long so that the USAP reporting pipe and USAP pool event FD - // handlers in ZygoteServer.runSelectLoop can be unified. These two cases should both - // send/receive 8 bytes. - outputStream.writeLong(pid); - outputStream.flush(); - - Os.write(writePipe, buffer.toByteArray(), 0, buffer.size()); - } catch (Exception ex) { - Log.e("USAP", - String.format("Failed to write PID (%d) to pipe (%d): %s", - pid, writePipe.getInt$(), ex.getMessage())); - System.exit(-1); - } finally { - IoUtils.closeQuietly(writePipe); - } + try { + ByteArrayOutputStream buffer = + new ByteArrayOutputStream(Zygote.USAP_MANAGEMENT_MESSAGE_BYTES); + DataOutputStream outputStream = new DataOutputStream(buffer); + + // This is written as a long so that the USAP reporting pipe and USAP pool event FD + // handlers in ZygoteServer.runSelectLoop can be unified. These two cases should + // both send/receive 8 bytes. + outputStream.writeLong(pid); + outputStream.flush(); + + Os.write(writePipe, buffer.toByteArray(), 0, buffer.size()); + } catch (Exception ex) { + Log.e("USAP", + String.format("Failed to write PID (%d) to pipe (%d): %s", + pid, writePipe.getInt$(), ex.getMessage())); + throw new RuntimeException(ex); + } finally { + IoUtils.closeQuietly(writePipe); + } + + specializeAppProcess(args.mUid, args.mGid, args.mGids, + args.mRuntimeFlags, rlimits, args.mMountExternal, + args.mSeInfo, args.mNiceName, args.mStartChildZygote, + args.mInstructionSet, args.mAppDataDir); - specializeAppProcess(args.mUid, args.mGid, args.mGids, - args.mRuntimeFlags, rlimits, args.mMountExternal, - args.mSeInfo, args.mNiceName, args.mStartChildZygote, - args.mInstructionSet, args.mAppDataDir); + disableExecuteOnly(args.mTargetSdkVersion); - disableExecuteOnly(args.mTargetSdkVersion); + if (args.mNiceName != null) { + Process.setArgV0(args.mNiceName); + } + + // End of the postFork event. + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); - if (args.mNiceName != null) { - Process.setArgV0(args.mNiceName); + return ZygoteInit.zygoteInit(args.mTargetSdkVersion, + args.mRemainingArgs, + null /* classLoader */); + } finally { + // Unblock SIGTERM to restore the process to default behavior. + unblockSigTerm(); } + } - // End of the postFork event. - Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + private static void blockSigTerm() { + nativeBlockSigTerm(); + } + + private static native void nativeBlockSigTerm(); - return ZygoteInit.zygoteInit(args.mTargetSdkVersion, - args.mRemainingArgs, - null /* classLoader */); + private static void unblockSigTerm() { + nativeUnblockSigTerm(); } + private static native void nativeUnblockSigTerm(); + private static final String USAP_ERROR_PREFIX = "Invalid command to USAP: "; /** diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index 785256eb6351..e556dd4d8243 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -338,6 +338,7 @@ class ZygoteConnection { Runnable stateChangeCode) { try { if (zygoteServer.isUsapPoolEnabled()) { + Log.i(TAG, "Emptying USAP Pool due to state change."); Zygote.emptyUsapPool(); } @@ -351,6 +352,8 @@ class ZygoteConnection { if (fpResult != null) { zygoteServer.setForkChild(); return fpResult; + } else { + Log.i(TAG, "Finished refilling USAP Pool after state change."); } } diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index f9e868fafe50..7ec8309e47de 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -87,7 +87,6 @@ public class ZygoteInit { private static final String PROPERTY_DISABLE_GRAPHICS_DRIVER_PRELOADING = "ro.zygote.disable_gl_preload"; - private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; private static final int LOG_BOOT_PROGRESS_PRELOAD_START = 3020; private static final int LOG_BOOT_PROGRESS_PRELOAD_END = 3030; @@ -203,9 +202,7 @@ public class ZygoteInit { static native void nativePreloadGraphicsDriver(); private static void maybePreloadGraphicsDriver() { - String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); - if (!SystemProperties.getBoolean(PROPERTY_DISABLE_GRAPHICS_DRIVER_PRELOADING, false) - && (driverPackageName == null || driverPackageName.isEmpty())) { + if (!SystemProperties.getBoolean(PROPERTY_DISABLE_GRAPHICS_DRIVER_PRELOADING, false)) { nativePreloadGraphicsDriver(); } } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 1a1615026bdf..723f16128281 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -262,8 +262,10 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind private final int mResizeShadowSize; private final Paint mVerticalResizeShadowPaint = new Paint(); private final Paint mHorizontalResizeShadowPaint = new Paint(); + private final Paint mLegacyNavigationBarBackgroundPaint = new Paint(); private Insets mBackgroundInsets = Insets.NONE; private Insets mLastBackgroundInsets = Insets.NONE; + private boolean mDrawLegacyNavigationBarBackground; DecorView(Context context, int featureId, PhoneWindow window, WindowManager.LayoutParams params) { @@ -292,6 +294,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mResizeShadowSize = context.getResources().getDimensionPixelSize( R.dimen.resize_shadow_size); initResizingPaints(); + + mLegacyNavigationBarBackgroundPaint.setColor(Color.BLACK); } void setBackgroundFallback(@Nullable Drawable fallbackDrawable) { @@ -1004,6 +1008,10 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind public void onWindowSystemUiVisibilityChanged(int visible) { updateColorViews(null /* insets */, true /* animate */); updateDecorCaptionStatus(getResources().getConfiguration()); + + if (mStatusGuard != null && mStatusGuard.getVisibility() == VISIBLE) { + updateStatusGuardColor(); + } } @Override @@ -1139,6 +1147,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind navBarToRightEdge || navBarToLeftEdge, navBarToLeftEdge, 0 /* sideInset */, animate && !disallowAnimate, mForceWindowDrawsBarBackgrounds); + mDrawLegacyNavigationBarBackground = mNavigationColorViewState.visible + && (mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0; boolean statusBarNeedsRightInset = navBarToRightEdge && mNavigationColorViewState.present; @@ -1160,16 +1170,17 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind // Note: We don't need to check for IN_SCREEN or INSET_DECOR because unlike the status bar, // these flags wouldn't make the window draw behind the navigation bar, unless // LAYOUT_HIDE_NAVIGATION was set. + boolean hideNavigation = (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0; boolean forceConsumingNavBar = (mForceWindowDrawsBarBackgrounds && (attrs.flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0 && (sysUiVisibility & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) == 0 - && (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) - || mLastShouldAlwaysConsumeSystemBars; + && !hideNavigation) + || (mLastShouldAlwaysConsumeSystemBars && hideNavigation); boolean consumingNavBar = ((attrs.flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 && (sysUiVisibility & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) == 0 - && (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) + && !hideNavigation) || forceConsumingNavBar; // If we didn't request fullscreen layout, but we still got it because of the @@ -1461,28 +1472,45 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } final Rect rect = mTempRect; - // If the parent doesn't consume the insets, manually - // apply the default system window insets. - mWindow.mContentParent.computeSystemWindowInsets(insets, rect); - final int newMargin = rect.top == 0 ? insets.getSystemWindowInsetTop() : 0; - if (mlp.topMargin != newMargin) { + // Apply the insets that have not been applied by the contentParent yet. + WindowInsets innerInsets = + mWindow.mContentParent.computeSystemWindowInsets(insets, rect); + int newTopMargin = innerInsets.getSystemWindowInsetTop(); + int newLeftMargin = innerInsets.getSystemWindowInsetLeft(); + int newRightMargin = innerInsets.getSystemWindowInsetRight(); + + // Must use root window insets for the guard, because the color views consume + // the navigation bar inset if the window does not request LAYOUT_HIDE_NAV - but + // the status guard is attached at the root. + WindowInsets rootInsets = getRootWindowInsets(); + int newGuardLeftMargin = rootInsets.getSystemWindowInsetLeft(); + int newGuardRightMargin = rootInsets.getSystemWindowInsetRight(); + + if (mlp.topMargin != newTopMargin || mlp.leftMargin != newLeftMargin + || mlp.rightMargin != newRightMargin) { mlpChanged = true; - mlp.topMargin = insets.getSystemWindowInsetTop(); - - if (mStatusGuard == null) { - mStatusGuard = new View(mContext); - mStatusGuard.setBackgroundColor(mContext.getColor( - R.color.decor_view_status_guard)); - addView(mStatusGuard, indexOfChild(mStatusColorViewState.view), - new LayoutParams(LayoutParams.MATCH_PARENT, - mlp.topMargin, Gravity.START | Gravity.TOP)); - } else { - final LayoutParams lp = (LayoutParams) - mStatusGuard.getLayoutParams(); - if (lp.height != mlp.topMargin) { - lp.height = mlp.topMargin; - mStatusGuard.setLayoutParams(lp); - } + mlp.topMargin = newTopMargin; + mlp.leftMargin = newLeftMargin; + mlp.rightMargin = newRightMargin; + } + + if (newTopMargin > 0 && mStatusGuard == null) { + mStatusGuard = new View(mContext); + mStatusGuard.setVisibility(GONE); + final LayoutParams lp = new LayoutParams(MATCH_PARENT, + mlp.topMargin, Gravity.LEFT | Gravity.TOP); + lp.leftMargin = newGuardLeftMargin; + lp.rightMargin = newGuardRightMargin; + addView(mStatusGuard, indexOfChild(mStatusColorViewState.view), lp); + } else if (mStatusGuard != null) { + final LayoutParams lp = (LayoutParams) + mStatusGuard.getLayoutParams(); + if (lp.height != mlp.topMargin || lp.leftMargin != newGuardLeftMargin + || lp.rightMargin != newGuardRightMargin) { + lp.height = mlp.topMargin; + lp.leftMargin = newGuardLeftMargin; + lp.rightMargin = newGuardRightMargin; + mStatusGuard.setLayoutParams(lp); } } @@ -1490,6 +1518,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind // always show the status guard above it if we have one. showStatusGuard = mStatusGuard != null; + if (showStatusGuard && mStatusGuard.getVisibility() != VISIBLE) { + // If it wasn't previously shown, the color may be stale + updateStatusGuardColor(); + } + // We only need to consume the insets if the action // mode is overlaid on the app content (e.g. it's // sitting in a FrameLayout, see @@ -1501,7 +1534,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } } else { // reset top margin - if (mlp.topMargin != 0) { + if (mlp.topMargin != 0 || mlp.leftMargin != 0 || mlp.rightMargin != 0) { mlpChanged = true; mlp.topMargin = 0; } @@ -1512,11 +1545,19 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } } if (mStatusGuard != null) { - mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE); + mStatusGuard.setVisibility(showStatusGuard ? VISIBLE : GONE); } return insets; } + private void updateStatusGuardColor() { + boolean lightStatusBar = + (getWindowSystemUiVisibility() & SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0; + mStatusGuard.setBackgroundColor(lightStatusBar + ? mContext.getColor(R.color.decor_view_status_guard_light) + : mContext.getColor(R.color.decor_view_status_guard)); + } + /** * Overrides the view outline when the activity enters picture-in-picture to ensure that it has * an opaque shadow even if the window background is completely transparent. This only applies @@ -2275,6 +2316,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind @Override public void onPostDraw(RecordingCanvas canvas) { drawResizingShadowIfNeeded(canvas); + drawLegacyNavigationBarBackground(canvas); } private void initResizingPaints() { @@ -2307,6 +2349,18 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind canvas.restore(); } + private void drawLegacyNavigationBarBackground(RecordingCanvas canvas) { + if (!mDrawLegacyNavigationBarBackground) { + return; + } + View v = mNavigationColorViewState.view; + if (v == null) { + return; + } + canvas.drawRect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom(), + mLegacyNavigationBarBackgroundPaint); + } + /** Release the renderer thread which is usually done when the user stops resizing. */ private void releaseThreadedRenderer() { if (mResizingBackgroundDrawable != null && mLastBackgroundDrawableCb != null) { @@ -2593,6 +2647,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } lastActionModeView.killMode(); mFadeAnim = null; + requestApplyInsets(); } } diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java index e8691fa5e23e..b73ecd1974aa 100644 --- a/core/java/com/android/internal/util/ArrayUtils.java +++ b/core/java/com/android/internal/util/ArrayUtils.java @@ -756,4 +756,8 @@ public class ArrayUtils { return String.valueOf(value); } } + + public static @Nullable <T> T firstOrNull(T[] items) { + return items.length > 0 ? items[0] : null; + } } diff --git a/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java b/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java index 6be626a5134a..1bbd87cd3e59 100755 --- a/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java +++ b/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java @@ -24,6 +24,7 @@ import android.util.Pools; import com.android.internal.util.ArrayUtils; import com.android.internal.util.BitUtils; +import com.android.internal.util.Preconditions; import com.android.internal.util.function.HeptConsumer; import com.android.internal.util.function.HeptFunction; import com.android.internal.util.function.HeptPredicate; @@ -47,6 +48,7 @@ import com.android.internal.util.function.TriFunction; import com.android.internal.util.function.TriPredicate; import java.util.Arrays; +import java.util.Objects; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.BiPredicate; @@ -432,13 +434,15 @@ final class PooledLambdaImpl<R> extends OmniFunction<Object, if (isConstSupplier()) { sb.append(getFuncTypeAsString()).append("(").append(doInvoke()).append(")"); } else { - if (mFunc instanceof PooledLambdaImpl) { - sb.append(mFunc); + Object func = mFunc; + if (func instanceof PooledLambdaImpl) { + sb.append(func); } else { - sb.append(getFuncTypeAsString()).append("@").append(hashCodeHex(mFunc)); + sb.append(getFuncTypeAsString()).append("@").append(hashCodeHex(func)); } sb.append("("); - sb.append(commaSeparateFirstN(mArgs, LambdaType.decodeArgCount(getFlags(MASK_FUNC_TYPE)))); + sb.append(commaSeparateFirstN(mArgs, + LambdaType.decodeArgCount(getFlags(MASK_FUNC_TYPE)))); sb.append(")"); } return sb.toString(); @@ -450,7 +454,7 @@ final class PooledLambdaImpl<R> extends OmniFunction<Object, } private static String hashCodeHex(Object o) { - return Integer.toHexString(o.hashCode()); + return Integer.toHexString(Objects.hashCode(o)); } private String getFuncTypeAsString() { @@ -490,7 +494,7 @@ final class PooledLambdaImpl<R> extends OmniFunction<Object, + ", i = " + i + ")"); } - r.mFunc = func; + r.mFunc = Preconditions.checkNotNull(func); r.setFlags(MASK_FUNC_TYPE, LambdaType.encode(fNumArgs, fReturnType)); r.setFlags(MASK_EXPOSED_AS, LambdaType.encode(numPlaceholders, fReturnType)); if (ArrayUtils.size(r.mArgs) < fNumArgs) r.mArgs = new Object[fNumArgs]; diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 07f8ee077c21..dc45f7834748 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -886,13 +886,13 @@ public class LockPatternUtils { return; } + // TODO(b/120484642): This is a location where we still use a String for vold + String passwordString = password != null ? new String(password) : null; new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... dummy) { IStorageManager storageManager = IStorageManager.Stub.asInterface(service); try { - // TODO(b/120484642): This is a location where we still use a String for vold - String passwordString = password != null ? new String(password) : null; storageManager.changeEncryptionPassword(type, passwordString); } catch (RemoteException e) { Log.e(TAG, "Error changing encryption password", e); diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index f2665020b49e..cd0b340d489d 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -250,6 +250,11 @@ static const char* ENABLE_APEX_IMAGE = "enable_apex_image"; // Flag to pass to the runtime when using the apex image. static const char* kApexImageOption = "-Ximage:/system/framework/apex.art"; +// Feature flag name for disabling lock profiling. +static const char* DISABLE_LOCK_PROFILING = "disable_lock_profiling"; +// Runtime option disabling lock profiling. +static const char* kLockProfThresholdRuntimeOption = "-Xlockprofthreshold:0"; + static AndroidRuntime* gCurRuntime = NULL; /* @@ -698,6 +703,17 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) ALOGI("Using default boot image"); } + std::string disable_lock_profiling = + server_configurable_flags::GetServerConfigurableFlag(RUNTIME_NATIVE_BOOT_NAMESPACE, + DISABLE_LOCK_PROFILING, + /*default_value=*/ ""); + if (disable_lock_profiling == "true") { + addOption(kLockProfThresholdRuntimeOption); + ALOGI("Disabling lock profiling: '%s'\n", kLockProfThresholdRuntimeOption); + } else { + ALOGI("Leaving lock profiling enabled"); + } + bool checkJni = false; property_get("dalvik.vm.checkjni", propBuf, ""); if (strcmp(propBuf, "true") == 0) { diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index fc2b7f66e77a..686a91901b5f 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -2242,6 +2242,12 @@ android_media_AudioSystem_setAllowedCapturePolicy(JNIEnv *env, jobject thiz, jin return AudioSystem::setAllowedCapturePolicy(uid, flags); } +static jint +android_media_AudioSystem_setRttEnabled(JNIEnv *env, jobject thiz, jboolean enabled) +{ + return (jint) check_AudioSystem_Command(AudioSystem::setRttEnabled(enabled)); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gMethods[] = { @@ -2319,6 +2325,7 @@ static const JNINativeMethod gMethods[] = { {"getHwOffloadEncodingFormatsSupportedForA2DP", "(Ljava/util/ArrayList;)I", (void*)android_media_AudioSystem_getHwOffloadEncodingFormatsSupportedForA2DP}, {"setAllowedCapturePolicy", "(II)I", (void *)android_media_AudioSystem_setAllowedCapturePolicy}, + {"setRttEnabled", "(Z)I", (void *)android_media_AudioSystem_setRttEnabled}, }; static const JNINativeMethod gEventHandlerMethods[] = { diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index a67cb34e19dd..14dbabb1ce02 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -289,14 +289,14 @@ static void load_maps(int pid, stats_t* stats, bool* foundSwapPss) } else if (base::EndsWith(name, ".oat")) { which_heap = HEAP_OAT; is_swappable = true; - } else if (base::EndsWith(name, ".art")) { + } else if (base::EndsWith(name, ".art") || base::EndsWith(name, ".art]")) { which_heap = HEAP_ART; // Handle system@framework@boot* and system/framework/boot* if ((strstr(name.c_str(), "@boot") != nullptr) || (strstr(name.c_str(), "/boot"))) { - sub_heap = HEAP_DEX_BOOT_VDEX; + sub_heap = HEAP_ART_BOOT; } else { - sub_heap = HEAP_DEX_APP_VDEX; + sub_heap = HEAP_ART_APP; } is_swappable = true; } else if (base::StartsWith(name, "/dev/")) { @@ -713,16 +713,20 @@ static bool dumpTraces(JNIEnv* env, jint pid, jstring fileName, jint timeoutSecs O_CREAT | O_WRONLY | O_NOFOLLOW | O_CLOEXEC | O_APPEND, 0666)); if (fd < 0) { - fprintf(stderr, "Can't open %s: %s\n", fileNameChars.c_str(), strerror(errno)); + PLOG(ERROR) << "Can't open " << fileNameChars.c_str(); return false; } - return (dump_backtrace_to_file_timeout(pid, dumpType, timeoutSecs, fd) == 0); + int res = dump_backtrace_to_file_timeout(pid, dumpType, timeoutSecs, fd); + if (fdatasync(fd.get()) != 0) { + PLOG(ERROR) << "Failed flushing trace."; + } + return res == 0; } static jboolean android_os_Debug_dumpJavaBacktraceToFileTimeout(JNIEnv* env, jobject clazz, jint pid, jstring fileName, jint timeoutSecs) { - const bool ret = dumpTraces(env, pid, fileName, timeoutSecs, kDebuggerdJavaBacktrace); + const bool ret = dumpTraces(env, pid, fileName, timeoutSecs, kDebuggerdJavaBacktrace); return ret ? JNI_TRUE : JNI_FALSE; } diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp index 81428dc02fb4..bd82bd91c55d 100644 --- a/core/jni/android_os_Trace.cpp +++ b/core/jni/android_os_Trace.cpp @@ -24,26 +24,29 @@ namespace android { -inline static void sanitizeString(char* str, size_t size) { - for (size_t i = 0; i < size; i++) { - char c = str[i]; - if (c == '\0' || c == '\n' || c == '|') { - str[i] = ' '; +inline static void sanitizeString(char* str) { + while (*str) { + char c = *str; + if (c == '\n' || c == '|') { + *str = ' '; } + str++; } } -inline static void getString(JNIEnv* env, jstring jstring, char* outBuffer, jsize maxSize) { - jsize size = std::min(env->GetStringLength(jstring), maxSize); - env->GetStringUTFRegion(jstring, 0, size, outBuffer); - sanitizeString(outBuffer, size); - outBuffer[size] = '\0'; -} - template<typename F> inline static void withString(JNIEnv* env, jstring jstr, F callback) { - std::array<char, 1024> buffer; - getString(env, jstr, buffer.data(), buffer.size()); + // We need to handle the worst case of 1 character -> 4 bytes + // So make a buffer of size 4097 and let it hold a string with a maximum length + // of 1024. The extra last byte for the null terminator. + std::array<char, 4097> buffer; + // We have no idea of knowing how much data GetStringUTFRegion wrote, so null it out in + // advance so we can have a reliable null terminator + memset(buffer.data(), 0, buffer.size()); + jsize size = std::min(env->GetStringLength(jstr), 1024); + env->GetStringUTFRegion(jstr, 0, size, buffer.data()); + sanitizeString(buffer.data()); + callback(buffer.data()); } diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 8ff16912e932..4783a257755f 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -198,7 +198,7 @@ class UsapTableEntry { * PIDs don't match nothing will happen. * * @param pid The ID of the process who's entry we want to clear. - * @return True if the entry was cleared; false otherwise + * @return True if the entry was cleared by this call; false otherwise */ bool ClearForPID(int32_t pid) { EntryStorage storage = mStorage.load(); @@ -212,14 +212,16 @@ class UsapTableEntry { * 3) It fails and the new value isn't INVALID_ENTRY_VALUE, in which * case the entry has already been cleared and re-used. * - * In all three cases the goal of the caller has been met and we can - * return true. + * In all three cases the goal of the caller has been met, but only in + * the first case do we need to decrement the pool count. */ if (mStorage.compare_exchange_strong(storage, INVALID_ENTRY_VALUE)) { close(storage.read_pipe_fd); + return true; + } else { + return false; } - return true; } else { return false; } @@ -331,11 +333,24 @@ static void SigChldHandler(int /*signal_number*/) { if (WIFEXITED(status)) { async_safe_format_log(ANDROID_LOG_INFO, LOG_TAG, "Process %d exited cleanly (%d)", pid, WEXITSTATUS(status)); + + // Check to see if the PID is in the USAP pool and remove it if it is. + if (RemoveUsapTableEntry(pid)) { + ++usaps_removed; + } } else if (WIFSIGNALED(status)) { async_safe_format_log(ANDROID_LOG_INFO, LOG_TAG, "Process %d exited due to signal %d (%s)%s", pid, WTERMSIG(status), strsignal(WTERMSIG(status)), WCOREDUMP(status) ? "; core dumped" : ""); + + // If the process exited due to a signal other than SIGTERM, check to see + // if the PID is in the USAP pool and remove it if it is. If the process + // was closed by the Zygote using SIGTERM then the USAP pool entry will + // have already been removed (see nativeEmptyUsapPool()). + if (WTERMSIG(status) != SIGTERM && RemoveUsapTableEntry(pid)) { + ++usaps_removed; + } } // If the just-crashed process is the system_server, bring down zygote @@ -346,11 +361,6 @@ static void SigChldHandler(int /*signal_number*/) { "Exit zygote because system server (pid %d) has terminated", pid); kill(getpid(), SIGKILL); } - - // Check to see if the PID is in the USAP pool and remove it if it is. - if (RemoveUsapTableEntry(pid)) { - ++usaps_removed; - } } // Note that we shouldn't consider ECHILD an error because @@ -1648,7 +1658,13 @@ static void com_android_internal_os_Zygote_nativeEmptyUsapPool(JNIEnv* env, jcla auto entry_storage = entry.GetValues(); if (entry_storage.has_value()) { - kill(entry_storage.value().pid, SIGKILL); + kill(entry_storage.value().pid, SIGTERM); + + // Clean up the USAP table entry here. This avoids a potential race + // where a newly created USAP might not be able to find a valid table + // entry if signal handler (which would normally do the cleanup) doesn't + // run between now and when the new process is created. + close(entry_storage.value().read_pipe_fd); // Avoid a second atomic load by invalidating instead of clearing. @@ -1678,6 +1694,16 @@ static jboolean com_android_internal_os_Zygote_nativeDisableExecuteOnly(JNIEnv* return dl_iterate_phdr(disable_execute_only, nullptr) == 0; } +static void com_android_internal_os_Zygote_nativeBlockSigTerm(JNIEnv* env, jclass) { + auto fail_fn = std::bind(ZygoteFailure, env, "usap", nullptr, _1); + BlockSignal(SIGTERM, fail_fn); +} + +static void com_android_internal_os_Zygote_nativeUnblockSigTerm(JNIEnv* env, jclass) { + auto fail_fn = std::bind(ZygoteFailure, env, "usap", nullptr, _1); + UnblockSignal(SIGTERM, fail_fn); +} + static const JNINativeMethod gMethods[] = { { "nativeForkAndSpecialize", "(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)I", @@ -1708,7 +1734,11 @@ static const JNINativeMethod gMethods[] = { { "nativeEmptyUsapPool", "()V", (void *) com_android_internal_os_Zygote_nativeEmptyUsapPool }, { "nativeDisableExecuteOnly", "()Z", - (void *) com_android_internal_os_Zygote_nativeDisableExecuteOnly } + (void *) com_android_internal_os_Zygote_nativeDisableExecuteOnly }, + { "nativeBlockSigTerm", "()V", + (void* ) com_android_internal_os_Zygote_nativeBlockSigTerm }, + { "nativeUnblockSigTerm", "()V", + (void* ) com_android_internal_os_Zygote_nativeUnblockSigTerm } }; int register_com_android_internal_os_Zygote(JNIEnv* env) { diff --git a/core/jni/com_android_internal_os_ZygoteInit.cpp b/core/jni/com_android_internal_os_ZygoteInit.cpp index 5cca0fdc735b..c2a5ee43dbd5 100644 --- a/core/jni/com_android_internal_os_ZygoteInit.cpp +++ b/core/jni/com_android_internal_os_ZygoteInit.cpp @@ -19,7 +19,6 @@ #include <EGL/egl.h> #include <Properties.h> #include <ui/GraphicBufferMapper.h> -#include <vulkan/vulkan.h> #include "core_jni_helpers.h" @@ -67,9 +66,6 @@ void android_internal_os_ZygoteInit_nativePreloadGraphicsDriver(JNIEnv* env, jcl ScopedSCSExit x; if (Properties::peekRenderPipelineType() == RenderPipelineType::SkiaGL) { eglGetDisplay(EGL_DEFAULT_DISPLAY); - } else { - uint32_t count = 0; - vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr); } } diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index 9a9c9d14154b..7d0629ee6fba 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -321,6 +321,14 @@ message IncidentProto { (section).args = "incidentcompanion --restricted_image" ]; + // System trace as a serialized protobuf. + optional bytes system_trace = 3026 [ + (section).type = SECTION_FILE, + (section).args = "/data/misc/perfetto-traces/incident-trace", + (privacy).dest = DEST_AUTOMATIC, + (section).userdebug_and_eng_only = true + ]; + // Reserved for OEMs. extensions 50000 to 100000; } diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index 8f16b418f7db..00706941a18f 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -457,6 +457,9 @@ message GlobalSettingsProto { optional SettingProto game_driver_sphal_libraries = 16; // ANGLE - External package containing ANGLE libraries optional SettingProto angle_debug_package = 17; + // Game Driver - List of Apps selected to use prerelease Game Driver + // i.e. <pkg1>,<pkg2>,...,<pkgN> + optional SettingProto game_driver_prerelease_opt_in_apps = 18; } optional Gpu gpu = 59; diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 7ee1f2a04980..e849da30449c 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>-Wi-Fi-oproepe"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g>-Wi-Fi-oproepe"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-oproep"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>-WLAN-oproep"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>-Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Oorlegger #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", veilig"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Hierdie begin van agtergrondaktiwiteit vanaf <xliff:g id="PACKAGENAME">%1$s</xliff:g> sal in toekomstige Q-bouweergawes geblokkeer word. Sien g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Begin van agtergrondaktiwiteit vanaf <xliff:g id="PACKAGENAME">%1$s</xliff:g> word geblokkeer. Sien g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Het jy die patroon vergeet?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Verkeerde patroon"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Verkeerde wagwoord"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aangeskakel"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> afgeskakel"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Druk en hou albei volumesleutels drie sekondes lank om <xliff:g id="SERVICE_NAME">%1$s</xliff:g> te gebruik"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Kies \'n kenmerk om te gebruik wanneer jy op die Toeganklikheid-knoppie tik:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Raak en hou die Toeganklikheid-knoppie om kenmerke te verander."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Kies \'n diens om te gebruik wanneer jy op die toeganklikheidknoppie tik:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Kies \'n diens om te gebruik saam met die toeganklikheidgebaar (swiep met twee vingers op van die onderkant van die skerm af):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Kies \'n diens om te gebruik saam met die toeganklikheidgebaar (swiep met drie vingers op van die onderkant van die skerm af):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Raak en hou die toeganklikheidknoppie om tussen dienste te wissel."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Swiep op met twee vingers en hou om tussen dienste te wissel."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Swiep op met drie vingers en hou om tussen dienste te wissel."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergroting"</string> <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string> <string name="user_switching_message" msgid="2871009331809089783">"Skakel tans oor na <xliff:g id="NAME">%1$s</xliff:g> …"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 6fb2986fc8f9..ce70f2708a7b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> የWi-Fi ጥሪ አደራረግ"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> የWi-Fi ጥሪ"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"የWLAN ጥሪ"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> የWLAN ጥሪ"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ተደራቢ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>፦ <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>፣ <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"፣ የተጠበቀ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"ይህ የ<xliff:g id="PACKAGENAME">%1$s</xliff:g> የበስተጀርባ እንቅስቃሴ ጅምር በወደፊት የQ ግንቦች ላይ ይታገዳል። g.co/dev/bgblock ይመልከቱ።"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"የ<xliff:g id="PACKAGENAME">%1$s</xliff:g> የበስተጀርባ እንቅስቃሴ ጅምር ታግዷል። g.co/dev/bgblock ይመልከቱ።"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ስርዓተ ጥለቱን እርሳ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"የተሳሳተ ስርዓተ ጥለት"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"የተሳሳተ ይለፍ ቃል"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አብርቶታል"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አጥፍቶታል"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን ለመጠቀም ለሦስት ሰከንዶች ሁለቱንም የድምፅ ቁልፎች ተጭነው ይያዙ"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"የተደራሽነት አዝራርን መታ በሚያደርጉበት ጊዜ ጥቅም ላይ የሚውለውን ባህሪ ይምረጡ፦"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ባህሪያትን ለመለወጥ የተደራሽነት አዝራሩን ይንኩ እና ይያዙት።"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"የተደራሽነት አዝራርን መታ በሚያደርጉበት ጊዜ ጥቅም ላይ የሚውለውን አገልግሎት ይምረጡ፦"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ከተደራሽነት ጣት ምልክት ጋር የሚጠቀሙበት አአገልግሎት ይምረጡ (በሁለት ጣቶች ከማያ ገጹ ግርጌ ወደ ላይ ይጥረጉ)፦"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ከተደራሽነት ጣት ምልክት ጋር አብረው የሚጠቀሙበት አገልግሎት ይምረጡ (በሶስት ጣቶች ከማያ ገጹ ግርጌ ወደ ላይ ይጥረጉ)፦"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"በአገልግሎቶች መካከል ለመቀያየር የተደራሽነት አዝራሩን ነክተው ይያዙ።"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"በአገልግሎቶች መካከል ለመቀያየር በሁለት ጣቶች ወደ ላይ ጠርገው ይያዙ።"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"በአገልግሎቶች መካከል ለመቀያየር በሶስት ጣቶች ወደ ላይ ጠርገው ይያዙ።"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ማጉላት"</string> <string name="user_switched" msgid="3768006783166984410">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string> <string name="user_switching_message" msgid="2871009331809089783">"ወደ <xliff:g id="NAME">%1$s</xliff:g> በመቀየር ላይ…"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 29c155d93b34..432c101c286d 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -135,6 +135,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"الاتصال عبر شبكة Wi-Fi التابعة لـ <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"الاتصال عبر Wi-Fi ضمن شبكة <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"مكالمة عبر شبكة WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"مكالمة عبر شبكة WLAN التابعة لـ <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"شبكة Wi-Fi التابعة لـ <xliff:g id="SPN">%s</xliff:g>"</string> @@ -307,7 +308,7 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى الصور والوسائط والملفات على جهازك؟"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"الميكروفون"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"تسجيل الصوت"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بتسجيل الصوت؟"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"هل تريد السماح لـ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بتسجيل الصوت؟"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"النشاط البدني"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"الوصول إلى بيانات نشاطك البدني"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"هل تريد السماح للتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى بيانات نشاطك البدني؟"</string> @@ -319,7 +320,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى سجلّ مكالماتك الهاتفية؟"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"الهاتف"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"إجراء مكالمات هاتفية وإدارتها"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بإجراء المكالمات الهاتفية وإدارتها؟"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"هل تريد السماح لـ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بإجراء المكالمات الهاتفية وإدارتها؟"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"أجهزة استشعار الجسم"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالدخول إلى بيانات المستشعر حول علاماتك الحيوية؟"</string> @@ -1703,8 +1704,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"المركب #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>، <xliff:g id="DPI">%4$d</xliff:g> نقطة لكل بوصة"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"آمن"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"سيتم حظر بدء نشاط الخلفية هذا من <xliff:g id="PACKAGENAME">%1$s</xliff:g> في إصدارات Q القادمة. اطّلع على g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"تم حظر بدء نشاط الخلفية من <xliff:g id="PACKAGENAME">%1$s</xliff:g>. اطّلع على g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"نسيت النقش"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"النقش غير صحيح"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"كلمة مرور خاطئة"</string> @@ -1762,8 +1761,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"شغَّل اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"أوقف اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"اضغط مع الاستمرار على مفتاحي مستوى الصوت لمدة 3 ثوانٍ لاستخدام <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"يمكنك اختيار إحدى الميزات لاستخدامها عند النقر على زر إمكانية الوصول:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"لتغيير الميزات، يمكنك لمس زر \"إمكانية الوصول\" مع الاستمرار."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"يمكنك اختيار إحدى الخدمات لاستخدامها عند النقر على زر سهولة الاستخدام:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"يمكنك اختيار إحدى الخدمات لاستخدامها مع إيماءة سهولة الاستخدام (مرّر سريعًا لأعلى من أسفل الشاشة باستخدام إصبعين):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"يمكنك اختيار إحدى الخدمات لاستخدامها مع إيماءة سهولة الاستخدام (مرّر سريعًا لأعلى من أسفل الشاشة باستخدام ثلاثة أصابع):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"للتبديل بين الخدمات، يمكنك لمس زر سهولة الاستخدام مع الاستمرار."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"للتبديل بين الخدمات، يمكنك التمرير سريعًا لأعلى باستخدام إصبعين مع الاستمرار."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"للتبديل بين الخدمات، يمكنك التمرير سريعًا لأعلى باستخدام ثلاثة أصابع مع الاستمرار."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"التكبير"</string> <string name="user_switched" msgid="3768006783166984410">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"جارٍ التبديل إلى <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -2119,7 +2122,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"تم العثور على تطبيق ضار"</string> <string name="slices_permission_request" msgid="8484943441501672932">"يريد تطبيق <xliff:g id="APP_0">%1$s</xliff:g> عرض شرائح تطبيق <xliff:g id="APP_2">%2$s</xliff:g>."</string> <string name="screenshot_edit" msgid="7867478911006447565">"تعديل"</string> - <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"سيهتز الهاتف عند تلقي المكالمات والإشعارات"</string> + <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"سيهتز الهاتف عند تلقّي المكالمات والإشعارات"</string> <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"تغييرات النظام"</string> <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"عدم الإزعاج"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 14f626db66ca..6f50a81f17d2 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ৱাই- ফাই কলিং"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> ৱাই-ফাই কলিং"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN কল"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN কল"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ৱাই-ফাই"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"অ\'ভাৰলে\' #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", সুৰক্ষিত"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>ৰ পৰা নেপথ্যত আৰম্ভ হোৱা এই কাৰ্যকলাপটো ভৱিষ্যতে Q বিল্ডত অৱৰোধ কৰা হ’ব। g.co/dev/bgblock চাওক।"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>ৰ পৰা নেপথ্যত আৰম্ভ হোৱা কাৰ্যকলাপ অৱৰোধ কৰা হৈছে। g.co/dev/bgblock চাওক।"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"আৰ্হি পাহৰিলেনে"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ভুল আৰ্হি"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ভুল পাছৱৰ্ড"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অন কৰিছে"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অফ কৰিছে"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ব্যৱহাৰ কৰিবলৈ দুয়োটা ভলিউম বুটাম তিনি ছেকেণ্ডৰ বাবে হেঁচি ৰাখক"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"আপুনি দিব্যাংগসকলৰ সুবিধাৰ বুটামটো টিপিলে ব্যৱহাৰ কৰিবলগীয়া কোনো সুবিধা বাছক:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"সুবিধাসমূহ সলনি কৰিবলৈ দিব্যাংগসকলৰ সুবিধাৰ বুটামটো স্পৰ্শ কৰি থাকক।"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"আপুনি সাধ্য সুবিধাৰ বুটামটো টিপিলে ব্যৱহাৰ কৰিবলৈ এটা সেৱা বাছনি কৰক:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"সাধ্য সুবিধা ভংগিমাৰ সৈতে ব্যৱহাৰ কৰিবলৈ এটা সেৱা বাছনি কৰক (দুটা আঙুলিৰে স্ক্রীণখনৰ একেবাৰে তলিৰ পৰা ওপৰলৈ ছোৱাইপ কৰক):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"সাধ্য সুবিধা ভংগিমাৰ সৈতে ব্যৱহাৰ কৰিবলৈ এটা সেৱা বাছনি কৰক (তিনিটা আঙুলিৰে স্ক্রীণখনৰ একেবাৰে তলিৰ পৰা ওপৰলৈ ছোৱাইপ কৰক):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"সেৱাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ সাধ্য সুবিধাৰ বুটামটো স্পৰ্শ কৰি ধৰি ৰাখক।"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"সেৱাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ দুটা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"সেৱাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ তিনিটা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"বিবৰ্ধন"</string> <string name="user_switched" msgid="3768006783166984410">"বৰ্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="NAME">%1$s</xliff:g>।"</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>লৈ সলনি কৰি থকা হৈছে…"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index b8e11f28a262..77ecfa5d8b81 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Zəngi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> WiFi Zəngi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Zəngi"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Zəngi"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Örtük #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", təhlükəsiz"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ünvanından olan bu arxa fon fəaliyyəti növbəti Q versiyalarında blok ediləcək. G.co/dev/bgblock ünvanına baxın."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ünvanından olan arxa fon fəaliyyəti blok edildi. G.co/dev/bgblock ünvanına baxın."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Şablonu unutmuşam"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini aktiv etdi"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini deaktiv etdi"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> istifadə etmək üçün hər iki səs düyməsini üç saniyə basıb saxlayın"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Əlçatımlılıq düyməsinə kliklədikdə istifadə etmək üçün funksiya seçin:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funksiyaları dəyişmək üçün Əlçatımlılıq düyməsinə basıb saxlayın."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Əlçatımlılıq düyməsinə toxunduqda istifadə etmək üçün xidmət seçin:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Əlçatımlılıq jestləri (iki barmağınızla ekranın aşağısından yuxarı doğru sürüşdürün) ilə istifadə etmək üçün xidmət seçin:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Əlçatımlılıq jestləri (üç barmağınızla ekranın aşağısından yuxarı doğru sürüşdürün) ilə istifadə etmək üçün xidmət seçin:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Xidmətlər arasında keçid etmək üçün əlçatımlılıq düyməsinə basın & saxlayın."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Xidmətlər arasında keçid etmək üçün ekranı iki barmağınızla yuxarı sürüşdürüb saxlayın."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Xidmətlər arasında keçid etmək üçün ekranı üç barmağınızla yuxarı sürüşdürüb saxlayın."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Böyütmə"</string> <string name="user_switched" msgid="3768006783166984410">"Cari istifadəçi <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> adına keçirilir…"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 5285e8e9d741..de9589578361 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -132,6 +132,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> pozivanje preko Wi-Fi-ja"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> – pozivanje preko Wi-Fi-ja"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN poziv"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN poziv"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1634,8 +1635,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Postavljeni element br. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>×<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", bezbedno"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Ovo pokretanje aktivnosti u pozadini sa <xliff:g id="PACKAGENAME">%1$s</xliff:g> biće blokirano u budućim Q verzijama. Pogledajte g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Pokretanje aktivnosti u pozadini sa <xliff:g id="PACKAGENAME">%1$s</xliff:g> je blokirano. Pogledajte g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravljeni šablon"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan šablon"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string> @@ -1690,8 +1689,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pritisnite i zadržite oba tastera za jačinu zvuka tri sekunde da biste koristili <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izaberite funkciju koja će se koristiti kada dodirnete dugme za pristupačnost:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pritisnite i zadržite dugme za pristupačnost da biste menjali funkcije."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Odaberite uslugu koja će se koristiti kada dodirnete dugme za pristupačnost:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Odaberite funkciju koja će se koristiti pomoću pokreta za pristupačnost (pomoću dva prsta prevucite nagore od dna ekrana):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Odaberite uslugu koja će se koristiti pomoću pokreta za pristupačnost (pomoću tri prsta prevucite nagore od dna ekrana):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Da biste prelazili sa jedne usluge na drugu, dodirnite i zadržite dugme za pristupačnost."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Da biste prelazili sa jedne usluge na drugu, prevucite nagore pomoću dva prsta i zadržite."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Da biste prelazili sa jedne usluge na drugu, prevucite nagore pomoću tri prsta i zadržite."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string> <string name="user_switched" msgid="3768006783166984410">"Aktuelni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Prebacivanje na <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 109342078a11..8326d4f64930 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-тэлефанія ад <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Wi-Fi-тэлефанія ад аператара \"<xliff:g id="SPN">%s</xliff:g>\""</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Выклік праз WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Выклік праз WLAN ад <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi ад <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Оверлей # <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> кр. на цалю"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", бяспечны"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Запуск дзеянняў у фонавым рэжыме з пакета \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" будзе заблакіраваны ў будучых Q-зборках. Глядзіце g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Запуск дзеянняў у фонавым рэжыме з пакета \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" заблакіраваны. Глядзіце g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забылі ключ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Няправільны ўзор"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Няправiльны пароль"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў уключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў адключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Каб карыстацца сэрвісам \"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\", націсніце і ўтрымлівайце на працягу трох секунд абедзве клавішы гучнасці"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Выберыце функцыю для выкарыстання пры націску кнопкі \"Спецыяльныя магчымасці\":"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Каб змяняць функцыі, краніце і ўтрымлівайце кнопку \"Спецыяльныя магчымасці\"."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Выберыце службу для выкарыстання пры націску кнопкі \"Спецыяльныя магчымасці\":"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"З дапамогай жэста спецыяльных магчымасцей (правядзіце двума пальцамі па экране знізу ўверх) выберыце службу для выкарыстання:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"З дапамогай жэста спецыяльных магчымасцей (правядзіце трыма пальцамі па экране знізу ўверх) выберыце службу для выкарыстання:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Каб пераключыцца на другую службу, націсніце і ўтрымлівайце кнопку спецыяльных магчымасцей."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Каб пераключыцца на другую службу, правядзіце ўверх двума пальцамі, утрымліваючы іх на экране."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Каб пераключыцца на другую службу, правядзіце ўверх трыма пальцамі, утрымліваючы іх на экране."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Павелічэнне"</string> <string name="user_switched" msgid="3768006783166984410">"Бягучы карыстальнік <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Пераход да <xliff:g id="NAME">%1$s</xliff:g>..."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index e1f055e74226..dc5e17df2760 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Обаждания през Wi-Fi от <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Обаждания през Wi-Fi от <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Обаждане през WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Обаждане през WLAN от <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi от <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Наслагване №<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"„<xliff:g id="NAME">%1$s</xliff:g>“: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", защитено"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Стартирането на активност на заден план от <xliff:g id="PACKAGENAME">%1$s</xliff:g> ще бъде блокирано в бъдещите компилации под Q. Разгледайте g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Стартирането на активност на заден план от <xliff:g id="PACKAGENAME">%1$s</xliff:g> е блокирано. Разгледайте g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забравена фигура"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Грешна фигура"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Грешна парола"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Прекият път за достъпност включи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Прекият път за достъпност изключи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"За да използвате <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, натиснете двата бутона за силата на звука и ги задръжте за 3 секунди"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изберете функция, която да използвате, когато докоснете бутона за достъпност:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"За да промените функции, докоснете и задръжте бутона за достъпност."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Изберете коя услуга да се използва при докосване на бутона за достъпност:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Изберете коя услуга да се използва с жеста за достъпност (прекарване на два пръста нагоре от долната част на екрана):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Изберете коя услуга да се използва с жеста за достъпност (прекарване на три пръста нагоре от долната част на екрана):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"За превключване между услугите докоснете и задръжте бутона за достъпност."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"За превключване между услугите прекарайте два пръста нагоре и задръжте."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"За превключване между услугите прекарайте три пръста нагоре и задръжте."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ниво на мащаба"</string> <string name="user_switched" msgid="3768006783166984410">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Превключва се към <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 39c8368ee0cb..676eced14baf 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ওয়াই-ফাই কলিং"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi‑Fi কলিং"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN কল"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN কল"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ওয়াই-ফাই"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"আচ্ছাদন #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", নিরাপদ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-এর ব্যাকগ্রাউন্ড অ্যাক্টিভিটি ভবিষ্যতে Q বিল্ড ভার্সনে ব্লক করা হবে। g.co/dev/bgblock লিঙ্ক দেখুন।"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-এর ব্যাকগ্রাউন্ড অ্যাক্টিভিটি ব্লক করা হয়েছে। g.co/dev/bgblock লিঙ্ক দেখুন।"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"প্যাটার্ন ভুলে গেছেন"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ভুল প্যাটার্ন"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ভুল পাসওয়ার্ড"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে চালু করেছে"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে বন্ধ করেছে"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ব্যবহার করতে ভলিউম কী বোতাম ৩ সেকেন্ডের জন্য চেপে ধরে রাখুন"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"অ্যাক্সেসযোগ্যতা বোতামের সাহায্যে যে বৈশিষ্ট্যটি নিয়ন্ত্রণ করতে চান, সেটি বেছে নিন:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"বৈশিষ্ট্যগুলি পরিবর্তন করতে অ্যাক্সেসযোগ্যতা বোতামটি ট্যাপ করে ধরে রাখুন।"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"অ্যাক্সেসিবিলিটি বোতামে ট্যাপ করে ব্যবহার করার জন্য এই পরিষেবাটি বেছে নিন:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"অ্যাক্সেসিবিলিটি জেসচারের সাহায্যে ব্যবহার করার জন্য এই পরিষেবা বেছে নিন (দুটি আঙুল দিয়ে স্ক্রিনের নিচ থেকে উপরের দিকে সোয়াইপ করুন):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"অ্যাক্সেসিবিলিটি জেসচারের সাহায্যে ব্যবহার করার জন্য এই পরিষেবা বেছে নিন (তিনটি আঙুল দিয়ে স্ক্রিনের নিচ থেকে উপরের দিকে সোয়াইপ করুন):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"একটি পরিষেবা থেকে অন্য পরিষেবায় পাল্টাতে অ্যাক্সেসিবিলিটি বোতামটি টাচ করে & ধরে রাখুন।"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"একটি পরিষেবা থেকে অন্য পরিষেবায় পাল্টাতে, দুটি আঙ্গুল দিয়ে উপরের দিকে সোয়াইপ করে ধরে রাখুন।"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"একটি পরিষেবা থেকে অন্য পরিষেবায় পাল্টাতে, তিনটি আঙ্গুল দিয়ে উপরের দিকে সোয়াইপ করে ধরে রাখুন।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"বড় করে দেখা"</string> <string name="user_switched" msgid="3768006783166984410">"বর্তমান ব্যবহারকারী <xliff:g id="NAME">%1$s</xliff:g>৷"</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> নামের ব্যবহারকারীতে যাচ্ছে…"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 3d61c150311e..b9415467947c 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -132,6 +132,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Pozivanje putem WiFi-ja"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Pozivanje putem WiFi-ja"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN poziv"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN poziv"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> WiFi"</string> @@ -1636,8 +1637,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Nadsloj #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", osigurano"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Pokretanje aktivnosti u pozadini na web lokaciji <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokirat će se u budućim Q verzijama. Pogledajte g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Blokirano je pokretanje aktivnosti u pozadini na web lokaciji <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Pogledajte g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravili ste uzorak?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan uzorak"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string> @@ -1692,8 +1691,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pritisnite obje tipke za podešavanje jačine zvuka i držite ih pritisnutim tri sekunde da koristite uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da promijenite funkcije, dodirnite i držite dugme Pristupačnost."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Odaberite uslugu koja će se koristiti kada dodirnete dugme za pristupačnost:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Odaberite uslugu koja će se koristiti kada izvedete pokret za pristupačnost (s dva prsta prevucite prema gore s dna ekrana):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Odaberite uslugu koja će se koristiti kada izvedete pokret za pristupačnost (s tri prsta prevucite prema gore s dna ekrana):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Za prebacivanje između usluga dodirnite i zadržite dugme za pristupačnost."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Za prebacivanje između usluga s dva prsta prevucite prema gore i zadržite."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Za prebacivanje između usluga s tri prsta prevucite prema gore i zadržite."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string> <string name="user_switched" msgid="3768006783166984410">"Trenutni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Prebacivanje na korisnika <xliff:g id="NAME">%1$s</xliff:g>..."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 4dcab779cf2b..26790dddb5d3 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Trucades per Wi‑Fi (<xliff:g id="SPN">%s</xliff:g>)"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Trucades per Wi-Fi (<xliff:g id="SPN">%s</xliff:g>)"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Trucada per WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Trucada per WLAN (<xliff:g id="SPN">%s</xliff:g>)"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi‑Fi (<xliff:g id="SPN">%s</xliff:g>)"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposa #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segur"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"A les futures compilacions de Q, es bloquejarà aquest inici d\'activitat en segon pla del paquet <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"S\'ha bloquejat l\'inici d\'activitat en segon pla del paquet <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"He oblidat el patró"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Patró incorrecte"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contrasenya incorrecta"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"La drecera d\'accessibilitat ha activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"La drecera d\'accessibilitat ha desactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Mantén premudes les dues tecles de volum durant 3 segons per fer servir <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Tria la funció que s\'utilitzarà quan toquis el botó Accessibilitat:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Per canviar les funcions, toca i mantén premut el botó Accessibilitat."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Tria el servei que s\'utilitzarà quan toquis el botó d\'accessibilitat:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Tria el servei que s\'utilitzarà amb el gest d\'accessibilitat (fes lliscar dos dits cap amunt des de la part inferior de la pantalla)."</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Tria el servei que s\'utilitzarà amb el gest d\'accessibilitat (fes lliscar tres dits cap amunt des de la part inferior de la pantalla)."</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Per canviar de servei, mantén premut el botó d\'accessibilitat."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Per canviar de servei, fes lliscar dos dits i mantén premut."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Per canviar de servei, fes lliscar tres dits i mantén premut."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliació"</string> <string name="user_switched" msgid="3768006783166984410">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"S\'està canviant a <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 2e763888abdf..404aa1d17327 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>: volání přes Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Volání přes Wi-Fi – <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Volání přes WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>: volání přes WLAN"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>: Wi-Fi"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Překryvná vrstva č. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", zabezpečené"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Zahájení této aktivity na pozadí ze zdroje <xliff:g id="PACKAGENAME">%1$s</xliff:g> bude v budoucích sestaveních Q zablokováno. Další informace: g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Zahájení aktivity na pozadí ze zdroje <xliff:g id="PACKAGENAME">%1$s</xliff:g> bylo zablokováno. Další informace: g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zapomenuté gesto"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávné gesto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávné heslo"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Zkratka přístupnosti zapnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Zkratka přístupnosti vypnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Chcete-li používat službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, tři sekundy podržte stisknutá obě tlačítka hlasitosti"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Určete, jakou funkci aktivujete klepnutím na tlačítko Přístupnost:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Chcete-li vybrat jinou funkci, podržte tlačítko Přístupnost."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Určete, jakou službu aktivujete klepnutím na tlačítko Přístupnost:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Určete, jakou službu aktivujete pomocí gesta přístupnosti (přejetí dvěma prsty ze spodní části obrazovky nahoru):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Určete, jakou službu aktivujete pomocí gesta přístupnosti (přejetí třemi prsty ze spodní části obrazovky nahoru):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Chcete-li přepnout mezi službami, podržte tlačítko Přístupnost."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Chcete-li přepnout mezi službami, přejeďte nahoru dvěma prsty a podržte je."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Chcete-li přepnout mezi službami, přejeďte nahoru třemi prsty a podržte je."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zvětšení"</string> <string name="user_switched" msgid="3768006783166984410">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Přepínání na účet <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 6e80d02e0452..a933520deeab 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-opkald via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g>-opkald via Wi-Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-opkald"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"WLAN-opkald via <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi via <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlejring nr. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sikker"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Denne opstart af aktivitet i baggrunden fra <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokeres i fremtidige Q-builds. Se g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Opstart af aktivitet i baggrunden fra <xliff:g id="PACKAGENAME">%1$s</xliff:g> er blokeret. Se g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Glemt mønster"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Forkert mønster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Forkert adgangskode"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Genvejen til hjælpefunktioner aktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Genvejen til hjælpefunktioner deaktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Hold begge lydstyrkeknapper nede i tre sekunder for at bruge <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Vælg, hvilken funktion du vil bruge, når du trykker på knappen Hjælpefunktioner:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Tryk på knappen Hjælpefunktioner, og hold fingeren nede for at skifte funktion."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Vælg, hvilken funktion du vil bruge, når du trykker på knappen Hjælpefunktioner:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Vælg, hvilken funktion du vil bruge, når du laver bevægelsen for hjælpefunktioner (stryger opad fra bunden af skærmen med to fingre):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Vælg, hvilken funktion du vil bruge, når du laver bevægelsen for hjælpefunktioner (stryger opad fra bunden af skærmen med tre fingre):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Du kan skifte mellem funktioner ved at holde knappen Hjælpefunktioner nede."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Du kan skifte mellem funktioner ved at stryge opad med to fingre og holde dem nede."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Du kan skifte mellem funktioner ved at stryge opad med tre fingre og holde dem nede."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Forstørrelse"</string> <string name="user_switched" msgid="3768006783166984410">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Skifter til <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -1885,7 +1888,7 @@ <string name="user_creation_adding" msgid="4482658054622099197">"Vil du give <xliff:g id="APP">%1$s</xliff:g> tilladelse til at oprette en ny bruger med <xliff:g id="ACCOUNT">%2$s</xliff:g> (der findes allerede en bruger med denne konto)?"</string> <string name="language_selection_title" msgid="2680677278159281088">"Tilføj et sprog"</string> <string name="country_selection_title" msgid="2954859441620215513">"Områdeindstilling"</string> - <string name="search_language_hint" msgid="7042102592055108574">"Angiv sprogets navn"</string> + <string name="search_language_hint" msgid="7042102592055108574">"Angiv sprog"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Foreslået"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Alle sprog"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Alle områder"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 83d1db4001d5..9c147884b485 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> WLAN-Telefonie"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> WLAN-Telefonie"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-Anruf"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-Anruf"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> WLAN"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay-Nr. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sicher"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Der Start dieser Hintergrundaktivität aus <xliff:g id="PACKAGENAME">%1$s</xliff:g> wird in künftigen Q-Builds blockiert. Weitere Informationen findest du unter g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Der Start der Hintergrundaktivität aus <xliff:g id="PACKAGENAME">%1$s</xliff:g> wurde blockiert. Weitere Informationen findest du unter g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Muster vergessen"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Falsches Muster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Falsches Passwort"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung aktiviert"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung deaktiviert"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Halten Sie beide Lautstärketasten drei Sekunden lang gedrückt, um <xliff:g id="SERVICE_NAME">%1$s</xliff:g> zu verwenden"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Wähle eine Funktion aus, die verwendet wird, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Um die Funktionen zu ändern, halte die Schaltfläche für die Bedienungshilfen gedrückt."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Wähle einen Dienst aus, der verwendet wird, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Wähle einen Dienst aus, der mit der Bewegung für die Bedienungshilfen verwendet wird (mit zwei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Wähle einen Dienst aus, der mit der Bewegung für die Bedienungshilfen verwendet wird (mit drei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Wenn du zwischen den Diensten wechseln möchtest, halte die Schaltfläche für die Bedienungshilfen gedrückt."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Wenn du zwischen den Diensten wechseln möchtest, wische mit zwei Fingern nach oben und halte sie gedrückt."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Wenn du zwischen den Diensten wechseln möchtest, wische mit drei Fingern nach oben und halte sie gedrückt."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergrößerung"</string> <string name="user_switched" msgid="3768006783166984410">"Aktueller Nutzer <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="2871009331809089783">"Wechseln zu <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 70a6681a325f..d8d68cacc9fa 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Κλήση Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Κλήση Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Κλήση μέσω WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Κλήση μέσω WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Επικάλυψη #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ασφαλές"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Αυτή η έναρξη δραστηριότητας παρασκηνίου από το <xliff:g id="PACKAGENAME">%1$s</xliff:g> θα αποκλειστεί σε μελλοντικές εκδόσεις του Q. Ανατρέξτε στο g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Η έναρξη δραστηριότητας παρασκηνίου από το <xliff:g id="PACKAGENAME">%1$s</xliff:g> αποκλείστηκε. Ανατρέξτε στο g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ξεχάσατε το μοτίβο"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Λάθος μοτίβο"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Λανθασμένος κωδικός πρόσβασης"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Η συντόμευση προσβασιμότητας ενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Η συντόμευση προσβασιμότητας απενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Πατήστε παρατεταμένα και τα δύο κουμπιά έντασης ήχου για τρία δευτερόλεπτα, ώστε να χρησιμοποιήσετε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Επιλέξτε μια λειτουργία που θα χρησιμοποιείται κατά το πάτημα του κουμπιού \"Προσβασιμότητα\"."</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Για να αλλάξετε λειτουργίες, αγγίξτε παρατεταμένα το κουμπί \"Προσβασιμότητα\"."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται κατά το πάτημα του κουμπιού προσβασιμότητας:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται με την κίνηση προσβασιμότητας (σύρετε με δύο δάχτυλα προς τα επάνω από το κάτω μέρος της οθόνης):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται με την κίνηση προσβασιμότητας (σύρετε με τρία δάχτυλα προς τα επάνω από το κάτω μέρος της οθόνης):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Για εναλλαγή μεταξύ υπηρεσιών, αγγίξτε παρατεταμένα το κουμπί προσβασιμότητας."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Για εναλλαγή μεταξύ υπηρεσιών, σύρετε παρατεταμένα με δύο δάχτυλα προς τα επάνω."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Για εναλλαγή μεταξύ υπηρεσιών, σύρετε παρατεταμένα με τρία δάχτυλα προς τα επάνω."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Μεγιστοποίηση"</string> <string name="user_switched" msgid="3768006783166984410">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Εναλλαγή σε <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 82972d9ee13d..c48a1fdf748c 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi calling"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Choose a service to use when you tap the accessibility button:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"To switch between services, touch & hold the accessibility button."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"To switch between services, swipe up with two fingers and hold."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"To switch between services, swipe up with three fingers and hold."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 0ededb833288..6f286850d273 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi calling"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Choose a service to use when you tap the accessibility button:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"To switch between services, touch & hold the accessibility button."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"To switch between services, swipe up with two fingers and hold."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"To switch between services, swipe up with three fingers and hold."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 82972d9ee13d..c48a1fdf748c 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi calling"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Choose a service to use when you tap the accessibility button:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"To switch between services, touch & hold the accessibility button."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"To switch between services, swipe up with two fingers and hold."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"To switch between services, swipe up with three fingers and hold."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 82972d9ee13d..c48a1fdf748c 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi calling"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Choose a service to use when you tap the accessibility button:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"To switch between services, touch & hold the accessibility button."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"To switch between services, swipe up with two fingers and hold."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"To switch between services, swipe up with three fingers and hold."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index bbededf5c79d..5182cccf18c1 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> WiFi Calling"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Call"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Choose a service to use when you tap the accessibility button:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"To switch between services, touch & hold the accessibility button."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"To switch between services, swipe up with two fingers and hold."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"To switch between services, swipe up with three fingers and hold."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 50057dee03b8..59c185c390a0 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Llamada por Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Llamada por Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Llamada por WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Llamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segura"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"En las próximas compilaciones de Q, se bloqueará el inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Se bloqueó el inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Olvidaste el patrón?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Patrón incorrecto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"El acceso directo de accesibilidad activó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"El acceso directo de accesibilidad desactivó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"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="4234556536456854251">"Elige una función para usar cuando presionas el botón Accesibilidad:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar funciones, mantén presionado el botón Accesibilidad."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Elige un servicio para usar cuando presiones el botón de accesibilidad:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Elige un servicio para 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="1041435574275047665">"Elige un servicio para 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="7003212763213614833">"Para cambiar de servicio, mantén presionado el botón de accesibilidad."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Para cambiar de servicio, desliza dos dedos hacia arriba y mantén presionado."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Para cambiar de servicio, desliza tres dedos hacia arriba y mantén presionado."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliación"</string> <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="2871009331809089783">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 433645b3b482..db39bb51af90 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Llamada por Wi‑Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Llamada por Wi‑Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Llamada por WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Llamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi‑Fi de <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", seguro"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"El inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g> se bloqueará en las próximas compilaciones de Q. Accede a g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Se ha bloqueado el inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Accede a g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Has olvidado el patrón?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"El patrón es incorrecto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"El acceso directo a accesibilidad ha activado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"El acceso directo a accesibilidad ha desactivado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Para utilizar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, mantén pulsadas ambas teclas de volumen durante 3 segundos"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Selecciona la función que se utilizará cuando toques el botón Accesibilidad:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar las funciones, mantén pulsado el botón Accesibilidad."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Selecciona el servicio que se utilizará cuando toques el botón Accesibilidad:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Elige el servicio que se utilizará con el gesto de accesibilidad (desliza dos dedos hacia arriba desde la parte inferior de la pantalla):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Elige el servicio que se utilizará con el gesto de accesibilidad (desliza tres dedos hacia arriba desde la parte inferior de la pantalla):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Para cambiar de un servicio a otro, mantén pulsado el botón de accesibilidad."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Para cambiar de un servicio a otro, desliza dos dedos hacia arriba y mantén pulsada la pantalla."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Para cambiar de un servicio a otro, desliza tres dedos hacia arriba y mantén pulsada la pantalla."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliar"</string> <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="2871009331809089783">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 871e92a5a631..23ba43cedc9f 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>: WiFi-kõned"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g>: WiFi-kõned"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-kõne"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>: WLAN-kõne"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>: WiFi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Ülekate nr .<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", turvaline"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"See taustategevuse käivitamine paketist <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokeeritakse tulevaste Q järkude puhul. Vt g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Taustategevuse käivitamine paketist <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokeeriti. Vt g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unustasin mustri"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Vale muster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Vale parool"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> sisse"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> välja"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> kasutamiseks hoidke kolm sekundit all mõlemat helitugevuse klahvi"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Valige, millist funktsiooni kasutada, kui vajutate nuppu Juurdepääsetavus:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funktsioonide muutmiseks puudutage pikalt nuppu Juurdepääsetavus."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Valige, millist teenust kasutada, kui puudutate juurdepääsetavuse nuppu:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Valige, millist teenust kasutada koos juurdepääsetavuse liigutusega (pühkige kahe sõrmega ekraanikuval alt üles):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Valige, millist teenust kasutada koos juurdepääsetavuse liigutusega (pühkige kolme sõrmega ekraanikuval alt üles):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Teenuste vahel vahetamiseks vajutage pikalt juurdepääsetavuse nuppu."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Teenuste vahel vahetamiseks pühkige kahe sõrmega üles ja hoidke."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Teenuste vahel vahetamiseks pühkige kolme sõrmega üles ja hoidke."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Suurendus"</string> <string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Üleminek kasutajale <xliff:g id="NAME">%1$s</xliff:g> ..."</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 97584c088371..ba153533e793 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi bidezko deiak"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> operadorearen wifi bidezko deiak"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN bidezko deia"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN bidezko deia"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> wifia"</string> @@ -1545,8 +1546,8 @@ <string name="storage_internal" msgid="3570990907910199483">"Barneko biltegiratze partekatua"</string> <string name="storage_sd_card" msgid="3282948861378286745">"SD txartela"</string> <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD txartela"</string> - <string name="storage_usb_drive" msgid="6261899683292244209">"USB unitatea"</string> - <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB unitatea"</string> + <string name="storage_usb_drive" msgid="6261899683292244209">"USB bidezko unitatea"</string> + <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> enpresaren USB bidezko unitatea"</string> <string name="storage_usb" msgid="3017954059538517278">"USB memoria"</string> <string name="extract_edit_menu_button" msgid="8940478730496610137">"Editatu"</string> <string name="data_usage_warning_title" msgid="6499834033204801605">"Datuen erabileraren abisua"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>. gainjartzea"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segurua"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> paketearen atzeko planoko jardueraren abio hau blokeatu egingo da Q bertsioaren etorkizuneko konpilazioetan. Joan g.co/dev/bgblock helbidera."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Blokeatu da <xliff:g id="PACKAGENAME">%1$s</xliff:g> paketearen atzeko planoko jardueraren abioa. Joan g.co/dev/bgblock helbidera."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Eredua ahaztu zaizu"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Eredu okerra"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pasahitz okerra"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktibatu du"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> desaktibatu du"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> erabiltzeko, eduki sakatuta bolumen-tekla biak hiru segundoz"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Aukeratu zein eginbide erabili nahi duzun Erabilerraztasuna botoia sakatzean:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Eginbideak aldatzeko, eduki sakatuta Erabilerraztasuna botoia."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Aukeratu zer zerbitzu erabili nahi duzun Erabilerraztasuna botoia sakatzean:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Aukeratu zer zerbitzu erabili nahi duzun erabilerraztasun-keinua egitean (hau da, bi hatz pantailaren behealdetik gora pasatuz gero):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Aukeratu zer zerbitzu erabili nahi duzun erabilerraztasun-keinua egitean (hau da, hiru hatz pantailaren behealdetik gora pasatuz gero):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Zerbitzu batetik bestera aldatzeko, eduki sakatuta Erabilerraztasuna botoia."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Zerbitzu batetik bestera aldatzeko, pasatu bi hatz pantailaren behealdetik gora eta eduki sakatuta une batez."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Zerbitzu batetik bestera aldatzeko, pasatu hiru hatz pantailaren behealdetik gora eta eduki sakatuta une batez."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Lupa"</string> <string name="user_switched" msgid="3768006783166984410">"Uneko erabiltzailea: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzailera aldatzen…"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 6e78670b17f2..135e4e5e4a07 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -42,11 +42,11 @@ <string name="serviceErased" msgid="1288584695297200972">"پاک کردن با موفقیت انجام شد."</string> <string name="passwordIncorrect" msgid="7612208839450128715">"گذرواژه اشتباه است."</string> <string name="mmiComplete" msgid="8232527495411698359">"MMI کامل شد."</string> - <string name="badPin" msgid="9015277645546710014">"پین قدیمی که نوشتهاید صحیح نیست."</string> + <string name="badPin" msgid="9015277645546710014">"این پین قدیمی که نوشتید صحیح نیست."</string> <string name="badPuk" msgid="5487257647081132201">"PUK که نوشتهاید صحیح نیست."</string> <string name="mismatchPin" msgid="609379054496863419">"پینهایی که وارد کردهاید با یکدیگر مطابقت ندارند."</string> - <string name="invalidPin" msgid="3850018445187475377">"یک پین بنویسید که 4 تا 8 رقم باشد."</string> - <string name="invalidPuk" msgid="8761456210898036513">"یک PUK با 8 رقم یا بیشتر تایپ کنید."</string> + <string name="invalidPin" msgid="3850018445187475377">"یک پین بنویسید که ۴ تا ۸ رقم باشد."</string> + <string name="invalidPuk" msgid="8761456210898036513">"یک PUK با ۸ رقم یا بیشتر تایپ کنید."</string> <string name="needPuk" msgid="919668385956251611">"سیم کارت شما با PUK قفل شده است. کد PUK را برای بازگشایی آن بنویسید."</string> <string name="needPuk2" msgid="4526033371987193070">"PUK2 را برای بازگشایی قفل سیم کارت بنویسید."</string> <string name="enablePin" msgid="209412020907207950">"ناموفق بود، قفل سیم/RUIM را فعال کنید."</string> @@ -73,8 +73,8 @@ <string name="DndMmi" msgid="1265478932418334331">"مزاحم نشوید"</string> <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"پیشفرض شناسه تماسگیرنده روی محدود است. تماس بعدی: محدود"</string> <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"پیشفرض شناسه تماسگیرنده روی محدود است. تماس بعدی: بدون محدودیت"</string> - <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"پیشفرض شناسه تماسگیرنده روی غیر محدود است. تماس بعدی: محدود"</string> - <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"پیشفرض شناسه تماسگیرنده روی غیر محدود است. تماس بعدی: بدون محدودیت"</string> + <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"پیشفرض شناسه تماسگیرنده روی غیرمحدود است. تماس بعدی: محدود"</string> + <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"پیشفرض شناسه تماسگیرنده روی غیرمحدود است. تماس بعدی: بدون محدودیت"</string> <string name="serviceNotProvisioned" msgid="8614830180508686666">"سرویس دارای مجوز نیست."</string> <string name="CLIRPermanent" msgid="3377371145926835671">"شما میتوانید تنظیم شناسه تماسگیرنده را تغییر دهید."</string> <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"بدون سرویس داده تلفن همراه"</string> @@ -103,7 +103,7 @@ <string name="serviceClassData" msgid="872456782077937893">"داده"</string> <string name="serviceClassFAX" msgid="5566624998840486475">"نمابر"</string> <string name="serviceClassSMS" msgid="2015460373701527489">"پیامک"</string> - <string name="serviceClassDataAsync" msgid="4523454783498551468">"غیر همگام"</string> + <string name="serviceClassDataAsync" msgid="4523454783498551468">"ناهمگام"</string> <string name="serviceClassDataSync" msgid="7530000519646054776">"همگامسازی"</string> <string name="serviceClassPacket" msgid="6991006557993423453">"بسته"</string> <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string> @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"تماس ازطریق Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"تماس Wi‑Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"تماس ازطریق WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"تماس ازطریق WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -153,7 +154,7 @@ <string name="fcError" msgid="3327560126588500777">"مشکل در اتصال یا کد ویژگی نامعتبر."</string> <string name="httpErrorOk" msgid="1191919378083472204">"تأیید"</string> <string name="httpError" msgid="7956392511146698522">"خطایی در شبکه وجود داشت."</string> - <string name="httpErrorLookup" msgid="4711687456111963163">"URL پیدا نشد."</string> + <string name="httpErrorLookup" msgid="4711687456111963163">"نشانی اینترنتی پیدا نشد."</string> <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"طرح کلی احراز هویت سایت پشتیبانی نمیشود."</string> <string name="httpErrorAuth" msgid="1435065629438044534">"راستیآزمایی ناموفق بود."</string> <string name="httpErrorProxyAuth" msgid="1788207010559081331">"احراز هویت از طریق سرور پروکسی انجام نشد."</string> @@ -163,10 +164,10 @@ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"این صفحه دارای تعداد بسیار زیادی تغییر مسیر سرور است."</string> <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"پروتکل پشتیبانی نمیشود."</string> <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"اتصال امن ایجاد نشد."</string> - <string name="httpErrorBadUrl" msgid="3636929722728881972">"بدلیل نامعتبر بودن URL، باز کردن صفحه ممکن نیست."</string> + <string name="httpErrorBadUrl" msgid="3636929722728881972">"بهدلیل نامعتبر بودن نشانی اینترنتی، صفحه باز نمیشود."</string> <string name="httpErrorFile" msgid="2170788515052558676">"دسترسی به فایل انجام نشد."</string> <string name="httpErrorFileNotFound" msgid="6203856612042655084">"فایل درخواستی پیدا نشد."</string> - <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"درخواستهای زیادی در حال پردازش است. بعداً دوباره امتحان کنید."</string> + <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"درخواستهای زیادی درحال پردازش است. بعداً دوباره امتحان کنید."</string> <string name="notification_title" msgid="8967710025036163822">"خطای ورود به سیستم برای <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> <string name="contentServiceSync" msgid="8353523060269335667">"همگامسازی"</string> <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"همگامسازی نشد"</string> @@ -209,7 +210,7 @@ <string name="reboot_to_update_reboot" msgid="6428441000951565185">"در حال راهاندازی مجدد…"</string> <string name="reboot_to_reset_title" msgid="4142355915340627490">"بازنشانی دادههای کارخانه"</string> <string name="reboot_to_reset_message" msgid="2432077491101416345">"در حال راهاندازی مجدد…"</string> - <string name="shutdown_progress" msgid="2281079257329981203">"در حال خاموش شدن…"</string> + <string name="shutdown_progress" msgid="2281079257329981203">"درحال خاموش شدن…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"رایانهٔ لوحی شما خاموش میشود."</string> <string name="shutdown_confirm" product="tv" msgid="476672373995075359">"تلویزیون شما خاموش خواهد شد."</string> <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"ساعت شما خاموش میشود."</string> @@ -398,7 +399,7 @@ <string name="permlab_readCallLog" msgid="3478133184624102739">"خواندن گزارش تماس"</string> <string name="permdesc_readCallLog" msgid="3204122446463552146">"این برنامه میتواند سابقه تماس شما را بخواند."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"نوشتن گزارش تماس"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"به برنامه اجازه میدهد گزارشات تماس رایانهٔ لوحی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"به برنامه اجازه میدهد گزارشهای تماس رایانهٔ لوحی شما، از جمله دادههایی درباره تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"به برنامه اجازه میدهد گزارشات تماس تلویزیون شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب شاید از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"به برنامه اجازه میدهد گزارشات تماس تلفنی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permlab_bodySensors" msgid="4683341291818520277">"دسترسی به حسگرهای بدن (مانند پایشگرهای ضربان قلب)"</string> @@ -500,7 +501,7 @@ <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"به برنامه اجازه میدهد تا پیکربندی بلوتوث را در تلویزیون مشاهده کند و اتصالات را با دستگاههای مرتبطشده ایجاد کند و بپذیرد."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"به برنامه اجازه میدهد تا پیکربندی بلوتوث در تلفن را مشاهده کند، و اتصالات دستگاههای مرتبط را برقرار کرده و بپذیرد."</string> <string name="permlab_nfc" msgid="4423351274757876953">"کنترل ارتباط راه نزدیک"</string> - <string name="permdesc_nfc" msgid="7120611819401789907">"به برنامه اجازه میدهد تا با تگهای ارتباط میدان نزدیک (NFC)، کارتها و فایل خوان ارتباط برقرار کند."</string> + <string name="permdesc_nfc" msgid="7120611819401789907">"به برنامه اجازه میدهد تا با تگهای «ارتباط میدان نزدیک» (NFC)، کارتها و فایلخوان ارتباط برقرار کند."</string> <string name="permlab_disableKeyguard" msgid="3598496301486439258">"غیرفعال کردن قفل صفحه شما"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"به برنامه امکان میدهد قفل کلید و هر گونه امنیت گذرواژه مرتبط را غیرفعال کند. بهعنوان مثال تلفن هنگام دریافت یک تماس تلفنی ورودی قفل کلید را غیرفعال میکند و بعد از پایان تماس، قفل کلید را دوباره فعال میکند."</string> <string name="permlab_requestPasswordComplexity" msgid="202650535669249674">"درخواست پیچیدگی قفل صفحه"</string> @@ -655,7 +656,7 @@ <string name="policylab_watchLogin" msgid="5091404125971980158">"پایش تلاشهای باز کردن قفل صفحه"</string> <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"تعداد گذرواژههای نادرست تایپ شده را هنگام بازکردن قفل صفحه کنترل میکند، و اگر دفعات زیادی گذرواژه نادرست وارد شود رایانهٔ لوحی را قفل میکند و همه دادههای رایانهٔ لوحی را پاک میکند."</string> <string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"بر تعداد گذرواژههای نادرست تایپشده در زمان باز کردن قفل صفحه نظارت کنید و اگر تعدا زیادی گذرواژههای اشتباه تایپ شده است، تلویزیون را قفل کنید یا همه دادههای تلویزیون را پاک کنید."</string> - <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"تعداد گذرواژههای نادرست تایپ شده را هنگام بازکردن قفل صفحه کنترل میکند. اگر دفعات زیادی گذرواژه نادرست وارد شود، تلفن را قفل میکند یا همه دادههای تلفن را پاک میکند."</string> + <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"تعداد گذرواژههای نادرست تایپشده را هنگام بازکردن قفل صفحه کنترل میکند و اگر چندین بار گذرواژههای نادرست وارد شود، تلفن را قفل میکند یا همه دادههای تلفن را پاک میکند."</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"بر تعداد گذرواژههای نادرستی که هنگام باز کردن قفل صفحه تایپ شده، نظارت میکند، و اگر تعداد گذرواژههای تایپ شده نادرست بیش از حد بود، رایانه لوحی را قفل میکند یا کلیه دادههای کاربر را پاک میکند."</string> <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"بر تعداد گذرواژههای نادرستی که هنگام باز کردن قفل صفحه تایپ شده، نظارت میکند، و اگر تعداد گذرواژههای تایپ شده نادرست بیش از حد بود، تلویزیون را قفل میکند یا کلیه دادههای کاربر را پاک میکند."</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"بر تعداد گذرواژههای نادرستی که هنگام باز کردن قفل صفحه تایپ شده، نظارت میکند، و اگر تعداد گذرواژههای تایپ شده نادرست بیش از حد بود، تلفن را قفل میکند یا کلیه دادههای کاربر را پاک میکند."</string> @@ -677,7 +678,7 @@ <string name="policydesc_expirePassword" msgid="5367525762204416046">"تغییر تعداد دفعاتی که گذرواژه، پین یا الگوی قفل صفحه باید تغییر کند."</string> <string name="policylab_encryptedStorage" msgid="8901326199909132915">"تنظیم رمزگذاری حافظه"</string> <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"اطلاعات ذخیره شده برنامه باید رمزگذاری شود."</string> - <string name="policylab_disableCamera" msgid="6395301023152297826">"غیر فعال کردن دوربین ها"</string> + <string name="policylab_disableCamera" msgid="6395301023152297826">"غیرفعال کردن دوربینها"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"جلوگیری از استفاده از همه دوربینهای دستگاه."</string> <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"غیرفعال کردن ویژگیهای قفل صفحه"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"مانع استفاده از برخی ویژگیهای قفل صفحه میشود."</string> @@ -837,7 +838,7 @@ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"سیم کارت با PUK قفل شده است."</string> <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"لطفاً به راهنمای کاربر مراجعه کرده یا با مرکز پشتیبانی از مشتریان تماس بگیرید."</string> <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"سیم کارت قفل شد."</string> - <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"بازگشایی قفل سیم کارت..."</string> + <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"بازگشایی قفل سیم کارت…"</string> <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه کشیدهاید. \n\nپس از <xliff:g id="NUMBER_1">%2$d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"گذرواژهٔ خود را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه تایپ کردهاید. \n\nپس از <xliff:g id="NUMBER_1">%2$d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"پین را<xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه تایپ کردهاید. \n\nپس از <xliff:g id="NUMBER_1">%2$d</xliff:g> ثانیه دوباره امتحان کنید."</string> @@ -849,7 +850,7 @@ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"شما به اشتباه <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اقدام به باز کردن قفل تلفن کردهاید. پس از<xliff:g id="NUMBER_1">%2$d</xliff:g> تلاش ناموفق دیگر، تلفن به پیشفرض کارخانه بازنشانی میشود و تمام دادههای کاربر از دست خواهد رفت."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"شما به اشتباه اقدام به باز کردن قفل <xliff:g id="NUMBER">%d</xliff:g> رایانهٔ لوحی کردهاید. رایانهٔ لوحی در حال حاضر به پیشفرض کارخانه بازنشانی میشود."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"<xliff:g id="NUMBER">%d</xliff:g> دفعه به صورت نادرست سعی کردهاید قفل تلویزیون را باز کنید. اکنون تلویزیون به تنظیمات پیشفرض کارخانه بازنشانی خواهد شد."</string> - <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"شما به اشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن قفل تلفن کردهاید. این تلفن در حال حاضر به پیشفرض کارخانه بازنشانی میشود."</string> + <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"بهاشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن قفل تلفن کردهاید. این تلفن دیگر به پیشفرض کارخانه بازنشانی میشود."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"پس از <xliff:g id="NUMBER">%d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"الگو را فراموش کردهاید؟"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"بازگشایی قفل حساب"</string> @@ -860,7 +861,7 @@ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ورود به سیستم"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"نام کاربر یا گذرواژه نامعتبر است."</string> <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"نام کاربری یا گذرواژهٔ خود را فراموش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string> - <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"در حال بررسی..."</string> + <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"درحال بررسی…"</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"بازگشایی قفل"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"صدا روشن"</string> <string name="lockscreen_sound_off_label" msgid="996822825154319026">"صدا خاموش"</string> @@ -1076,7 +1077,7 @@ <string name="failed_to_copy_to_clipboard" msgid="1833662432489814471">"در بریدهدان کپی نشد"</string> <string name="paste" msgid="5629880836805036433">"جایگذاری"</string> <string name="paste_as_plain_text" msgid="5427792741908010675">"جایگذاری به عنوان متن ساده"</string> - <string name="replace" msgid="5781686059063148930">"جایگزین شود..."</string> + <string name="replace" msgid="5781686059063148930">"جایگزین شود…"</string> <string name="delete" msgid="6098684844021697789">"حذف"</string> <string name="copyUrl" msgid="2538211579596067402">"کپی URL"</string> <string name="selectTextMode" msgid="1018691815143165326">"انتخاب متن"</string> @@ -1120,7 +1121,7 @@ <string name="yes" msgid="5362982303337969312">"تأیید"</string> <string name="no" msgid="5141531044935541497">"لغو"</string> <string name="dialog_alert_title" msgid="2049658708609043103">"توجه"</string> - <string name="loading" msgid="7933681260296021180">"در حال بارکردن…"</string> + <string name="loading" msgid="7933681260296021180">"درحال بارکردن…"</string> <string name="capital_on" msgid="1544682755514494298">"روشن"</string> <string name="capital_off" msgid="6815870386972805832">"خاموش"</string> <string name="whichApplication" msgid="4533185947064773386">"تکمیل عملکرد با استفاده از"</string> @@ -1197,8 +1198,8 @@ <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> درحال ارتقا است...."</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"در حال بهینهسازی برنامهٔ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> <string name="android_preparing_apk" msgid="8162599310274079154">"آمادهسازی <xliff:g id="APPNAME">%1$s</xliff:g>."</string> - <string name="android_upgrading_starting_apps" msgid="451464516346926713">"در حال آغاز برنامهها."</string> - <string name="android_upgrading_complete" msgid="1405954754112999229">"در حال اتمام راهاندازی."</string> + <string name="android_upgrading_starting_apps" msgid="451464516346926713">"درحال آغاز کردن برنامهها."</string> + <string name="android_upgrading_complete" msgid="1405954754112999229">"درحال اتمام راهاندازی."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string> <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"برای برگشت به بازی، ضربه بزنید"</string> <string name="heavy_weight_switcher_title" msgid="387882830435195342">"انتخاب بازی"</string> @@ -1305,8 +1306,8 @@ <string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"در حالی که تلویزیون به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> متصل است، ارتباط آن به صورت موقت از Wi-Fi قطع خواهد شد."</string> <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"این گوشی بهطور موقت از Wi-Fi قطع خواهد شد، در حالی که به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> وصل است"</string> <string name="select_character" msgid="3365550120617701745">"درج نویسه"</string> - <string name="sms_control_title" msgid="7296612781128917719">"ارسال پیامک ها"</string> - <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> در حال ارسال تعداد زیادی پیامک است. آیا اجازه میدهید این برنامه همچنان پیامک ارسال کند؟"</string> + <string name="sms_control_title" msgid="7296612781128917719">"درحال ارسال پیامکها"</string> + <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> درحال ارسال تعداد زیادی پیامک است. آیا اجازه میدهید این برنامه همچنان پیامک ارسال کند؟"</string> <string name="sms_control_yes" msgid="3663725993855816807">"مجاز است"</string> <string name="sms_control_no" msgid="625438561395534982">"اجازه ندارد"</string> <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> مایل است پیامی به <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> ارسال کند."</string> @@ -1458,7 +1459,7 @@ <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"ارائهدهنده وضعیت"</string> <string name="notification_ranker_binding_label" msgid="774540592299064747">"سرویس رتبهبندی اعلان"</string> <string name="vpn_title" msgid="19615213552042827">"VPN فعال شد"</string> - <string name="vpn_title_long" msgid="6400714798049252294">"VPN توسط <xliff:g id="APP">%s</xliff:g> فعال شده است"</string> + <string name="vpn_title_long" msgid="6400714798049252294">"VPN را <xliff:g id="APP">%s</xliff:g> فعال کرده است"</string> <string name="vpn_text" msgid="1610714069627824309">"برای مدیریت شبکه ضربه بزنید."</string> <string name="vpn_text_long" msgid="4907843483284977618">"به <xliff:g id="SESSION">%s</xliff:g> متصل شد. برای مدیریت شبکه ضربه بزنید."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"در حال اتصال VPN همیشه فعال…"</string> @@ -1494,11 +1495,11 @@ <string name="find_previous" msgid="2196723669388360506">"یافتن قبلی"</string> <string name="gpsNotifTicker" msgid="5622683912616496172">"درخواست مکان از <xliff:g id="NAME">%s</xliff:g>"</string> <string name="gpsNotifTitle" msgid="5446858717157416839">"درخواست مکان"</string> - <string name="gpsNotifMessage" msgid="1374718023224000702">"درخواست شده توسط <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> + <string name="gpsNotifMessage" msgid="1374718023224000702">"درخواستکننده <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> <string name="gpsVerifYes" msgid="2346566072867213563">"بله"</string> <string name="gpsVerifNo" msgid="1146564937346454865">"نه"</string> <string name="sync_too_many_deletes" msgid="5296321850662746890">"از حد مجاز حذف فراتر رفت"</string> - <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> مورد حذف شده برای <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> وجود دارد. میخواهید چه کاری انجام دهید؟"</string> + <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> مورد حذفشده برای <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> وجود دارد. میخواهید چه کار بکنید؟"</string> <string name="sync_really_delete" msgid="2572600103122596243">"حذف موارد"</string> <string name="sync_undo_deletes" msgid="2941317360600338602">"واگرد موارد حذف شده"</string> <string name="sync_do_nothing" msgid="3743764740430821845">"اکنون کاری انجام نشود"</string> @@ -1563,11 +1564,11 @@ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> بیش از معمول داده مصرف کرده است"</string> <string name="ssl_certificate" msgid="6510040486049237639">"گواهی امنیتی"</string> <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"این گواهی معتبر است."</string> - <string name="issued_to" msgid="454239480274921032">"صادر شده برای:"</string> + <string name="issued_to" msgid="454239480274921032">"صادرشده برای:"</string> <string name="common_name" msgid="2233209299434172646">"نام معمولی:"</string> <string name="org_name" msgid="6973561190762085236">"سازمان:"</string> <string name="org_unit" msgid="7265981890422070383">"واحد سازمانی:"</string> - <string name="issued_by" msgid="2647584988057481566">"صادر شده توسط:"</string> + <string name="issued_by" msgid="2647584988057481566">"صادرکننده:"</string> <string name="validity_period" msgid="8818886137545983110">"اعتبار:"</string> <string name="issued_on" msgid="5895017404361397232">"صادر شده در:"</string> <string name="expires_on" msgid="3676242949915959821">"تاریخ انقضا:"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"همپوشانی #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"، امن"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"شروع فعالیت پسزمینه<xliff:g id="PACKAGENAME">%1$s</xliff:g> در نسخههای Q آینده مسدود خواهد شد. به g.co/dev/bgblock مراجعه کنید."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"شروع فعالیت پسزمینه <xliff:g id="PACKAGENAME">%1$s</xliff:g> مسدود شده است. به g.co/dev/bgblock مراجعه کنید."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"الگو را فراموش کردهاید"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"الگوی اشتباه"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"گذرواژه اشتباه"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"«میانبر دسترسپذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را روشن کرد"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"«میانبر دسترسپذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را خاموش کرد"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"برای استفاده از <xliff:g id="SERVICE_NAME">%1$s</xliff:g>، هر دو کلید صدا را فشار دهید و سه ثانیه نگه دارید"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"قابلیتی را انتخاب کنید که هنگام ضربه زدن روی دکمه «دسترسپذیری» استفاده میشود:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"برای تغییر دادن قابلیتها، دکمه «دسترسپذیری» را لمس کنید و نگهدارید."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"سرویسی را انتخاب کنید که هنگام ضربه زدن روی دکمه دسترسپذیری استفاده میشود:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"سرویسی را برای استفاده با اشاره دسترسپذیری انتخاب کنید (با دو انگشت صفحه را از پایین تند به بالا بکشید):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"سرویسی را برای استفاده با اشاره دسترسپذیری انتخاب کنید (با سه انگشت صفحه را از پایین تند به بالا بکشید):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"برای جابهجایی بین سرویسها، دکمه دسترسپذیری را لمس کنید و نگهدارید."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"برای جابهجایی بین سرویسها، با دو انگشت صفحه را تند به بالا بکشید و نگهدارید."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"برای جابهجایی بین سرویسها، با سه انگشت صفحه را تند به بالا بکشید و نگهدارید."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"درشتنمایی"</string> <string name="user_switched" msgid="3768006783166984410">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"در حالت تغییر به <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index bdcb598f9b23..2ff256bbdb48 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-puhelut (<xliff:g id="SPN">%s</xliff:g>)"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi-puhelut"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-puhelu"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"WLAN-puhelu (<xliff:g id="SPN">%s</xliff:g>)"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Peittokuva # <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", suojattu"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Tämä taustatoiminnan käynnistys kohteesta <xliff:g id="PACKAGENAME">%1$s</xliff:g> estetään tulevissa Q-versioissa. Siirry osoitteeseen g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Taustatoiminnan käynnistys kohteesta <xliff:g id="PACKAGENAME">%1$s</xliff:g> estettiin. Siirry osoitteeseen g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unohtunut kuvio"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Väärä kuvio"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Väärä salasana"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> otettiin käyttöön esteettömyystilan pikanäppäimellä."</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> poistettiin käytöstä esteettömyystilan pikanäppäimellä."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Voit käyttää palvelua <xliff:g id="SERVICE_NAME">%1$s</xliff:g> painamalla molempia äänenvoimakkuuspainikkeita kolmen sekunnin ajan"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Valitse toiminto, jonka Esteettömyys-painike aktivoi:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Jos haluat muokata ominaisuuksia, kosketa Esteettömyys-painiketta pitkään."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Valitse palvelu, jonka esteettömyyspainike aktivoi:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Valitse palvelu, jota käytetään esteettömyyseleellä (pyyhkäise näytön alalaidasta ylös kahdella sormella):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Valitse palvelu, jota käytetään esteettömyyseleellä (pyyhkäise näytön alalaidasta ylös kolmella sormella):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Vaihda palveluiden välillä painamalla painiketta pitkään."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Vaihda palveluiden välillä pyyhkäisemällä ylös kahdella sormella ja koskettamalla pitkään."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Vaihda palveluiden välillä pyyhkäisemällä ylös kolmella sormella ja koskettamalla pitkään."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Suurennus"</string> <string name="user_switched" msgid="3768006783166984410">"Nykyinen käyttäjä: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Vaihdetaan käyttäjään <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index cf6f3f1f4f3b..c8482f9de2d4 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Appels Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Appels Wi-Fi : <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Appel WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Appel WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -307,7 +308,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à accéder à vos journaux d\'appels?"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à faire et à gérer les appels téléphoniques?"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à faire et à gérer des appels téléphoniques?"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"Capteurs corporels"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux données des capteurs pour vos signes vitaux?"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposition n° <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g> : <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sécurisé"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Ce lancement d\'activité en arrière-plan par <xliff:g id="PACKAGENAME">%1$s</xliff:g> sera bloqué dans les versions futures de Q. Consultez la page g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Le lancement d\'une activité en arrière-plan par <xliff:g id="PACKAGENAME">%1$s</xliff:g> a été bloqué. Consultez la page g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Le raccourci d\'accessibilité a activé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Le raccourci d\'accessibilité a désactivé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Maintenez enfoncées les deux touches de volume pendant trois secondes pour utiliser <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choisissez une fonctionnalité à utiliser lorsque vous touchez le bouton d\'accessibilité :"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pour changer des fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Choisissez un service à utiliser lorsque vous touchez le bouton d\'accessibilité :"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer deux doigts du bas de l\'écran vers le haut) :"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer trois doigts du bas de l\'écran vers le haut) :"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Pour basculer entre les services, maintenez le doigt sur le bouton d\'accessibilité."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Pour basculer entre les services, balayez deux doigts vers le haut et maintenez-les sur l\'écran."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Pour basculer entre les services, balayez trois doigts vers le haut et maintenez-les sur l\'écran."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zoom"</string> <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="2871009331809089783">"Changement d\'utilisateur (<xliff:g id="NAME">%1$s</xliff:g>) en cours…"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 794e2ce59953..345cfcc39582 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Appels Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Appels Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Appel WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Appel WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposition n° <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g> : <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sécurisé"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Le démarrage de cette activité en arrière-plan de <xliff:g id="PACKAGENAME">%1$s</xliff:g> sera bloqué dans les prochaines builds Q. Consultez g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Le démarrage de l\'activité en arrière-plan de <xliff:g id="PACKAGENAME">%1$s</xliff:g> a été bloqué. Consultez g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Le raccourci d\'accessibilité a activé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Le raccourci d\'accessibilité a désactivé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Appuyez de manière prolongée sur les deux touches de volume pendant trois secondes pour utiliser <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choisissez une fonctionnalité à utiliser lorsque vous appuyez sur le bouton Accessibilité :"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pour changer de fonctionnalités, appuyez de manière prolongée sur le bouton Accessibilité."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Choisissez un service à utiliser lorsque vous appuyez sur le bouton Accessibilité :"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Choisissez un service à utiliser avec le geste d\'accessibilité (balayez l\'écran de bas en haut avec deux doigts) :"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Choisissez un service à utiliser avec le geste d\'accessibilité (balayez l\'écran de bas en haut avec trois doigts) :"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Pour changer de service, appuyez de manière prolongée sur le bouton Accessibilité."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Pour changer de service, balayez l\'écran vers le haut avec deux doigts et appuyez de manière prolongée."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Pour changer de service, balayez l\'écran vers le haut avec trois doigts et appuyez de manière prolongée."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Agrandissement"</string> <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="2871009331809089783">"Chargement du profil de <xliff:g id="NAME">%1$s</xliff:g>..."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 47d07a20c97e..73a32f36c25f 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamadas por wifi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Chamadas por wifi con <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada por WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wifi de <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición n.º <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segura"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"O inicio desta actividade en segundo plano desde <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloquearase en futuras compilacións de Q. Consulta g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Bloqueouse o inicio da actividade en segundo plano desde <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueciches o padrón"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrón incorrecto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contrasinal incorrecto"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atallo de accesibilidade activou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atallo de accesibilidade desactivou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Mantén premidas as teclas do volume durante tres segudos para usar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolle que función queres utilizar cando toques o botón Accesibilidade:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar as funcións, mantén premido o botón Accesibilidade."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Escolle o servizo que queres utilizar cando toques o botón de accesibilidade:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Escolle o servizo que queres usar co xesto de accesibilidade (pasa dous dedos cara arriba desde a parte inferior da pantalla):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Escolle o servizo que queres usar co xesto de accesibilidade (pasa tres dedos cara arriba desde a parte inferior da pantalla):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Para cambiar de servizo, mantén premido o botón de accesibilidade."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Para cambiar de servizo, pasa dous dedos cara arriba e mantén premida a pantalla."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Para cambiar de servizo, pasa tres dedos cara arriba e mantén premida a pantalla."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliación"</string> <string name="user_switched" msgid="3768006783166984410">"Usuario actual <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index a64909d09640..ab7191480678 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> વાઇ-ફાઇ કૉલિંગ"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> વાઇ-ફાઇ કૉલિંગ"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN કૉલ"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN કૉલ"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> વાઇ-ફાઇ"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"#<xliff:g id="ID">%1$d</xliff:g> ઓવરલે કરો"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", સુરક્ષિત"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>માંથી શરૂ થયેલી આ બૅકગ્રાઉન્ડ પ્રવૃત્તિને ભાવિ Q બિલ્ડમાં બ્લૉક કરવામાં આવશે. g.co/dev/bgblock જુઓ."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>માંથી શરૂ થયેલી બૅકગ્રાઉન્ડ પ્રવૃત્તિ બ્લૉક કરી છે. g.co/dev/bgblock જુઓ."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"પૅટર્ન ભૂલી ગયાં"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ખોટી પૅટર્ન"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ખોટો પાસવર્ડ"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ચાલુ કરી"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> બંધ કરી"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>નો ઉપયોગ કરવા માટે બન્ને વૉલ્યૂમ કીને ત્રણ સેકન્ડ સુધી દબાવી રાખો"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"જ્યારે તમે ઍક્સેસિબિલિટી બટન પર ટૅપ કરો, ત્યારે ઉપયોગ કરવાની સુવિધા પસંદ કરો:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"સુવિધાઓ બદલવા માટે, ઍક્સેસિબિલિટી બટન દબાવી રાખો."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"જ્યારે તમે ઍક્સેસિબિલિટી બટન પર ટૅપ કરો, ત્યારે ઉપયોગ કરવાની સેવા પસંદ કરો:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ઍક્સેસિબિલિટી સંકેત સાથે ઉપયોગ કરવાની સેવા પસંદ કરો (બે આંગળીઓ વડે સ્ક્રીનના નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરવા માટે):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ઍક્સેસિબિલિટી સંકેત સાથે ઉપયોગ કરવાની સેવા પસંદ કરો (ત્રણ આંગળીઓ વડે સ્ક્રીનના નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરવા માટે):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"કોઈ એક સેવાથી બીજી સેવા પર સ્વિચ કરવા માટે, ઍક્સેસિબિલિટી બટનને ટચ કરીને દબાવી રાખો."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"કોઈ એક સેવાથી બીજી સેવા પર સ્વિચ કરવા માટે, બે આંગળીઓ વડે સ્ક્રીનની ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"કોઈ એક સેવાથી બીજી સેવા પર સ્વિચ કરવા માટે, ત્રણ આંગળીઓ વડે સ્ક્રીનની ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"વિસ્તૃતીકરણ"</string> <string name="user_switched" msgid="3768006783166984410">"વર્તમાન વપરાશકર્તા <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> પર સ્વિચ કરી રહ્યાં છે…"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 665dff4806dd..d05a184f3e7e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -116,7 +116,7 @@ <string name="roamingText6" msgid="2059440825782871513">"रोमिंग - उपलब्ध सिस्टम"</string> <string name="roamingText7" msgid="7112078724097233605">"रोमिंग - गठबंधन सहयोगी"</string> <string name="roamingText8" msgid="5989569778604089291">"रोमिंग - प्रीमियम सहयोगी"</string> - <string name="roamingText9" msgid="7969296811355152491">"रोमिंग - पूर्ण सेवा काम की क्षमता"</string> + <string name="roamingText9" msgid="7969296811355152491">"रोमिंग - पूरी सेवा काम की क्षमता"</string> <string name="roamingText10" msgid="3992906999815316417">"रोमिंग - आंशिक सेवा काम की क्षमता"</string> <string name="roamingText11" msgid="4154476854426920970">"रोमिंग बैनर चालू"</string> <string name="roamingText12" msgid="1189071119992726320">"रोमिंग बैनर बंद"</string> @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> वाई-फ़ाई कॉलिंग"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"वाई-फ़ाई के ज़रिए कॉल करते समय <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN कॉल"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN कॉल"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> वाई-फ़ाई"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ओवरले #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"आने वाले Q बिल्ड में <xliff:g id="PACKAGENAME">%1$s</xliff:g> के बैकग्राउंड में गतिविधि शुरू करने पर रोक लगा दी जाएगी. इस बारे में जानने के लिए g.co/dev/bgblock पर जाएं."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> के बैकग्राउंड में गतिविधि शुरू करने पर रोक लगा दी गई है. इस बारे में जानने के लिए g.co/dev/bgblock पर जाएं."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"आकार भूल गए"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत पैटर्न डाला गया है"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू किया"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद किया"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> इस्तेमाल करने के लिए आवाज़ वाले दोनों बटन तीन सेकंड तक दबाकर रखें"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"सुलभता बटन पर टैप करते समय इस्तेमाल की जाने वाली सुविधा चुनें:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"सुविधाओं में बदलाव करने के लिए, सुलभता बटन को दबाकर रखें."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"\'सुलभता\' बटन पर टैप करके इस्तेमाल करने के लिए सेवा चुनें:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"सुलभता वाले जेस्चर के साथ इस्तेमाल करने के लिए सेवा चुनें (दो उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"सुलभता वाले जेस्चर के साथ इस्तेमाल करने के लिए सेवा चुनें (तीन उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"एक सेवा से दूसरी सेवा पर जाने के लिए, \'सुलभता\' बटन को कुछ देर दबाकर रखें."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"एक सेवा से दूसरी सेवा पर जाने के लिए, स्क्रीन पर दो उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक स्क्रीन पर उंगलियां रखे रहें."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"एक सेवा से दूसरी सेवा पर जाने के लिए, स्क्रीन पर तीन उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक स्क्रीन पर उंगलियां रखे रहें."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"बड़ा करना"</string> <string name="user_switched" msgid="3768006783166984410">"मौजूदा उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> पर स्विच किया जा रहा है…"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 0f40dfa5fafe..83c3901eabd1 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -132,6 +132,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi pozivi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi pozivi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Poziv putem WLAN-a"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> poziv putem WLAN-a"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1634,8 +1635,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Preklapanje br. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sigurno"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Pokretanje aktivnosti u pozadini iz aplikacije <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokirat će se u budućim međuverzijama Q. Pogledajte g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Blokirano je pokretanje aktivnosti u pozadini iz aplikacije <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Pogledajte g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravili ste obrazac"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan obrazac"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna zaporka"</string> @@ -1690,8 +1689,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečac pristupačnosti uključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečac pristupačnosti isključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pritisnite i zadržite tipke za glasnoću na tri sekunde da biste koristili uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite značajku koju ćete upotrebljavati kada dodirnete gumb Pristupačnost:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da biste promijenili značajke, dodirnite i zadržite gumb Pristupačnost."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Odaberite uslugu koju ćete upotrebljavati kad dodirnete gumb pristupačnosti:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Odaberite uslugu koju ćete upotrebljavati uz pokret pristupačnosti (prelazak s dva prsta prema gore od dna zaslona):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Odaberite uslugu koju ćete upotrebljavati uz pokret pristupačnosti (prelazak s tri prsta prema gore od dna zaslona):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Da biste prešli na neku drugu uslugu, dodirnite i zadržite gumb pristupačnosti."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Da biste prešli na neku drugu uslugu, prijeđite s dva prsta prema gore i zadržite."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Da biste prešli na neku drugu uslugu, prijeđite s tri prsta prema gore i zadržite."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povećavanje"</string> <string name="user_switched" msgid="3768006783166984410">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Prebacivanje na korisnika <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 46fa00d25384..c37cf3a54295 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi-hívás"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi‑Fi-hívás"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-hívás"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-hívás"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>. fedvény"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> képpont"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", biztonságos"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Ez a háttértevékenység-indítás le lesz tiltva a(z) <xliff:g id="PACKAGENAME">%1$s</xliff:g> számára a jövőbeni Q-buildeknél. Lásd: g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"A(z) <xliff:g id="PACKAGENAME">%1$s</xliff:g> számára le van tiltva a háttértevékenységek indítása. Lásd: g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Elfelejtett minta"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Helytelen minta"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Helytelen jelszó"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"A Kisegítő lehetőségek gyorsparancsa bekapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"A Kisegítő lehetőségek gyorsparancsa kikapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"A(z) <xliff:g id="SERVICE_NAME">%1$s</xliff:g> használatához tartsa lenyomva három másodpercig a két hangerőgombot"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Válassza ki a Kisegítő lehetőségek gombra koppintáskor használni kívánt funkciót:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"A funkciók módosításához tartsa lenyomva a Kisegítő lehetőségek gombot."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Válassza ki a kisegítő lehetőségek gombra koppintáskor használni kívánt szolgáltatást:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Válassza ki a kisegítő kézmozdulattal használni kívánt szolgáltatást (csúsztassa felfelé két ujját a képernyő aljáról):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Válassza ki a kisegítő kézmozdulattal használni kívánt szolgáltatást (csúsztassa felfelé három ujját a képernyő aljáról):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"A szolgáltatások közötti váltáshoz tartsa lenyomva a kisegítő lehetőségek gombot."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"A szolgáltatások közötti váltáshoz csúsztassa felfelé két ujját, és ne engedje el a képernyőt."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"A szolgáltatások közötti váltáshoz csúsztassa felfelé három ujját, és ne engedje el a képernyőt."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Nagyítás"</string> <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> az aktuális felhasználó."</string> <string name="user_switching_message" msgid="2871009331809089783">"Átváltás erre: <xliff:g id="NAME">%1$s</xliff:g>..."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index f73e18da485c..7f78ae77a1e9 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi-ի միջոցով զանգեր"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Զանգեր Wi-Fi-ի միջոցով"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Զանգ WLAN ցանցով"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ցանցով զանգեր"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Վերածածկ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>. <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> կմվ"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", անվտանգ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> հավելվածի գործողությունները ֆոնային ռեժիմում կարգելափակվեն Android Q-ի հաջորդ կառուցումներում։ Մանրամասն տեղեկություններ կարող եք գտնել g.co/dev/bgblock էջում։"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> հավելվածի գործողությունները ֆոնային ռեժիմում արգելափակվեցին։ Մանրամասն տեղեկություններ կարող եք գտնել g.co/dev/bgblock էջում։"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Մոռացել եմ սխեման"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Սխալ սխեմա"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Սխալ գաղտնաբառ"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Մատչելիության դյուրանցումն միացրել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Մատչելիության դյուրանցումն անջատել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"«<xliff:g id="SERVICE_NAME">%1$s</xliff:g>» ծառայությունն օգտագործելու համար սեղմեք և 3 վայրկյան պահեք ձայնի ուժգնության երկու կոճակները"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Ընտրեք որևէ գործառույթ, որը կօգտագործվի Հատուկ գործառույթներ կոճակին հպելու դեպքում՝"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Գործառույթները փոխելու համար հպեք և պահեք Հատուկ գործառույթներ կոճակը։"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Ընտրեք գործառույթ, որը կգործարկվի «Հատուկ գործառույթներ» կոճակին հպելու դեպքում՝"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Ընտրեք գործառույթ, որը կգործարկվի հատուկ գործառույթների ժեստն անելու դեպքում (երկու մատը էկրանի ներքևից սահեցրեք վերև)՝"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Ընտրեք գործառույթ, որը կգործարկվի հատուկ գործառույթների ժեստն անելու դեպքում (երեք մատը էկրանի ներքևից սահեցրեք վերև)՝"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Մեկ գործառույթից մյուսն անցնելու համար հպեք «Հատուկ գործառույթներ» կոճակին և պահեք:"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Մեկ գործառույթից մյուսն անցնելու համար երկու մատը սահեցրեք վերև և պահեք:"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Մեկ գործառույթից մյուսն անցնելու համար երեք մատը սահեցրեք վերև և պահեք:"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Խոշորացում"</string> <string name="user_switched" msgid="3768006783166984410">"Ներկայիս օգտատերը <xliff:g id="NAME">%1$s</xliff:g>:"</string> <string name="user_switching_message" msgid="2871009331809089783">"Փոխարկվում է <xliff:g id="NAME">%1$s</xliff:g>-ին..."</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index cb91f8505846..2aaa445e32f0 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Panggilan Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Panggilan Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Panggilan WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Panggilan WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Hamparan #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", aman"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Aktivitas latar belakang yang dimulai dari <xliff:g id="PACKAGENAME">%1$s</xliff:g> akan diblokir di build Q di masa mendatang. Lihat g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Aktivitas latar belakang yang dimulai dari <xliff:g id="PACKAGENAME">%1$s</xliff:g> diblokir. Lihat g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Pola?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pola Salah"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Sandi Salah"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pintasan Aksesibilitas mengaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pintasan Aksesibilitas menonaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tekan dan tahan kedua tombol volume selama tiga detik untuk menggunakan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pilih fitur yang akan digunakan saat menge-tap tombol Aksesibilitas:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Untuk mengubah fitur, sentuh & tahan tombol Aksesibilitas."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Pilih layanan yang akan digunakan saat menge-tap tombol aksesibilitas:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Pilih layanan yang akan digunakan dengan gestur aksesibilitas (geser ke atas dari bawah layar dengan dua jari):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Pilih layanan yang akan digunakan dengan gestur aksesibilitas (geser ke atas dari bawah layar dengan tiga jari):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Sentuh & tahan tombol aksesibilitas untuk beralih layanan."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Geser dengan dua jari dan tahan untuk beralih layanan."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Geser ke atas dengan tiga jari dan tahan untuk beralih layanan."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pembesaran"</string> <string name="user_switched" msgid="3768006783166984410">"Pengguna saat ini <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Beralih ke <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 322d8ffc8402..d11feadf1e6c 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi símtöl"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Wi-Fi símtöl með <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-símtal"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-símtal"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Yfirlögn #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", öruggur"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Framvegis verður lokað á þessa bakgrunnsvirkni frá <xliff:g id="PACKAGENAME">%1$s</xliff:g> í Q-smíði. Sjá g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Lokað á bakgrunnsvirkni frá <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Sjá g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Man ekki mynstrið"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Rangt mynstur"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Rangt aðgangsorð"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Flýtileið aðgengisstillingar kveikti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Flýtileið aðgengisstillingar slökkti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Haltu báðum hljóðstyrkstökkunum inni í þrjár sekúndur til að nota <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Veldu eiginleika sem á að nota þegar ýtt er á aðgengishnappinn:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Haltu fingri á aðgengishnappinum til að breyta eiginleikum."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Veldu þjónustu sem á að nota þegar ýtt er á aðgengishnappinn:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Veldu þjónustu sem á að nota með aðgengisbendingunni (strjúka upp frá neðri hluta skjásins með tveimur fingrum):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Veldu þjónustu sem á að nota með aðgengisbendingunni (strjúka upp frá neðri hluta skjásins með þremur fingrum):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Til að skipta á milli þjónusta skaltu halda aðgengishnappinum inni."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Til að skipta á milli þjónusta skaltu strjúka upp með tveimur fingrum og halda inni."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Til að skipta á milli þjónusta skaltu strjúka upp með þremur fingrum og halda inni."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Stækkun"</string> <string name="user_switched" msgid="3768006783166984410">"Núverandi notandi <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Skiptir yfir á <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 1ab837fdd571..ec189631dbaa 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chiamate Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Chiamate Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chiamata WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chiamata WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay n. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", opzione sicura"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"L\'avvio di questa attività in background da <xliff:g id="PACKAGENAME">%1$s</xliff:g> verrà bloccato nelle future build Q. Visita la pagina g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Avvio delle attività in background da <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloccato. Visita la pagina g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Sequenza dimenticata"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequenza sbagliata"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Password sbagliata"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"La scorciatoia Accessibilità ha attivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"La scorciatoia Accessibilità ha disattivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tieni premuti entrambi i tasti del volume per tre secondi per utilizzare <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Scegli una funzione da usare quando tocchi il pulsante Accessibilità:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Per cambiare le funzioni, tocca e tieni premuto il pulsante Accessibilità."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Scegli un servizio da usare quando tocchi il pulsante Accessibilità:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Scegli un servizio da usare con il gesto di accessibilità (scorrimento verso l\'alto dalla parte inferiore dello schermo con due dita):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Scegli un servizio da usare con il gesto di accessibilità (scorrimento verso l\'alto dalla parte inferiore dello schermo con tre dita):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Per spostarti tra i servizi, tocca e tieni premuto il pulsante Accessibilità."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Per spostarti tra i servizi, scorri verso l\'alto con due dita e tieni premuto."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Per spostarti tra i servizi, scorri verso l\'alto con tre dita e tieni premuto."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ingrandimento"</string> <string name="user_switched" msgid="3768006783166984410">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Passaggio a <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index edbc82d84b3a..6fc77fef5897 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"שיחות Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"שיחות Wi-Fi באמצעות <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"שיחה ברשת אלחוטית"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"שיחת WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"שכבת-על #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", מאובטח"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"התחלה זו של פעילות ברקע מ-<xliff:g id="PACKAGENAME">%1$s</xliff:g> תיחסם בגרסאות build עתידיות של Q. ניתן לעיין בכתובת g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"נחסמה התחלה של פעילות ברקע מ-<xliff:g id="PACKAGENAME">%1$s</xliff:g>. ניתן לעיין בכתובת g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"שכחת את קו ביטול הנעילה?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"סיסמה שגויה"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הופעל על-ידי קיצור הדרך לנגישות"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הושבת על-ידי קיצור הדרך לנגישות"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"יש ללחוץ לחיצה ארוכה על שני לחצני עוצמת הקול למשך שלוש שניות כדי להשתמש בשירות <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"בחר תכונה שתופעל כשתלחץ על הלחצן \'נגישות\':"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"כדי להחליף תכונה, יש ללחוץ לחיצה ארוכה על הלחצן \'נגישות\'."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"יש לבחור שירות שיופעל באמצעות הקשה על לחצן הנגישות:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"יש לבחור שירות שיופעל באמצעות תנועת הנגישות (החלקה למעלה מתחתית המסך בעזרת שתי אצבעות):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"יש לבחור שירות שיופעל באמצעות תנועת הנגישות (החלקה למעלה מתחתית המסך בעזרת שלוש אצבעות):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"כדי לעבור בין שירותים, יש ללחוץ לחיצה ארוכה על לחצן הנגישות."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"כדי לעבור בין שירותים, יש להחליק כלפי מעלה בעזרת שתי אצבעות ולהחזיק."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"כדי לעבור בין שירותים, יש להחליק כלפי מעלה בעזרת שלוש אצבעות ולהחזיק."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"הגדלה"</string> <string name="user_switched" msgid="3768006783166984410">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"עובר אל <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 1e345c0774b2..73a02cb9ae0f 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通話"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通話"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"オーバーレイ第<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>、<xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"、セキュア"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> からのこのバックグラウンド アクティビティの開始は今後の Q ビルドではブロックされます。g.co/dev/bgblock をご覧ください。"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> からのバックグラウンド アクティビティの開始がブロックされました。g.co/dev/bgblock をご覧ください。"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"パターンを忘れた場合"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"パターンが正しくありません"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"パスワードが正しくありません"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は ON になっています"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は OFF になっています"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> を使用するには、音量大と音量小の両方のボタンを 3 秒間長押ししてください"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ユーザー補助機能ボタンをタップした場合に使用する機能を選択してください。"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"機能を変更するには、ユーザー補助機能ボタンを長押ししてください。"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ユーザー補助機能ボタンをタップした場合に使用するサービスを選択してください。"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ユーザー補助操作(2 本の指で画面の下から上にスワイプ)で使用するサービスを選択してください。"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ユーザー補助操作(3 本の指で画面の下から上にスワイプ)で使用するサービスを選択してください。"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"サービスを切り替えるには、ユーザー補助機能ボタンを長押しします。"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"サービスを切り替えるには、2 本の指で上にスワイプしたまま長押しします。"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"サービスを切り替えるには、3 本の指で上にスワイプしたまま長押しします。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"拡大"</string> <string name="user_switched" msgid="3768006783166984410">"現在のユーザーは<xliff:g id="NAME">%1$s</xliff:g>です。"</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>に切り替えています…"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 78af3c14e6c1..31d5887eccfc 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi დარეკვა"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi დარეკვა"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ზარი"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ზარი"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"გადაფარვა #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", დაცული"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-დან ამ ფონური აქტივობის გაშვება დაიბლოკება Q-ის მომდევნო ანაწყობებში. იხილეთ g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-დან ფონური აქტივობის გაშვება დაიბლოკა. იხილეთ g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"დაგავიწყდათ ნიმუში"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"არასწორი ნიმუში"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"არასწორი პაროლი"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"მარტივი წვდომის მალსახმობმა ჩართო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"მარტივი წვდომის მალსახმობმა გამორთო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> რომ გამოიყენოთ, დააჭირეთ ხმის ორივე ღილაკზე 3 წამის განმავლობაში"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"აირჩიეთ მარტივი წვდომის ღილაკზე შეხებისას გამოსაყენებელი ფუნქცია:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ფუნქციების შესაცვლელად ხანგრძლივად შეეხეთ მარტივი წვდომის ღილაკს."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"აირჩიეთ მარტივი წვდომის ღილაკზე შეხებისას გამოსაყენებელი სერვისი:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"აირჩიეთ მარტივი წვდომის ჟესტთან (ორი თითით გადაფურცვლა ეკრანის ქვედა კიდიდან ზემოთ) გამოსაყენებელი სერვისი:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"აირჩიეთ მარტივი წვდომის ჟესტთან (სამი თითით გადაფურცვლა ეკრანის ქვედა კიდიდან ზემოთ) გამოსაყენებელი სერვისი:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"სერვისების გადასართავად, ხანგრძლივად შეეხეთ მარტივი წვდომის ღილაკს."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"სერვისების გადასართავად, ორი თითით გადაფურცლეთ ზემოთ და დააყოვნეთ."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"სერვისების გადასართავად, სამი თითით გადაფურცლეთ ზემოთ და დააყოვნეთ."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"გადიდება"</string> <string name="user_switched" msgid="3768006783166984410">"ამჟამინდელი მომხმარებელი <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>-ზე გადართვა…"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 457d9e87c616..2bdb05fe75fd 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi қоңыраулары"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi қоңырауы"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN қоңырауы"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN қоңырауы"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"№<xliff:g id="ID">%1$d</xliff:g> қабаттама"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", қауіпсіз"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Алдағы Q құрамаларында <xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтындағы фондық әрекеттерге тыйым салынады. g.co/dev/bgblock бетін қараңыз."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтындағы фондық әрекеттерге тыйым салынған. g.co/dev/bgblock бетін қараңыз."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Кескінді ұмытып қалу"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Қате өрнек"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Қате кілтсөз"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін қосты"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін өшірді"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін пайдалану үшін дыбыс деңгейін реттейтін екі түймені де 3 секунд басып тұрыңыз"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын мүмкіндікті таңдаңыз:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Мүмкіндіктерді өзгерту үшін \"Арнайы мүмкіндіктер\" түймесін басып тұрыңыз."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын қызметті таңдаңыз:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Арнайы мүмкіндіктер қимылымен пайдаланатын қызметті таңдаңыз (екі саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Арнайы мүмкіндіктер қимылымен пайдаланатын қызметті таңдаңыз (үш саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Бір қызметтен екінші қызметке ауысу үшін арнайы мүмкіндіктер түймесін түртіп, оны ұстап тұрыңыз."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Бір қызметтен екінші қызметке ауысу үшін екі саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Бір қызметтен екінші қызметке ауысу үшін үш саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ұлғайту"</string> <string name="user_switched" msgid="3768006783166984410">"Ағымдағы пайдаланушы <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> ауысу орындалуда…"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 6d5f5f7ca971..9c01fdb5daf1 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ការហៅតាម Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> ការហៅតាម Wi-Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"ការហៅតាម WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> ការហៅតាម WLAN"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1070,7 +1071,7 @@ <string name="Midnight" msgid="5630806906897892201">"កណ្ដាលអធ្រាត្រ"</string> <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> - <string name="selectAll" msgid="6876518925844129331">"ជ្រើសទាំងអស់"</string> + <string name="selectAll" msgid="6876518925844129331">"ជ្រើសរើសទាំងអស់"</string> <string name="cut" msgid="3092569408438626261">"កាត់"</string> <string name="copy" msgid="2681946229533511987">"ចម្លង"</string> <string name="failed_to_copy_to_clipboard" msgid="1833662432489814471">"មិនអាចចម្លងទៅអង្គចងចាំទេ"</string> @@ -1613,8 +1614,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"#<xliff:g id="ID">%1$d</xliff:g> ត្រួតគ្នា"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", សុវត្ថិភាព"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"មុខងារចាប់ផ្ដើមសកម្មភាពនៅផ្ទៃខាងក្រោយពី <xliff:g id="PACKAGENAME">%1$s</xliff:g> នេះនឹងត្រូវទប់ស្កាត់នៅក្នុងកំណែបង្កើត Q នាពេលអនាគត។ សូមមើល g.co/dev/bgblock ។"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"បានទប់ស្កាត់មុខងារចាប់ផ្ដើមសកម្មភាពនៅផ្ទៃខាងក្រោយពី <xliff:g id="PACKAGENAME">%1$s</xliff:g> ។ សូមមើល g.co/dev/bgblock ។"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ភ្លេចលំនាំ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំមិនត្រឹមត្រូវ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ពាក្យសម្ងាត់មិនត្រឹមត្រូវ"</string> @@ -1668,8 +1667,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ផ្លូវកាត់ភាពងាយស្រួលបានបើក <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ផ្លូវកាត់ភាពងាយស្រួលបានបិទ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"ចុចគ្រាប់ចុចកម្រិតសំឡេងទាំងពីរឱ្យជាប់រយៈពេលបីវិនាទី ដើម្បីប្រើ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ជ្រើសរើសមុខងារដែលត្រូវប្រើ នៅពេលដែលអ្នកចុចប៊ូតុងភាពងាយស្រួល៖"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ដើម្បីផ្លាស់ប្តូរមុខងារ សូមចុចប៊ូតុងភាពងាយស្រួលឲ្យជាប់។"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ជ្រើសរើសសេវាកម្មដែលត្រូវប្រើ នៅពេលដែលអ្នកចុចប៊ូតុងភាពងាយស្រួល៖"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ជ្រើសរើសសេវាកម្មដែលត្រូវប្រើជាមួយចលនាភាពងាយស្រួល (អូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ដោយប្រើម្រាមដៃពីរ)៖"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ជ្រើសរើសសេវាកម្មដែលត្រូវប្រើជាមួយចលនាភាពងាយស្រួល (អូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ដោយប្រើម្រាមដៃបី)៖"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"ដើម្បីប្ដូរឆ្លាស់រវាងសេវាកម្មផ្សេងៗ សូមចុចប៊ូតុងភាពងាយស្រួលឱ្យជាប់។"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"ដើម្បីប្ដូរឆ្លាស់រវាងសេវាកម្មផ្សេងៗ សូមអូសឡើងលើដោយប្រើម្រាមដៃពីរ ហើយសង្កត់ឱ្យជាប់។"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"ដើម្បីប្ដូរឆ្លាស់រវាងសេវាកម្មផ្សេងៗ សូមអូសឡើងលើដោយប្រើម្រាមដៃបី ហើយសង្កត់ឱ្យជាប់។"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ការពង្រីក"</string> <string name="user_switched" msgid="3768006783166984410">"អ្នកប្រើបច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string> <string name="user_switching_message" msgid="2871009331809089783">"កំពុងប្ដូរទៅ <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 521343b076b5..2770d92926b4 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ಕರೆ"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ಕರೆ"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ವೈ-ಫೈ"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ಓವರ್ಲೇ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ಸುರಕ್ಷಿತ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"ಭವಿಷ್ಯದ Q ಬಿಲ್ಡ್ಗಳಲ್ಲಿ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ನಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಈ ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ. g.co/dev/bgblock ಅನ್ನು ನೋಡಿ."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ನಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. g.co/dev/bgblock ಅನ್ನು ನೋಡಿ."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಮರೆತಿರುವಿರಿ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ತಪ್ಪು ಪ್ಯಾಟರ್ನ್"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ತಪ್ಪು ಪಾಸ್ವರ್ಡ್"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಿದೆ"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಿದೆ"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಬಳಸಲು ಎರಡೂ ಧ್ವನಿ ಕೀಗಳನ್ನು ಮೂರು ಸೆಕೆಂಡ್ಗಳ ಕಾಲ ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆರಿಸಿ:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬದಲಾಯಿಸಲು, ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಒತ್ತಿಹಿಡಿದುಕೊಳ್ಳಿ."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ಸೇವೆಯೊಂದನ್ನು ಆರಿಸಿ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್ನೊಂದಿಗೆ ಬಳಸಲು ಸೇವೆಯೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್ನೊಂದಿಗೆ ಬಳಸಲು ಸೇವೆಯೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"ಸೇವೆಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"ಸೇವೆಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"ಸೇವೆಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ಹಿಗ್ಗಿಸುವಿಕೆ"</string> <string name="user_switched" msgid="3768006783166984410">"ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index afdf85c66844..ef6397af77f9 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 통화"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 통화"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 통화"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 통화"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -901,7 +902,7 @@ <string name="granularity_label_link" msgid="5815508880782488267">"링크"</string> <string name="granularity_label_line" msgid="5764267235026120888">"행"</string> <string name="factorytest_failed" msgid="5410270329114212041">"출고 테스트 불합격"</string> - <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST 작업은 /system/app 디렉토리에 설치된 패키지에 대해서만 지원됩니다."</string> + <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST 작업은 /system/app 디렉터리에 설치된 패키지에 대해서만 지원됩니다."</string> <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST 작업을 제공하는 패키지가 없습니다."</string> <string name="factorytest_reboot" msgid="6320168203050791643">"다시 부팅"</string> <string name="js_dialog_title" msgid="1987483977834603872">"\'<xliff:g id="TITLE">%s</xliff:g>\' 페이지 내용:"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>번째 오버레이"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", 보안"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>의 백그라운드 활동 시작은 향후 Q 빌드에서 차단됩니다. g.co/dev/bgblock을 참조하세요."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>의 백그라운드 활동 시작이 차단되었습니다. g.co/dev/bgblock을 참조하세요."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"패턴을 잊음"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"잘못된 패턴"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"잘못된 비밀번호"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 설정되었습니다."</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 중지되었습니다."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> 서비스를 사용하려면 두 볼륨 키를 3초 동안 길게 누르세요"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"접근성 버튼을 탭할 때 사용할 기능을 선택하세요."</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"기능을 변경하려면 접근성 버튼을 길게 터치하세요."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"접근성 버튼을 탭했을 때 실행할 서비스를 선택하세요."</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"접근성 동작(두 손가락을 사용하여 화면 하단에서 위로 스와이프)으로 실행할 서비스를 선택하세요."</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"접근성 동작(세 손가락을 사용하여 화면 하단에서 위로 스와이프)으로 실행할 서비스를 선택하세요."</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"서비스 간에 전환하려면 접근성 버튼을 길게 터치합니다."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"서비스 간에 전환하려면 두 손가락을 사용하여 위로 스와이프한 다음 잠시 기다립니다."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"서비스 간에 전환하려면 세 손가락을 사용하여 위로 스와이프한 다음 잠시 기다립니다."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"확대"</string> <string name="user_switched" msgid="3768006783166984410">"현재 사용자는 <xliff:g id="NAME">%1$s</xliff:g>님입니다."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>(으)로 전환하는 중…"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 6bfd1f537c4d..d78e8b9d888f 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi аркылуу чалуу"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> аркылуу Wi-Fi менен чалуу"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN аркылуу чалуу"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN аркылуу чалуу"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1613,8 +1614,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Катмар №<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", корголгон"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтынын фондук режимде иштеши Q курамдарында бөгөттөлүп турат. Төмөнкүгө өтүңүз: g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтынын фондук режимде иштеши бөгөттөлдү. Төмөнкүгө өтүңүз: g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Үлгү унутулду"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Графикалык ачкыч туура эмес"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Сырсөз туура эмес"</string> @@ -1668,8 +1667,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын күйгүздү"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын өчүрдү"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган функцияны тандаңыз:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Функцияларды өзгөртүү үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган кызматты тандаңыз:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Атайын мүмкүнчүлүктөр жаңсоосу үчүн кызматты тандаңыз (эки манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Атайын мүмкүнчүлүктөр жаңсоосу үчүн кызматты тандаңыз (үч манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Кызматтарды которуштуруу үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Кызматтарды которуштуруу үчүн эки манжаңыз менен өйдө сүрүп, кармап туруңуз."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Кызматтарды которуштуруу үчүн үч манжаңыз менен өйдө сүрүп, кармап туруңуз."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Чоңойтуу"</string> <string name="user_switched" msgid="3768006783166984410">"Учурдагы колдонуучу <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> дегенге которулууда…"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index f0dfab017b45..b5d950e607cb 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> ການໂທ Wi-Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Call"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ການວາງຊ້ອນ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ປອດໄພ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"ການເລີ່ມການເຄື່ອນໄຫວໃນພື້ນຫຼັງນີ້ຈາກ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ຈະຖືກບລັອກໄວ້ໃນ Q ເວີຊັນອະນາຄົດ. ກະລຸນາອ່ານ g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"ບລັອກການເຄື່ອນໄຫວພື້ນຫຼັງຈາກ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ໄວ້ແລ້ວ. ກະລຸນາອ່ານ g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ລືມຮູບແບບປົດລັອກ?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບແບບຜິດ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"ກົດປຸ່ມສຽງທັງສອງພ້ອມກັນຄ້າງໄວ້ສາມວິນາທີເພື່ອໃຊ້ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ເລືອກຄຸນສົມບັດທີ່ຈະໃຊ້ເມື່ອທ່ານແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງ:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ເພື່ອປ່ຽນຄຸນສົມບັດ, ໃຫ້ແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງຄ້າງໄວ້."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ເລືອກບໍລິການເພື່ອໃຊ້ເມື່ອທ່ານແຕະໃສ່ປຸ່ມການຊ່ວຍເຂົ້າເຖິງ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ເລືອກບໍລິການເພື່ອໃຊ້ກັບທ່າທາງການຊ່ວຍເຂົ້າເຖິງ (ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍດ້ວຍສອງນິ້ວ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ເລືອກບໍລິການເພື່ອໃຊ້ກັບທ່າທາງການຊ່ວຍເຂົ້າເຖິງ (ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍດ້ວຍສາມນິ້ວ):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"ເພື່ອສະຫຼັບລະຫວ່າງບໍລິການຕ່າງໆ, ໃຫ້ແຕະໃສ່ປຸ່ມການຊ່ວຍເຂົ້າເຖິງຄ້າງໄວ້."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"ເພື່ອສະຫຼັບລະຫວ່າງບໍລິການຕ່າງໆ, ໃຫ້ປັດຂຶ້ນດ້ວຍສອງນິ້ວຄ້າງໄວ້."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"ເພື່ອສະຫຼັບລະຫວ່າງບໍລິການຕ່າງໆ, ໃຫ້ປັດຂຶ້ນດ້ວຍສາມນິ້ວຄ້າງໄວ້."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ການຂະຫຍາຍ"</string> <string name="user_switched" msgid="3768006783166984410">"ຜູ່ໃຊ້ປັດຈຸບັນ <xliff:g id="NAME">%1$s</xliff:g> ."</string> <string name="user_switching_message" msgid="2871009331809089783">"ກຳລັງສະລັບໄປຫາ <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 2c93d7485be0..0cb0a3dbe0fe 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> „Wi-Fi“ skambinimas"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> „Wi-Fi“ skambinimas"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN skambutis"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN skambutis"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> „Wi-Fi“"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Perdanga nr. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"„<xliff:g id="NAME">%1$s</xliff:g>“: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> tašk. colyje"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", saugu"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Šios fono veiklos paleidimas iš „<xliff:g id="PACKAGENAME">%1$s</xliff:g>“ bus užblokuotas būsimose Q versijose. Žr. g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Fono veiklos paleidimas iš „<xliff:g id="PACKAGENAME">%1$s</xliff:g>“ užblokuotas. Žr. g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pamiršau atrakinimo piešinį"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Netinkamas atrakinimo piešinys"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Netinkamas slaptažodis"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo įjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo išjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Jei norite naudoti „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“, paspauskite abu garsumo klavišus ir palaikykite tris sekundes"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pasirinkite funkciją, kuri bus naudojama, kai paliesite pritaikymo neįgaliesiems mygtuką:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Jei norite pakeisti funkcijas, palieskite ir palaikykite pritaikymo neįgaliesiems mygtuką."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Pasirinkite paslaugą, kuri bus naudojama, kai paliesite pritaikomumo mygtuką:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Pasirinkite paslaugą, kuri bus naudojama su pritaikomumo gestu (perbraukimas aukštyn dviem pirštais iš ekrano apačios):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Pasirinkite paslaugą, kuri bus naudojama su pritaikomumo gestu (perbraukimas aukštyn trimis pirštais iš ekrano apačios):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Norėdami perjungti paslaugas, palieskite ir palaikykite pritaikomumo mygtuką."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Norėdami perjungti paslaugas, perbraukite aukštyn dviem pirštais ir palaikykite."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Norėdami perjungti paslaugas, perbraukite aukštyn trimis pirštais ir palaikykite."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Didinimas"</string> <string name="user_switched" msgid="3768006783166984410">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Perjungiama į <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index f2ef08617af5..7a5301bb41a4 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -132,6 +132,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi zvani"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi zvani"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN zvans"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN zvans"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1634,8 +1635,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Pārklājums Nr. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", drošs"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Šīs fona darbības sākšana no pakotnes <xliff:g id="PACKAGENAME">%1$s</xliff:g> tiks bloķēta turpmākajās Q versijās. Skatiet rakstu g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Fona darbības sākšana no pakotnes <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloķēta. Skatiet rakstu g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Aizmirsu kombināciju"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nepareiza kombinācija"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nepareiza parole"</string> @@ -1690,8 +1689,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pieejamības saīsne aktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pieejamības saīsne deaktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Lai izmantotu pakalpojumu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, nospiediet abus skaļuma taustiņus un turiet tos trīs sekundes."</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izvēlieties funkciju, ko izmantot, kad pieskaraties pogai Pieejamība."</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Lai mainītu funkcijas, pieskarieties pogai Pieejamība un turiet to."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Izvēlieties pakalpojumu, ko izmantot, kad pieskaraties pieejamības pogai."</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Izvēlieties pakalpojumu, ko izmantot ar pieejamības žestu (vilkšana ar diviem pirkstiem augšup no ekrāna apakšdaļas)."</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Izvēlieties pakalpojumu, ko izmantot ar pieejamības žestu (vilkšana ar trīs pirkstiem augšup no ekrāna apakšdaļas)."</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Lai pārslēgtu pakalpojumus, pieskarieties pieejamības pogai un turiet to."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Lai pārslēgtu pakalpojumus, velciet ar diviem pirkstiem augšup un turiet."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Lai pārslēgtu pakalpojumus, velciet ar trīs pirkstiem augšup un turiet."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Palielinājums"</string> <string name="user_switched" msgid="3768006783166984410">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Notiek pāriešana uz: <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 3dc3cf256bba..4a81b9a84e63 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Повици преку Wi-Fi на <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Повикување преку Wi-Fi на <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Повик преку WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Повик преку WLAN на <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi на <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1614,8 +1615,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Прекривка #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g> : <xliff:g id="WIDTH">%2$d</xliff:g>х<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безбедно"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Ова стартување активност во заднина од <xliff:g id="PACKAGENAME">%1$s</xliff:g> ќе се блокира во идните верзии на Q. Видете g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Блокирано е стартување активност во заднина од <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Видете g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборавив шема"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешна шема"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string> @@ -1669,8 +1668,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Кратенката за пристапност ја вклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Кратенката за пристапност ја исклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Притиснете ги и задржете ги двете копчиња за јачина на звукот во траење од три секунди за да користите <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изберете функција за користење кога ќе го допрете копчето за „Пристапност“."</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"За променување функции, допрете го и задржете го копчето за „Пристапност“."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Изберете ја услугата што ќе ја користите кога ќе го допрете копчето за пристапност:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Изберете ја услугата што ќе ја користите со движењето за пристапност (повлекување нагоре од дното на екранот со два прста):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Изберете ја услугата што ќе ја користите со движењето за пристапност (повлекување нагоре од дното на екранот со три прста):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"За да се префрлате помеѓу услуги, допрете и задржете го копчето за пристапност."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"За да се префрлате помеѓу услуги, лизгајте нагоре со два прста и задржете."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"За да се префрлате помеѓу услуги, лизгајте нагоре со три прста и задржете."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Зголемување"</string> <string name="user_switched" msgid="3768006783166984410">"Тековен корисник <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Се префрла на <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 7c10b957c3d4..b3634df2a0a6 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> വൈഫൈ കോളിംഗ്"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> വൈഫൈ കോളിംഗ്"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN കോൾ"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN കോൾ"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> വൈഫൈ"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ഓവർലേ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", സുരക്ഷിതമാക്കുക"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> എന്നതിൽ നിന്ന് ഈ പശ്ചാത്തല ആക്റ്റിവിറ്റി ആരംഭിക്കുന്നത് ഭാവിയിലെ Q ബിൽഡുകളിൽ ബ്ലോക്ക് ചെയ്യപ്പെടും. g.co/dev/bgblock കാണുക."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> എന്നതിൽ നിന്ന് പശ്ചാത്തല ആക്റ്റിവിറ്റി ആരംഭിക്കുന്നത് ബ്ലോക്ക് ചെയ്തു. g.co/dev/bgblock കാണുക."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"പാറ്റേൺ മറന്നു"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"പാറ്റേൺ തെറ്റാണ്"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"പാസ്വേഡ് തെറ്റാണ്"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓൺ ചെയ്തിരിക്കുന്നു"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓഫ് ചെയ്തിരിക്കുന്നു"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും മൂന്ന് സെക്കൻഡ് അമർത്തിപ്പിടിക്കുക"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പ് ചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നതിന് ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ഫീച്ചറുകൾ മാറ്റുന്നതിന് ഉപയോഗസഹായി ബട്ടൺ സ്പർശിച്ചുപിടിക്കുക."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പ് ചെയ്യുമ്പോൾ ഉപയോഗിക്കാൻ ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ഉപയോഗസഹായി വിരൽചലനത്തോടൊപ്പം ഉപയോഗിക്കാൻ ഒരു സർവീസ് തിരഞ്ഞെടുക്കുക (രണ്ട് വിരലുകളുപയോഗിച്ച് സ്ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ഉപയോഗസഹായി വിരൽചലനത്തോടൊപ്പം ഉപയോഗിക്കാൻ ഒരു സർവീസ് തിരഞ്ഞെടുക്കുക (മൂന്ന് വിരലുകളുപയോഗിച്ച് സ്ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"സർവീസുകൾക്കിടയിൽ മാറാൻ, ഉപയോഗസഹായി ബട്ടൺ സ്പർശിച്ചുപിടിക്കുക."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"സർവീസുകൾക്കിടയിൽ മാറാൻ, രണ്ട് വിരലുകളുപയോഗിച്ച് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"സർവീസുകൾക്കിടയിൽ മാറാൻ, മൂന്ന് വിരലുകളുപയോഗിച്ച് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"മാഗ്നിഫിക്കേഷൻ"</string> <string name="user_switched" msgid="3768006783166984410">"നിലവിലെ ഉപയോക്താവ് <xliff:g id="NAME">%1$s</xliff:g> ആണ്."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> എന്ന ഉപയോക്താവിലേക്ക് മാറുന്നു…"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 9a5446d69426..0158076c143a 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi дуудлага"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Дуудлага"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN дуудлага"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN дуудлага"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Давхарга #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", найдвартай"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-с эхлэх арын энэ үйл ажиллагааг цаашдын Q боловсруулагдсан программд хориглоно. Та g.co/dev/bgblock холбоосыг харна уу."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-с эхлэх арын үйл ажиллагааг хориглосон. Та g.co/dev/bgblock холбоосыг харна уу."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Хээг мартсан"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу хээ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Нууц үг буруу"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г асаасан"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г унтраасан"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г ашиглахын тулд дууны түвшнийг ихэсгэх, багасгах түлхүүрийг 3 секундийн турш зэрэг дарна уу"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Хүртээмжийн товчлуурыг товших үедээ ашиглах онцлогийг сонгоно уу:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Онцлогийг өөрчлөхийн тулд Хүртээмжийн товчлуурыг дараад хүлээнэ үү."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Хүртээмжийн товчлуурыг товшихдоо ашиглах үйлчилгээг сонгоно уу:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Хүртээмжийн зангаатай ашиглах үйлчилгээг сонгоно уу (хоёр хуруугаараа дэлгэцийн доороос дээш шударна уу):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Хүртээмжийн зангаатай ашиглах үйлчилгээг сонгоно уу (гурван хуруугаараа дэлгэцийн доороос дээш шударна уу):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Үйлчилгээнүүд хооронд сэлгэхийн тулд хүртээмжийн товчлуурт хүрээд удаан дарна уу."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Үйлчилгээнүүд хооронд сэлгэхийн тулд хоёр хуруугаараа дээш шудраад удаан дарна уу."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Үйлчилгээнүүд хооронд сэлгэхийн тулд гурван хуруугаараа дээш шудраад удаан дарна уу."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Томруулах"</string> <string name="user_switched" msgid="3768006783166984410">"Одоогийн хэрэглэгч <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> руу сэлгэж байна…"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index aff6d82d14d0..5125eb3eaa34 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> वाय-फाय कॉलिंग"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> वाय-फाय कॉलिंग"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN कॉल"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN कॉल"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> वाय-फाय"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ओव्हरले #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> पासून सुरू होणारी ही बॅकग्राउंड अॅक्टिव्हिटी भविष्यातील Q बिल्डमध्ये ब्लॉक केली जाईल. g.co/dev/bgblock पाहा."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> वरून सुरू होणारी बॅकग्राउंड अॅक्टिव्हिटी ब्लॉक केली आहे. g.co/dev/bgblock पाहा."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"पॅटर्न विसरलात"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"चुकीचा पॅटर्न"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"चुकीचा पासवर्ड"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> चालू केली"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> बंद केली"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> वापरण्यासाठी दोन्ही व्हॉल्युम की तीन सेकंद दाबा आणि धरून ठेवा"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"तुम्ही प्रवेशयोग्यता बटण दाबल्यावर वापरण्यासाठी वैशिष्ट्य निवडा:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"वैशिष्ट्ये बदलण्यासाठी, प्रवेशयोग्यता बटणाला स्पर्श करा आणि धरून ठेवा."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"तुम्ही अॅक्सेसिबिलिटी बटण दाबल्यावर वापरण्यासाठी वैशिष्ट्य निवडा:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"अॅक्सेसिबिलिटी जेश्चर ज्या सोबत वापराचे आहे अशी सेवा निवडा (स्क्रीनच्या खालच्या बाजूने दोन बोटांनी स्वाइप करा):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"अॅक्सेसिबिलिटी जेश्चर ज्या सोबत वापराचे आहे अशी सेवा निवडा (स्क्रीनच्या खालच्या बाजूने तीन बोटांनी स्वाइप करा):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"सेवांदरम्यान स्विच करण्यासाठी, अॅक्सेसिबिलिटी बटणाला स्पर्श करा आणि धरून ठेवा."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"सेवांदरम्यान स्विच करण्यासाठी, दोन बोटांनी वरच्या दिशेला स्वाइप करा आणि धरून ठेवा."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"सेवांदरम्यान स्विच करण्यासाठी, तीन बोटांनी वरच्या दिशेला स्वाइप करा आणि धरून ठेवा."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"मोठे करणे"</string> <string name="user_switched" msgid="3768006783166984410">"वर्तमान वापरकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> वर स्विच करत आहे…"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 9651c02f0b9b..73f8c4014bff 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Panggilan Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Panggilan Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Panggilan WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Panggilan WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Tindih #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", selamat"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Permulaan aktiviti latar belakang daripada <xliff:g id="PACKAGENAME">%1$s</xliff:g> ini akan disekat dalam binaan Q pada masa hadapan. Lihat g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Permulaan aktiviti latar belakang daripada <xliff:g id="PACKAGENAME">%1$s</xliff:g> disekat. Lihat g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Corak"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Corak Salah"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Kata Laluan Salah"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pintasan kebolehaksesan menghidupkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pintasan Kebolehaksesan mematikan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tekan dan tahan kedua-dua kekunci kelantangan selama tiga saat untuk menggunakan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pilih ciri yang hendak digunakan apabila anda mengetik butang Kebolehaksesan:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Untuk menukar ciri, sentuh & tahan butang Kebolehaksesan."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Pilih perkhidmatan yang hendak digunakan apabila anda mengetik butang kebolehaksesan:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Pilih perkhidmatan untuk digunakan dengan gerak isyarat kebolehaksesan (leret ke atas dari bahagian bawah skrin menggunakan dua jari):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Pilih perkhidmatan untuk digunakan dengan gerak isyarat kebolehaksesan (leret ke atas dari bahagian bawah skrin menggunakan tiga jari):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Untuk beralih antara perkhidmatan, sentuh & tahan butang kebolehaksesan."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Untuk beralih antara perkhidmatan, leret ke atas menggunakan dua jari dan tahan."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Untuk beralih antara perkhidmatan, leret ke atas menggunakan tiga jari dan tahan."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pembesaran"</string> <string name="user_switched" msgid="3768006783166984410">"Pengguna semasa <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Bertukar kepada <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index d190bb701542..d8dde58a5a3d 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi ခေါ်ဆိုမှု"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g>Wi-Fi ခေါ်ဆိုမှု"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ခေါ်ဆိုမှု"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ခေါ်ဆိုမှု"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -295,7 +296,7 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင့်ဖုန်းရှိ ဓာတ်ပုံများ၊ မီဒီယာနှင့် ဖိုင်များ ဝင်သုံးခွင့်ပေးလိုပါသလား။"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"မိုက်ခရိုဖုန်း"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"အသံဖမ်းခြင်း"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား အသံဖမ်းယူခွင့် ပေးလိုပါသလား။"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ကို အသံဖမ်းယူခွင့် ပေးလိုပါသလား။"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"ကိုယ်လက်လှုပ်ရှားမှု"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"သင့်ကိုယ်လက်လှုပ်ရှားမှုကို ဝင်ကြည့်ရန်"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင့်ကိုယ်လက်လှုပ်ရှားမှုကို ဝင်ကြည့်ခွင့် ပေးလိုပါသလား။"</string> @@ -307,7 +308,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင်၏ခေါ်ဆိုထားသော မှတ်တမ်းများကို သုံးခွင့်ပေးလိုပါသလား။"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"ဖုန်း"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ကို ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"စက်၏ အာရုံခံစနစ်များ"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင်၏ အရေးကြီးသောလက္ခဏာ အာရုံခံကိရိယာ ဒေတာများကို သုံးခွင့်ပေးလိုပါသလား။"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"အပေါ်မှ ထပ်သောအရာ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", လုံခြုံသော"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> မှစတင်သော ဤနောက်ခံလုပ်ဆောင်ချက်ကို အနာဂတ် Q တည်ဆောက်ပုံများတွင် ပိတ်ထားပါမည်။ g.co/dev/bgblock ကိုကြည့်ပါ။"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> မှစတင်သော နောက်ခံလုပ်ဆောင်ချက်ကို ပိတ်ထားသည်။ g.co/dev/bgblock ကိုကြည့်ပါ။"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ပုံဖော်မှုအား မေ့လျော့ခြင်း"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ပုံဆွဲအမှား"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"စကားဝှက်အမှား"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ဖွင့်လိုက်ပါသည်"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ပိတ်လိုက်ပါသည်"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို သုံးရန် အသံအတိုးအလျှော့ ခလုတ်နှစ်ခုလုံးကို သုံးစက္ကန့်ကြာ ဖိထားပါ"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ဝန်ဆောင်မှုများကို ပြောင်းလဲရန် အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့၍ ထိထားပါ။"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (မျက်နှာပြင်အောက်ခြေမှနေ၍ လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (မျက်နှာပြင်အောက်ခြေမှနေ၍ လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် အများသုံးစွဲနိုင်မှုခလုတ်ကို ဖိထားပါ။"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်သုံးချေင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ချဲ့ခြင်း"</string> <string name="user_switched" msgid="3768006783166984410">"လက်ရှိအသုံးပြုနေသူ <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>သို့ ပြောင်းနေ…"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index bfba2d447dd8..7923d8174840 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi-anrop"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g>-Wi-Fi-anrop"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-anrop"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-anrop"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlegg #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sikker"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Denne bakgrunnsaktiviteten som starter fra <xliff:g id="PACKAGENAME">%1$s</xliff:g>, blir blokkert i fremtidige Q-delversjoner. Se g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Bakgrunnsaktivitet som starter fra <xliff:g id="PACKAGENAME">%1$s</xliff:g>, er blokkert. Se g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glemt mønsteret?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Feil mønster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Feil passord"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Snarveien for tilgjengelighet slo på <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Snarveien for tilgjengelighet slo av <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Trykk og hold inne begge volumtastene i tre sekunder for å bruke <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Velg en funksjon du vil bruke når du trykker på Tilgjengelighet-knappen:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"For å endre funksjoner, trykk på og hold inne Tilgjengelighet-knappen."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Velg en tjeneste du vil bruke når du trykker på Tilgjengelighet-knappen:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Velg en tjeneste du vil bruke med tilgjengelighetsbevegelsen (sveip opp fra bunnen av skjermen med to fingre):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Velg en tjeneste du vil bruke med tilgjengelighetsbevegelsen (sveip opp fra bunnen av skjermen med tre fingre):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"For å bytte mellom tjenester, trykk og hold på Tilgjengelighet-knappen."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"For å bytte mellom tjenester, sveip opp med to fingre og hold."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"For å bytte mellom tjenester, sveip opp med tre fingre og hold."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Forstørring"</string> <string name="user_switched" msgid="3768006783166984410">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Bytter til <xliff:g id="NAME">%1$s</xliff:g> …"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 6987b1caa99c..b8649ae005f1 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi कलिङ"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi कलिङ"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN कल"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN कल"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1617,8 +1618,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"आवरण #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"यो पृष्ठभूमिमा चल्ने क्रियाकलापलाई <xliff:g id="PACKAGENAME">%1$s</xliff:g> बाट भविष्यका Q build हरूमा रोक लगाइने छ। g.co/dev/bgblock हेर्नुहोस्।"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> माथि रोक लगाएपछि पृष्ठभूमिको क्रियाकलाप सुरु हुन्छ। g.co/dev/bgblock हेर्नुहोस्।"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाँचा बिर्सनु भयो"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाँचा"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string> @@ -1672,8 +1671,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई सक्रिय पार्यो"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई निष्क्रिय पार्यो"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> प्रयोग गर्न दुवै भोल्युम कुञ्जीहरूलाई तीन सेकेन्डसम्म थिचिराख्नुहोस्"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"तपाईंले पहुँच सम्बन्धी बटनलाई ट्याप गर्दा प्रयोग गर्नुपर्ने सुविधा रोज्नुहोस्:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"सुविधाहरूलाई बदल्न, पहुँच सम्बन्धी बटनलाई छोएर थिची राख्नुहोस्।"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"तपाईंले पहुँचसम्बन्धी बटन ट्याप गर्दा प्रयोग गर्नु पर्ने सुविधा रोज्नुहोस्:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"पहुँचसम्बन्धी इसारासँगै प्रयोग गर्नु पर्ने कुनै सेवा छनौट गर्नुहोस् (दुईवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"पहुँचसम्बन्धी इसारासँगै प्रयोग गर्नु पर्ने कुनै सेवा छनौट गर्नुहोस् (तीनवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"एउटा सेवाबाट अर्को सेवामा जान पहुँचसम्बन्धी बटनमा छोइराख्नुहोस्।"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"एउटा सेवाबाट अर्को सेवामा जान दुईवटा औँलाले माथितिर स्वाइप गरी थिचिराख्नुहोस्।"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"एउटा सेवाबाट अर्को सेवामा जान तीनवटा औँलाले माथितिर स्वाइप गरी थिचिराख्नुहोस्।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"म्याग्निफिकेसन"</string> <string name="user_switched" msgid="3768006783166984410">"अहिलेको प्रयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>।"</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> मा स्विच गर्दै..."</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index bd10cf2a4402..7a3a030177bc 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Bellen via wifi van <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Bellen via wifi met <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Bellen via WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Bellen via WLAN van <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wifi van <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", beveiligd"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Het starten van deze achtergrondactiviteit voor <xliff:g id="PACKAGENAME">%1$s</xliff:g> wordt geblokkeerd in toekomstige Q-builds. Ga naar g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Starten van achtergrondactiviteit voor <xliff:g id="PACKAGENAME">%1$s</xliff:g> is geblokkeerd. Ga naar g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Patroon vergeten"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Onjuist patroon"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Onjuist wachtwoord"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"\'Snelle link voor toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ingeschakeld"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"\'Snelle link voor toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> uitgeschakeld"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Houd beide volumetoetsen drie seconden ingedrukt om <xliff:g id="SERVICE_NAME">%1$s</xliff:g> te gebruiken"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Kies een functie om te gebruiken wanneer je op de knop Toegankelijkheid tikt:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Als je functies wilt wijzigen, tik je op de knop Toegankelijkheid en houd je deze vast."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Kies een service om te gebruiken wanneer je op de toegankelijkheidsknop tikt:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Kies een service om te gebruiken met het toegankelijkheidsgebaar (veeg met twee vingers omhoog vanaf de onderkant van het scherm):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Kies een service om te gebruiken met het toegankelijkheidsgebaar (veeg met drie vingers omhoog vanaf de onderkant van het scherm):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Tik op de toegankelijkheidsknop en houd deze vast om tussen services te schakelen."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Veeg met twee vingers omhoog en houd vast om tussen services te schakelen."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Veeg met drie vingers omhoog en houd vast om tussen services te schakelen."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergroting"</string> <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Overschakelen naar <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index ca161551ec07..b37cf9dc356e 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ୱାଇ-ଫାଇ କଲିଂ"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> ୱାଇଫାଇ କଲିଂ"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN କଲ୍"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN କଲ୍"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ୱାଇ-ଫାଇ"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ପ୍ରାୟତଃ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ସୁରକ୍ଷିତ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ଠାରୁ ଆରମ୍ଭ ହୋଇଥିବା ପୃଷ୍ଠଭୂମି କାର୍ଯ୍ୟକଳାପ ଆଗାମୀ Q ବିଲ୍ଡରେ ବ୍ଲକ୍ କରାଯିବ। g.co/dev/bgblock ଦେଖନ୍ତୁ।"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>ଠାରୁ ଆରମ୍ଭ ହୋଇଥିବା ପୃଷ୍ଠଭୂମି କାର୍ଯ୍ୟକଳାପ ବ୍ଲକ୍ କରାଯାଇଛି। g.co/dev/bgblock ଦେଖନ୍ତୁ।"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ପାଟର୍ନ ଭୁଲି ଯାଇଛନ୍ତି"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ଭୁଲ ପାଟର୍ନ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ଭୁଲ ପାସ୍ୱର୍ଡ"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅନ୍ କରାଯାଇଛି"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅଫ୍ କରାଯାଇଛି"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରିବାକୁ ତିନି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ ଦବାଇ ଧରି ରଖନ୍ତୁ"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ଆପଣ ଆକ୍ସେସବିଲିଟି ବଟନ୍ ଟାପ୍ କରିବା ବେଳେ ଏକ ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ ବାଛନ୍ତୁ:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇବାକୁ, ଆକ୍ସେସବିଲିଟି ବଟନ୍ ସ୍ପର୍ଶ କରନ୍ତୁ ଓ ଧରିରଖନ୍ତୁ।"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ଆପଣ ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ ଟାପ୍ କରିବା ସମୟରେ ଏକ ସେବା ବ୍ୟବହାର କରିବା ପାଇଁ ବାଛନ୍ତୁ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚର୍ ବ୍ୟବହାର କରିବା ପାଇଁ ଏକ ସେବା ବାଛନ୍ତୁ (ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନ୍ର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚର୍ ବ୍ୟବହାର କରିବା ପାଇଁ ଏକ ସେବା ବାଛନ୍ତୁ (ତିନିଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନ୍ର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"ସେବାଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବା ପାଇଁ ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ ସ୍ପର୍ଶ ଓ ଧରି ରଖନ୍ତୁ।"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"ସେବାଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବା ପାଇଁ ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ।"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"ସେବାଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବା ପାଇଁ ତିନିଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ମ୍ୟାଗ୍ନିଫିକେସନ୍"</string> <string name="user_switched" msgid="3768006783166984410">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="NAME">%1$s</xliff:g>।"</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> ରେ ସୁଇଚ୍ କରନ୍ତୁ…"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 0f92fdd72aa0..65feb91312b8 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> ਵਾਈ-ਫਾਈ Calling"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ਕਾਲ"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ਕਾਲ"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ਵਾਈ-ਫਾਈ"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ਓਵਰਲੇ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ਸੁਰੱਖਿਅਤ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"ਇਹ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ਤੋਂ ਸ਼ੁਰੂ ਹੋ ਕੇ ਭਵਿੱਖ ਦੇ Q ਬਿਲਡ ਵਿੱਚ ਬਲਾਕ ਕੀਤੀ ਜਾਵੇਗੀ। g.co/dev/bgblock ਦੇਖੋ।"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ਬਲਾਕ ਕਰਕੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ ਸ਼ੁਰੂ ਕੀਤੀ ਗਈ। g.co/dev/bgblock ਦੇਖੋ।"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ਪੈਟਰਨ ਭੁੱਲ ਗਏ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ਗ਼ਲਤ ਪੈਟਰਨ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ਗਲਤ ਪਾਸਵਰਡ"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕੀਤਾ"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਬੰਦ ਕੀਤਾ"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ 3 ਸਕਿੰਟਾਂ ਲਈ ਦਬਾਈ ਰੱਖੋ"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਟੈਪ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਰਤਣ ਲਈ ਕੋਈ ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੋ:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬਦਲਣ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ।"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ \'ਤੇ ਟੈਪ ਕਰਕੇ ਵਰਤਣ ਲਈ ਕੋਈ ਸੇਵਾ ਚੁਣੋ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ਪਹੁੰਚਯੋਗਤਾ ਸੰਕੇਤ ਨਾਲ ਵਰਤਣ ਲਈ ਕੋਈ ਸੇਵਾ ਚੁਣੋ (ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ਪਹੁੰਚਯੋਗਤਾ ਸੰਕੇਤ ਨਾਲ ਵਰਤਣ ਲਈ ਕੋਈ ਸੇਵਾ ਚੁਣੋ (ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"ਸੇਵਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ \'ਤੇ ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖੋ।"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"ਸੇਵਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"ਸੇਵਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ਵੱਡਦਰਸ਼ੀਕਰਨ"</string> <string name="user_switched" msgid="3768006783166984410">"ਮੌਜੂਦਾ ਉਪਭੋਗਤਾ <xliff:g id="NAME">%1$s</xliff:g>।"</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 22634e2bbe89..dc458e4ced5e 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>, połączenia przez Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g>, połączenia przez Wi-Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Połączenie przez WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>, połączenie przez WLAN"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>, Wi-Fi"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Nakładka nr <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", bezpieczny"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Rozpoczęcie tej aktywności w tle przez pakiet <xliff:g id="PACKAGENAME">%1$s</xliff:g> zostanie zablokowane w przyszłych kompilacjach Q. Patrz g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Rozpoczęcie aktywności w tle przez pakiet <xliff:g id="PACKAGENAME">%1$s</xliff:g> zostało zablokowane. Patrz g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nie pamiętam wzoru"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nieprawidłowy wzór"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nieprawidłowe hasło"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Naciśnij i przytrzymaj oba przyciski głośności przez trzy sekundy, by użyć usługi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Wybierz funkcję używaną po kliknięciu przycisku ułatwień dostępu."</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Aby zmienić funkcje, kliknij i przytrzymaj przycisk ułatwień dostępu."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Wybierz usługę używaną po kliknięciu przycisku ułatwień dostępu:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Wybierz usługę używaną w przypadku gestu ułatwień dostępu (przesunięcie dwoma palcami z dołu ekranu w górę):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Wybierz usługę używaną w przypadku gestu ułatwień dostępu (przesunięcie trzema palcami z dołu ekranu w górę):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Aby przełączać usługi, kliknij i przytrzymaj przycisk ułatwień dostępu."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Aby przełączać usługi, przesuń dwoma palcami w górę i przytrzymaj."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Aby przełączać usługi, przesuń trzema palcami w górę i przytrzymaj."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Powiększenie"</string> <string name="user_switched" msgid="3768006783166984410">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Przełączam na użytkownika <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index e0047ff5079d..a8de75d1312b 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamada no Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Chamada no Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada por WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição nº <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", seguro"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Esse início de atividade em segundo plano a partir de <xliff:g id="PACKAGENAME">%1$s</xliff:g> será bloqueado nas versões futuras do Android Q. Acesse g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"O início da atividade em segundo plano a partir de <xliff:g id="PACKAGENAME">%1$s</xliff:g> foi bloqueado. Acesse g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueci o padrão"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Senha incorreta"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha um recurso a ser usado quando você toca no botão Acessibilidade:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar os recursos, mantenha o botão Acessibilidade pressionado."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Escolha um serviço a ser usado quando você toca no botão Acessibilidade:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Para alternar entre serviços, toque no botão de acessibilidade e mantenha-o pressionado."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Para alternar entre serviços, deslize de baixo para cima na tela com dois dedos e mantenha-a pressionada."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Para alternar entre serviços, deslize de baixo para cima na tela com três dedos e mantenha-a pressionada."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string> <string name="user_switched" msgid="3768006783166984410">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Alternando para <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index df52f3b28878..c4ed32ed138c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamadas Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Chamadas Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", protegido"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Este início da atividade em segundo plano do pacote <xliff:g id="PACKAGENAME">%1$s</xliff:g> será bloqueado em compilações futuras do Q. Aceda a g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Início da atividade em segundo plano do pacote <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloqueado. Aceda a g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueceu-se da Sequência"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão Incorreto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Palavra-passe Incorreta"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O Atalho de acessibilidade ativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O Atalho de acessibilidade desativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Prima sem soltar as teclas de volume durante três segundos para utilizar o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha uma funcionalidade para utilizar quando tocar no botão Acessibilidade:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar as funcionalidades, toque sem soltar no botão Acessibilidade."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Escolha o serviço a utilizar quando tocar no botão de acessibilidade:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Escolha o serviço a utilizar com o gesto de acessibilidade (deslize rapidamente com dois dedos para cima a partir da parte inferior do ecrã):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Escolha o serviço a utilizar com o gesto de acessibilidade (deslize rapidamente com três dedos para cima a partir da parte inferior do ecrã):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Para alternar entre serviços, toque sem soltar no botão de acessibilidade."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Para alternar entre serviços, deslize rapidamente com dois dedos para cima sem soltar."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Para alternar entre serviços, deslize rapidamente com três dedos para cima sem soltar."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string> <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string> <string name="user_switching_message" msgid="2871009331809089783">"A mudar para <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index e0047ff5079d..a8de75d1312b 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamada no Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Chamada no Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada por WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição nº <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", seguro"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Esse início de atividade em segundo plano a partir de <xliff:g id="PACKAGENAME">%1$s</xliff:g> será bloqueado nas versões futuras do Android Q. Acesse g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"O início da atividade em segundo plano a partir de <xliff:g id="PACKAGENAME">%1$s</xliff:g> foi bloqueado. Acesse g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueci o padrão"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Senha incorreta"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha um recurso a ser usado quando você toca no botão Acessibilidade:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar os recursos, mantenha o botão Acessibilidade pressionado."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Escolha um serviço a ser usado quando você toca no botão Acessibilidade:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Para alternar entre serviços, toque no botão de acessibilidade e mantenha-o pressionado."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Para alternar entre serviços, deslize de baixo para cima na tela com dois dedos e mantenha-a pressionada."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Para alternar entre serviços, deslize de baixo para cima na tela com três dedos e mantenha-a pressionada."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string> <string name="user_switched" msgid="3768006783166984410">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Alternando para <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 004fc6fa4d26..2a3a8988ebe2 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -132,6 +132,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Apelare prin Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Apelare prin Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Apel WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Apel WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1634,8 +1635,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Suprapunerea <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", securizat"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Începerea activității în fundal de la <xliff:g id="PACKAGENAME">%1$s</xliff:g> va fi blocată în versiunile Q viitoare. Consultați g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Începerea activității din fundal de la <xliff:g id="PACKAGENAME">%1$s</xliff:g> este blocată. Consultați g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Model uitat"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Model greșit"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Parolă greșită"</string> @@ -1690,8 +1689,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Comanda rapidă de accesibilitate a activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Comanda rapidă de accesibilitate a dezactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Apăsați ambele butoane de volum timp de trei secunde pentru a folosi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Alegeți o funcție pe care să o folosiți când atingeți butonul Accesibilitate:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pentru a schimba funcțiile, atingeți lung butonul Accesibilitate."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Alegeți un serviciu pe care să îl folosiți când atingeți butonul de accesibilitate:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Alegeți un serviciu pe care să îl folosiți cu gestul de accesibilitate (glisați în sus cu două degete din partea de jos a ecranului):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Alegeți un serviciu pe care să îl folosiți cu gestul de accesibilitate (glisați în sus cu trei degete din partea de jos a ecranului):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Pentru a comuta între servicii, atingeți lung butonul de accesibilitate."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Pentru a comuta între servicii, glisați în sus cu două degete și țineți lung."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Pentru a comuta între servicii, glisați în sus cu trei degete și țineți lung."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Mărire"</string> <string name="user_switched" msgid="3768006783166984410">"Utilizator curent: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Se comută la <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index e0dcd7ca3589..9fae441d34cc 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Звонки по Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Звонок по Wi-Fi через оператора \"<xliff:g id="SPN">%s</xliff:g>\""</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Вызов WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> Вызов WLAN"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Наложение № <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> х <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> тчк/дюйм"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безопасный"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Действия приложения \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" в фоновом режиме будут блокироваться в следующих сборках Android Q. Подробную информацию можно найти на странице g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Действие приложения \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" в фоновом режиме заблокировано. Подробную информацию можно найти на странице g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забыли графический ключ?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильный графический ключ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Неправильный пароль"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> включен"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> отключен"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Чтобы использовать сервис \"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\", нажмите и удерживайте обе клавиши громкости в течение трех секунд."</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Выберите функцию, которая запускается при нажатии кнопки специальных возможностей:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Чтобы изменить функцию, удерживайте кнопку специальных возможностей."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Выберите сервис, который будет запускаться при нажатии кнопки специальных возможностей:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Выберите сервис, который будет запускаться жестом для доступа к специальным возможностям (провести по экрану снизу вверх двумя пальцами):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Выберите сервис, который будет запускаться жестом для доступа к специальным возможностям (провести по экрану снизу вверх тремя пальцами):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Для переключения между сервисами нажмите и удерживайте кнопку специальных возможностей."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Для переключения между сервисами проведите по экрану снизу вверх двумя пальцами и задержите их."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Для переключения между сервисами проведите по экрану снизу вверх тремя пальцами и задержите их."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Увеличение"</string> <string name="user_switched" msgid="3768006783166984410">"Выбран аккаунт пользователя <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Смена профиля на <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 8e7beac4f7b0..4b41f9a455f7 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi ඇමතුම්"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> WiFi ඇමතුම"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ඇමතුම"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ඇමතුම්"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1613,8 +1614,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"උඩැතිරිය #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ආරක්ෂිත"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> සිට ඇරඹෙන මෙම පසුබිම් ක්රියාකාරකම අනාගත Q නිමැවුම්වල අවහිර කෙරේ. g.co/dev/bgblock බලන්න."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> සිට ඇරඹෙන පසුබිම් ක්රියාකාරකම අවහිරයි. g.co/dev/bgblock බලන්න."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටාව අමතකයි"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"වැරදි රටාවකි"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"වැරදි මුරපදය"</string> @@ -1668,8 +1667,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ප්රවේශ්යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්රියාත්මක කරන ලදී"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ප්රවේශ්යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්රියාවිරහිත කරන ලදී"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> භාවිත කිරීමට හඬ පරිමා යතුරු දෙකම තත්පර තුනකට ඔබාගෙන සිටින්න"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ඔබ ප්රවේශ්යතා බොත්තම තට්ටු කරන විට භාවිතා කිරීමට අංගයක් තෝරාගන්න:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"අංග වෙනස් කිරීමට ප්රවේශ්යතා බොත්තම ස්පර්ශ කර අල්ලා ගෙන සිටින්න."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ඔබ ප්රවේශ්යතා බොත්තම තට්ටු කරන විට භාවිතයට සේවාවක් තෝරා ගන්න:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ප්රවේශ්යතා ඉංගිතය සමඟ භාවිතයට සේවාවක් තෝරා ගන්න (ඇඟිලි දෙකක් සමඟින් තිරයේ පහළින් උඩට ස්වයිප් කරන්න):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ප්රවේශ්යතා ඉංගිතය සමඟ භාවිතයට සේවාවක් තෝරා ගන්න (ඇඟිලි තුනක් සමඟින් තිරයේ පහළින් උඩට ස්වයිප් කරන්න):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"සේවා අතර මාරු වීමට, ප්රවේශ්යතා බොත්තම ස්පර්ශ කර අල්ලා සිටින්න."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"සේවා අතර මාරු වීමට, ඇඟිලි දෙකක් සමඟින් උඩට ස්වයිප් කර අල්ලා සිටින්න."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"සේවා අතර මාරු වීමට, ඇඟිලි තුනක් සමඟින් උඩට ස්වයිප් කර අල්ලා සිටින්න."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"විශාලනය"</string> <string name="user_switched" msgid="3768006783166984410">"දැනට සිටින පරිශීලකයා <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> වෙත මාරු කරමින්…"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index e6784dd49193..c79fe52c6fbb 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> volanie cez Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Volanie cez Wi‑Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Volanie cez WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> volanie cez WLAN"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -301,7 +302,7 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> používať fotky, médiá a súbory v zariadení?"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofón"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"nahrávanie zvuku"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> zaznamenávať zvuk?"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Chcete povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> nahrávať zvuk?"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Fyzická aktivita"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"prístup k vašej fyzickej aktivite"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k vašej fyzickej aktivite?"</string> @@ -430,7 +431,7 @@ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"meniť nastavenia zvuku"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Umožňuje aplikácii upraviť globálne nastavenia zvuku, ako je hlasitosť, alebo určiť, z ktorého reproduktora bude zvuk vychádzať."</string> <string name="permlab_recordAudio" msgid="3876049771427466323">"nahrávať zvuk"</string> - <string name="permdesc_recordAudio" msgid="4245930455135321433">"Táto aplikácia môže kedykoľvek zaznamenávať zvuk pomocou mikrofónu."</string> + <string name="permdesc_recordAudio" msgid="4245930455135321433">"Táto aplikácia môže kedykoľvek nahrávať zvuk pomocou mikrofónu."</string> <string name="permlab_sim_communication" msgid="2935852302216852065">"posielanie príkazov do SIM karty"</string> <string name="permdesc_sim_communication" msgid="5725159654279639498">"Umožňuje aplikácii odosielať príkazy na SIM kartu. Toto je veľmi nebezpečné povolenie."</string> <string name="permlab_activityRecognition" msgid="3634590230567608356">"rozpoznávanie fyzickej aktivity"</string> @@ -1580,7 +1581,7 @@ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Aplikáciu <xliff:g id="APPLICATION_NAME">%s</xliff:g> nie je možné spustiť"</string> <string name="shareactionprovider_share_with" msgid="806688056141131819">"Zdieľať s"</string> <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Zdieľať s aplikáciou <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> - <string name="content_description_sliding_handle" msgid="415975056159262248">"Posuvné tlačidlo. Dotknite sa a podržte."</string> + <string name="content_description_sliding_handle" msgid="415975056159262248">"Posuvník. Pridržte."</string> <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Posunom odomknúť."</string> <string name="action_bar_home_description" msgid="5293600496601490216">"Prejsť na plochu"</string> <string name="action_bar_up_description" msgid="2237496562952152589">"Prejsť na"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Prekrytie č. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", zabezpečené"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Toto spustenie aktivity na pozadí v režime <xliff:g id="PACKAGENAME">%1$s</xliff:g> bude blokované v budúcich zostavách Q. Pozrite si informácie na g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Spustenie aktivity na pozadí v režime <xliff:g id="PACKAGENAME">%1$s</xliff:g> je blokované. Pozrite si informácie na g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nepamätám si vzor"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávny vzor"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávne heslo"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Skratka dostupnosti zapla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Skratka dostupnosti vypla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Ak chcete používať službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, pridržte tri sekundy oba klávesy hlasitosti"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Klepnutím na tlačidlo dostupnosti vyberte požadovanú funkciu:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ak chcete zmeniť funkcie, klepnite na tlačidlo dostupnosti a podržte ho"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Vyberte službu, ktorú chcete používať po klepnutí na tlačidlo dostupnosti:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Vyberte službu, ktorú chcete používať s daným gestom dostupnosti (potiahnutím dvoma prstami z dolnej časti obrazovky smerom nahor):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Vyberte službu, ktorú chcete používať s daným gestom dostupnosti (potiahnutím troma prstami z dolnej časti obrazovky smerom nahor):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Služby prepnete pridržaním tlačidla dostupnosti."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Služby prepnete potiahnutím dvoma prstami smerom nahor a pridržaním."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Služby prepnete potiahnutím troma prstami smerom nahor a pridržaním."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Priblíženie"</string> <string name="user_switched" msgid="3768006783166984410">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Prepína sa na účet <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 9fa767c3d37a..f1dc25e1a6d8 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Klicanje prek Wi-Fi-ja operaterja <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Klicanje prek Wi‑Fi-ja pri operaterju <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Klic prek omrežja WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Klic prek omrežja WLAN operaterja <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi operaterja <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Prekrivanje #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> pik na palec"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", varen"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Ta zagon dejavnosti v ozadju za paket <xliff:g id="PACKAGENAME">%1$s</xliff:g> bo blokiran v prihodnjih različicah Androida Q. Za več informacij obiščite g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Zagon dejavnosti v ozadju za paket <xliff:g id="PACKAGENAME">%1$s</xliff:g> je bil blokiran. Za več informacij obiščite g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pozabljen vzorec"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Napačen vzorec"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Napačno geslo"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Bližnjica funkcij za ljudi s posebnimi potrebami je vklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Bližnjica funkcij za ljudi s posebnimi potrebami je izklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Za uporabo storitve <xliff:g id="SERVICE_NAME">%1$s</xliff:g> pritisnite obe tipki za glasnost in ju pridržite tri sekunde"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izberite funkcijo, ki jo želite uporabljati, ko se dotaknete gumba »Dostopnost«:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Če želite spremeniti funkcije, se dotaknite gumba »Dostopnost« in ga pridržite."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Izberite storitev, ki jo želite uporabljati, ko se dotaknete gumba za funkcije za ljudi s posebnimi potrebami:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Izberite storitev, ki jo želite zagnati s potezo za ljudi s posebnimi potrebami (vlečenje z dvema prstoma z dna zaslona navzgor):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Izberite storitev, ki jo želite zagnati s potezo za ljudi s posebnimi potrebami (vlečenje s tremi prsti z dna zaslona navzgor):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Če želite preklopiti med storitvami, pridržite gumb za funkcije za ljudi s posebnimi potrebami."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Če želite preklopiti med storitvami, z dvema prstoma povlecite navzgor in pridržite."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Če želite preklopiti med storitvami, s tremi prsti povlecite navzgor in pridržite."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povečava"</string> <string name="user_switched" msgid="3768006783166984410">"Trenutni uporabnik <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Preklop na uporabnika <xliff:g id="NAME">%1$s</xliff:g> …"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 57136eb76832..0a9cebe8489c 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Telefonatë me Wi-Fi në <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Telefonatat me WiFi me <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Telefonatë me WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Telefonatë me WLAN në <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi në <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Mbivendosja #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", i sigurt"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Kjo nisje e aktivitetit në sfond nga <xliff:g id="PACKAGENAME">%1$s</xliff:g> do të bllokohet në ndërtimet e ardhshme të Q. Shiko g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Nisja e aktivitetit në sfond nga <xliff:g id="PACKAGENAME">%1$s</xliff:g> u bllokua. Shiko g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Harrova motivin"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Motivi është i gabuar"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Fjalëkalim i gabuar"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Shkurtorja e qasshmërisë e aktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Shkurtorja e qasshmërisë e çaktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Shtyp dhe mbaj shtypur të dy butonat e volumit për tre sekonda për të përdorur <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Zgjidh një funksion për ta përdorur kur troket butonin e \"Qasshmërisë\":"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Për të ndryshuar funksionet, prek dhe mbaj butonin e \"Qasshmërisë\"."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Zgjidh një shërbim për ta përdorur kur troket butonin e qasshmërisë:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me dy gishta):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me tre gishta):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Për të kaluar mes shërbimeve, prek dhe mbaj prekur butonin e qasshmërisë."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Për të kaluar mes pajisjeve, rrëshqit shpejt lart me dy gishta dhe mbaje prekur."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Për të kaluar mes pajisjeve, rrëshqit shpejt lart me tre gishta dhe mbaje prekur."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zmadhimi"</string> <string name="user_switched" msgid="3768006783166984410">"Emri i përdoruesit aktual: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="2871009331809089783">"Po kalon në <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 191271580b87..82ee9ef42528 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -132,6 +132,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> позивање преко Wi-Fi-ја"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> – позивање преко Wi-Fi-ја"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN позив"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN позив"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1634,8 +1635,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Постављени елемент бр. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>×<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безбедно"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Ово покретање активности у позадини са <xliff:g id="PACKAGENAME">%1$s</xliff:g> биће блокирано у будућим Q верзијама. Погледајте g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Покретање активности у позадини са <xliff:g id="PACKAGENAME">%1$s</xliff:g> је блокирано. Погледајте g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборављени шаблон"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешан шаблон"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string> @@ -1690,8 +1689,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Пречица за приступачност је укључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Пречица за приступачност је искључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Притисните и задржите оба тастера за јачину звука три секунде да бисте користили <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изаберите функцију која ће се користити када додирнете дугме за приступачност:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Притисните и задржите дугме за приступачност да бисте мењали функције."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Одаберите услугу која ће се користити када додирнете дугме за приступачност:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Одаберите функцију која ће се користити помоћу покрета за приступачност (помоћу два прста превуците нагоре од дна екрана):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Одаберите услугу која ће се користити помоћу покрета за приступачност (помоћу три прста превуците нагоре од дна екрана):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Да бисте прелазили са једне услуге на другу, додирните и задржите дугме за приступачност."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Да бисте прелазили са једне услуге на другу, превуците нагоре помоћу два прста и задржите."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Да бисте прелазили са једне услуге на другу, превуците нагоре помоћу три прста и задржите."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Увећање"</string> <string name="user_switched" msgid="3768006783166984410">"Актуелни корисник <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Пребацивање на <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index e93be4f69648..088fd984a3bc 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-samtal via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Wi-Fi-samtal med <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-samtal"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"WLAN-samtal via <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi via <xliff:g id="SPN">%s</xliff:g>"</string> @@ -295,7 +296,7 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomst till foton, mediefiler och andra filer på enheten?"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"spela in ljud"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g>n</b> behörighet att spela in ljud?"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att spela in ljud?"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Fysiska aktivitet"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"åtkomst till data om fysisk aktivitet"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to åtkomst till data om fysisk aktivitet?"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Överlagring #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", säker"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Denna bakgrundsaktivitet som startar från <xliff:g id="PACKAGENAME">%1$s</xliff:g> blockeras i framtida Q-versioner. Läs mer på g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Start av bakgrundsaktivitet från <xliff:g id="PACKAGENAME">%1$s</xliff:g> blockerades. Läs mer på g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glömt ditt grafiska lösenord?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Fel grafiskt lösenord"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Fel lösenord"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktiverades av Aktivera tillgänglighet snabbt"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> inaktiverades av Aktivera tillgänglighet snabbt"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Tryck och håll båda volymknapparna i tre sekunder för att använda <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Välj en funktion som ska användas när du trycker på tillgänglighetsknappen:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Tryck länge på tillgänglighetsknappen för att ändra funktioner."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Välj en tjänst som ska användas när du trycker på tillgänglighetsknappen:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Välj en tjänst som ska användas med tillgänglighetsrörelsen (svepa uppåt med två fingrar från skärmens nederkant):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Välj en tjänst som ska användas med tillgänglighetsrörelsen (svepa uppåt med tre fingrar från skärmens nederkant):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Byt mellan tjänster genom att trycka länge på tillgänglighetsknappen."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Byt mellan tjänster genom att svepa uppåt med två fingrar och hålla kvar dem."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Byt mellan tjänster genom att svepa uppåt med tre fingrar och hålla kvar dem."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Förstoring"</string> <string name="user_switched" msgid="3768006783166984410">"Nuvarande användare: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Byter till <xliff:g id="NAME">%1$s</xliff:g> …"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 99b64b1348d6..c48668a91461 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Kupiga Simu Kupitia Wi-Fi ya <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Kupiga Simu Kupitia WiFi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Simu ya WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Simu ya WLAN ya <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi ya <xliff:g id="SPN">%s</xliff:g>"</string> @@ -307,7 +308,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie rekodi zako za nambari za simu?"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Simu"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"piga na udhibiti simu"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ipige na kudhibiti simu?"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"Ungependa kuruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> kupiga na kudhibiti simu?"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"Vihisi vya mwili"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"fikia data ya kitambuzi kuhusu alama zako muhimu"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie data ya vitambuzi kuhusu viashiria muhimu vya mwili wako?"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Uwekeleaji #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", salama"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Itazuia shughuli hii ya chinichini inayoanzia <xliff:g id="PACKAGENAME">%1$s</xliff:g> katika miundo ya baadaye ya Q. Angalia g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Imezuia shughuli za chinichini zinazoanzia <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Angalia g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Umesahau Ruwaza"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Mchoro huo si sahihi"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nenosiri Lisilo sahihi"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imewasha <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imezima <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Bonyeza na ushikilie vitufe vyote viwili vya sauti kwa sekunde tatu ili utumie <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Chagua kipengele utakachotumia, ukigusa kitufe cha Ufikivu:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ili kubadilisha vipengele, gusa na ushikilie kitufe cha Ufikivu."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Chagua huduma ya kutumia unapogusa kitufe cha ufikivu:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Chagua huduma ya kutumia pamoja na ishara ya ufikivu (telezesha vidole viwili juu kutoka sehemu ya chini ya skrini):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Chagua huduma ya kutumia pamoja na ishara ya ufikivu (telezesha vidole vitatu juu kutoka sehemu ya chini ya skrini):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Ili ubadilishe kati ya huduma, gusa na ushikilie kitufe cha ufikivu."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Ili ubadilishe kati ya huduma, telezesha vidole viwili juu na ushikilie."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Ili ubadilishe kati ya huduma, telezesha vidole vitatu juu na ushikilie."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ukuzaji"</string> <string name="user_switched" msgid="3768006783166984410">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Inabadili kwenda <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 8bfc80c402fb..5e150c594b2b 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> வைஃபை அழைப்பு"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> வைஃபை அழைப்பு"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN அழைப்பு"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN அழைப்பு"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> வைஃபை"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"மேலோட்ட #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", பாதுகாப்பானது"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>மின் \'பின்னணிச் செயல்பாடுத் தொடக்கம்\' இனிவரும் Q பதிப்புகளில் தடுக்கப்படும். g.co/dev/bgblock என்ற இணைப்பைப் பார்க்கவும்."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>மில் \'பின்னணிச் செயல்பாட்டுத் தொடக்கம்\' தடுக்கப்பட்டுள்ளது. g.co/dev/bgblock என்ற இணைப்பைப் பார்க்கவும்."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"வடிவத்தை மறந்துவிட்டீர்களா"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"தவறான வடிவம்"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"தவறான கடவுச்சொல்"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"அணுகல்தன்மை ஷார்ட்கட்டானது <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐ இயக்கியது"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"அணுகல்தன்மை ஷார்ட்கட்டானது <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐ முடக்கியது"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐப் பயன்படுத்த 3 விநாடிகளுக்கு இரண்டு ஒலியளவு பட்டன்களையும் அழுத்திப் பிடிக்கவும்"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"அணுகல்தன்மை பட்டனைத் தட்டி, பயன்படுத்துவதற்கான அம்சத்தைத் தேர்ந்தெடுக்கவும்:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"அம்சங்களை மாற்ற, அணுகல்தன்மை பட்டனைத் தொட்டுப் பிடித்திருக்கவும்."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"அணுகல்தன்மை பட்டனுக்கான சேவையைத் தேர்வுசெய்யவும்:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"அணுகல்தன்மை சைகைக்கான சேவையைத் தேர்வுசெய்யவும் (இரண்டு விரல்களால் திரையின் கீழிருந்து மேல் நோக்கி ஸ்வைப் செய்யவும்):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"அணுகல்தன்மை சைகைக்கான சேவையைத் தேர்வுசெய்யவும் (மூன்று விரல்களால் திரையின் கீழிருந்து மேல் நோக்கி ஸ்வைப் செய்யவும்):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"சேவைகளுக்கு இடையே மாற அணுகல்தன்மை பட்டனைத் தொட்டுப் பிடிக்கவும்."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"சேவைகளுக்கு இடையே மாற இரண்டு விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"சேவைகளுக்கு இடையே மாற மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"பெரிதாக்கல்"</string> <string name="user_switched" msgid="3768006783166984410">"நடப்பு பயனர் <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>க்கு மாறுகிறது…"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 461af6e1640f..dd65143f547e 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi కాలింగ్"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi కాలింగ్"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN కాల్"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN కాల్"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"అతివ్యాప్తి #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", సురక్షితం"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> నుండి ప్రారంభం అయ్యే నేపథ్య కార్యకలాపం భవిష్యత్తు Q బిల్డ్లలో బ్లాక్ చేయబడుతుంది. See g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> నుండి ప్రారంభం అయ్యే నేపథ్య కార్యకలాపం బ్లాక్ చేయబడింది. See g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"నమూనాను మర్చిపోయాను"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ఆకృతి తప్పు"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"పాస్వర్డ్ తప్పు"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆన్ చేయబడింది"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆఫ్ చేయబడింది"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ని ఉపయోగించడానికి వాల్యూమ్ కీలు రెండింటినీ 3 సెకన్లు నొక్కి ఉంచండి"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"యాక్సెస్ సామర్థ్య బటన్ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్ను ఎంచుకోండి:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ఫీచర్లను మార్చడానికి, యాక్సెస్ సామర్థ్య బటన్ను నొక్కి & పట్టుకోండి."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"యాక్సెసిబిలిటీ బటన్ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్ను ఎంచుకోండి:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక సేవను ఎంచుకోండి (రెండు చేతి వేళ్లతో స్క్రీన్ను కింద నుండి పైకి స్వైప్ చేయండి):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక సేవను ఎంచుకోండి (మూడు చేతి వేళ్లతో స్క్రీన్ను కింద నుండి పైకి స్వైప్ చేయండి):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"సేవల మధ్య మారడానికి, యాక్సెసిబిలిటీ బటన్ను నొక్కి & పట్టుకోండి."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"సేవల మధ్య మారడానికి, రెండు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"సేవల మధ్య మారడానికి, మూడు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"మాగ్నిఫికేషన్"</string> <string name="user_switched" msgid="3768006783166984410">"ప్రస్తుత వినియోగదారు <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>కి మారుస్తోంది…"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 951652231c46..633c38e18703 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"การโทรผ่าน Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"การโทรผ่าน Wi-Fi ของ <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"การโทรผ่าน WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"การโทรผ่าน WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"การวางซ้อน #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ปลอดภัย"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"การเริ่มกิจกรรมในเบื้องหลังจาก <xliff:g id="PACKAGENAME">%1$s</xliff:g> นี้จะถูกบล็อกในบิวด์ Q ในอนาคต โปรดดู g.co/dev/bgblock"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"บล็อกการเริ่มกิจกรรมในเบื้องหลังจาก <xliff:g id="PACKAGENAME">%1$s</xliff:g> แล้ว โปรดดู g.co/dev/bgblock"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ลืมรูปแบบใช่หรือไม่"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"รูปแบบไม่ถูกต้อง"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"รหัสผ่านไม่ถูกต้อง"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ทางลัดการเข้าถึงเปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ทางลัดการเข้าถึงปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"กดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้ 3 วินาทีเพื่อใช้ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การช่วยเหลือพิเศษ\":"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การช่วยเหลือพิเศษ\" ค้างไว้"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"เลือกบริการที่จะใช้เมื่อคุณแตะปุ่มการช่วยเหลือพิเศษ:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"เลือกบริการที่จะใช้กับท่าทางสัมผัสการช่วยเหลือพิเศษ (ใช้ 2 นิ้วเลื่อนขึ้นจากด้านล่างของหน้าจอ):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"เลือกบริการที่จะใช้กับท่าทางสัมผัสการช่วยเหลือพิเศษ (ใช้ 3 นิ้วเลื่อนขึ้นจากด้านล่างของหน้าจอ):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"หากต้องการสลับระหว่างบริการ ให้แตะปุ่มการช่วยเหลือพิเศษค้างไว้"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"หากต้องการสลับระหว่างบริการ ให้ใช้ 2 นิ้วเลื่อนขึ้นค้างไว้"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"หากต้องการสลับระหว่างบริการ ให้ใช้ 3 นิ้วเลื่อนขึ้นค้างไว้"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"การขยาย"</string> <string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="2871009331809089783">"กำลังเปลี่ยนเป็น <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index d102c3cbceaa..714a6ea801da 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Pagtawag Gamit ang Wi-Fi ng <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Pagtawag Gamit ang WiFi ng <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Pagtawag Gamit ang WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Pagtawag Gamit ang WLAN ng <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi ng <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Iba-block ang pagsisimula ng aktibidad sa background na ito mula sa <xliff:g id="PACKAGENAME">%1$s</xliff:g> sa mga Q build sa hinaharap. Tingnan ang g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Na-block ang pagsisimula ng aktibidad sa background mula sa <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Tingnan ang g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nakalimutan ang Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Maling Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Maling Password"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Na-on ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Na-off ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Pindutin nang matagal ang parehong volume key sa loob ng tatlong segundo para magamit ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pumili ng feature na gagamitin kapag na-tap mo ang button ng Pagiging Accessible:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Upang baguhin ang mga feature, pindutin nang matagal ang button ng Pagiging Naa-access."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Pumili ng serbisyong gagamitin kapag na-tap mo ang button ng pagiging accessible:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Pumili ng serbisyong gagamitin sa galaw ng pagiging accessible (pag-swipe pataas mula sa ibaba ng screen gamit ang dalawang daliri):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Pumili ng serbisyong gagamitin sa galaw ng pagiging accessible (pag-swipe pataas mula sa ibaba ng screen gamit ang tatlong daliri):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Para magpalipat-lipat sa mga serbisyo, pindutin nang matagal ang button ng pagiging accessible."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Para magpalipat-lipat sa mga serbisyo, mag-swipe pataas gamit ang dalawang daliri at i-hold."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Para magpalipat-lipat sa mga serbisyo, mag-swipe pataas gamit ang tatlong daliri at i-hold."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pag-magnify"</string> <string name="user_switched" msgid="3768006783166984410">"Kasalukuyang user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Lumilipat kay <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index bbfe7de54420..eaf6bbf7533d 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Kablosuz Çağrı"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Kablosuz Arama"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Üzerinden Çağrı"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Üzerinden Çağrı"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Kablosuz"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Yer Paylaşımı No. <xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", güvenli"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> paketinden bu arka plan etkinliği başlangıcı, ilerideki Q derlemelerinde engellenecek. g.co/dev/bgblock adresini ziyaret edin."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> paketinden arka plan etkinliği başlangıcı engellendi. g.co/dev/bgblock adresini ziyaret edin."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Deseni Unuttunuz mu?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Desen"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifre"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini açtı"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini kapattı"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini kullanmak için her iki ses tuşunu basılı tutun"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Erişilebilirlik düğmesine dokunduğunuzda kullanmak üzere bir özellik seçin:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Özellikleri değiştirmek için Erişilebilirlik düğmesine dokunup basılı tutun."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Erişilebilirlik düğmesine dokunduğunuzda kullanmak üzere bir hizmet seçin:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Erişilebilirlik hareketiyle (iki parmakla ekranın altından yukarı kaydırma) kullanılacak bir hizmet seçin:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Erişilebilirlik hareketiyle (üç parmakla ekranın altından yukarı kaydırma) kullanılacak bir hizmet seçin:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Hizmetler arasında geçiş yapmak erişilebilirlik düğmesine dokunup basılı tutun."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Hizmetler arasında geçiş yapmak için iki parmakla yukarı kaydırıp basılı tutun."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Hizmetler arasında geçiş yapmak için üç parmakla yukarı kaydırıp basılı tutun."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Büyütme"</string> <string name="user_switched" msgid="3768006783166984410">"Geçerli kullanıcı: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> adlı kullanıcıya geçiliyor…"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 2354c6b7bae1..c8c4bfcf7123 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -133,6 +133,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Виклики <xliff:g id="SPN">%s</xliff:g> через Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Дзвінок від абонента <xliff:g id="SPN">%s</xliff:g> через Wi-Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Виклик через WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Виклик <xliff:g id="SPN">%s</xliff:g> через WLAN"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> через Wi-Fi"</string> @@ -1657,8 +1658,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Накладання №<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>х<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безпечний"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Фонову активність пакета <xliff:g id="PACKAGENAME">%1$s</xliff:g> буде заблоковано в майбутніх складаннях Q. Докладніше: g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Фонову активність додатка <xliff:g id="PACKAGENAME">%1$s</xliff:g> заблоковано. Докладніше: g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Не пам’ятаю ключ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильний ключ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Неправильний пароль"</string> @@ -1714,8 +1713,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Ярлик спеціальних можливостей увімкнув <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Ярлик спеціальних можливостей вимкнув <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Щоб скористатися службою <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, утримуйте обидві клавіші гучності впродовж трьох секунд"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Виберіть функцію для кнопки спеціальних можливостей:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Щоб змінити функцію, натисніть і втримуйте кнопку спеціальних можливостей."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Виберіть сервіс для кнопки спеціальних можливостей:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Виберіть сервіс для жесту спеціальних можливостей (проведення двома пальцями знизу вгору):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Виберіть сервіс для жесту спеціальних можливостей (проведення трьома пальцями знизу вгору):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Щоб переключитися між сервісами, натисніть і утримуйте кнопку спеціальних можливостей."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Щоб переключитися між сервісами, проведіть двома пальцями вгору й утримуйте екран."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Щоб переключитися між сервісами, проведіть трьома пальцями вгору й утримуйте екран."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Збільшення"</string> <string name="user_switched" msgid="3768006783166984410">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Перехід в обліковий запис \"<xliff:g id="NAME">%1$s</xliff:g>\"…"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 45d0e86d4902..4d5f05c27fd6 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi کالنگ"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi کالنگ"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN کال"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN کال"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"اوور لے #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"، محفوظ"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> سے شروع ہونے والی پس منظر کی اس سرگرمی کو مستقبل کے Q بلڈز میں مسدود کر دیا جائے گا۔ g.co/dev/bgblock ملاحظہ کریں۔"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> سے شروع ہونے والی پس منظر کی سرگرمی کو مسدود کر دیا گیا ہے۔ g.co/dev/bgblock ملاحظہ کریں۔"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"پیٹرن بھول گئے"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"غلط پیٹرن"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"غلط پاس ورڈ"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آن کر دیا"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آف کر دیا"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> کا استعمال کرنے کے لیے 3 سیکنڈ تک والیوم کی دونوں کلیدوں کو چھوئیں اور دبائے رکھیں"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ایکسیسبیلٹی بٹن پر تھپتھپانے وقت استعمال کرنے کیلئے ایک خصوصیت چنیں:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"خصوصیات تبدیل کرنے کیلئے، ایکسیسبیلٹی بٹن ٹچ کریں اور دبائے رکھیں۔"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"ایکسیسبیلٹی بٹن پر تھپتھپانے وقت استعمال کرنے کیلئے ایک سروس چنیں:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"ایکسیسبیلٹی اشارہ کے ساتھ استعمال کرنے کے لیے ایک سروس چنیں (دو انگلیوں سے اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"ایکسیسبیلٹی اشارہ کے ساتھ استعمال کرنے کے لیے ایک سروس چنیں (تین انگلیوں سے اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"سروسز کے مابین سوئچ کرنے کے لیے، ایکسیسبیلٹی بٹن کو ٹچ کرکے ہولڈ کریں۔"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"سروسز کے مابین سوئچ کرنے کے لیے، دو انگلیوں سے سوائپ کرکے ہولڈ کریں۔"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"سروسز کے مابین سوئچ کرنے کے لیے، تین انگلیوں سے سوائپ کرکے ہولڈ کریں۔"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"میگنیفکیشن"</string> <string name="user_switched" msgid="3768006783166984410">"موجودہ صارف <xliff:g id="NAME">%1$s</xliff:g>۔"</string> <string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> پر سوئچ کیا جا رہا ہے…"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 271c8f95e306..6c1e435673ea 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi chaqiruv"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi chaqiruv"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN chaqiruv"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN chaqiruv"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1612,8 +1613,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Tasvir uzatish #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", xavfsiz"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Keyingi Android Q nashrlarida fondagi ushbu <xliff:g id="PACKAGENAME">%1$s</xliff:g> jarayoni bloklanadi. g.co/dev/bgblock bilan tanishing."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Fondagi <xliff:g id="PACKAGENAME">%1$s</xliff:g> jarayoni bloklandi. g.co/dev/bgblock bilan tanishing."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Grafik kalit esimdan chiqdi"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Grafik kalit xato"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Parol noto‘g‘ri"</string> @@ -1667,8 +1666,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati yoqildi"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati o‘chirib qo‘yildi"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmatidan foydalanish uchun ikkala ovoz balandligi tugmalarini uzoq bosib turing"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan funksiyani tanlang:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funksiyalarni o‘zgartirish uchun Maxsus imkoniyatlar tugmasini bosib turing."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan xizmatni tanlang:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan xizmatni tanlang (2 barmoq bilan ekranning pastidan tepaga surib tortilganda:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan xizmatni tanlang (3 barmoq bilan ekranning pastidan tepaga surib tortilganda:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Xizmatlarni almashtirihs uchun maxsus imkoniyatlar tugmasini bosib turing."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Xizmatlarni almashtirish uchun 2 barmoq bilan tepaga suring va bosib turing."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Xizmatlarni almashtirish uchun 3 barmoq bilan tepaga suring va bosib turing."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Kattalashtirish"</string> <string name="user_switched" msgid="3768006783166984410">"Joriy foydalanuvchi <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Quyidagi foydalanuvchiga o‘tilmoqda: <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index eb147a11c116..7e0e9693e64e 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Gọi qua Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"Gọi qua Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Cuộc gọi qua WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Cuộc gọi qua WLAN <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Lớp phủ #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", an toàn"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Tính năng bắt đầu hoạt động trong nền từ <xliff:g id="PACKAGENAME">%1$s</xliff:g> này sẽ bị chặn ở các bản dựng Q trong tương lai. Hãy xem trang g.co/dev/bgblock để biết thêm chi tiết."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Tính năng bắt đầu hoạt động trong nền từ <xliff:g id="PACKAGENAME">%1$s</xliff:g> đã bị chặn. Hãy xem trang g.co/dev/bgblock để biết thêm chi tiết."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Đã quên hình"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Hình không chính xác"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Mật khẩu sai"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Đã bật phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Đã tắt phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Nhấn và giữ đồng thời cả hai phím âm lượng trong 3 giây để sử dụng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Chọn tính năng sẽ sử dụng khi bạn nhấn nút Hỗ trợ tiếp cận:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Để thay đổi các tính năng, hãy chạm và giữ nút Hỗ trợ tiếp cận."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Chọn dịch vụ sẽ sử dụng khi bạn nhấn vào nút hỗ trợ tiếp cận:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận (vuốt lên từ cuối màn hình bằng 2 ngón tay):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận (vuốt lên từ cuối màn hình bằng 3 ngón tay):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Để chuyển đổi giữa các dịch vụ, hãy chạm và giữ nút hỗ trợ tiếp cận."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Để chuyển đổi giữa các dịch vụ, hãy vuốt lên và giữ bằng 2 ngón tay."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Để chuyển đổi giữa các dịch vụ, hãy vuốt lên và giữ bằng 3 ngón tay."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Phóng to"</string> <string name="user_switched" msgid="3768006783166984410">"Người dùng hiện tại <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Đang chuyển sang <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 7c458dcb2f11..d965d487379c 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> WLAN 通话"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> WLAN 通话"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通话"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通话"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> WLAN"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"叠加视图 #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>:<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>,<xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">",安全"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> 的这类后台活动启动程序会在日后的 Android Q 版本中遭到屏蔽。请参阅 g.co/dev/bgblock。"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"已屏蔽 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 的后台活动启动程序。请参阅 g.co/dev/bgblock。"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘记了图案"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"图案错误"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"密码错误"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"无障碍快捷方式已开启<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"无障碍快捷方式已关闭<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"同时按住两个音量键 3 秒钟即可使用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"选择按下“无障碍”按钮时要使用的功能:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"要更改指定的功能,请触摸并按住“无障碍”按钮。"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"选择按“无障碍”按钮后要使用的服务:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"选择要搭配无障碍手势(用两指从屏幕底部向上滑动)使用的服务:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"选择要搭配无障碍手势(用三指从屏幕底部向上滑动)使用的服务:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"要在多项服务之间切换,请轻触并按住“无障碍”按钮。"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"要在多项服务之间切换,请用两指向上滑动并按住。"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"要在多项服务之间切换,请用三指向上滑动并按住。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大功能"</string> <string name="user_switched" msgid="3768006783166984410">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string> <string name="user_switching_message" msgid="2871009331809089783">"正在切换为<xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 29d62c2bf6a9..86a962fa1525 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通話"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通話"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"重疊效果 #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>:<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>,<xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"(安全)"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"在日後的 Q 版本中,系統將會封鎖這個由 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 啟動的背景活動。請瀏覽 g.co/dev/bgblock。"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"已封鎖 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 啟動的背景活動。請瀏覽 g.co/dev/bgblock。"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖案"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"圖形不對"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"無障礙功能快速鍵已啟用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"無障礙功能快速鍵已停用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"㩒住兩個音量鍵 3 秒就可以用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"請選擇輕按「無障礙功能」按鈕時使用的功能:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"如要變更功能,可按住「無障礙功能」按鈕。"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"請選擇輕按無障礙功能按鈕時使用的服務:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"請選擇透過無障礙手勢 (使用兩隻手指從螢幕底部向上滑動) 使用的服務:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"請選擇透過無障礙手勢 (使用三隻手指從螢幕底部向上滑動) 使用的服務:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"如要在服務之間切換,請按住無障礙功能按鈕。"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"如要在服務之間切換,請使用兩隻手指向上滑動並按住。"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"如要在服務之間切換,請使用三隻手指向上滑動並按住。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大"</string> <string name="user_switched" msgid="3768006783166984410">"目前的使用者是<xliff:g id="NAME">%1$s</xliff:g>。"</string> <string name="user_switching_message" msgid="2871009331809089783">"正在切換至<xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index a2c84c2cc47b..e446c3fa5e02 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通話"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通話"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"第 <xliff:g id="ID">%1$d</xliff:g> 個重疊效果"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>:<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>,<xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"(安全)"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> 的這類背景活動啟動程序會在日後的 Android Q 版本遭到封鎖。請前往 g.co/dev/bgblock 查看詳情。"</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"已封鎖 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 的背景活動啟動程序。請前往 g.co/dev/bgblock 查看詳情。"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖案"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"圖案錯誤"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"無障礙捷徑啟用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"無障礙捷徑停用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"同時按住調低及調高音量鍵三秒即可使用「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"輕觸 [無障礙設定] 按鈕後,選擇你想使用的功能:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"如要變更指派的功能,請按住 [無障礙設定] 按鈕。"</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"選擇輕觸無障礙按鈕後要使用的服務:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"選擇要搭配無障礙手勢 (用兩指從螢幕底部向上滑動) 使用的服務:"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"選擇要搭配無障礙手勢 (用三指從螢幕底部向上滑動) 使用的服務:"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"如要切換不同的服務,請輕觸並按住無障礙按鈕。"</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"如要切換不同的服務,請用兩指向上滑動並按住。"</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"如要切換不同的服務,請用三指向上滑動並按住。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大"</string> <string name="user_switched" msgid="3768006783166984410">"目前的使用者是 <xliff:g id="NAME">%1$s</xliff:g>。"</string> <string name="user_switching_message" msgid="2871009331809089783">"正在切換至<xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 98ec22a266cf..e15c3780c106 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -131,6 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ukushaya kwe-Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> Ukushaya kwe-Wi-Fi"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Ikholi ye-WLAN"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> ikholi ye-WLAN"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> @@ -1611,8 +1612,6 @@ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Isendlalelo #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", kuphephile"</string> - <string name="activity_starter_block_bg_activity_starts_permissive" msgid="6995473033438879646">"Lesi siqalo somsebenzi ongemuva kusukela ku-<xliff:g id="PACKAGENAME">%1$s</xliff:g> sizovinjelwa ekwakhiweni okuzayo kwe-Q. Bona i-g.co/dev/bgblock."</string> - <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="3317816771072146229">"Umsebenzi ongemuva oqala kusukela ku-<xliff:g id="PACKAGENAME">%1$s</xliff:g> uvinjelwe. Bona i-g.co/dev/bgblock."</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ukhohlwe iphethini?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Iphatheni engalungile"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Iphasiwedi engalungile"</string> @@ -1666,8 +1665,12 @@ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Isinqamuleli sokufinyelela sivule i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Isinqamuleli sokufinyelela sivale i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Cindezela uphinde ubambe bobabili okhiye bevolumu ngamasekhondi amathathu ukuze usebenzise i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Khetha isici ozosisebenzisa uma uthepha inkinobho yokufinyelela:"</string> - <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ukuze ushintshe izici, thinta uphinde ubambe inkinobho yokufinyelela."</string> + <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Khetha isevisi ozoyisebenzisa uma uthepha inkinobho yokufinyeleleka:"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Khetha isevisi ezosetshenziswa ngokuthinta kokufinyeleleka (swayiphela phezulu kusukela ngaphansi kwesikrini ngeminwe emibili):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Khetha isevisi ozoyisebenzisa ngokuthinta kokufinyeleleka (swayiphela phezulu kusukela ngaphansi kwesikrini ngeminwe emithathu):"</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Ukuze ushintshe phakathi kwamasevisi, thinta uphinde ubambe inkinobho yokufinyeleleka."</string> + <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Ukuze ushintshe phakathi kwamasevisi, swayiphela phezulu ngeminwe emibili uphinde ubambe."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Ukuze ushintshe phakathi kwamasevisi, swayiphela phezulu ngeminwe emithathu uphinde ubambe."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ukukhuliswa"</string> <string name="user_switched" msgid="3768006783166984410">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="2871009331809089783">"Ishintshela ku-<xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 81accdf82b00..2f301946402b 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1560,7 +1560,8 @@ <flag name="email" value="0x02" /> <!-- Match phone numbers. --> <flag name="phone" value="0x04" /> - <!-- Match map addresses. --> + <!-- Match map addresses. + Deprecated: see {@link android.text.util.Linkify#MAP_ADDRESSES}. --> <flag name="map" value="0x08" /> <!-- Match all patterns (equivalent to web|email|phone|map). --> <flag name="all" value="0x0f" /> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index 3b282650d59e..1dcd389d9d8f 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -79,6 +79,7 @@ <drawable name="input_method_fullscreen_background">#fff9f9f9</drawable> <color name="decor_view_status_guard">#ff000000</color> + <color name="decor_view_status_guard_light">#ffffffff</color> <!-- For date picker widget --> <drawable name="selected_day_background">#ff0092f4</drawable> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 9bd56ad2f91d..14abb77aad7d 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3279,7 +3279,8 @@ various workspace stacks. 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always - opaque. + opaque. + 2 - Nav bar is never forced opaque. --> <integer name="config_navBarOpacityMode">0</integer> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 27a4a46c20dc..9d75654d2a1b 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -766,8 +766,6 @@ <java-symbol type="string" name="display_manager_hdmi_display_name" /> <java-symbol type="string" name="display_manager_overlay_display_name" /> <java-symbol type="string" name="display_manager_overlay_display_secure_suffix" /> - <java-symbol type="string" name="activity_starter_block_bg_activity_starts_permissive" /> - <java-symbol type="string" name="activity_starter_block_bg_activity_starts_enforcing" /> <java-symbol type="string" name="display_manager_overlay_display_title" /> <java-symbol type="string" name="double_tap_toast" /> <java-symbol type="string" name="elapsed_time_short_format_h_mm_ss" /> @@ -1964,6 +1962,7 @@ <java-symbol type="bool" name="show_ongoing_ime_switcher" /> <java-symbol type="color" name="config_defaultNotificationColor" /> <java-symbol type="color" name="decor_view_status_guard" /> + <java-symbol type="color" name="decor_view_status_guard_light" /> <java-symbol type="drawable" name="ic_notification_ime_default" /> <java-symbol type="drawable" name="ic_menu_refresh" /> <java-symbol type="drawable" name="ic_settings" /> @@ -3805,7 +3804,9 @@ <java-symbol type="string" name="chooser_all_apps_button_label" /> <java-symbol type="anim" name="resolver_launch_anim" /> <java-symbol type="style" name="Animation.DeviceDefault.Activity.Resolver" /> - + + <java-symbol type="color" name="decor_view_status_guard_light" /> + <java-symbol type="string" name="config_defaultSupervisionProfileOwnerComponent" /> <java-symbol type="bool" name="config_inflateSignalStrength" /> </resources> diff --git a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java index 707d7b30e09b..1b6560322a13 100644 --- a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java +++ b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java @@ -19,22 +19,13 @@ package android.net; import com.google.caliper.BeforeExperiment; import com.google.caliper.Param; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - public class NetworkStatsBenchmark { - private static final String[] UNDERLYING_IFACES = {"wlan0", "rmnet0"}; + private static final String UNDERLYING_IFACE = "wlan0"; private static final String TUN_IFACE = "tun0"; private static final int TUN_UID = 999999999; @Param({"100", "1000"}) private int mSize; - /** - * Should not be more than the length of {@link #UNDERLYING_IFACES}. - */ - @Param({"1", "2"}) - private int mNumUnderlyingIfaces; private NetworkStats mNetworkStats; @BeforeExperiment @@ -42,10 +33,8 @@ public class NetworkStatsBenchmark { mNetworkStats = new NetworkStats(0, mSize + 2); int uid = 0; NetworkStats.Entry recycle = new NetworkStats.Entry(); - final List<String> allIfaces = getAllIfacesForBenchmark(); // also contains TUN_IFACE. - final int totalIfaces = allIfaces.size(); for (int i = 0; i < mSize; i++) { - recycle.iface = allIfaces.get(i % totalIfaces); + recycle.iface = (i < mSize / 2) ? TUN_IFACE : UNDERLYING_IFACE; recycle.uid = uid; recycle.set = i % 2; recycle.tag = NetworkStats.TAG_NONE; @@ -59,39 +48,22 @@ public class NetworkStatsBenchmark { uid++; } } - - for (int i = 0; i < mNumUnderlyingIfaces; i++) { - recycle.iface = UNDERLYING_IFACES[i]; - recycle.uid = TUN_UID; - recycle.set = NetworkStats.SET_FOREGROUND; - recycle.tag = NetworkStats.TAG_NONE; - recycle.rxBytes = 90000 * mSize; - recycle.rxPackets = 40 * mSize; - recycle.txBytes = 180000 * mSize; - recycle.txPackets = 1200 * mSize; - recycle.operations = 0; - mNetworkStats.addValues(recycle); - } - } - - private String[] getVpnUnderlyingIfaces() { - return Arrays.copyOf(UNDERLYING_IFACES, mNumUnderlyingIfaces); - } - - /** - * Same as {@link #getVpnUnderlyingIfaces}, but also contains {@link #TUN_IFACE}. - */ - private List<String> getAllIfacesForBenchmark() { - List<String> ifaces = new ArrayList<>(); - ifaces.add(TUN_IFACE); - ifaces.addAll(Arrays.asList(getVpnUnderlyingIfaces())); - return ifaces; + recycle.iface = UNDERLYING_IFACE; + recycle.uid = TUN_UID; + recycle.set = NetworkStats.SET_FOREGROUND; + recycle.tag = NetworkStats.TAG_NONE; + recycle.rxBytes = 90000 * mSize; + recycle.rxPackets = 40 * mSize; + recycle.txBytes = 180000 * mSize; + recycle.txPackets = 1200 * mSize; + recycle.operations = 0; + mNetworkStats.addValues(recycle); } public void timeMigrateTun(int reps) { for (int i = 0; i < reps; i++) { NetworkStats stats = mNetworkStats.clone(); - stats.migrateTun(TUN_UID, TUN_IFACE, getVpnUnderlyingIfaces()); + stats.migrateTun(TUN_UID, TUN_IFACE, UNDERLYING_IFACE); } } diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java index 2f442c34f2c1..b1a54dcced46 100644 --- a/core/tests/coretests/src/android/content/ContextTest.java +++ b/core/tests/coretests/src/android/content/ContextTest.java @@ -19,6 +19,7 @@ package android.content; import static org.junit.Assert.assertEquals; import android.app.ActivityThread; +import android.os.UserHandle; import android.view.WindowManager; import androidx.test.InstrumentationRegistry; @@ -58,4 +59,32 @@ public class ContextTest { assertEquals(defaultDisplayContext.getDisplay().getDisplayId(), defaultDisplayContext.getDisplayId()); } + + @Test(expected = NullPointerException.class) + public void testStartActivityAsUserNullIntentNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(null, null); + } + + @Test(expected = NullPointerException.class) + public void testStartActivityAsUserNullIntentNonNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(null, new UserHandle(UserHandle.USER_ALL)); + } + + @Test(expected = NullPointerException.class) + public void testStartActivityAsUserNonNullIntentNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(new Intent(), null); + } + + @Test(expected = RuntimeException.class) + public void testStartActivityAsUserNonNullIntentNonNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(new Intent(), new UserHandle(UserHandle.USER_ALL)); + } } diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 9d5846440a13..cd36ba746a39 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -397,9 +397,6 @@ public class SettingsBackupTest { Settings.Global.POWER_MANAGER_CONSTANTS, Settings.Global.PREFERRED_NETWORK_MODE, Settings.Global.PRIVATE_DNS_DEFAULT_MODE, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_NON_PRIV_CHECK_RELAXED, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_PRIV_CHECK_RELAXED, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_3P_CHECK_RELAXED, Settings.Global.PROVISIONING_APN_ALARM_DELAY_IN_MS, Settings.Global.RADIO_BLUETOOTH, Settings.Global.RADIO_CELL, @@ -495,6 +492,7 @@ public class SettingsBackupTest { Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST, Settings.Global.GAME_DRIVER_ALL_APPS, Settings.Global.GAME_DRIVER_OPT_IN_APPS, + Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS, Settings.Global.GAME_DRIVER_OPT_OUT_APPS, Settings.Global.GAME_DRIVER_BLACKLISTS, Settings.Global.GAME_DRIVER_BLACKLIST, diff --git a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java index db5f82a0a373..80bce264c11b 100644 --- a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java @@ -208,6 +208,36 @@ public class ActionsSuggestionsHelperTest { assertThat(conversationActions.get(2).getAction()).isNull(); } + @Test + public void testDeduplicateActions_nullComponent() { + Bundle phoneExtras = new Bundle(); + Intent phoneIntent = new Intent(Intent.ACTION_DIAL); + ExtrasUtils.putActionIntent(phoneExtras, phoneIntent); + PendingIntent pendingIntent = PendingIntent.getActivity( + InstrumentationRegistry.getTargetContext(), + 0, + phoneIntent, + 0); + Icon icon = Icon.createWithData(new byte[0], 0, 0); + ConversationAction action = + new ConversationAction.Builder(ConversationAction.TYPE_CALL_PHONE) + .setAction(new RemoteAction(icon, "label", "1", pendingIntent)) + .setExtras(phoneExtras) + .build(); + ConversationAction actionWithSameLabel = + new ConversationAction.Builder(ConversationAction.TYPE_CALL_PHONE) + .setAction(new RemoteAction( + icon, "label", "2", pendingIntent)) + .setExtras(phoneExtras) + .build(); + + List<ConversationAction> conversationActions = + ActionsSuggestionsHelper.removeActionsWithDuplicates( + Arrays.asList(action, actionWithSameLabel)); + + assertThat(conversationActions).isEmpty(); + } + public void createLabeledIntentResult_null() { ActionsSuggestionsModel.ActionSuggestion nativeSuggestion = new ActionsSuggestionsModel.ActionSuggestion( diff --git a/core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java b/core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java new file mode 100644 index 000000000000..59148870fa3c --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java @@ -0,0 +1,265 @@ +/* + * 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.internal.os; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.os.DeadObjectException; +import android.os.IBinder; +import android.os.IBinder.DeathRecipient; +import android.os.IInterface; +import android.os.Parcel; +import android.os.RemoteException; +import android.os.ResultReceiver; +import android.os.ShellCallback; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.FileDescriptor; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class BinderDeathDispatcherTest { + private static class MyTarget implements IInterface, IBinder { + public boolean isAlive = true; + public DeathRecipient mRecipient; + + @Override + public String getInterfaceDescriptor() throws RemoteException { + return null; + } + + @Override + public boolean pingBinder() { + return false; + } + + @Override + public boolean isBinderAlive() { + return isAlive; + } + + @Override + public IInterface queryLocalInterface(String descriptor) { + return null; + } + + @Override + public void dump(FileDescriptor fd, String[] args) throws RemoteException { + + } + + @Override + public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException { + + } + + @Override + public void shellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, + String[] args, ShellCallback shellCallback, ResultReceiver resultReceiver) + throws RemoteException { + + } + + @Override + public boolean transact(int code, Parcel data, Parcel reply, int flags) + throws RemoteException { + return false; + } + + @Override + public void linkToDeath(DeathRecipient recipient, int flags) throws RemoteException { + // In any situation, a single binder object should only have at most one death + // recipient. + assertThat(mRecipient).isNull(); + + if (!isAlive) { + throw new DeadObjectException(); + } + + mRecipient = recipient; + } + + @Override + public boolean unlinkToDeath(DeathRecipient recipient, int flags) { + if (!isAlive) { + return false; + } + assertThat(mRecipient).isSameAs(recipient); + mRecipient = null; + return true; + } + + @Override + public IBinder asBinder() { + return this; + } + + public void die() { + isAlive = false; + if (mRecipient != null) { + mRecipient.binderDied(); + } + mRecipient = null; + } + + public boolean hasDeathRecipient() { + return mRecipient != null; + } + } + + @Test + public void testRegisterAndUnregister() { + BinderDeathDispatcher<MyTarget> d = new BinderDeathDispatcher<>(); + + MyTarget t1 = new MyTarget(); + MyTarget t2 = new MyTarget(); + MyTarget t3 = new MyTarget(); + + DeathRecipient r1 = mock(DeathRecipient.class); + DeathRecipient r2 = mock(DeathRecipient.class); + DeathRecipient r3 = mock(DeathRecipient.class); + DeathRecipient r4 = mock(DeathRecipient.class); + DeathRecipient r5 = mock(DeathRecipient.class); + + // Start hooking up. + + // Link 3 recipients to t1 -- only one real recipient will be set. + assertThat(d.linkToDeath(t1, r1)).isEqualTo(1); + assertThat(d.getTargetsForTest().size()).isEqualTo(1); + + assertThat(d.linkToDeath(t1, r2)).isEqualTo(2); + assertThat(d.linkToDeath(t1, r3)).isEqualTo(3); + assertThat(d.getTargetsForTest().size()).isEqualTo(1); + + // Unlink two -- the real recipient is still set. + d.unlinkToDeath(t1, r1); + d.unlinkToDeath(t1, r2); + + assertThat(t1.hasDeathRecipient()).isTrue(); + assertThat(d.getTargetsForTest().size()).isEqualTo(1); + + // Unlink the last one. The real recipient is also unlinked. + d.unlinkToDeath(t1, r3); + assertThat(t1.hasDeathRecipient()).isFalse(); + assertThat(d.getTargetsForTest().size()).isEqualTo(0); + + // Set recipients to t1, t2 and t3. t3 has two. + assertThat(d.linkToDeath(t1, r1)).isEqualTo(1); + assertThat(d.linkToDeath(t2, r1)).isEqualTo(1); + assertThat(d.linkToDeath(t3, r1)).isEqualTo(1); + assertThat(d.linkToDeath(t3, r2)).isEqualTo(2); + + + // They should all have a real recipient. + assertThat(t1.hasDeathRecipient()).isTrue(); + assertThat(t2.hasDeathRecipient()).isTrue(); + assertThat(t3.hasDeathRecipient()).isTrue(); + + assertThat(d.getTargetsForTest().size()).isEqualTo(3); + + // Unlink r1 from t3. t3 still has r2, so it should still have a real recipient. + d.unlinkToDeath(t3, r1); + assertThat(t1.hasDeathRecipient()).isTrue(); + assertThat(t2.hasDeathRecipient()).isTrue(); + assertThat(t3.hasDeathRecipient()).isTrue(); + assertThat(d.getTargetsForTest().size()).isEqualTo(3); + + // Unlink r2 from t3. Now t3 has no real recipient. + d.unlinkToDeath(t3, r2); + assertThat(t3.hasDeathRecipient()).isFalse(); + assertThat(d.getTargetsForTest().size()).isEqualTo(2); + } + + @Test + public void testRegisterAndKill() { + BinderDeathDispatcher<MyTarget> d = new BinderDeathDispatcher<>(); + + MyTarget t1 = new MyTarget(); + MyTarget t2 = new MyTarget(); + MyTarget t3 = new MyTarget(); + + DeathRecipient r1 = mock(DeathRecipient.class); + DeathRecipient r2 = mock(DeathRecipient.class); + DeathRecipient r3 = mock(DeathRecipient.class); + DeathRecipient r4 = mock(DeathRecipient.class); + DeathRecipient r5 = mock(DeathRecipient.class); + + // Hook them up. + + d.linkToDeath(t1, r1); + d.linkToDeath(t1, r2); + d.linkToDeath(t1, r3); + + // r4 is linked then unlinked. It shouldn't be notified. + d.linkToDeath(t1, r4); + d.unlinkToDeath(t1, r4); + + d.linkToDeath(t2, r1); + + d.linkToDeath(t3, r3); + d.linkToDeath(t3, r5); + + assertThat(d.getTargetsForTest().size()).isEqualTo(3); + + // Kill the targets. + + t1.die(); + verify(r1, times(1)).binderDied(); + verify(r2, times(1)).binderDied(); + verify(r3, times(1)).binderDied(); + verify(r4, times(0)).binderDied(); + verify(r5, times(0)).binderDied(); + + assertThat(d.getTargetsForTest().size()).isEqualTo(2); + + reset(r1, r2, r3, r4, r5); + + t2.die(); + verify(r1, times(1)).binderDied(); + verify(r2, times(0)).binderDied(); + verify(r3, times(0)).binderDied(); + verify(r4, times(0)).binderDied(); + verify(r5, times(0)).binderDied(); + + assertThat(d.getTargetsForTest().size()).isEqualTo(1); + + reset(r1, r2, r3, r4, r5); + + t3.die(); + verify(r1, times(0)).binderDied(); + verify(r2, times(0)).binderDied(); + verify(r3, times(1)).binderDied(); + verify(r4, times(0)).binderDied(); + verify(r5, times(1)).binderDied(); + + assertThat(d.getTargetsForTest().size()).isEqualTo(0); + + // Try to register to a dead object -> should return -1. + assertThat(d.linkToDeath(t1, r1)).isEqualTo(-1); + + assertThat(d.getTargetsForTest().size()).isEqualTo(0); + } +} diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml index a4337cc8ce79..a305d48c4633 100644 --- a/data/etc/com.android.systemui.xml +++ b/data/etc/com.android.systemui.xml @@ -54,6 +54,7 @@ <permission name="android.permission.TETHER_PRIVILEGED"/> <permission name="android.permission.UPDATE_APP_OPS_STATS"/> <permission name="android.permission.USE_RESERVED_DISK"/> + <permission name="android.permission.WATCH_APPOPS"/> <permission name="android.permission.WRITE_DREAM_STATE"/> <permission name="android.permission.WRITE_MEDIA_STORAGE"/> <permission name="android.permission.WRITE_SECURE_SETTINGS"/> diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index a640122f2b32..c023e85394f2 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -119,6 +119,8 @@ applications that come with the platform <permission name="android.permission.APPROVE_INCIDENT_REPORTS"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE" /> <permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" /> + <!-- This permission will be removed in R. --> + <permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/> </privapp-permissions> <privapp-permissions package="com.android.phone"> diff --git a/data/keyboards/Vendor_045e_Product_028e.kl b/data/keyboards/Vendor_045e_Product_028e.kl index 301601a1ffdd..e4f48f9fb326 100644 --- a/data/keyboards/Vendor_045e_Product_028e.kl +++ b/data/keyboards/Vendor_045e_Product_028e.kl @@ -22,9 +22,7 @@ key 307 BUTTON_X key 308 BUTTON_Y key 310 BUTTON_L1 key 311 BUTTON_R1 -key 314 BACK -key 315 BUTTON_START -key 316 HOME + key 317 BUTTON_THUMBL key 318 BUTTON_THUMBR @@ -44,3 +42,14 @@ axis 0x05 RTRIGGER # Hat. axis 0x10 HAT_X axis 0x11 HAT_Y + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt + +# Button labeled as "BACK" (left-pointing triangle) +key 314 BUTTON_SELECT + +# The branded "X" button in the center of the controller +key 316 BUTTON_MODE + +# Button labeled as "START" (right-pointing triangle) +key 315 BUTTON_START diff --git a/data/keyboards/Vendor_045e_Product_02d1.kl b/data/keyboards/Vendor_045e_Product_02d1.kl index 5d1637bb012d..086767075941 100644 --- a/data/keyboards/Vendor_045e_Product_02d1.kl +++ b/data/keyboards/Vendor_045e_Product_02d1.kl @@ -13,20 +13,22 @@ # limitations under the License. # -# XBox One USB Controller +# XBox One Controller - Model 1537 - USB # +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + key 304 BUTTON_A key 305 BUTTON_B key 307 BUTTON_X key 308 BUTTON_Y + key 310 BUTTON_L1 key 311 BUTTON_R1 -key 314 BACK -key 315 BUTTON_START -key 316 HOME -key 317 BUTTON_THUMBL -key 318 BUTTON_THUMBR + +# Triggers. +axis 0x02 LTRIGGER +axis 0x05 RTRIGGER # Left and right stick. # The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. @@ -37,10 +39,19 @@ axis 0x01 Y flat 4096 axis 0x03 Z flat 4096 axis 0x04 RZ flat 4096 -# Triggers. -axis 0x02 LTRIGGER -axis 0x05 RTRIGGER +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR # Hat. axis 0x10 HAT_X axis 0x11 HAT_Y + + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Two overlapping rectangles +key 314 BUTTON_SELECT +# Hamburger - 3 parallel lines +key 315 BUTTON_START + +# Xbox key +key 316 BUTTON_MODE diff --git a/data/keyboards/Vendor_045e_Product_02ea.kl b/data/keyboards/Vendor_045e_Product_02ea.kl new file mode 100644 index 000000000000..3b46db2ce930 --- /dev/null +++ b/data/keyboards/Vendor_045e_Product_02ea.kl @@ -0,0 +1,57 @@ +# 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. + +# +# XBox One Controller - Model 1708 - USB +# + +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y + +key 310 BUTTON_L1 +key 311 BUTTON_R1 + +# Triggers. +axis 0x02 LTRIGGER +axis 0x05 RTRIGGER + +# Left and right stick. +# The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. +# This confuses applications that rely on the flat value because the joystick actually +# settles in a flat range of +/- 4096 or so. +axis 0x00 X flat 4096 +axis 0x01 Y flat 4096 +axis 0x03 Z flat 4096 +axis 0x04 RZ flat 4096 + +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +# Hat. +axis 0x10 HAT_X +axis 0x11 HAT_Y + + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Two overlapping rectangles +key 314 BUTTON_SELECT +# Hamburger - 3 parallel lines +key 315 BUTTON_START + +# Xbox key +key 316 BUTTON_MODE diff --git a/data/keyboards/Vendor_045e_Product_02fd.kl b/data/keyboards/Vendor_045e_Product_02fd.kl new file mode 100644 index 000000000000..512f7e134978 --- /dev/null +++ b/data/keyboards/Vendor_045e_Product_02fd.kl @@ -0,0 +1,57 @@ +# 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. + +# +# XBox One Controller - Model 1708 - Bluetooth +# + +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y + +key 310 BUTTON_L1 +key 311 BUTTON_R1 + +# Triggers. +axis 0x0a LTRIGGER +axis 0x09 RTRIGGER + +# Left and right stick. +# The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. +# This confuses applications that rely on the flat value because the joystick actually +# settles in a flat range of +/- 4096 or so. +axis 0x00 X flat 4096 +axis 0x01 Y flat 4096 +axis 0x02 Z flat 4096 +axis 0x05 RZ flat 4096 + +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +# Hat. +axis 0x10 HAT_X +axis 0x11 HAT_Y + + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Two overlapping rectangles +key 158 BUTTON_SELECT +# Hamburger - 3 parallel lines +key 315 BUTTON_START + +# Xbox key +key 172 BUTTON_MODE diff --git a/data/keyboards/Vendor_057e_Product_2009.kl b/data/keyboards/Vendor_057e_Product_2009.kl new file mode 100644 index 000000000000..b36e946a547f --- /dev/null +++ b/data/keyboards/Vendor_057e_Product_2009.kl @@ -0,0 +1,68 @@ +# 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. + +# +# Nintendo Switch Pro Controller - HAC-013 - Bluetooth +# + + +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + +# Button labeled as "Y" but should really produce keycode "X" +key 0x132 BUTTON_X +# Button labeled as "B" but should really produce keycode "A" +key 0x130 BUTTON_A +# Button labeled as "A" but should really produce keycode "B" +key 0x131 BUTTON_B +# Button labeled as "X" but should really product keycode "Y" +key 0x133 BUTTON_Y + +# Button labeled as "L" +key 0x134 BUTTON_L1 +# Button labeled as "R" +key 0x135 BUTTON_R1 + +# No LT / RT axes on this controller. Instead, there are keys. +# Trigger labeled as "ZL" +key 0x136 BUTTON_L2 +# Trigger labeled as "ZR" +key 0x137 BUTTON_R2 + +# Left Analog Stick +axis 0x00 X +axis 0x01 Y +# Right Analog Stick +axis 0x03 Z +axis 0x04 RZ + +# Left stick click (generates linux BTN_SELECT) +key 0x13a BUTTON_THUMBL +# Right stick click (generates linux BTN_START) +key 0x13b BUTTON_THUMBR + +# Hat +axis 0x10 HAT_X +axis 0x11 HAT_Y + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Minus +key 0x138 BUTTON_SELECT +# Plus +key 0x139 BUTTON_START + +# Circle +key 0x13d BUTTON_MODE + +# Home key +key 0x13c HOME diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 32f2fc22acad..b9945cc735d8 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -1757,7 +1757,7 @@ public class GradientDrawable extends Drawable { } int angle = (int) a.getFloat(R.styleable.GradientDrawableGradient_angle, st.mAngle); - st.mAngle = angle % 360; + st.mAngle = ((angle % 360) + 360) % 360; // offset negative angle measures final TypedValue tv = a.peekValue(R.styleable.GradientDrawableGradient_gradientRadius); if (tv != null) { diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index e0ed3e4940a8..b73347b233d7 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -264,6 +264,12 @@ void RenderNode::syncProperties() { } void RenderNode::pushStagingPropertiesChanges(TreeInfo& info) { + if (mPositionListenerDirty) { + mPositionListener = std::move(mStagingPositionListener); + mStagingPositionListener = nullptr; + mPositionListenerDirty = false; + } + // Push the animators first so that setupStartValueIfNecessary() is called // before properties() is trampled by stagingProperties(), as they are // required by some animators. diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h index 23e7a0e60554..c6db7f1ba60d 100644 --- a/libs/hwui/RenderNode.h +++ b/libs/hwui/RenderNode.h @@ -188,11 +188,9 @@ public: virtual void onPositionLost(RenderNode& node, const TreeInfo* info) = 0; }; - // Note this is not thread safe, this needs to be called - // before the RenderNode is used for drawing. - // RenderNode takes ownership of the pointer ANDROID_API void setPositionListener(PositionListener* listener) { - mPositionListener = listener; + mStagingPositionListener = listener; + mPositionListenerDirty = true; } // This is only modified in MODE_FULL, so it can be safely accessed @@ -275,6 +273,8 @@ private: // mDisplayList, not mStagingDisplayList. uint32_t mParentCount; + bool mPositionListenerDirty = false; + sp<PositionListener> mStagingPositionListener; sp<PositionListener> mPositionListener; UsageHint mUsageHint = UsageHint::Unknown; diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index fde0e640d92c..53bc65d711b0 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -24,7 +24,6 @@ import android.content.Context; import android.content.pm.PackageManager; import android.media.audiofx.AudioEffect; import android.media.audiopolicy.AudioMix; -import android.os.Build; import android.util.Log; import java.util.ArrayList; @@ -981,6 +980,8 @@ public class AudioSystem public static native boolean getMasterMono(); /** @hide enables or disables the master mono mode. */ public static native int setMasterMono(boolean mono); + /** @hide enables or disables the RTT mode. */ + public static native int setRttEnabled(boolean enabled); /** @hide returns master balance value in range -1.f -> 1.f, where 0.f is dead center. */ @TestApi diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 8373761962ac..16b01252fb81 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -63,6 +63,7 @@ import com.android.systemui.SystemUIFactory; import com.android.systemui.classifier.FalsingLog; import com.android.systemui.classifier.FalsingManagerFactory; import com.android.systemui.fragments.FragmentHostManager; +import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qs.car.CarQSFragment; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -127,6 +128,7 @@ public class CarStatusBar extends StatusBar implements private SwitchToGuestTimer mSwitchToGuestTimer; private NotificationDataManager mNotificationDataManager; private NotificationClickHandlerFactory mNotificationClickHandlerFactory; + private ScreenLifecycle mScreenLifecycle; // The container for the notifications. private CarNotificationView mNotificationView; @@ -230,6 +232,9 @@ public class CarStatusBar extends StatusBar implements mPowerManagerHelper.connectToCarService(); mSwitchToGuestTimer = new SwitchToGuestTimer(mContext); + + mScreenLifecycle = Dependency.get(ScreenLifecycle.class); + mScreenLifecycle.addObserver(mScreenObserver); } /** @@ -315,7 +320,6 @@ public class CarStatusBar extends StatusBar implements public void showKeyguard() { super.showKeyguard(); updateNavBarForKeyguardContent(); - dismissKeyguardWhenUserSwitcherNotDisplayed(); } /** @@ -978,6 +982,13 @@ public class CarStatusBar extends StatusBar implements } } + final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() { + @Override + public void onScreenTurnedOn() { + dismissKeyguardWhenUserSwitcherNotDisplayed(); + } + }; + // We automatically dismiss keyguard unless user switcher is being shown on the keyguard. private void dismissKeyguardWhenUserSwitcherNotDisplayed() { if (mFullscreenUserSwitcher == null) { @@ -1000,6 +1011,10 @@ public class CarStatusBar extends StatusBar implements * Dismisses the keyguard and shows bouncer if authentication is necessary. */ public void dismissKeyguard() { + // Don't dismiss keyguard when the screen is off. + if (mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_OFF) { + return; + } executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */, true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */); } diff --git a/packages/InputDevices/res/values-hy/strings.xml b/packages/InputDevices/res/values-hy/strings.xml index c7523e391807..64ddf7ac1b20 100644 --- a/packages/InputDevices/res/values-hy/strings.xml +++ b/packages/InputDevices/res/values-hy/strings.xml @@ -40,7 +40,7 @@ <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Եբրայերեն"</string> <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Լիտվերեն"</string> <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Իսպաներեն (Լատինական)"</string> - <string name="keyboard_layout_latvian" msgid="4405417142306250595">"լատիշերեն"</string> + <string name="keyboard_layout_latvian" msgid="4405417142306250595">"լատվիերեն"</string> <string name="keyboard_layout_persian" msgid="3920643161015888527">"պարսկերեն"</string> <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ադրբեջաներեն"</string> <string name="keyboard_layout_polish" msgid="1121588624094925325">"լեհերեն"</string> diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java index 93f24f7881a6..4f85eea13dca 100755 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java @@ -130,18 +130,15 @@ public class InstallInstalling extends AlertActivity { } else { PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); - params.installFlags = PackageManager.INSTALL_FULL_APP; - params.referrerUri = getIntent().getParcelableExtra(Intent.EXTRA_REFERRER); - params.originatingUri = getIntent() - .getParcelableExtra(Intent.EXTRA_ORIGINATING_URI); - params.originatingUid = getIntent().getIntExtra(Intent.EXTRA_ORIGINATING_UID, - UID_UNKNOWN); - params.installerPackageName = - getIntent().getStringExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME); - params.installReason = PackageManager.INSTALL_REASON_USER; - - // Whitelist all restricted permissions. - params.setWhitelistedRestrictedPermissions(null /*permissions*/); + params.setInstallAsInstantApp(false); + params.setReferrerUri(getIntent().getParcelableExtra(Intent.EXTRA_REFERRER)); + params.setOriginatingUri(getIntent() + .getParcelableExtra(Intent.EXTRA_ORIGINATING_URI)); + params.setOriginatingUid(getIntent().getIntExtra(Intent.EXTRA_ORIGINATING_UID, + UID_UNKNOWN)); + params.setInstallerPackageName(getIntent().getStringExtra( + Intent.EXTRA_INSTALLER_PACKAGE_NAME)); + params.setInstallReason(PackageManager.INSTALL_REASON_USER); File file = new File(mPackageURI.getPath()); try { diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index 15100bfddd1b..59b8c8abe575 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -233,7 +233,7 @@ <string-array name="show_non_rect_clip_entries"> <item msgid="993742912147090253">"Desactivat"</item> <item msgid="675719912558941285">"Dibuixa àrea retall no rectangular en blau"</item> - <item msgid="1064373276095698656">"Ressalta ordres de dibuix provats en verd"</item> + <item msgid="1064373276095698656">"Marca ordres de dibuix provats en verd"</item> </string-array> <string-array name="track_frame_time_entries"> <item msgid="2193584639058893150">"Desactivat"</item> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 0347f2d5a3a0..7c03afb30379 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -381,12 +381,12 @@ <string name="power_remaining_settings_home_page" msgid="4845022416859002011">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="6123167166221295462">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration" msgid="8848256785736335185">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, basierend auf deiner Nutzung"</string> - <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, basierend auf deiner Nutzung (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Bei deinem Nutzungsmuster hast du noch ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Bei deinem Nutzungsmuster hast du noch ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> <skip /> - <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen"</string> + <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Bei deinem Nutzungsmuster dürfte der Akku bis ca. <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Bei deinem Nutzungsmuster dürfte der Akku bis ca. <xliff:g id="TIME">%1$s</xliff:g> reichen"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Sollte etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only" msgid="107616694963545745">"Sollte etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen"</string> <string name="power_discharge_by_only_short" msgid="1372817269546888804">"Bis <xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index db43c7562dbc..0401e7fd2d02 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -60,7 +60,7 @@ <string name="speed_label_medium" msgid="3175763313268941953">"Средняя"</string> <string name="speed_label_fast" msgid="7715732164050975057">"Быстрая"</string> <string name="speed_label_very_fast" msgid="2265363430784523409">"Очень быстрая"</string> - <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="DESCRIPTION">%2$s</xliff:g>: <xliff:g id="STATE">%1$s</xliff:g>"</string> + <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> <string name="bluetooth_disconnected" msgid="6557104142667339895">"Нет подключения"</string> <string name="bluetooth_disconnecting" msgid="8913264760027764974">"Отключение..."</string> <string name="bluetooth_connecting" msgid="8555009514614320497">"Подключение..."</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java index 98eb57300f0b..c7380c580e2f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java @@ -132,6 +132,7 @@ public class SignalDrawable extends DrawableWrapper { super.onLevelChange(unpackLevel(packedState)); updateAnimation(); setTintList(ColorStateList.valueOf(mForegroundPaint.getColor())); + invalidateSelf(); return true; } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index e28c612453b4..ab174f47ab20 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -55,6 +55,7 @@ import android.util.ArraySet; import android.util.Log; import android.util.Pair; +import androidx.annotation.GuardedBy; import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; @@ -108,6 +109,14 @@ public class AccessPoint implements Comparable<AccessPoint> { /** The key which identifies this AccessPoint grouping. */ private String mKey; + /** + * Synchronization lock for managing concurrency between main and worker threads. + * + * <p>This lock should be held for all modifications to {@link #mScanResults} and + * {@link #mExtraScanResults}. + */ + private final Object mLock = new Object(); + @IntDef({Speed.NONE, Speed.SLOW, Speed.MODERATE, Speed.FAST, Speed.VERY_FAST}) @Retention(RetentionPolicy.SOURCE) public @interface Speed { @@ -134,12 +143,14 @@ public class AccessPoint implements Comparable<AccessPoint> { } /** The underlying set of scan results comprising this AccessPoint. */ + @GuardedBy("mLock") private final ArraySet<ScanResult> mScanResults = new ArraySet<>(); /** * Extra set of unused scan results corresponding to this AccessPoint for verbose logging * purposes, such as a set of Passpoint roaming scan results when home scans are available. */ + @GuardedBy("mLock") private final ArraySet<ScanResult> mExtraScanResults = new ArraySet<>(); /** @@ -489,8 +500,10 @@ public class AccessPoint implements Comparable<AccessPoint> { if (isVerboseLoggingEnabled()) { builder.append(",rssi=").append(mRssi); - builder.append(",scan cache size=").append(mScanResults.size() - + mExtraScanResults.size()); + synchronized (mLock) { + builder.append(",scan cache size=").append(mScanResults.size() + + mExtraScanResults.size()); + } } return builder.append(')').toString(); @@ -532,18 +545,20 @@ public class AccessPoint implements Comparable<AccessPoint> { */ private boolean updateScores(WifiNetworkScoreCache scoreCache, long maxScoreCacheAgeMillis) { long nowMillis = SystemClock.elapsedRealtime(); - for (ScanResult result : mScanResults) { - ScoredNetwork score = scoreCache.getScoredNetwork(result); - if (score == null) { - continue; - } - TimestampedScoredNetwork timedScore = mScoredNetworkCache.get(result.BSSID); - if (timedScore == null) { - mScoredNetworkCache.put( - result.BSSID, new TimestampedScoredNetwork(score, nowMillis)); - } else { - // Update data since the has been seen in the score cache - timedScore.update(score, nowMillis); + synchronized (mLock) { + for (ScanResult result : mScanResults) { + ScoredNetwork score = scoreCache.getScoredNetwork(result); + if (score == null) { + continue; + } + TimestampedScoredNetwork timedScore = mScoredNetworkCache.get(result.BSSID); + if (timedScore == null) { + mScoredNetworkCache.put( + result.BSSID, new TimestampedScoredNetwork(score, nowMillis)); + } else { + // Update data since the has been seen in the score cache + timedScore.update(score, nowMillis); + } } } @@ -619,12 +634,14 @@ public class AccessPoint implements Comparable<AccessPoint> { mIsScoredNetworkMetered |= score.meteredHint; } } else { - for (ScanResult result : mScanResults) { - ScoredNetwork score = scoreCache.getScoredNetwork(result); - if (score == null) { - continue; + synchronized (mLock) { + for (ScanResult result : mScanResults) { + ScoredNetwork score = scoreCache.getScoredNetwork(result); + if (score == null) { + continue; + } + mIsScoredNetworkMetered |= score.meteredHint; } - mIsScoredNetworkMetered |= score.meteredHint; } } return oldMetering == mIsScoredNetworkMetered; @@ -741,8 +758,10 @@ public class AccessPoint implements Comparable<AccessPoint> { */ public Set<ScanResult> getScanResults() { Set<ScanResult> allScans = new ArraySet<>(); - allScans.addAll(mScanResults); - allScans.addAll(mExtraScanResults); + synchronized (mLock) { + allScans.addAll(mScanResults); + allScans.addAll(mExtraScanResults); + } return allScans; } @@ -766,10 +785,12 @@ public class AccessPoint implements Comparable<AccessPoint> { ScanResult bestResult = null; int bestRssi = UNREACHABLE_RSSI; - for (ScanResult result : mScanResults) { - if (result.level > bestRssi) { - bestRssi = result.level; - bestResult = result; + synchronized (mLock) { + for (ScanResult result : mScanResults) { + if (result.level > bestRssi) { + bestRssi = result.level; + bestResult = result; + } } } @@ -999,8 +1020,7 @@ public class AccessPoint implements Comparable<AccessPoint> { summary.append(mContext.getString(R.string.tap_to_sign_up)); } } else if (isActive()) { - if (mConfig != null && getDetailedState() == DetailedState.CONNECTED - && mIsCarrierAp) { + if (getDetailedState() == DetailedState.CONNECTED && mIsCarrierAp) { // This is the active connection on a carrier AP summary.append(String.format(mContext.getString(R.string.connected_via_carrier), mCarrierName)); @@ -1211,9 +1231,11 @@ public class AccessPoint implements Comparable<AccessPoint> { savedState.putInt(KEY_EAPTYPE, mEapType); if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig); savedState.putParcelable(KEY_WIFIINFO, mInfo); - savedState.putParcelableArray(KEY_SCANRESULTS, - mScanResults.toArray(new Parcelable[mScanResults.size() - + mExtraScanResults.size()])); + synchronized (mLock) { + savedState.putParcelableArray(KEY_SCANRESULTS, + mScanResults.toArray(new Parcelable[mScanResults.size() + + mExtraScanResults.size()])); + } savedState.putParcelableArrayList(KEY_SCOREDNETWORKCACHE, new ArrayList<>(mScoredNetworkCache.values())); if (mNetworkInfo != null) { @@ -1292,8 +1314,10 @@ public class AccessPoint implements Comparable<AccessPoint> { } int oldLevel = getLevel(); - mScanResults.clear(); - mScanResults.addAll(scanResults); + synchronized (mLock) { + mScanResults.clear(); + mScanResults.addAll(scanResults); + } updateBestRssiInfo(); int newLevel = getLevel(); @@ -1324,16 +1348,18 @@ public class AccessPoint implements Comparable<AccessPoint> { void setScanResultsPasspoint( @Nullable Collection<ScanResult> homeScans, @Nullable Collection<ScanResult> roamingScans) { - mExtraScanResults.clear(); - if (!CollectionUtils.isEmpty(homeScans)) { - if (!CollectionUtils.isEmpty(roamingScans)) { - mExtraScanResults.addAll(roamingScans); + synchronized (mLock) { + mExtraScanResults.clear(); + if (!CollectionUtils.isEmpty(homeScans)) { + mIsRoaming = false; + if (!CollectionUtils.isEmpty(roamingScans)) { + mExtraScanResults.addAll(roamingScans); + } + setScanResults(homeScans); + } else if (!CollectionUtils.isEmpty(roamingScans)) { + mIsRoaming = true; + setScanResults(roamingScans); } - mIsRoaming = false; - setScanResults(homeScans); - } else if (!CollectionUtils.isEmpty(roamingScans)) { - mIsRoaming = true; - setScanResults(roamingScans); } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 636808ebcb66..3cd82dfca6b6 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -716,6 +716,9 @@ class SettingsProtoDumpUtil { Settings.Global.GAME_DRIVER_OPT_IN_APPS, GlobalSettingsProto.Gpu.GAME_DRIVER_OPT_IN_APPS); dumpSetting(s, p, + Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS, + GlobalSettingsProto.Gpu.GAME_DRIVER_PRERELEASE_OPT_IN_APPS); + dumpSetting(s, p, Settings.Global.GAME_DRIVER_OPT_OUT_APPS, GlobalSettingsProto.Gpu.GAME_DRIVER_OPT_OUT_APPS); dumpSetting(s, p, diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 7db8969e2e04..4b4912cb1e8a 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -222,6 +222,9 @@ <!-- to change themes - light or dark --> <uses-permission android:name="android.permission.CHANGE_OVERLAY_PACKAGES" /> + <!-- Listen app op changes --> + <uses-permission android:name="android.permission.WATCH_APPOPS" /> + <!-- to read and change hvac values in a car --> <uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE" /> diff --git a/packages/SystemUI/legacy/recents/res/values-de/strings.xml b/packages/SystemUI/legacy/recents/res/values-de/strings.xml index 97a6366eaa8a..4a089bff6b79 100644 --- a/packages/SystemUI/legacy/recents/res/values-de/strings.xml +++ b/packages/SystemUI/legacy/recents/res/values-de/strings.xml @@ -28,7 +28,7 @@ <string name="recents_empty_message" msgid="7967713254531861311">"Keine kürzlich verwendeten Elemente"</string> <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Du hast alles gelöscht"</string> <string name="recents_app_info_button_label" msgid="8732926607391786762">"App-Info"</string> - <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"Bildschirmfixierung"</string> + <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"Bildschirm anpinnen"</string> <string name="recents_search_bar_label" msgid="638132045925945941">"Suchen"</string> <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> konnte nicht gestartet werden."</string> <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> ist im abgesicherten Modus deaktiviert."</string> diff --git a/packages/SystemUI/legacy/recents/res/values-es/strings.xml b/packages/SystemUI/legacy/recents/res/values-es/strings.xml index 43fb3ad74364..8bcfe84a6700 100644 --- a/packages/SystemUI/legacy/recents/res/values-es/strings.xml +++ b/packages/SystemUI/legacy/recents/res/values-es/strings.xml @@ -28,7 +28,7 @@ <string name="recents_empty_message" msgid="7967713254531861311">"No hay elementos recientes"</string> <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Has borrado todo"</string> <string name="recents_app_info_button_label" msgid="8732926607391786762">"Información de la aplicación"</string> - <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fijación de pantalla"</string> + <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fijar pantalla"</string> <string name="recents_search_bar_label" msgid="638132045925945941">"buscar"</string> <string name="recents_launch_error_message" msgid="9107963563503438012">"No se ha podido iniciar la aplicación <xliff:g id="APP">%s</xliff:g>."</string> <string name="recents_launch_disabled_message" msgid="826461671965217243">"La aplicación <xliff:g id="APP">%s</xliff:g> se ha inhabilitado en modo seguro."</string> diff --git a/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java index 79c691cf45e1..a7ccc3a49073 100644 --- a/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java @@ -323,7 +323,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD mColorExtractor = Dependency.get(SysuiColorExtractor.class); mColorExtractor.addOnColorsChangedListener(this); mUsingDarkText = mColorExtractor.getColors(ColorExtractor.TYPE_DARK, - WallpaperManager.FLAG_SYSTEM, true).supportsDarkText(); + WallpaperManager.FLAG_SYSTEM).supportsDarkText(); setTheme(mUsingDarkText ? R.style.RecentsTheme_Wallpaper_Light : R.style.RecentsTheme_Wallpaper); @@ -394,8 +394,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD @Override public void onColorsChanged(ColorExtractor colorExtractor, int which) { if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { - // Recents doesn't care about the wallpaper being visible or not, it always - // wants to scrim with wallpaper colors ColorExtractor.GradientColors colors = mColorExtractor.getNeutralColors(); boolean darkText = colors.supportsDarkText(); if (darkText != mUsingDarkText) { diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml index 9a042228435b..67c4458de2f2 100644 --- a/packages/SystemUI/res-keyguard/values/styles.xml +++ b/packages/SystemUI/res-keyguard/values/styles.xml @@ -111,7 +111,7 @@ <item name="android:colorBackground">@*android:color/background_material_dark</item> </style> - <style name="TextAppearance.Keyguard" parent="Theme.SystemUI"> + <style name="TextAppearance.Keyguard"> <item name="android:textSize">@dimen/widget_title_font_size</item> <item name="android:gravity">center</item> <item name="android:ellipsize">end</item> diff --git a/packages/SystemUI/res/layout/notif_half_shelf.xml b/packages/SystemUI/res/layout/notif_half_shelf.xml index a563bb579540..26c887231349 100644 --- a/packages/SystemUI/res/layout/notif_half_shelf.xml +++ b/packages/SystemUI/res/layout/notif_half_shelf.xml @@ -69,7 +69,7 @@ <Switch android:id="@+id/toggle" - android:layout_height="wrap_content" + android:layout_height="48dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:padding="8dp" /> diff --git a/packages/SystemUI/res/layout/notif_half_shelf_row.xml b/packages/SystemUI/res/layout/notif_half_shelf_row.xml index 1b804556d146..b95d5e9a43f6 100644 --- a/packages/SystemUI/res/layout/notif_half_shelf_row.xml +++ b/packages/SystemUI/res/layout/notif_half_shelf_row.xml @@ -71,7 +71,7 @@ <Switch android:id="@+id/toggle" - android:layout_height="wrap_content" + android:layout_height="48dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:padding="8dp" diff --git a/packages/SystemUI/res/layout/status_bar_notification_section_header.xml b/packages/SystemUI/res/layout/status_bar_notification_section_header.xml index d3eb9aeb1710..eabc5c5f254e 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_section_header.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_section_header.xml @@ -49,6 +49,7 @@ android:text="@string/notification_section_header_gentle" android:textSize="12sp" android:textColor="@color/notification_section_header_label_color" + android:fontFamily="@*android:string/config_headlineFontFamilyMedium" /> <ImageView android:id="@+id/btn_clear_all" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 80cba56ddc6c..ed29a0861432 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Diensverskaffernetwerk verander tans"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Maak batterybesonderhede oop"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> persent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> persent, ongeveer <xliff:g id="TIME">%2$s</xliff:g> oor gegrond op jou gebruik"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Battery laai tans, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Stelselinstellings"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Kennisgewings"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Beweeg na links onder"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Beweeg na regs onder"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Maak toe"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Stelselnavigasie is opgedateer. Gaan na Instellings toe om veranderinge te maak."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Gaan na Instellings toe om stelselnavigasie op te dateer"</string> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index b779ce7c6cea..ae79febe1d87 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"የአገልግሎት አቅራቢ አውታረ መረብን በመቀየር ላይ"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"የባትሪ ዝርዝሮችን ክፈት"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"የባትሪ <xliff:g id="NUMBER">%d</xliff:g> መቶኛ።"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ባትሪ <xliff:g id="PERCENTAGE">%1$s</xliff:g> በመቶ፣ በአጠቃቀምዎ ላይ በመመስረት <xliff:g id="TIME">%2$s</xliff:g> ገደማ ይቀራል"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ባትሪ ኃይል በመሙላት ላይ፣ <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"የስርዓት ቅንብሮች"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"ማሳወቂያዎች"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"የግርጌውን ግራ አንቀሳቅስ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ታችኛውን ቀኝ ያንቀሳቅሱ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"አሰናብት"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"የስርዓት ዳሰሳ ተዘምኗል። ለውጦችን ለማድረግ ወደ ቅንብሮች ይሂዱ።"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"የስርዓት ዳሰሳን ለማዘመን ወደ ቅንብሮች ይሂዱ"</string> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 2381e1691eb4..46d5390c748c 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"جارٍ تغيير شبكة مشغِّل شبكة الجوّال."</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"فتح تفاصيل البطارية"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"مستوى البطارية <xliff:g id="NUMBER">%d</xliff:g> في المائة."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"نسبة الشحن بالبطارية <xliff:g id="PERCENTAGE">%1$s</xliff:g> بالمائة، ويتبقى <xliff:g id="TIME">%2$s</xliff:g> تقريبًا بناءً على استخدامك."</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"جارٍ شحن البطارية، <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"إعدادات النظام."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"الإشعارات."</string> @@ -952,8 +953,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"نقل إلى أسفل يمين الشاشة"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"نقل إلى أسفل اليسار"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"تجاهل"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"تم تحديث التنقل داخل النظام. لإجراء التغييرات، يُرجى الانتقال إلى \"الإعدادات\"."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام"</string> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 7f349eb68920..f7c11a90fdb8 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"বাহক নেটৱৰ্কৰ পৰিৱৰ্তন"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"বেটাৰিৰ বিৱৰণসমূহ খোলক"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ বেটাৰি।"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰী <xliff:g id="PERCENTAGE">%1$s</xliff:g> শতাংশ, প্ৰায় <xliff:g id="TIME">%2$s</xliff:g> বাকী আছে"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"বেটাৰি চ্চাৰ্জ কৰি থকা হৈছে, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> শতাংশ।"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"ছিষ্টেমৰ ছেটিংসমূহ৷"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"জাননীসমূহ।"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"বুটামটো বাওঁফালে নিয়ক"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"তলৰ সোঁফালে নিয়ক"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"অগ্ৰাহ্য কৰক"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 4602bd2df6de..64d2b7e5296d 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operator şəbəkəsinin dəyişilməsi"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Batareya detallarını açın"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batareya <xliff:g id="NUMBER">%d</xliff:g> faizdir."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batareya <xliff:g id="PERCENTAGE">%1$s</xliff:g> faizdir, istifadəyə əsasən təxminən <xliff:g id="TIME">%2$s</xliff:g> qalıb"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batareya doldurulur, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%% faiz."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Sistem parametrləri"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Bildirişlər."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Aşağıya sola köçürün"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Aşağıya sağa köçürün"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Kənarlaşdırın"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Sistem naviqasiyası yeniləndi. Dəyişiklik etmək üçün Ayarlara daxil olun."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Sistem naviqasiyasını yeniləmək üçün Ayarlara keçin"</string> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 75be041dd6e0..70f94f36fbe0 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Promena mreže mobilnog operatera"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Otvori detalje o bateriji"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Baterija je na <xliff:g id="NUMBER">%d</xliff:g> posto."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Baterija je na <xliff:g id="PERCENTAGE">%1$s</xliff:g> posto, preostalo vreme na osnovu korišćenja je <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Baterija se puni, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Sistemska podešavanja."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Obaveštenja."</string> @@ -937,8 +938,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Premesti dole levo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Premesti dole desno"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Odbaci"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigacija sistema je ažurirana. Da biste uneli izmene, idite u Podešavanja."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Idite u Podešavanja da biste ažurirali navigaciju sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 2155b33a4947..0612acb15b85 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -199,6 +199,7 @@ <!-- String.format failed for translation --> <!-- no translation found for accessibility_battery_level (7451474187113371965) --> <skip /> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Зарад акумулятара ў працэнтах: <xliff:g id="PERCENTAGE">%1$s</xliff:g>. Пры такім выкарыстанні яго хопіць прыблізна на <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Зарадка акумулятара: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Сістэмныя налады."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Апавяшчэнні."</string> @@ -944,8 +945,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Перамясціць лявей і ніжэй"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Перамясціць правей і ніжэй"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Адхіліць"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Навігацыя ў сістэме абноўлена. Каб унесці змяненні, перайдзіце ў Налады."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Перайдзіце ў Налады, каб абнавіць параметры навігацыі ў сістэме"</string> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 1e619a82233b..02768d197bc0 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Промяна на мрежата на оператора"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Отваряне на подробностите за батерията"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> процента батерия."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Батерията е на <xliff:g id="PERCENTAGE">%1$s</xliff:g> процента. Още около <xliff:g id="TIME">%2$s</xliff:g> въз основа на използването"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Батерията се зарежда – <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Системни настройки."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Известия."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Преместване долу вляво"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Преместване долу вдясно"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Отхвърляне"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Режимът за навигиране в системата е актуализиран. За да извършите промени, отворете настройките."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Отворете настройките, за да актуализирате режима за навигиране в системата"</string> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 99043416a0ef..8a8687f92da3 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তন করা হচ্ছে"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ব্যাটারির বিশদ বিবরণ খুলুন"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ ব্যাটারি রয়েছে৷"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ব্যাটারি <xliff:g id="PERCENTAGE">%1$s</xliff:g> শতাংশ, বর্তমান ব্যবহারের উপর ভিত্তি করে আর <xliff:g id="TIME">%2$s</xliff:g> চলবে"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ব্যাটারি চার্জ হচ্ছে, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> শতাংশ৷"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"সিস্টেম সেটিংস৷"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"বিজ্ঞপ্তি৷"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"নিচে বাঁদিকে সরান"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"নিচে ডান দিকে সরান"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"খারিজ করুন"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান"</string> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 8a02f16e9058..75e0ba937f8b 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Promjena mreže mobilnog operatera"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Otvori detalje o potrošnji baterije"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Baterija na <xliff:g id="NUMBER">%d</xliff:g> posto."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Baterija je na <xliff:g id="PERCENTAGE">%1$s</xliff:g> posto. Na osnovu vaše potrošnje preostalo vam je otprilike <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Punjenje baterije, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Postavke sistema."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Obavještenja."</string> @@ -939,8 +940,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Pomjeri dolje lijevo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Pomjerite dolje desno"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Odbaci"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigiranje sistemom je ažurirano. Da izvršite promjene, idite u Postavke."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Idite u Postavke da ažurirate navigiranje sistemom"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 4c5272247466..da625facaa20 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"S\'està canviant la xarxa de l\'operador de telefonia mòbil"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Obre els detalls de la bateria"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> per cent de bateria."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> per cent de bateria amb aproximadament <xliff:g id="TIME">%2$s</xliff:g> de temps restant segons l\'ús que en fas"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"La bateria s\'està carregant, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Configuració del sistema."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificacions."</string> @@ -411,10 +412,10 @@ <string name="interruption_level_none_twoline" msgid="3957581548190765889">"Silenci\ntotal"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Només\ninterr. prior."</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Només\nalarmes"</string> - <string name="keyguard_indication_charging_time_wireless" msgid="6959284458466962592">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • S\'està carregant sense fil (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string> - <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • S\'està carregant (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string> + <string name="keyguard_indication_charging_time_wireless" msgid="6959284458466962592">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • S\'està carregant sense fil (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> per completar la càrrega)"</string> + <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • S\'està carregant (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> per completar la càrrega)"</string> <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregant ràpidament (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string> - <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregant lentament (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string> + <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregant lentament (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> per completar la càrrega)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Canvia d\'usuari"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Canvia d\'usuari. Usuari actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Usuari actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mou a baix a l\'esquerra"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mou a baix a la dreta"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Omet"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"S\'ha actualitzat el sistema de navegació. Per fer canvis, ves a Configuració."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Ves a Configuració per actualitzar el sistema de navegació"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 4afe0c524070..5861873429c1 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Probíhá změna sítě operátora"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Otevřít podrobnosti o baterii"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Stav baterie: <xliff:g id="NUMBER">%d</xliff:g> procent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Baterie je nabitá na <xliff:g id="PERCENTAGE">%1$s</xliff:g> %, při vašem používání vydrží ještě <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Baterie se nabíjí. Nabito: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Systémová nastavení."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Oznámení."</string> @@ -942,8 +943,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Přesunout vlevo dolů"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Přesunout vpravo dolů"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Zavřít"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Systémová navigace byla aktualizována. Chcete-li provést změny, přejděte do Nastavení."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Přejděte do Nastavení a aktualizujte systémovou navigaci"</string> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 702fdcf9a729..489b78532ebd 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Skift af mobilnetværk"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Åbn oplysninger om batteri"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri <xliff:g id="NUMBER">%d</xliff:g> procent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batteriniveauet er på <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, så du har ca. <xliff:g id="TIME">%2$s</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batteriet oplades. <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Systemindstillinger."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifikationer."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Flyt ned til venstre"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Flyt ned til højre"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Afvis"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Systemnavigationen blev opdateret. Gå til Indstillinger for at foretage ændringer."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Gå til Indstillinger for at opdatere systemnavigationen"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index a1a01dfdd06c..f495c43db5fa 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -26,7 +26,7 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Benachrichtigungen"</string> <string name="battery_low_title" msgid="9187898087363540349">"Der Akku ist fast leer"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> verbleibend"</string> - <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> ausstehend; noch ca. <xliff:g id="TIME">%2$s</xliff:g>, basierend auf deiner Nutzung"</string> + <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Noch <xliff:g id="PERCENTAGE">%1$s</xliff:g> übrig; bei deinem Nutzungsmuster hast du noch ca. <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> ausstehend; noch ca. <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Noch <xliff:g id="PERCENTAGE">%s</xliff:g>. Der Energiesparmodus ist aktiviert."</string> <string name="invalid_charger" msgid="2741987096648693172">"Aufladen über USB nicht möglich. Verwende das mit dem Gerät gelieferte Ladegerät."</string> @@ -199,6 +199,7 @@ <!-- String.format failed for translation --> <!-- no translation found for accessibility_battery_level (7451474187113371965) --> <skip /> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Akku bei <xliff:g id="PERCENTAGE">%1$s</xliff:g> %, bei deinem Nutzungsmuster hast du noch ca. <xliff:g id="TIME">%2$s</xliff:g>"</string> <!-- String.format failed for translation --> <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) --> <skip /> @@ -936,8 +937,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Nach unten links verschieben"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Nach unten rechts verschieben"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Schließen"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Systemsteuerungseinstellungen wurden angepasst. Änderungen kannst du in den Einstellungen vornehmen."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Gehe zu den Einstellungen, um die Systemsteuerung anzupassen"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 0a8707859b8d..63a16f45fbf9 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Αλλαγή δικτύου εταιρείας κινητής τηλεφωνίας"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Άνοιγμα λεπτομερειών μπαταρίας"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Μπαταρία <xliff:g id="NUMBER">%d</xliff:g> τοις εκατό."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Μπαταρία στο <xliff:g id="PERCENTAGE">%1$s</xliff:g> τοις εκατό. Περίπου <xliff:g id="TIME">%2$s</xliff:g> ακόμη, βάσει της χρήσης σας"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Φόρτιση μπαταρίας, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%% τοις εκατό."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Ρυθμίσεις συστήματος."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Ειδοποιήσεις."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Μετακίνηση κάτω αριστερά"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Μετακίνηση κάτω δεξιά"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Παράβλεψη"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Η πλοήγηση συστήματος ενημερώθηκε. Για να κάνετε αλλαγές, μεταβείτε στις Ρυθμίσεις."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Μεταβείτε στις Ρυθμίσεις για να ενημερώσετε την πλοήγηση συστήματος"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 2b836ec5a87f..db9ed9cdb011 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operator network changing"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Dismiss"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"System navigation updated. To make changes, go to Settings."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Go to Settings to update system navigation"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 3409611c7b53..1a85de5990a7 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operator network changing"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Dismiss"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"System navigation updated. To make changes, go to Settings."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Go to Settings to update system navigation"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 2b836ec5a87f..db9ed9cdb011 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operator network changing"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Dismiss"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"System navigation updated. To make changes, go to Settings."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Go to Settings to update system navigation"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 2b836ec5a87f..db9ed9cdb011 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operator network changing"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Dismiss"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"System navigation updated. To make changes, go to Settings."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Go to Settings to update system navigation"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 416931db3c6c..c176856cc590 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Carrier network changing"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> percent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percent, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"System settings."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 96dd605b3b9c..de09ed88dc6d 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Cambio de proveedor de red"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalles de la batería"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batería <xliff:g id="NUMBER">%d</xliff:g> por ciento"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batería: <xliff:g id="PERCENTAGE">%1$s</xliff:g> por ciento; tiempo restante: aproximadamente <xliff:g id="TIME">%2$s</xliff:g> en función del uso"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Cargando batería: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Configuración del sistema"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificaciones"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Ubicar abajo a la izquierda"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Ubicar abajo a la derecha"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ignorar"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Se actualizó el sistema de navegación. Para hacer cambios, ve a Configuración."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Ve a Configuración para actualizar la navegación del sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 2129bd867ed6..a6bd968ed65f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Cambiando la red del operador"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalles de la batería"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> por ciento de batería"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Queda un <xliff:g id="PERCENTAGE">%1$s</xliff:g> por ciento de batería (<xliff:g id="TIME">%2$s</xliff:g> aproximadamente según tu uso)"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batería cargando (<xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%)."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Ajustes del sistema"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificaciones"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover abajo a la izquierda."</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover abajo a la derecha"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Cerrar"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Se ha actualizado la navegación del sistema. Para hacer cambios, ve a Ajustes."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Ve a Ajustes para actualizar la navegación del sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index c9219e72c911..aa4585544f87 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operaatori võrku muudetakse"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Aku üksikasjade avamine"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Aku: <xliff:g id="NUMBER">%d</xliff:g> protsenti."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Aku protsent <xliff:g id="PERCENTAGE">%1$s</xliff:g>, teie kasutuse põhjal on jäänud ligikaudu <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Akut laetakse (<xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%)."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Süsteemiseaded"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Märguanded"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Teisalda alla vasakule"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Teisalda alla paremale"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Loobu"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Süsteemis navigeerimine on värskendatud. Muutmiseks avage jaotis Seaded."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Süsteemi navigeerimise värskendamiseks avage jaotis Seaded"</string> </resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 9dea61fd8f84..542ec4300864 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operadorearen sarea aldatzen"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Ireki bateriaren xehetasunak"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateriaren karga: <xliff:g id="NUMBER">%d</xliff:g>."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Bateriak ehuneko <xliff:g id="PERCENTAGE">%1$s</xliff:g> dauka kargatuta. Zure erabilera kontuan izanda, <xliff:g id="TIME">%2$s</xliff:g> inguru gelditzen zaizkio."</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Kargatzen ari da bateria. %% <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> arte kargatu da oraingoz."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Sistemaren ezarpenak."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Jakinarazpenak."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Eraman behealdera, ezkerretara"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Eraman behealdera, eskuinetara"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Baztertu"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Eguneratu da sistemaren nabigazioa. Aldaketak egiteko, joan Ezarpenak atalera."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Sistemaren nabigazioa eguneratzeko, joan Ezarpenak atalera"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index e405afe44068..02e017e6f86d 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"تغییر شبکه شرکت مخابراتی"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"باز کردن جزئیات باتری"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"باتری <xliff:g id="NUMBER">%d</xliff:g> درصد."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"باتری <xliff:g id="PERCENTAGE">%1$s</xliff:g> درصد شارژ دارد، براساس مصرفتان تقریباً <xliff:g id="TIME">%2$s</xliff:g> شارژ باقیمانده است"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"در حال شارژ باتری، <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> درصد"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"تنظیمات سیستم."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"اعلانها."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"انتقال به پایین سمت راست"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"انتقال به پایین سمت چپ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"رد کردن"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"پیمایش سیستم بهروزرسانی شد. برای انجام تغییرات به «تنظیمات» بروید."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"برای بهروزرسانی پیمایش سیستم، به «تنظیمات» بروید"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 4e52a4ee491d..85a89eff8494 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operaattorin verkko muuttuu"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Avaa akun tiedot."</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Akun virta <xliff:g id="NUMBER">%d</xliff:g> prosenttia."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Akkua jäljellä <xliff:g id="PERCENTAGE">%1$s</xliff:g> % eli noin <xliff:g id="TIME">%2$s</xliff:g> käyttösi perusteella"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Akku latautuu: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> prosenttia"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Järjestelmän asetukset"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Ilmoitukset"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Siirrä vasempaan alareunaan"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Siirrä oikeaan alareunaan"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ohita"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Järjestelmän navigointitapa vaihdettu. Voit muuttaa sitä asetuksista."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Vaihda järjestelmän navigointitapaa asetuksista"</string> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 4f6c1b561d1b..ae288c9e8d72 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Changer de réseau de fournisseur de services"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Ouvrir les détails de la pile"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Pile : <xliff:g id="NUMBER">%d</xliff:g> pour cent"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Pile chargée à <xliff:g id="PERCENTAGE">%1$s</xliff:g> % (environ <xliff:g id="TIME">%2$s</xliff:g> d\'autonomie en fonction de votre usage)"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"La pile est en cours de charge : <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Paramètres système"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Déplacer dans coin inf. gauche"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Déplacer dans coin inf. droit"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Fermer"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"La navigation système a été mise à jour. Pour apporter des modifications, accédez au menu Paramètres."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Accédez au menu Paramètres pour mettre à jour la navigation système"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 95cd5b6e6e53..4aedbcd992e5 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Modification du réseau de l\'opérateur"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Ouvrir les détails de la batterie"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batterie : <xliff:g id="NUMBER">%d</xliff:g> pour cent"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> pour cent de batterie : il reste environ <xliff:g id="TIME">%2$s</xliff:g>, en fonction de votre utilisation"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batterie en charge : <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Paramètres système"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications"</string> @@ -374,7 +375,7 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'à l\'aube"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"À partir de <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Thème foncé"</string> + <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mode sombre"</string> <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Thème foncé\nÉconomiseur de batterie"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Déplacer en bas à gauche"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Déplacer en bas à droite"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ignorer"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigation système mise à jour. Pour apporter des modifications, accédez aux paramètres."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Accédez aux paramètres pour mettre à jour la navigation système"</string> </resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index cce17d6e231d..9bbb170b7001 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Cambio de rede do operador"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir os detalles da batería"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Carga da batería: <xliff:g id="NUMBER">%d</xliff:g> por cento."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batería: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %, durará <xliff:g id="TIME">%2$s</xliff:g> co uso que adoitas darlle"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"A batería está cargando. Nivel: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Configuración do sistema"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificacións"</string> @@ -389,7 +390,7 @@ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"É posible que se\nsupervise a rede"</string> <string name="description_target_search" msgid="3091587249776033139">"Buscar"</string> <string name="description_direction_up" msgid="7169032478259485180">"Pasa o dedo cara arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> - <string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> + <string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara á esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="1149025108714420281">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos e os emisores de chamada especificados. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos."</string> <string name="zen_alarms_introduction" msgid="4934328096749380201">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover á parte infer. esquerda"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover á parte inferior dereita"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ignorar"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Actualizouse a navegación do sistema. Para facer cambios, vai a Configuración."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Para actualizar a navegación do sistema, vai a Configuración"</string> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 53107f1910e2..2319ad837b82 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"કૅરીઅર નેટવર્કમાં ફેરફાર થઈ રહ્યો છે"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"બૅટરીની વિગતો ખોલો"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"બૅટરી <xliff:g id="NUMBER">%d</xliff:g> ટકા."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"તમારા વપરાશના આધારે બૅટરી <xliff:g id="PERCENTAGE">%1$s</xliff:g> ટકા, જે લગભગ <xliff:g id="TIME">%2$s</xliff:g> સુધી ચાલે તેટલી બચી છે"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"બૅટરી ચાર્જ થઈ રહી છે, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"સિસ્ટમ સેટિંગ્સ."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"નોટિફિકેશનો."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"નીચે ડાબે ખસેડો"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"નીચે જમણે ખસેડો"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"છોડી દો"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"સિસ્ટમ નૅવિગેશન અપડેટ કર્યું. ફેરફારો કરવા માટે, સેટિંગ પર જાઓ."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 92f372593710..7fd092638572 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी का नेटवर्क बदल रहा है"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"बैटरी का विवरण खोलें"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> प्रतिशत बैटरी."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> प्रतिशत बैटरी बची है और आपके इस्तेमाल के हिसाब से यह <xliff:g id="TIME">%2$s</xliff:g> में खत्म हो जाएगी"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"बैटरी चार्ज हो रही है, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"सिस्टम सेटिंग."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचनाएं."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"बाईं ओर सबसे नीचे ले जाएं"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"सबसे नीचे दाईं ओर ले जाएं"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"खारिज करें"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"सिस्टम नेविगेशन अपडेट हो गया. बदलाव करने के लिए \'सेटिंग\' पर जाएं."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"सिस्टम नेविगेशन अपडेट करने के लिए \'सेटिंग\' में जाएं"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 04200c1a0001..28da89ebf72d 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Promjena mreže mobilnog operatera"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Otvaranje pojedinosti o bateriji"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Baterija <xliff:g id="NUMBER">%d</xliff:g> posto."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Baterija je na <xliff:g id="PERCENTAGE">%1$s</xliff:g> posto, još otprilike <xliff:g id="TIME">%2$s</xliff:g> na temelju vaše upotrebe"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Baterija se puni, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> posto."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Postavke sustava."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Obavijesti."</string> @@ -937,8 +938,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Premjesti u donji lijevi kut"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Premjestite u donji desni kut"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Odbaci"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Ažurirana je navigacija sustavom. Možete je promijeniti u Postavkama."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Navigaciju sustavom možete ažurirati u Postavkama"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index cd5de1a2c763..c7eb051e6f72 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Szolgáltatói hálózat váltása"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Az akkumulátorral kapcsolatos részletek megnyitása"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Akkumulátor <xliff:g id="NUMBER">%d</xliff:g> százalék."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Az akkumulátor <xliff:g id="PERCENTAGE">%1$s</xliff:g> százalékon áll, a használati adatok alapján körülbelül <xliff:g id="TIME">%2$s</xliff:g> múlva merül le"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Akkumulátor töltése folyamatban, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> százalék."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Rendszerbeállítások"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Értesítések"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Áthelyezés le és balra"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Áthelyezés le és jobbra"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Elvetés"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"A rendszer-navigáció módja megváltozott. Módosításához nyissa meg a Beállításokat."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"A rendszer-navigációs lehetőségeket a Beállításokban módosíthatja"</string> </resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index be536476f5c3..7d31eca43faa 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Օպերատորի ցանցի փոփոխություն"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Բացել մարտկոցի տվյալները"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Մարտկոցը <xliff:g id="NUMBER">%d</xliff:g> տոկոս է:"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Մարտկոցի լիցքը <xliff:g id="PERCENTAGE">%1$s</xliff:g> տոկոս է և կբավարարի մոտ <xliff:g id="TIME">%2$s</xliff:g>՝ կախված օգտագործման եղանակից:"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Մարտկոցը լիցքավորվում է: Լիցքը <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> տոկոս է:"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Համակարգի կարգավորումներ:"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Ծանուցումներ:"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Տեղափոխել ներքև՝ ձախ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Տեղափոխել ներքև՝ աջ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Փակել"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Համակարգի նավիգացիան թարմացվեց: Փոփոխություններ անելու համար անցեք կարգավորումներ:"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Թարմացրեք համակարգի նավիգացիան կարգավորումներում"</string> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 671f5f741459..f0c9f1e67820 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Jaringan operator berubah"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Membuka detail baterai"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Baterai <xliff:g id="NUMBER">%d</xliff:g> persen."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Baterai <xliff:g id="PERCENTAGE">%1$s</xliff:g> persen, sekitar <xliff:g id="TIME">%2$s</xliff:g> lagi berdasarkan penggunaan Anda"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Mengisi daya baterai, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> persen."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Setelan sistem."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifikasi."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Pindahkan ke kiri bawah"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Pindahkan ke kanan bawah"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Tutup"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigasi sistem diupdate. Untuk melakukan perubahan, buka Setelan."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Buka Setelan untuk mengupdate navigasi sistem"</string> </resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 69cc6932946e..bd160e755f7c 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Skiptir um farsímakerfi"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Opna upplýsingar um rafhlöðu"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> prósent á rafhlöðu."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Rafhlaða í <xliff:g id="PERCENTAGE">%1$s</xliff:g>%, um það bil <xliff:g id="TIME">%2$s</xliff:g> eftir miðað við notkun þína"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Rafhlaða í hleðslu, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Kerfisstillingar."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Tilkynningar."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Færa neðst til vinstri"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Færðu neðst til hægri"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Hunsa"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Kerfisstjórnun uppfærð. Þú getur breytt þessu í stillingunum."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Farðu í stillingar til að uppfæra kerfisstjórnun"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index dfdf5f6a6e43..81670848f203 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Cambio della rete dell\'operatore"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Visualizza i dettagli relativi alla batteria"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batteria: <xliff:g id="NUMBER">%d</xliff:g> percento."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Livello della batteria: <xliff:g id="PERCENTAGE">%1$s</xliff:g> percento. Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batteria in carica, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Impostazioni di sistema."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifiche."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Sposta in basso a sinistra"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Sposta in basso a destra"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ignora"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigazione del sistema aggiornata. Per apportare modifiche, usa le Impostazioni."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Usa le Impostazioni per aggiornare la navigazione del sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 571b37d4af17..3468f01edf9c 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"רשת ספק משתנה"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"פתיחת פרטי סוללה"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> אחוזים של סוללה."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"רמת הטעינה בסוללה: <xliff:g id="PERCENTAGE">%1$s</xliff:g> אחוזים, הזמן הנותר המשוער על סמך השימוש שלך:<xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"טעינת סוללה, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"הגדרות מערכת"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"התראות"</string> @@ -942,8 +943,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"העברה לפינה השמאלית התחתונה"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"העברה לפינה הימנית התחתונה"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"סגירה"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"הניווט במערכת עודכן. אפשר לערוך שינויים דרך ההגדרות."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"יש לעבור להגדרות כדי לעדכן את הניווט במערכת"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index b14d37c0845e..78bb01351d02 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"携帯通信会社のネットワークを変更します"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"電池の詳細情報を開きます"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"電池残量: <xliff:g id="NUMBER">%d</xliff:g>パーセント"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"電池残量: <xliff:g id="PERCENTAGE">%1$s</xliff:g>、およそ <xliff:g id="TIME">%2$s</xliff:g> に電池切れ(使用状況に基づく)"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"電池充電中: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"システム設定。"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"通知。"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"左下に移動"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"右下に移動"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"閉じる"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"システム ナビゲーションを更新しました。変更するには [設定] に移動してください。"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"システム ナビゲーションを更新するには [設定] に移動してください"</string> </resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index a3375cb2bc10..eec2f4b6a2e5 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"ოპერატორის ქსელის შეცვლა"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ბატარეის დეტალების გახსნა"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ბატარეა: <xliff:g id="NUMBER">%d</xliff:g> პროცენტი."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ბატარეა <xliff:g id="PERCENTAGE">%1$s</xliff:g> პროცენტზეა, მოხმარების გათვალისწინებით დარჩა დაახლოებით <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ბატარეა იტენება, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"სისტემის პარამეტრები."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"შეტყობინებები"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ქვევით და მარცხნივ გადატანა"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"გადაანაცვ. ქვემოთ და მარჯვნივ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"დახურვა"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"სისტემური ნავიგაცია განახლდა. ცვლილებების შესატანად გადადით პარამეტრებზე."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"სისტემური ნავიგაციის გასაახლებლად გადადით პარამეტრებზე"</string> </resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 5026b537d9cc..bdb03bc9bb1f 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Оператор желісін өзгерту"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Батарея мәліметтерін ашу"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Батарея <xliff:g id="NUMBER">%d</xliff:g> пайыз."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Батарея заряды: <xliff:g id="PERCENTAGE">%1$s</xliff:g> пайыз. Пайдалануға байланысты шамамен <xliff:g id="TIME">%2$s</xliff:g> уақытқа жетеді."</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Батарея зарядталуда, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Жүйе параметрлері."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Хабарлар."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Төменгі сол жаққа жылжыту"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Төменгі оң жаққа жылжыту"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Жабу"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Жүйе навигациясы жаңартылды. Өзгерту енгізу үшін \"Параметрлер\" бөліміне өтіңіз."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Жүйе навигациясын жаңарту үшін \"Параметрлер\" бөліміне өтіңіз."</string> </resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 935986823c72..13a0f1f7b5b6 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"បណ្តាញក្រុមហ៊ុនសេវាទូរសព្ទកំពុងផ្លាស់ប្តូរ"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"បើកព័ត៌មានលម្អិតអំពីថ្ម"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ថ្ម <xliff:g id="NUMBER">%d</xliff:g> ភាគរយ។"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ថ្ម <xliff:g id="PERCENTAGE">%1$s</xliff:g> ភាគរយ អាចប្រើបានប្រហែល <xliff:g id="TIME">%2$s</xliff:g> ទៀត ផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"កំពុងសាកថ្ម <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> ភាគរយ"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"ការកំណត់ប្រព័ន្ធ។"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"ការជូនដំណឹង។"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងឆ្វេង"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងស្ដាំ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ច្រានចោល"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"បានធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ។ ដើម្បីធ្វើការផ្លាស់ប្ដូរ សូមចូលទៅកាន់ការកំណត់។"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"ចូលទៅកាន់ការកំណត់ ដើម្បីធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ"</string> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index c28b5e20675e..63d9680a1596 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"ವಾಹಕ ನೆಟ್ವರ್ಕ್ ಬದಲಾಯಿಸುವಿಕೆ"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ಬ್ಯಾಟರಿ ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ಬ್ಯಾಟರಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರತಿಶತ."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಬ್ಯಾಟರಿಯು ಪ್ರತಿಶತ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ರಷ್ಟು ಮತ್ತು <xliff:g id="TIME">%2$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ಬ್ಯಾಟರಿ <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> ಪ್ರತಿಶತ ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್ಗಳು."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"ಅಧಿಸೂಚನೆಗಳು."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ಸ್ಕ್ರೀನ್ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ವಜಾಗೊಳಿಸಿ"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index af6f6eb31ee4..e162fa0f2b85 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"이동통신사 네트워크 변경"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"배터리 세부정보 열기"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"배터리 <xliff:g id="NUMBER">%d</xliff:g>퍼센트"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"배터리 <xliff:g id="PERCENTAGE">%1$s</xliff:g>퍼센트, 평소 사용량 기준 약 <xliff:g id="TIME">%2$s</xliff:g> 남음"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"배터리 충전 중, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%입니다."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"시스템 설정"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"알림"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"왼쪽 하단으로 이동"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"오른쪽 하단으로 이동"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"닫기"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"시스템 탐색이 업데이트되었습니다. 변경하려면 설정으로 이동하세요."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"설정으로 이동하여 시스템 탐색을 업데이트하세요."</string> </resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 7f5a011e9a78..eb160f3a20ed 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Байланыш оператору өзгөртүлүүдө"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Батареянын чоо-жайын ачуу"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Батарея <xliff:g id="NUMBER">%d</xliff:g> пайыз."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Батареянын деңгээли <xliff:g id="PERCENTAGE">%1$s</xliff:g> пайыз, колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%2$s</xliff:g> калды"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Батарея кубатталууда, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Система тууралоолору."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Билдирмелер"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Төмөнкү сол жакка жылдыруу"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Төмөнкү оң жакка жылдырыңыз"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Жабуу"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Тутум чабыттоосу жаңыртылды. Өзгөртүү үчүн, Жөндөөлөргө өтүңүз."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Тутум чабыттоосун жаңыртуу үчүн Жөндөөлөргө өтүңүз"</string> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 4a1589d809be..69de4fd39b67 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"ການປ່ຽນເຄືອຂ່າຍຜູ້ໃຫ້ບໍລິການ"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ເປີດລາຍລະອຽດແບັດເຕີຣີ"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ແບັດເຕີຣີ <xliff:g id="NUMBER">%d</xliff:g> ເປີເຊັນ."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ແບັດເຕີຣີ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ເປີເຊັນ, ເຫຼືອປະມານ <xliff:g id="TIME">%2$s</xliff:g> ອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ກຳລັງສາກແບັດເຕີຣີ, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> ເປີເຊັນ."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"ການຕັ້ງຄ່າລະບົບ."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"ການແຈ້ງເຕືອນ."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ຍ້າຍຊ້າຍລຸ່ມ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ຍ້າຍຂວາລຸ່ມ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ປິດໄວ້"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"ອັບເດດການນຳທາງລະບົບແລ້ວ. ເພື່ອປ່ຽນແປງ, ກະລຸນາໄປທີ່ການຕັ້ງຄ່າ."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"ໄປທີ່ການຕັ້ງຄ່າເພື່ອອັບເດດການນຳທາງລະບົບ"</string> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index ab6a04423833..0c444caf25be 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Keičiamas operatoriaus tinklas"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Atidaryti išsamią akumuliatoriaus informaciją"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Akumuliatorius: <xliff:g id="NUMBER">%d</xliff:g> proc."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> proc. akumuliatoriaus energijos – liko maždaug <xliff:g id="TIME">%2$s</xliff:g>, atsižvelgiant į naudojimą"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Įkraunamas akumuliatorius, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Sistemos nustatymai"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Pranešimai."</string> @@ -942,8 +943,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Perkelti į apačią kairėje"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Perkelti į apačią dešinėje"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Atmesti"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Sistemos naršymo funkcijos atnaujintos. Jei norite pakeisti, eikite į skiltį „Nustatymai“."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Eikite į skiltį „Nustatymai“, kad atnaujintumėte sistemos naršymo funkcijas"</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 889629e9034b..876ba845616d 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Mobilo sakaru operatora tīkla mainīšana"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Atvērt akumulatora informāciju"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Akumulators: <xliff:g id="NUMBER">%d</xliff:g> procenti"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$s</xliff:g> procenti. Ņemot vērā lietojumu, atlikušais laiks ir apmēram <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Notiek akumulatora uzlāde, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Sistēmas iestatījumi"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Paziņojumi"</string> @@ -937,8 +938,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Pārvietot apakšpusē pa kreisi"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Pārvietot apakšpusē pa labi"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Nerādīt"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Sistēmas navigācija ir atjaunināta. Lai veiktu izmaiņas, atveriet iestatījumus."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Atveriet iestatījumus, lai atjauninātu sistēmas navigāciju"</string> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index d6f2ae471469..e98d0ab17d94 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Променување на мрежата на операторот"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Отвори ги деталите за батеријата"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Батерија <xliff:g id="NUMBER">%d</xliff:g> проценти."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Батерија <xliff:g id="PERCENTAGE">%1$s</xliff:g> отсто, уште околу <xliff:g id="TIME">%2$s</xliff:g> според вашето користење"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Полнење на батеријата, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Поставки на систем."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Известувања"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Премести долу лево"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Премести долу десно"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Отфрли"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Навигацијата на системот е ажурирана. За да извршите промени, одете во „Поставки“."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Одете во „Поставки“ за да ја ажурирате навигацијата на системот"</string> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 5f4e499cbc9c..7367fa545727 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"കാരിയർ നെറ്റ്വർക്ക് മാറ്റൽ"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ബാറ്ററി വിശദാംശങ്ങൾ തുറക്കുക"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ബാറ്ററി <xliff:g id="NUMBER">%d</xliff:g> ശതമാനം."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ബാറ്ററി <xliff:g id="PERCENTAGE">%1$s</xliff:g> ശതമാനം, നിങ്ങളുടെ ഉപയോഗത്തിൻ്റെ അടിസ്ഥാനത്തിൽ ഏകദേശം <xliff:g id="TIME">%2$s</xliff:g> സമയം കൂടി ശേഷിക്കുന്നു"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ബാറ്ററി ചാർജുചെയ്യുന്നു, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"സിസ്റ്റം ക്രമീകരണങ്ങൾ."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"അറിയിപ്പുകൾ."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ചുവടെ ഇടതുഭാഗത്തേക്ക് നീക്കുക"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ചുവടെ വലതുഭാഗത്തേക്ക് നീക്കുക"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ഡിസ്മിസ് ചെയ്യുക"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക"</string> </resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 4ed8fcc3392e..1f7034813ec7 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Оператор компанийн сүлжээг өөрчилж байна"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Тэжээлийн дэлгэрэнгүй мэдээллийг нээх"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Батерей <xliff:g id="NUMBER">%d</xliff:g> хувьтай."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Батарей <xliff:g id="PERCENTAGE">%1$s</xliff:g> хувьтай байна. Таны хэрэглээнд тулгуурлан ойролцоогоор <xliff:g id="TIME">%2$s</xliff:g> үлдсэн"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Батарейг цэнэглэж байна, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Системийн тохиргоо."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Мэдэгдэл."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Зүүн доош зөөх"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Баруун доош зөөх"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Үл хэрэгсэх"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Системийн навигацыг шинэчиллээ. Өөрчлөхийн тулд Тохиргоо руу очно уу."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Системийн навигацыг шинэчлэхийн тулд Тохиргоо руу очно уу"</string> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 65034a3003cd..48966f06ebe0 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"वाहक नेटवर्क बदलत आहे"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"बॅटरी तपशील उघडा"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"बॅटरी <xliff:g id="NUMBER">%d</xliff:g> टक्के."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"बॅटरी <xliff:g id="PERCENTAGE">%1$s</xliff:g> टक्के, तुमच्या वापराच्या आधारावर सुमारे <xliff:g id="TIME">%2$s</xliff:g> शिल्लक आहे"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"बॅटरी चार्ज होत आहे, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> टक्के."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"सिस्टम सेटिंग्ज."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचना."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"तळाशी डावीकडे हलवा"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"तळाशी उजवीकडे हलवा"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"डिसमिस करा"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा"</string> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 9669077d2afc..d0f9448c32d8 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Rangkaian pembawa berubah"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Buka butiran bateri"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateri <xliff:g id="NUMBER">%d</xliff:g> peratus."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Bateri <xliff:g id="PERCENTAGE">%1$s</xliff:g> peratus, tinggal kira-kira <xliff:g id="TIME">%2$s</xliff:g> lagi berdasarkan penggunaan anda"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Bateri mengecas, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> peratus."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Tetapan sistem."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Pemberitahuan."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Alihkan ke bawah sebelah kiri"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Alihkan ke bawah sebelah kanan"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ketepikan"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigasi sistem dikemas kini. Untuk membuat perubahan, pergi ke Tetapan."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Pergi ke Tetapan untuk mengemas kini navigasi sistem"</string> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 3734536b39c4..650f35e30353 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"ဝန်ဆောင်မှုပေးသူ ကွန်ရက် ပြောင်းလဲနေသည်။"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ဘက်ထရီ အသေးစိတ် အချက်အလက်များကို ဖွင့်ပါ"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ဘတ္တရီ <xliff:g id="NUMBER">%d</xliff:g> ရာခိုင်နှုန်း။"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ဘက်ထရီ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ရာခိုင်နှုန်း၊ သင်၏ အသုံးပြုမှုအပေါ် မူတည်၍ <xliff:g id="TIME">%2$s</xliff:g> ခန့်ကျန်သည်"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ဘက်ထရီအားသွင်းနေသည်၊ <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%။"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"စနစ်အပြင်အဆင်များ"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"အကြောင်းကြားချက်များ။"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ဘယ်အောက်ခြေသို့ ရွှေ့ရန်"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ညာအောက်ခြေသို့ ရွှေ့ပါ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ပယ်ရန်"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ပြီးပါပြီ။ အပြောင်းအလဲများ ပြုလုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ။"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index c10bc376ed1e..c24fee530afe 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Bytting av operatørnettverk"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Åpne informasjon om batteriet"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri – <xliff:g id="NUMBER">%d</xliff:g> prosent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batterinivået er <xliff:g id="PERCENTAGE">%1$s</xliff:g> prosent – omtrent <xliff:g id="TIME">%2$s</xliff:g> gjenstår basert på bruken din"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batteriet lades – <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> prosent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Systeminnstillinger."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Varsler."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Flytt til nederst til venstre"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Flytt til nederst til høyre"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Avvis"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Systemnavigeringen er oppdatert. For å gjøre endringer, gå til Innstillinger."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Gå til Innstillinger for å oppdatere systemnavigeringen"</string> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 239e207d2976..4f6ffa5341c7 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"सेवा प्रदायकको नेटवर्क परिवर्तन गर्ने आइकन"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ब्याट्री सम्बन्धी विवरणहरूलाई खोल्नुहोस्"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ब्याट्री <xliff:g id="NUMBER">%d</xliff:g> प्रतिशत"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ब्याट्रीको चार्ज <xliff:g id="PERCENTAGE">%1$s</xliff:g> प्रतिशत छ, तपाईंको प्रयोगका आधारमा <xliff:g id="TIME">%2$s</xliff:g> बाँकी छ"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ब्याट्री चार्ज हुँदैछ, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> प्रतिशत।"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"प्रणाली सेटिङहरू"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचनाहरू।"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"पुछारमा बायाँतिर सार्नुहोस्"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"पुछारमा दायाँतिर सार्नुहोस्"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"हटाउनुहोस्"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्"</string> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 59cbdaa6066f..8a9061a35732 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Netwerk van provider wordt gewijzigd"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Accudetails openen"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batterij: <xliff:g id="NUMBER">%d</xliff:g> procent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batterij op <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, nog ongeveer <xliff:g id="TIME">%2$s</xliff:g> op basis van je gebruik"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batterij wordt opgeladen, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%% procent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Systeeminstellingen."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Meldingen."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Naar linksonder verplaatsen"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Naar rechtsonder verplaatsen"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Sluiten"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Systeemnavigatie geüpdatet. Als je wijzigingen wilt aanbrengen, ga je naar Instellingen."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Ga naar Instellingen om de systeemnavigatie te updaten"</string> </resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 2aa9c9689827..71eca7465981 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"କେରିଅର୍ ନେଟ୍ୱର୍କ ବଦଳୁଛି"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ବ୍ୟାଟେରୀ ବିବରଣୀ ଖୋଲନ୍ତୁ"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ବ୍ୟାଟେରୀ <xliff:g id="NUMBER">%d</xliff:g> ଶତକଡ଼ା ଅଛି।"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ବ୍ୟାଟେରୀ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ଶତକଡା, ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି ପାଖାପାଖି <xliff:g id="TIME">%2$s</xliff:g> ବାକି ଅଛି"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ବ୍ୟାଟେରୀ ଚାର୍ଜ ହେଉଛି, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> ଶତକଡ଼ା।"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ।"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"ବିଜ୍ଞପ୍ତି"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ତଳ ବାମକୁ ନିଅନ୍ତୁ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ଖାରଜ କରନ୍ତୁ"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ।"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ"</string> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 86c04d4449b0..4be4ca3c595c 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"ਕੈਰੀਅਰ ਨੈੱਟਵਰਕ ਦੀ ਬਦਲੀ"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"ਬੈਟਰੀ ਵੇਰਵੇ ਖੋਲ੍ਹੋ"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"ਬੈਟਰੀ <xliff:g id="NUMBER">%d</xliff:g> ਪ੍ਰਤੀਸ਼ਤ ਹੈ।"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"ਬੈਟਰੀ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ਫ਼ੀਸਦ, ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%2$s</xliff:g> ਬਾਕੀ"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ਬੈਟਰੀ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> ਪ੍ਰਤੀਸ਼ਤ।"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ।"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"ਸੂਚਨਾਵਾਂ।"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ਹੇਠਾਂ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ਖਾਰਜ ਕਰੋ"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index ec055005aa04..29c423af0cfb 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -199,6 +199,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Zmiana sieci operatora"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Zobacz szczegóły baterii"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateria: <xliff:g id="NUMBER">%d</xliff:g> procent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Bateria <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, jeszcze <xliff:g id="TIME">%2$s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Ładuję baterię, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> procent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Ustawienia systemu."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Powiadomienia."</string> @@ -944,8 +945,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Przenieś w lewy dolny róg"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Przenieś w prawy dolny róg"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Zamknij"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Nawigacja w systemie została zaktualizowana. Aby wprowadzić zmiany, otwórz Ustawienia."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Otwórz Ustawienia, by zaktualizować nawigację w systemie"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index a7d85ab8b524..4d6551269bd7 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Alteração de rede da operadora"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalhes da bateria"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateria em <xliff:g id="NUMBER">%d</xliff:g> por cento."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Bateria com <xliff:g id="PERCENTAGE">%1$s</xliff:g> de carga, tempo restante aproximado, com base no seu uso: <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Bateria carregando: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Configurações do sistema"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificações."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover para canto inferior esquerdo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover para canto inferior direito"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Dispensar"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Acesse as configurações para atualizar a navegação no sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 4260dc203991..4a08f2e69f0f 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Rede do operador em mudança."</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalhes da bateria"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateria a <xliff:g id="NUMBER">%d</xliff:g> por cento."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Bateria a <xliff:g id="PERCENTAGE">%1$s</xliff:g> por cento, resta(m) cerca de <xliff:g id="TIME">%2$s</xliff:g> com base na sua utilização."</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"A bateria está a carregar, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> por cento."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Definições do sistema"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificações."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover p/ parte infer. esquerda"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover parte inferior direita"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ignorar"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"A navegação no sistema foi atualizada. Para efetuar alterações, aceda às Definições."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Aceda às Definições para atualizar a navegação no sistema."</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index a7d85ab8b524..4d6551269bd7 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Alteração de rede da operadora"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalhes da bateria"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateria em <xliff:g id="NUMBER">%d</xliff:g> por cento."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Bateria com <xliff:g id="PERCENTAGE">%1$s</xliff:g> de carga, tempo restante aproximado, com base no seu uso: <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Bateria carregando: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Configurações do sistema"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificações."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover para canto inferior esquerdo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover para canto inferior direito"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Dispensar"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Acesse as configurações para atualizar a navegação no sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 31709b66f2e9..5fa5233b5104 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Se schimbă rețeaua operatorului"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Deschideți detaliile privind bateria"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Baterie: <xliff:g id="NUMBER">%d</xliff:g> la sută."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Procentul rămas din baterie este <xliff:g id="PERCENTAGE">%1$s</xliff:g>. În baza utilizării, timpul rămas este de aproximativ <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Se încarcă bateria, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Setări de sistem."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificări."</string> @@ -937,8 +938,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mutați în stânga jos"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mutați în dreapta jos"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Închideți"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigarea în sistem a fost actualizată. Pentru a face modificări, accesați Setările."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Accesați Setările pentru a actualiza navigarea în sistem"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 6c926f121a5f..c03c108613f3 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Сменить сеть"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Сведения о расходе заряда батареи"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Заряд батареи в процентах: <xliff:g id="NUMBER">%d</xliff:g>."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Заряд батареи – <xliff:g id="PERCENTAGE">%1$s</xliff:g> %. При текущем уровне расхода его хватит примерно на такое время: <xliff:g id="TIME">%2$s</xliff:g>."</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Зарядка батареи. Текущий заряд: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Настройки"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Уведомления"</string> @@ -942,8 +943,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Перенести в левый нижний угол"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Перенести в правый нижний угол"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Закрыть"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Параметры навигации в системе обновлены. Чтобы изменить их, перейдите в настройки."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Чтобы обновить параметры навигации в системе, перейдите в настройки."</string> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index aee39fd0b10d..f347e03dd440 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"වාහක ජාලය වෙනස් වෙමින්"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"බැටරි විස්තර විවෘත කරන්න"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"බැටරි ප්රතිශතය <xliff:g id="NUMBER">%d</xliff:g>"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"බැටරි ප්රතිශතය <xliff:g id="PERCENTAGE">%1$s</xliff:g>, ඔබේ භාවිතයට අනුව <xliff:g id="TIME">%2$s</xliff:g> ක් පමණ ඉතුරුයි"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"බැටරිය ආරෝපණය කරමින්, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"පද්ධති සැකසීම්."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"දැනුම්දීම්."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"පහළ වමට ගෙන යන්න"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"පහළ දකුණට ගෙන යන්න"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ඉවතලන්න"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"පද්ධති සංචලනය යාවත්කාලීන කළා. වෙනස්කම් සිදු කිරීමට, සැකසීම් වෙත යන්න."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"පද්ධති සංචලනය යාවත්කාලීන කිරීමට සැකසීම් වෙත යන්න"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 6bb9dfec5548..18a7b386e5bb 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Mení sa sieť operátora"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Otvoriť podrobnosti o batérii"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batéria <xliff:g id="NUMBER">%d</xliff:g> percent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Percentá batérie: <xliff:g id="PERCENTAGE">%1$s</xliff:g>. Na základe vášho používania zostáva <xliff:g id="TIME">%2$s</xliff:g>."</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Nabíja sa batéria, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Nastavenia systému."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Upozornenia."</string> @@ -942,8 +943,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Presunúť doľava nadol"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Presunúť doprava nadol"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Zavrieť"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigácia v systéme bola aktualizovaná. Ak chcete vykonať zmeny, prejdite do Nastavení."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Prejdite do Nastavení a aktualizujte navigáciu v systéme"</string> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index efd73d807b43..e8a98899e65f 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Spreminjanje omrežja operaterja"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Odpiranje podrobnosti o akumulatorju"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Baterija <xliff:g id="NUMBER">%d</xliff:g> odstotkov."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Napolnjenost akumulatorja je <xliff:g id="PERCENTAGE">%1$s</xliff:g>, glede na način uporabe imate na voljo še približno <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Polnjenje akumulatorja, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Sistemske nastavitve."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Obvestila."</string> @@ -942,8 +943,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Premakni spodaj levo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Premakni spodaj desno"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Opusti"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Krmarjenje po sistemu je posodobljeno. Če želite opraviti spremembe, odprite nastavitve."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Če želite posodobiti krmarjenje po sistemu, odprite nastavitve"</string> </resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 091c5402c339..a2694b8d3106 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Rrjeti i operatorit celular po ndryshohet"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Hap detajet e baterisë"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateria ka edhe <xliff:g id="NUMBER">%d</xliff:g> për qind."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Bateria <xliff:g id="PERCENTAGE">%1$s</xliff:g> përqind, rreth <xliff:g id="TIME">%2$s</xliff:g> të mbetura bazuar në përdorimin tënd"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Bateria po karikohet, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Cilësimet e sistemit."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Njoftimet."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Zhvendos poshtë majtas"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Lëvize poshtë djathtas"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Hiq"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Navigimi i sistemit u përditësua. Për të bërë ndryshime, shko te \"Cilësimet\"."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Shko te \"Cilësimet\" për të përditësuar navigimin e sistemit"</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 02986777cfb1..69149913baa4 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Промена мреже мобилног оператера"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Отвори детаље о батерији"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Батерија је на <xliff:g id="NUMBER">%d</xliff:g> посто."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Батерија је на <xliff:g id="PERCENTAGE">%1$s</xliff:g> посто, преостало време на основу коришћења је <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Батерија се пуни, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Системска подешавања."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Обавештења."</string> @@ -937,8 +938,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Премести доле лево"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Премести доле десно"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Одбаци"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Навигација система је ажурирана. Да бисте унели измене, идите у Подешавања."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Идите у Подешавања да бисте ажурирали навигацију система"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index cca609b42a33..6a9d3d3f902e 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Byter leverantörsnätverk"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Visa uppgifter om batteri"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri <xliff:g id="NUMBER">%d</xliff:g> procent."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batteri: <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, cirka <xliff:g id="TIME">%2$s</xliff:g> kvar utifrån din användning"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batteriet laddas, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> procent."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Systeminställningar."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Meddelanden."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Flytta längst ned till vänster"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Flytta längst ned till höger"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Stäng"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Systemnavigeringen har uppdaterats. Öppna inställningarna om du vill ändra något."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Öppna inställningarna och uppdatera systemnavigeringen"</string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index b4177fc1478d..0acb60185e3b 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Mabadiliko katika mtandao wa mtoa huduma"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Fungua maelezo ya betri"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Asilimia <xliff:g id="NUMBER">%d</xliff:g> ya betri"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Betri ina asilimia <xliff:g id="PERCENTAGE">%1$s</xliff:g>, zimesalia takribani <xliff:g id="TIME">%2$s</xliff:g> kulingana na jinsi unavyoitumia"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Betri inachaji, asilimia <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Mipangilio ya mfumo."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Arifa."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Sogeza chini kushoto"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Sogeza chini kulia"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Ondoa"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Umesasisha usogezaji kwenye mfumo. Ili ufanye mabadiliko, nenda kwenye Mipangilio."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Nenda kwenye mipangilio ili usasishe usogezaji kwenye mfumo"</string> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index bfca4766f17c..600c7671c016 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"மொபைல் நிறுவன நெட்வொர்க்கை மாற்றும்"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"பேட்டரி விவரங்களைத் திறக்கும்"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"பேட்டரி சக்தி <xliff:g id="NUMBER">%d</xliff:g> சதவிகிதம் உள்ளது."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"பேட்டரி: <xliff:g id="PERCENTAGE">%1$s</xliff:g> சதவீதம், உபயோகத்தின் அடிப்படையில் <xliff:g id="TIME">%2$s</xliff:g> மீதமுள்ளது"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"பேட்டரி சார்ஜ் செய்யப்படுகிறது, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> சதவீதம்."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"கணினி அமைப்பு."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"அறிவிப்புகள்."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"கீழே இடப்புறமாக நகர்த்து"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"கீழே வலதுபுறமாக நகர்த்து"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"மூடுக"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"சிஸ்டம் நேவிகேஷன் மாற்றப்பட்டது. மாற்றங்களைச் செய்ய ‘அமைப்புகளுக்குச்’ செல்லவும்."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"சிஸ்டம் நேவிகேஷனை மாற்ற ’அமைப்புகளுக்குச்’ செல்லவும்"</string> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 657e57764e06..d57647506de6 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"క్యారియర్ నెట్వర్క్ మారుతోంది"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"బ్యాటరీ వివరాలను తెరుస్తుంది"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"బ్యాటరీ <xliff:g id="NUMBER">%d</xliff:g> శాతం."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"బ్యాటరీ <xliff:g id="PERCENTAGE">%1$s</xliff:g> శాతం ఉంది, మీ వినియోగాన్ని బట్టి <xliff:g id="TIME">%2$s</xliff:g> పని చేస్తుంది"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"బ్యాటరీ ఛార్జ్ అవుతోంది, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> %%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"సిస్టమ్ సెట్టింగ్లు."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"నోటిఫికేషన్లు."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"దిగువ ఎడమవైపునకు తరలించు"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"దిగవు కుడివైపునకు జరుపు"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"విస్మరించు"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"సిస్టమ్ నావిగేషన్ అప్డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్లకు వెళ్లండి."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"సిస్టమ్ నావిగేషన్ను అప్డేట్ చేయడానికి సెట్టింగ్లకు వెళ్లండి"</string> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index f377c34f2416..81c6e0d8196e 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"การเปลี่ยนเครือข่ายผู้ให้บริการ"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"เปิดรายละเอียดแบตเตอรี่"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"แบตเตอรี่ <xliff:g id="NUMBER">%d</xliff:g> เปอร์เซ็นต์"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"แบตเตอรี่ <xliff:g id="PERCENTAGE">%1$s</xliff:g> เปอร์เซ็นต์ ใช้ได้อีกประมาณ <xliff:g id="TIME">%2$s</xliff:g> ทั้งนี้ขึ้นอยู่กับการใช้งานของคุณ"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"กำลังชาร์จแบตเตอรี่ <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> เปอร์เซ็นต์"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"การตั้งค่าระบบ"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"การแจ้งเตือน"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ย้ายไปด้านซ้ายล่าง"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ย้ายไปด้านขาวล่าง"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"ปิด"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"อัปเดตการไปยังส่วนต่างๆ ของระบบแล้ว หากต้องการเปลี่ยนแปลง ให้ไปที่การตั้งค่า"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"ไปที่การตั้งค่าเพื่ออัปเดตการไปยังส่วนต่างๆ ของระบบ"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 90c7ab76359a..f89061ead1a3 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Nagpapalit ng carrier network"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Buksan ang mga detalye ng baterya"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Baterya <xliff:g id="NUMBER">%d</xliff:g> (na) porsyento."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> (na) porsyento ang baterya, nasa <xliff:g id="TIME">%2$s</xliff:g> ang natitira batay sa paggamit mo"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Nagcha-charge ang baterya, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> (na) porsyento."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Mga setting ng system."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Mga Notification."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Ilipat sa kaliwa sa ibaba"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Ilipat sa kanan sa ibaba"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"I-dismiss"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Na-update na ang pag-navigate ng system. Para gumawa ng mga pagbabago, pumunta sa Mga Setting."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Pumunta sa Mga Setting para i-update ang pag-navigate sa system"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 4432b41dda26..63d9f102d017 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Operatör ağı değiştiriliyor"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Pil ayrıntılarını aç"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Pil yüzdesi: <xliff:g id="NUMBER">%d</xliff:g>"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Pil yüzde <xliff:g id="PERCENTAGE">%1$s</xliff:g> dolu. Kullanımınıza göre yaklaşık <xliff:g id="TIME">%2$s</xliff:g> süresi kaldı"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Pil şarj oluyor, yüzde <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Sistem ayarları."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Bildirimler."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Sol alta taşı"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Sağ alta taşı"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Kapat"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Sistemde gezinme yöntemi güncellendi. Değişiklik yapmak için Ayarlar\'a gidin."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Sistemde gezinme yöntemini güncellemek için Ayarlar\'a gidin"</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 171949a53761..9e04fbea2f8a 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Змінення мережі оператора"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Відкрити деталі акумулятора"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Заряд акумулятора у відсотках: <xliff:g id="NUMBER">%d</xliff:g>."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Згідно з даними про використання залишилося <xliff:g id="PERCENTAGE">%1$s</xliff:g> заряду акумулятора – близько <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Акумулятор заряджається: <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Налаштування системи."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Сповіщення."</string> @@ -942,8 +943,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Перемістити ліворуч униз"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Перемістити праворуч униз"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Закрити"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Навігацію в системі оновлено. Щоб внести зміни, перейдіть у налаштування."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Перейдіть у налаштування, щоб оновити навігацію в системі"</string> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 7f37dea93be1..38fb1a8fd859 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"کیریئر نیٹ ورک کی تبدیلی"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"بیٹری کی تفصیلات کھولیں"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"بیٹری <xliff:g id="NUMBER">%d</xliff:g> فیصد۔"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"آپ کے استعمال کی بنیاد پر بیٹری <xliff:g id="PERCENTAGE">%1$s</xliff:g> فیصد، تقریباً <xliff:g id="TIME">%2$s</xliff:g> باقی ہے"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"بیٹری چارج ہو رہی ہے، <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"سسٹم کی ترتیبات۔"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"اطلاعات۔"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"نیچے بائیں جانب لے جائیں"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"نیچے دائیں جانب لے جائیں"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"برخاست کریں"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں"</string> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 2dfbb6157c1c..0f93809eae96 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Mobil tarmoqni o‘zgartirish"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Quvvat sarfi tafsilotlari"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Batareya <xliff:g id="NUMBER">%d</xliff:g> foiz."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Batareya quvvati <xliff:g id="PERCENTAGE">%1$s</xliff:g> foiz, joriy holatda yana <xliff:g id="TIME">%2$s</xliff:g> qoldi"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Batareya quvvat olmoqda (<xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%)."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Tizim sozlamalari."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Eslatmalar."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Quyi chapga surish"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Quyi oʻngga surish"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Yopish"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Tizim navigatsiyasi yangilandi. Buni Sozlamalar orqali oʻzgartirishingiz mumkin."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Tizim navigatsiyasini yangilash uchun Sozlamalarni oching"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 659cd694bf42..d1a2fdc2621a 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Thay đổi mạng của nhà mạng"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Mở chi tiết về pin"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> phần trăm pin."</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> phần trăm pin, còn khoảng <xliff:g id="TIME">%2$s</xliff:g> dựa trên mức sử dụng của bạn"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Đang sạc pin, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Cài đặt hệ thống"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Thông báo."</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Chuyển tới dưới cùng bên trái"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Chuyển tới dưới cùng bên phải"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Loại bỏ"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Đã 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="8111130443656460792">"Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 018777f14786..69d71575991b 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"运营商网络正在更改"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"打开电量详情"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"电池电量为百分之 <xliff:g id="NUMBER">%d</xliff:g>。"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"电池电量为 <xliff:g id="PERCENTAGE">%1$s</xliff:g>,根据您的使用情况,大约还可使用 <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"正在充电,已完成 <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%。"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"系统设置。"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"通知。"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"移至左下角"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"移至右下角"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"关闭"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"系统导航已更新。要进行更改,请转到“设置”。"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"转到“设置”即可更新系统导航"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index cd674f50e413..814ae2e50fca 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"流動網絡供應商網絡正在變更"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"開啟電池詳細資料"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"電池電量為百分之 <xliff:g id="NUMBER">%d</xliff:g>。"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"電量仲剩番 <xliff:g id="PERCENTAGE">%1$s</xliff:g>。根據你嘅使用情況,仲可以用大約 <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"正在充電:<xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%。"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"系統設定"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"通知。"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"移去左下角"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"移去右下角"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"關閉"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"系統導覽已更新。如需變更,請前往「設定」。"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"前往「設定」更新系統導覽"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index f16b21cad6a9..029e00f79e20 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"電信業者網路正在進行變更"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"開啟電量詳細資料"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"電池電量為百分之 <xliff:g id="NUMBER">%d</xliff:g>。"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"目前的電量為 <xliff:g id="PERCENTAGE">%1$s</xliff:g>。根據你的使用情形,大約還能使用到<xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"充電中,已完成 <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%。"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"系統設定"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"通知。"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"移至左下方"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"移至右下方"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"關閉"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"系統操作機制已更新。如要進行變更,請前往「設定」。"</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"請前往「設定」更新系統操作機制"</string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 887bec0a7afa..8447ef86bcf9 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -197,6 +197,7 @@ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Inethiwekhi yenkampani yenethiwekhi iyashintsha"</string> <string name="accessibility_battery_details" msgid="7645516654955025422">"Vula imininingwane yebhethri"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"Iphesenti <xliff:g id="NUMBER">%d</xliff:g> lebhethri"</string> + <string name="accessibility_battery_level_with_estimate" msgid="9033100930684311630">"Amaphesenti ebhethri ngu-<xliff:g id="PERCENTAGE">%1$s</xliff:g>, cishe kusele okungu-<xliff:g id="TIME">%2$s</xliff:g> kusukela ekusetshenzisweni kwakho"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Ibhethri liyashaja, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> iphesenti."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Izilungiselelo zesistimu"</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Izaziso"</string> @@ -932,8 +933,6 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Hambisa inkinobho ngakwesokunxele"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Hambisa inkinobho ngakwesokudla"</string> <string name="bubble_dismiss_text" msgid="8028337712674081668">"Cashisa"</string> - <!-- no translation found for notification_content_system_nav_changed (7218093915747788444) --> - <skip /> - <!-- no translation found for notification_content_gesture_nav_available (8111130443656460792) --> - <skip /> + <string name="notification_content_system_nav_changed" msgid="7218093915747788444">"Ukuzulazula kwesistimu kubuyekeziwe. Ukuze wenze ushintsho, hamba kokuthi Izilungiselelo."</string> + <string name="notification_content_gesture_nav_available" msgid="8111130443656460792">"Hamba kuzilungiselelo ukuze ubuyekeze ukuzulazula kwesistimu"</string> </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index b3877931bd4f..2f1770a39f02 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -450,7 +450,7 @@ <style name="TextAppearance.NotificationInfo.Secondary"> <item name="android:textSize">14sp</item> - <item name="android:alpha">0.54</item> + <item name="android:alpha">0.62</item> </style> <style name="TextAppearance.NotificationInfo.Title"> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index 6b07ed8e8edc..a2abb4b1695c 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -64,6 +64,7 @@ import com.android.systemui.shared.recents.model.ThumbnailData; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Future; import java.util.function.Consumer; public class ActivityManagerWrapper { @@ -380,8 +381,8 @@ public class ActivityManagerWrapper { /** * Requests that the system close any open system windows (including other SystemUI). */ - public void closeSystemWindows(final String reason) { - mBackgroundExecutor.submit(new Runnable() { + public Future<?> closeSystemWindows(final String reason) { + return mBackgroundExecutor.submit(new Runnable() { @Override public void run() { try { diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 240691b9c65c..db13ef4821e8 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -61,12 +61,14 @@ public class QuickStepContract { public static final int SYSUI_STATE_A11Y_BUTTON_CLICKABLE = 1 << 4; // The navigation bar a11y button shortcut is available public static final int SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE = 1 << 5; - // The keyguard is showing + // The keyguard is showing and not occluded public static final int SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING = 1 << 6; // The recents feature is disabled (either by SUW/SysUI/device policy) public static final int SYSUI_STATE_OVERVIEW_DISABLED = 1 << 7; // The home feature is disabled (either by SUW/SysUI/device policy) public static final int SYSUI_STATE_HOME_DISABLED = 1 << 8; + // The keyguard is showing, but occluded + public static final int SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED = 1 << 9; @Retention(RetentionPolicy.SOURCE) @IntDef({SYSUI_STATE_SCREEN_PINNING, @@ -76,6 +78,7 @@ public class QuickStepContract { SYSUI_STATE_A11Y_BUTTON_CLICKABLE, SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING, + SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED, SYSUI_STATE_OVERVIEW_DISABLED, SYSUI_STATE_HOME_DISABLED }) @@ -89,6 +92,8 @@ public class QuickStepContract { str.add((flags & SYSUI_STATE_NAV_BAR_HIDDEN) != 0 ? "navbar_hidden" : ""); str.add((flags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0 ? "notif_visible" : ""); str.add((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING) != 0 ? "keygrd_visible" : ""); + str.add((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED) != 0 + ? "keygrd_occluded" : ""); str.add((flags & SYSUI_STATE_BOUNCER_SHOWING) != 0 ? "bouncer_visible" : ""); str.add((flags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0 ? "a11y_click" : ""); str.add((flags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0 ? "a11y_long_click" : ""); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java index bd7b3d598927..9ba21a328ca4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java @@ -22,6 +22,7 @@ import android.graphics.Rect; import android.os.Handler; import android.os.Handler.Callback; import android.os.Message; +import android.os.Trace; import android.view.Surface; import android.view.View; import android.view.ViewRootImpl; @@ -95,6 +96,7 @@ public class SyncRtSurfaceTransactionApplierCompat { .sendToTarget(); return; } + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Sync transaction frameNumber=" + frame); TransactionCompat t = new TransactionCompat(); for (int i = params.length - 1; i >= 0; i--) { SyncRtSurfaceTransactionApplierCompat.SurfaceParams surfaceParams = @@ -105,6 +107,7 @@ public class SyncRtSurfaceTransactionApplierCompat { } t.setEarlyWakeup(); t.apply(); + Trace.traceEnd(Trace.TRACE_TAG_VIEW); Message.obtain(mApplyHandler, MSG_UPDATE_SEQUENCE_NUMBER, toApplySeqNo, 0) .sendToTarget(); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index 0bb9e744f2b6..7ec1bda26cf8 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -374,7 +374,7 @@ public class KeyguardClockSwitch extends RelativeLayout { private void updateColors() { ColorExtractor.GradientColors colors = mSysuiColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); mSupportsDarkText = colors.supportsDarkText(); mColorPalette = colors.getColorPalette(); if (mClockPlugin != null) { diff --git a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java index f468ecaae4c1..558ac4b564d1 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java @@ -130,7 +130,7 @@ public class AnalogClockController implements ClockPlugin { setDarkAmount(1f); setTextColor(Color.WHITE); ColorExtractor.GradientColors colors = mColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); onTimeTick(); diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java index 61a6952cacac..bdf9dc4865b2 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java @@ -130,7 +130,7 @@ public class BubbleClockController implements ClockPlugin { setDarkAmount(1f); setTextColor(Color.WHITE); ColorExtractor.GradientColors colors = mColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); onTimeTick(); diff --git a/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java index ce1f09c9355c..98679ade1022 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java @@ -124,7 +124,7 @@ public class DefaultClockController implements ClockPlugin { setDarkAmount(1f); setTextColor(Color.WHITE); ColorExtractor.GradientColors colors = mColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); onTimeTick(); diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index f66463e4ef9b..ffa69fa87436 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -365,6 +365,10 @@ public class BatteryMeterView extends LinearLayout implements } else { setPercentTextAtCurrentLevel(); } + } else { + setContentDescription( + getContext().getString(mCharging ? R.string.accessibility_battery_level_charging + : R.string.accessibility_battery_level, mLevel)); } } diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 84842563cbdc..e9eda4f5577b 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -83,7 +83,7 @@ public class ImageWallpaper extends WallpaperService { @Override public void onCreate(SurfaceHolder surfaceHolder) { setFixedSizeAllowed(true); - setOffsetNotificationsEnabled(false); + setOffsetNotificationsEnabled(true); updateSurfaceSize(); } @@ -96,6 +96,12 @@ public class ImageWallpaper extends WallpaperService { } @Override + public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, + float yOffsetStep, int xPixelOffset, int yPixelOffset) { + mRenderer.updateOffsets(xOffset, yOffset); + } + + @Override public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) { mRenderer.updateAmbientMode(inAmbientMode, (mNeedTransition || animationDuration != 0) ? animationDuration : 0); diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 5e192193a87a..73e57de3f915 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -25,6 +25,9 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import static com.android.systemui.tuner.TunablePadding.FLAG_END; import static com.android.systemui.tuner.TunablePadding.FLAG_START; +import android.animation.Animator; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.annotation.Dimension; import android.app.ActivityManager; import android.app.Fragment; @@ -49,6 +52,7 @@ import android.os.SystemProperties; import android.provider.Settings.Secure; import android.util.DisplayMetrics; import android.util.Log; +import android.util.MathUtils; import android.view.DisplayCutout; import android.view.DisplayInfo; import android.view.Gravity; @@ -60,12 +64,9 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver; import android.view.WindowManager; -import android.view.animation.Animation; -import android.view.animation.AnimationSet; -import android.view.animation.OvershootInterpolator; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; -import android.view.animation.ScaleAnimation; -import android.view.animation.TranslateAnimation; import android.widget.FrameLayout; import android.widget.ImageView; @@ -77,8 +78,10 @@ import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qs.SecureSetting; +import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.NavigationBarTransitions; +import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.tuner.TunablePadding; import com.android.systemui.tuner.TunerService; @@ -125,6 +128,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, private Handler mHandler; private boolean mAssistHintBlocked = false; private boolean mIsReceivingNavBarColor = false; + private boolean mInGesturalMode; /** * Converts a set of {@link Rect}s into a {@link Region} @@ -149,6 +153,58 @@ public class ScreenDecorations extends SystemUI implements Tunable, mHandler.post(this::startOnScreenDecorationsThread); setupStatusBarPaddingIfNeeded(); putComponent(ScreenDecorations.class, this); + mInGesturalMode = QuickStepContract.isGesturalMode( + Dependency.get(NavigationModeController.class) + .addListener(this::handleNavigationModeChange)); + } + + @VisibleForTesting + void handleNavigationModeChange(int navigationMode) { + if (!mHandler.getLooper().isCurrentThread()) { + mHandler.post(() -> handleNavigationModeChange(navigationMode)); + return; + } + boolean inGesturalMode = QuickStepContract.isGesturalMode(navigationMode); + if (mInGesturalMode != inGesturalMode) { + mInGesturalMode = inGesturalMode; + + if (mInGesturalMode && mOverlay == null) { + setupDecorations(); + if (mOverlay != null) { + updateLayoutParams(); + } + } + } + } + + /** + * Returns an animator that animates the given view from start to end over durationMs. Start and + * end represent total animation progress: 0 is the start, 1 is the end, 1.1 would be an + * overshoot. + */ + Animator getHandleAnimator(View view, float start, float end, boolean isLeft, long durationMs, + Interpolator interpolator) { + // Note that lerp does allow overshoot, in cases where start and end are outside of [0,1]. + float scaleStart = MathUtils.lerp(2f, 1f, start); + float scaleEnd = MathUtils.lerp(2f, 1f, end); + Animator scaleX = ObjectAnimator.ofFloat(view, View.SCALE_X, scaleStart, scaleEnd); + Animator scaleY = ObjectAnimator.ofFloat(view, View.SCALE_Y, scaleStart, scaleEnd); + float translationStart = MathUtils.lerp(0.2f, 0f, start); + float translationEnd = MathUtils.lerp(0.2f, 0f, end); + int xDirection = isLeft ? -1 : 1; + Animator translateX = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, + xDirection * translationStart * view.getWidth(), + xDirection * translationEnd * view.getWidth()); + Animator translateY = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, + translationStart * view.getHeight(), translationEnd * view.getHeight()); + + AnimatorSet set = new AnimatorSet(); + set.play(scaleX).with(scaleY); + set.play(scaleX).with(translateX); + set.play(scaleX).with(translateY); + set.setDuration(durationMs); + set.setInterpolator(interpolator); + return set; } private void fade(View view, boolean fadeIn, boolean isLeft) { @@ -157,26 +213,29 @@ public class ScreenDecorations extends SystemUI implements Tunable, view.setAlpha(1f); view.setVisibility(View.VISIBLE); - AnimationSet anim = new AnimationSet(true); - anim.setDuration(900); - - Animation scaleAnimation = new ScaleAnimation(2f, 1f, 2f, 1f, - ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f); - anim.addAnimation(scaleAnimation); - anim.setInterpolator(new PathInterpolator(0.02f, 0.44f, 0.67f, 1.00f)); - - Animation translateAnimation = new TranslateAnimation( - TranslateAnimation.RELATIVE_TO_SELF, isLeft ? -0.2f : 0.2f, - TranslateAnimation.RELATIVE_TO_SELF, - 0f, - TranslateAnimation.RELATIVE_TO_SELF, 0.2f, TranslateAnimation.RELATIVE_TO_SELF, - 0f); - anim.addAnimation(translateAnimation); - anim.setInterpolator(new OvershootInterpolator()); - view.startAnimation(anim); + // A piecewise spring-like interpolation. + // End value in one animator call must match the start value in the next, otherwise + // there will be a discontinuity. + AnimatorSet anim = new AnimatorSet(); + Animator first = getHandleAnimator(view, 0, 1.1f, isLeft, 750, + new PathInterpolator(0, 0.45f, .67f, 1f)); + Interpolator secondInterpolator = new PathInterpolator(0.33f, 0, 0.67f, 1f); + Animator second = getHandleAnimator(view, 1.1f, 0.97f, isLeft, 400, + secondInterpolator); + Animator third = getHandleAnimator(view, 0.97f, 1.02f, isLeft, 400, + secondInterpolator); + Animator fourth = getHandleAnimator(view, 1.02f, 1f, isLeft, 400, + secondInterpolator); + anim.play(first).before(second); + anim.play(second).before(third); + anim.play(third).before(fourth); + anim.start(); } else { view.animate().cancel(); - view.animate().setDuration(400).alpha(0f); + view.animate() + .setInterpolator(new AccelerateInterpolator(1.5f)) + .setDuration(250) + .alpha(0f); } } @@ -232,6 +291,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, break; } } + updateWindowVisibilities(); } /** @@ -256,11 +316,15 @@ public class ScreenDecorations extends SystemUI implements Tunable, return thread.getThreadHandler(); } + private boolean shouldHostHandles() { + return mInGesturalMode; + } + private void startOnScreenDecorationsThread() { mRotation = RotationUtils.getExactRotation(mContext); mWindowManager = mContext.getSystemService(WindowManager.class); updateRoundedCornerRadii(); - if (hasRoundedCorners() || shouldDrawCutout()) { + if (hasRoundedCorners() || shouldDrawCutout() || shouldHostHandles()) { setupDecorations(); } @@ -565,7 +629,10 @@ public class ScreenDecorations extends SystemUI implements Tunable, boolean visibleForCutout = shouldDrawCutout() && overlay.findViewById(R.id.display_cutout).getVisibility() == View.VISIBLE; boolean visibleForRoundedCorners = hasRoundedCorners(); - overlay.setVisibility(visibleForCutout || visibleForRoundedCorners + boolean visibleForHandles = overlay.findViewById(R.id.assist_hint_left).getVisibility() + == View.VISIBLE || overlay.findViewById(R.id.assist_hint_right).getVisibility() + == View.VISIBLE; + overlay.setVisibility(visibleForCutout || visibleForRoundedCorners || visibleForHandles ? View.VISIBLE : View.GONE); } @@ -688,10 +755,6 @@ public class ScreenDecorations extends SystemUI implements Tunable, setSize(mOverlay.findViewById(R.id.right), sizeTop); setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom); setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom); - setSize(mOverlay.findViewById(R.id.assist_hint_left), sizeTop * 2); - setSize(mOverlay.findViewById(R.id.assist_hint_right), sizeTop * 2); - setSize(mBottomOverlay.findViewById(R.id.assist_hint_left), sizeBottom * 2); - setSize(mBottomOverlay.findViewById(R.id.assist_hint_right), sizeBottom * 2); } }); } @@ -705,6 +768,10 @@ public class ScreenDecorations extends SystemUI implements Tunable, @Override public void onDarkIntensity(float darkIntensity) { + if (!mHandler.getLooper().isCurrentThread()) { + mHandler.post(() -> onDarkIntensity(darkIntensity)); + return; + } if (mOverlay != null) { CornerHandleView assistHintTopLeft = mOverlay.findViewById(R.id.assist_hint_left); CornerHandleView assistHintTopRight = mOverlay.findViewById(R.id.assist_hint_right); @@ -852,6 +919,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, if (shouldDrawCutout(getContext()) && hasCutout()) { mBounds.addAll(mInfo.displayCutout.getBoundingRects()); localBounds(mBoundingRect); + updateGravity(); updateBoundingPath(); invalidate(); newVisible = VISIBLE; @@ -902,6 +970,18 @@ public class ScreenDecorations extends SystemUI implements Tunable, } } + private void updateGravity() { + LayoutParams lp = getLayoutParams(); + if (lp instanceof FrameLayout.LayoutParams) { + FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) lp; + int newGravity = getGravity(mInfo.displayCutout); + if (flp.gravity != newGravity) { + flp.gravity = newGravity; + setLayoutParams(flp); + } + } + } + private boolean hasCutout() { final DisplayCutout displayCutout = mInfo.displayCutout; if (displayCutout == null) { @@ -948,21 +1028,25 @@ public class ScreenDecorations extends SystemUI implements Tunable, } private void localBounds(Rect out) { - final DisplayCutout displayCutout = mInfo.displayCutout; + DisplayCutout displayCutout = mInfo.displayCutout; + boundsFromDirection(displayCutout, getGravity(displayCutout), out); + } + private int getGravity(DisplayCutout displayCutout) { if (mStart) { if (displayCutout.getSafeInsetLeft() > 0) { - boundsFromDirection(displayCutout, Gravity.LEFT, out); + return Gravity.LEFT; } else if (displayCutout.getSafeInsetTop() > 0) { - boundsFromDirection(displayCutout, Gravity.TOP, out); + return Gravity.TOP; } } else { if (displayCutout.getSafeInsetRight() > 0) { - boundsFromDirection(displayCutout, Gravity.RIGHT, out); + return Gravity.RIGHT; } else if (displayCutout.getSafeInsetBottom() > 0) { - boundsFromDirection(displayCutout, Gravity.BOTTOM, out); + return Gravity.BOTTOM; } } + return Gravity.NO_GRAVITY; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java index 6d109fb59abb..002d4f34be11 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java @@ -20,7 +20,6 @@ import android.content.ComponentName; import android.content.Context; import android.os.Handler; import android.os.SystemClock; -import android.provider.DeviceConfig; import android.util.Log; import androidx.annotation.Nullable; @@ -30,11 +29,15 @@ import com.android.internal.app.AssistUtils; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dependency; +import com.android.systemui.DumpController; +import com.android.systemui.Dumpable; import com.android.systemui.ScreenDecorations; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.phone.NavigationModeController; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.EnumMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -46,11 +49,11 @@ import java.util.function.Supplier; * Controls when visual handles for Assistant gesture affordance should be shown or hidden using an * {@link AssistHandleBehavior}. */ -public final class AssistHandleBehaviorController implements AssistHandleCallbacks { +public final class AssistHandleBehaviorController implements AssistHandleCallbacks, Dumpable { private static final String TAG = "AssistHandleBehavior"; - private static final long DEFAULT_SHOWN_FREQUENCY_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(10); + private static final long DEFAULT_SHOWN_FREQUENCY_THRESHOLD_MS = 0; private static final long DEFAULT_SHOW_AND_GO_DURATION_MS = TimeUnit.SECONDS.toMillis(3); /** @@ -63,7 +66,9 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private final AssistUtils mAssistUtils; private final Handler mHandler; private final Runnable mHideHandles = this::hideHandles; + private final Runnable mShowAndGo = this::showAndGoInternal; private final Supplier<ScreenDecorations> mScreenDecorationsSupplier; + private final PhenotypeHelper mPhenotypeHelper; private final Map<AssistHandleBehavior, BehaviorController> mBehaviorMap = new EnumMap<>(AssistHandleBehavior.class); @@ -80,7 +85,9 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac this( context, assistUtils, - handler, () -> SysUiServiceProvider.getComponent(context, ScreenDecorations.class), + handler, + () -> SysUiServiceProvider.getComponent(context, ScreenDecorations.class), + new PhenotypeHelper(), /* testBehavior = */ null); } @@ -90,15 +97,18 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac AssistUtils assistUtils, Handler handler, Supplier<ScreenDecorations> screenDecorationsSupplier, + PhenotypeHelper phenotypeHelper, @Nullable BehaviorController testBehavior) { mContext = context; mAssistUtils = assistUtils; mHandler = handler; mScreenDecorationsSupplier = screenDecorationsSupplier; - + mPhenotypeHelper = phenotypeHelper; mBehaviorMap.put(AssistHandleBehavior.OFF, new AssistHandleOffBehavior()); mBehaviorMap.put(AssistHandleBehavior.LIKE_HOME, new AssistHandleLikeHomeBehavior()); - mBehaviorMap.put(AssistHandleBehavior.REMINDER_EXP, new AssistHandleReminderExpBehavior()); + mBehaviorMap.put( + AssistHandleBehavior.REMINDER_EXP, + new AssistHandleReminderExpBehavior(handler, phenotypeHelper)); if (testBehavior != null) { mBehaviorMap.put(AssistHandleBehavior.TEST, testBehavior); } @@ -107,38 +117,48 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac Dependency.get(NavigationModeController.class) .addListener(this::handleNavigationModeChange)); - setBehavior(DeviceConfig.getString( - DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE, - DEFAULT_BEHAVIOR.toString())); - DeviceConfig.addOnPropertyChangedListener( - DeviceConfig.NAMESPACE_SYSTEMUI, + setBehavior(getBehaviorMode()); + mPhenotypeHelper.addOnPropertiesChangedListener( mHandler::post, - (namespace, name, value) -> { - if (SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE.equals(name)) { - setBehavior(value); + (properties) -> { + if (properties.getKeyset().contains( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE)) { + setBehavior(properties.getString( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE, null)); } }); + Dependency.get(DumpController.class).addListener(this); } - @Override + @Override // AssistHandleCallbacks public void hide() { - mHandler.removeCallbacks(mHideHandles); + clearPendingCommands(); mHandler.post(mHideHandles); } - @Override + @Override // AssistHandleCallbacks public void showAndGo() { - mHandler.removeCallbacks(mHideHandles); - mHandler.post(() -> { - maybeShowHandles(/* ignoreThreshold = */ false); - mHandler.postDelayed(mHideHandles, getShowAndGoDuration()); - }); + clearPendingCommands(); + mHandler.post(mShowAndGo); + } + + private void showAndGoInternal() { + maybeShowHandles(/* ignoreThreshold = */ false); + mHandler.postDelayed(mHideHandles, getShowAndGoDuration()); + } + + @Override // AssistHandleCallbacks + public void showAndGoDelayed(long delayMs, boolean hideIfShowing) { + clearPendingCommands(); + if (hideIfShowing) { + mHandler.post(mHideHandles); + } + mHandler.postDelayed(mShowAndGo, delayMs); } - @Override + @Override // AssistHandleCallbacks public void showAndStay() { - mHandler.removeCallbacks(mHideHandles); + clearPendingCommands(); mHandler.post(() -> maybeShowHandles(/* ignoreThreshold = */ true)); } @@ -178,37 +198,41 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private boolean handlesUnblocked(boolean ignoreThreshold) { long timeSinceHidden = SystemClock.elapsedRealtime() - mHandlesLastHiddenAt; - boolean notThrottled = ignoreThreshold || timeSinceHidden > getShownFrequencyThreshold(); + boolean notThrottled = ignoreThreshold || timeSinceHidden >= getShownFrequencyThreshold(); ComponentName assistantComponent = mAssistUtils.getAssistComponentForUser(KeyguardUpdateMonitor.getCurrentUser()); return notThrottled && assistantComponent != null; } private long getShownFrequencyThreshold() { - return DeviceConfig.getLong( - DeviceConfig.NAMESPACE_SYSTEMUI, + return mPhenotypeHelper.getLong( SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS, DEFAULT_SHOWN_FREQUENCY_THRESHOLD_MS); } private long getShowAndGoDuration() { - return DeviceConfig.getLong( - DeviceConfig.NAMESPACE_SYSTEMUI, + return mPhenotypeHelper.getLong( SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS, DEFAULT_SHOW_AND_GO_DURATION_MS); } + private String getBehaviorMode() { + return mPhenotypeHelper.getString( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE, + DEFAULT_BEHAVIOR.toString()); + } + private void maybeShowHandles(boolean ignoreThreshold) { if (mHandlesShowing) { return; } if (handlesUnblocked(ignoreThreshold)) { - mHandlesShowing = true; ScreenDecorations screenDecorations = mScreenDecorationsSupplier.get(); if (screenDecorations == null) { Log.w(TAG, "Couldn't show handles, ScreenDecorations unavailable"); } else { + mHandlesShowing = true; screenDecorations.setAssistHintVisible(true); } } @@ -219,12 +243,12 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac return; } - mHandlesShowing = false; - mHandlesLastHiddenAt = SystemClock.elapsedRealtime(); ScreenDecorations screenDecorations = mScreenDecorationsSupplier.get(); if (screenDecorations == null) { Log.w(TAG, "Couldn't hide handles, ScreenDecorations unavailable"); } else { + mHandlesShowing = false; + mHandlesLastHiddenAt = SystemClock.elapsedRealtime(); screenDecorations.setAssistHintVisible(false); } } @@ -244,14 +268,46 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac } } + private void clearPendingCommands() { + mHandler.removeCallbacks(mHideHandles); + mHandler.removeCallbacks(mShowAndGo); + } + @VisibleForTesting void setInGesturalModeForTest(boolean inGesturalMode) { mInGesturalMode = inGesturalMode; } + @Override // Dumpable + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("Current AssistHandleBehaviorController State:"); + + pw.println(" mHandlesShowing=" + mHandlesShowing); + pw.println(" mHandlesLastHiddenAt=" + mHandlesLastHiddenAt); + pw.println(" mInGesturalMode=" + mInGesturalMode); + + pw.println(" Phenotype Flags:"); + pw.println(" " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS + + "=" + + getShowAndGoDuration()); + pw.println(" " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS + + "=" + + getShownFrequencyThreshold()); + pw.println(" " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE + + "=" + + getBehaviorMode()); + + pw.println(" mCurrentBehavior=" + mCurrentBehavior.toString()); + mBehaviorMap.get(mCurrentBehavior).dump(pw, " "); + } + interface BehaviorController { void onModeActivated(Context context, AssistHandleCallbacks callbacks); default void onModeDeactivated() {} default void onAssistantGesturePerformed() {} + default void dump(PrintWriter pw, String prefix) {} } } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleCallbacks.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleCallbacks.java index 0577d37217e2..3db861d57268 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleCallbacks.java @@ -29,6 +29,13 @@ public interface AssistHandleCallbacks { */ void showAndGo(); + /** + * Same as show and go, but will not do anything until a delay has elapsed. + * + * Will be cancelled if another command is given during the delay. + */ + void showAndGoDelayed(long delayMs, boolean hideIfShowing); + /** Show the Assistant handles. */ void showAndStay(); } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java index 05e504c93b82..6cf2034e6c9b 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java @@ -26,6 +26,8 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.system.QuickStepContract; +import java.io.PrintWriter; + /** * Assistant Handle behavior that makes Assistant handles show/hide when the home handle is * shown/hidden, respectively. @@ -108,4 +110,12 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController { mAssistHandleCallbacks.showAndStay(); } } + + @Override + public void dump(PrintWriter pw, String prefix) { + pw.println("Current AssistHandleLikeHomeBehavior State:"); + + pw.println(prefix + " mIsDozing=" + mIsDozing); + pw.println(prefix + " mIsHomeHandleHiding=" + mIsHomeHandleHiding); + } } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java index 4b6a6dcee91d..909b68b52e3f 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java @@ -17,10 +17,14 @@ package com.android.systemui.assist; import android.app.ActivityManager; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ResolveInfo; +import android.os.Handler; import android.os.SystemClock; -import android.provider.DeviceConfig; import android.provider.Settings; import androidx.annotation.Nullable; @@ -31,10 +35,15 @@ import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorContro import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.statusbar.StatusBarState; +import java.io.PrintWriter; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -46,8 +55,26 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { private static final String LEARNING_TIME_ELAPSED_KEY = "reminder_exp_learning_time_elapsed"; private static final String LEARNING_EVENT_COUNT_KEY = "reminder_exp_learning_event_count"; - private static final long DEFAULT_LEARNING_TIME_MS = TimeUnit.DAYS.toMillis(3); - private static final int DEFAULT_LEARNING_COUNT = 3; + private static final String LEARNED_HINT_LAST_SHOWN_KEY = + "reminder_exp_learned_hint_last_shown"; + private static final long DEFAULT_LEARNING_TIME_MS = TimeUnit.DAYS.toMillis(200); + private static final int DEFAULT_LEARNING_COUNT = 30000; + private static final long DEFAULT_SHOW_AND_GO_DELAYED_SHORT_DELAY_MS = 150; + private static final long DEFAULT_SHOW_AND_GO_DELAYED_LONG_DELAY_MS = + TimeUnit.SECONDS.toMillis(1); + private static final long DEFAULT_SHOW_AND_GO_DELAY_RESET_TIMEOUT_MS = + TimeUnit.SECONDS.toMillis(3); + private static final boolean DEFAULT_SUPPRESS_ON_LOCKSCREEN = false; + private static final boolean DEFAULT_SUPPRESS_ON_LAUNCHER = false; + private static final boolean DEFAULT_SUPPRESS_ON_APPS = false; + + private static final String[] DEFAULT_HOME_CHANGE_ACTIONS = new String[] { + PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED, + Intent.ACTION_BOOT_COMPLETED, + Intent.ACTION_PACKAGE_ADDED, + Intent.ACTION_PACKAGE_CHANGED, + Intent.ACTION_PACKAGE_REMOVED + }; private final StatusBarStateController.StateListener mStatusBarStateListener = new StatusBarStateController.StateListener() { @@ -64,13 +91,13 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { private final TaskStackChangeListener mTaskStackChangeListener = new TaskStackChangeListener() { @Override - public void onTaskMovedToFront(int taskId) { - handleTaskStackTopChanged(taskId); + public void onTaskMovedToFront(ActivityManager.RunningTaskInfo taskInfo) { + handleTaskStackTopChanged(taskInfo.taskId, taskInfo.topActivity); } @Override public void onTaskCreated(int taskId, ComponentName componentName) { - handleTaskStackTopChanged(taskId); + handleTaskStackTopChanged(taskId, componentName); } }; private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener = @@ -85,7 +112,17 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { handleSystemUiStateChanged(sysuiStateFlags); } }; + private final BroadcastReceiver mDefaultHomeBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mDefaultHome = getCurrentDefaultHome(); + } + }; + private final IntentFilter mDefaultHomeIntentFilter; + private final Runnable mResetConsecutiveTaskSwitches = this::resetConsecutiveTaskSwitches; + private final Handler mHandler; + private final PhenotypeHelper mPhenotypeHelper; private final StatusBarStateController mStatusBarStateController; private final ActivityManagerWrapper mActivityManagerWrapper; private final OverviewProxyService mOverviewProxyService; @@ -94,6 +131,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { private boolean mIsDozing; private int mRunningTaskId; private boolean mIsNavBarHidden; + private boolean mIsLauncherShowing; + private int mConsecutiveTaskSwitches; /** Whether user has learned the gesture. */ private boolean mIsLearned; @@ -102,20 +141,31 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { private long mLearningTimeElapsed; /** Number of successful Assistant invocations while in this behavior. */ private int mLearningCount; + private long mLearnedHintLastShownEpochDay; @Nullable private Context mContext; @Nullable private AssistHandleCallbacks mAssistHandleCallbacks; + @Nullable private ComponentName mDefaultHome; - AssistHandleReminderExpBehavior() { + AssistHandleReminderExpBehavior(Handler handler, PhenotypeHelper phenotypeHelper) { + mHandler = handler; + mPhenotypeHelper = phenotypeHelper; mStatusBarStateController = Dependency.get(StatusBarStateController.class); mActivityManagerWrapper = ActivityManagerWrapper.getInstance(); mOverviewProxyService = Dependency.get(OverviewProxyService.class); + mDefaultHomeIntentFilter = new IntentFilter(); + for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { + mDefaultHomeIntentFilter.addAction(action); + } } @Override public void onModeActivated(Context context, AssistHandleCallbacks callbacks) { mContext = context; mAssistHandleCallbacks = callbacks; + mConsecutiveTaskSwitches = 0; + mDefaultHome = getCurrentDefaultHome(); + context.registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter); mOnLockscreen = onLockscreen(mStatusBarStateController.getState()); mIsDozing = mStatusBarStateController.isDozing(); mStatusBarStateController.addCallback(mStatusBarStateListener); @@ -128,6 +178,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { context.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, /* default = */ 0); mLearningCount = Settings.Secure.getInt( context.getContentResolver(), LEARNING_EVENT_COUNT_KEY, /* default = */ 0); + mLearnedHintLastShownEpochDay = Settings.Secure.getLong( + context.getContentResolver(), LEARNED_HINT_LAST_SHOWN_KEY, /* default = */ 0); mLastLearningTimestamp = SystemClock.uptimeMillis(); callbackForCurrentState(/* justUnlocked = */ false); @@ -137,10 +189,10 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { public void onModeDeactivated() { mAssistHandleCallbacks = null; if (mContext != null) { - Settings.Secure.putLong( - mContext.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, mLearningTimeElapsed); - Settings.Secure.putInt( - mContext.getContentResolver(), LEARNING_EVENT_COUNT_KEY, mLearningCount); + mContext.unregisterReceiver(mDefaultHomeBroadcastReceiver); + Settings.Secure.putLong(mContext.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, 0); + Settings.Secure.putInt(mContext.getContentResolver(), LEARNING_EVENT_COUNT_KEY, 0); + Settings.Secure.putLong(mContext.getContentResolver(), LEARNED_HINT_LAST_SHOWN_KEY, 0); mContext = null; } mStatusBarStateController.removeCallback(mStatusBarStateListener); @@ -162,12 +214,35 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { return (sysuiStateFlags & QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN) != 0; } + @Nullable + private static ComponentName getCurrentDefaultHome() { + List<ResolveInfo> homeActivities = new ArrayList<>(); + ComponentName defaultHome = + PackageManagerWrapper.getInstance().getHomeActivities(homeActivities); + if (defaultHome != null) { + return defaultHome; + } + + int topPriority = Integer.MIN_VALUE; + ComponentName topComponent = null; + for (ResolveInfo resolveInfo : homeActivities) { + if (resolveInfo.priority > topPriority) { + topComponent = resolveInfo.activityInfo.getComponentName(); + topPriority = resolveInfo.priority; + } else if (resolveInfo.priority == topPriority) { + topComponent = null; + } + } + return topComponent; + } + private void handleStatusBarStateChanged(int newState) { boolean onLockscreen = onLockscreen(newState); if (mOnLockscreen == onLockscreen) { return; } + resetConsecutiveTaskSwitches(); mOnLockscreen = onLockscreen; callbackForCurrentState(!onLockscreen); } @@ -177,16 +252,24 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { return; } + resetConsecutiveTaskSwitches(); mIsDozing = isDozing; callbackForCurrentState(/* justUnlocked = */ false); } - private void handleTaskStackTopChanged(int taskId) { - if (mRunningTaskId == taskId) { + private void handleTaskStackTopChanged(int taskId, @Nullable ComponentName taskComponentName) { + if (mRunningTaskId == taskId || taskComponentName == null) { return; } mRunningTaskId = taskId; + mIsLauncherShowing = taskComponentName.equals(mDefaultHome); + if (mIsLauncherShowing) { + resetConsecutiveTaskSwitches(); + } else { + rescheduleConsecutiveTaskSwitchesReset(); + mConsecutiveTaskSwitches++; + } callbackForCurrentState(/* justUnlocked = */ false); } @@ -196,11 +279,13 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { return; } + resetConsecutiveTaskSwitches(); mIsNavBarHidden = isNavBarHidden; callbackForCurrentState(/* justUnlocked = */ false); } private void handleOverviewShown() { + resetConsecutiveTaskSwitches(); callbackForCurrentState(/* justUnlocked = */ false); } @@ -227,7 +312,17 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { if (mIsDozing || mIsNavBarHidden || mOnLockscreen) { mAssistHandleCallbacks.hide(); } else if (justUnlocked) { - mAssistHandleCallbacks.showAndGo(); + long currentEpochDay = LocalDate.now().toEpochDay(); + if (mLearnedHintLastShownEpochDay < currentEpochDay) { + if (mContext != null) { + Settings.Secure.putLong( + mContext.getContentResolver(), + LEARNED_HINT_LAST_SHOWN_KEY, + currentEpochDay); + } + mLearnedHintLastShownEpochDay = currentEpochDay; + mAssistHandleCallbacks.showAndGo(); + } } } @@ -236,12 +331,28 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { return; } - if (mIsDozing || mIsNavBarHidden) { + if (mIsDozing || mIsNavBarHidden || isSuppressed()) { mAssistHandleCallbacks.hide(); } else if (mOnLockscreen) { mAssistHandleCallbacks.showAndStay(); - } else { + } else if (mIsLauncherShowing) { mAssistHandleCallbacks.showAndGo(); + } else if (mConsecutiveTaskSwitches == 1) { + mAssistHandleCallbacks.showAndGoDelayed( + getShowAndGoDelayedShortDelayMs(), /* hideIfShowing = */ false); + } else { + mAssistHandleCallbacks.showAndGoDelayed( + getShowAndGoDelayedLongDelayMs(), /* hideIfShowing = */ true); + } + } + + private boolean isSuppressed() { + if (mOnLockscreen) { + return getSuppressOnLockscreen(); + } else if (mIsLauncherShowing) { + return getSuppressOnLauncher(); + } else { + return getSuppressOnApps(); } } @@ -260,17 +371,114 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { mLearningCount >= getLearningCount() || mLearningTimeElapsed >= getLearningTimeMs(); } + private void resetConsecutiveTaskSwitches() { + mHandler.removeCallbacks(mResetConsecutiveTaskSwitches); + mConsecutiveTaskSwitches = 0; + } + + private void rescheduleConsecutiveTaskSwitchesReset() { + mHandler.removeCallbacks(mResetConsecutiveTaskSwitches); + mHandler.postDelayed(mResetConsecutiveTaskSwitches, getShowAndGoDelayResetTimeoutMs()); + } + private long getLearningTimeMs() { - return DeviceConfig.getLong( - DeviceConfig.NAMESPACE_SYSTEMUI, + return mPhenotypeHelper.getLong( SystemUiDeviceConfigFlags.ASSIST_HANDLES_LEARN_TIME_MS, DEFAULT_LEARNING_TIME_MS); } private int getLearningCount() { - return DeviceConfig.getInt( - DeviceConfig.NAMESPACE_SYSTEMUI, + return mPhenotypeHelper.getInt( SystemUiDeviceConfigFlags.ASSIST_HANDLES_LEARN_COUNT, DEFAULT_LEARNING_COUNT); } + + private long getShowAndGoDelayedShortDelayMs() { + return mPhenotypeHelper.getLong( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DELAYED_SHORT_DELAY_MS, + DEFAULT_SHOW_AND_GO_DELAYED_SHORT_DELAY_MS); + } + + private long getShowAndGoDelayedLongDelayMs() { + return mPhenotypeHelper.getLong( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DELAYED_LONG_DELAY_MS, + DEFAULT_SHOW_AND_GO_DELAYED_LONG_DELAY_MS); + } + + private long getShowAndGoDelayResetTimeoutMs() { + return mPhenotypeHelper.getLong( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DELAY_RESET_TIMEOUT_MS, + DEFAULT_SHOW_AND_GO_DELAY_RESET_TIMEOUT_MS); + } + + private boolean getSuppressOnLockscreen() { + return mPhenotypeHelper.getBoolean( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SUPPRESS_ON_LOCKSCREEN, + DEFAULT_SUPPRESS_ON_LOCKSCREEN); + } + + private boolean getSuppressOnLauncher() { + return mPhenotypeHelper.getBoolean( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SUPPRESS_ON_LAUNCHER, + DEFAULT_SUPPRESS_ON_LAUNCHER); + } + + private boolean getSuppressOnApps() { + return mPhenotypeHelper.getBoolean( + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SUPPRESS_ON_APPS, + DEFAULT_SUPPRESS_ON_APPS); + } + + @Override + public void dump(PrintWriter pw, String prefix) { + pw.println(prefix + "Current AssistHandleReminderExpBehavior State:"); + pw.println(prefix + " mOnLockscreen=" + mOnLockscreen); + pw.println(prefix + " mIsDozing=" + mIsDozing); + pw.println(prefix + " mRunningTaskId=" + mRunningTaskId); + pw.println(prefix + " mDefaultHome=" + mDefaultHome); + pw.println(prefix + " mIsNavBarHidden=" + mIsNavBarHidden); + pw.println(prefix + " mIsLauncherShowing=" + mIsLauncherShowing); + pw.println(prefix + " mConsecutiveTaskSwitches=" + mConsecutiveTaskSwitches); + pw.println(prefix + " mIsLearned=" + mIsLearned); + pw.println(prefix + " mLastLearningTimestamp=" + mLastLearningTimestamp); + pw.println(prefix + " mLearningTimeElapsed=" + mLearningTimeElapsed); + pw.println(prefix + " mLearningCount=" + mLearningCount); + pw.println(prefix + " mLearnedHintLastShownEpochDay=" + mLearnedHintLastShownEpochDay); + pw.println( + prefix + " mAssistHandleCallbacks present: " + (mAssistHandleCallbacks != null)); + + pw.println(prefix + " Phenotype Flags:"); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_LEARN_TIME_MS + + "=" + + getLearningTimeMs()); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_LEARN_COUNT + + "=" + + getLearningCount()); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DELAYED_SHORT_DELAY_MS + + "=" + + getShowAndGoDelayedShortDelayMs()); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DELAYED_LONG_DELAY_MS + + "=" + + getShowAndGoDelayedLongDelayMs()); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DELAY_RESET_TIMEOUT_MS + + "=" + + getShowAndGoDelayResetTimeoutMs()); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SUPPRESS_ON_LOCKSCREEN + + "=" + + getSuppressOnLockscreen()); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SUPPRESS_ON_LAUNCHER + + "=" + + getSuppressOnLauncher()); + pw.println(prefix + " " + + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SUPPRESS_ON_APPS + + "=" + + getSuppressOnApps()); + } } diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhenotypeHelper.java b/packages/SystemUI/src/com/android/systemui/assist/PhenotypeHelper.java new file mode 100644 index 000000000000..61395f158aea --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/PhenotypeHelper.java @@ -0,0 +1,51 @@ +/* + * 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.assist; + +import android.provider.DeviceConfig; + +import androidx.annotation.Nullable; + +import java.util.concurrent.Executor; + +class PhenotypeHelper { + + PhenotypeHelper() {} + + long getLong(String name, long defaultValue) { + return DeviceConfig.getLong(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); + } + + int getInt(String name, int defaultValue) { + return DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); + } + + @Nullable + String getString(String name, @Nullable String defaultValue) { + return DeviceConfig.getString(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); + } + + boolean getBoolean(String name, boolean defaultValue) { + return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); + } + + void addOnPropertiesChangedListener( + Executor executor, DeviceConfig.OnPropertiesChangedListener listener) { + DeviceConfig.addOnPropertiesChangedListener( + DeviceConfig.NAMESPACE_SYSTEMUI, executor, listener); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java index 1fd3089aaa41..e73dc4a57bd7 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java @@ -16,8 +16,6 @@ package com.android.systemui.assist; -import static com.android.systemui.shared.system.PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED; - import android.app.ActivityManager; import android.app.KeyguardManager; import android.content.BroadcastReceiver; @@ -25,6 +23,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ResolveInfo; import androidx.annotation.Nullable; @@ -38,6 +37,7 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.StatusBar; import java.util.ArrayList; +import java.util.List; /** Class to monitor and report the state of the phone. */ final class PhoneStateMonitor { @@ -53,6 +53,14 @@ final class PhoneStateMonitor { private static final int PHONE_STATE_APP_IMMERSIVE = 9; private static final int PHONE_STATE_APP_FULLSCREEN = 10; + private static final String[] DEFAULT_HOME_CHANGE_ACTIONS = new String[] { + PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED, + Intent.ACTION_BOOT_COMPLETED, + Intent.ACTION_PACKAGE_ADDED, + Intent.ACTION_PACKAGE_CHANGED, + Intent.ACTION_PACKAGE_REMOVED + }; + private final Context mContext; private final StatusBarStateController mStatusBarStateController; @@ -64,14 +72,17 @@ final class PhoneStateMonitor { mStatusBarStateController = Dependency.get(StatusBarStateController.class); ActivityManagerWrapper activityManagerWrapper = ActivityManagerWrapper.getInstance(); - mDefaultHome = PackageManagerWrapper.getInstance().getHomeActivities(new ArrayList<>()); + mDefaultHome = getCurrentDefaultHome(); + IntentFilter intentFilter = new IntentFilter(); + for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { + intentFilter.addAction(action); + } mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - mDefaultHome = - PackageManagerWrapper.getInstance().getHomeActivities(new ArrayList<>()); + mDefaultHome = getCurrentDefaultHome(); } - }, new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED)); + }, intentFilter); mLauncherShowing = isLauncherShowing(activityManagerWrapper.getRunningTask()); activityManagerWrapper.registerTaskStackListener(new TaskStackChangeListener() { @Override @@ -93,6 +104,28 @@ final class PhoneStateMonitor { return phoneState; } + @Nullable + private static ComponentName getCurrentDefaultHome() { + List<ResolveInfo> homeActivities = new ArrayList<>(); + ComponentName defaultHome = + PackageManagerWrapper.getInstance().getHomeActivities(homeActivities); + if (defaultHome != null) { + return defaultHome; + } + + int topPriority = Integer.MIN_VALUE; + ComponentName topComponent = null; + for (ResolveInfo resolveInfo : homeActivities) { + if (resolveInfo.priority > topPriority) { + topComponent = resolveInfo.activityInfo.getComponentName(); + topPriority = resolveInfo.priority; + } else if (resolveInfo.priority == topPriority) { + topComponent = null; + } + } + return topComponent; + } + private int getPhoneLockscreenState() { if (isDozing()) { return PHONE_STATE_AOD1; diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java index 95c136f062b5..662de3a5b5f5 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java @@ -21,7 +21,6 @@ import static com.android.systemui.assist.AssistManager.DISMISS_REASON_INVOCATIO import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; -import android.annotation.ColorInt; import android.content.Context; import android.graphics.PixelFormat; import android.metrics.LogMaker; @@ -52,6 +51,7 @@ public class DefaultUiController implements AssistManager.UiController { private static final long ANIM_DURATION_MS = 200; protected final FrameLayout mRoot; + protected InvocationLightsView mInvocationLightsView; private final WindowManager mWindowManager; private final WindowManager.LayoutParams mLayoutParams; @@ -62,7 +62,6 @@ public class DefaultUiController implements AssistManager.UiController { private float mLastInvocationProgress = 0; private ValueAnimator mInvocationAnimator = new ValueAnimator(); - private InvocationLightsView mInvocationLightsView; public DefaultUiController(Context context) { mRoot = new FrameLayout(context); @@ -129,14 +128,6 @@ public class DefaultUiController implements AssistManager.UiController { updateAssistHandleVisibility(); } - /** - * Sets the colors of the four invocation lights, from left to right. - */ - public void setInvocationColors(@ColorInt int color1, @ColorInt int color2, - @ColorInt int color3, @ColorInt int color4) { - mInvocationLightsView.setColors(color1, color2, color3, color4); - } - protected static void logInvocationProgressMetrics( int type, float progress, boolean invocationWasInProgress) { // Logs assistant invocation start. diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java index de1d7c8c0a04..178f4c32bb75 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java @@ -16,24 +16,34 @@ package com.android.systemui.assist.ui; +import android.animation.ArgbEvaluator; import android.annotation.ColorInt; +import android.annotation.Nullable; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.Log; import android.util.MathUtils; +import android.view.ContextThemeWrapper; import android.view.View; +import com.android.settingslib.Utils; +import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.statusbar.NavigationBarController; +import com.android.systemui.statusbar.phone.NavigationBarFragment; +import com.android.systemui.statusbar.phone.NavigationBarTransitions; import java.util.ArrayList; /** * Shows lights at the bottom of the phone, marking the invocation progress. */ -public class InvocationLightsView extends View { +public class InvocationLightsView extends View + implements NavigationBarTransitions.DarkIntensityListener { private static final String TAG = "InvocationLightsView"; @@ -49,9 +59,16 @@ public class InvocationLightsView extends View { // allocation on each frame. private final Path mPath = new Path(); private final int mViewHeight; + private final int mStrokeWidth; + @ColorInt + private final int mLightColor; + @ColorInt + private final int mDarkColor; // Allocate variable for screen location lookup to avoid memory alloc onDraw() private int[] mScreenLocation = new int[2]; + private boolean mRegistered = false; + private boolean mUseNavBarColor = true; public InvocationLightsView(Context context) { this(context, null); @@ -69,8 +86,8 @@ public class InvocationLightsView extends View { int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - int strokeWidth = DisplayUtils.convertDpToPx(LIGHT_HEIGHT_DP, context); - mPaint.setStrokeWidth(strokeWidth); + mStrokeWidth = DisplayUtils.convertDpToPx(LIGHT_HEIGHT_DP, context); + mPaint.setStrokeWidth(mStrokeWidth); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.MITER); mPaint.setAntiAlias(true); @@ -82,13 +99,19 @@ public class InvocationLightsView extends View { CircularCornerPathRenderer cornerPathRenderer = new CircularCornerPathRenderer( cornerRadiusBottom, cornerRadiusTop, displayWidth, displayHeight); mGuide = new PerimeterPathGuide(context, cornerPathRenderer, - strokeWidth / 2, displayWidth, displayHeight); + mStrokeWidth / 2, displayWidth, displayHeight); mViewHeight = Math.max(cornerRadiusBottom, cornerRadiusTop); - @ColorInt int lightColor = getResources().getColor(R.color.default_invocation_lights_color); + final int dualToneDarkTheme = Utils.getThemeAttr(mContext, R.attr.darkIconTheme); + final int dualToneLightTheme = Utils.getThemeAttr(mContext, R.attr.lightIconTheme); + Context lightContext = new ContextThemeWrapper(mContext, dualToneLightTheme); + Context darkContext = new ContextThemeWrapper(mContext, dualToneDarkTheme); + mLightColor = Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor); + mDarkColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor); + for (int i = 0; i < 4; i++) { - mAssistInvocationLights.add(new EdgeLight(lightColor, 0, 0)); + mAssistInvocationLights.add(new EdgeLight(Color.TRANSPARENT, 0, 0)); } } @@ -100,6 +123,8 @@ public class InvocationLightsView extends View { if (progress == 0) { setVisibility(View.GONE); } else { + attemptRegisterNavBarListener(); + float cornerLengthNormalized = mGuide.getRegionWidth(PerimeterPathGuide.Region.BOTTOM_LEFT); float arcLengthNormalized = cornerLengthNormalized * MINIMUM_CORNER_RATIO; @@ -131,6 +156,21 @@ public class InvocationLightsView extends View { for (EdgeLight light : mAssistInvocationLights) { light.setLength(0); } + attemptUnregisterNavBarListener(); + } + + /** + * Sets all invocation lights to a single color. If color is null, uses the navigation bar + * color (updated when the nav bar color changes). + */ + public void setColors(@Nullable @ColorInt Integer color) { + if (color == null) { + mUseNavBarColor = true; + mPaint.setStrokeCap(Paint.Cap.BUTT); + attemptRegisterNavBarListener(); + } else { + setColors(color, color, color, color); + } } /** @@ -138,12 +178,25 @@ public class InvocationLightsView extends View { */ public void setColors(@ColorInt int color1, @ColorInt int color2, @ColorInt int color3, @ColorInt int color4) { + mUseNavBarColor = false; + attemptUnregisterNavBarListener(); mAssistInvocationLights.get(0).setColor(color1); mAssistInvocationLights.get(1).setColor(color2); mAssistInvocationLights.get(2).setColor(color3); mAssistInvocationLights.get(3).setColor(color4); } + /** + * Reacts to changes in the navigation bar color + * + * @param darkIntensity 0 is the lightest color, 1 is the darkest. + */ + @Override // NavigationBarTransitions.DarkIntensityListener + public void onDarkIntensity(float darkIntensity) { + updateDarkness(darkIntensity); + } + + @Override protected void onFinishInflate() { getLayoutParams().height = mViewHeight; @@ -166,15 +219,19 @@ public class InvocationLightsView extends View { getLocationOnScreen(mScreenLocation); canvas.translate(-mScreenLocation[0], -mScreenLocation[1]); - // if the lights are different colors, the inner ones need to be drawn last and with a - // square cap so that the join between lights is straight - mPaint.setStrokeCap(Paint.Cap.ROUND); - renderLight(mAssistInvocationLights.get(0), canvas); - renderLight(mAssistInvocationLights.get(3), canvas); + if (mUseNavBarColor) { + for (EdgeLight light : mAssistInvocationLights) { + renderLight(light, canvas); + } + } else { + mPaint.setStrokeCap(Paint.Cap.ROUND); + renderLight(mAssistInvocationLights.get(0), canvas); + renderLight(mAssistInvocationLights.get(3), canvas); - mPaint.setStrokeCap(Paint.Cap.SQUARE); - renderLight(mAssistInvocationLights.get(1), canvas); - renderLight(mAssistInvocationLights.get(2), canvas); + mPaint.setStrokeCap(Paint.Cap.BUTT); + renderLight(mAssistInvocationLights.get(1), canvas); + renderLight(mAssistInvocationLights.get(2), canvas); + } } protected void setLight(int index, float offset, float length) { @@ -185,10 +242,58 @@ public class InvocationLightsView extends View { mAssistInvocationLights.get(index).setLength(length); } + /** + * Receives an intensity from 0 (lightest) to 1 (darkest) and sets the handle color + * appropriately. Intention is to match the home handle color. + */ + protected void updateDarkness(float darkIntensity) { + if (mUseNavBarColor) { + @ColorInt int invocationColor = (int) ArgbEvaluator.getInstance().evaluate( + darkIntensity, mLightColor, mDarkColor); + for (EdgeLight light : mAssistInvocationLights) { + light.setColor(invocationColor); + } + invalidate(); + } + } + private void renderLight(EdgeLight light, Canvas canvas) { mGuide.strokeSegment(mPath, light.getOffset(), light.getOffset() + light.getLength()); mPaint.setColor(light.getColor()); canvas.drawPath(mPath, mPaint); } + private void attemptRegisterNavBarListener() { + if (!mRegistered) { + NavigationBarController controller = Dependency.get(NavigationBarController.class); + if (controller == null) { + return; + } + + NavigationBarFragment navBar = controller.getDefaultNavigationBarFragment(); + if (navBar == null) { + return; + } + + updateDarkness(navBar.getBarTransitions().addDarkIntensityListener(this)); + mRegistered = true; + } + } + + private void attemptUnregisterNavBarListener() { + if (mRegistered) { + NavigationBarController controller = Dependency.get(NavigationBarController.class); + if (controller == null) { + return; + } + + NavigationBarFragment navBar = controller.getDefaultNavigationBarFragment(); + if (navBar == null) { + return; + } + + navBar.getBarTransitions().removeDarkIntensityListener(this); + mRegistered = false; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index 5717a54fd8a0..18b8a9c859b1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -228,6 +228,10 @@ public abstract class BiometricDialogView extends LinearLayout { showTryAgainButton(false /* show */); mCallback.onTryAgainPressed(); }); + + // Must set these in order for the back button events to be received. + mLayout.setFocusableInTouchMode(true); + mLayout.requestFocus(); } public void onSaveState(Bundle bundle) { diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index 835ffc976e9f..6f56a53c1c49 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -16,18 +16,11 @@ package com.android.systemui.colorextraction; -import android.annotation.ColorInt; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; -import android.os.Handler; -import android.os.RemoteException; +import android.graphics.Color; import android.os.UserHandle; -import android.util.Log; -import android.view.Display; -import android.view.IWallpaperVisibilityListener; -import android.view.IWindowManager; -import android.view.WindowManagerGlobal; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; @@ -52,46 +45,28 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, ConfigurationController.ConfigurationListener { private static final String TAG = "SysuiColorExtractor"; private final Tonal mTonal; - private boolean mWallpaperVisible; - private boolean mHasBackdrop; - // Colors to return when the wallpaper isn't visible - private final GradientColors mWpHiddenColors; + private boolean mHasMediaArtwork; + private final GradientColors mNeutralColorsLock; + private final GradientColors mBackdropColors; @Inject public SysuiColorExtractor(Context context, ConfigurationController configurationController) { - this(context, new Tonal(context), configurationController, true); + this(context, new Tonal(context), configurationController, + context.getSystemService(WallpaperManager.class), false /* immediately */); } @VisibleForTesting public SysuiColorExtractor(Context context, ExtractionType type, - ConfigurationController configurationController, boolean registerVisibility) { - super(context, type, false /* immediately */); + ConfigurationController configurationController, + WallpaperManager wallpaperManager, boolean immediately) { + super(context, type, immediately, wallpaperManager); mTonal = type instanceof Tonal ? (Tonal) type : new Tonal(context); - mWpHiddenColors = new GradientColors(); + mNeutralColorsLock = new GradientColors(); configurationController.addCallback(this); - WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); - updateDefaultGradients(systemColors); - - if (registerVisibility) { - try { - IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService(); - Handler handler = Handler.getMain(); - boolean visible = windowManagerService.registerWallpaperVisibilityListener( - new IWallpaperVisibilityListener.Stub() { - @Override - public void onWallpaperVisibilityChanged(boolean newVisibility, - int displayId) throws RemoteException { - handler.post(() -> setWallpaperVisible(newVisibility)); - } - }, Display.DEFAULT_DISPLAY); - setWallpaperVisible(visible); - } catch (RemoteException e) { - Log.w(TAG, "Can't listen to wallpaper visibility changes", e); - } - } + mBackdropColors = new GradientColors(); + mBackdropColors.setMainColor(Color.BLACK); - WallpaperManager wallpaperManager = context.getSystemService(WallpaperManager.class); if (wallpaperManager != null) { // Listen to all users instead of only the current one. wallpaperManager.removeOnColorsChangedListener(this); @@ -100,8 +75,14 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, } } - private void updateDefaultGradients(WallpaperColors colors) { - mTonal.applyFallback(colors, mWpHiddenColors); + @Override + protected void extractWallpaperColors() { + super.extractWallpaperColors(); + // mTonal is final but this method will be invoked by the base class during its ctor. + if (mTonal == null) { + return; + } + mTonal.applyFallback(mLockColors == null ? mSystemColors : mLockColors, mNeutralColorsLock); } @Override @@ -110,27 +91,28 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, // Colors do not belong to current user, ignoring. return; } - - super.onColorsChanged(colors, which); - - if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { - @ColorInt int oldColor = mWpHiddenColors.getMainColor(); - updateDefaultGradients(colors); - if (oldColor != mWpHiddenColors.getMainColor()) { - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); - } + if ((which & WallpaperManager.FLAG_LOCK) != 0) { + mTonal.applyFallback(colors, mNeutralColorsLock); } + super.onColorsChanged(colors, which); } @Override public void onUiModeChanged() { - WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); - updateDefaultGradients(systemColors); - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); + extractWallpaperColors(); + triggerColorsChanged(WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK); + } + + @Override + public GradientColors getColors(int which, int type) { + if (mHasMediaArtwork && (which & WallpaperManager.FLAG_LOCK) != 0) { + return mBackdropColors; + } + return super.getColors(which, type); } /** - * Colors the should be using for scrims. + * Colors that should be using for scrims. * * They will be: * - A light gray if the wallpaper is light @@ -138,81 +120,12 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, * - Black otherwise */ public GradientColors getNeutralColors() { - return mWpHiddenColors; - } - - /** - * Get TYPE_NORMAL colors when wallpaper is visible, or fallback otherwise. - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @return colors - */ - @Override - public GradientColors getColors(int which) { - return getColors(which, TYPE_DARK); - } - - /** - * Wallpaper colors when the wallpaper is visible, fallback otherwise. - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @param type TYPE_NORMAL, TYPE_DARK or TYPE_EXTRA_DARK - * @return colors - */ - @Override - public GradientColors getColors(int which, int type) { - return getColors(which, type, false /* ignoreVisibility */); - } - - /** - * Get TYPE_NORMAL colors, possibly ignoring wallpaper visibility. - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @param ignoreWallpaperVisibility whether you want fallback colors or not if the wallpaper - * isn't visible - * @return - */ - public GradientColors getColors(int which, boolean ignoreWallpaperVisibility) { - return getColors(which, TYPE_NORMAL, ignoreWallpaperVisibility); - } - - /** - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @param type TYPE_NORMAL, TYPE_DARK or TYPE_EXTRA_DARK - * @param ignoreWallpaperVisibility true if true wallpaper colors should be returning - * if it's visible or not - * @return colors - */ - public GradientColors getColors(int which, int type, boolean ignoreWallpaperVisibility) { - // mWallpaperVisible only handles the "system wallpaper" and will be always set to false - // if we have different lock and system wallpapers. - if (which == WallpaperManager.FLAG_SYSTEM) { - if (mWallpaperVisible || ignoreWallpaperVisibility) { - return super.getColors(which, type); - } else { - return mWpHiddenColors; - } - } else { - if (mHasBackdrop) { - return mWpHiddenColors; - } else { - return super.getColors(which, type); - } - } - } - - @VisibleForTesting - void setWallpaperVisible(boolean visible) { - if (mWallpaperVisible != visible) { - mWallpaperVisible = visible; - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); - } + return mHasMediaArtwork ? mBackdropColors : mNeutralColorsLock; } - public void setHasBackdrop(boolean hasBackdrop) { - if (mHasBackdrop != hasBackdrop) { - mHasBackdrop = hasBackdrop; + public void setHasMediaArtwork(boolean hasBackdrop) { + if (mHasMediaArtwork != hasBackdrop) { + mHasMediaArtwork = hasBackdrop; triggerColorsChanged(WallpaperManager.FLAG_LOCK); } } @@ -230,7 +143,8 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, pw.println(" Gradients:"); pw.println(" system: " + Arrays.toString(system)); pw.println(" lock: " + Arrays.toString(lock)); - pw.println(" Default scrim: " + mWpHiddenColors); + pw.println(" Neutral colors: " + mNeutralColorsLock); + pw.println(" Has media backdrop: " + mHasMediaArtwork); } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 831d07446e7c..5f52486b2bc6 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -70,11 +70,12 @@ public class DozeSensors { private final Consumer<Boolean> mProxCallback; private final Callback mCallback; @VisibleForTesting - protected final TriggerSensor[] mSensors; + protected TriggerSensor[] mSensors; private final Handler mHandler = new Handler(); private final ProxSensor mProxSensor; private long mDebounceFrom; + private boolean mSettingRegistered; public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, @@ -172,13 +173,8 @@ public class DozeSensors { public void setListening(boolean listen) { for (TriggerSensor s : mSensors) { s.setListening(listen); - if (listen) { - s.registerSettingsObserver(mSettingsObserver); - } - } - if (!listen) { - mResolver.unregisterContentObserver(mSettingsObserver); } + registerSettingsObserverIfNeeded(listen); } /** Set the listening state of only the sensors that require the touchscreen. */ @@ -240,6 +236,17 @@ public class DozeSensors { return mProxSensor.mCurrentlyFar; } + private void registerSettingsObserverIfNeeded(boolean register) { + if (!register) { + mResolver.unregisterContentObserver(mSettingsObserver); + } else if (!mSettingRegistered) { + for (TriggerSensor s : mSensors) { + s.registerSettingsObserver(mSettingsObserver); + } + } + mSettingRegistered = register; + } + private class ProxSensor implements SensorEventListener { boolean mRequested; diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java index 5d85cbf88f4e..b615a5f32835 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java @@ -52,6 +52,13 @@ public interface GLWallpaperRenderer { void updateAmbientMode(boolean inAmbientMode, long duration); /** + * Notify the wallpaper offsets changed. + * @param xOffset offset along x axis. + * @param yOffset offset along y axis. + */ + void updateOffsets(float xOffset, float yOffset); + + /** * Ask renderer to report the surface size it needs. */ Size reportSurfaceSize(); diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java index 4be7623f90f2..626d0cfed997 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java @@ -33,9 +33,12 @@ import static android.opengl.GLES20.glUniform1i; import static android.opengl.GLES20.glVertexAttribPointer; import android.graphics.Bitmap; +import android.graphics.Rect; import android.opengl.GLUtils; import android.util.Log; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; @@ -91,6 +94,8 @@ class ImageGLWallpaper { private int mUniTexture; private int mTextureId; + private float[] mCurrentTexCoordinate; + ImageGLWallpaper(ImageGLProgram program) { mProgram = program; @@ -195,4 +200,106 @@ class ImageGLWallpaper { glUniform1i(mUniTexture, 0); } + /** + * This method adjust s(x-axis), t(y-axis) texture coordinates to get current display area + * of texture and will be used during transition. + * The adjustment happens if either the width or height of the surface is larger than + * corresponding size of the display area. + * If both width and height are larger than corresponding size of the display area, + * the adjustment will happen at both s, t side. + * + * @param surface The size of the surface. + * @param scissor The display area. + * @param xOffset The offset amount along s axis. + * @param yOffset The offset amount along t axis. + */ + void adjustTextureCoordinates(Rect surface, Rect scissor, float xOffset, float yOffset) { + mCurrentTexCoordinate = TEXTURES.clone(); + + if (surface == null || scissor == null) { + mTextureBuffer.put(mCurrentTexCoordinate); + mTextureBuffer.position(0); + return; + } + + int surfaceWidth = surface.width(); + int surfaceHeight = surface.height(); + int scissorWidth = scissor.width(); + int scissorHeight = scissor.height(); + + if (surfaceWidth > scissorWidth) { + // Calculate the new s pos in pixels. + float pixelS = (float) Math.round((surfaceWidth - scissorWidth) * xOffset); + // Calculate the s pos in texture coordinate. + float coordinateS = pixelS / surfaceWidth; + // Calculate the percentage occupied by the scissor width in surface width. + float surfacePercentageW = (float) scissorWidth / surfaceWidth; + // Need also consider the case if surface height is smaller than scissor height. + if (surfaceHeight < scissorHeight) { + // We will narrow the surface percentage to keep aspect ratio. + surfacePercentageW *= (float) surfaceHeight / scissorHeight; + } + // Determine the final s pos, also limit the legal s pos to prevent from out of range. + float s = coordinateS + surfacePercentageW > 1f ? 1f - surfacePercentageW : coordinateS; + // Traverse the s pos in texture coordinates array and adjust the s pos accordingly. + for (int i = 0; i < mCurrentTexCoordinate.length; i += 2) { + // indices 2, 4 and 6 are the end of s coordinates. + if (i == 2 || i == 4 || i == 6) { + mCurrentTexCoordinate[i] = Math.min(1f, s + surfacePercentageW); + } else { + mCurrentTexCoordinate[i] = s; + } + } + } + + if (surfaceHeight > scissorHeight) { + // Calculate the new t pos in pixels. + float pixelT = (float) Math.round((surfaceHeight - scissorHeight) * yOffset); + // Calculate the t pos in texture coordinate. + float coordinateT = pixelT / surfaceHeight; + // Calculate the percentage occupied by the scissor height in surface height. + float surfacePercentageH = (float) scissorHeight / surfaceHeight; + // Need also consider the case if surface width is smaller than scissor width. + if (surfaceWidth < scissorWidth) { + // We will narrow the surface percentage to keep aspect ratio. + surfacePercentageH *= (float) surfaceWidth / scissorWidth; + } + // Determine the final t pos, also limit the legal t pos to prevent from out of range. + float t = coordinateT + surfacePercentageH > 1f ? 1f - surfacePercentageH : coordinateT; + // Traverse the t pos in texture coordinates array and adjust the t pos accordingly. + for (int i = 1; i < mCurrentTexCoordinate.length; i += 2) { + // indices 1, 3 and 11 are the end of t coordinates. + if (i == 1 || i == 3 || i == 11) { + mCurrentTexCoordinate[i] = Math.min(1f, t + surfacePercentageH); + } else { + mCurrentTexCoordinate[i] = t; + } + } + } + + mTextureBuffer.put(mCurrentTexCoordinate); + mTextureBuffer.position(0); + } + + /** + * Called to dump current state. + * @param prefix prefix. + * @param fd fd. + * @param out out. + * @param args args. + */ + public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + if (mCurrentTexCoordinate != null) { + for (int i = 0; i < mCurrentTexCoordinate.length; i++) { + sb.append(mCurrentTexCoordinate[i]).append(','); + if (i == mCurrentTexCoordinate.length - 1) { + sb.deleteCharAt(sb.length() - 1); + } + } + } + sb.append('}'); + out.print(prefix); out.print("mTexCoordinates="); out.println(sb.toString()); + } } diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java index 21711fb1890c..93d8dd6146a6 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java @@ -29,6 +29,8 @@ import android.graphics.Rect; import android.util.Log; import android.util.MathUtils; import android.util.Size; +import android.view.DisplayInfo; +import android.view.WindowManager; import com.android.systemui.R; @@ -41,8 +43,8 @@ import java.io.PrintWriter; public class ImageWallpaperRenderer implements GLWallpaperRenderer, ImageRevealHelper.RevealStateListener { private static final String TAG = ImageWallpaperRenderer.class.getSimpleName(); - private static final float SCALE_VIEWPORT_MIN = 0.98f; - private static final float SCALE_VIEWPORT_MAX = 1f; + private static final float SCALE_VIEWPORT_MIN = 1f; + private static final float SCALE_VIEWPORT_MAX = 1.1f; private final WallpaperManager mWallpaperManager; private final ImageGLProgram mProgram; @@ -51,8 +53,13 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, private final ImageRevealHelper mImageRevealHelper; private SurfaceProxy mProxy; - private Rect mSurfaceSize; + private final Rect mScissor; + private final Rect mSurfaceSize = new Rect(); + private final Rect mViewport = new Rect(); private Bitmap mBitmap; + private boolean mScissorMode; + private float mXOffset; + private float mYOffset; public ImageWallpaperRenderer(Context context, SurfaceProxy proxy) { mWallpaperManager = context.getSystemService(WallpaperManager.class); @@ -60,6 +67,11 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, Log.w(TAG, "WallpaperManager not available"); } + DisplayInfo displayInfo = new DisplayInfo(); + WindowManager wm = context.getSystemService(WindowManager.class); + wm.getDefaultDisplay().getDisplayInfo(displayInfo); + mScissor = new Rect(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight); + mProxy = proxy; mProgram = new ImageGLProgram(context); mWallpaper = new ImageGLWallpaper(mProgram); @@ -91,7 +103,7 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, mBitmap = mWallpaperManager.getBitmap(); mWallpaperManager.forgetLoadedWallpaper(); if (mBitmap != null) { - mSurfaceSize = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); + mSurfaceSize.set(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); } } return mBitmap != null; @@ -107,13 +119,17 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, float threshold = mImageProcessHelper.getThreshold(); float reveal = mImageRevealHelper.getReveal(); - glClear(GL_COLOR_BUFFER_BIT); - glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_AOD2OPACITY), 1); glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_PER85), threshold); glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_REVEAL), reveal); - scaleViewport(reveal); + glClear(GL_COLOR_BUFFER_BIT); + // We only need to scale viewport while doing transition. + if (mScissorMode) { + scaleViewport(reveal); + } else { + glViewport(0, 0, mSurfaceSize.width(), mSurfaceSize.height()); + } mWallpaper.useTexture(); mWallpaper.draw(); } @@ -124,6 +140,15 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, } @Override + public void updateOffsets(float xOffset, float yOffset) { + mXOffset = xOffset; + mYOffset = yOffset; + int left = (int) ((mSurfaceSize.width() - mScissor.width()) * xOffset); + int right = left + mScissor.width(); + mScissor.set(left, mScissor.top, right, mScissor.bottom); + } + + @Override public Size reportSurfaceSize() { return new Size(mSurfaceSize.width(), mSurfaceSize.height()); } @@ -134,15 +159,18 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, } private void scaleViewport(float reveal) { - int width = mSurfaceSize.width(); - int height = mSurfaceSize.height(); + int left = mScissor.left; + int top = mScissor.top; + int width = mScissor.width(); + int height = mScissor.height(); // Interpolation between SCALE_VIEWPORT_MAX and SCALE_VIEWPORT_MIN by reveal. - float vpScaled = MathUtils.lerp(SCALE_VIEWPORT_MAX, SCALE_VIEWPORT_MIN, reveal); + float vpScaled = MathUtils.lerp(SCALE_VIEWPORT_MIN, SCALE_VIEWPORT_MAX, reveal); // Calculate the offset amount from the lower left corner. - float offset = (SCALE_VIEWPORT_MAX - vpScaled) / 2; + float offset = (SCALE_VIEWPORT_MIN - vpScaled) / 2; // Change the viewport. - glViewport((int) (width * offset), (int) (height * offset), + mViewport.set((int) (left + width * offset), (int) (top + height * offset), (int) (width * vpScaled), (int) (height * vpScaled)); + glViewport(mViewport.left, mViewport.top, mViewport.right, mViewport.bottom); } @Override @@ -152,11 +180,19 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, @Override public void onRevealStart() { + mScissorMode = true; + // Use current display area of texture. + mWallpaper.adjustTextureCoordinates(mSurfaceSize, mScissor, mXOffset, mYOffset); mProxy.preRender(); } @Override public void onRevealEnd() { + mScissorMode = false; + // reset texture coordinates to use full texture. + mWallpaper.adjustTextureCoordinates(null, null, 0, 0); + // We need draw full texture back before finishing render. + mProxy.requestRender(); mProxy.postRender(); } @@ -164,6 +200,12 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { out.print(prefix); out.print("mProxy="); out.print(mProxy); out.print(prefix); out.print("mSurfaceSize="); out.print(mSurfaceSize); + out.print(prefix); out.print("mScissor="); out.print(mScissor); + out.print(prefix); out.print("mViewport="); out.print(mViewport); + out.print(prefix); out.print("mScissorMode="); out.print(mScissorMode); + out.print(prefix); out.print("mXOffset="); out.print(mXOffset); + out.print(prefix); out.print("mYOffset="); out.print(mYOffset); out.print(prefix); out.print("threshold="); out.print(mImageProcessHelper.getThreshold()); + mWallpaper.dump(prefix, fd, out, args); } } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index 3ec6cb78ecc1..b05058a92650 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -125,6 +125,7 @@ public class PipTouchHandler { private int mImeOffset; private boolean mIsShelfShowing; private int mShelfHeight; + private int mMovementBoundsExtraOffsets; private float mSavedSnapFraction = -1f; private boolean mSendingHoverAccessibilityEvents; private boolean mMovementWithinMinimize; @@ -262,7 +263,7 @@ public class PipTouchHandler { mShelfHeight = shelfHeight; } - public void onMovementBoundsChanged(Rect insetBounds, Rect normalBounds, Rect animatingBounds, + public void onMovementBoundsChanged(Rect insetBounds, Rect normalBounds, Rect curBounds, boolean fromImeAdjustment, boolean fromShelfAdjustment, int displayRotation) { final int bottomOffset = mIsImeShowing ? mImeHeight : 0; @@ -283,6 +284,12 @@ public class PipTouchHandler { mSnapAlgorithm.getMovementBounds(mExpandedBounds, insetBounds, expandedMovementBounds, bottomOffset); + // The extra offset does not really affect the movement bounds, but are applied based on the + // current state (ime showing, or shelf offset) when we need to actually shift + int extraOffset = Math.max( + mIsImeShowing ? mImeOffset : 0, + !mIsImeShowing && mIsShelfShowing ? mShelfHeight : 0); + // If this is from an IME or shelf adjustment, then we should move the PiP so that it is not // occluded by the IME or shelf. if (fromImeAdjustment || fromShelfAdjustment) { @@ -290,41 +297,19 @@ public class PipTouchHandler { // Defer the update of the current movement bounds until after the user finishes // touching the screen } else { - final int adjustedOffset = Math.max(mIsImeShowing ? mImeHeight + mImeOffset : 0, - mIsShelfShowing ? mShelfHeight : 0); - Rect normalAdjustedBounds = new Rect(); - mSnapAlgorithm.getMovementBounds(mNormalBounds, insetBounds, normalAdjustedBounds, - adjustedOffset); - Rect expandedAdjustedBounds = new Rect(); - mSnapAlgorithm.getMovementBounds(mExpandedBounds, insetBounds, - expandedAdjustedBounds, adjustedOffset); - final Rect toAdjustedBounds = mMenuState == MENU_STATE_FULL - ? expandedAdjustedBounds - : normalAdjustedBounds; - final Rect toMovementBounds = mMenuState == MENU_STATE_FULL - ? expandedMovementBounds - : normalMovementBounds; - - // If the PIP window needs to shift to right above shelf/IME and it's already above - // that, don't move the PIP window. - if (toAdjustedBounds.bottom < mMovementBounds.bottom - && animatingBounds.top < toAdjustedBounds.bottom) { - return; - } - - // If the PIP window needs to shift down due to dismissal of shelf/IME but it's way - // above the position as if shelf/IME shows, don't move the PIP window. - int movementBoundsAdjustment = toMovementBounds.bottom - mMovementBounds.bottom; - int offsetAdjustment = fromImeAdjustment ? mImeOffset : mShelfHeight; - final float bottomOffsetBufferInPx = BOTTOM_OFFSET_BUFFER_DP + final float offsetBufferPx = BOTTOM_OFFSET_BUFFER_DP * mContext.getResources().getDisplayMetrics().density; - if (toAdjustedBounds.bottom >= mMovementBounds.bottom - && animatingBounds.top + Math.round(bottomOffsetBufferInPx) - < toAdjustedBounds.bottom - movementBoundsAdjustment - offsetAdjustment) { - return; + final Rect toMovementBounds = mMenuState == MENU_STATE_FULL + ? new Rect(expandedMovementBounds) + : new Rect(normalMovementBounds); + final int prevBottom = mMovementBounds.bottom - mMovementBoundsExtraOffsets; + final int toBottom = toMovementBounds.bottom < toMovementBounds.top + ? toMovementBounds.bottom + : toMovementBounds.bottom - extraOffset; + if ((Math.min(prevBottom, toBottom) - offsetBufferPx) <= curBounds.top + && curBounds.top <= (Math.max(prevBottom, toBottom) + offsetBufferPx)) { + mMotionHelper.animateToOffset(curBounds, toBottom - curBounds.top); } - - animateToOffset(animatingBounds, toAdjustedBounds); } } @@ -335,6 +320,7 @@ public class PipTouchHandler { mDisplayRotation = displayRotation; mInsetBounds.set(insetBounds); updateMovementBounds(mMenuState); + mMovementBoundsExtraOffsets = extraOffset; // If we have a deferred resize, apply it now if (mDeferResizeToNormalBoundsUntilRotation == displayRotation) { @@ -346,14 +332,6 @@ public class PipTouchHandler { } } - private void animateToOffset(Rect animatingBounds, Rect toAdjustedBounds) { - int offset = toAdjustedBounds.bottom - animatingBounds.top; - // In landscape mode, PIP window can go offset while launching IME. We want to align the - // the top of the PIP window with the top of the movement bounds in that case. - offset += Math.max(0, mMovementBounds.top - animatingBounds.top); - mMotionHelper.animateToOffset(animatingBounds, offset); - } - private void onRegistrationChanged(boolean isRegistered) { mAccessibilityManager.setPictureInPictureActionReplacingConnection(isRegistered ? new PipAccessibilityInteractionConnection(mMotionHelper, diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index 3c4898c7658b..af7de0e6b234 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -19,6 +19,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; @@ -48,6 +49,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; +import com.android.systemui.util.leak.GarbageMonitor; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -364,6 +366,10 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D if (tile.equals("default")) { if (!addedDefault) { tiles.addAll(Arrays.asList(defaultTileList.split(","))); + if (Build.IS_DEBUGGABLE + && GarbageMonitor.MemoryTile.ADD_TO_DEFAULT_ON_DEBUGGABLE_BUILDS) { + tiles.add(GarbageMonitor.MemoryTile.TILE_SPEC); + } addedDefault = true; } } else { diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 1848219606db..88a8b31dc361 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -41,7 +41,6 @@ import android.graphics.Region; import android.hardware.input.InputManager; import android.os.Binder; import android.os.Bundle; -import android.os.Debug; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -54,7 +53,6 @@ import android.view.MotionEvent; import android.view.accessibility.AccessibilityManager; import com.android.internal.policy.ScreenDecorationsUtils; -import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; @@ -69,6 +67,7 @@ import com.android.systemui.statusbar.phone.NavigationBarFragment; import com.android.systemui.statusbar.phone.NavigationBarView; import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; +import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; @@ -100,6 +99,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private final Context mContext; private final Handler mHandler; + private final NavigationBarController mNavBarController; + private final StatusBarWindowController mStatusBarWinController; private final Runnable mConnectionRunnable = this::internalConnectToCurrentUser; private final ComponentName mRecentsComponentName; private final DeviceProvisionedController mDeviceProvisionedController; @@ -446,9 +447,13 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis = this::cleanupAfterDeath; @Inject - public OverviewProxyService(Context context, DeviceProvisionedController provisionController) { + public OverviewProxyService(Context context, DeviceProvisionedController provisionController, + NavigationBarController navBarController, NavigationModeController navModeController, + StatusBarWindowController statusBarWinController) { mContext = context; mHandler = new Handler(); + mNavBarController = navBarController; + mStatusBarWinController = statusBarWinController; mDeviceProvisionedController = provisionController; mConnectionBackoffAttempts = 0; mRecentsComponentName = ComponentName.unflattenFromString(context.getString( @@ -463,7 +468,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis mBackButtonAlpha = 1.0f; // Listen for nav bar mode changes - mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this); + mNavBarMode = navModeController.addListener(this); // Listen for device provisioned/user setup updateEnabledState(); @@ -513,10 +518,10 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } private void updateSystemUiStateFlags() { - final NavigationBarController navBar = Dependency.get(NavigationBarController.class); - final NavigationBarFragment navBarFragment = navBar.getDefaultNavigationBarFragment(); - final NavigationBarView navBarView = navBar.getNavigationBarView(mContext.getDisplayId()); - final StatusBar statusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); + final NavigationBarFragment navBarFragment = + mNavBarController.getDefaultNavigationBarFragment(); + final NavigationBarView navBarView = + mNavBarController.getNavigationBarView(mContext.getDisplayId()); mSysUiStateFlags = 0; if (navBarFragment != null) { @@ -525,8 +530,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis if (navBarView != null) { navBarView.updateSystemUiStateFlags(); } - if (statusBar != null) { - statusBar.updateSystemUiStateFlags(); + if (mStatusBarWinController != null) { + mStatusBarWinController.updateSystemUiStateFlags(); } notifySystemUiStateFlags(mSysUiStateFlags); } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 341461bf7202..11ca94f6f4e6 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -92,6 +92,11 @@ import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + + /** * POD used in the AsyncTask which saves an image in the background. @@ -446,6 +451,8 @@ class GlobalScreenshot { static final String EXTRA_CANCEL_NOTIFICATION = "android:screenshot_cancel_notification"; static final String EXTRA_DISALLOW_ENTER_PIP = "android:screenshot_disallow_enter_pip"; + private static final String TAG = "GlobalScreenshot"; + private static final int SCREENSHOT_FLASH_TO_PEAK_DURATION = 130; private static final int SCREENSHOT_DROP_IN_DURATION = 430; private static final int SCREENSHOT_DROP_OUT_DELAY = 500; @@ -902,11 +909,19 @@ class GlobalScreenshot { * appropriate signals to the system (ie. to dismiss the keyguard if necessary). */ public static class ActionProxyReceiver extends BroadcastReceiver { + static final int CLOSE_WINDOWS_TIMEOUT_MILLIS = 3000; + @Override public void onReceive(Context context, final Intent intent) { Runnable startActivityRunnable = () -> { - ActivityManagerWrapper.getInstance().closeSystemWindows( - SYSTEM_DIALOG_REASON_SCREENSHOT); + try { + ActivityManagerWrapper.getInstance().closeSystemWindows( + SYSTEM_DIALOG_REASON_SCREENSHOT).get( + CLOSE_WINDOWS_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); + } catch (TimeoutException | InterruptedException | ExecutionException e) { + Slog.e(TAG, "Unable to share screenshot", e); + return; + } Intent actionIntent = intent.getParcelableExtra(EXTRA_ACTION_INTENT); if (intent.getBooleanExtra(EXTRA_CANCEL_NOTIFICATION, false)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index fd76a79eab2e..ca12deb3904e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -43,6 +43,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IBatteryStats; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.widget.LockPatternUtils; +import com.android.internal.widget.ViewClippingUtil; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.settingslib.Utils; @@ -118,6 +119,13 @@ public class KeyguardIndicationController implements StateListener, private final DevicePolicyManager mDevicePolicyManager; private boolean mDozing; + private final ViewClippingUtil.ClippingParameters mClippingParams = + new ViewClippingUtil.ClippingParameters() { + @Override + public boolean shouldFinish(View view) { + return view == mIndicationArea; + } + }; /** * Creates a new KeyguardIndicationController and registers callbacks. @@ -413,6 +421,7 @@ public class KeyguardIndicationController implements StateListener, R.integer.wired_charging_keyguard_text_animation_duration_down); textView.animate().cancel(); float translation = textView.getTranslationY(); + ViewClippingUtil.setClippingDeactivated(textView, true, mClippingParams); textView.animate() .translationYBy(yTranslation) .setInterpolator(Interpolators.LINEAR) @@ -434,6 +443,8 @@ public class KeyguardIndicationController implements StateListener, @Override public void onAnimationEnd(Animator animation) { if (mCancelled) { + ViewClippingUtil.setClippingDeactivated(textView, false, + mClippingParams); return; } textView.animate() @@ -445,6 +456,12 @@ public class KeyguardIndicationController implements StateListener, public void onAnimationCancel(Animator animation) { textView.setTranslationY(translation); } + + @Override + public void onAnimationEnd(Animator animation) { + ViewClippingUtil.setClippingDeactivated(textView, false, + mClippingParams); + } }); } }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 905a8e68f3d1..4ea1ed5b9451 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -320,7 +320,7 @@ public class NotificationLockscreenUserManagerImpl implements private boolean hideSilentNotificationsOnLockscreen() { return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 0) == 0; + Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 1) == 0; } private void setShowLockscreenNotifications(boolean show) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 75ef18545fdf..6c36ab95f923 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -488,6 +488,7 @@ public class NotificationMediaManager implements Dumpable { if (bmp != null) { artworkDrawable = new BitmapDrawable(mBackdropBack.getResources(), bmp); } + boolean hasMediaArtwork = artworkDrawable != null; boolean allowWhenShade = false; if (ENABLE_LOCKSCREEN_WALLPAPER && artworkDrawable == null) { Bitmap lockWallpaper = @@ -506,7 +507,7 @@ public class NotificationMediaManager implements Dumpable { boolean hideBecauseOccluded = shadeController != null && shadeController.isOccluded(); final boolean hasArtwork = artworkDrawable != null; - mColorExtractor.setHasBackdrop(hasArtwork); + mColorExtractor.setHasMediaArtwork(hasMediaArtwork); if (mScrimController != null) { mScrimController.setHasBackdrop(hasArtwork); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index fc2705f054e0..312ea473d9e6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -929,7 +929,6 @@ public class NotificationShelf extends ActivatableNotificationView implements public void setAnimationsEnabled(boolean enabled) { mAnimationsEnabled = enabled; - mCollapsedIcons.setAnimationsEnabled(enabled); if (!enabled) { // we need to wait with enabling the animations until the first frame has passed mShelfIcons.setAnimationsEnabled(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt index 5378f907e95a..8e6822770694 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt @@ -29,6 +29,7 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.ColorDrawable import android.util.Log import android.view.Gravity +import android.view.View import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.Window @@ -86,13 +87,17 @@ class ChannelEditorDialogController @Inject constructor( internal val groupNameLookup = hashMapOf<String, CharSequence>() private val channelGroupList = mutableListOf<NotificationChannelGroup>() + /** + * Give the controller all of the information it needs to present the dialog + * for a given app. Does a bunch of querying of NoMan, but won't present anything yet + */ fun prepareDialogForApp( appName: String, packageName: String, uid: Int, channels: Set<NotificationChannel>, appIcon: Drawable, - onSettingsClickListener: NotificationInfo.OnSettingsClickListener + onSettingsClickListener: NotificationInfo.OnSettingsClickListener? ) { this.appName = appName this.packageName = packageName @@ -156,6 +161,13 @@ class ChannelEditorDialogController @Inject constructor( dialog.show() } + /** + * Close the dialog without saving. For external callers + */ + fun close() { + done() + } + private fun done() { resetState() dialog.dismiss() @@ -235,6 +247,11 @@ class ChannelEditorDialogController @Inject constructor( } } + @VisibleForTesting + fun launchSettings(sender: View) { + onSettingsClickListener?.onClick(sender, null, appUid!!) + } + private fun initDialog() { dialog = Dialog(context) @@ -257,7 +274,7 @@ class ChannelEditorDialogController @Inject constructor( } findViewById<TextView>(R.id.see_more_button)?.setOnClickListener { - onSettingsClickListener?.onClick(it, null, appUid!!) + launchSettings(it) done() } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt index 6fe14777e41f..6faf77ec60c7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt @@ -24,6 +24,7 @@ import android.content.Context import android.graphics.drawable.Drawable import android.text.TextUtils import android.transition.AutoTransition +import android.transition.Transition import android.transition.TransitionManager import android.util.AttributeSet import android.view.LayoutInflater @@ -62,6 +63,23 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a val transition = AutoTransition() transition.duration = 200 + transition.addListener(object : Transition.TransitionListener { + override fun onTransitionEnd(p0: Transition?) { + notifySubtreeAccessibilityStateChangedIfNeeded() + } + + override fun onTransitionResume(p0: Transition?) { + } + + override fun onTransitionPause(p0: Transition?) { + } + + override fun onTransitionCancel(p0: Transition?) { + } + + override fun onTransitionStart(p0: Transition?) { + } + }) TransitionManager.beginDelayedTransition(this, transition) // Remove any rows diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index fe890fb3b471..b5a8aadf651f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -41,12 +41,14 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; +import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.notification.NotificationActivityStarter; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -97,6 +99,8 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx @VisibleForTesting protected String mKeyToRemoveOnGutsClosed; + private StatusBar mStatusBar; + @Inject public NotificationGutsManager( Context context, @@ -114,6 +118,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx mListContainer = listContainer; mCheckSaveListener = checkSave; mOnSettingsClickListener = onSettingsClick; + mStatusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); } public void setNotificationActivityStarter( @@ -376,6 +381,34 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx int x, int y, NotificationMenuRowPlugin.MenuItem menuItem) { + if (menuItem.getGutsView() instanceof NotificationInfo) { + if (mStatusBarStateController instanceof StatusBarStateControllerImpl) { + ((StatusBarStateControllerImpl) mStatusBarStateController) + .setLeaveOpenOnKeyguardHide(true); + } + + Runnable r = () -> Dependency.get(Dependency.MAIN_HANDLER).post( + () -> openGutsInternal(view, x, y, menuItem)); + + mStatusBar.executeRunnableDismissingKeyguard( + r, + null /* cancelAction */, + false /* dismissShade */, + true /* afterKeyguardGone */, + true /* deferred */); + + return true; + } + return openGutsInternal(view, x, y, menuItem); + } + + @VisibleForTesting + boolean openGutsInternal( + View view, + int x, + int y, + NotificationMenuRowPlugin.MenuItem menuItem) { + if (!(view instanceof ExpandableNotificationRow)) { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 0f6740d44d04..148d83b5ab5c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -118,6 +118,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private int mStartingChannelImportance; private boolean mWasShownHighPriority; private boolean mPressedApply; + private boolean mPresentingChannelEditorDialog = false; /** * The last importance level chosen by the user. Null if the user has not chosen an importance @@ -447,11 +448,15 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private OnClickListener getTurnOffNotificationsClickListener() { return ((View view) -> { - if (mChannelEditorDialogController != null) { + if (!mPresentingChannelEditorDialog && mChannelEditorDialogController != null) { + mPresentingChannelEditorDialog = true; + mChannelEditorDialogController.prepareDialogForApp(mAppName, mPackageName, mAppUid, mUniqueChannelsInRow, mPkgIcon, mOnSettingsClickListener); - mChannelEditorDialogController.setOnFinishListener( - () -> closeControls(this, false)); + mChannelEditorDialogController.setOnFinishListener(() -> { + mPresentingChannelEditorDialog = false; + closeControls(this, false); + }); mChannelEditorDialogController.show(); } }); @@ -569,16 +574,21 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G switch (behavior) { case BEHAVIOR_ALERTING: - alert.setSelected(true); - silence.setSelected(false); mPriorityDescriptionView.setVisibility(VISIBLE); mSilentDescriptionView.setVisibility(GONE); + post(() -> { + alert.setSelected(true); + silence.setSelected(false); + }); break; case BEHAVIOR_SILENT: - alert.setSelected(false); - silence.setSelected(true); + mSilentDescriptionView.setVisibility(VISIBLE); mPriorityDescriptionView.setVisibility(GONE); + post(() -> { + alert.setSelected(false); + silence.setSelected(true); + }); break; default: throw new IllegalArgumentException("Unrecognized alerting behavior: " + behavior); @@ -767,6 +777,13 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G @Override public boolean handleCloseControls(boolean save, boolean force) { + if (mPresentingChannelEditorDialog && mChannelEditorDialogController != null) { + mPresentingChannelEditorDialog = false; + // No need for the finish listener because we're closing + mChannelEditorDialogController.setOnFinishListener(null); + mChannelEditorDialogController.close(); + } + // Save regardless of the importance so we can lock the importance field if the user wants // to keep getting notifications if (save) { 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 b53fe3a795fc..c21443128d13 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 @@ -20,7 +20,7 @@ import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters; import static com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.ANCHOR_SCROLLING; import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE; -import static com.android.systemui.statusbar.phone.NotificationIconAreaController.LOW_PRIORITY; +import static com.android.systemui.statusbar.phone.NotificationIconAreaController.HIGH_PRIORITY; import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -187,7 +187,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private int mCurrentStackHeight = Integer.MAX_VALUE; private final Paint mBackgroundPaint = new Paint(); private final boolean mShouldDrawNotificationBackground; - private boolean mLowPriorityBeforeSpeedBump; + private boolean mHighPriorityBeforeSpeedBump; private final boolean mAllowLongPress; private boolean mDismissRtl; @@ -584,12 +584,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd TunerService tunerService = Dependency.get(TunerService.class); tunerService.addTunable((key, newValue) -> { - if (key.equals(LOW_PRIORITY)) { - mLowPriorityBeforeSpeedBump = "1".equals(newValue); + if (key.equals(HIGH_PRIORITY)) { + mHighPriorityBeforeSpeedBump = "1".equals(newValue); } else if (key.equals(Settings.Secure.NOTIFICATION_DISMISS_RTL)) { updateDismissRtlSetting("1".equals(newValue)); } - }, LOW_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); + }, HIGH_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); mEntryManager.addNotificationEntryListener(new NotificationEntryListener() { @Override @@ -654,15 +654,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @Override @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void onThemeChanged() { - int which; - if (mStatusBarState == StatusBarState.KEYGUARD - || mStatusBarState == StatusBarState.SHADE_LOCKED) { - which = WallpaperManager.FLAG_LOCK; - } else { - which = WallpaperManager.FLAG_SYSTEM; - } - final boolean useDarkText = mColorExtractor.getColors(which, - true /* ignoreVisibility */).supportsDarkText(); + final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); updateDecorViews(useDarkText); updateFooter(); @@ -868,8 +860,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int backgroundRectTop = top; int lastSectionBottom = mSections[0].getCurrentBounds().bottom + animationYOffset; - int previousLeft = left; - int previousRight = right; + int currentLeft = left; + int currentRight = right; boolean first = true; for (NotificationSection section : mSections) { if (section.getFirstVisibleChild() == null) { @@ -882,23 +874,23 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // as separate roundrects, as the rounded corners right next to each other look // bad. if (sectionTop - lastSectionBottom > DISTANCE_BETWEEN_ADJACENT_SECTIONS_PX - || (previousLeft != ownLeft && !first)) { - canvas.drawRoundRect(ownLeft, + || ((currentLeft != ownLeft || currentRight != ownRight) && !first)) { + canvas.drawRoundRect(currentLeft, backgroundRectTop, - ownRight, + currentRight, lastSectionBottom, mCornerRadius, mCornerRadius, mBackgroundPaint); backgroundRectTop = sectionTop; } - previousLeft = ownLeft; - previousRight = ownRight; + currentLeft = ownLeft; + currentRight = ownRight; lastSectionBottom = section.getCurrentBounds().bottom + animationYOffset; first = false; } - canvas.drawRoundRect(previousLeft, + canvas.drawRoundRect(currentLeft, backgroundRectTop, - previousRight, + currentRight, lastSectionBottom, mCornerRadius, mCornerRadius, mBackgroundPaint); } @@ -3223,6 +3215,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private void updateNotificationAnimationStates() { boolean running = mAnimationsEnabled || hasPulsingNotifications(); mShelf.setAnimationsEnabled(running); + mIconAreaController.setAnimationsEnabled(running); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); @@ -5764,10 +5757,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd ExpandableNotificationRow row = (ExpandableNotificationRow) view; currentIndex++; boolean beforeSpeedBump; - if (mLowPriorityBeforeSpeedBump) { - beforeSpeedBump = !row.getEntry().ambient; - } else { + if (mHighPriorityBeforeSpeedBump) { beforeSpeedBump = row.getEntry().isHighPriority(); + } else { + beforeSpeedBump = !row.getEntry().ambient; } if (beforeSpeedBump) { speedBumpIndex = currentIndex; 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 05a86fa9d7ea..cc0bc5f160e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -57,6 +57,7 @@ import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.WindowManagerWrapper; +import java.io.PrintWriter; import java.util.concurrent.Executor; /** @@ -118,7 +119,7 @@ public class EdgeBackGestureHandler implements DisplayListener { private final Region mExcludeRegion = new Region(); // The edge width where touch down is allowed - private final int mEdgeWidth; + private int mEdgeWidth; // The slop to distinguish between horizontal and vertical motion private final float mTouchSlop; // Duration after which we consider the event as longpress. @@ -152,6 +153,8 @@ public class EdgeBackGestureHandler implements DisplayListener { private WindowManager.LayoutParams mEdgePanelLp; private final Rect mSamplingRect = new Rect(); private RegionSamplingHelper mRegionSamplingHelper; + private int mLeftInset; + private int mRightInset; public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService) { final Resources res = context.getResources(); @@ -161,10 +164,6 @@ public class EdgeBackGestureHandler implements DisplayListener { mWm = context.getSystemService(WindowManager.class); mOverviewProxyService = overviewProxyService; - // TODO: Get this for the current user - mEdgeWidth = res.getDimensionPixelSize( - com.android.internal.R.dimen.config_backGestureInset); - // Reduce the default touch slop to ensure that we can intercept the gesture // before the app starts to react to it. // TODO(b/130352502) Tune this value and extract into a constant @@ -174,6 +173,12 @@ public class EdgeBackGestureHandler implements DisplayListener { mNavBarHeight = res.getDimensionPixelSize(R.dimen.navigation_bar_frame_height); mMinArrowPosition = res.getDimensionPixelSize(R.dimen.navigation_edge_arrow_min_y); mFingerOffset = res.getDimensionPixelSize(R.dimen.navigation_edge_finger_offset); + updateCurrentUserResources(res); + } + + public void updateCurrentUserResources(Resources res) { + mEdgeWidth = res.getDimensionPixelSize( + com.android.internal.R.dimen.config_backGestureInset); } /** @@ -192,9 +197,10 @@ public class EdgeBackGestureHandler implements DisplayListener { updateIsEnabled(); } - public void onNavigationModeChanged(int mode) { + public void onNavigationModeChanged(int mode, Context currentUserContext) { mIsGesturalModeEnabled = QuickStepContract.isGesturalMode(mode); updateIsEnabled(); + updateCurrentUserResources(currentUserContext.getResources()); } private void disposeInputChannel() { @@ -268,6 +274,8 @@ public class EdgeBackGestureHandler implements DisplayListener { | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); + mEdgePanelLp.privateFlags |= + WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; mEdgePanelLp.setTitle(TAG + mDisplayId); mEdgePanelLp.accessibilityTitle = mContext.getString(R.string.nav_bar_edge_panel); mEdgePanelLp.windowAnimations = 0; @@ -299,7 +307,7 @@ public class EdgeBackGestureHandler implements DisplayListener { return false; } - if (x > mEdgeWidth && x < (mDisplaySize.x - mEdgeWidth)) { + if (x > mEdgeWidth + mLeftInset && x < (mDisplaySize.x - mEdgeWidth - mRightInset)) { return false; } boolean isInExcludedRegion = mExcludeRegion.contains(x, y); @@ -325,7 +333,7 @@ public class EdgeBackGestureHandler implements DisplayListener { // Verify if this is in within the touch region and we aren't in immersive mode, and // either the bouncer is showing or the notification panel is hidden int stateFlags = mOverviewProxyService.getSystemUiStateFlags(); - mIsOnLeftEdge = ev.getX() <= mEdgeWidth; + mIsOnLeftEdge = ev.getX() <= mEdgeWidth + mLeftInset; mAllowGesture = !QuickStepContract.isBackGestureDisabled(stateFlags) && isWithinTouchRegion((int) ev.getX(), (int) ev.getY()); if (mAllowGesture) { @@ -400,7 +408,7 @@ public class EdgeBackGestureHandler implements DisplayListener { private void updateSamplingRect() { int top = mEdgePanelLp.y; - int left = mIsOnLeftEdge ? 0 : mDisplaySize.x - mEdgePanelLp.width; + int left = mIsOnLeftEdge ? mLeftInset : mDisplaySize.x - mRightInset - mEdgePanelLp.width; int right = left + mEdgePanelLp.width; int bottom = top + mEdgePanelLp.height; mSamplingRect.set(left, top, right, bottom); @@ -442,6 +450,21 @@ public class EdgeBackGestureHandler implements DisplayListener { InputManager.getInstance().injectInputEvent(ev, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } + public void setInsets(int leftInset, int rightInset) { + mLeftInset = leftInset; + mRightInset = rightInset; + } + + public void dump(PrintWriter pw) { + pw.println("EdgeBackGestureHandler:"); + pw.println(" mIsEnabled=" + mIsEnabled); + pw.println(" mAllowGesture=" + mAllowGesture); + pw.println(" mExcludeRegion=" + mExcludeRegion); + pw.println(" mImeHeight=" + mImeHeight); + pw.println(" mIsAttached=" + mIsAttached); + pw.println(" mEdgeWidth=" + mEdgeWidth); + } + class SysUiInputEventReceiver extends InputEventReceiver { SysUiInputEventReceiver(InputChannel channel, Looper looper) { super(channel, looper); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java index a4965ba59c6a..6bbeffaa9bfe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java @@ -16,8 +16,10 @@ package com.android.systemui.statusbar.phone; +import android.annotation.ColorInt; import android.content.Context; import android.content.res.Resources; +import android.graphics.Color; import android.graphics.PixelFormat; import android.view.ContextThemeWrapper; import android.view.Gravity; @@ -26,6 +28,7 @@ import android.view.Surface; import android.view.View; import android.view.WindowManager; +import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.statusbar.policy.KeyButtonDrawable; import com.android.systemui.statusbar.policy.KeyButtonView; @@ -33,6 +36,8 @@ import com.android.systemui.statusbar.policy.KeyButtonView; /** Containing logic for the rotation button on the physical left bottom corner of the screen. */ public class FloatingRotationButton implements RotationButton { + private static final float BACKGROUND_ALPHA = 0.92f; + private final Context mContext; private final WindowManager mWindowManager; private final KeyButtonView mKeyButtonView; @@ -73,8 +78,7 @@ public class FloatingRotationButton implements RotationButton { return false; } mIsShowing = true; - int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; + int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(mDiameter, mDiameter, mMargin, mMargin, WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, flags, PixelFormat.TRANSLUCENT); @@ -152,8 +156,18 @@ public class FloatingRotationButton implements RotationButton { public KeyButtonDrawable getImageDrawable() { Context context = new ContextThemeWrapper(mContext.getApplicationContext(), mRotationButtonController.getStyleRes()); - return KeyButtonDrawable.create(context, R.drawable.ic_sysbar_rotate_button, - false /* shadow */, true /* hasOvalBg */); + final int dualToneDarkTheme = Utils.getThemeAttr(context, R.attr.darkIconTheme); + final int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme); + Context lightContext = new ContextThemeWrapper(context, dualToneLightTheme); + Context darkContext = new ContextThemeWrapper(context, dualToneDarkTheme); + @ColorInt int darkColor = Utils.getColorAttrDefaultColor(darkContext, + R.attr.singleToneColor); + Color ovalBackgroundColor = Color.valueOf(Color.red(darkColor), Color.green(darkColor), + Color.blue(darkColor), BACKGROUND_ALPHA); + + return KeyButtonDrawable.create(lightContext, + Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor), darkColor, + R.drawable.ic_sysbar_rotate_button, false /* shadow */, ovalBackgroundColor); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 61a394092761..3d0c9e88ac9e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -60,8 +60,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, UnlockMethodCache.OnUnlockMethodChangedListener { - private static final int FP_DRAW_OFF_TIMEOUT = 800; - private static final int STATE_LOCKED = 0; private static final int STATE_LOCK_OPEN = 1; private static final int STATE_SCANNING_FACE = 2; @@ -77,8 +75,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private int mLastState = 0; private boolean mTransientBiometricsError; - private boolean mScreenOn; - private boolean mLastScreenOn; private boolean mIsFaceUnlockState; private boolean mSimLocked; private int mDensity; @@ -105,7 +101,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange update(false /* force */); } }; - private final Runnable mDrawOffTimeout = () -> update(true /* forceUpdate */); private final DockManager.DockEventListener mDockEventListener = new DockManager.DockEventListener() { @Override @@ -122,18 +117,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override - public void onScreenTurnedOn() { - mScreenOn = true; - update(); - } - - @Override - public void onScreenTurnedOff() { - mScreenOn = false; - update(); - } - - @Override public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) { boolean oldSimLocked = mSimLocked; @@ -246,7 +229,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange int state = getState(); mIsFaceUnlockState = state == STATE_SCANNING_FACE; if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing - || mLastScreenOn != mScreenOn || mLastBouncerVisible != mBouncerVisible || force) { + || mLastBouncerVisible != mBouncerVisible || force) { int iconAnimRes = getAnimationResForTransition(mLastState, state, mLastPulsing, mPulsing, mLastDozing, mDozing, mBouncerVisible); boolean isAnim = iconAnimRes != -1; @@ -285,15 +268,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } updateDarkTint(); - if (isAnim && !mLastScreenOn) { - removeCallbacks(mDrawOffTimeout); - postDelayed(mDrawOffTimeout, FP_DRAW_OFF_TIMEOUT); - } else { - removeCallbacks(mDrawOffTimeout); - } - mLastState = state; - mLastScreenOn = mScreenOn; mLastDozing = mDozing; mLastPulsing = mPulsing; mLastBouncerVisible = mBouncerVisible; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java index 443cc4397bd3..c0a1b123fe77 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java @@ -112,7 +112,9 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener final boolean guestEnabled = !mContext.getSystemService(DevicePolicyManager.class) .getGuestUserDisabled(null); - return mUserSwitcherController.getSwitchableUserCount() > 1 || guestEnabled + return mUserSwitcherController.getSwitchableUserCount() > 1 + // If we cannot add guests even if they are enabled, do not show + || (guestEnabled && !mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) || mContext.getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user); } 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 d94a33556a43..79976d0e104d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -136,6 +136,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback protected final AssistManager mAssistManager; private final MetricsLogger mMetricsLogger; private final DeviceProvisionedController mDeviceProvisionedController; + private final StatusBarStateController mStatusBarStateController; protected NavigationBarView mNavigationBarView = null; @@ -244,9 +245,11 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback public NavigationBarFragment(AccessibilityManagerWrapper accessibilityManagerWrapper, DeviceProvisionedController deviceProvisionedController, MetricsLogger metricsLogger, AssistManager assistManager, OverviewProxyService overviewProxyService, - NavigationModeController navigationModeController) { + NavigationModeController navigationModeController, + StatusBarStateController statusBarStateController) { mAccessibilityManagerWrapper = accessibilityManagerWrapper; mDeviceProvisionedController = deviceProvisionedController; + mStatusBarStateController = statusBarStateController; mMetricsLogger = metricsLogger; mAssistManager = assistManager; mAssistantAvailable = mAssistManager.getAssistInfoForUser(UserHandle.USER_CURRENT) != null; @@ -951,7 +954,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback public void touchAutoDim() { getBarTransitions().setAutoDim(false); mHandler.removeCallbacks(mAutoDim); - int state = Dependency.get(StatusBarStateController.class).getState(); + int state = mStatusBarStateController.getState(); if (state != StatusBarState.KEYGUARD && state != StatusBarState.SHADE_LOCKED) { mHandler.postDelayed(mAutoDim, AUTODIM_TIMEOUT_MS); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java index 2b5a28e60082..23cc0fc51ec0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java @@ -213,9 +213,12 @@ public final class NavigationBarTransitions extends BarTransitions implements /** * Register {@code listener} to be notified when the color of nav bar elements changes. + * + * Returns the current nav bar color. */ - public void addDarkIntensityListener(DarkIntensityListener listener) { + public float addDarkIntensityListener(DarkIntensityListener listener) { mDarkIntensityListeners.add(listener); + return mLightTransitionsController.getCurrentDarkIntensity(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 3ec16090ea87..ed486cdce665 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -238,7 +238,19 @@ public class NavigationBarView extends FrameLayout implements info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME); return; } + info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION); + ButtonDispatcher imeSwitchButton = getImeSwitchButton(); + if (imeSwitchButton.getVisibility() == VISIBLE) { + // If the IME is not up, but the ime switch button is visible, then make sure that + // button is touchable + int[] loc = new int[2]; + View buttonView = imeSwitchButton.getCurrentView(); + buttonView.getLocationInWindow(loc); + info.touchableRegion.set(loc[0], loc[1], loc[0] + buttonView.getWidth(), + loc[1] + buttonView.getHeight()); + return; + } info.touchableRegion.setEmpty(); }; @@ -760,9 +772,10 @@ public class NavigationBarView extends FrameLayout implements @Override public void onNavigationModeChanged(int mode) { + Context curUserCtx = Dependency.get(NavigationModeController.class).getCurrentUserContext(); mNavBarMode = mode; mBarTransitions.onNavigationModeChanged(mNavBarMode); - mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode); + mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode, curUserCtx); mRecentsOnboarding.onNavigationModeChanged(mNavBarMode); getRotateSuggestionButton().onNavigationModeChanged(mNavBarMode); @@ -1091,12 +1104,18 @@ public class NavigationBarView extends FrameLayout implements mContextualButtonGroup.dump(pw); mRecentsOnboarding.dump(pw); mTintController.dump(pw); + mEdgeBackGestureHandler.dump(pw); } @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { - setPadding(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), - insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()); + int leftInset = insets.getSystemWindowInsetLeft(); + int rightInset = insets.getSystemWindowInsetRight(); + setPadding(leftInset, insets.getSystemWindowInsetTop(), rightInset, + insets.getSystemWindowInsetBottom()); + // we're passing the insets onto the gesture handler since the back arrow is only + // conditionally added and doesn't always get all the insets. + mEdgeBackGestureHandler.setInsets(leftInset, rightInset); return super.onApplyWindowInsets(insets); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java index 7cd8f7b6687f..11242201d893 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java @@ -24,6 +24,9 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVE import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -38,13 +41,16 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Secure; +import android.text.TextUtils; import android.util.Log; import android.util.SparseBooleanArray; import com.android.systemui.Dumpable; +import com.android.systemui.R; import com.android.systemui.UiOffloadThread; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.util.NotificationChannels; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -63,6 +69,9 @@ public class NavigationModeController implements Dumpable { private static final String TAG = NavigationModeController.class.getSimpleName(); private static final boolean DEBUG = false; + static final String SHARED_PREFERENCES_NAME = "navigation_mode_controller_preferences"; + static final String PREFS_SWITCHED_FROM_GESTURE_NAV_KEY = "switched_from_gesture_nav"; + public interface ModeChangedListener { void onNavigationModeChanged(int mode); } @@ -78,6 +87,8 @@ public class NavigationModeController implements Dumpable { private int mMode = NAV_BAR_MODE_3BUTTON; private ArrayList<ModeChangedListener> mListeners = new ArrayList<>(); + private String mLastDefaultLauncher; + private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -92,7 +103,13 @@ public class NavigationModeController implements Dumpable { if (DEBUG) { Log.d(TAG, "ACTION_PREFERRED_ACTIVITY_CHANGED"); } - switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); + final String launcher = getDefaultLauncherPackageName(mCurrentUserContext); + // Check if it is a default launcher change + if (!TextUtils.equals(mLastDefaultLauncher, launcher)) { + switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); + showNotificationIfDefaultLauncherSupportsGestureNav(); + mLastDefaultLauncher = launcher; + } break; } } @@ -157,6 +174,8 @@ public class NavigationModeController implements Dumpable { IntentFilter preferredActivityFilter = new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED); mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, preferredActivityFilter, null, null); + // We are only interested in launcher changes, so keeping track of the current default. + mLastDefaultLauncher = getDefaultLauncherPackageName(mContext); updateCurrentInteractionMode(false /* notify */); switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); @@ -205,7 +224,7 @@ public class NavigationModeController implements Dumpable { return mode; } - private Context getCurrentUserContext() { + public Context getCurrentUserContext() { int userId = ActivityManagerWrapper.getInstance().getCurrentUserId(); if (DEBUG) { Log.d(TAG, "getCurrentUserContext: contextUser=" + mContext.getUserId() @@ -287,6 +306,84 @@ public class NavigationModeController implements Dumpable { }); } + private void switchFromGestureNavModeIfNotSupportedByDefaultLauncher() { + if (getCurrentInteractionMode(mCurrentUserContext) != NAV_BAR_MODE_GESTURAL) { + return; + } + final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); + if (supported == null || supported) { + return; + } + + setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT); + showNotification(mCurrentUserContext, R.string.notification_content_system_nav_changed); + mCurrentUserContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) + .edit().putBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, true).apply(); + } + + private void showNotificationIfDefaultLauncherSupportsGestureNav() { + boolean previouslySwitchedFromGestureNav = mCurrentUserContext + .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) + .getBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false); + if (!previouslySwitchedFromGestureNav) { + return; + } + if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL) { + return; + } + final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); + if (supported == null || !supported) { + return; + } + + showNotification(mCurrentUserContext, R.string.notification_content_gesture_nav_available); + mCurrentUserContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) + .edit().putBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false).apply(); + } + + /** + * Returns null if there is no default launcher set for the current user. Returns true if the + * current default launcher supports Gesture Navigation. Returns false otherwise. + */ + private Boolean isGestureNavSupportedByDefaultLauncher(Context context) { + final String defaultLauncherPackageName = getDefaultLauncherPackageName(context); + if (DEBUG) { + Log.d(TAG, "isGestureNavSupportedByDefaultLauncher:" + + " defaultLauncher=" + defaultLauncherPackageName + + " contextUser=" + context.getUserId()); + } + if (defaultLauncherPackageName == null) { + return null; + } + ComponentName recentsComponentName = ComponentName.unflattenFromString( + context.getString(com.android.internal.R.string.config_recentsComponentName)); + return recentsComponentName.getPackageName().equals(defaultLauncherPackageName); + } + + private String getDefaultLauncherPackageName(Context context) { + final ComponentName cn = context.getPackageManager().getHomeActivities(new ArrayList<>()); + if (cn == null) { + return null; + } + return cn.getPackageName(); + } + + private void showNotification(Context context, int resId) { + final CharSequence message = context.getResources().getString(resId); + if (DEBUG) { + Log.d(TAG, "showNotification: message=" + message); + } + + final Notification.Builder builder = + new Notification.Builder(mContext, NotificationChannels.ALERTS) + .setContentText(message) + .setStyle(new Notification.BigTextStyle()) + .setSmallIcon(R.drawable.ic_info) + .setAutoCancel(true) + .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(), 0)); + context.getSystemService(NotificationManager.class).notify(TAG, 0, builder.build()); + } + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("NavigationModeController:"); @@ -299,6 +396,12 @@ public class NavigationModeController implements Dumpable { } pw.println(" defaultOverlays=" + defaultOverlays); dumpAssetPaths(mCurrentUserContext); + + pw.println(" defaultLauncher=" + mLastDefaultLauncher); + boolean previouslySwitchedFromGestureNav = mCurrentUserContext + .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) + .getBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false); + pw.println(" previouslySwitchedFromGestureNav=" + previouslySwitchedFromGestureNav); } private void dumpAssetPaths(Context context) { @@ -308,27 +411,4 @@ public class NavigationModeController implements Dumpable { Log.d(TAG, " " + a.getAssetPath()); } } - - private void switchFromGestureNavModeIfNotSupportedByDefaultLauncher() { - if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL - && !isGestureNavSupportedByDefaultLauncher(mCurrentUserContext)) { - setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT); - } - } - - private boolean isGestureNavSupportedByDefaultLauncher(Context context) { - final ComponentName cn = context.getPackageManager().getHomeActivities(new ArrayList<>()); - if (cn == null) { - // There is no default home app set for the current user, don't make any changes yet. - return true; - } - if (DEBUG) { - Log.d(TAG, "isGestureNavSupportedByDefaultLauncher: launcher=" + cn.getPackageName() - + " contextUser=" + context.getUserId()); - } - - ComponentName recentsComponentName = ComponentName.unflattenFromString(context.getString( - com.android.internal.R.string.config_recentsComponentName)); - return recentsComponentName.getPackageName().equals(cn.getPackageName()); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index e8ca3eef24de..98505cf38afa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -24,6 +24,7 @@ import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -40,7 +41,7 @@ import java.util.function.Function; public class NotificationIconAreaController implements DarkReceiver, StatusBarStateController.StateListener { - public static final String LOW_PRIORITY = "low_priority"; + public static final String HIGH_PRIORITY = "high_priority"; private final ContrastColorUtil mContrastColorUtil; private final NotificationEntryManager mEntryManager; @@ -78,6 +79,7 @@ public class NotificationIconAreaController implements DarkReceiver, private Context mContext; private boolean mFullyDark; private boolean mShowLowPriority = true; + private boolean mAnimationsEnabled; /** * Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake. @@ -283,6 +285,25 @@ public class NotificationIconAreaController implements DarkReceiver, false /* hide centered icon */); } + /** + * If icons of the status bar should animate when they are added or removed. + */ + public void setAnimationsEnabled(boolean enabled) { + mAnimationsEnabled = enabled; + updateAnimations(); + } + + @Override + public void onStateChanged(int newState) { + updateAnimations(); + } + + private void updateAnimations() { + boolean inShade = mStatusBarStateController.getState() == StatusBarState.SHADE; + mCenteredIcon.setAnimationsEnabled(mAnimationsEnabled && inShade); + mNotificationIcons.setAnimationsEnabled(mAnimationsEnabled && inShade); + } + @VisibleForTesting boolean shouldShouldLowPriorityIcons() { return mShowLowPriority; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 009afca5b034..e20a23edc66d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -315,10 +315,11 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { @Override public void onViewRemoved(View child) { super.onViewRemoved(child); + if (child instanceof StatusBarIconView) { boolean isReplacingIcon = isReplacingIcon(child); final StatusBarIconView icon = (StatusBarIconView) child; - if (icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN + if (mAnimationsEnabled && icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN && child.getVisibility() == VISIBLE && isReplacingIcon) { int animationStartIndex = findFirstViewIndexAfter(icon.getTranslationX()); if (mAddAnimationStartIndex < 0) { @@ -329,7 +330,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } if (!mChangingViewPositions) { mIconStates.remove(child); - if (!isReplacingIcon) { + if (mAnimationsEnabled && !isReplacingIcon) { addTransientView(icon, 0); boolean isIsolatedIcon = child == mIsolatedIcon; icon.setVisibleState(StatusBarIconView.STATE_HIDDEN, true /* animate */, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 92aa884b14d2..1027046b0c28 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -303,6 +303,8 @@ public class NotificationPanelView extends PanelView implements private int mCurrentPanelAlpha; private final Paint mAlphaPaint = new Paint(); private Runnable mPanelAlphaEndAction; + private float mBottomAreaShadeAlpha; + private final ValueAnimator mBottomAreaShadeAlphaAnimator; private AnimatorListenerAdapter mAnimatorListenerAdapter = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -366,6 +368,14 @@ public class NotificationPanelView extends PanelView implements mPulseExpansionHandler = pulseExpansionHandler; mThemeResId = context.getThemeResId(); dynamicPrivacyController.addListener(this); + + mBottomAreaShadeAlphaAnimator = ValueAnimator.ofFloat(1f, 0); + mBottomAreaShadeAlphaAnimator.addUpdateListener(animation -> { + mBottomAreaShadeAlpha = (float) animation.getAnimatedValue(); + updateKeyguardBottomAreaAlpha(); + }); + mBottomAreaShadeAlphaAnimator.setDuration(160); + mBottomAreaShadeAlphaAnimator.setInterpolator(Interpolators.ALPHA_OUT); } /** @@ -682,6 +692,7 @@ public class NotificationPanelView extends PanelView implements mClockPositionResult.clockX, CLOCK_ANIMATION_PROPERTIES, animateClock); PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.Y, mClockPositionResult.clockY, CLOCK_ANIMATION_PROPERTIES, animateClock); + updateNotificationTranslucency(); updateClock(); stackScrollerPadding = mClockPositionResult.stackScrollerPadding; } @@ -1367,10 +1378,20 @@ public class NotificationPanelView extends PanelView implements updateDozingVisibilities(false /* animate */); } + maybeAnimateBottomAreaAlpha(); resetHorizontalPanelPosition(); updateQsState(); } + private void maybeAnimateBottomAreaAlpha() { + mBottomAreaShadeAlphaAnimator.cancel(); + if (mBarState == StatusBarState.SHADE_LOCKED) { + mBottomAreaShadeAlphaAnimator.start(); + } else { + mBottomAreaShadeAlpha = 1f; + } + } + private final Runnable mAnimateKeyguardStatusViewInvisibleEndRunnable = new Runnable() { @Override public void run() { @@ -1461,6 +1482,7 @@ public class NotificationPanelView extends PanelView implements } else if (statusBarState == StatusBarState.KEYGUARD || statusBarState == StatusBarState.SHADE_LOCKED) { mKeyguardBottomArea.setVisibility(View.VISIBLE); + mKeyguardBottomArea.setAlpha(1f); } else { mKeyguardBottomArea.setVisibility(View.GONE); } @@ -1979,6 +2001,7 @@ public class NotificationPanelView extends PanelView implements ? 0 : KeyguardBouncer.ALPHA_EXPANSION_THRESHOLD, 1f, 0f, 1f, getExpandedFraction()); float alpha = Math.min(expansionAlpha, 1 - getQsExpansionFraction()); + alpha *= mBottomAreaShadeAlpha; mKeyguardBottomArea.setAffordanceAlpha(alpha); mKeyguardBottomArea.setImportantForAccessibility(alpha == 0f ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS @@ -2889,6 +2912,10 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.setDark(mDozing, animate, wakeUpTouchLocation); mKeyguardBottomArea.setDozing(mDozing, animate); + if (dozing) { + mBottomAreaShadeAlphaAnimator.cancel(); + } + if (mBarState == StatusBarState.KEYGUARD || mBarState == StatusBarState.SHADE_LOCKED) { updateDozingVisibilities(animate); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java index b117dec44cb4..24e73362defe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java @@ -24,7 +24,6 @@ import android.content.Context; import android.view.ContextThemeWrapper; import android.view.View; -import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.policy.KeyButtonDrawable; /** Containing logic for the rotation button in nav bar. */ @@ -61,7 +60,7 @@ public class RotationContextButton extends ContextualButton implements Context context = new ContextThemeWrapper(getContext().getApplicationContext(), mRotationButtonController.getStyleRes()); return KeyButtonDrawable.create(context, mIconResId, false /* shadow */, - QuickStepContract.isGesturalMode(mNavBarMode)); + null /* ovalBackgroundColor */); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 05a23fa49922..1fdabc0a9fee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -30,8 +30,6 @@ import static com.android.systemui.Dependency.MAIN_HANDLER; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_WAKING; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING; import static com.android.systemui.shared.system.WindowManagerWrapper.NAV_BAR_POS_INVALID; import static com.android.systemui.shared.system.WindowManagerWrapper.NAV_BAR_POS_LEFT; import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF; @@ -169,7 +167,6 @@ import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.Snoo import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSFragment; import com.android.systemui.qs.QSPanel; -import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -320,17 +317,6 @@ public class StatusBar extends SystemUI implements DemoMode, /** If true, the lockscreen will show a distinct wallpaper */ public static final boolean ENABLE_LOCKSCREEN_WALLPAPER = true; - private static final AudioAttributes AUDIO_ATTRIBUTES = - new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - // Temporary fix for b/123870990. No time in this release to - // introduce a new vibration type, but we need to distinguish these vibrations - // from other haptic feedback vibrations. Fortunately, Alarm vibrations have - // exactly the same behavior as we need - // TODO: refactor within the scope of b/132170758 - .setUsage(AudioAttributes.USAGE_ALARM) - .build(); - static { boolean onlyCoreApps; try { @@ -785,8 +771,6 @@ public class StatusBar extends SystemUI implements DemoMode, int disabledFlags2 = result.mDisabledFlags2; Dependency.get(InitController.class).addPostInitTask( () -> setUpDisableFlags(disabledFlags1, disabledFlags2)); - - updateSystemUiStateFlags(); } // ================================================================================ @@ -1525,6 +1509,8 @@ public class StatusBar extends SystemUI implements DemoMode, @Override // UnlockMethodCache.OnUnlockMethodChangedListener public void onUnlockMethodStateChanged() { + // Unlock method state changed. Notify KeguardMonitor + updateKeyguardState(); logStateToEventlog(); } @@ -3225,8 +3211,7 @@ public class StatusBar extends SystemUI implements DemoMode, // Lock wallpaper defines the color of the majority of the views, hence we'll use it // to set our default theme. - final boolean lockDarkText = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, true - /* ignoreVisibility */).supportsDarkText(); + final boolean lockDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); final int themeResId = lockDarkText ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI; if (mContext.getThemeResId() != themeResId) { mContext.setTheme(themeResId); @@ -3420,11 +3405,8 @@ public class StatusBar extends SystemUI implements DemoMode, updateDozingState(); checkBarModes(); updateScrimController(); - updateSystemUiStateFlags(); mPresenter.updateMediaMetaData(false, mState != StatusBarState.KEYGUARD); - mKeyguardMonitor.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(), - mUnlockMethodCache.isMethodSecure(), - mStatusBarKeyguardViewManager.isOccluded()); + updateKeyguardState(); Trace.endSection(); } @@ -3463,6 +3445,12 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarStateController.setIsDozing(dozing); } + private void updateKeyguardState() { + mKeyguardMonitor.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(), + mUnlockMethodCache.isMethodSecure(), + mStatusBarKeyguardViewManager.isOccluded()); + } + public void onActivationReset() { mKeyguardIndicationController.hideTransientIndication(); } @@ -3587,16 +3575,6 @@ public class StatusBar extends SystemUI implements DemoMode, if (!mBouncerShowing) { updatePanelExpansionForKeyguard(); } - updateSystemUiStateFlags(); - } - - public void updateSystemUiStateFlags() { - OverviewProxyService overviewProxyService = Dependency.get(OverviewProxyService.class); - overviewProxyService.setSystemUiStateFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING, - mStatusBarStateController.getState() == StatusBarState.KEYGUARD, - mDisplayId); - overviewProxyService.setSystemUiStateFlag(SYSUI_STATE_BOUNCER_SHOWING, - isBouncerShowing(), mDisplayId); } /** @@ -3710,7 +3688,7 @@ public class StatusBar extends SystemUI implements DemoMode, private void vibrateForCameraGesture() { // Make sure to pass -1 for repeat so VibratorService doesn't stop us when going to sleep. - mVibrator.vibrate(mCameraLaunchGestureVibePattern, -1 /* repeat */, AUDIO_ATTRIBUTES); + mVibrator.vibrate(mCameraLaunchGestureVibePattern, -1 /* repeat */); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 631920c16a2c..c73ed60f161d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -18,11 +18,13 @@ package com.android.systemui.statusbar.phone; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED; import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT; import android.app.ActivityManager; import android.app.IActivityManager; -import android.app.WallpaperManager; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Resources; @@ -45,6 +47,7 @@ import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; +import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.RemoteInputController.Callback; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; @@ -315,6 +318,18 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } mHasTopUi = mHasTopUiChanged; } + updateSystemUiStateFlags(); + } + + public void updateSystemUiStateFlags() { + int displayId = mContext.getDisplayId(); + OverviewProxyService overviewProxyService = Dependency.get(OverviewProxyService.class); + overviewProxyService.setSystemUiStateFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING, + mCurrentState.keyguardShowing && !mCurrentState.keyguardOccluded, displayId); + overviewProxyService.setSystemUiStateFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED, + mCurrentState.keyguardShowing && mCurrentState.keyguardOccluded, displayId); + overviewProxyService.setSystemUiStateFlag(SYSUI_STATE_BOUNCER_SHOWING, + mCurrentState.bouncerShowing, displayId); } private void applyForceStatusBarVisibleFlag(State state) { @@ -540,17 +555,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat return; } - StatusBarStateController state = Dependency.get(StatusBarStateController.class); - int which; - if (state.getState() == StatusBarState.KEYGUARD - || state.getState() == StatusBarState.SHADE_LOCKED) { - which = WallpaperManager.FLAG_LOCK; - } else { - which = WallpaperManager.FLAG_SYSTEM; - } - final boolean useDarkText = mColorExtractor.getColors(which, - true /* ignoreVisibility */).supportsDarkText(); - + final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); // Make sure we have the correct navbar/statusbar colors. setKeyguardDark(useDarkText); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java index 568de63b0112..8fcaa67e7614 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java @@ -82,9 +82,9 @@ public class KeyButtonDrawable extends Drawable { private AnimatedVectorDrawable mAnimatedDrawable; public KeyButtonDrawable(Drawable d, @ColorInt int lightColor, @ColorInt int darkColor, - boolean horizontalFlip, boolean hasOvalBg) { + boolean horizontalFlip, Color ovalBackgroundColor) { this(d, new ShadowDrawableState(lightColor, darkColor, - d instanceof AnimatedVectorDrawable, horizontalFlip, hasOvalBg)); + d instanceof AnimatedVectorDrawable, horizontalFlip, ovalBackgroundColor)); } private KeyButtonDrawable(Drawable d, ShadowDrawableState state) { @@ -166,7 +166,7 @@ public class KeyButtonDrawable extends Drawable { public void setColorFilter(ColorFilter colorFilter) { mIconPaint.setColorFilter(colorFilter); if (mAnimatedDrawable != null) { - if (mState.mHasOvalBg) { + if (hasOvalBg()) { mAnimatedDrawable.setColorFilter( new PorterDuffColorFilter(mState.mLightColor, PorterDuff.Mode.SRC_IN)); } else { @@ -212,15 +212,6 @@ public class KeyButtonDrawable extends Drawable { return mState.mBaseWidth + (mState.mShadowSize + Math.abs(mState.mShadowOffsetX)) * 2; } - /** Return if the drawable has oval background. */ - public boolean hasOvalBg() { - return mState.mHasOvalBg; - } - - public int getDarkColor() { - return mState.mDarkColor; - } - public boolean canAnimate() { return mState.mSupportsAnimation; } @@ -290,6 +281,14 @@ public class KeyButtonDrawable extends Drawable { return mState.canApplyTheme(); } + @ColorInt int getDrawableBackgroundColor() { + return mState.mOvalBackgroundColor.toArgb(); + } + + boolean hasOvalBg() { + return mState.mOvalBackgroundColor != null; + } + private void regenerateBitmapIconCache() { final int width = getIntrinsicWidth(); final int height = getIntrinsicHeight(); @@ -394,16 +393,16 @@ public class KeyButtonDrawable extends Drawable { final int mLightColor; final int mDarkColor; final boolean mSupportsAnimation; - final boolean mHasOvalBg; + final Color mOvalBackgroundColor; public ShadowDrawableState(@ColorInt int lightColor, @ColorInt int darkColor, - boolean animated, boolean horizontalFlip, boolean hasOvalBg) { + boolean animated, boolean horizontalFlip, Color ovalBackgroundColor) { mLightColor = lightColor; mDarkColor = darkColor; mSupportsAnimation = animated; mAlpha = 255; mHorizontalFlip = horizontalFlip; - mHasOvalBg = hasOvalBg; + mOvalBackgroundColor = ovalBackgroundColor; } @Override @@ -428,16 +427,17 @@ public class KeyButtonDrawable extends Drawable { * @param ctx Context to get the drawable and determine the dark and light theme * @param icon the icon resource id * @param hasShadow if a shadow will appear with the drawable - * @param hasOvalBg if an oval bg will be drawn + * @param ovalBackgroundColor the color of the oval bg that will be drawn * @return KeyButtonDrawable */ public static KeyButtonDrawable create(@NonNull Context ctx, @DrawableRes int icon, - boolean hasShadow, boolean hasOvalBg) { + boolean hasShadow, Color ovalBackgroundColor) { final int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme); final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme); Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme); Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme); - return KeyButtonDrawable.create(lightContext, darkContext, icon, hasShadow, hasOvalBg); + return KeyButtonDrawable.create(lightContext, darkContext, icon, hasShadow, + ovalBackgroundColor); } /** @@ -446,7 +446,7 @@ public class KeyButtonDrawable extends Drawable { */ public static KeyButtonDrawable create(@NonNull Context ctx, @DrawableRes int icon, boolean hasShadow) { - return create(ctx, icon, hasShadow, false /* hasOvalBg */); + return create(ctx, icon, hasShadow, null /* ovalBackgroundColor */); } /** @@ -454,11 +454,11 @@ public class KeyButtonDrawable extends Drawable { * {@link #create(Context, int, boolean, boolean)}. */ public static KeyButtonDrawable create(Context lightContext, Context darkContext, - @DrawableRes int iconResId, boolean hasShadow, boolean hasOvalBg) { + @DrawableRes int iconResId, boolean hasShadow, Color ovalBackgroundColor) { return create(lightContext, Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor), Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor), - iconResId, hasShadow, hasOvalBg); + iconResId, hasShadow, ovalBackgroundColor); } /** @@ -467,12 +467,12 @@ public class KeyButtonDrawable extends Drawable { */ public static KeyButtonDrawable create(Context context, @ColorInt int lightColor, @ColorInt int darkColor, @DrawableRes int iconResId, boolean hasShadow, - boolean hasOvalBg) { + Color ovalBackgroundColor) { final Resources res = context.getResources(); boolean isRtl = res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; Drawable d = context.getDrawable(iconResId); final KeyButtonDrawable drawable = new KeyButtonDrawable(d, lightColor, darkColor, - isRtl && d.isAutoMirrored(), hasOvalBg); + isRtl && d.isAutoMirrored(), ovalBackgroundColor); if (hasShadow) { int offsetX = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_x); int offsetY = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_y); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index c9579fdd3788..64b28424ae63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -79,6 +79,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private final InputManager mInputManager; private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + private float mDarkIntensity; private boolean mHasOvalBg = false; private final Runnable mCheckLongPress = new Runnable() { @@ -304,6 +305,23 @@ public class KeyButtonView extends ImageView implements ButtonInterface { return true; } + @Override + public void setImageDrawable(Drawable drawable) { + super.setImageDrawable(drawable); + + if (drawable == null) { + return; + } + KeyButtonDrawable keyButtonDrawable = (KeyButtonDrawable) drawable; + keyButtonDrawable.setDarkIntensity(mDarkIntensity); + mHasOvalBg = keyButtonDrawable.hasOvalBg(); + if (mHasOvalBg) { + mOvalBgPaint.setColor(keyButtonDrawable.getDrawableBackgroundColor()); + } + mRipple.setType(keyButtonDrawable.hasOvalBg() ? KeyButtonRipple.Type.OVAL + : KeyButtonRipple.Type.ROUNDED_RECT); + } + public void playSoundEffect(int soundConstant) { if (!mPlaySounds) return; mAudioManager.playSoundEffect(soundConstant, ActivityManager.getCurrentUser()); @@ -360,17 +378,11 @@ public class KeyButtonView extends ImageView implements ButtonInterface { @Override public void setDarkIntensity(float darkIntensity) { + mDarkIntensity = darkIntensity; + Drawable drawable = getDrawable(); if (drawable != null) { - KeyButtonDrawable keyButtonDrawable = (KeyButtonDrawable) drawable; - keyButtonDrawable.setDarkIntensity(darkIntensity); - mHasOvalBg = keyButtonDrawable.hasOvalBg(); - if (mHasOvalBg) { - mOvalBgPaint.setColor(keyButtonDrawable.getDarkColor()); - } - mRipple.setType(keyButtonDrawable.hasOvalBg() ? KeyButtonRipple.Type.OVAL - : KeyButtonRipple.Type.ROUNDED_RECT); - + ((KeyButtonDrawable) drawable).setDarkIntensity(darkIntensity); // Since we reuse the same drawable for multiple views, we need to invalidate the view // manually. invalidate(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 2afe485eff8e..13f93b923505 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -545,7 +545,7 @@ public class MobileSignalController extends SignalController< } private boolean isDataDisabled() { - return !mPhone.getDataEnabled(mSubscriptionInfo.getSubscriptionId()); + return !mPhone.isDataCapable(); } @VisibleForTesting @@ -566,6 +566,7 @@ public class MobileSignalController extends SignalController< pw.println(" mDataState=" + mDataState + ","); pw.println(" mDataNetType=" + mDataNetType + ","); pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ","); + pw.println(" isDataDisabled=" + isDataDisabled() + ","); } class MobilePhoneStateListener extends PhoneStateListener { diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java index efd6e03b0d20..fa7af0be77f1 100644 --- a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java +++ b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java @@ -16,6 +16,8 @@ package com.android.systemui.util.leak; +import android.content.ClipData; +import android.content.ClipDescription; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -47,10 +49,11 @@ public class DumpTruck { private static final String FILEPROVIDER_PATH = "leak"; private static final String TAG = "DumpTruck"; - private static final int BUFSIZ = 512 * 1024; // 512K + private static final int BUFSIZ = 1024 * 1024; // 1MB private final Context context; private Uri hprofUri; + private long pss; final StringBuilder body = new StringBuilder(); public DumpTruck(Context context) { @@ -89,6 +92,7 @@ public class DumpTruck { .append(info.currentPss) .append(" uss=") .append(info.currentUss); + pss = info.currentPss; } } if (pid == myPid) { @@ -114,6 +118,7 @@ public class DumpTruck { if (DumpTruck.zipUp(zipfile, paths)) { final File pathFile = new File(zipfile); hprofUri = FileProvider.getUriForFile(context, FILEPROVIDER_AUTHORITY, pathFile); + Log.v(TAG, "Heap dump accessible at URI: " + hprofUri); } } catch (IOException e) { Log.e(TAG, "unable to zip up heapdumps", e); @@ -138,16 +143,27 @@ public class DumpTruck { * @return share intent */ public Intent createShareIntent() { - Intent shareIntent = new Intent(Intent.ACTION_SEND); + Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, "SystemUI memory dump"); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, + String.format("SystemUI memory dump (pss=%dM)", pss / 1024)); shareIntent.putExtra(Intent.EXTRA_TEXT, body.toString()); if (hprofUri != null) { + final ArrayList<Uri> uriList = new ArrayList<>(); + uriList.add(hprofUri); shareIntent.setType("application/zip"); - shareIntent.putExtra(Intent.EXTRA_STREAM, hprofUri); + shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList); + + // Include URI in ClipData also, so that grantPermission picks it up. + // We don't use setData here because some apps interpret this as "to:". + ClipData clipdata = new ClipData(new ClipDescription("content", + new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}), + new ClipData.Item(hprofUri)); + shareIntent.setClipData(clipdata); + shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } return shareIntent; } diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java index b590e7738f08..583f6b340d47 100644 --- a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java @@ -16,9 +16,13 @@ package com.android.systemui.util.leak; +import static android.service.quicksettings.Tile.STATE_ACTIVE; +import static android.telephony.ims.feature.ImsFeature.STATE_UNAVAILABLE; + import static com.android.internal.logging.MetricsLogger.VIEW_UNKNOWN; import static com.android.systemui.Dependency.BG_LOOPER_NAME; +import android.annotation.Nullable; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; @@ -38,11 +42,11 @@ import android.os.Message; import android.os.Process; import android.os.SystemProperties; import android.provider.Settings; -import android.service.quicksettings.Tile; import android.text.format.DateUtils; import android.util.Log; import android.util.LongSparseArray; +import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.SystemUIFactory; @@ -50,6 +54,8 @@ import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.tileimpl.QSTileImpl; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; import javax.inject.Inject; @@ -59,26 +65,33 @@ import javax.inject.Singleton; /** */ @Singleton -public class GarbageMonitor { +public class GarbageMonitor implements Dumpable { private static final boolean LEAK_REPORTING_ENABLED = Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.enable_leak_reporting", false); private static final String FORCE_ENABLE_LEAK_REPORTING = "sysui_force_enable_leak_reporting"; private static final boolean HEAP_TRACKING_ENABLED = Build.IS_DEBUGGABLE; - private static final boolean ENABLE_AM_HEAP_LIMIT = true; // use ActivityManager.setHeapLimit + + // whether to use ActivityManager.setHeapLimit + private static final boolean ENABLE_AM_HEAP_LIMIT = Build.IS_DEBUGGABLE; + // heap limit value, in KB (overrides R.integer.watch_heap_limit) + private static final String SETTINGS_KEY_AM_HEAP_LIMIT = "systemui_am_heap_limit"; private static final String TAG = "GarbageMonitor"; private static final long GARBAGE_INSPECTION_INTERVAL = 15 * DateUtils.MINUTE_IN_MILLIS; // 15 min private static final long HEAP_TRACK_INTERVAL = 1 * DateUtils.MINUTE_IN_MILLIS; // 1 min + private static final int HEAP_TRACK_HISTORY_LEN = 720; // 12 hours private static final int DO_GARBAGE_INSPECTION = 1000; private static final int DO_HEAP_TRACK = 3000; private static final int GARBAGE_ALLOWANCE = 5; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private final Handler mHandler; private final TrackedGarbage mTrackedGarbage; private final LeakReporter mLeakReporter; @@ -112,7 +125,9 @@ public class GarbageMonitor { mDumpTruck = new DumpTruck(mContext); if (ENABLE_AM_HEAP_LIMIT) { - mHeapLimit = mContext.getResources().getInteger(R.integer.watch_heap_limit); + mHeapLimit = Settings.Global.getInt(context.getContentResolver(), + SETTINGS_KEY_AM_HEAP_LIMIT, + mContext.getResources().getInteger(R.integer.watch_heap_limit)); } } @@ -174,7 +189,7 @@ public class GarbageMonitor { sb.append(p); sb.append(" "); } - Log.v(TAG, sb.toString()); + if (DEBUG) Log.v(TAG, sb.toString()); } private void update() { @@ -183,18 +198,18 @@ public class GarbageMonitor { for (int i = 0; i < dinfos.length; i++) { Debug.MemoryInfo dinfo = dinfos[i]; if (i > mPids.size()) { - Log.e(TAG, "update: unknown process info received: " + dinfo); + if (DEBUG) Log.e(TAG, "update: unknown process info received: " + dinfo); break; } final long pid = mPids.get(i).intValue(); final ProcessMemInfo info = mData.get(pid); - info.head = (info.head + 1) % info.pss.length; info.pss[info.head] = info.currentPss = dinfo.getTotalPss(); info.uss[info.head] = info.currentUss = dinfo.getTotalPrivateDirty(); + info.head = (info.head + 1) % info.pss.length; if (info.currentPss > info.max) info.max = info.currentPss; if (info.currentUss > info.max) info.max = info.currentUss; if (info.currentPss == 0) { - Log.v(TAG, "update: pid " + pid + " has pss=0, it probably died"); + if (DEBUG) Log.v(TAG, "update: pid " + pid + " has pss=0, it probably died"); mData.remove(pid); } } @@ -224,11 +239,36 @@ public class GarbageMonitor { return b + SUFFIXES[i]; } - private void dumpHprofAndShare() { - final Intent share = mDumpTruck.captureHeaps(getTrackedProcesses()).createShareIntent(); - mContext.startActivity(share); + private Intent dumpHprofAndGetShareIntent() { + return mDumpTruck.captureHeaps(getTrackedProcesses()).createShareIntent(); + } + + @Override + public void dump(@Nullable FileDescriptor fd, PrintWriter pw, @Nullable String[] args) { + pw.println("GarbageMonitor params:"); + pw.println(String.format(" mHeapLimit=%d KB", mHeapLimit)); + pw.println(String.format(" GARBAGE_INSPECTION_INTERVAL=%d (%.1f mins)", + GARBAGE_INSPECTION_INTERVAL, + (float) GARBAGE_INSPECTION_INTERVAL / DateUtils.MINUTE_IN_MILLIS)); + final float htiMins = HEAP_TRACK_INTERVAL / DateUtils.MINUTE_IN_MILLIS; + pw.println(String.format(" HEAP_TRACK_INTERVAL=%d (%.1f mins)", + HEAP_TRACK_INTERVAL, + htiMins)); + pw.println(String.format(" HEAP_TRACK_HISTORY_LEN=%d (%.1f hr total)", + HEAP_TRACK_HISTORY_LEN, + (float) HEAP_TRACK_HISTORY_LEN * htiMins / 60f)); + + pw.println("GarbageMonitor tracked processes:"); + + for (long pid : mPids) { + final ProcessMemInfo pmi = mData.get(pid); + if (pmi != null) { + pmi.dump(fd, pw, args); + } + } } + private static class MemoryIconDrawable extends Drawable { long pss, limit; final Drawable baseIcon; @@ -238,7 +278,7 @@ public class GarbageMonitor { MemoryIconDrawable(Context context) { baseIcon = context.getDrawable(R.drawable.ic_memory).mutate(); dp = context.getResources().getDisplayMetrics().density; - paint.setColor(QSTileImpl.getColorForState(context, Tile.STATE_ACTIVE)); + paint.setColor(QSTileImpl.getColorForState(context, STATE_ACTIVE)); } public void setPss(long pss) { @@ -343,8 +383,12 @@ public class GarbageMonitor { public static class MemoryTile extends QSTileImpl<QSTile.State> { public static final String TILE_SPEC = "dbg:mem"; + // Tell QSTileHost.java to toss this into the default tileset? + public static final boolean ADD_TO_DEFAULT_ON_DEBUGGABLE_BUILDS = true; + private final GarbageMonitor gm; private ProcessMemInfo pmi; + private boolean dumpInProgress; @Inject public MemoryTile(QSHost host) { @@ -364,8 +408,26 @@ public class GarbageMonitor { @Override protected void handleClick() { - getHost().collapsePanels(); - mHandler.post(gm::dumpHprofAndShare); + if (dumpInProgress) return; + + dumpInProgress = true; + refreshState(); + new Thread("HeapDumpThread") { + @Override + public void run() { + try { + // wait for animations & state changes + Thread.sleep(500); + } catch (InterruptedException ignored) { } + final Intent shareIntent = gm.dumpHprofAndGetShareIntent(); + mHandler.post(() -> { + dumpInProgress = false; + refreshState(); + getHost().collapsePanels(); + mContext.startActivity(shareIntent); + }); + } + }.start(); } @Override @@ -395,9 +457,12 @@ public class GarbageMonitor { pmi = gm.getMemInfo(Process.myPid()); final MemoryGraphIcon icon = new MemoryGraphIcon(); icon.setHeapLimit(gm.mHeapLimit); + state.state = dumpInProgress ? STATE_UNAVAILABLE : STATE_ACTIVE; + state.label = dumpInProgress + ? "Dumping..." + : mContext.getString(R.string.heap_dump_tile_name); if (pmi != null) { icon.setPss(pmi.currentPss); - state.label = mContext.getString(R.string.heap_dump_tile_name); state.secondaryLabel = String.format( "pss: %s / %s", @@ -405,7 +470,6 @@ public class GarbageMonitor { formatBytes(gm.mHeapLimit * 1024)); } else { icon.setPss(0); - state.label = "Dump SysUI"; state.secondaryLabel = null; } state.icon = icon; @@ -424,13 +488,14 @@ public class GarbageMonitor { } } - public static class ProcessMemInfo { + /** */ + public static class ProcessMemInfo implements Dumpable { public long pid; public String name; public long startTime; public long currentPss, currentUss; - public long[] pss = new long[256]; - public long[] uss = new long[256]; + public long[] pss = new long[HEAP_TRACK_HISTORY_LEN]; + public long[] uss = new long[HEAP_TRACK_HISTORY_LEN]; public long max = 1; public int head = 0; @@ -443,9 +508,33 @@ public class GarbageMonitor { public long getUptime() { return System.currentTimeMillis() - startTime; } + + @Override + public void dump(@Nullable FileDescriptor fd, PrintWriter pw, @Nullable String[] args) { + pw.print("{ \"pid\": "); + pw.print(pid); + pw.print(", \"name\": \""); + pw.print(name.replace('"', '-')); + pw.print("\", \"start\": "); + pw.print(startTime); + pw.print(", \"pss\": ["); + // write pss values starting from the oldest, which is pss[head], wrapping around to + // pss[(head-1) % pss.length] + for (int i = 0; i < pss.length; i++) { + if (i > 0) pw.print(","); + pw.print(pss[(head + i) % pss.length]); + } + pw.print("], \"uss\": ["); + for (int i = 0; i < uss.length; i++) { + if (i > 0) pw.print(","); + pw.print(uss[(head + i) % uss.length]); + } + pw.println("] }"); + } } - public static class Service extends SystemUI { + /** */ + public static class Service extends SystemUI implements Dumpable { private GarbageMonitor mGarbageMonitor; @Override @@ -463,6 +552,11 @@ public class GarbageMonitor { mGarbageMonitor.startHeapTracking(); } } + + @Override + public void dump(@Nullable FileDescriptor fd, PrintWriter pw, @Nullable String[] args) { + if (mGarbageMonitor != null) mGarbageMonitor.dump(fd, pw, args); + } } private class BackgroundHeapCheckHandler extends Handler { diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index 64ab060e14a2..3b5e12c4ef96 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -45,6 +45,7 @@ import android.testing.TestableLooper.RunWithLooper; import android.view.Display; import android.view.View; import android.view.WindowManager; +import android.view.WindowManagerPolicyConstants; import androidx.test.filters.SmallTest; @@ -52,6 +53,7 @@ import com.android.systemui.R.dimen; import com.android.systemui.ScreenDecorations.TunablePaddingTagListener; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentService; +import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.tuner.TunablePadding; @@ -78,6 +80,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { private TunerService mTunerService; private StatusBarWindowView mView; private TunablePaddingService mTunablePaddingService; + private NavigationModeController mNavigationModeController; @Before public void setup() { @@ -87,6 +90,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class); mTunerService = mDependency.injectMockDependency(TunerService.class); mFragmentService = mDependency.injectMockDependency(FragmentService.class); + mNavigationModeController = mDependency.injectMockDependency( + NavigationModeController.class); mStatusBar = mock(StatusBar.class); mWindowManager = mock(WindowManager.class); @@ -208,6 +213,54 @@ public class ScreenDecorationsTest extends SysuiTestCase { } @Test + public void testAssistHandles() { + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius, 0); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius_top, 0); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); + mContext.getOrCreateTestableResources() + .addOverride(dimen.rounded_corner_content_padding, 0); + when(mNavigationModeController.addListener(any())).thenReturn( + WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL); + + mScreenDecorations.start(); + + // Add 2 windows for rounded corners (top and bottom). + verify(mWindowManager, times(2)).addView(any(), any()); + } + + @Test + public void testDelayedAssistHandles() { + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius, 0); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius_top, 0); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); + mContext.getOrCreateTestableResources() + .addOverride(dimen.rounded_corner_content_padding, 0); + when(mNavigationModeController.addListener(any())).thenReturn( + WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON); + + mScreenDecorations.start(); + + // No handles and no corners + verify(mWindowManager, never()).addView(any(), any()); + + mScreenDecorations.handleNavigationModeChange( + WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL); + + // Add 2 windows for rounded corners (top and bottom). + verify(mWindowManager, times(2)).addView(any(), any()); + } + + @Test public void hasRoundedCornerOverlayFlagSet() { assertThat(mScreenDecorations.getWindowLayoutParams().privateFlags & PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY, diff --git a/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java index 18f114a71a8d..a583b1c4308e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java @@ -20,6 +20,7 @@ import static org.mockito.AdditionalAnswers.answerVoid; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.reset; @@ -35,11 +36,13 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.internal.app.AssistUtils; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.systemui.ScreenDecorations; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -59,6 +62,7 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Mock private ScreenDecorations mMockScreenDecorations; @Mock private AssistUtils mMockAssistUtils; @Mock private Handler mMockHandler; + @Mock private PhenotypeHelper mMockPhenotypeHelper; @Mock private AssistHandleBehaviorController.BehaviorController mMockBehaviorController; @Before @@ -69,14 +73,21 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { doAnswer(answerVoid(Runnable::run)).when(mMockHandler).post(any(Runnable.class)); doAnswer(answerVoid(Runnable::run)).when(mMockHandler) .postDelayed(any(Runnable.class), anyLong()); + mAssistHandleBehaviorController = new AssistHandleBehaviorController( mContext, mMockAssistUtils, mMockHandler, () -> mMockScreenDecorations, + mMockPhenotypeHelper, mMockBehaviorController); } + @After + public void teardown() { + mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF); + } + @Test public void hide_hidesHandlesWhenShowing() { // Arrange @@ -185,6 +196,9 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { public void showAndGo_doesNothingIfRecentlyHidden() { // Arrange when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); + when(mMockPhenotypeHelper.getLong( + eq(SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS), + anyLong())).thenReturn(10000L); mAssistHandleBehaviorController.showAndGo(); reset(mMockScreenDecorations); @@ -210,6 +224,87 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { } @Test + public void showAndGoDelayed_showsThenHidesHandlesWhenHiding() { + // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); + mAssistHandleBehaviorController.hide(); + reset(mMockScreenDecorations); + + // Act + mAssistHandleBehaviorController.showAndGoDelayed(1000, false); + + // Assert + InOrder inOrder = inOrder(mMockScreenDecorations); + inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true); + inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false); + inOrder.verifyNoMoreInteractions(); + } + + @Test + public void showAndGoDelayed_hidesHandlesAfterTimeoutWhenShowing() { + // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); + mAssistHandleBehaviorController.showAndStay(); + reset(mMockScreenDecorations); + + // Act + mAssistHandleBehaviorController.showAndGoDelayed(1000, false); + + // Assert + verify(mMockScreenDecorations).setAssistHintVisible(false); + verifyNoMoreInteractions(mMockScreenDecorations); + } + + @Test + public void showAndGoDelayed_hidesInitiallyThenShowsThenHidesAfterTimeoutWhenHideRequested() { + // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); + mAssistHandleBehaviorController.showAndStay(); + reset(mMockScreenDecorations); + + // Act + mAssistHandleBehaviorController.showAndGoDelayed(1000, true); + + // Assert + InOrder inOrder = inOrder(mMockScreenDecorations); + inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false); + inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true); + inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false); + inOrder.verifyNoMoreInteractions(); + } + + @Test + public void showAndGoDelayed_doesNothingIfRecentlyHidden() { + // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); + when(mMockPhenotypeHelper.getLong( + eq(SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS), + anyLong())).thenReturn(10000L); + mAssistHandleBehaviorController.showAndGo(); + reset(mMockScreenDecorations); + + // Act + mAssistHandleBehaviorController.showAndGoDelayed(1000, false); + + // Assert + verifyNoMoreInteractions(mMockScreenDecorations); + } + + @Test + public void showAndGoDelayed_doesNothingWhenThereIsNoAssistant() { + // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null); + mAssistHandleBehaviorController.hide(); + reset(mMockScreenDecorations); + + // Act + mAssistHandleBehaviorController.showAndGoDelayed(1000, false); + + // Assert + verifyNoMoreInteractions(mMockScreenDecorations); + } + + @Test public void setBehavior_activatesTheBehaviorWhenInGesturalMode() { // Arrange when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java index 9c2c82257173..41747f407546 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java @@ -40,6 +40,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; /** @@ -57,6 +58,8 @@ public class SysuiColorExtractorTests extends SysuiTestCase { ColorExtractor.TYPE_DARK, ColorExtractor.TYPE_EXTRA_DARK}; + @Mock + private WallpaperManager mWallpaperManager; private ColorExtractor.GradientColors mColors; private SysuiColorExtractor mColorExtractor; @@ -72,32 +75,15 @@ public class SysuiColorExtractorTests extends SysuiTestCase { outGradientColorsNormal.set(mColors); outGradientColorsDark.set(mColors); outGradientColorsExtraDark.set(mColors); - }, mock(ConfigurationController.class), false); + }, mock(ConfigurationController.class), mWallpaperManager, true /* immediately */); } @Test - public void getColors_usesGreyIfWallpaperNotVisible() { - simulateEvent(mColorExtractor); - mColorExtractor.setWallpaperVisible(false); - - ColorExtractor.GradientColors fallbackColors = mColorExtractor.getNeutralColors(); - - for (int type : sTypes) { - assertEquals("Not using fallback!", - mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors); - assertNotEquals("Wallpaper visibility event should not affect lock wallpaper.", - mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors); - } - } - - @Test - public void getColors_doesntUseFallbackIfVisible() { + public void getColors() { mColors.setMainColor(Color.RED); mColors.setSecondaryColor(Color.RED); simulateEvent(mColorExtractor); - mColorExtractor.setWallpaperVisible(true); - for (int which : sWhich) { for (int type : sTypes) { assertEquals("Not using extracted colors!", @@ -109,8 +95,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { @Test public void getColors_fallbackWhenMediaIsVisible() { simulateEvent(mColorExtractor); - mColorExtractor.setWallpaperVisible(true); - mColorExtractor.setHasBackdrop(true); + mColorExtractor.setHasMediaArtwork(true); ColorExtractor.GradientColors fallbackColors = mColorExtractor.getNeutralColors(); @@ -127,7 +112,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { Tonal tonal = mock(Tonal.class); ConfigurationController configurationController = mock(ConfigurationController.class); SysuiColorExtractor sysuiColorExtractor = new SysuiColorExtractor(getContext(), - tonal, configurationController, false /* registerVisibility */); + tonal, configurationController, mWallpaperManager, true /* immediately */); verify(configurationController).addCallback(eq(sysuiColorExtractor)); reset(tonal); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index 4467faf66830..33042918cfc9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -27,10 +27,12 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AlarmManager; +import android.database.ContentObserver; import android.hardware.display.AmbientDisplayConfiguration; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -39,6 +41,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.doze.DozeSensors.TriggerSensor; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AsyncSensorManager; @@ -73,6 +76,8 @@ public class DozeSensorsTest extends SysuiTestCase { private Consumer<Boolean> mProxCallback; @Mock private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy; + @Mock + private TriggerSensor mMockTriggerSensor; private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener; private TestableLooper mTestableLooper; private DozeSensors mDozeSensors; @@ -107,6 +112,25 @@ public class DozeSensorsTest extends SysuiTestCase { anyBoolean(), anyFloat(), anyFloat(), eq(null)); } + @Test + public void testSetListening_firstTrue_registerSettingsObserver() { + mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; + + mDozeSensors.setListening(true); + + verify(mMockTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); + } + + @Test + public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() { + mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; + mDozeSensors.setListening(true); + + mDozeSensors.setListening(true); + + verify(mMockTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); + } + private class TestableDozeSensors extends DozeSensors { TestableDozeSensors() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt index 76326303ff96..8b81a7a29f84 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt @@ -109,7 +109,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { } @Test - fun testPrepareDialogForApp_retrievesUpto4Channels() { + fun testPrepareDialogForApp_retrievesUpTo4Channels() { val channel3 = NotificationChannel("test_channel_3", "Test channel 3", IMPORTANCE_DEFAULT) val channel4 = NotificationChannel("test_channel_4", "Test channel 4", IMPORTANCE_DEFAULT) @@ -169,6 +169,16 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { eq(TEST_PACKAGE_NAME), eq(TEST_UID), eq(true)) } + @Test + fun testSettingsClickListenerNull_noCrash() { + group.channels = listOf(channel1, channel2) + controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID, + setOf(channel1, channel2), appIcon, null) + + // Pass in any old view, it should never actually be used + controller.launchSettings(View(context)) + } + private val clickListener = object : NotificationInfo.OnSettingsClickListener { override fun onClick(v: View, c: NotificationChannel, appUid: Int) { } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java index 025296d14da4..06ff0478a804 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java @@ -101,7 +101,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { mNotificationInflater.setUsesIncreasedHeadsUpHeight(true); Notification.Builder builder = spy(mBuilder); mNotificationInflater.inflateNotificationViews( - false /* inflateSynchronously */, + true /* inflateSynchronously */, FLAG_CONTENT_VIEW_ALL, builder, mContext); @@ -113,7 +113,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { mNotificationInflater.setUsesIncreasedHeight(true); Notification.Builder builder = spy(mBuilder); mNotificationInflater.inflateNotificationViews( - false /* inflateSynchronously */, + true /* inflateSynchronously */, FLAG_CONTENT_VIEW_ALL, builder, mContext); @@ -161,6 +161,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { @Test public void testRemovedNotInflated() throws Exception { mRow.setRemoved(); + mNotificationInflater.setInflateSynchronously(true); mNotificationInflater.inflateNotificationViews(); Assert.assertNull(mRow.getEntry().getRunningTask()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index ef13b61162c5..795948470295 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java @@ -67,6 +67,7 @@ import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.util.Assert; @@ -105,6 +106,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { @Mock private NotificationInfo.CheckSaveListener mCheckSaveListener; @Mock private OnSettingsClickListener mOnSettingsClickListener; @Mock private DeviceProvisionedController mDeviceProvisionedController; + @Mock private StatusBar mStatusBar; @Before public void setUp() { @@ -115,7 +117,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger); mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager); mHandler = Handler.createAsync(mTestableLooper.getLooper()); - + mContext.putComponent(StatusBar.class, mStatusBar); mHelper = new NotificationTestHelper(mContext); mGutsManager = new NotificationGutsManager(mContext, mVisualStabilityManager); @@ -150,7 +152,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { when(row.getWindowToken()).thenReturn(new Binder()); when(row.getGuts()).thenReturn(guts); - assertTrue(mGutsManager.openGuts(row, 0, 0, menuItem)); + assertTrue(mGutsManager.openGutsInternal(row, 0, 0, menuItem)); assertEquals(View.INVISIBLE, guts.getVisibility()); mTestableLooper.processAllMessages(); verify(guts).openControls( @@ -198,7 +200,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { when(entry.getRow()).thenReturn(row); when(entry.getGuts()).thenReturn(guts); - assertTrue(mGutsManager.openGuts(row, 0, 0, menuItem)); + assertTrue(mGutsManager.openGutsInternal(row, 0, 0, menuItem)); mTestableLooper.processAllMessages(); verify(guts).openControls( eq(true), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 56265d08c131..d42598209545 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -70,6 +70,7 @@ import com.android.systemui.statusbar.notification.row.FooterView; import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.NotificationGroupManager; +import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; @@ -110,6 +111,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private NotificationData mNotificationData; @Mock private NotificationRemoteInputManager mRemoteInputManager; @Mock private RemoteInputController mRemoteInputController; + @Mock private NotificationIconAreaController mNotificationIconAreaController; @Mock private MetricsLogger mMetricsLogger; @Mock private NotificationRoundnessManager mNotificationRoundnessManager; private TestableNotificationEntryManager mEntryManager; @@ -162,6 +164,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { mStackScroller.setHeadsUpManager(mHeadsUpManager); mStackScroller.setGroupManager(mGroupManager); mStackScroller.setEmptyShadeView(mEmptyShadeView); + mStackScroller.setIconAreaController(mNotificationIconAreaController); // Stub out functionality that isn't necessary to test. doNothing().when(mBar) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java index cb70a1fa3a3b..be69f5f8a844 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java @@ -180,9 +180,9 @@ public class NavigationBarContextTest extends SysuiTestCase { final Drawable d = mock(Drawable.class); final ContextualButton button = spy(mBtn0); final KeyButtonDrawable kbd1 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor, - false /* horizontalFlip */, false /* hasOvalBg */)); + false /* horizontalFlip */, null /* ovalBackgroundColor */)); final KeyButtonDrawable kbd2 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor, - false /* horizontalFlip */, false /* hasOvalBg */)); + false /* horizontalFlip */, null /* ovalBackgroundColor */)); kbd1.setDarkIntensity(TEST_DARK_INTENSITY); kbd2.setDarkIntensity(0f); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java index faf5a9706735..3da9a4bdf759 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java @@ -56,6 +56,7 @@ import com.android.systemui.Dependency; import com.android.systemui.SysuiBaseFragmentTest; import com.android.systemui.SysuiTestableContext; import com.android.systemui.assist.AssistManager; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.stackdivider.Divider; @@ -215,7 +216,8 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest { new MetricsLogger(), mock(AssistManager.class), mOverviewProxyService, - mock(NavigationModeController.class)); + mock(NavigationModeController.class), + mock(StatusBarStateController.class)); } private class HostCallbacksForExternalDisplay extends diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 616b46a6d316..3464fe574007 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -164,7 +164,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void setupNetworkController() { // For now just pretend to be the data sim, so we can test that too. mSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; - when(mMockTm.getDataEnabled(mSubId)).thenReturn(true); + when(mMockTm.isDataCapable()).thenReturn(true); setDefaultSubId(mSubId); setSubscriptions(mSubId); mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index cd0a04411ee1..5128675e2723 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -119,7 +119,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testNoInternetIcon_withDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 0); setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); @@ -133,7 +133,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testDataDisabledIcon_withDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); @@ -147,7 +147,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testNoInternetIcon_withoutDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); setDefaultSubId(mSubId + 1); updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 0); @@ -162,7 +162,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testDataDisabledIcon_withoutDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); setDefaultSubId(mSubId + 1); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); @@ -218,7 +218,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testDataDisabledIcon_UserNotSetup() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); @@ -233,7 +233,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testAlwaysShowDataRatIcon() { setupDefaultSignal(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, TelephonyManager.NETWORK_TYPE_GSM); diff --git a/packages/VpnDialogs/res/values-hi/strings.xml b/packages/VpnDialogs/res/values-hi/strings.xml index 5560a855627f..34b79cb4100a 100644 --- a/packages/VpnDialogs/res/values-hi/strings.xml +++ b/packages/VpnDialogs/res/values-hi/strings.xml @@ -30,7 +30,7 @@ <string name="always_on_disconnected_message_separator" msgid="3310614409322581371">" "</string> <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"VPN सेटिंग बदलें"</string> <string name="configure" msgid="4905518375574791375">"कॉन्फ़िगर करें"</string> - <string name="disconnect" msgid="971412338304200056">"डिस्कनेक्ट करें"</string> + <string name="disconnect" msgid="971412338304200056">"डिसकनेक्ट करें"</string> <string name="open_app" msgid="3717639178595958667">"ऐप खोलें"</string> <string name="dismiss" msgid="6192859333764711227">"खारिज करें"</string> </resources> diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml index f1d2e0b27353..96ed7b4cc353 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls the opacity of the navigation bar depending on the visibility of the + various workspace stacks. + 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. + 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always + opaque. + 2 - Nav bar is never forced opaque. + --> + <integer name="config_navBarOpacityMode">2</integer> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move (which normally prevents seamless rotation). --> <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml index 1232201de862..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml @@ -25,6 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> - <!-- The height of the bottom navigation gesture area. --> + <!-- The height of the bottom navigation gesture area. --> <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml index c8f994c982e5..d5991f367c43 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls the opacity of the navigation bar depending on the visibility of the + various workspace stacks. + 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. + 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always + opaque. + 2 - Nav bar is never forced opaque. + --> + <integer name="config_navBarOpacityMode">2</integer> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move (which normally prevents seamless rotation). --> <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml index 987d20375e5e..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml @@ -25,4 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> + <!-- The height of the bottom navigation gesture area. --> + <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml index 693110adb312..ff507ee9f46c 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls the opacity of the navigation bar depending on the visibility of the + various workspace stacks. + 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. + 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always + opaque. + 2 - Nav bar is never forced opaque. + --> + <integer name="config_navBarOpacityMode">2</integer> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move (which normally prevents seamless rotation). --> <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml index 987d20375e5e..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml @@ -25,4 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> + <!-- The height of the bottom navigation gesture area. --> + <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml index 5cd6ce3d7d50..378756a50f16 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls the opacity of the navigation bar depending on the visibility of the + various workspace stacks. + 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. + 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always + opaque. + 2 - Nav bar is never forced opaque. + --> + <integer name="config_navBarOpacityMode">2</integer> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move (which normally prevents seamless rotation). --> <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml index 987d20375e5e..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml @@ -25,4 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> + <!-- The height of the bottom navigation gesture area. --> + <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index af9b0e2aa7b1..3764ca4b7906 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -569,12 +569,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState @GuardedBy("mLock") private void requestNewFillResponseLocked(@NonNull ViewState viewState, int newState, int flags) { - if (mForAugmentedAutofillOnly) { + if (mForAugmentedAutofillOnly || mRemoteFillService == null) { if (sVerbose) { Slog.v(TAG, "requestNewFillResponse(): triggering augmented autofill instead " + "(mForAugmentedAutofillOnly=" + mForAugmentedAutofillOnly + ", flags=" + flags + ")"); } + mForAugmentedAutofillOnly = true; triggerAugmentedAutofillLocked(); return; } diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java index bae453d6a7b6..06d9395cd7d6 100644 --- a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java +++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java @@ -98,7 +98,7 @@ public final class ContentSuggestionsPerUserService extends RemoteContentSuggestionsService service = ensureRemoteServiceLocked(); if (service != null) { ActivityManager.TaskSnapshot snapshot = - mActivityTaskManagerInternal.getTaskSnapshot(taskId, false); + mActivityTaskManagerInternal.getTaskSnapshotNoRestore(taskId, false); GraphicBuffer snapshotBuffer = null; int colorSpaceId = 0; if (snapshot != null) { diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index d0edaaaf7619..d16244167c62 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -210,6 +210,7 @@ class AlarmManagerService extends SystemService { IAlarmListener mTimeTickTrigger; PendingIntent mDateChangeSender; Random mRandom; + PendingIntent.CancelListener mOperationCancelListener; boolean mInteractive = true; long mNonInteractiveStartTime; long mNonInteractiveTime; @@ -1497,6 +1498,7 @@ class AlarmManagerService extends SystemService { synchronized (mLock) { mHandler = new AlarmHandler(); + mOperationCancelListener = (intent) -> removeImpl(intent, null); mConstants = new Constants(mHandler); mAppWakeupHistory = new AppWakeupHistory(Constants.DEFAULT_APP_STANDBY_WINDOW); @@ -1748,7 +1750,9 @@ class AlarmManagerService extends SystemService { } else { maxElapsed = triggerElapsed + windowLength; } - + if (operation != null) { + operation.registerCancelListener(mOperationCancelListener); + } synchronized (mLock) { if (DEBUG_BATCH) { Slog.v(TAG, "set(" + operation + ") : type=" + type @@ -1761,8 +1765,9 @@ class AlarmManagerService extends SystemService { "Maximum limit of concurrent alarms " + mConstants.MAX_ALARMS_PER_UID + " reached for uid: " + UserHandle.formatUid(callingUid) + ", callingPackage: " + callingPackage; - // STOPSHIP (b/128866264): Just to catch breakages. Remove before final release. - Slog.wtf(TAG, errorMsg); + mHandler.obtainMessage(AlarmHandler.UNREGISTER_CANCEL_LISTENER, + operation).sendToTarget(); + Slog.w(TAG, errorMsg); throw new IllegalStateException(errorMsg); } setImplLocked(type, triggerAtTime, triggerElapsed, windowLength, maxElapsed, @@ -1782,6 +1787,8 @@ class AlarmManagerService extends SystemService { if (ActivityManager.getService().isAppStartModeDisabled(callingUid, callingPackage)) { Slog.w(TAG, "Not setting alarm from " + callingUid + ":" + a + " -- package not allowed to start"); + mHandler.obtainMessage(AlarmHandler.UNREGISTER_CANCEL_LISTENER, + operation).sendToTarget(); return; } } catch (RemoteException e) { @@ -2136,10 +2143,11 @@ class AlarmManagerService extends SystemService { Slog.w(TAG, "remove() with no intent or listener"); return; } - synchronized (mLock) { removeLocked(operation, listener); } + mHandler.obtainMessage(AlarmHandler.UNREGISTER_CANCEL_LISTENER, + operation).sendToTarget(); } @Override @@ -3011,46 +3019,10 @@ class AlarmManagerService extends SystemService { DateFormat.format(pattern, info.getTriggerTime()).toString(); } - /** - * If the last time AlarmThread woke up precedes any due wakeup or non-wakeup alarm that we set - * by more than half a minute, log a wtf. - */ - private void validateLastAlarmExpiredLocked(long nowElapsed) { - final StringBuilder errorMsg = new StringBuilder(); - boolean stuck = false; - if (mNextNonWakeup < (nowElapsed - 10_000) && mLastWakeup < mNextNonWakeup) { - stuck = true; - errorMsg.append("[mNextNonWakeup="); - TimeUtils.formatDuration(mNextNonWakeup - nowElapsed, errorMsg); - errorMsg.append(" set at "); - TimeUtils.formatDuration(mNextNonWakeUpSetAt - nowElapsed, errorMsg); - errorMsg.append(", mLastWakeup="); - TimeUtils.formatDuration(mLastWakeup - nowElapsed, errorMsg); - errorMsg.append(", timerfd_gettime=" + mInjector.getNextAlarm(ELAPSED_REALTIME)); - errorMsg.append("];"); - } - if (mNextWakeup < (nowElapsed - 10_000) && mLastWakeup < mNextWakeup) { - stuck = true; - errorMsg.append("[mNextWakeup="); - TimeUtils.formatDuration(mNextWakeup - nowElapsed, errorMsg); - errorMsg.append(" set at "); - TimeUtils.formatDuration(mNextWakeUpSetAt - nowElapsed, errorMsg); - errorMsg.append(", mLastWakeup="); - TimeUtils.formatDuration(mLastWakeup - nowElapsed, errorMsg); - errorMsg.append(", timerfd_gettime=" - + mInjector.getNextAlarm(ELAPSED_REALTIME_WAKEUP)); - errorMsg.append("];"); - } - if (stuck) { - Slog.wtf(TAG, "Alarm delivery stuck: " + errorMsg.toString()); - } - } - void rescheduleKernelAlarmsLocked() { // Schedule the next upcoming wakeup alarm. If there is a deliverable batch // prior to that which contains no wakeups, we schedule that as well. final long nowElapsed = mInjector.getElapsedRealtime(); - validateLastAlarmExpiredLocked(nowElapsed); long nextNonWakeup = 0; if (mAlarmBatches.size() > 0) { final Batch firstWakeup = findFirstWakeupBatchLocked(); @@ -4179,6 +4151,7 @@ class AlarmManagerService extends SystemService { public static final int APP_STANDBY_BUCKET_CHANGED = 5; public static final int APP_STANDBY_PAROLE_CHANGED = 6; public static final int REMOVE_FOR_STOPPED = 7; + public static final int UNREGISTER_CANCEL_LISTENER = 8; AlarmHandler() { super(Looper.myLooper()); @@ -4261,6 +4234,13 @@ class AlarmManagerService extends SystemService { } break; + case UNREGISTER_CANCEL_LISTENER: + final PendingIntent pi = (PendingIntent) msg.obj; + if (pi != null) { + pi.unregisterCancelListener(mOperationCancelListener); + } + break; + default: // nope, just ignore it break; @@ -4716,6 +4696,11 @@ class AlarmManagerService extends SystemService { Intent.EXTRA_ALARM_COUNT, alarm.count), mDeliveryTracker, mHandler, null, allowWhileIdle ? mIdleOptions : null); + if (alarm.repeatInterval == 0) { + // Keep the listener for repeating alarms until they get cancelled + mHandler.obtainMessage(AlarmHandler.UNREGISTER_CANCEL_LISTENER, + alarm.operation).sendToTarget(); + } } catch (PendingIntent.CanceledException e) { if (alarm.repeatInterval > 0) { // This IntentSender is no longer valid, but this diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 7a2aa7ede466..e81d1721b271 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.NETID_UNSET; +import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC; import static android.net.ConnectivityManager.TYPE_ETHERNET; import static android.net.ConnectivityManager.TYPE_NONE; import static android.net.ConnectivityManager.TYPE_VPN; @@ -3599,21 +3600,31 @@ public class ConnectivityService extends IConnectivityManager.Stub private void showNetworkNotification(NetworkAgentInfo nai, NotificationType type) { final String action; + final boolean highPriority; switch (type) { case LOGGED_IN: action = Settings.ACTION_WIFI_SETTINGS; mHandler.removeMessages(EVENT_TIMEOUT_NOTIFICATION); mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_TIMEOUT_NOTIFICATION, nai.network.netId, 0), TIMEOUT_NOTIFICATION_DELAY_MS); + // High priority because it is a direct result of the user logging in to a portal. + highPriority = true; break; case NO_INTERNET: action = ConnectivityManager.ACTION_PROMPT_UNVALIDATED; + // High priority because it is only displayed for explicitly selected networks. + highPriority = true; break; case LOST_INTERNET: action = ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION; + // High priority because it could help the user avoid unexpected data usage. + highPriority = true; break; case PARTIAL_CONNECTIVITY: action = ConnectivityManager.ACTION_PROMPT_PARTIAL_CONNECTIVITY; + // Don't bother the user with a high-priority notification if the network was not + // explicitly selected by the user. + highPriority = nai.networkMisc.explicitlySelected; break; default: Slog.wtf(TAG, "Unknown notification type " + type); @@ -3630,23 +3641,41 @@ public class ConnectivityService extends IConnectivityManager.Stub PendingIntent pendingIntent = PendingIntent.getActivityAsUser( mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT); - mNotifier.showNotification(nai.network.netId, type, nai, null, pendingIntent, true); + + mNotifier.showNotification(nai.network.netId, type, nai, null, pendingIntent, highPriority); + } + + private boolean shouldPromptUnvalidated(NetworkAgentInfo nai) { + // Don't prompt if the network is validated, and don't prompt on captive portals + // because we're already prompting the user to sign in. + if (nai.everValidated || nai.everCaptivePortalDetected) { + return false; + } + + // If a network has partial connectivity, always prompt unless the user has already accepted + // partial connectivity and selected don't ask again. This ensures that if the device + // automatically connects to a network that has partial Internet access, the user will + // always be able to use it, either because they've already chosen "don't ask again" or + // because we have prompt them. + if (nai.partialConnectivity && !nai.networkMisc.acceptPartialConnectivity) { + return true; + } + + // If a network has no Internet access, only prompt if the network was explicitly selected + // and if the user has not already told us to use the network regardless of whether it + // validated or not. + if (nai.networkMisc.explicitlySelected && !nai.networkMisc.acceptUnvalidated) { + return true; + } + + return false; } private void handlePromptUnvalidated(Network network) { if (VDBG || DDBG) log("handlePromptUnvalidated " + network); NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network); - // Only prompt if the network is unvalidated or network has partial internet connectivity - // and was explicitly selected by the user, and if we haven't already been told to switch - // to it regardless of whether it validated or not. Also don't prompt on captive portals - // because we're already prompting the user to sign in. - if (nai == null || nai.everValidated || nai.everCaptivePortalDetected - || !nai.networkMisc.explicitlySelected || nai.networkMisc.acceptUnvalidated - // TODO: Once the value of acceptPartialConnectivity is moved to IpMemoryStore, - // we should reevaluate how to handle acceptPartialConnectivity when network just - // connected. - || nai.networkMisc.acceptPartialConnectivity) { + if (nai == null || !shouldPromptUnvalidated(nai)) { return; } @@ -4355,7 +4384,7 @@ public class ConnectivityService extends IConnectivityManager.Stub /** * @return VPN information for accounting, or null if we can't retrieve all required - * information, e.g underlying ifaces. + * information, e.g primary underlying iface. */ @Nullable private VpnInfo createVpnInfo(Vpn vpn) { @@ -4367,24 +4396,17 @@ public class ConnectivityService extends IConnectivityManager.Stub // see VpnService.setUnderlyingNetworks()'s javadoc about how to interpret // the underlyingNetworks list. if (underlyingNetworks == null) { - NetworkAgentInfo defaultNai = getDefaultNetwork(); - if (defaultNai != null) { - underlyingNetworks = new Network[] { defaultNai.network }; - } - } - if (underlyingNetworks != null && underlyingNetworks.length > 0) { - List<String> interfaces = new ArrayList<>(); - for (Network network : underlyingNetworks) { - LinkProperties lp = getLinkProperties(network); - if (lp != null && !TextUtils.isEmpty(lp.getInterfaceName())) { - interfaces.add(lp.getInterfaceName()); - } + NetworkAgentInfo defaultNetwork = getDefaultNetwork(); + if (defaultNetwork != null && defaultNetwork.linkProperties != null) { + info.primaryUnderlyingIface = getDefaultNetwork().linkProperties.getInterfaceName(); } - if (!interfaces.isEmpty()) { - info.underlyingIfaces = interfaces.toArray(new String[interfaces.size()]); + } else if (underlyingNetworks.length > 0) { + LinkProperties linkProperties = getLinkProperties(underlyingNetworks[0]); + if (linkProperties != null) { + info.primaryUnderlyingIface = linkProperties.getInterfaceName(); } } - return info.underlyingIfaces == null ? null : info; + return info.primaryUnderlyingIface == null ? null : info; } /** @@ -6880,8 +6902,10 @@ public class ConnectivityService extends IConnectivityManager.Stub final int userId = UserHandle.getCallingUserId(); - final IpMemoryStore ipMemoryStore = IpMemoryStore.getMemoryStore(mContext); - ipMemoryStore.factoryReset(); + Binder.withCleanCallingIdentity(() -> { + final IpMemoryStore ipMemoryStore = IpMemoryStore.getMemoryStore(mContext); + ipMemoryStore.factoryReset(); + }); // Turn airplane mode off setAirplaneMode(false); @@ -6931,6 +6955,12 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + // restore private DNS settings to default mode (opportunistic) + if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_PRIVATE_DNS)) { + Settings.Global.putString(mContext.getContentResolver(), + Settings.Global.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OPPORTUNISTIC); + } + Settings.Global.putString(mContext.getContentResolver(), Settings.Global.NETWORK_AVOID_BAD_WIFI, null); } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 78f0603c5359..8a639c543366 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -2361,7 +2361,7 @@ public class LocationManagerService extends ILocationManager.Stub { mRealRequest, mReceiver.isListener(), mReceiver.isPendingIntent(), - /* radius= */ 0, + /* geofence= */ null, mActivityManager.getPackageImportance(packageName)); // remove from mRecordsByProvider @@ -2541,7 +2541,7 @@ public class LocationManagerService extends ILocationManager.Stub { LocationStatsEnums.USAGE_STARTED, LocationStatsEnums.API_REQUEST_LOCATION_UPDATES, packageName, request, listener != null, intent != null, - /* radius= */ 0, + /* geofence= */ null, mActivityManager.getPackageImportance(packageName)); Receiver receiver; @@ -2844,7 +2844,7 @@ public class LocationManagerService extends ILocationManager.Stub { request, /* hasListener= */ false, intent != null, - geofence.getRadius(), + geofence, mActivityManager.getPackageImportance(packageName)); } @@ -2876,7 +2876,7 @@ public class LocationManagerService extends ILocationManager.Stub { /* LocationRequest= */ null, /* hasListener= */ false, intent != null, - geofence.getRadius(), + geofence, mActivityManager.getPackageImportance(packageName)); } mGeofenceManager.removeFence(geofence, intent); @@ -2973,7 +2973,7 @@ public class LocationManagerService extends ILocationManager.Stub { /* LocationRequest= */ null, /* hasListener= */ true, /* hasIntent= */ false, - /* radius */ 0, + /* geofence= */ null, mActivityManager.getPackageImportance(packageName)); } if (isThrottlingExemptLocked(callerIdentity) @@ -3014,7 +3014,7 @@ public class LocationManagerService extends ILocationManager.Stub { /* LocationRequest= */ null, /* hasListener= */ true, /* hasIntent= */ false, - /* radius= */ 0, + /* geofence= */ null, mActivityManager.getPackageImportance( linkedListener.mCallerIdentity.mPackageName)); } diff --git a/services/core/java/com/android/server/LocationUsageLogger.java b/services/core/java/com/android/server/LocationUsageLogger.java index c5030351f69d..4ca74bf3aa91 100644 --- a/services/core/java/com/android/server/LocationUsageLogger.java +++ b/services/core/java/com/android/server/LocationUsageLogger.java @@ -17,6 +17,7 @@ package com.android.server; import android.app.ActivityManager; +import android.location.Geofence; import android.location.LocationManager; import android.location.LocationRequest; import android.os.SystemClock; @@ -180,13 +181,14 @@ class LocationUsageLogger { public void logLocationApiUsage(int usageType, int apiInUse, String packageName, LocationRequest locationRequest, boolean hasListener, boolean hasIntent, - float radius, int activityImportance) { + Geofence geofence, int activityImportance) { try { if (!checkApiUsageLogCap()) { return; } boolean isLocationRequestNull = locationRequest == null; + boolean isGeofenceNull = geofence == null; if (D) { Log.d(TAG, "log API Usage to statsd. usageType: " + usageType + ", apiInUse: " + apiInUse + ", packageName: " + (packageName == null ? "" : packageName) @@ -194,7 +196,8 @@ class LocationUsageLogger { + (isLocationRequestNull ? "" : locationRequest.toString()) + ", hasListener: " + hasListener + ", hasIntent: " + hasIntent - + ", radius: " + radius + + ", geofence: " + + (isGeofenceNull ? "" : geofence.toString()) + ", importance: " + activityImportance); } @@ -219,7 +222,9 @@ class LocationUsageLogger { ? LocationStatsEnums.EXPIRATION_UNKNOWN : getBucketizedExpireIn(locationRequest.getExpireAt()), getCallbackType(apiInUse, hasListener, hasIntent), - bucketizeRadiusToStatsdEnum(radius), + isGeofenceNull + ? LocationStatsEnums.RADIUS_UNKNOWN + : bucketizeRadiusToStatsdEnum(geofence.getRadius()), categorizeActivityImportance(activityImportance)); } catch (Exception e) { // Swallow exceptions to avoid crashing LMS. diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index d2b992bad462..deff7ef7d39a 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -580,6 +580,7 @@ class StorageManagerService extends IStorageManager.Stub private static final int H_RUN_IDLE_MAINT = 11; private static final int H_ABORT_IDLE_MAINT = 12; private static final int H_BOOT_COMPLETED = 13; + private static final int H_COMPLETE_UNLOCK_USER = 14; class StorageManagerServiceHandler extends Handler { public StorageManagerServiceHandler(Looper looper) { @@ -698,7 +699,10 @@ class StorageManagerService extends IStorageManager.Stub abortIdleMaint((Runnable)msg.obj); break; } - + case H_COMPLETE_UNLOCK_USER: { + completeUnlockUser((int) msg.obj); + break; + } } } } @@ -978,6 +982,17 @@ class StorageManagerService extends IStorageManager.Stub Slog.wtf(TAG, e); } + mHandler.obtainMessage(H_COMPLETE_UNLOCK_USER, userId).sendToTarget(); + } + + private void completeUnlockUser(int userId) { + // If user 0 has completed unlock, perform a one-time migration of legacy obb data + // to its new location. This may take time depending on the size of the data to be copied + // so it's done on the StorageManager handler thread. + if (userId == 0) { + mPmInternal.migrateLegacyObbData(); + } + // Record user as started so newly mounted volumes kick off events // correctly, then synthesize events for any already-mounted volumes. synchronized (mLock) { @@ -2820,6 +2835,12 @@ class StorageManagerService extends IStorageManager.Stub } } + private boolean isSystemUnlocked(int userId) { + synchronized (mLock) { + return ArrayUtils.contains(mSystemUnlockedUsers, userId); + } + } + @Override public void prepareUserStorage(String volumeUuid, int userId, int serialNumber, int flags) { enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); @@ -2996,6 +3017,11 @@ class StorageManagerService extends IStorageManager.Stub final boolean realState = (flags & StorageManager.FLAG_REAL_STATE) != 0; final boolean includeInvisible = (flags & StorageManager.FLAG_INCLUDE_INVISIBLE) != 0; + // Report all volumes as unmounted until we've recorded that user 0 has unlocked. There + // are no guarantees that callers will see a consistent view of the volume before that + // point + final boolean systemUserUnlocked = isSystemUnlocked(UserHandle.USER_SYSTEM); + final boolean userKeyUnlocked; final boolean storagePermission; final long token = Binder.clearCallingIdentity(); @@ -3031,7 +3057,9 @@ class StorageManagerService extends IStorageManager.Stub if (!match) continue; boolean reportUnmounted = false; - if ((vol.getType() == VolumeInfo.TYPE_EMULATED) && !userKeyUnlocked) { + if (!systemUserUnlocked) { + reportUnmounted = true; + } else if ((vol.getType() == VolumeInfo.TYPE_EMULATED) && !userKeyUnlocked) { reportUnmounted = true; } else if (!storagePermission && !realState) { reportUnmounted = true; diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 7a947f192263..6eb9f0c7a6bc 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -116,6 +116,7 @@ public class VibratorService extends IVibratorService.Stub private final LinkedList<VibrationInfo> mPreviousRingVibrations; private final LinkedList<VibrationInfo> mPreviousNotificationVibrations; private final LinkedList<VibrationInfo> mPreviousAlarmVibrations; + private final LinkedList<ExternalVibration> mPreviousExternalVibrations; private final LinkedList<VibrationInfo> mPreviousVibrations; private final int mPreviousVibrationsLimit; private final boolean mAllowPriorityVibrationsInLowPowerMode; @@ -368,6 +369,7 @@ public class VibratorService extends IVibratorService.Stub mPreviousNotificationVibrations = new LinkedList<>(); mPreviousAlarmVibrations = new LinkedList<>(); mPreviousVibrations = new LinkedList<>(); + mPreviousExternalVibrations = new LinkedList<>(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); @@ -618,7 +620,6 @@ public class VibratorService extends IVibratorService.Stub linkVibration(vib); long ident = Binder.clearCallingIdentity(); try { - doCancelVibrateLocked(); startVibrationLocked(vib); addToPreviousVibrationsLocked(vib); @@ -1418,6 +1419,12 @@ public class VibratorService extends IVibratorService.Stub pw.print(" "); pw.println(info.toString()); } + + pw.println(" Previous external vibrations:"); + for (ExternalVibration vib : mPreviousExternalVibrations) { + pw.print(" "); + pw.println(vib.toString()); + } } } @@ -1429,6 +1436,8 @@ public class VibratorService extends IVibratorService.Stub } final class ExternalVibratorService extends IExternalVibratorService.Stub { + ExternalVibrationDeathRecipient mCurrentExternalDeathRecipient; + @Override public int onExternalVibrationStart(ExternalVibration vib) { if (!mSupportsExternalControl) { @@ -1462,6 +1471,12 @@ public class VibratorService extends IVibratorService.Stub // Note that this doesn't support multiple concurrent external controls, as we // would need to mute the old one still if it came from a different controller. mCurrentExternalVibration = vib; + mCurrentExternalDeathRecipient = new ExternalVibrationDeathRecipient(); + mCurrentExternalVibration.linkToDeath(mCurrentExternalDeathRecipient); + if (mPreviousExternalVibrations.size() > mPreviousVibrationsLimit) { + mPreviousExternalVibrations.removeFirst(); + } + mPreviousExternalVibrations.addLast(vib); if (DEBUG) { Slog.e(TAG, "Playing external vibration: " + vib); } @@ -1502,6 +1517,8 @@ public class VibratorService extends IVibratorService.Stub public void onExternalVibrationStop(ExternalVibration vib) { synchronized (mLock) { if (vib.equals(mCurrentExternalVibration)) { + mCurrentExternalVibration.unlinkToDeath(mCurrentExternalDeathRecipient); + mCurrentExternalDeathRecipient = null; mCurrentExternalVibration = null; setVibratorUnderExternalControl(false); if (DEBUG) { @@ -1510,6 +1527,14 @@ public class VibratorService extends IVibratorService.Stub } } } + + private class ExternalVibrationDeathRecipient implements IBinder.DeathRecipient { + public void binderDied() { + synchronized (mLock) { + onExternalVibrationStop(mCurrentExternalVibration); + } + } + } } private final class VibratorShellCommand extends ShellCommand { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c5fc5c89cce1..627ca911f9b9 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -547,6 +547,7 @@ public class ActivityManagerService extends IActivityManager.Stub private static final int MAX_BUGREPORT_TITLE_SIZE = 50; private static final int NATIVE_DUMP_TIMEOUT_MS = 2000; // 2 seconds; + private static final int JAVA_DUMP_MINIMUM_SIZE = 100; // 100 bytes. OomAdjuster mOomAdjuster; final LowMemDetector mLowMemDetector; @@ -3805,9 +3806,28 @@ public class ActivityManagerService extends IActivityManager.Stub */ private static long dumpJavaTracesTombstoned(int pid, String fileName, long timeoutMs) { final long timeStart = SystemClock.elapsedRealtime(); - if (!Debug.dumpJavaBacktraceToFileTimeout(pid, fileName, (int) (timeoutMs / 1000))) { - Debug.dumpNativeBacktraceToFileTimeout(pid, fileName, - (NATIVE_DUMP_TIMEOUT_MS / 1000)); + boolean javaSuccess = Debug.dumpJavaBacktraceToFileTimeout(pid, fileName, + (int) (timeoutMs / 1000)); + if (javaSuccess) { + // Check that something is in the file, actually. Try-catch should not be necessary, + // but better safe than sorry. + try { + long size = new File(fileName).length(); + if (size < JAVA_DUMP_MINIMUM_SIZE) { + Slog.w(TAG, "Successfully created Java ANR file is empty!"); + javaSuccess = false; + } + } catch (Exception e) { + Slog.w(TAG, "Unable to get ANR file size", e); + javaSuccess = false; + } + } + if (!javaSuccess) { + Slog.w(TAG, "Dumping Java threads failed, initiating native stack dump."); + if (!Debug.dumpNativeBacktraceToFileTimeout(pid, fileName, + (NATIVE_DUMP_TIMEOUT_MS / 1000))) { + Slog.w(TAG, "Native stack dump failed!"); + } } return SystemClock.elapsedRealtime() - timeStart; @@ -5375,34 +5395,13 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void registerIntentSenderCancelListener(IIntentSender sender, IResultReceiver receiver) { - if (!(sender instanceof PendingIntentRecord)) { - return; - } - boolean isCancelled; - synchronized(this) { - PendingIntentRecord pendingIntent = (PendingIntentRecord) sender; - isCancelled = pendingIntent.canceled; - if (!isCancelled) { - pendingIntent.registerCancelListenerLocked(receiver); - } - } - if (isCancelled) { - try { - receiver.send(Activity.RESULT_CANCELED, null); - } catch (RemoteException e) { - } - } + mPendingIntentController.registerIntentSenderCancelListener(sender, receiver); } @Override public void unregisterIntentSenderCancelListener(IIntentSender sender, IResultReceiver receiver) { - if (!(sender instanceof PendingIntentRecord)) { - return; - } - synchronized(this) { - ((PendingIntentRecord)sender).unregisterCancelListenerLocked(receiver); - } + mPendingIntentController.unregisterIntentSenderCancelListener(sender, receiver); } @Override @@ -7300,6 +7299,13 @@ public class ActivityManagerService extends IActivityManager.Stub if (wasInLaunchingProviders) { mHandler.removeMessages(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG, r); } + // Make sure the package is associated with the process. + // XXX We shouldn't need to do this, since we have added the package + // when we generated the providers in generateApplicationProvidersLocked(). + // But for some reason in some cases we get here with the package no longer + // added... for now just patch it in to make things happy. + r.addPackage(dst.info.applicationInfo.packageName, + dst.info.applicationInfo.longVersionCode, mProcessStats); synchronized (dst) { dst.provider = src.provider; dst.setProcess(r); @@ -17679,13 +17685,8 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration) { - if (!(target instanceof PendingIntentRecord)) { - Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target); - return; - } - synchronized (ActivityManagerService.this) { - ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration); - } + mPendingIntentController.setPendingIntentWhitelistDuration(target, whitelistToken, + duration); } @Override diff --git a/services/core/java/com/android/server/am/BroadcastDispatcher.java b/services/core/java/com/android/server/am/BroadcastDispatcher.java index d029482ac528..f8a3d1eefd50 100644 --- a/services/core/java/com/android/server/am/BroadcastDispatcher.java +++ b/services/core/java/com/android/server/am/BroadcastDispatcher.java @@ -725,6 +725,14 @@ public class BroadcastDispatcher { final Dumper dumper = new Dumper(pw, queueName, dumpPackage, sdf); boolean printed = false; + dumper.setHeading("Currently in flight"); + dumper.setLabel("In-Flight Ordered Broadcast"); + if (mCurrentBroadcast != null) { + dumper.dump(mCurrentBroadcast); + } else { + pw.println(" (null)"); + } + dumper.setHeading("Active ordered broadcasts"); dumper.setLabel("Active Ordered Broadcast"); for (Deferrals d : mAlarmBroadcasts) { diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index b053d84de7d6..aa8bc04f0f7c 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -76,6 +76,8 @@ final class CoreSettingsObserver extends ContentObserver { sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_ALL_APPS, int.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_OPT_IN_APPS, String.class); + sGlobalSettingToTypeMap.put( + Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_OPT_OUT_APPS, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_BLACKLIST, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_WHITELIST, String.class); diff --git a/services/core/java/com/android/server/am/PendingIntentController.java b/services/core/java/com/android/server/am/PendingIntentController.java index a5d47386afb5..d75591cc7432 100644 --- a/services/core/java/com/android/server/am/PendingIntentController.java +++ b/services/core/java/com/android/server/am/PendingIntentController.java @@ -17,6 +17,7 @@ package com.android.server.am; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; + import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; @@ -39,6 +40,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Slog; + import com.android.internal.os.IResultReceiver; import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.LocalServices; @@ -242,6 +244,47 @@ public class PendingIntentController { } } + void registerIntentSenderCancelListener(IIntentSender sender, IResultReceiver receiver) { + if (!(sender instanceof PendingIntentRecord)) { + return; + } + boolean isCancelled; + synchronized (mLock) { + PendingIntentRecord pendingIntent = (PendingIntentRecord) sender; + isCancelled = pendingIntent.canceled; + if (!isCancelled) { + pendingIntent.registerCancelListenerLocked(receiver); + } + } + if (isCancelled) { + try { + receiver.send(Activity.RESULT_CANCELED, null); + } catch (RemoteException e) { + } + } + } + + void unregisterIntentSenderCancelListener(IIntentSender sender, + IResultReceiver receiver) { + if (!(sender instanceof PendingIntentRecord)) { + return; + } + synchronized (mLock) { + ((PendingIntentRecord) sender).unregisterCancelListenerLocked(receiver); + } + } + + void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, + long duration) { + if (!(target instanceof PendingIntentRecord)) { + Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target); + return; + } + synchronized (mLock) { + ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration); + } + } + private void makeIntentSenderCanceled(PendingIntentRecord rec) { rec.canceled = true; final RemoteCallbackList<IResultReceiver> callbacks = rec.detachCancelListenersLocked(); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 943fe75b425a..d64a2c210f27 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -63,7 +63,6 @@ import android.os.AppZygote; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.GraphicsEnvironment; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -705,16 +704,6 @@ public final class ProcessList { return prefix + "+" + Integer.toString(diff); } - private static boolean shouldUseSystemGraphicsDriver(Context context, Bundle coreSettings, - ApplicationInfo applicationInfo) { - final boolean shouldUseGameDriver = - GraphicsEnvironment.shouldUseGameDriver(context, coreSettings, applicationInfo); - final boolean shouldUseAngle = - GraphicsEnvironment.shouldUseAngle(context, coreSettings, - applicationInfo.packageName); - return !shouldUseGameDriver && !shouldUseAngle; - } - public static String makeOomAdjString(int setAdj, boolean compact) { if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { return buildOomTag("cch", "cch", " ", setAdj, @@ -1811,8 +1800,6 @@ public final class ProcessList { String seInfo, String requiredAbi, String instructionSet, String invokeWith, long startTime) { try { - final boolean useSystemGraphicsDriver = shouldUseSystemGraphicsDriver(mService.mContext, - mService.mCoreSettingsObserver.getCoreSettingsLocked(), app.info); Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " + app.processName); checkSlow(startTime, "startProcess: asking zygote to start proc"); @@ -1822,7 +1809,6 @@ public final class ProcessList { app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, null, app.info.packageName, - useSystemGraphicsDriver, new String[] {PROC_START_SEQ_IDENT + app.startSeq}); } else if (hostingRecord.usesAppZygote()) { final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app); @@ -1831,14 +1817,13 @@ public final class ProcessList { app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, null, app.info.packageName, - /*useUsapPool=*/ false, useSystemGraphicsDriver, + /*useUsapPool=*/ false, new String[] {PROC_START_SEQ_IDENT + app.startSeq}); } else { startResult = Process.start(entryPoint, app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, invokeWith, app.info.packageName, - useSystemGraphicsDriver, new String[] {PROC_START_SEQ_IDENT + app.startSeq}); } checkSlow(startTime, "startProcess: returned from zygote!"); diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 2399d0525cc4..b311233694ce 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -559,7 +559,7 @@ class UserController implements Handler.Callback { // Spin up app widgets prior to boot-complete, so they can be ready promptly mInjector.startUserWidgets(userId); - Slog.i(TAG, "Sending BOOT_COMPLETE user #" + userId); + Slog.i(TAG, "Posting BOOT_COMPLETED user #" + userId); // Do not report secondary users, runtime restarts or first boot/upgrade if (userId == UserHandle.USER_SYSTEM && !mInjector.isRuntimeRestarted() && !mInjector.isFirstBootOrUpgrade()) { @@ -572,18 +572,26 @@ class UserController implements Handler.Callback { bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND | Intent.FLAG_RECEIVER_OFFLOAD); - mInjector.broadcastIntent(bootIntent, null, new IIntentReceiver.Stub() { - @Override - public void performReceive(Intent intent, int resultCode, String data, - Bundle extras, boolean ordered, boolean sticky, int sendingUser) - throws RemoteException { - Slog.i(UserController.TAG, "Finished processing BOOT_COMPLETED for u" + userId); - mBootCompleted = true; - } - }, 0, null, null, - new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED}, - AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, - Binder.getCallingUid(), Binder.getCallingPid(), userId); + // Widget broadcasts are outbound via FgThread, so to guarantee sequencing + // we also send the boot_completed broadcast from that thread. + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + FgThread.getHandler().post(() -> { + mInjector.broadcastIntent(bootIntent, null, + new IIntentReceiver.Stub() { + @Override + public void performReceive(Intent intent, int resultCode, String data, + Bundle extras, boolean ordered, boolean sticky, int sendingUser) + throws RemoteException { + Slog.i(UserController.TAG, "Finished processing BOOT_COMPLETED for u" + + userId); + mBootCompleted = true; + } + }, 0, null, null, + new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED}, + AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, + callingUid, callingPid, userId); + }); } int restartUser(final int userId, final boolean foreground) { diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 0a7684553c08..7569363a7134 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -201,7 +201,7 @@ public class AppOpsService extends IAppOpsService.Stub { @VisibleForTesting final SparseArray<UidState> mUidStates = new SparseArray<>(); - private final HistoricalRegistry mHistoricalRegistry = new HistoricalRegistry(this); + final HistoricalRegistry mHistoricalRegistry = new HistoricalRegistry(this); long mLastRealtime; diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java index 69a1c9f584cb..9cf342c0e4fb 100644 --- a/services/core/java/com/android/server/appop/HistoricalRegistry.java +++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java @@ -108,6 +108,12 @@ import java.util.concurrent.TimeUnit; * must be called with the mInMemoryLock, xxxDMLocked suffix means the method * must be called with the mOnDiskLock and mInMemoryLock locks acquired in that * exact order. + * <p> + * INITIALIZATION: We can initialize persistence only after the system is ready + * as we need to check the optional configuration override from the settings + * database which is not initialized at the time the app ops service is created. + * This means that all entry points that touch persistence should be short + * circuited via isPersistenceInitialized() check. */ // TODO (bug:122218838): Make sure we handle start of epoch time // TODO (bug:122218838): Validate changed time is handled correctly @@ -177,14 +183,33 @@ final class HistoricalRegistry { // Object managing persistence (read/write) @GuardedBy("mOnDiskLock") - private Persistence mPersistence = new Persistence(mBaseSnapshotInterval, - mIntervalCompressionMultiplier); + private Persistence mPersistence; HistoricalRegistry(@NonNull Object lock) { mInMemoryLock = lock; - if (mMode != AppOpsManager.HISTORICAL_MODE_DISABLED) { - synchronized (mOnDiskLock) { - synchronized (mInMemoryLock) { + } + + void systemReady(@NonNull ContentResolver resolver) { + final Uri uri = Settings.Global.getUriFor(Settings.Global.APPOP_HISTORY_PARAMETERS); + resolver.registerContentObserver(uri, false, new ContentObserver( + FgThread.getHandler()) { + @Override + public void onChange(boolean selfChange) { + updateParametersFromSetting(resolver); + } + }); + + updateParametersFromSetting(resolver); + + synchronized (mOnDiskLock) { + synchronized (mInMemoryLock) { + if (mMode != AppOpsManager.HISTORICAL_MODE_DISABLED) { + // Can be uninitialized if there is no config in the settings table. + if (!isPersistenceInitializedMLocked()) { + mPersistence = new Persistence(mBaseSnapshotInterval, + mIntervalCompressionMultiplier); + } + // When starting always adjust history to now. final long lastPersistTimeMills = mPersistence.getLastPersistTimeMillisDLocked(); @@ -197,16 +222,8 @@ final class HistoricalRegistry { } } - void systemReady(@NonNull ContentResolver resolver) { - updateParametersFromSetting(resolver); - final Uri uri = Settings.Global.getUriFor(Settings.Global.APPOP_HISTORY_PARAMETERS); - resolver.registerContentObserver(uri, false, new ContentObserver( - FgThread.getHandler()) { - @Override - public void onChange(boolean selfChange) { - updateParametersFromSetting(resolver); - } - }); + private boolean isPersistenceInitializedMLocked() { + return mPersistence != null; } private void updateParametersFromSetting(@NonNull ContentResolver resolver) { @@ -274,6 +291,11 @@ final class HistoricalRegistry { makeRelativeToEpochStart(currentOps, nowMillis); currentOps.accept(visitor); + if(isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } + final List<HistoricalOps> ops = mPersistence.readHistoryDLocked(); if (ops != null) { // TODO (bug:122218838): Make sure this is properly dumped @@ -302,12 +324,21 @@ final class HistoricalRegistry { void getHistoricalOpsFromDiskRaw(int uid, @NonNull String packageName, @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis, @OpFlags int flags, @NonNull RemoteCallback callback) { - final HistoricalOps result = new HistoricalOps(beginTimeMillis, endTimeMillis); - mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames, - beginTimeMillis, endTimeMillis, flags); - final Bundle payload = new Bundle(); - payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, result); - callback.sendResult(payload); + synchronized (mOnDiskLock) { + synchronized (mInMemoryLock) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + callback.sendResult(new Bundle()); + return; + } + final HistoricalOps result = new HistoricalOps(beginTimeMillis, endTimeMillis); + mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames, + beginTimeMillis, endTimeMillis, flags); + final Bundle payload = new Bundle(); + payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, result); + callback.sendResult(payload); + } + } } void getHistoricalOps(int uid, @NonNull String packageName, @@ -331,6 +362,12 @@ final class HistoricalRegistry { boolean collectOpsFromDisk; synchronized (mInMemoryLock) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + callback.sendResult(new Bundle()); + return; + } + currentOps = getUpdatedPendingHistoricalOpsMLocked(currentTimeMillis); if (!(inMemoryAdjBeginTimeMillis >= currentOps.getEndTimeMillis() || inMemoryAdjEndTimeMillis <= currentOps.getBeginTimeMillis())) { @@ -374,6 +411,10 @@ final class HistoricalRegistry { @UidState int uidState, @OpFlags int flags) { synchronized (mInMemoryLock) { if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis()) .increaseAccessCount(op, uid, packageName, uidState, flags, 1); } @@ -384,6 +425,10 @@ final class HistoricalRegistry { @UidState int uidState, @OpFlags int flags) { synchronized (mInMemoryLock) { if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis()) .increaseRejectCount(op, uid, packageName, uidState, flags, 1); } @@ -394,6 +439,10 @@ final class HistoricalRegistry { @UidState int uidState, @OpFlags int flags, long increment) { synchronized (mInMemoryLock) { if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis()) .increaseAccessDuration(op, uid, packageName, uidState, flags, increment); } @@ -404,6 +453,8 @@ final class HistoricalRegistry { long baseSnapshotInterval, long intervalCompressionMultiplier) { synchronized (mOnDiskLock) { synchronized (mInMemoryLock) { + // NOTE: We allow this call if persistence is not initialized as + // it is a part of the persistence initialization process. boolean resampleHistory = false; Slog.i(LOG_TAG, "New history parameters: mode:" + AppOpsManager.historicalModeToString(mMode) + " baseSnapshotInterval:" @@ -412,7 +463,7 @@ final class HistoricalRegistry { if (mMode != mode) { mMode = mode; if (mMode == AppOpsManager.HISTORICAL_MODE_DISABLED) { - clearHistoryOnDiskLocked(); + clearHistoryOnDiskDLocked(); } } if (mBaseSnapshotInterval != baseSnapshotInterval) { @@ -433,6 +484,10 @@ final class HistoricalRegistry { void offsetHistory(long offsetMillis) { synchronized (mOnDiskLock) { synchronized (mInMemoryLock) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } final List<HistoricalOps> history = mPersistence.readHistoryDLocked(); clearHistory(); if (history != null) { @@ -453,6 +508,10 @@ final class HistoricalRegistry { void addHistoricalOps(HistoricalOps ops) { final List<HistoricalOps> pendingWrites; synchronized (mInMemoryLock) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } // The history files start from mBaseSnapshotInterval - take this into account. ops.offsetBeginAndEndTime(mBaseSnapshotInterval); mPendingWrites.offerFirst(ops); @@ -468,6 +527,10 @@ final class HistoricalRegistry { } void resetHistoryParameters() { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } setHistoryParameters(DEFAULT_MODE, DEFAULT_SNAPSHOT_INTERVAL_MILLIS, DEFAULT_COMPRESSION_STEP); } @@ -475,6 +538,10 @@ final class HistoricalRegistry { void clearHistory(int uid, String packageName) { synchronized (mOnDiskLock) { synchronized (mInMemoryLock) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } if (mMode != AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { return; } @@ -493,18 +560,24 @@ final class HistoricalRegistry { void clearHistory() { synchronized (mOnDiskLock) { - clearHistoryOnDiskLocked(); + synchronized (mInMemoryLock) { + if (!isPersistenceInitializedMLocked()) { + Slog.e(LOG_TAG, "Interaction before persistence initialized"); + return; + } + clearHistoryOnDiskDLocked(); + } } } - private void clearHistoryOnDiskLocked() { + private void clearHistoryOnDiskDLocked() { BackgroundThread.getHandler().removeMessages(MSG_WRITE_PENDING_HISTORY); synchronized (mInMemoryLock) { mCurrentHistoricalOps = null; mNextPersistDueTimeMillis = System.currentTimeMillis(); mPendingWrites.clear(); } - mPersistence.clearHistoryDLocked(); + Persistence.clearHistoryDLocked(); } private @NonNull HistoricalOps getUpdatedPendingHistoricalOpsMLocked(long now) { @@ -639,7 +712,7 @@ final class HistoricalRegistry { mIntervalCompressionMultiplier = intervalCompressionMultiplier; } - private final AtomicDirectory mHistoricalAppOpsDir = new AtomicDirectory( + private static final AtomicDirectory sHistoricalAppOpsDir = new AtomicDirectory( new File(new File(Environment.getDataSystemDirectory(), "appops"), "history")); private File generateFile(@NonNull File baseDir, int depth) { @@ -663,8 +736,8 @@ final class HistoricalRegistry { persistHistoricalOpsDLocked(historicalOps); } - void clearHistoryDLocked() { - mHistoricalAppOpsDir.delete(); + static void clearHistoryDLocked() { + sHistoricalAppOpsDir.delete(); } void persistHistoricalOpsDLocked(@NonNull List<HistoricalOps> ops) { @@ -673,8 +746,8 @@ final class HistoricalRegistry { enforceOpsWellFormed(ops); } try { - final File newBaseDir = mHistoricalAppOpsDir.startWrite(); - final File oldBaseDir = mHistoricalAppOpsDir.getBackupDirectory(); + final File newBaseDir = sHistoricalAppOpsDir.startWrite(); + final File oldBaseDir = sHistoricalAppOpsDir.getBackupDirectory(); final HistoricalFilesInvariant filesInvariant; if (DEBUG) { filesInvariant = new HistoricalFilesInvariant(); @@ -686,10 +759,10 @@ final class HistoricalRegistry { if (DEBUG) { filesInvariant.stopTracking(newBaseDir); } - mHistoricalAppOpsDir.finishWrite(); + sHistoricalAppOpsDir.finishWrite(); } catch (Throwable t) { wtf("Failed to write historical app ops, restoring backup", t, null); - mHistoricalAppOpsDir.failWrite(); + sHistoricalAppOpsDir.failWrite(); } } @@ -715,22 +788,36 @@ final class HistoricalRegistry { long getLastPersistTimeMillisDLocked() { File baseDir = null; try { - baseDir = mHistoricalAppOpsDir.startRead(); + baseDir = sHistoricalAppOpsDir.startRead(); final File[] files = baseDir.listFiles(); if (files != null && files.length > 0) { - final Set<File> historyFiles = new ArraySet<>(); - Collections.addAll(historyFiles, files); - for (int i = 0;; i++) { - final File file = generateFile(baseDir, i); - if (historyFiles.contains(file)) { - return file.lastModified(); + File shortestFile = null; + for (File candidate : files) { + final String candidateName = candidate.getName(); + if (!candidateName.endsWith(HISTORY_FILE_SUFFIX)) { + continue; + } + if (shortestFile == null) { + shortestFile = candidate; + } else if (candidateName.length() < shortestFile.getName().length()) { + shortestFile = candidate; } } + if (shortestFile == null) { + return 0; + } + final String shortestNameNoExtension = shortestFile.getName() + .replace(HISTORY_FILE_SUFFIX, ""); + try { + return Long.parseLong(shortestNameNoExtension); + } catch (NumberFormatException e) { + return 0; + } } - mHistoricalAppOpsDir.finishRead(); + sHistoricalAppOpsDir.finishRead(); } catch (Throwable e) { wtf("Error reading historical app ops. Deleting history.", e, baseDir); - mHistoricalAppOpsDir.delete(); + sHistoricalAppOpsDir.delete(); } return 0; } @@ -755,7 +842,7 @@ final class HistoricalRegistry { long filterBeginTimeMillis, long filterEndTimeMillis, @OpFlags int filterFlags) { File baseDir = null; try { - baseDir = mHistoricalAppOpsDir.startRead(); + baseDir = sHistoricalAppOpsDir.startRead(); final HistoricalFilesInvariant filesInvariant; if (DEBUG) { filesInvariant = new HistoricalFilesInvariant(); @@ -770,11 +857,11 @@ final class HistoricalRegistry { if (DEBUG) { filesInvariant.stopTracking(baseDir); } - mHistoricalAppOpsDir.finishRead(); + sHistoricalAppOpsDir.finishRead(); return ops; } catch (Throwable t) { wtf("Error reading historical app ops. Deleting history.", t, baseDir); - mHistoricalAppOpsDir.delete(); + sHistoricalAppOpsDir.delete(); } return null; } @@ -1241,7 +1328,7 @@ final class HistoricalRegistry { private void writeHistoricalOpsDLocked(@Nullable List<HistoricalOps> allOps, long intervalOverflowMillis, @NonNull File file) throws IOException { - final FileOutputStream output = mHistoricalAppOpsDir.openWrite(file); + final FileOutputStream output = sHistoricalAppOpsDir.openWrite(file); try { final XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(output, StandardCharsets.UTF_8.name()); @@ -1263,9 +1350,9 @@ final class HistoricalRegistry { } serializer.endTag(null, TAG_HISTORY); serializer.endDocument(); - mHistoricalAppOpsDir.closeWrite(output); + sHistoricalAppOpsDir.closeWrite(output); } catch (IOException e) { - mHistoricalAppOpsDir.failWrite(output); + sHistoricalAppOpsDir.failWrite(output); throw e; } } diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java index 3b19d0875f5f..1b45eb4f00bb 100644 --- a/services/core/java/com/android/server/attention/AttentionManagerService.java +++ b/services/core/java/com/android/server/attention/AttentionManagerService.java @@ -190,9 +190,7 @@ public class AttentionManagerService extends SystemService { final UserState userState = getOrCreateCurrentUserStateLocked(); // lazily start the service, which should be very lightweight to start - if (!userState.bindLocked()) { - return false; - } + userState.bindLocked(); // throttle frequent requests final AttentionCheckCache cache = userState.mAttentionCheckCache; @@ -310,7 +308,7 @@ public class AttentionManagerService extends SystemService { protected UserState getOrCreateUserStateLocked(int userId) { UserState result = mUserStates.get(userId); if (result == null) { - result = new UserState(userId, mContext, mLock, mComponentName); + result = new UserState(userId, mContext, mLock, mAttentionHandler, mComponentName); mUserStates.put(userId, result); } return result; @@ -456,31 +454,33 @@ public class AttentionManagerService extends SystemService { @VisibleForTesting protected static class UserState { - final ComponentName mComponentName; - final AttentionServiceConnection mConnection = new AttentionServiceConnection(); + private final ComponentName mComponentName; + private final AttentionServiceConnection mConnection = new AttentionServiceConnection(); @GuardedBy("mLock") IAttentionService mService; @GuardedBy("mLock") - boolean mBinding; - @GuardedBy("mLock") AttentionCheck mCurrentAttentionCheck; @GuardedBy("mLock") AttentionCheckCache mAttentionCheckCache; + @GuardedBy("mLock") + private boolean mBinding; @UserIdInt - final int mUserId; - final Context mContext; - final Object mLock; + private final int mUserId; + private final Context mContext; + private final Object mLock; + private final Handler mAttentionHandler; - UserState(int userId, Context context, Object lock, ComponentName componentName) { + UserState(int userId, Context context, Object lock, Handler handler, + ComponentName componentName) { mUserId = userId; mContext = Preconditions.checkNotNull(context); mLock = Preconditions.checkNotNull(lock); mComponentName = Preconditions.checkNotNull(componentName); + mAttentionHandler = handler; } - @GuardedBy("mLock") private void handlePendingCallbackLocked() { if (!mCurrentAttentionCheck.mIsDispatched) { @@ -499,26 +499,25 @@ public class AttentionManagerService extends SystemService { /** Binds to the system's AttentionService which provides an actual implementation. */ @GuardedBy("mLock") - private boolean bindLocked() { + private void bindLocked() { // No need to bind if service is binding or has already been bound. if (mBinding || mService != null) { - return true; + return; } - final boolean willBind; - final long identity = Binder.clearCallingIdentity(); - - try { - final Intent mServiceIntent = new Intent( + mBinding = true; + // mContext.bindServiceAsUser() calls into ActivityManagerService which it may already + // hold the lock and had called into PowerManagerService, which holds a lock. + // That would create a deadlock. To solve that, putting it on a handler. + mAttentionHandler.post(() -> { + final Intent serviceIntent = new Intent( AttentionService.SERVICE_INTERFACE).setComponent( mComponentName); - willBind = mContext.bindServiceAsUser(mServiceIntent, mConnection, + // Note: no reason to clear the calling identity, we won't have one in a handler. + mContext.bindServiceAsUser(serviceIntent, mConnection, Context.BIND_AUTO_CREATE, UserHandle.CURRENT); - mBinding = willBind; - } finally { - Binder.restoreCallingIdentity(identity); - } - return willBind; + + }); } private void dump(IndentingPrintWriter pw) { @@ -587,6 +586,7 @@ public class AttentionManagerService extends SystemService { super(Looper.myLooper()); } + @Override public void handleMessage(Message msg) { switch (msg.what) { // Do not occupy resources when not in use - unbind proactively. @@ -651,7 +651,12 @@ public class AttentionManagerService extends SystemService { return; } - mContext.unbindService(userState.mConnection); + mAttentionHandler.post(() -> mContext.unbindService(userState.mConnection)); + // Note: this will set mBinding to false even though it could still be trying to bind + // (i.e. the runnable was posted in bindLocked but then cancelAndUnbindLocked was + // called before it's run yet). This is a safe state at the moment, + // since it will eventually, but feels like a source for confusion down the road and + // may cause some expensive and unnecessary work to be done. userState.mConnection.cleanupService(); mUserStates.remove(userState.mUserId); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index e43c548eb66a..5ae51138f721 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1016,6 +1016,7 @@ public class AudioService extends IAudioService.Stub sendEncodedSurroundMode(mContentResolver, "onAudioServerDied"); sendEnabledSurroundFormats(mContentResolver, true); updateAssistantUId(true); + updateRttEanbled(mContentResolver); } synchronized (mAccessibilityServiceUidsLock) { AudioSystem.setA11yServicesUids(mAccessibilityServiceUids); @@ -1480,6 +1481,12 @@ public class AudioService extends IAudioService.Stub } } + private void updateRttEanbled(ContentResolver cr) { + final boolean rttEnabled = Settings.Secure.getIntForUser(cr, + Settings.Secure.RTT_CALLING_MODE, 0, UserHandle.USER_CURRENT) != 0; + AudioSystem.setRttEnabled(rttEnabled); + } + private void readPersistedSettings() { final ContentResolver cr = mContentResolver; @@ -1524,6 +1531,7 @@ public class AudioService extends IAudioService.Stub sendEncodedSurroundMode(cr, "readPersistedSettings"); sendEnabledSurroundFormats(cr, true); updateAssistantUId(true); + updateRttEanbled(cr); } mMuteAffectedStreams = System.getIntForUser(cr, @@ -5502,6 +5510,8 @@ public class AudioService extends IAudioService.Stub mContentResolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.VOICE_INTERACTION_SERVICE), false, this); + mContentResolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.RTT_CALLING_MODE), false, this); } @Override @@ -5525,6 +5535,7 @@ public class AudioService extends IAudioService.Stub updateEncodedSurroundOutput(); sendEnabledSurroundFormats(mContentResolver, mSurroundModeChanged); updateAssistantUId(false); + updateRttEanbled(mContentResolver); } } diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java index 421b3f5ae106..942e0501d88d 100644 --- a/services/core/java/com/android/server/biometrics/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java @@ -42,12 +42,7 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinder.D private static final AudioAttributes FINGERPRINT_SONFICATION_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - // Temporary fix for b/123870990. No time in this release to - // introduce a new vibration type, but we need to distinguish these vibrations - // from other haptic feedback vibrations. Fortunately, Alarm vibrations have - // exactly the same behavior as we need - // TODO: refactor within the scope of b/132170758 - .setUsage(AudioAttributes.USAGE_ALARM) + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) .build(); private final Context mContext; diff --git a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java index f6735d983466..077c4057a3a0 100644 --- a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java +++ b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java @@ -232,6 +232,11 @@ public class NetworkNotificationManager { title = r.getString(R.string.network_switch_metered, toTransport); details = r.getString(R.string.network_switch_metered_detail, toTransport, fromTransport); + } else if (notifyType == NotificationType.NO_INTERNET + || notifyType == NotificationType.PARTIAL_CONNECTIVITY) { + // NO_INTERNET and PARTIAL_CONNECTIVITY notification for non-WiFi networks + // are sent, but they are not implemented yet. + return; } else { Slog.wtf(TAG, "Unknown notification type " + notifyType + " on network transport " + getTransportName(transportType)); diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 998ee1ed9ebe..7824a0ac3194 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.app.ActivityManager; import android.app.ActivityManagerInternal; +import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.job.JobInfo; import android.content.BroadcastReceiver; @@ -56,6 +57,7 @@ import android.os.ShellCallback; import android.os.UserHandle; import android.text.TextUtils; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.Pair; import android.util.Slog; @@ -63,6 +65,7 @@ import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.annotations.GuardedBy; +import com.android.internal.os.BinderDeathDispatcher; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; @@ -83,6 +86,9 @@ public final class ContentService extends IContentService.Stub { static final String TAG = "ContentService"; static final boolean DEBUG = false; + /** Do a WTF if a single observer is registered more than this times. */ + private static final int TOO_MANY_OBSERVERS_THRESHOLD = 1000; + public static class Lifecycle extends SystemService { private ContentService mService; @@ -135,6 +141,12 @@ public final class ContentService extends IContentService.Stub { private SyncManager mSyncManager = null; private final Object mSyncManagerLock = new Object(); + private static final BinderDeathDispatcher<IContentObserver> sObserverDeathDispatcher = + new BinderDeathDispatcher<>(); + + @GuardedBy("sObserverLeakDetectedUid") + private static final ArraySet<Integer> sObserverLeakDetectedUid = new ArraySet<>(0); + /** * Map from userId to providerPackageName to [clientPackageName, uri] to * value. This structure is carefully optimized to keep invalidation logic @@ -236,6 +248,13 @@ public final class ContentService extends IContentService.Stub { pw.println(); pw.print(" Total number of nodes: "); pw.println(counts[0]); pw.print(" Total number of observers: "); pw.println(counts[1]); + + sObserverDeathDispatcher.dump(pw, " "); + } + synchronized (sObserverLeakDetectedUid) { + pw.println(); + pw.print("Observer leaking UIDs: "); + pw.println(sObserverLeakDetectedUid.toString()); } synchronized (mCache) { @@ -1345,18 +1364,40 @@ public final class ContentService extends IContentService.Stub { private final Object observersLock; public ObserverEntry(IContentObserver o, boolean n, Object observersLock, - int _uid, int _pid, int _userHandle) { + int _uid, int _pid, int _userHandle, Uri uri) { this.observersLock = observersLock; observer = o; uid = _uid; pid = _pid; userHandle = _userHandle; notifyForDescendants = n; - try { - observer.asBinder().linkToDeath(this, 0); - } catch (RemoteException e) { + + final int entries = sObserverDeathDispatcher.linkToDeath(observer, this); + if (entries == -1) { binderDied(); + } else if (entries == TOO_MANY_OBSERVERS_THRESHOLD) { + boolean alreadyDetected; + + synchronized (sObserverLeakDetectedUid) { + alreadyDetected = sObserverLeakDetectedUid.contains(uid); + if (!alreadyDetected) { + sObserverLeakDetectedUid.add(uid); + } + } + if (!alreadyDetected) { + String caller = null; + try { + caller = ArrayUtils.firstOrNull(AppGlobals.getPackageManager() + .getPackagesForUid(uid)); + } catch (RemoteException ignore) { + } + Slog.wtf(TAG, "Observer registered too many times. Leak? cpid=" + pid + + " cuid=" + uid + + " cpkg=" + caller + + " url=" + uri); + } } + } @Override @@ -1454,7 +1495,7 @@ public final class ContentService extends IContentService.Stub { // If this is the leaf node add the observer if (index == countUriSegments(uri)) { mObservers.add(new ObserverEntry(observer, notifyForDescendants, observersLock, - uid, pid, userHandle)); + uid, pid, userHandle, uri)); return; } @@ -1498,7 +1539,7 @@ public final class ContentService extends IContentService.Stub { if (entry.observer.asBinder() == observerBinder) { mObservers.remove(i); // We no longer need to listen for death notifications. Remove it. - observerBinder.unlinkToDeath(entry, 0); + sObserverDeathDispatcher.unlinkToDeath(observer, entry); break; } } diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 6d7dff5736fa..31632dc007a5 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -322,7 +322,7 @@ class AutomaticBrightnessController { } changed |= setLightSensorEnabled(enable && !dozing); if (changed) { - updateAutoBrightness(false /*sendUpdate*/); + updateAutoBrightness(false /*sendUpdate*/, userInitiatedChange); } } @@ -667,7 +667,7 @@ class AutomaticBrightnessController { "mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", " + "mAmbientLux=" + mAmbientLux); } - updateAutoBrightness(true); + updateAutoBrightness(true /* sendUpdate */, false /* isManuallySet */); } long nextBrightenTransition = nextAmbientLightBrighteningTransition(time); @@ -697,7 +697,7 @@ class AutomaticBrightnessController { + "mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", " + "mAmbientLux=" + mAmbientLux); } - updateAutoBrightness(true); + updateAutoBrightness(true /* sendUpdate */, false /* isManuallySet */); nextBrightenTransition = nextAmbientLightBrighteningTransition(time); nextDarkenTransition = nextAmbientLightDarkeningTransition(time); } @@ -717,7 +717,7 @@ class AutomaticBrightnessController { mHandler.sendEmptyMessageAtTime(MSG_UPDATE_AMBIENT_LUX, nextTransitionTime); } - private void updateAutoBrightness(boolean sendUpdate) { + private void updateAutoBrightness(boolean sendUpdate, boolean isManuallySet) { if (!mAmbientLuxValid) { return; } @@ -732,6 +732,7 @@ class AutomaticBrightnessController { // in which case we ignore the new screen brightness if it doesn't differ enough from the // previous one. if (mScreenAutoBrightness != -1 + && !isManuallySet && newScreenAutoBrightness > mScreenDarkeningThreshold && newScreenAutoBrightness < mScreenBrighteningThreshold) { if (mLoggingEnabled) { @@ -879,7 +880,7 @@ class AutomaticBrightnessController { mPendingForegroundAppPackageName = null; mForegroundAppCategory = mPendingForegroundAppCategory; mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; - updateAutoBrightness(true /* sendUpdate */); + updateAutoBrightness(true /* sendUpdate */, false /* isManuallySet */); } private final class AutomaticBrightnessHandler extends Handler { diff --git a/services/core/java/com/android/server/gpu/GpuService.java b/services/core/java/com/android/server/gpu/GpuService.java index d4396534d067..955f17781540 100644 --- a/services/core/java/com/android/server/gpu/GpuService.java +++ b/services/core/java/com/android/server/gpu/GpuService.java @@ -64,7 +64,6 @@ public class GpuService extends SystemService { private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; private static final String GAME_DRIVER_WHITELIST_FILENAME = "whitelist.txt"; - private static final String GAME_DRIVER_SPHAL_LIBRARIES_FILENAME = "sphal_libraries.txt"; private static final int BASE64_FLAGS = Base64.NO_PADDING | Base64.NO_WRAP; private final Context mContext; @@ -230,9 +229,6 @@ public class GpuService extends SystemService { // Reset the whitelist. Settings.Global.putString(mContentResolver, Settings.Global.GAME_DRIVER_WHITELIST, ""); - // Reset the sphal libraries - Settings.Global.putString(mContentResolver, - Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, ""); mGameDriverVersionCode = driverInfo.longVersionCode; try { @@ -241,10 +237,6 @@ public class GpuService extends SystemService { assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_WHITELIST_FILENAME, Settings.Global.GAME_DRIVER_WHITELIST, ","); - - assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_SPHAL_LIBRARIES_FILENAME, - Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, ":"); - } catch (PackageManager.NameNotFoundException e) { if (DEBUG) { Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed"); diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java index 7689bd26a193..65dac8bf7cdd 100644 --- a/services/core/java/com/android/server/job/JobServiceContext.java +++ b/services/core/java/com/android/server/job/JobServiceContext.java @@ -247,10 +247,20 @@ public final class JobServiceContext implements ServiceConnection { mVerb = VERB_BINDING; scheduleOpTimeOutLocked(); final Intent intent = new Intent().setComponent(job.getServiceComponent()); - boolean binding = mContext.bindServiceAsUser(intent, this, - Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND - | Context.BIND_NOT_VISIBLE | Context.BIND_ADJUST_BELOW_PERCEPTIBLE, - new UserHandle(job.getUserId())); + boolean binding = false; + try { + binding = mContext.bindServiceAsUser(intent, this, + Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND + | Context.BIND_NOT_VISIBLE | Context.BIND_ADJUST_BELOW_PERCEPTIBLE, + new UserHandle(job.getUserId())); + } catch (SecurityException e) { + // Some permission policy, for example INTERACT_ACROSS_USERS and + // android:singleUser, can result in a SecurityException being thrown from + // bindServiceAsUser(). If this happens, catch it and fail gracefully. + Slog.w(TAG, "Job service " + job.getServiceComponent().getShortClassName() + + " cannot be executed: " + e.getMessage()); + binding = false; + } if (!binding) { if (DEBUG) { Slog.d(TAG, job.getServiceComponent().getShortClassName() + " unavailable."); diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index f28bce5d5e7b..e7636ae8acb4 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -937,7 +937,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mGnssNavigationMessageProvider.onGpsEnabledChanged(); mGnssBatchingProvider.enable(); if (mGnssVisibilityControl != null) { - mGnssVisibilityControl.onGpsEnabledChanged(/* isEnabled= */true); + mGnssVisibilityControl.onGpsEnabledChanged(/* isEnabled= */ true); } } else { setGpsEnabled(false); diff --git a/services/core/java/com/android/server/location/GnssVisibilityControl.java b/services/core/java/com/android/server/location/GnssVisibilityControl.java index 65bd5c6a14da..ea4f9c456856 100644 --- a/services/core/java/com/android/server/location/GnssVisibilityControl.java +++ b/services/core/java/com/android/server/location/GnssVisibilityControl.java @@ -78,7 +78,6 @@ class GnssVisibilityControl { private final Handler mHandler; private final Context mContext; private final GpsNetInitiatedHandler mNiHandler; - private final Notification mEmergencyLocationUserNotification; private boolean mIsGpsEnabled; @@ -107,7 +106,6 @@ class GnssVisibilityControl { mNiHandler = niHandler; mAppOps = mContext.getSystemService(AppOpsManager.class); mPackageManager = mContext.getPackageManager(); - mEmergencyLocationUserNotification = createEmergencyLocationUserNotification(mContext); // Complete initialization as the first event to run in mHandler thread. After that, // all object state read/update events run in the mHandler thread. @@ -153,7 +151,6 @@ class GnssVisibilityControl { } private void handleInitialize() { - disableNfwLocationAccess(); // Disable until config properties are loaded. listenForProxyAppsPackageUpdates(); } @@ -263,25 +260,21 @@ class GnssVisibilityControl { return false; } - private void handleGpsEnabledChanged(boolean isEnabled) { - if (DEBUG) Log.d(TAG, "handleGpsEnabledChanged, isEnabled: " + isEnabled); - - if (mIsGpsEnabled == isEnabled) { - return; + private void handleGpsEnabledChanged(boolean isGpsEnabled) { + if (DEBUG) { + Log.d(TAG, "handleGpsEnabledChanged, mIsGpsEnabled: " + mIsGpsEnabled + + ", isGpsEnabled: " + isGpsEnabled); } - mIsGpsEnabled = isEnabled; + // The proxy app list in the GNSS HAL needs to be configured if it restarts after + // a crash. So, update HAL irrespective of the previous GPS enabled state. + mIsGpsEnabled = isGpsEnabled; if (!mIsGpsEnabled) { disableNfwLocationAccess(); return; } - // When GNSS was disabled, we already set the proxy app list to empty in GNSS HAL. - // Update only if the proxy app list is not empty. - String[] locationPermissionEnabledProxyApps = getLocationPermissionEnabledProxyApps(); - if (locationPermissionEnabledProxyApps.length != 0) { - setNfwLocationAccessProxyAppsInGnssHal(locationPermissionEnabledProxyApps); - } + setNfwLocationAccessProxyAppsInGnssHal(getLocationPermissionEnabledProxyApps()); } private void disableNfwLocationAccess() { @@ -632,13 +625,15 @@ class GnssVisibilityControl { } notificationManager.notifyAsUser(/* tag= */ null, /* notificationId= */ 0, - mEmergencyLocationUserNotification, UserHandle.ALL); + createEmergencyLocationUserNotification(mContext), UserHandle.ALL); } private static Notification createEmergencyLocationUserNotification(Context context) { - String firstLineText = context.getString(R.string.gpsNotifTitle); - String secondLineText = context.getString(R.string.global_action_emergency); - String accessibilityServicesText = firstLineText + " (" + secondLineText + ")"; + // NOTE: Do not reuse the returned notification object as it will not reflect + // changes to notification text when the system language is changed. + final String firstLineText = context.getString(R.string.gpsNotifTitle); + final String secondLineText = context.getString(R.string.global_action_emergency); + final String accessibilityServicesText = firstLineText + " (" + secondLineText + ")"; return new Notification.Builder(context, SystemNotificationChannels.NETWORK_ALERTS) .setSmallIcon(com.android.internal.R.drawable.stat_sys_gps_on) .setWhen(0) diff --git a/services/core/java/com/android/server/net/NetworkStatsFactory.java b/services/core/java/com/android/server/net/NetworkStatsFactory.java index 473cc97b7edc..69efd02dea9c 100644 --- a/services/core/java/com/android/server/net/NetworkStatsFactory.java +++ b/services/core/java/com/android/server/net/NetworkStatsFactory.java @@ -263,10 +263,6 @@ public class NetworkStatsFactory { return stats; } - /** - * @deprecated Use NetworkStatsService#getDetailedUidStats which also accounts for - * VPN traffic - */ public NetworkStats readNetworkStatsDetail() throws IOException { return readNetworkStatsDetail(UID_ALL, null, TAG_ALL, null); } diff --git a/services/core/java/com/android/server/net/NetworkStatsRecorder.java b/services/core/java/com/android/server/net/NetworkStatsRecorder.java index bdff50053fae..a2e7e0cae96b 100644 --- a/services/core/java/com/android/server/net/NetworkStatsRecorder.java +++ b/services/core/java/com/android/server/net/NetworkStatsRecorder.java @@ -41,10 +41,10 @@ import com.android.internal.net.VpnInfo; import com.android.internal.util.FileRotator; import com.android.internal.util.IndentingPrintWriter; -import com.google.android.collect.Sets; - import libcore.io.IoUtils; +import com.google.android.collect.Sets; + import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; @@ -234,7 +234,7 @@ public class NetworkStatsRecorder { if (vpnArray != null) { for (VpnInfo info : vpnArray) { - delta.migrateTun(info.ownerUid, info.vpnIface, info.underlyingIfaces); + delta.migrateTun(info.ownerUid, info.vpnIface, info.primaryUnderlyingIface); } } diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index a13368ff9de4..f34ace55a72e 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -293,22 +293,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { /** Data layer operation counters for splicing into other structures. */ private NetworkStats mUidOperations = new NetworkStats(0L, 10); - /** - * Snapshot containing most recent network stats for all UIDs across all interfaces and tags - * since boot. - * - * <p>Maintains migrated VPN stats which are result of performing TUN migration on {@link - * #mLastUidDetailSnapshot}. - */ - @GuardedBy("mStatsLock") - private NetworkStats mTunAdjustedStats; - /** - * Used by {@link #mTunAdjustedStats} to migrate VPN traffic over delta between this snapshot - * and latest snapshot. - */ - @GuardedBy("mStatsLock") - private NetworkStats mLastUidDetailSnapshot; - /** Must be set in factory by calling #setHandler. */ private Handler mHandler; private Handler.Callback mHandlerCallback; @@ -828,39 +812,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub { @Override public NetworkStats getDetailedUidStats(String[] requiredIfaces) { try { - // Get the latest snapshot from NetworkStatsFactory. - // TODO: Querying for INTERFACES_ALL may incur performance penalty. Consider restricting - // this to limited set of ifaces. - NetworkStats uidDetailStats = getNetworkStatsUidDetail(INTERFACES_ALL); - - // Migrate traffic from VPN UID over delta and update mTunAdjustedStats. - NetworkStats result; - synchronized (mStatsLock) { - migrateTunTraffic(uidDetailStats, mVpnInfos); - result = mTunAdjustedStats.clone(); - } - - // Apply filter based on ifacesToQuery. final String[] ifacesToQuery = NetworkStatsFactory.augmentWithStackedInterfaces(requiredIfaces); - result.filter(UID_ALL, ifacesToQuery, TAG_ALL); - return result; + return getNetworkStatsUidDetail(ifacesToQuery); } catch (RemoteException e) { Log.wtf(TAG, "Error compiling UID stats", e); return new NetworkStats(0L, 0); } } - @VisibleForTesting - NetworkStats getTunAdjustedStats() { - synchronized (mStatsLock) { - if (mTunAdjustedStats == null) { - return null; - } - return mTunAdjustedStats.clone(); - } - } - @Override public String[] getMobileIfaces() { return mMobileIfaces; @@ -1335,34 +1295,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // a race condition between the service handler thread and the observer's mStatsObservers.updateStats(xtSnapshot, uidSnapshot, new ArrayMap<>(mActiveIfaces), new ArrayMap<>(mActiveUidIfaces), vpnArray, currentTime); - - migrateTunTraffic(uidSnapshot, vpnArray); - } - - /** - * Updates {@link #mTunAdjustedStats} with the delta containing traffic migrated off of VPNs. - */ - @GuardedBy("mStatsLock") - private void migrateTunTraffic(NetworkStats uidDetailStats, VpnInfo[] vpnInfoArray) { - if (mTunAdjustedStats == null) { - // Either device booted or system server restarted, hence traffic cannot be migrated - // correctly without knowing the past state of VPN's underlying networks. - mTunAdjustedStats = uidDetailStats; - mLastUidDetailSnapshot = uidDetailStats; - return; - } - // Migrate delta traffic from VPN to other apps. - NetworkStats delta = uidDetailStats.subtract(mLastUidDetailSnapshot); - for (VpnInfo info : vpnInfoArray) { - delta.migrateTun(info.ownerUid, info.vpnIface, info.underlyingIfaces); - } - // Filter out debug entries as that may lead to over counting. - delta.filterDebugEntries(); - // Update #mTunAdjustedStats with migrated delta. - mTunAdjustedStats.combineAllValues(delta); - mTunAdjustedStats.setElapsedRealtime(uidDetailStats.getElapsedRealtime()); - // Update last snapshot. - mLastUidDetailSnapshot = uidDetailStats; } /** diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 8485f46aefd4..82b16dea5b49 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -7234,72 +7234,42 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); - ArrayList<String> keys = new ArrayList<String>(N); - ArrayList<String> interceptedKeys = new ArrayList<String>(N); - ArrayList<Integer> importance = new ArrayList<>(N); - Bundle overrideGroupKeys = new Bundle(); - Bundle visibilityOverrides = new Bundle(); - Bundle suppressedVisualEffects = new Bundle(); - Bundle explanation = new Bundle(); - Bundle channels = new Bundle(); - Bundle overridePeople = new Bundle(); - Bundle snoozeCriteria = new Bundle(); - Bundle showBadge = new Bundle(); - Bundle userSentiment = new Bundle(); - Bundle hidden = new Bundle(); - Bundle systemGeneratedSmartActions = new Bundle(); - Bundle smartReplies = new Bundle(); - Bundle lastAudiblyAlerted = new Bundle(); - Bundle noisy = new Bundle(); - ArrayList<Boolean> canBubble = new ArrayList<>(N); + final ArrayList<NotificationListenerService.Ranking> rankings = new ArrayList<>(); + for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); if (!isVisibleToListener(record.sbn, info)) { continue; } final String key = record.sbn.getKey(); - keys.add(key); - importance.add(record.getImportance()); - if (record.getImportanceExplanation() != null) { - explanation.putCharSequence(key, record.getImportanceExplanation()); - } - if (record.isIntercepted()) { - interceptedKeys.add(key); - - } - suppressedVisualEffects.putInt(key, record.getSuppressedVisualEffects()); - if (record.getPackageVisibilityOverride() - != NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE) { - visibilityOverrides.putInt(key, record.getPackageVisibilityOverride()); - } - overrideGroupKeys.putString(key, record.sbn.getOverrideGroupKey()); - channels.putParcelable(key, record.getChannel()); - overridePeople.putStringArrayList(key, record.getPeopleOverride()); - snoozeCriteria.putParcelableArrayList(key, record.getSnoozeCriteria()); - showBadge.putBoolean(key, record.canShowBadge()); - userSentiment.putInt(key, record.getUserSentiment()); - hidden.putBoolean(key, record.isHidden()); - systemGeneratedSmartActions.putParcelableArrayList(key, - record.getSystemGeneratedSmartActions()); - smartReplies.putCharSequenceArrayList(key, record.getSmartReplies()); - lastAudiblyAlerted.putLong(key, record.getLastAudiblyAlertedMs()); - noisy.putBoolean(key, record.getSound() != null || record.getVibration() != null); - canBubble.add(record.canBubble()); - } - final int M = keys.size(); - String[] keysAr = keys.toArray(new String[M]); - String[] interceptedKeysAr = interceptedKeys.toArray(new String[interceptedKeys.size()]); - int[] importanceAr = new int[M]; - boolean[] canBubbleAr = new boolean[M]; - for (int i = 0; i < M; i++) { - importanceAr[i] = importance.get(i); - canBubbleAr[i] = canBubble.get(i); - } - return new NotificationRankingUpdate(keysAr, interceptedKeysAr, visibilityOverrides, - suppressedVisualEffects, importanceAr, explanation, overrideGroupKeys, - channels, overridePeople, snoozeCriteria, showBadge, userSentiment, hidden, - systemGeneratedSmartActions, smartReplies, lastAudiblyAlerted, noisy, - canBubbleAr); + final NotificationListenerService.Ranking ranking = + new NotificationListenerService.Ranking(); + ranking.populate( + key, + rankings.size(), + !record.isIntercepted(), + record.getPackageVisibilityOverride(), + record.getSuppressedVisualEffects(), + record.getImportance(), + record.getImportanceExplanation(), + record.sbn.getOverrideGroupKey(), + record.getChannel(), + record.getPeopleOverride(), + record.getSnoozeCriteria(), + record.canShowBadge(), + record.getUserSentiment(), + record.isHidden(), + record.getLastAudiblyAlertedMs(), + record.getSound() != null || record.getVibration() != null, + record.getSystemGeneratedSmartActions(), + record.getSmartReplies(), + record.canBubble() + ); + rankings.add(ranking); + } + + return new NotificationRankingUpdate( + rankings.toArray(new NotificationListenerService.Ranking[0])); } boolean hasCompanionDevice(ManagedServiceInfo info) { diff --git a/services/core/java/com/android/server/oemlock/PersistentDataBlockLock.java b/services/core/java/com/android/server/oemlock/PersistentDataBlockLock.java index a1c27d6432f1..2474b2aa9184 100644 --- a/services/core/java/com/android/server/oemlock/PersistentDataBlockLock.java +++ b/services/core/java/com/android/server/oemlock/PersistentDataBlockLock.java @@ -73,6 +73,10 @@ class PersistentDataBlockLock extends OemLock { // unlocked but doesn't actually do any unlocking. final PersistentDataBlockManager pdbm = (PersistentDataBlockManager) mContext.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + if (pdbm == null) { + Slog.w(TAG, "PersistentDataBlock is not supported on this device"); + return; + } pdbm.setOemUnlockEnabled(allowedByDevice); } @@ -80,6 +84,10 @@ class PersistentDataBlockLock extends OemLock { boolean isOemUnlockAllowedByDevice() { final PersistentDataBlockManager pdbm = (PersistentDataBlockManager) mContext.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + if (pdbm == null) { + Slog.w(TAG, "PersistentDataBlock is not supported on this device"); + return false; + } return pdbm.getOemUnlockEnabled(); } @@ -91,6 +99,10 @@ class PersistentDataBlockLock extends OemLock { private void disallowUnlockIfNotUnlocked() { final PersistentDataBlockManager pdbm = (PersistentDataBlockManager) mContext.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + if (pdbm == null) { + Slog.w(TAG, "PersistentDataBlock is not supported on this device"); + return; + } if (pdbm.getFlashLockState() != PersistentDataBlockManager.FLASH_LOCK_UNLOCKED) { pdbm.setOemUnlockEnabled(false); } diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java index 4b435de3538b..b604aa87f8f3 100644 --- a/services/core/java/com/android/server/om/IdmapManager.java +++ b/services/core/java/com/android/server/om/IdmapManager.java @@ -58,9 +58,16 @@ class IdmapManager { private static final boolean VENDOR_IS_Q_OR_LATER; static { - // STOPSHIP(b/119390857): Check api version once Q sdk version is finalized - final String value = SystemProperties.get("ro.vndk.version", "Q"); - VENDOR_IS_Q_OR_LATER = value.equals("Q") || value.equals("q"); + final String value = SystemProperties.get("ro.vndk.version", "29"); + boolean isQOrLater; + try { + isQOrLater = Integer.parseInt(value) >= 29; + } catch (NumberFormatException e) { + // The version is not a number, therefore it is a development codename. + isQOrLater = true; + } + + VENDOR_IS_Q_OR_LATER = isQOrLater; } IdmapManager(final Installer installer, final PackageManagerHelper packageManager) { diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index c2d5b2f86002..adcd19e9bb5a 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -121,24 +121,6 @@ public class Installer extends SystemService { } } - @Override - public void onUnlockUser(int userId) { - if (userId == 0) { - if (!checkBeforeRemote()) return; - - if (mInstalld == null) { - Slog.wtf(TAG, "Call to onUnlockUser prior to onStart."); - return; - } - - try { - mInstalld.migrateLegacyObbData(); - } catch (RemoteException re) { - Slog.wtf(TAG, "Error migrating legacy OBB data.", re); - } - } - } - private void connect() { IBinder binder = ServiceManager.getService("installd"); if (binder != null) { @@ -708,6 +690,24 @@ public class Installer extends SystemService { } } + /** + * Migrates obb data from its legacy location {@code /data/media/obb} to + * {@code /data/media/0/Android/obb}. This call is idempotent and a fast no-op if data has + * already been migrated. + * + * @throws InstallerException if an error occurs. + */ + public boolean migrateLegacyObbData() throws InstallerException { + if (!checkBeforeRemote()) return false; + + try { + mInstalld.migrateLegacyObbData(); + return true; + } catch (Exception e) { + throw InstallerException.from(e); + } + } + private static void assertValidInstructionSet(String instructionSet) throws InstallerException { for (String abi : Build.SUPPORTED_ABIS) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index bd8859401856..0032e9a8ea51 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -617,7 +617,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mStagingManager.createSession(session); } - mCallbacks.notifySessionCreated(session.sessionId, session.userId); + if ((session.params.installFlags & PackageManager.INSTALL_DRY_RUN) == 0) { + mCallbacks.notifySessionCreated(session.sessionId, session.userId); + } writeSessionsAsync(); return sessionId; } @@ -1210,16 +1212,25 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements class InternalCallback { public void onSessionBadgingChanged(PackageInstallerSession session) { - mCallbacks.notifySessionBadgingChanged(session.sessionId, session.userId); + if ((session.params.installFlags & PackageManager.INSTALL_DRY_RUN) == 0) { + mCallbacks.notifySessionBadgingChanged(session.sessionId, session.userId); + } + writeSessionsAsync(); } public void onSessionActiveChanged(PackageInstallerSession session, boolean active) { - mCallbacks.notifySessionActiveChanged(session.sessionId, session.userId, active); + if ((session.params.installFlags & PackageManager.INSTALL_DRY_RUN) == 0) { + mCallbacks.notifySessionActiveChanged(session.sessionId, session.userId, + active); + } } public void onSessionProgressChanged(PackageInstallerSession session, float progress) { - mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, progress); + if ((session.params.installFlags & PackageManager.INSTALL_DRY_RUN) == 0) { + mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, + progress); + } } public void onStagedSessionChanged(PackageInstallerSession session) { @@ -1232,7 +1243,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } public void onSessionFinished(final PackageInstallerSession session, boolean success) { - mCallbacks.notifySessionFinished(session.sessionId, session.userId, success); + if ((session.params.installFlags & PackageManager.INSTALL_DRY_RUN) == 0) { + mCallbacks.notifySessionFinished(session.sessionId, session.userId, success); + } mInstallHandler.post(new Runnable() { @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 4a5e61bc7d72..4d84048fa603 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5643,27 +5643,6 @@ public class PackageManagerService extends IPackageManager.Stub for (int i = 0; pkg == null && i < N; i++) { pkg = mPackages.get(packageNames[i]); } - // Additional logs for b/111075456; ignore system UIDs - if (pkg == null && UserHandle.getAppId(uid) >= Process.FIRST_APPLICATION_UID) { - if (packageNames == null || packageNames.length < 2) { - // unclear if this is shared user or just a missing application - Log.e(TAG, "Failed to find package" - + "; permName: " + permName - + ", uid: " + uid - + ", caller: " + Binder.getCallingUid(), - new Throwable()); - } else { - // definitely shared user - Log.e(TAG, "Failed to find package" - + "; permName: " + permName - + ", uid: " + uid - + ", caller: " + Binder.getCallingUid() - + ", packages: " + Arrays.toString(packageNames), - new Throwable()); - } - // run again just to try to get debug output - getPackagesForUid_debug(uid, true); - } return mPermissionManager.checkUidPermission(permName, pkg, uid, getCallingUid()); } } @@ -6391,25 +6370,15 @@ public class PackageManagerService extends IPackageManager.Stub */ @Override public String[] getPackagesForUid(int uid) { - return getPackagesForUid_debug(uid, false); - } - // Debug output for b/111075456 - private String[] getPackagesForUid_debug(int uid, boolean debug) { final int callingUid = Binder.getCallingUid(); final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null; final int userId = UserHandle.getUserId(uid); final int appId = UserHandle.getAppId(uid); - if (debug) Slog.e(TAG, "Finding packages for UID" - + "; uid: " + uid - + ", userId: " + userId - + ", appId: " + appId - + ", caller: " + callingUid); // reader synchronized (mPackages) { final Object obj = mSettings.getSettingLPr(appId); if (obj instanceof SharedUserSetting) { if (isCallerInstantApp) { - if (debug) Slog.e(TAG, "Caller is instant and package has shared users"); return null; } final SharedUserSetting sus = (SharedUserSetting) obj; @@ -6417,13 +6386,8 @@ public class PackageManagerService extends IPackageManager.Stub String[] res = new String[N]; final Iterator<PackageSetting> it = sus.packages.iterator(); int i = 0; - if (debug && !it.hasNext()) Slog.e(TAG, "Shared user, but, no packages"); while (it.hasNext()) { PackageSetting ps = it.next(); - if (debug) Slog.e(TAG, "Check shared package" - + "; installed? " + ps.getInstalled(userId) - + ", shared setting: " + ps - + ", package setting: " + mSettings.mPackages.get(ps.name)); if (ps.getInstalled(userId)) { res[i++] = ps.name; } else { @@ -6436,12 +6400,6 @@ public class PackageManagerService extends IPackageManager.Stub if (ps.getInstalled(userId) && !filterAppAccessLPr(ps, callingUid, userId)) { return new String[]{ps.name}; } - if (debug) Slog.e(TAG, "Removing normal package" - + "; installed? " + ps.getInstalled(userId) - + ", filtered? " + filterAppAccessLPr(ps, callingUid, userId)); - } else if (debug) { - if (debug) Slog.e(TAG, "No setting found" - + "; obj: " + (obj == null ? "<<NULL>>" : obj.toString())); } } return null; @@ -15012,7 +14970,6 @@ public class PackageManagerService extends IPackageManager.Stub params.handleStartCopy(); if (params.mRet != INSTALL_SUCCEEDED) { mRet = params.mRet; - break; } } } @@ -15023,7 +14980,6 @@ public class PackageManagerService extends IPackageManager.Stub params.handleReturnCode(); if (params.mRet != INSTALL_SUCCEEDED) { mRet = params.mRet; - break; } } } @@ -24965,6 +24921,15 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.setRuntimePermissionsFingerPrintLPr(fingerPrint, userId); } } + + @Override + public void migrateLegacyObbData() { + try { + mInstaller.migrateLegacyObbData(); + } catch (Exception e) { + Slog.wtf(TAG, e); + } + } } @GuardedBy("mPackages") diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 1d01a84138a4..6882afb6285d 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -19,6 +19,7 @@ package com.android.server.policy; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_DEFAULT; import static android.app.AppOpsManager.MODE_ERRORED; +import static android.app.AppOpsManager.MODE_FOREGROUND; import static android.app.AppOpsManager.MODE_IGNORED; import static android.app.AppOpsManager.OP_NONE; import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION; @@ -290,7 +291,7 @@ public final class PermissionPolicyService extends SystemService { * * Currently, only used by the restricted permissions logic. * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToRestrict> mOpsToDefault = new ArrayList<>(); @@ -299,16 +300,14 @@ public final class PermissionPolicyService extends SystemService { * * Currently, only used by the restricted permissions logic. * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToUnrestrict> mOpsToAllowIfDefault = new ArrayList<>(); /** * All ops that need to be flipped to allow. * - * Currently, only used by the restricted permissions logic. - * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToUnrestrict> mOpsToAllow = new ArrayList<>(); @@ -317,16 +316,25 @@ public final class PermissionPolicyService extends SystemService { * * Currently, only used by the restricted permissions logic. * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToUnrestrict> mOpsToIgnoreIfDefault = new ArrayList<>(); /** - * All foreground permissions + * All ops that need to be flipped to ignore. * - * @see #syncOpsOfFgPermissions() + * @see #syncPackages */ - private final @NonNull ArrayList<FgPermission> mFgPermOps = new ArrayList<>(); + private final @NonNull ArrayList<OpToUnrestrict> mOpsToIgnore = new ArrayList<>(); + + /** + * All ops that need to be flipped to foreground. + * + * Currently, only used by the foreground/background permissions logic. + * + * @see #syncPackages + */ + private final @NonNull ArrayList<OpToUnrestrict> mOpsToForeground = new ArrayList<>(); PermissionToOpSynchroniser(@NonNull Context context) { mContext = context; @@ -335,11 +343,11 @@ public final class PermissionPolicyService extends SystemService { } /** - * Set app ops that belong to restricted permissions. + * Set app ops that were added in {@link #addPackage}. * * <p>This processes ops previously added by {@link #addOpIfRestricted} */ - private void syncRestrictedOps() { + private void syncPackages() { final int allowCount = mOpsToAllow.size(); for (int i = 0; i < allowCount; i++) { final OpToUnrestrict op = mOpsToAllow.get(i); @@ -350,6 +358,16 @@ public final class PermissionPolicyService extends SystemService { final OpToUnrestrict op = mOpsToAllowIfDefault.get(i); setUidModeAllowedIfDefault(op.code, op.uid, op.packageName); } + final int foregroundCount = mOpsToForeground.size(); + for (int i = 0; i < foregroundCount; i++) { + final OpToUnrestrict op = mOpsToForeground.get(i); + setUidModeForeground(op.code, op.uid); + } + final int ignoreCount = mOpsToIgnore.size(); + for (int i = 0; i < ignoreCount; i++) { + final OpToUnrestrict op = mOpsToIgnore.get(i); + setUidModeIgnored(op.code, op.uid); + } final int ignoreIfDefaultCount = mOpsToIgnoreIfDefault.size(); for (int i = 0; i < ignoreIfDefaultCount; i++) { final OpToUnrestrict op = mOpsToIgnoreIfDefault.get(i); @@ -363,46 +381,8 @@ public final class PermissionPolicyService extends SystemService { } /** - * Set app ops that belong to restricted permissions. - * - * <p>This processed ops previously added by {@link #addOpIfRestricted} - */ - private void syncOpsOfFgPermissions() { - int numFgPermOps = mFgPermOps.size(); - for (int i = 0; i < numFgPermOps; i++) { - FgPermission perm = mFgPermOps.get(i); - - if (mPackageManager.checkPermission(perm.fgPermissionName, perm.packageName) - == PackageManager.PERMISSION_GRANTED) { - if (mPackageManager.checkPermission(perm.bgPermissionName, perm.packageName) - == PackageManager.PERMISSION_GRANTED) { - mAppOpsManager.setUidMode( - AppOpsManager.permissionToOpCode(perm.fgPermissionName), perm.uid, - AppOpsManager.MODE_ALLOWED); - } else { - mAppOpsManager.setUidMode( - AppOpsManager.permissionToOpCode(perm.fgPermissionName), perm.uid, - AppOpsManager.MODE_FOREGROUND); - } - } else { - mAppOpsManager.setUidMode( - AppOpsManager.permissionToOpCode(perm.fgPermissionName), perm.uid, - AppOpsManager.MODE_IGNORED); - } - } - } - - /** - * Synchronize all previously {@link #addPackage added} packages. - */ - void syncPackages() { - syncRestrictedOps(); - syncOpsOfFgPermissions(); - } - - /** * Add op that belong to a restricted permission for later processing in - * {@link #syncRestrictedOps}. + * {@link #syncPackages()}. * * <p>Note: Called with the package lock held. Do <u>not</u> call into app-op manager. * @@ -424,19 +404,29 @@ public final class PermissionPolicyService extends SystemService { mContext.getUser()) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0; if (permissionInfo.isHardRestricted()) { - if (applyRestriction) { - mOpsToDefault.add(new OpToRestrict(uid, opCode)); - } else { - mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, opCode)); + if (opCode != OP_NONE) { + if (applyRestriction) { + mOpsToDefault.add(new OpToRestrict(uid, opCode)); + } else { + mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, opCode)); + } } } else if (permissionInfo.isSoftRestricted()) { final SoftRestrictedPermissionPolicy policy = SoftRestrictedPermissionPolicy.forPermission(mContext, pkg.applicationInfo, permission); - final int op = policy.getAppOp(); + if (opCode != OP_NONE) { + if (policy.canBeGranted()) { + mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, opCode)); + } else { + mOpsToDefault.add(new OpToRestrict(uid, opCode)); + } + } + + final int op = policy.resolveAppOp(); if (op != OP_NONE) { - switch (policy.getAppOpMode()) { + switch (policy.getDesiredOpMode()) { case MODE_DEFAULT: mOpsToDefault.add(new OpToRestrict(uid, op)); break; @@ -444,16 +434,22 @@ public final class PermissionPolicyService extends SystemService { if (policy.shouldSetAppOpIfNotDefault()) { mOpsToAllow.add(new OpToUnrestrict(uid, pkg.packageName, op)); } else { - mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, - op)); + mOpsToAllowIfDefault.add( + new OpToUnrestrict(uid, pkg.packageName, + op)); } break; + case MODE_FOREGROUND: + Slog.wtf(LOG_TAG, + "Setting appop to foreground is not implemented"); + break; case MODE_IGNORED: if (policy.shouldSetAppOpIfNotDefault()) { - Slog.wtf(LOG_TAG, "Always ignoring appops is not implemented"); + mOpsToIgnore.add(new OpToUnrestrict(uid, pkg.packageName, op)); } else { - mOpsToIgnoreIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, - op)); + mOpsToIgnoreIfDefault.add( + new OpToUnrestrict(uid, pkg.packageName, + op)); } break; case MODE_ERRORED: @@ -463,19 +459,59 @@ public final class PermissionPolicyService extends SystemService { } } + /** + * Add op that belong to a foreground permission for later processing in + * {@link #syncPackages()}. + * + * <p>Note: Called with the package lock held. Do <u>not</u> call into app-op manager. + * + * @param permissionInfo The permission that is currently looked at + * @param pkg The package looked at + */ private void addOpIfFgPermissions(@NonNull PermissionInfo permissionInfo, @NonNull PackageInfo pkg) { - if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) { - // Pre-M apps do not store their fg/bg state in the permissions - return; - } + final String bgPermissionName = permissionInfo.backgroundPermission; - if (permissionInfo.backgroundPermission == null) { + if (bgPermissionName == null) { return; } - mFgPermOps.add(new FgPermission(pkg.applicationInfo.uid, pkg.packageName, - permissionInfo.name, permissionInfo.backgroundPermission)); + final String permission = permissionInfo.name; + final int opCode = AppOpsManager.permissionToOpCode(permission); + final String pkgName = pkg.packageName; + final int uid = pkg.applicationInfo.uid; + + if (mPackageManager.checkPermission(permission, pkgName) + == PackageManager.PERMISSION_GRANTED) { + boolean isBgHardRestricted = false; + try { + final PermissionInfo bgPermInfo = mPackageManager.getPermissionInfo( + bgPermissionName, 0); + + if (bgPermInfo.isSoftRestricted()) { + Slog.wtf(LOG_TAG, "Support for soft restricted background permissions not " + + "implemented"); + } + + isBgHardRestricted = + bgPermInfo.isHardRestricted() && (mPackageManager.getPermissionFlags( + bgPermissionName, pkgName, UserHandle.getUserHandleForUid(uid)) + & FLAG_PERMISSION_APPLY_RESTRICTION) != 0; + } catch (NameNotFoundException e) { + Slog.w(LOG_TAG, "Cannot read permission state of " + bgPermissionName, e); + } + + final boolean isBgPermGranted = mPackageManager.checkPermission(bgPermissionName, + pkgName) == PackageManager.PERMISSION_GRANTED; + + if (!isBgHardRestricted && isBgPermGranted) { + mOpsToAllow.add(new OpToUnrestrict(uid, pkgName, opCode)); + } else { + mOpsToForeground.add(new OpToUnrestrict(uid, pkgName, opCode)); + } + } else { + mOpsToIgnore.add(new OpToUnrestrict(uid, pkgName, opCode)); + } } /** @@ -525,14 +561,33 @@ public final class PermissionPolicyService extends SystemService { mAppOpsManager.setUidMode(opCode, uid, AppOpsManager.MODE_ALLOWED); } + private void setUidModeForeground(int opCode, int uid) { + mAppOpsManager.setUidMode(opCode, uid, AppOpsManager.MODE_FOREGROUND); + } + private void setUidModeIgnoredIfDefault(int opCode, int uid, @NonNull String packageName) { setUidModeIfDefault(opCode, uid, AppOpsManager.MODE_IGNORED, packageName); } + private void setUidModeIgnored(int opCode, int uid) { + mAppOpsManager.setUidMode(opCode, uid, MODE_IGNORED); + } + private void setUidModeIfDefault(int opCode, int uid, int mode, @NonNull String packageName) { - final int currentMode = mAppOpsManager.unsafeCheckOpRaw(AppOpsManager - .opToPublicName(opCode), uid, packageName); + final int currentMode; + try { + currentMode = mAppOpsManager.unsafeCheckOpRaw(AppOpsManager + .opToPublicName(opCode), uid, packageName); + } catch (SecurityException e) { + // This might happen if the app was uninstalled in between the add and sync step. + // In this case the package name cannot be resolved inside appops service and hence + // the uid does not match. + Slog.w(LOG_TAG, "Cannot set mode of uid=" + uid + " op=" + opCode + " to " + mode, + e); + return; + } + if (currentMode == MODE_DEFAULT) { mAppOpsManager.setUidMode(opCode, uid, mode); } @@ -563,21 +618,6 @@ public final class PermissionPolicyService extends SystemService { this.code = code; } } - - private class FgPermission { - final int uid; - final @NonNull String packageName; - final @NonNull String fgPermissionName; - final @NonNull String bgPermissionName; - - private FgPermission(int uid, @NonNull String packageName, - @NonNull String fgPermissionName, @NonNull String bgPermissionName) { - this.uid = uid; - this.packageName = packageName; - this.fgPermissionName = fgPermissionName; - this.bgPermissionName = bgPermissionName; - } - } } private class Internal extends PermissionPolicyInternal { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index d624a85acb6e..da87b2f1994b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -4863,6 +4863,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } startedWakingUp(ON_BECAUSE_OF_UNKNOWN); + finishedWakingUp(ON_BECAUSE_OF_UNKNOWN); screenTurningOn(null); screenTurnedOn(); } @@ -5198,6 +5199,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { awakenDreams(); } + if (!isUserSetupComplete()) { + Slog.i(TAG, "Not going home because user setup is in progress."); + return; + } + // Start dock. Intent dock = createHomeDockIntent(); if (dock != null) { diff --git a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java index e19b708bcdae..d44761728c16 100644 --- a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java +++ b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java @@ -33,7 +33,6 @@ import android.app.AppOpsManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.os.Build; -import android.util.Log; /** * The behavior of soft restricted permissions is different for each permission. This class collects @@ -43,8 +42,6 @@ import android.util.Log; * {@link com.android.packageinstaller.permission.utils.SoftRestrictedPermissionPolicy} */ public abstract class SoftRestrictedPermissionPolicy { - private static final String LOG_TAG = SoftRestrictedPermissionPolicy.class.getSimpleName(); - private static final int FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT = FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT | FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT @@ -53,12 +50,12 @@ public abstract class SoftRestrictedPermissionPolicy { private static final SoftRestrictedPermissionPolicy DUMMY_POLICY = new SoftRestrictedPermissionPolicy() { @Override - public int getAppOp() { + public int resolveAppOp() { return OP_NONE; } @Override - public int getAppOpMode() { + public int getDesiredOpMode() { return MODE_DEFAULT; } @@ -100,12 +97,12 @@ public abstract class SoftRestrictedPermissionPolicy { return new SoftRestrictedPermissionPolicy() { @Override - public int getAppOp() { + public int resolveAppOp() { return OP_LEGACY_STORAGE; } @Override - public int getAppOpMode() { + public int getDesiredOpMode() { if (applyRestriction) { return MODE_DEFAULT; } else if (hasRequestedLegacyExternalStorage) { @@ -119,7 +116,7 @@ public abstract class SoftRestrictedPermissionPolicy { public boolean shouldSetAppOpIfNotDefault() { // Do not switch from allowed -> ignored as this would mean to retroactively // turn on isolated storage. This will make the app loose all its files. - return getAppOpMode() != MODE_IGNORED; + return getDesiredOpMode() != MODE_IGNORED; } @Override @@ -127,10 +124,6 @@ public abstract class SoftRestrictedPermissionPolicy { if (isWhiteListed || targetSDK >= Build.VERSION_CODES.Q) { return true; } else { - Log.w(LOG_TAG, permission + " for " + appInfo.packageName - + " is not whitelisted and targetSDK " + targetSDK + "<" - + Build.VERSION_CODES.Q); - return false; } } @@ -145,16 +138,16 @@ public abstract class SoftRestrictedPermissionPolicy { * @return An app op to be changed based on the state of the permission or * {@link AppOpsManager#OP_NONE} if not app-op should be set. */ - public abstract int getAppOp(); + public abstract int resolveAppOp(); /** - * @return The mode the {@link #getAppOp() app op} should be in. + * @return The mode the {@link #resolveAppOp() app op} should be in. */ - public abstract @AppOpsManager.Mode int getAppOpMode(); + public abstract @AppOpsManager.Mode int getDesiredOpMode(); /** - * @return If the {@link #getAppOp() app op} should be set even if the app-op is currently not - * {@link AppOpsManager#MODE_DEFAULT}. + * @return If the {@link #resolveAppOp() app op} should be set even if the app-op is currently + * not {@link AppOpsManager#MODE_DEFAULT}. */ public abstract boolean shouldSetAppOpIfNotDefault(); diff --git a/services/core/java/com/android/server/policy/TEST_MAPPING b/services/core/java/com/android/server/policy/TEST_MAPPING index 02b0e21a33c0..c7f8c07432a8 100644 --- a/services/core/java/com/android/server/policy/TEST_MAPPING +++ b/services/core/java/com/android/server/policy/TEST_MAPPING @@ -35,6 +35,14 @@ "include-filter": "android.permission2.cts.RestrictedPermissionsTest" } ] + }, + { + "name": "CtsPermissionTestCases", + "options": [ + { + "include-filter": "android.permission.cts.SplitPermissionTest" + } + ] } ], "postsubmit": [ diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 301f65061045..e107c9aedf38 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -1079,7 +1079,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { if (info.getPackageName().equals(packageName)) { mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), info); saveRollbackData(data); - return; + break; } } } @@ -1091,7 +1091,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { mAppDataRollbackHelper.snapshotAppData(rollback.data.info.getRollbackId(), info); saveRollbackData(rollback.data); - return; } } } diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java index 165055ac828c..11fd7953e08f 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java @@ -82,6 +82,22 @@ public class WebViewUpdateServiceImpl { void prepareWebViewInSystemServer() { migrateFallbackStateOnBoot(); mWebViewUpdater.prepareWebViewInSystemServer(); + if (getCurrentWebViewPackage() == null) { + // We didn't find a valid WebView implementation. Try explicitly re-enabling the + // fallback package for all users in case it was disabled, even if we already did the + // one-time migration before. If this actually changes the state, WebViewUpdater will + // see the PackageManager broadcast shortly and try again. + WebViewProviderInfo[] webviewProviders = mSystemInterface.getWebViewPackages(); + WebViewProviderInfo fallbackProvider = getFallbackProvider(webviewProviders); + if (fallbackProvider != null) { + Slog.w(TAG, "No valid provider, trying to enable " + fallbackProvider.packageName); + mSystemInterface.enablePackageForAllUsers(mContext, fallbackProvider.packageName, + true); + } else { + Slog.e(TAG, "No valid provider and no fallback available."); + } + } + boolean multiProcessEnabled = isMultiProcessEnabled(); mSystemInterface.notifyZygote(multiProcessEnabled); if (multiProcessEnabled) { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 3d59e66d13ef..9e8876a9c32d 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -2382,7 +2382,11 @@ class ActivityStack extends ConfigurationContainer { r.setVisible(true); } if (r != starting) { - mStackSupervisor.startSpecificActivityLocked(r, andResume, true /* checkConfig */); + // We should not resume activities that being launched behind because these + // activities are actually behind other fullscreen activities, but still required + // to be visible (such as performing Recents animation). + mStackSupervisor.startSpecificActivityLocked(r, andResume && !r.mLaunchTaskBehind, + true /* checkConfig */); return true; } } @@ -2635,7 +2639,7 @@ class ActivityStack extends ConfigurationContainer { if (!hasRunningActivity) { // There are no activities left in the stack, let's look somewhere else. - return resumeTopActivityInNextFocusableStack(prev, options, "noMoreActivities"); + return resumeNextFocusableActivityWhenStackIsEmpty(prev, options); } next.delayedResume = false; @@ -3036,21 +3040,33 @@ class ActivityStack extends ConfigurationContainer { return true; } - private boolean resumeTopActivityInNextFocusableStack(ActivityRecord prev, - ActivityOptions options, String reason) { - final ActivityStack nextFocusedStack = adjustFocusToNextFocusableStack(reason); - if (nextFocusedStack != null) { - // Try to move focus to the next visible stack with a running activity if this - // stack is not covering the entire screen or is on a secondary display (with no home - // stack). - return mRootActivityContainer.resumeFocusedStacksTopActivities(nextFocusedStack, prev, - null /* targetOptions */); + /** + * Resume the next eligible activity in a focusable stack when this one does not have any + * running activities left. The focus will be adjusted to the next focusable stack and + * top running activities will be resumed in all focusable stacks. However, if the current stack + * is a home stack - we have to keep it focused, start and resume a home activity on the current + * display instead to make sure that the display is not empty. + */ + private boolean resumeNextFocusableActivityWhenStackIsEmpty(ActivityRecord prev, + ActivityOptions options) { + final String reason = "noMoreActivities"; + + if (!isActivityTypeHome()) { + final ActivityStack nextFocusedStack = adjustFocusToNextFocusableStack(reason); + if (nextFocusedStack != null) { + // Try to move focus to the next visible stack with a running activity if this + // stack is not covering the entire screen or is on a secondary display with no home + // stack. + return mRootActivityContainer.resumeFocusedStacksTopActivities(nextFocusedStack, + prev, null /* targetOptions */); + } } - // Let's just start up the Launcher... + // If the current stack is a home stack, or if focus didn't switch to a different stack - + // just start up the Launcher... ActivityOptions.abort(options); if (DEBUG_STATES) Slog.d(TAG_STATES, - "resumeTopActivityInNextFocusableStack: " + reason + ", go home"); + "resumeNextFocusableActivityWhenStackIsEmpty: " + reason + ", go home"); return mRootActivityContainer.resumeHomeActivity(prev, reason, mDisplayId); } @@ -4979,6 +4995,17 @@ class ActivityStack extends ConfigurationContainer { return true; } + ActivityRecord topActivity = getDisplay().topRunningActivity(); + ActivityStack topStack = topActivity.getActivityStack(); + if (topStack != null && topStack != this && topActivity.isState(RESUMED)) { + // The new top activity is already resumed, so there's a good chance that nothing will + // get resumed below. So, update visibility now in case the transition is closed + // prematurely. + mRootActivityContainer.ensureVisibilityAndConfig(null /* starting */, + getDisplay().mDisplayId, false /* markFrozenIfConfigChanged */, + false /* deferResume */); + } + mRootActivityContainer.resumeFocusedStacksTopActivities(); return true; } diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 5c55c2e63da1..0a88eef86ea8 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1419,6 +1419,13 @@ class ActivityStarter { stack.finishActivityLocked(mStartActivity, RESULT_CANCELED, null /* intentResultData */, "startActivity", true /* oomAdj */); } + + // Stack should also be detached from display and be removed if it's empty. + if (startedActivityStack != null && startedActivityStack.isAttached() + && startedActivityStack.numActivities() == 0 + && !startedActivityStack.isActivityTypeHome()) { + startedActivityStack.remove(); + } } mService.mWindowManager.continueSurfaceLayout(); } @@ -2289,15 +2296,17 @@ class ActivityStarter { } private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate) { + if (mRestrictedBgActivity && (mReuseTask == null || !mReuseTask.containsAppUid(mCallingUid)) + && handleBackgroundActivityAbort(mStartActivity)) { + return START_ABORTED; + } + mTargetStack = computeStackFocus(mStartActivity, true, mLaunchFlags, mOptions); // Do no move the target stack to front yet, as we might bail if // isLockTaskModeViolation fails below. if (mReuseTask == null) { - if (mRestrictedBgActivity && handleBackgroundActivityAbort(mStartActivity)) { - return START_ABORTED; - } final TaskRecord task = mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId), mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, @@ -2310,11 +2319,6 @@ class ActivityStarter { if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new task " + mStartActivity.getTaskRecord()); } else { - if (mRestrictedBgActivity && !mReuseTask.containsAppUid(mCallingUid)) { - if (handleBackgroundActivityAbort(mStartActivity)) { - return START_ABORTED; - } - } addOrReparentStartingActivity(mReuseTask, "setTaskFromReuseOrCreateNewTask"); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index ed56501f4351..5459edeb3d8b 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -553,7 +553,7 @@ public abstract class ActivityTaskManagerInternal { /** * Gets bitmap snapshot of the provided task id. */ - public abstract ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, + public abstract ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId, boolean reducedResolution); /** Returns true if uid is considered foreground for activity start purposes. */ diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 86478fa0c506..142c3b32bff0 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -4521,22 +4521,27 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()"); final long ident = Binder.clearCallingIdentity(); try { - final TaskRecord task; - synchronized (mGlobalLock) { - task = mRootActivityContainer.anyTaskForId(taskId, - MATCH_TASK_IN_STACKS_OR_RECENT_TASKS); - if (task == null) { - Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found"); - return null; - } - } - // Don't call this while holding the lock as this operation might hit the disk. - return task.getSnapshot(reducedResolution); + return getTaskSnapshot(taskId, reducedResolution, true /* restoreFromDisk */); } finally { Binder.restoreCallingIdentity(ident); } } + private ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution, + boolean restoreFromDisk) { + final TaskRecord task; + synchronized (mGlobalLock) { + task = mRootActivityContainer.anyTaskForId(taskId, + MATCH_TASK_IN_STACKS_OR_RECENT_TASKS); + if (task == null) { + Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found"); + return null; + } + } + // Don't call this while holding the lock as this operation might hit the disk. + return task.getSnapshot(reducedResolution, restoreFromDisk); + } + @Override public void setDisablePreviewScreenshots(IBinder token, boolean disable) { synchronized (mGlobalLock) { @@ -7413,10 +7418,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) { - synchronized (mGlobalLock) { - return ActivityTaskManagerService.this.getTaskSnapshot(taskId, reducedResolution); - } + public ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId, + boolean reducedResolution) { + return ActivityTaskManagerService.this.getTaskSnapshot(taskId, reducedResolution, + false /* restoreFromDisk */); } @Override diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index cae7612e0fcc..918927912c0b 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -176,6 +176,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean inPendingTransaction; boolean allDrawn; private boolean mLastAllDrawn; + private boolean mUseTransferredAnimation; // Set to true when this app creates a surface while in the middle of an animation. In that // case do not clear allDrawn until the animation completes. @@ -618,9 +619,12 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean runningAppAnimation = false; if (transit != WindowManager.TRANSIT_UNSET) { - if (applyAnimationLocked(lp, transit, visible, isVoiceInteraction)) { - delayed = runningAppAnimation = true; + if (mUseTransferredAnimation) { + runningAppAnimation = isReallyAnimating(); + } else if (applyAnimationLocked(lp, transit, visible, isVoiceInteraction)) { + runningAppAnimation = true; } + delayed = runningAppAnimation; final WindowState window = findMainWindow(); if (window != null && accessibilityController != null) { accessibilityController.onAppWindowTransitionLocked(window, transit); @@ -667,6 +671,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree getDisplayContent().getInputMonitor().updateInputWindowsLw(false /*force*/); } } + mUseTransferredAnimation = false; if (isReallyAnimating()) { delayed = true; @@ -1317,7 +1322,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (prevDc == null || prevDc == mDisplayContent) { return; } - if (prevDc.mChangingApps.contains(this)) { + + prevDc.mOpeningApps.remove(this); + if (prevDc.mChangingApps.remove(this)) { // This gets called *after* the AppWindowToken has been reparented to the new display. // That reparenting resulted in this window changing modes (eg. FREEFORM -> FULLSCREEN), // so this token is now "frozen" while waiting for the animation to start on prevDc @@ -1326,6 +1333,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // so we need to cancel the change transition here. clearChangeLeash(getPendingTransaction(), true /* cancel */); } + prevDc.mClosingApps.remove(this); + if (prevDc.mFocusedApp == this) { prevDc.setFocusedApp(null); final TaskStack stack = dc.getTopStack(); @@ -1531,9 +1540,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree transferAnimation(fromToken); // When transferring an animation, we no longer need to apply an animation to the - // the token we transfer the animation over. Thus, remove the animation from - // pending opening apps. - getDisplayContent().mOpeningApps.remove(this); + // the token we transfer the animation over. Thus, set this flag to indicate we've + // transferred the animation. + mUseTransferredAnimation = true; mWmService.updateFocusedWindowLocked( UPDATE_FOCUS_WILL_PLACE_SURFACES, true /*updateInputWindows*/); @@ -3211,16 +3220,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree true /* topToBottom */); } - void removeFromPendingTransition() { - if (isWaitingForTransitionStart() && mDisplayContent != null) { - mDisplayContent.mOpeningApps.remove(this); - if (mDisplayContent.mChangingApps.remove(this)) { - clearChangeLeash(getPendingTransaction(), true /* cancel */); - } - mDisplayContent.mClosingApps.remove(this); - } - } - private void updateColorTransform() { if (mSurfaceControl != null && mLastAppSaturationInfo != null) { getPendingTransaction().setColorTransform(mSurfaceControl, diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java index b5e706710823..5dc88b37e445 100644 --- a/services/core/java/com/android/server/wm/BoundsAnimationController.java +++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java @@ -410,7 +410,7 @@ public class BoundsAnimationController { @VisibleForTesting boolean animatingToLargerSize() { // TODO: Fix this check for aspect ratio changes - return (mFrom.width() * mFrom.height() <= mTo.width() * mTo.height()); + return (mFrom.width() * mFrom.height() < mTo.width() * mTo.height()); } @Override @@ -453,16 +453,10 @@ public class BoundsAnimationController { boolean moveFromFullscreen, boolean moveToFullscreen, @AnimationType int animationType) { final BoundsAnimator existing = mRunningAnimations.get(target); - // animateBoundsImpl gets called twice for each animation. The second time we get the final - // to rect that respects the shelf, which is when we want to resize. Our signal for fade in - // comes in from how to enter into pip, but we also need to use the to and from rect to - // decide which animation we want to run finally. - boolean shouldResize = false; - if (isRunningFadeInAnimation(target)) { - shouldResize = true; - if (from.contains(to)) { - animationType = FADE_IN; - } + + if (isRunningFadeInAnimation(target) && from.width() == to.width() + && from.height() == to.height()) { + animationType = FADE_IN; } final boolean replacing = existing != null; @SchedulePipModeChangedState int prevSchedulePipModeChangedState = @@ -523,9 +517,10 @@ public class BoundsAnimationController { // Since we are replacing, we skip both animation start and end callbacks existing.cancel(); } - if (shouldResize) { + if (animationType == FADE_IN) { target.setPinnedStackSize(to, null); } + final BoundsAnimator animator = new BoundsAnimator(target, animationType, from, to, schedulePipModeChangedState, prevSchedulePipModeChangedState, moveFromFullscreen, moveToFullscreen, frozenTask); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c3a769b63e5a..80848a8f24f0 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2377,9 +2377,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo + " to its current displayId=" + mDisplayId); } - // Clean up all pending transitions when stack reparent to another display. - stack.forAllAppWindows(AppWindowToken::removeFromPendingTransition); - prevDc.mTaskStackContainers.removeChild(stack); mTaskStackContainers.addStackToDisplay(stack, onTop); } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 21f01ff38a0e..7badc7a43774 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -198,6 +198,8 @@ public class DisplayPolicy { private static final int NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED = 0; // Nav bar is always translucent when the freeform stack is visible, otherwise always opaque. private static final int NAV_BAR_TRANSLUCENT_WHEN_FREEFORM_OPAQUE_OTHERWISE = 1; + // Nav bar is never forced opaque. + private static final int NAV_BAR_FORCE_TRANSPARENT = 2; /** * These are the system UI flags that, when changing, can cause the layout @@ -3288,8 +3290,10 @@ public class DisplayPolicy { : mTopFullscreenOpaqueWindowState; vis = mStatusBarController.applyTranslucentFlagLw(fullscreenTransWin, vis, oldVis); vis = mNavigationBarController.applyTranslucentFlagLw(fullscreenTransWin, vis, oldVis); - final int dockedVis = mStatusBarController.applyTranslucentFlagLw( + int dockedVis = mStatusBarController.applyTranslucentFlagLw( mTopDockedOpaqueWindowState, 0, 0); + dockedVis = mNavigationBarController.applyTranslucentFlagLw( + mTopDockedOpaqueWindowState, dockedVis, 0); final boolean fullscreenDrawsStatusBarBackground = drawsStatusBarBackground(vis, mTopFullscreenOpaqueWindowState); @@ -3297,6 +3301,8 @@ public class DisplayPolicy { drawsStatusBarBackground(dockedVis, mTopDockedOpaqueWindowState); final boolean fullscreenDrawsNavBarBackground = drawsNavigationBarBackground(vis, mTopFullscreenOpaqueWindowState); + final boolean dockedDrawsNavigationBarBackground = + drawsNavigationBarBackground(dockedVis, mTopDockedOpaqueWindowState); // prevent status bar interaction from clearing certain flags int type = win.getAttrs().type; @@ -3321,7 +3327,7 @@ public class DisplayPolicy { } vis = configureNavBarOpacity(vis, dockedStackVisible, freeformStackVisible, resizing, - fullscreenDrawsNavBarBackground); + fullscreenDrawsNavBarBackground, dockedDrawsNavigationBarBackground); // update status bar boolean immersiveSticky = @@ -3439,8 +3445,14 @@ public class DisplayPolicy { */ private int configureNavBarOpacity(int visibility, boolean dockedStackVisible, boolean freeformStackVisible, boolean isDockedDividerResizing, - boolean fullscreenDrawsBackground) { - if (mNavBarOpacityMode == NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED) { + boolean fullscreenDrawsBackground, boolean dockedDrawsNavigationBarBackground) { + if (mNavBarOpacityMode == NAV_BAR_FORCE_TRANSPARENT) { + if (fullscreenDrawsBackground && dockedDrawsNavigationBarBackground) { + visibility = setNavBarTransparentFlag(visibility); + } else if (dockedStackVisible) { + visibility = setNavBarOpaqueFlag(visibility); + } + } else if (mNavBarOpacityMode == NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED) { if (dockedStackVisible || freeformStackVisible || isDockedDividerResizing) { visibility = setNavBarOpaqueFlag(visibility); } else if (fullscreenDrawsBackground) { diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java index 298b302a17fb..3fd4e83b9494 100644 --- a/services/core/java/com/android/server/wm/TaskRecord.java +++ b/services/core/java/com/android/server/wm/TaskRecord.java @@ -851,11 +851,12 @@ class TaskRecord extends ConfigurationContainer { /** * DO NOT HOLD THE ACTIVITY MANAGER LOCK WHEN CALLING THIS METHOD! */ - TaskSnapshot getSnapshot(boolean reducedResolution) { + TaskSnapshot getSnapshot(boolean reducedResolution, boolean restoreFromDisk) { // TODO: Move this to {@link TaskWindowContainerController} once recent tasks are more // synchronized between AM and WM. - return mService.mWindowManager.getTaskSnapshot(taskId, userId, reducedResolution); + return mService.mWindowManager.getTaskSnapshot(taskId, userId, reducedResolution, + restoreFromDisk); } void touchActiveTime() { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index d83869109ff3..481c3ba24fca 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -1640,6 +1640,7 @@ public class TaskStack extends WindowContainer<Task> implements if (mAnimationType == BoundsAnimationController.FADE_IN) { setPinnedStackAlpha(1f); mActivityStack.mService.notifyPinnedStackAnimationEnded(); + return; } if (finalStackSize != null && !mCancelCurrentBoundsAnimation) { @@ -1935,14 +1936,11 @@ public class TaskStack extends WindowContainer<Task> implements public boolean setPinnedStackAlpha(float alpha) { // Hold the lock since this is called from the BoundsAnimator running on the UiThread synchronized (mWmService.mGlobalLock) { - if (mCancelCurrentBoundsAnimation) { - return false; - } - getPendingTransaction().setAlpha(getSurfaceControl(), alpha); + getPendingTransaction().setAlpha(getSurfaceControl(), + mCancelCurrentBoundsAnimation ? 1 : alpha); scheduleAnimation(); + return !mCancelCurrentBoundsAnimation; } - - return true; } public DisplayInfo getDisplayInfo() { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d39ee4068285..ce8720a2883c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3551,8 +3551,9 @@ public class WindowManagerService extends IWindowManager.Stub return true; } - public TaskSnapshot getTaskSnapshot(int taskId, int userId, boolean reducedResolution) { - return mTaskSnapshotController.getSnapshot(taskId, userId, true /* restoreFromDisk */, + public TaskSnapshot getTaskSnapshot(int taskId, int userId, boolean reducedResolution, + boolean restoreFromDisk) { + return mTaskSnapshotController.getSnapshot(taskId, userId, restoreFromDisk, reducedResolution); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index de9d769a19d1..c6c9e1b39db4 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1548,7 +1548,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP */ boolean isInteresting() { return mAppToken != null && !mAppDied - && (!mAppToken.isFreezingScreen() || !mAppFreezing); + && (!mAppToken.isFreezingScreen() || !mAppFreezing) + && mViewVisibility == View.VISIBLE; } /** diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index ac7c16e315d0..ba59cdbe7f59 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -6654,7 +6654,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { */ @Override public void setActivePasswordState(PasswordMetrics metrics, int userHandle) { - if (!mHasFeature || !mLockPatternUtils.hasSecureLockScreen()) { + if (!mLockPatternUtils.hasSecureLockScreen()) { return; } enforceFullCrossUsersPermission(userHandle); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 203704bf7224..6dd85270e7e8 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -731,8 +731,13 @@ public final class SystemServer { (int) SystemClock.elapsedRealtime()); } traceBeginAndSlog("StartPackageManagerService"); - mPackageManagerService = PackageManagerService.main(mSystemContext, installer, - mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); + try { + Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain"); + mPackageManagerService = PackageManagerService.main(mSystemContext, installer, + mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); + } finally { + Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain"); + } mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); traceEnd(); diff --git a/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStore.aidl b/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStore.aidl index 1e688d0874de..30893b215001 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStore.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStore.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; interface IIpMemoryStore { oneway void storeNetworkAttributes(String l2Key, in android.net.ipmemorystore.NetworkAttributesParcelable attributes, android.net.ipmemorystore.IOnStatusListener listener); diff --git a/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStoreCallbacks.aidl b/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStoreCallbacks.aidl index cf02c26c2fe3..535ae2cf25e4 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStoreCallbacks.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/IIpMemoryStoreCallbacks.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; interface IIpMemoryStoreCallbacks { oneway void onIpMemoryStoreFetched(in android.net.IIpMemoryStore ipMemoryStore); diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/Blob.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/Blob.aidl index 291dbef817e6..6d2dc0ccaaac 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/Blob.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/Blob.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; parcelable Blob { byte[] data; diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl index 52f40d49abd5..48c1fb8c180a 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; interface IOnBlobRetrievedListener { oneway void onBlobRetrieved(in android.net.ipmemorystore.StatusParcelable status, in String l2Key, in String name, in android.net.ipmemorystore.Blob data); diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl index 785351435d73..aebc7240bc9e 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; interface IOnL2KeyResponseListener { oneway void onL2KeyResponse(in android.net.ipmemorystore.StatusParcelable status, in String l2Key); diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl index 3dd2ae6e9bab..b66db5ab21cb 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; interface IOnNetworkAttributesRetrievedListener { oneway void onNetworkAttributesRetrieved(in android.net.ipmemorystore.StatusParcelable status, in String l2Key, in android.net.ipmemorystore.NetworkAttributesParcelable attributes); diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl index 46d4ecb9ed7c..e9f2db445d38 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; interface IOnSameL3NetworkResponseListener { oneway void onSameL3NetworkResponse(in android.net.ipmemorystore.StatusParcelable status, in android.net.ipmemorystore.SameL3NetworkResponseParcelable response); diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnStatusListener.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnStatusListener.aidl index 54e654b80c9e..49172cea9587 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnStatusListener.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/IOnStatusListener.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; interface IOnStatusListener { oneway void onComplete(in android.net.ipmemorystore.StatusParcelable status); diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/NetworkAttributesParcelable.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/NetworkAttributesParcelable.aidl index 9531ea3963fb..188db20b531a 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/NetworkAttributesParcelable.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/NetworkAttributesParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; parcelable NetworkAttributesParcelable { byte[] assignedV4Address; diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl index 414272b49f1d..7a2ed48241e7 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; parcelable SameL3NetworkResponseParcelable { String l2Key1; diff --git a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/StatusParcelable.aidl b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/StatusParcelable.aidl index 92c6779b5dc0..d9b067875e84 100644 --- a/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/StatusParcelable.aidl +++ b/services/net/aidl/ipmemorystore/3/android/net/ipmemorystore/StatusParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ipmemorystore; parcelable StatusParcelable { int resultCode; diff --git a/services/net/aidl/networkstack/3/android/net/DhcpResultsParcelable.aidl b/services/net/aidl/networkstack/3/android/net/DhcpResultsParcelable.aidl index 31891de7230a..07ff32111bb1 100644 --- a/services/net/aidl/networkstack/3/android/net/DhcpResultsParcelable.aidl +++ b/services/net/aidl/networkstack/3/android/net/DhcpResultsParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; parcelable DhcpResultsParcelable { android.net.StaticIpConfiguration baseConfiguration; diff --git a/services/net/aidl/networkstack/3/android/net/INetworkMonitor.aidl b/services/net/aidl/networkstack/3/android/net/INetworkMonitor.aidl index 029968b6f324..8aa68bd1c7bf 100644 --- a/services/net/aidl/networkstack/3/android/net/INetworkMonitor.aidl +++ b/services/net/aidl/networkstack/3/android/net/INetworkMonitor.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; interface INetworkMonitor { oneway void start(); diff --git a/services/net/aidl/networkstack/3/android/net/INetworkMonitorCallbacks.aidl b/services/net/aidl/networkstack/3/android/net/INetworkMonitorCallbacks.aidl index ee9871ddcd15..ea93729da5e7 100644 --- a/services/net/aidl/networkstack/3/android/net/INetworkMonitorCallbacks.aidl +++ b/services/net/aidl/networkstack/3/android/net/INetworkMonitorCallbacks.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; interface INetworkMonitorCallbacks { oneway void onNetworkMonitorCreated(in android.net.INetworkMonitor networkMonitor); diff --git a/services/net/aidl/networkstack/3/android/net/INetworkStackConnector.aidl b/services/net/aidl/networkstack/3/android/net/INetworkStackConnector.aidl index 7da11e476c0e..e3a83d17eb0b 100644 --- a/services/net/aidl/networkstack/3/android/net/INetworkStackConnector.aidl +++ b/services/net/aidl/networkstack/3/android/net/INetworkStackConnector.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; interface INetworkStackConnector { oneway void makeDhcpServer(in String ifName, in android.net.dhcp.DhcpServingParamsParcel params, in android.net.dhcp.IDhcpServerCallbacks cb); diff --git a/services/net/aidl/networkstack/3/android/net/INetworkStackStatusCallback.aidl b/services/net/aidl/networkstack/3/android/net/INetworkStackStatusCallback.aidl index f6ca6f7a78e2..3112a081735a 100644 --- a/services/net/aidl/networkstack/3/android/net/INetworkStackStatusCallback.aidl +++ b/services/net/aidl/networkstack/3/android/net/INetworkStackStatusCallback.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; interface INetworkStackStatusCallback { oneway void onStatusAvailable(int statusCode); diff --git a/services/net/aidl/networkstack/3/android/net/InitialConfigurationParcelable.aidl b/services/net/aidl/networkstack/3/android/net/InitialConfigurationParcelable.aidl index c80a78785b3b..f846b26af808 100644 --- a/services/net/aidl/networkstack/3/android/net/InitialConfigurationParcelable.aidl +++ b/services/net/aidl/networkstack/3/android/net/InitialConfigurationParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; parcelable InitialConfigurationParcelable { android.net.LinkAddress[] ipAddresses; diff --git a/services/net/aidl/networkstack/3/android/net/NattKeepalivePacketDataParcelable.aidl b/services/net/aidl/networkstack/3/android/net/NattKeepalivePacketDataParcelable.aidl index 65de8833e6c5..de75940f5a50 100644 --- a/services/net/aidl/networkstack/3/android/net/NattKeepalivePacketDataParcelable.aidl +++ b/services/net/aidl/networkstack/3/android/net/NattKeepalivePacketDataParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; parcelable NattKeepalivePacketDataParcelable { byte[] srcAddress; diff --git a/services/net/aidl/networkstack/3/android/net/PrivateDnsConfigParcel.aidl b/services/net/aidl/networkstack/3/android/net/PrivateDnsConfigParcel.aidl index 2de790bb7754..cf0fbce94c91 100644 --- a/services/net/aidl/networkstack/3/android/net/PrivateDnsConfigParcel.aidl +++ b/services/net/aidl/networkstack/3/android/net/PrivateDnsConfigParcel.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; parcelable PrivateDnsConfigParcel { String hostname; diff --git a/services/net/aidl/networkstack/3/android/net/ProvisioningConfigurationParcelable.aidl b/services/net/aidl/networkstack/3/android/net/ProvisioningConfigurationParcelable.aidl index 3a6c30496fd8..c0f2d4d1747e 100644 --- a/services/net/aidl/networkstack/3/android/net/ProvisioningConfigurationParcelable.aidl +++ b/services/net/aidl/networkstack/3/android/net/ProvisioningConfigurationParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; parcelable ProvisioningConfigurationParcelable { boolean enableIPv4; diff --git a/services/net/aidl/networkstack/3/android/net/TcpKeepalivePacketDataParcelable.aidl b/services/net/aidl/networkstack/3/android/net/TcpKeepalivePacketDataParcelable.aidl index e121c064f7ac..5926794c2e8a 100644 --- a/services/net/aidl/networkstack/3/android/net/TcpKeepalivePacketDataParcelable.aidl +++ b/services/net/aidl/networkstack/3/android/net/TcpKeepalivePacketDataParcelable.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net; parcelable TcpKeepalivePacketDataParcelable { byte[] srcAddress; diff --git a/services/net/aidl/networkstack/3/android/net/dhcp/DhcpServingParamsParcel.aidl b/services/net/aidl/networkstack/3/android/net/dhcp/DhcpServingParamsParcel.aidl index 67193ae904bc..7ab156f10553 100644 --- a/services/net/aidl/networkstack/3/android/net/dhcp/DhcpServingParamsParcel.aidl +++ b/services/net/aidl/networkstack/3/android/net/dhcp/DhcpServingParamsParcel.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.dhcp; parcelable DhcpServingParamsParcel { int serverAddr; diff --git a/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServer.aidl b/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServer.aidl index 914315855496..d281ecfee61d 100644 --- a/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServer.aidl +++ b/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServer.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.dhcp; interface IDhcpServer { oneway void start(in android.net.INetworkStackStatusCallback cb); diff --git a/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServerCallbacks.aidl b/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServerCallbacks.aidl index dcc4489d52a6..98be0ab1d540 100644 --- a/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServerCallbacks.aidl +++ b/services/net/aidl/networkstack/3/android/net/dhcp/IDhcpServerCallbacks.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.dhcp; interface IDhcpServerCallbacks { oneway void onDhcpServerCreated(int statusCode, in android.net.dhcp.IDhcpServer server); diff --git a/services/net/aidl/networkstack/3/android/net/ip/IIpClient.aidl b/services/net/aidl/networkstack/3/android/net/ip/IIpClient.aidl index 176a5ce85373..85c8676ab8d0 100644 --- a/services/net/aidl/networkstack/3/android/net/ip/IIpClient.aidl +++ b/services/net/aidl/networkstack/3/android/net/ip/IIpClient.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ip; interface IIpClient { oneway void completedPreDhcpAction(); diff --git a/services/net/aidl/networkstack/3/android/net/ip/IIpClientCallbacks.aidl b/services/net/aidl/networkstack/3/android/net/ip/IIpClientCallbacks.aidl index d6bc8089a0be..7fe39ed1ed7a 100644 --- a/services/net/aidl/networkstack/3/android/net/ip/IIpClientCallbacks.aidl +++ b/services/net/aidl/networkstack/3/android/net/ip/IIpClientCallbacks.aidl @@ -1,3 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a frozen snapshot of an AIDL interface (or parcelable). Do not +// try to edit this file. It looks like you are doing that because you have +// modified an AIDL interface in a backward-incompatible way, e.g., deleting a +// function from an interface or a field from a parcelable and it broke the +// build. That breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + package android.net.ip; interface IIpClientCallbacks { oneway void onIpClientCreated(in android.net.ip.IIpClient ipClient); diff --git a/services/net/java/android/net/ipmemorystore/NetworkAttributes.java b/services/net/java/android/net/ipmemorystore/NetworkAttributes.java index e76976991797..818515ac9af1 100644 --- a/services/net/java/android/net/ipmemorystore/NetworkAttributes.java +++ b/services/net/java/android/net/ipmemorystore/NetworkAttributes.java @@ -127,6 +127,7 @@ public class NetworkAttributes { @Nullable private static InetAddress getByAddressOrNull(@Nullable final byte[] address) { + if (null == address) return null; try { return InetAddress.getByAddress(address); } catch (UnknownHostException e) { @@ -227,7 +228,9 @@ public class NetworkAttributes { } /** - * Set the lease expiry timestamp of assigned v4 address. + * Set the lease expiry timestamp of assigned v4 address. Long.MAX_VALUE is used + * to represent "infinite lease". + * * @param assignedV4AddressExpiry The lease expiry timestamp of assigned v4 address. * @return This builder. */ diff --git a/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java b/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java index ca6f3029d496..395ad98f38e0 100644 --- a/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java +++ b/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java @@ -40,8 +40,8 @@ public interface OnNetworkAttributesRetrievedListener { // NonNull, but still don't crash the system server if null if (null != listener) { listener.onNetworkAttributesRetrieved( - new Status(statusParcelable), l2Key, - new NetworkAttributes(networkAttributesParcelable)); + new Status(statusParcelable), l2Key, null == networkAttributesParcelable + ? null : new NetworkAttributes(networkAttributesParcelable)); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java index cdcdf9195ad5..1e29ed6ba5f3 100644 --- a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java @@ -1032,6 +1032,16 @@ public class AlarmManagerServiceTest { assertEquals(-1, mService.mAlarmsPerUid.get(TEST_CALLING_UID, -1)); } + @Test + public void alarmCountOnPendingIntentCancel() { + final PendingIntent pi = getNewMockPendingIntent(); + setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 123, pi); + verify(pi).registerCancelListener(mService.mOperationCancelListener); + assertEquals(1, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); + mService.mOperationCancelListener.onCancelled(pi); + assertEquals(0, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); + } + @After public void tearDown() { if (mMockingSession != null) { diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java index d90117905de6..552058f6e8c2 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java @@ -37,12 +37,15 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Process; import android.os.RemoteCallback; +import android.provider.Settings; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import org.junit.AfterClass; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -68,11 +71,14 @@ public class AppOpsServiceTest { private File mAppOpsFile; private Context mContext; private Handler mHandler; + private AppOpsManager mAppOpsManager; private AppOpsService mAppOpsService; private String mMyPackageName; private int mMyUid; private long mTestStartMillis; + private static String sDefaultAppopHistoryParameters; + @Before public void setUp() { mContext = InstrumentationRegistry.getTargetContext(); @@ -88,11 +94,29 @@ public class AppOpsServiceTest { mMyPackageName = mContext.getOpPackageName(); mMyUid = Process.myUid(); + mAppOpsManager = mContext.getSystemService(AppOpsManager.class); mAppOpsService = new AppOpsService(mAppOpsFile, mHandler); + mAppOpsService.mHistoricalRegistry.systemReady(mContext.getContentResolver()); mAppOpsService.mContext = mContext; mTestStartMillis = System.currentTimeMillis(); } + @BeforeClass + public static void configureDesiredAppopHistoryParameters() { + final Context context = InstrumentationRegistry.getTargetContext(); + sDefaultAppopHistoryParameters = Settings.Global.getString(context.getContentResolver(), + Settings.Global.APPOP_HISTORY_PARAMETERS); + Settings.Global.putString(InstrumentationRegistry.getTargetContext().getContentResolver(), + Settings.Global.APPOP_HISTORY_PARAMETERS, null); + } + + @AfterClass + public static void restoreDefaultAppopHistoryParameters() { + Settings.Global.putString(InstrumentationRegistry.getTargetContext().getContentResolver(), + Settings.Global.APPOP_HISTORY_PARAMETERS, + sDefaultAppopHistoryParameters); + } + @Test public void testGetOpsForPackage_noOpsLogged() { assertThat(getLoggedOps()).isNull(); diff --git a/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java index bb9f49e6f37f..184dc3dfed62 100644 --- a/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java @@ -86,6 +86,7 @@ public class AttentionManagerServiceTest { UserState mUserState = new UserState(0, mContext, mLock, + mMockHandler, componentName); mUserState.mService = new MockIAttentionService(); mSpyUserState = spy(mUserState); diff --git a/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java b/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java index 62b0ca805c1b..891ca74a545f 100644 --- a/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java +++ b/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java @@ -30,7 +30,7 @@ import com.android.server.content.ContentService.ObserverCall; import com.android.server.content.ContentService.ObserverNode; /** - * bit FrameworksServicesTests:com.android.server.content.ObserverNodeTest + * atest FrameworksServicesTests:com.android.server.content.ObserverNodeTest */ @SmallTest public class ObserverNodeTest extends AndroidTestCase { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java index 52c199a34f67..397d2155beeb 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java @@ -16,12 +16,16 @@ package com.android.server.notification; +import static android.app.Notification.EXTRA_SMALL_ICON; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_POSITIVE; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; @@ -31,31 +35,49 @@ import android.app.INotificationManager; import android.app.Notification; import android.app.NotificationChannel; import android.app.PendingIntent; +import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.graphics.Bitmap; +import android.graphics.drawable.Icon; import android.os.Binder; -import android.os.Bundle; +import android.os.Build; import android.os.IBinder; +import android.os.Parcel; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.Ranking; +import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.NotificationRankingUpdate; import android.service.notification.SnoozeCriterion; import android.test.suitebuilder.annotation.SmallTest; -import androidx.test.runner.AndroidJUnit4; - import com.android.server.UiServiceTestCase; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; +import androidx.test.runner.AndroidJUnit4; + @SmallTest @RunWith(AndroidJUnit4.class) public class NotificationListenerServiceTest extends UiServiceTestCase { - private String[] mKeys = new String[] { "key", "key1", "key2", "key3", "key4"}; + int targetSdk = 0; + + @Before + public void setUp() { + targetSdk = mContext.getApplicationInfo().targetSdkVersion; + } + + @After + public void tearDown() { + mContext.getApplicationInfo().targetSdkVersion = targetSdk; + } @Test public void testGetActiveNotifications_notNull() throws Exception { @@ -97,52 +119,150 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { } } - private NotificationRankingUpdate generateUpdate() { - List<String> interceptedKeys = new ArrayList<>(); - Bundle visibilityOverrides = new Bundle(); - Bundle overrideGroupKeys = new Bundle(); - Bundle suppressedVisualEffects = new Bundle(); - Bundle explanation = new Bundle(); - Bundle channels = new Bundle(); - Bundle overridePeople = new Bundle(); - Bundle snoozeCriteria = new Bundle(); - Bundle showBadge = new Bundle(); - int[] importance = new int[mKeys.length]; - Bundle userSentiment = new Bundle(); - Bundle mHidden = new Bundle(); - Bundle smartActions = new Bundle(); - Bundle smartReplies = new Bundle(); - Bundle lastAudiblyAlerted = new Bundle(); - Bundle noisy = new Bundle(); - boolean[] canBubble = new boolean[mKeys.length]; + // Tests parceling of NotificationRankingUpdate, and by extension, RankingMap and Ranking. + @Test + public void testRankingUpdate_parcel() { + NotificationRankingUpdate nru = generateUpdate(); + Parcel parcel = Parcel.obtain(); + nru.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + NotificationRankingUpdate nru1 = NotificationRankingUpdate.CREATOR.createFromParcel(parcel); + assertEquals(nru, nru1); + } + + // Tests parceling of RankingMap and RankingMap.equals + @Test + public void testRankingMap_parcel() { + RankingMap rmap = generateUpdate().getRankingMap(); + Parcel parcel = Parcel.obtain(); + rmap.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + RankingMap rmap1 = RankingMap.CREATOR.createFromParcel(parcel); + + detailedAssertEquals(rmap, rmap1); + assertEquals(rmap, rmap1); + } + // Tests parceling of Ranking and Ranking.equals + @Test + public void testRanking_parcel() { + Ranking ranking = generateUpdate().getRankingMap().getRawRankingObject(mKeys[0]); + Parcel parcel = Parcel.obtain(); + ranking.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + Ranking ranking1 = new Ranking(parcel); + detailedAssertEquals("rankings differ: ", ranking, ranking1); + assertEquals(ranking, ranking1); + } + + // Tests NotificationRankingUpdate.equals(), and by extension, RankingMap and Ranking. + @Test + public void testRankingUpdate_equals() { + NotificationRankingUpdate nru = generateUpdate(); + NotificationRankingUpdate nru2 = generateUpdate(); + detailedAssertEquals(nru, nru2); + assertEquals(nru, nru2); + Ranking tweak = nru2.getRankingMap().getRawRankingObject(mKeys[0]); + tweak.populate( + tweak.getKey(), + tweak.getRank(), + !tweak.matchesInterruptionFilter(), // note the inversion here! + tweak.getVisibilityOverride(), + tweak.getSuppressedVisualEffects(), + tweak.getImportance(), + tweak.getImportanceExplanation(), + tweak.getOverrideGroupKey(), + tweak.getChannel(), + (ArrayList) tweak.getAdditionalPeople(), + (ArrayList) tweak.getSnoozeCriteria(), + tweak.canShowBadge(), + tweak.getUserSentiment(), + tweak.isSuspended(), + tweak.getLastAudiblyAlertedMillis(), + tweak.isNoisy(), + (ArrayList) tweak.getSmartActions(), + (ArrayList) tweak.getSmartReplies(), + tweak.canBubble() + ); + assertNotEquals(nru, nru2); + } + + @Test + public void testLegacyIcons_preM() { + TestListenerService service = new TestListenerService(); + service.attachBaseContext(mContext); + service.targetSdk = Build.VERSION_CODES.LOLLIPOP_MR1; + + Bitmap largeIcon = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565); + + Notification n = new Notification.Builder(mContext, "channel") + .setSmallIcon(android.R.drawable.star_on) + .setLargeIcon(Icon.createWithBitmap(largeIcon)) + .setContentTitle("test") + .build(); + + service.createLegacyIconExtras(n); + + assertEquals(android.R.drawable.star_on, n.extras.getInt(EXTRA_SMALL_ICON)); + assertEquals(android.R.drawable.star_on, n.icon); + assertNotNull(n.largeIcon); + assertNotNull(n.extras.getParcelable(Notification.EXTRA_LARGE_ICON)); + } + + @Test + public void testLegacyIcons_mPlus() { + TestListenerService service = new TestListenerService(); + service.attachBaseContext(mContext); + service.targetSdk = Build.VERSION_CODES.M; + + Bitmap largeIcon = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565); + + Notification n = new Notification.Builder(mContext, "channel") + .setSmallIcon(android.R.drawable.star_on) + .setLargeIcon(Icon.createWithBitmap(largeIcon)) + .setContentTitle("test") + .build(); + + service.createLegacyIconExtras(n); + + assertEquals(0, n.extras.getInt(EXTRA_SMALL_ICON)); + assertNull(n.largeIcon); + } + + + // Test data + + private String[] mKeys = new String[] { "key", "key1", "key2", "key3", "key4"}; + + private NotificationRankingUpdate generateUpdate() { + Ranking[] rankings = new Ranking[mKeys.length]; for (int i = 0; i < mKeys.length; i++) { - String key = mKeys[i]; - visibilityOverrides.putInt(key, getVisibilityOverride(i)); - overrideGroupKeys.putString(key, getOverrideGroupKey(key)); - if (isIntercepted(i)) { - interceptedKeys.add(key); - } - suppressedVisualEffects.putInt(key, getSuppressedVisualEffects(i)); - importance[i] = getImportance(i); - explanation.putString(key, getExplanation(key)); - channels.putParcelable(key, getChannel(key, i)); - overridePeople.putStringArrayList(key, getPeople(key, i)); - snoozeCriteria.putParcelableArrayList(key, getSnoozeCriteria(key, i)); - showBadge.putBoolean(key, getShowBadge(i)); - userSentiment.putInt(key, getUserSentiment(i)); - mHidden.putBoolean(key, getHidden(i)); - smartActions.putParcelableArrayList(key, getSmartActions(key, i)); - smartReplies.putCharSequenceArrayList(key, getSmartReplies(key, i)); - lastAudiblyAlerted.putLong(key, lastAudiblyAlerted(i)); - noisy.putBoolean(key, getNoisy(i)); - canBubble[i] = canBubble(i); + final String key = mKeys[i]; + Ranking ranking = new Ranking(); + ranking.populate( + key, + i, + !isIntercepted(i), + getVisibilityOverride(i), + getSuppressedVisualEffects(i), + getImportance(i), + getExplanation(key), + getOverrideGroupKey(key), + getChannel(key, i), + getPeople(key, i), + getSnoozeCriteria(key, i), + getShowBadge(i), + getUserSentiment(i), + getHidden(i), + lastAudiblyAlerted(i), + getNoisy(i), + getSmartActions(key, i), + getSmartReplies(key, i), + canBubble(i) + ); + rankings[i] = ranking; } - NotificationRankingUpdate update = new NotificationRankingUpdate(mKeys, - interceptedKeys.toArray(new String[0]), visibilityOverrides, - suppressedVisualEffects, importance, explanation, overrideGroupKeys, - channels, overridePeople, snoozeCriteria, showBadge, userSentiment, mHidden, - smartActions, smartReplies, lastAudiblyAlerted, noisy, canBubble); + NotificationRankingUpdate update = new NotificationRankingUpdate(rankings); return update; } @@ -253,8 +373,46 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { } } + private void detailedAssertEquals(NotificationRankingUpdate a, NotificationRankingUpdate b) { + assertEquals(a.getRankingMap(), b.getRankingMap()); + } + + private void detailedAssertEquals(String comment, Ranking a, Ranking b) { + assertEquals(comment, a.getKey(), b.getKey()); + assertEquals(comment, a.getRank(), b.getRank()); + assertEquals(comment, a.matchesInterruptionFilter(), b.matchesInterruptionFilter()); + assertEquals(comment, a.getVisibilityOverride(), b.getVisibilityOverride()); + assertEquals(comment, a.getSuppressedVisualEffects(), b.getSuppressedVisualEffects()); + assertEquals(comment, a.getImportance(), b.getImportance()); + assertEquals(comment, a.getImportanceExplanation(), b.getImportanceExplanation()); + assertEquals(comment, a.getOverrideGroupKey(), b.getOverrideGroupKey()); + assertEquals(comment, a.getChannel(), b.getChannel()); + assertEquals(comment, a.getAdditionalPeople(), b.getAdditionalPeople()); + assertEquals(comment, a.getSnoozeCriteria(), b.getSnoozeCriteria()); + assertEquals(comment, a.canShowBadge(), b.canShowBadge()); + assertEquals(comment, a.getUserSentiment(), b.getUserSentiment()); + assertEquals(comment, a.isSuspended(), b.isSuspended()); + assertEquals(comment, a.getLastAudiblyAlertedMillis(), b.getLastAudiblyAlertedMillis()); + assertEquals(comment, a.isNoisy(), b.isNoisy()); + assertEquals(comment, a.getSmartReplies(), b.getSmartReplies()); + assertEquals(comment, a.canBubble(), b.canBubble()); + assertActionsEqual(a.getSmartActions(), b.getSmartActions()); + } + + private void detailedAssertEquals(RankingMap a, RankingMap b) { + Ranking arank = new Ranking(); + Ranking brank = new Ranking(); + assertArrayEquals(a.getOrderedKeys(), b.getOrderedKeys()); + for (String key : a.getOrderedKeys()) { + a.getRanking(key, arank); + b.getRanking(key, brank); + detailedAssertEquals("ranking for key <" + key + ">", arank, brank); + } + } + public static class TestListenerService extends NotificationListenerService { private final IBinder binder = new LocalBinder(); + public int targetSdk = 0; public TestListenerService() { mWrapper = mock(NotificationListenerWrapper.class); @@ -276,5 +434,19 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { return TestListenerService.this; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + } + + @Override + public ApplicationInfo getApplicationInfo() { + ApplicationInfo info = super.getApplicationInfo(); + if (targetSdk != 0) { + info.targetSdkVersion = targetSdk; + } + return info; + } } } diff --git a/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java new file mode 100644 index 000000000000..fc24f5e207a8 --- /dev/null +++ b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java @@ -0,0 +1,95 @@ +/* + * 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.server.policy; + +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.mock; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; +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.android.dx.mockito.inline.extended.ExtendedMockito.when; + +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; + +import android.app.ActivityManager; + +import androidx.test.filters.SmallTest; + +import com.android.server.wm.ActivityTaskManagerInternal; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test class for {@link PhoneWindowManager}. + * + * Build/Install/Run: + * atest WmTests:PhoneWindowManagerTests + */ +@SmallTest +public class PhoneWindowManagerTests { + + PhoneWindowManager mPhoneWindowManager; + + @Before + public void setUp() { + mPhoneWindowManager = spy(new PhoneWindowManager()); + spyOn(ActivityManager.getService()); + } + + @After + public void tearDown() { + reset(ActivityManager.getService()); + } + + @Test + public void testShouldNotStartDockOrHomeWhenSetup() throws Exception { + mockStartDockOrHome(); + doReturn(false).when(mPhoneWindowManager).isUserSetupComplete(); + + mPhoneWindowManager.startDockOrHome( + 0 /* displayId */, false /* fromHomeKey */, false /* awakenFromDreams */); + + verify(mPhoneWindowManager, never()).createHomeDockIntent(); + } + + @Test + public void testShouldStartDockOrHomeAfterSetup() throws Exception { + mockStartDockOrHome(); + doReturn(true).when(mPhoneWindowManager).isUserSetupComplete(); + + mPhoneWindowManager.startDockOrHome( + 0 /* displayId */, false /* fromHomeKey */, false /* awakenFromDreams */); + + verify(mPhoneWindowManager).createHomeDockIntent(); + } + + private void mockStartDockOrHome() throws Exception { + doNothing().when(ActivityManager.getService()).stopAppSwitches(); + ActivityTaskManagerInternal mMockActivityTaskManagerInternal = + mock(ActivityTaskManagerInternal.class); + when(mMockActivityTaskManagerInternal.startHomeOnDisplay( + anyInt(), anyString(), anyInt(), anyBoolean(), anyBoolean())).thenReturn(false); + mPhoneWindowManager.mActivityTaskManagerInternal = mMockActivityTaskManagerInternal; + } +} 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 53b0add8c37e..4986a6d5bd0d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -585,7 +585,10 @@ class ActivityTestsBase { } void tearDown() { - mHandlerThread.quitSafely(); + // Make sure there are no running messages and then quit the thread so the next test + // won't be affected. + mHandlerThread.getThreadHandler().runWithScissors(mHandlerThread::quit, + 0 /* timeout */); } } @@ -630,7 +633,8 @@ class ActivityTestsBase { mWindowManager = prepareMockWindowManager(); mKeyguardController = mock(KeyguardController.class); - // Do not schedule idle timeouts + // Do not schedule idle that may touch methods outside the scope of the test. + doNothing().when(this).scheduleIdleLocked(); doNothing().when(this).scheduleIdleTimeoutLocked(any()); // unit test version does not handle launch wake lock doNothing().when(this).acquireLaunchWakelock(); 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 8f41a42bde38..1f8b33eb5bb4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -24,14 +24,18 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doCallRealMethod; +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.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.android.server.wm.ActivityStack.ActivityState.PAUSED; import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -107,6 +111,39 @@ 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). + ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); + ActivityStack recentsStack = display.createStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_RECENTS, true /* onTop */); + ActivityRecord recentActivity = new ActivityBuilder(mService).setComponent( + mRecentsComponent).setCreateTask(true).setStack(recentsStack).build(); + WindowProcessController app = recentActivity.app; + recentActivity.app = null; + + // Start an activity on top. + new ActivityBuilder(mService).setCreateTask(true).build().getActivityStack().moveToFront( + "testRestartRecentsActivity"); + + doCallRealMethod().when(mRootActivityContainer).ensureActivitiesVisible( + any() /* starting */, anyInt() /* configChanges */, + anyBoolean() /* preserveWindows */); + doReturn(app).when(mService).getProcessController(eq(recentActivity.processName), anyInt()); + ClientLifecycleManager lifecycleManager = mService.getLifecycleManager(); + doNothing().when(lifecycleManager).scheduleTransaction(any()); + AppWarnings appWarnings = mService.getAppWarningsLocked(); + spyOn(appWarnings); + doNothing().when(appWarnings).onStartActivity(any()); + + startRecentsActivity(); + + // Recents activity must be restarted, but not be resumed while running recents animation. + verify(mRootActivityContainer.mStackSupervisor).startSpecificActivityLocked( + eq(recentActivity), eq(false), anyBoolean()); + assertThat(recentActivity.getState()).isEqualTo(PAUSED); + } + + @Test public void testSetLaunchTaskBehindOfTargetActivity() { ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); display.mDisplayContent.mBoundsAnimationController = mock(BoundsAnimationController.class); 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 c77e25fabf19..8d2c3dd80538 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -16,6 +16,7 @@ package com.android.server.wm; +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_FULLSCREEN; @@ -35,6 +36,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.ActivityDisplay.POSITION_TOP; import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; +import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; import static com.android.server.wm.RootActivityContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE; import static org.junit.Assert.assertEquals; @@ -397,6 +399,58 @@ public class RootActivityContainerTests extends ActivityTestsBase { } /** + * Verify that home activity will be started on a display even if another display has a + * focusable activity. + */ + @Test + public void testResumeFocusedStacksStartsHomeActivity_NoActivities() { + mFullscreenStack.remove(); + mService.mRootActivityContainer.getActivityDisplay(DEFAULT_DISPLAY).getHomeStack().remove(); + mService.mRootActivityContainer.getActivityDisplay(DEFAULT_DISPLAY) + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); + + doReturn(true).when(mRootActivityContainer).resumeHomeActivity(any(), any(), anyInt()); + + mService.setBooted(true); + + // Trigger resume on all displays + mRootActivityContainer.resumeFocusedStacksTopActivities(); + + // Verify that home activity was started on the default display + verify(mRootActivityContainer).resumeHomeActivity(any(), any(), eq(DEFAULT_DISPLAY)); + } + + /** + * Verify that home activity will be started on a display even if another display has a + * focusable activity. + */ + @Test + public void testResumeFocusedStacksStartsHomeActivity_ActivityOnSecondaryScreen() { + mFullscreenStack.remove(); + mService.mRootActivityContainer.getActivityDisplay(DEFAULT_DISPLAY).getHomeStack().remove(); + mService.mRootActivityContainer.getActivityDisplay(DEFAULT_DISPLAY) + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); + + // Create an activity on secondary display. + final TestActivityDisplay secondDisplay = addNewActivityDisplayAt( + ActivityDisplay.POSITION_TOP); + final ActivityStack stack = secondDisplay.createStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, true /* onTop */); + final TaskRecord task = new TaskBuilder(mSupervisor).setStack(stack).build(); + new ActivityBuilder(mService).setTask(task).build(); + + doReturn(true).when(mRootActivityContainer).resumeHomeActivity(any(), any(), anyInt()); + + mService.setBooted(true); + + // Trigger resume on all displays + mRootActivityContainer.resumeFocusedStacksTopActivities(); + + // Verify that home activity was started on the default display + verify(mRootActivityContainer).resumeHomeActivity(any(), any(), eq(DEFAULT_DISPLAY)); + } + + /** * Verify that a lingering transition is being executed in case the activity to be resumed is * already resumed */ diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 8ef381d140d6..9806199003d7 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -2685,6 +2685,30 @@ public class CarrierConfigManager { public static final String KEY_PREFIX = "gps."; /** + * Location information during (and after) an emergency call is only provided over control + * plane signaling from the network. + * @hide + */ + public static final int SUPL_EMERGENCY_MODE_TYPE_CP_ONLY = 0; + + /** + * Location information during (and after) an emergency call is provided over the data + * plane and serviced by the framework GNSS service, but if it fails, the carrier also + * supports control plane backup signaling. + * @hide + */ + public static final int SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK = 1; + + /** + * Location information during (and after) an emergency call is provided over the data plane + * and serviced by the framework GNSS service only. There is no backup signalling over the + * control plane if it fails. + * @hide + */ + public static final int SUPL_EMERGENCY_MODE_TYPE_DP_ONLY = 2; + + + /** * Determine whether current lpp_mode used for E-911 needs to be kept persistently. * {@code false} - not keeping the lpp_mode means using default configuration of gps.conf * when sim is not presented. @@ -2775,6 +2799,23 @@ public class CarrierConfigManager { */ public static final String KEY_NFW_PROXY_APPS_STRING = KEY_PREFIX + "nfw_proxy_apps"; + /** + * Determines whether or not SUPL ES mode supports a control-plane mechanism to get a user's + * location in the event that data plane SUPL fails or is otherwise unavailable. + * <p> + * An integer value determines the support type of this carrier. If this carrier only + * supports data plane SUPL ES, then the value will be + * {@link #SUPL_EMERGENCY_MODE_TYPE_DP_ONLY}. If the carrier supports control plane fallback + * for emergency SUPL, the value will be {@link #SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK}. + * If the carrier does not support data plane SUPL using the framework, the value will be + * {@link #SUPL_EMERGENCY_MODE_TYPE_CP_ONLY}. + * <p> + * The default value for this configuration is {@link #SUPL_EMERGENCY_MODE_TYPE_CP_ONLY}. + * @hide + */ + public static final String KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT = KEY_PREFIX + + "es_supl_control_plane_support_int"; + private static PersistableBundle getDefaults() { PersistableBundle defaults = new PersistableBundle(); defaults.putBoolean(KEY_PERSIST_LPP_MODE_BOOL, true); @@ -2789,6 +2830,8 @@ public class CarrierConfigManager { defaults.putString(KEY_GPS_LOCK_STRING, "3"); defaults.putString(KEY_ES_EXTENSION_SEC_STRING, "0"); defaults.putString(KEY_NFW_PROXY_APPS_STRING, ""); + defaults.putInt(KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT, + SUPL_EMERGENCY_MODE_TYPE_CP_ONLY); return defaults; } } diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 5d39a2cc194a..518da74eb9e2 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -16,6 +16,8 @@ package android.telephony; +import static android.telephony.TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN; + import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1605,6 +1607,12 @@ public class ServiceState implements Parcelable { } } + /** @hide */ + public static int networkTypeToAccessNetworkType(@TelephonyManager.NetworkType + int networkType) { + return rilRadioTechnologyToAccessNetworkType(networkTypeToRilRadioTechnology(networkType)); + } + /** * Get current data network type. * @@ -1730,6 +1738,36 @@ public class ServiceState implements Parcelable { return false; } + /** + * + * Returns whether the bearerBitmask includes a networkType that matches the accessNetworkType. + * + * The NetworkType refers to NetworkType in TelephonyManager. For example + * {@link TelephonyManager#NETWORK_TYPE_GPRS}. + * + * The accessNetworkType refers to {@link AccessNetworkType}. + * + * @hide + * */ + public static boolean networkBitmaskHasAccessNetworkType( + @TelephonyManager.NetworkTypeBitMask int networkBitmask, int accessNetworkType) { + if (networkBitmask == NETWORK_TYPE_BITMASK_UNKNOWN) return true; + if (accessNetworkType == AccessNetworkType.UNKNOWN) return false; + + int networkType = 1; + while (networkBitmask != 0) { + if ((networkBitmask & 1) != 0) { + if (networkTypeToAccessNetworkType(networkType) == accessNetworkType) { + return true; + } + } + networkBitmask = networkBitmask >> 1; + networkType++; + } + + return false; + } + /** @hide */ public static int getBitmaskForTech(int radioTech) { if (radioTech >= 1) { diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 68602354d3b0..b44e4f179392 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -1975,9 +1975,11 @@ public final class SmsManager { */ public static int getDefaultSmsSubscriptionId() { try { - return getISmsServiceOrThrow().getPreferredSmsSubscription(); + return getISmsService().getPreferredSmsSubscription(); } catch (RemoteException e) { return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + } catch (NullPointerException e) { + return SubscriptionManager.INVALID_SUBSCRIPTION_ID; } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index d6011b946139..b7b511e5eb4b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1498,6 +1498,48 @@ public class TelephonyManager { */ public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL = 4; + /** + * Integer intent extra to be used with {@link #ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED} + * to indicate if the SIM combination in DSDS has limitation or compatible issue. + * e.g. two CDMA SIMs may disrupt each other's voice call in certain scenarios. + * + * @hide + */ + public static final String EXTRA_SIM_COMBINATION_WARNING_TYPE = + "android.telephony.extra.SIM_COMBINATION_WARNING_TYPE"; + + /** @hide */ + @IntDef({ + EXTRA_SIM_COMBINATION_WARNING_TYPE_NONE, + EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SimCombinationWarningType{} + + /** + * Used as an int value for {@link #EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE} + * to indicate there's no SIM combination warning. + * @hide + */ + public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_NONE = 0; + + /** + * Used as an int value for {@link #EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE} + * to indicate two active SIMs are both CDMA hence there might be functional limitation. + * @hide + */ + public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA = 1; + + /** + * String intent extra to be used with {@link #ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED} + * to indicate what's the name of SIM combination it has limitation or compatible issue. + * e.g. two CDMA SIMs may disrupt each other's voice call in certain scenarios, and the + * name will be "operator1 & operator2". + * + * @hide + */ + public static final String EXTRA_SIM_COMBINATION_NAMES = + "android.telephony.extra.SIM_COMBINATION_NAMES"; // // // Device Info diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java index e8e2a3d8453e..7a0ab9ca6a28 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -29,8 +29,6 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import android.provider.DeviceConfig; -import android.provider.Settings; import android.telephony.Rlog; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -364,23 +362,8 @@ public final class TelephonyPermissions { */ private static boolean reportAccessDeniedToReadIdentifiers(Context context, int subId, int pid, int uid, String callingPackage, String message) { - // Check if the application is not preinstalled; if not then a separate setting is required - // to relax the check to begin flagging problems with non-preinstalled apps early. - boolean relax3PDeviceIdentifierCheck = Settings.Global.getInt(context.getContentResolver(), - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_3P_CHECK_RELAXED, 0) == 1; boolean isPreinstalled = false; - // Also check if the application is a preloaded non-privileged app; if so there is a - // separate setting to relax the check for these apps to ensure users can relax the check - // for non-preinstalled or non-priv apps as needed while continuing to test the other. - boolean relaxNonPrivDeviceIdentifierCheck = Settings.Global.getInt( - context.getContentResolver(), - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_NON_PRIV_CHECK_RELAXED, 0) == 1; boolean isPrivApp = false; - // Similar to above support relaxing the check for privileged apps while still enforcing it - // for non-privileged and non-preinstalled apps. - boolean relaxPrivDeviceIdentifierCheck = Settings.Global.getInt( - context.getContentResolver(), - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_PRIV_CHECK_RELAXED, 0) == 1; ApplicationInfo callingPackageInfo = null; try { callingPackageInfo = context.getPackageManager().getApplicationInfoAsUser( @@ -399,58 +382,40 @@ public final class TelephonyPermissions { Log.e(LOG_TAG, "Exception caught obtaining package info for package " + callingPackage, e); } - // The new Q restrictions for device identifier access will be enforced for all apps with - // settings to individually disable the new restrictions for privileged, preloaded - // non-privileged, and non-preinstalled apps. - if (!isIdentifierCheckDisabled() && ( - (isPrivApp && !relaxPrivDeviceIdentifierCheck) - || (!isPreinstalled && !relax3PDeviceIdentifierCheck) - || (isPreinstalled && !isPrivApp && !relaxNonPrivDeviceIdentifierCheck))) { - // The current package should only be reported in StatsLog if it has not previously been - // reported for the currently invoked device identifier method. - boolean packageReported = sReportedDeviceIDPackages.containsKey(callingPackage); - if (!packageReported || !sReportedDeviceIDPackages.get(callingPackage).contains( - message)) { - Set invokedMethods; - if (!packageReported) { - invokedMethods = new HashSet<String>(); - sReportedDeviceIDPackages.put(callingPackage, invokedMethods); - } else { - invokedMethods = sReportedDeviceIDPackages.get(callingPackage); - } - invokedMethods.add(message); - StatsLog.write(StatsLog.DEVICE_IDENTIFIER_ACCESS_DENIED, callingPackage, message, - isPreinstalled, isPrivApp); + // The current package should only be reported in StatsLog if it has not previously been + // reported for the currently invoked device identifier method. + boolean packageReported = sReportedDeviceIDPackages.containsKey(callingPackage); + if (!packageReported || !sReportedDeviceIDPackages.get(callingPackage).contains( + message)) { + Set invokedMethods; + if (!packageReported) { + invokedMethods = new HashSet<String>(); + sReportedDeviceIDPackages.put(callingPackage, invokedMethods); + } else { + invokedMethods = sReportedDeviceIDPackages.get(callingPackage); } - Log.w(LOG_TAG, "reportAccessDeniedToReadIdentifiers:" + callingPackage + ":" + message - + ":isPreinstalled=" + isPreinstalled + ":isPrivApp=" + isPrivApp); - // if the target SDK is pre-Q then check if the calling package would have previously - // had access to device identifiers. - if (callingPackageInfo != null && ( - callingPackageInfo.targetSdkVersion < Build.VERSION_CODES.Q)) { - if (context.checkPermission( - android.Manifest.permission.READ_PHONE_STATE, - pid, - uid) == PackageManager.PERMISSION_GRANTED) { - return false; - } - if (checkCarrierPrivilegeForSubId(subId)) { - return false; - } + invokedMethods.add(message); + StatsLog.write(StatsLog.DEVICE_IDENTIFIER_ACCESS_DENIED, callingPackage, message, + isPreinstalled, isPrivApp); + } + Log.w(LOG_TAG, "reportAccessDeniedToReadIdentifiers:" + callingPackage + ":" + message + + ":isPreinstalled=" + isPreinstalled + ":isPrivApp=" + isPrivApp); + // if the target SDK is pre-Q then check if the calling package would have previously + // had access to device identifiers. + if (callingPackageInfo != null && ( + callingPackageInfo.targetSdkVersion < Build.VERSION_CODES.Q)) { + if (context.checkPermission( + android.Manifest.permission.READ_PHONE_STATE, + pid, + uid) == PackageManager.PERMISSION_GRANTED) { + return false; + } + if (checkCarrierPrivilegeForSubId(subId)) { + return false; } - throw new SecurityException(message + ": The user " + uid - + " does not meet the requirements to access device identifiers."); - } else { - return checkReadPhoneState(context, subId, pid, uid, callingPackage, message); } - } - - /** - * Returns true if the new device identifier access restrictions are disabled. - */ - private static boolean isIdentifierCheckDisabled() { - return DeviceConfig.getInt(DeviceConfig.NAMESPACE_PRIVACY, - PROPERTY_DEVICE_IDENTIFIER_ACCESS_RESTRICTIONS_DISABLED, 0) == 1; + throw new SecurityException(message + ": The user " + uid + + " does not meet the requirements to access device identifiers."); } /** diff --git a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java index 17fa93135c7d..45ddc3eed39c 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java @@ -39,6 +39,8 @@ import com.android.internal.colorextraction.types.Tonal; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; /** * Tests color extraction generation. @@ -48,16 +50,19 @@ import org.junit.runner.RunWith; public class ColorExtractorTest { Context mContext; + @Mock + WallpaperManager mWallpaperManager; @Before public void setup() { + MockitoAnnotations.initMocks(this); mContext = InstrumentationRegistry.getContext(); } @Test public void ColorExtractor_extractWhenInitialized() { ExtractionType type = mock(Tonal.class); - new ColorExtractor(mContext, type, true); + new ColorExtractor(mContext, type, true, mWallpaperManager); // 1 for lock and 1 for system verify(type, times(2)) .extractInto(any(), any(), any(), any()); @@ -84,7 +89,7 @@ public class ColorExtractorTest { outGradientColorsDark.set(colorsExpectedDark); outGradientColorsExtraDark.set(colorsExpectedExtraDark); }; - ColorExtractor extractor = new ColorExtractor(mContext, type, true); + ColorExtractor extractor = new ColorExtractor(mContext, type, true, mWallpaperManager); GradientColors colors = extractor.getColors(WallpaperManager.FLAG_SYSTEM, ColorExtractor.TYPE_NORMAL); @@ -99,7 +104,8 @@ public class ColorExtractorTest { public void addOnColorsChangedListener_invokesListener() { ColorExtractor.OnColorsChangedListener mockedListeners = mock(ColorExtractor.OnColorsChangedListener.class); - ColorExtractor extractor = new ColorExtractor(mContext, new Tonal(mContext), true); + ColorExtractor extractor = new ColorExtractor(mContext, new Tonal(mContext), true, + mWallpaperManager); extractor.addOnColorsChangedListener(mockedListeners); extractor.onColorsChanged(new WallpaperColors(Color.valueOf(Color.RED), null, null), diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java index c16a0f446651..b5b0384ca599 100644 --- a/tests/net/java/android/net/NetworkStatsTest.java +++ b/tests/net/java/android/net/NetworkStatsTest.java @@ -569,7 +569,7 @@ public class NetworkStatsTest { .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L); - delta.migrateTun(tunUid, tunIface, new String[] {underlyingIface}); + assertTrue(delta.toString(), delta.migrateTun(tunUid, tunIface, underlyingIface)); assertEquals(20, delta.size()); // tunIface and TEST_IFACE entries are not changed. @@ -650,7 +650,7 @@ public class NetworkStatsTest { .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 75500L, 37L, 130000L, 70L, 0L); - delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface}); + assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); assertEquals(9, delta.size()); // tunIface entries should not be changed. @@ -813,37 +813,6 @@ public class NetworkStatsTest { } @Test - public void testFilterDebugEntries() { - NetworkStats.Entry entry1 = new NetworkStats.Entry( - "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); - - NetworkStats.Entry entry2 = new NetworkStats.Entry( - "test2", 10101, SET_DBG_VPN_IN, TAG_NONE, METERED_NO, ROAMING_NO, - DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); - - NetworkStats.Entry entry3 = new NetworkStats.Entry( - "test2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, - DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); - - NetworkStats.Entry entry4 = new NetworkStats.Entry( - "test2", 10101, SET_DBG_VPN_OUT, TAG_NONE, METERED_NO, ROAMING_NO, - DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); - - NetworkStats stats = new NetworkStats(TEST_START, 4) - .addValues(entry1) - .addValues(entry2) - .addValues(entry3) - .addValues(entry4); - - stats.filterDebugEntries(); - - assertEquals(2, stats.size()); - assertEquals(entry1, stats.getValues(0, null)); - assertEquals(entry3, stats.getValues(1, null)); - } - - @Test public void testApply464xlatAdjustments() { final String v4Iface = "v4-wlan0"; final String baseIface = "wlan0"; diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index d9f2c201fe37..bce526d3ae29 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -57,11 +57,11 @@ import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_PO import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -216,16 +216,11 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectSystemReady(); - assertNull(mService.getTunAdjustedStats()); mService.systemReady(); - // Verify that system ready fetches realtime stats and initializes tun adjusted stats. - verify(mNetManager).getNetworkStatsUidDetail(UID_ALL, INTERFACES_ALL); - assertNotNull("failed to initialize TUN adjusted stats", mService.getTunAdjustedStats()); - assertEquals(0, mService.getTunAdjustedStats().size()); - mSession = mService.openSession(); assertNotNull("openSession() failed", mSession); + // catch INetworkManagementEventObserver during systemReady() ArgumentCaptor<INetworkManagementEventObserver> networkObserver = ArgumentCaptor.forClass(INetworkManagementEventObserver.class); @@ -738,13 +733,11 @@ public class NetworkStatsServiceTest { NetworkStats stats = mService.getDetailedUidStats(ifaceFilter); - // mNetManager#getNetworkStatsUidDetail(UID_ALL, INTERFACES_ALL) has following invocations: - // 1) NetworkStatsService#systemReady from #setUp. - // 2) mService#forceUpdateIfaces in the test above. - // 3) Finally, mService#getDetailedUidStats. - verify(mNetManager, times(3)).getNetworkStatsUidDetail(UID_ALL, INTERFACES_ALL); - assertTrue(ArrayUtils.contains(stats.getUniqueIfaces(), TEST_IFACE)); - assertTrue(ArrayUtils.contains(stats.getUniqueIfaces(), stackedIface)); + verify(mNetManager, times(1)).getNetworkStatsUidDetail(eq(UID_ALL), argThat(ifaces -> + ifaces != null && ifaces.length == 2 + && ArrayUtils.contains(ifaces, TEST_IFACE) + && ArrayUtils.contains(ifaces, stackedIface))); + assertEquals(2, stats.size()); assertEquals(uidStats, stats.getValues(0, null)); assertEquals(tetheredStats1, stats.getValues(1, null)); @@ -930,111 +923,11 @@ public class NetworkStatsServiceTest { } @Test - public void vpnRewriteTrafficThroughItself() throws Exception { - // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). - expectDefaultSettings(); - NetworkState[] networkStates = new NetworkState[] {buildWifiState(), buildVpnState()}; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // - // 1000 bytes (100 packets) were sent, and 2000 bytes (200 packets) were received by UID_RED - // over VPN. - // 500 bytes (50 packets) were sent, and 1000 bytes (100 packets) were received by UID_BLUE - // over VPN. - // - // VPN UID rewrites packets read from TUN back to TUN, plus some of its own traffic - // (100 bytes). - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 5) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 2000L, 200L, 1000L, 100L, 1L) - .addValues(TUN_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1000L, 100L, 500L, 50L, 1L) - // VPN rewrites all the packets read from TUN + 100 additional bytes of VPN's - // own traffic. - .addValues(TUN_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 0L, 0L, 1600L, 160L, 2L) - // VPN sent 1760 bytes over WiFi in foreground (SET_FOREGROUND) i.e. 1600 - // bytes (160 packets) + 1 byte/packet overhead (=160 bytes). - .addValues(TEST_IFACE, UID_VPN, SET_FOREGROUND, TAG_NONE, 0L, 0L, 1760L, 176L, 1L) - // VPN received 3300 bytes over WiFi in background (SET_DEFAULT) i.e. 3000 bytes - // (300 packets) + 1 byte/packet encryption overhead (=300 bytes). - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 3300L, 300L, 0L, 0L, 1L)); - - forcePollAndWaitForIdle(); - - // Verify increased TUN usage by UID_VPN does not get attributed to other apps. - NetworkStats tunStats = - mService.getDetailedUidStats(new String[] {TUN_IFACE}); - assertValues( - tunStats, TUN_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 2000L, 200L, 1000L, 100L, 1); - assertValues( - tunStats, TUN_IFACE, UID_BLUE, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 1000L, 100L, 500L, 50L, 1); - assertValues( - tunStats, TUN_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 0L, 0L, 1600L, 160L, 2); - - // Verify correct attribution over WiFi. - assertUidTotal(sTemplateWifi, UID_RED, 2000L, 200L, 1000L, 100L, 1); - assertUidTotal(sTemplateWifi, UID_BLUE, 1000L, 100L, 500L, 50L, 1); - assertUidTotal(sTemplateWifi, UID_VPN, 300L, 0L, 260L, 26L, 2); - } - - @Test public void vpnWithOneUnderlyingIface() throws Exception { // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). expectDefaultSettings(); NetworkState[] networkStates = new NetworkState[] {buildWifiState(), buildVpnState()}; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were sent, and 2000 bytes (200 packets) were received by UID_RED - // over VPN. - // 500 bytes (50 packets) were sent, and 1000 bytes (100 packets) were received by UID_BLUE - // over VPN. - // VPN sent 1650 bytes (150 packets), and received 3300 (300 packets) over WiFi. - // Of 1650 bytes sent over WiFi, expect 1000 bytes attributed to UID_RED, 500 bytes - // attributed to UID_BLUE, and 150 bytes attributed to UID_VPN. - // Of 3300 bytes received over WiFi, expect 2000 bytes attributed to UID_RED, 1000 bytes - // attributed to UID_BLUE, and 300 bytes attributed to UID_VPN. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 2000L, 200L, 1000L, 100L, 1L) - .addValues(TUN_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1000L, 100L, 500L, 50L, 1L) - // VPN received 3300 bytes over WiFi in background (SET_DEFAULT). - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 3300L, 300L, 0L, 0L, 1L) - // VPN sent 1650 bytes over WiFi in foreground (SET_FOREGROUND). - .addValues(TEST_IFACE, UID_VPN, SET_FOREGROUND, TAG_NONE, 0L, 0L, 1650L, 150L, 1L)); - - forcePollAndWaitForIdle(); - - assertUidTotal(sTemplateWifi, UID_RED, 2000L, 200L, 1000L, 100L, 1); - assertUidTotal(sTemplateWifi, UID_BLUE, 1000L, 100L, 500L, 50L, 1); - assertUidTotal(sTemplateWifi, UID_VPN, 300L, 0L, 150L, 0L, 2); - } - - @Test - public void vpnWithOneUnderlyingIfaceAndOwnTraffic() throws Exception { - // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). - expectDefaultSettings(); - NetworkState[] networkStates = new NetworkState[] {buildWifiState(), buildVpnState()}; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(TEST_IFACE)}; expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); @@ -1045,33 +938,23 @@ public class NetworkStatsServiceTest { getActiveIface(networkStates)); // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption // overhead per packet): - // 1000 bytes (100 packets) were sent, and 2000 bytes (200 packets) were received by UID_RED - // over VPN. - // 500 bytes (50 packets) were sent, and 1000 bytes (100 packets) were received by UID_BLUE - // over VPN. - // Additionally, the VPN sends 6000 bytes (600 packets) of its own traffic into the tun - // interface (passing that traffic to the VPN endpoint), and receives 5000 bytes (500 - // packets) from it. Including overhead that is 6600/5500 bytes. - // VPN sent 8250 bytes (750 packets), and received 8800 (800 packets) over WiFi. - // Of 8250 bytes sent over WiFi, expect 1000 bytes attributed to UID_RED, 500 bytes - // attributed to UID_BLUE, and 6750 bytes attributed to UID_VPN. - // Of 8800 bytes received over WiFi, expect 2000 bytes attributed to UID_RED, 1000 bytes - // attributed to UID_BLUE, and 5800 bytes attributed to UID_VPN. + // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. + // 500 bytes (50 packets) were sent/received by UID_BLUE over VPN. + // VPN sent/received 1650 bytes (150 packets) over WiFi. + // Of 1650 bytes over WiFi, expect 1000 bytes attributed to UID_RED, 500 bytes attributed to + // UID_BLUE, and 150 bytes attributed to UID_VPN for both rx/tx traffic. incrementCurrentTime(HOUR_IN_MILLIS); expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 2000L, 200L, 1000L, 100L, 1L) - .addValues(TUN_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1000L, 100L, 500L, 50L, 1L) - .addValues(TUN_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 5000L, 500L, 6000L, 600L, 1L) - // VPN received 8800 bytes over WiFi in background (SET_DEFAULT). - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 8800L, 800L, 0L, 0L, 1L) - // VPN sent 8250 bytes over WiFi in foreground (SET_FOREGROUND). - .addValues(TEST_IFACE, UID_VPN, SET_FOREGROUND, TAG_NONE, 0L, 0L, 8250L, 750L, 1L)); + .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 1L) + .addValues(TUN_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 500L, 50L, 500L, 50L, 1L) + .addValues( + TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 1650L, 150L, 1650L, 150L, 2L)); forcePollAndWaitForIdle(); - assertUidTotal(sTemplateWifi, UID_RED, 2000L, 200L, 1000L, 100L, 1); - assertUidTotal(sTemplateWifi, UID_BLUE, 1000L, 100L, 500L, 50L, 1); - assertUidTotal(sTemplateWifi, UID_VPN, 5800L, 500L, 6750L, 600L, 2); + assertUidTotal(sTemplateWifi, UID_RED, 1000L, 100L, 1000L, 100L, 1); + assertUidTotal(sTemplateWifi, UID_BLUE, 500L, 50L, 500L, 50L, 1); + assertUidTotal(sTemplateWifi, UID_VPN, 150L, 0L, 150L, 0L, 2); } @Test @@ -1079,7 +962,7 @@ public class NetworkStatsServiceTest { // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). expectDefaultSettings(); NetworkState[] networkStates = new NetworkState[] {buildWifiState(), buildVpnState()}; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(TEST_IFACE)}; expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); @@ -1110,136 +993,6 @@ public class NetworkStatsServiceTest { } @Test - public void vpnWithTwoUnderlyingIfaces_packetDuplication() throws Exception { - // WiFi and Cell networks are connected and VPN is using WiFi (which has TEST_IFACE) and - // Cell (which has TEST_IFACE2) and has declared both of them in its underlying network set. - // Additionally, VPN is duplicating traffic across both WiFi and Cell. - expectDefaultSettings(); - NetworkState[] networkStates = - new NetworkState[] { - buildWifiState(), buildMobile4gState(TEST_IFACE2), buildVpnState() - }; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE, TEST_IFACE2})}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were sent/received by UID_RED and UID_BLUE over VPN. - // VPN sent/received 4400 bytes (400 packets) over both WiFi and Cell (8800 bytes in total). - // Of 8800 bytes over WiFi/Cell, expect: - // - 500 bytes rx/tx each over WiFi/Cell attributed to both UID_RED and UID_BLUE. - // - 1200 bytes rx/tx each over WiFi/Cell for VPN_UID. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 4) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 2L) - .addValues(TUN_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 2L) - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 2200L, 200L, 2200L, 200L, 2L) - .addValues( - TEST_IFACE2, UID_VPN, SET_DEFAULT, TAG_NONE, 2200L, 200L, 2200L, 200L, 2L)); - - forcePollAndWaitForIdle(); - - assertUidTotal(sTemplateWifi, UID_RED, 500L, 50L, 500L, 50L, 1); - assertUidTotal(sTemplateWifi, UID_BLUE, 500L, 50L, 500L, 50L, 1); - assertUidTotal(sTemplateWifi, UID_VPN, 1200L, 100L, 1200L, 100L, 2); - - assertUidTotal(buildTemplateMobileWildcard(), UID_RED, 500L, 50L, 500L, 50L, 1); - assertUidTotal(buildTemplateMobileWildcard(), UID_BLUE, 500L, 50L, 500L, 50L, 1); - assertUidTotal(buildTemplateMobileWildcard(), UID_VPN, 1200L, 100L, 1200L, 100L, 2); - } - - @Test - public void vpnWithTwoUnderlyingIfaces_splitTraffic() throws Exception { - // WiFi and Cell networks are connected and VPN is using WiFi (which has TEST_IFACE) and - // Cell (which has TEST_IFACE2) and has declared both of them in its underlying network set. - // Additionally, VPN is arbitrarily splitting traffic across WiFi and Cell. - expectDefaultSettings(); - NetworkState[] networkStates = - new NetworkState[] { - buildWifiState(), buildMobile4gState(TEST_IFACE2), buildVpnState() - }; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE, TEST_IFACE2})}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were sent, and 500 bytes (50 packets) received by UID_RED over - // VPN. - // VPN sent 660 bytes (60 packets) over WiFi and 440 bytes (40 packets) over Cell. - // And, it received 330 bytes (30 packets) over WiFi and 220 bytes (20 packets) over Cell. - // For UID_RED, expect 600 bytes attributed over WiFi and 400 bytes over Cell for sent (tx) - // traffic. For received (rx) traffic, expect 300 bytes over WiFi and 200 bytes over Cell. - // - // For UID_VPN, expect 60 bytes attributed over WiFi and 40 bytes over Cell for tx traffic. - // And, 30 bytes over WiFi and 20 bytes over Cell for rx traffic. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 500L, 50L, 1000L, 100L, 2L) - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 330L, 30L, 660L, 60L, 1L) - .addValues(TEST_IFACE2, UID_VPN, SET_DEFAULT, TAG_NONE, 220L, 20L, 440L, 40L, 1L)); - - forcePollAndWaitForIdle(); - - assertUidTotal(sTemplateWifi, UID_RED, 300L, 30L, 600L, 60L, 1); - assertUidTotal(sTemplateWifi, UID_VPN, 30L, 0L, 60L, 0L, 1); - - assertUidTotal(buildTemplateMobileWildcard(), UID_RED, 200L, 20L, 400L, 40L, 1); - assertUidTotal(buildTemplateMobileWildcard(), UID_VPN, 20L, 0L, 40L, 0L, 1); - } - - @Test - public void vpnWithTwoUnderlyingIfaces_splitTrafficWithCompression() throws Exception { - // WiFi and Cell networks are connected and VPN is using WiFi (which has TEST_IFACE) and - // Cell (which has TEST_IFACE2) and has declared both of them in its underlying network set. - // Additionally, VPN is arbitrarily splitting compressed traffic across WiFi and Cell. - expectDefaultSettings(); - NetworkState[] networkStates = - new NetworkState[] { - buildWifiState(), buildMobile4gState(TEST_IFACE2), buildVpnState() - }; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE, TEST_IFACE2})}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface: - // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. - // VPN sent/received 600 bytes (60 packets) over WiFi and 200 bytes (20 packets) over Cell. - // For UID_RED, expect 600 bytes attributed over WiFi and 200 bytes over Cell for both - // rx/tx. - // UID_VPN gets nothing attributed to it (avoiding negative stats). - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 4) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 1L) - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 600L, 60L, 600L, 60L, 0L) - .addValues(TEST_IFACE2, UID_VPN, SET_DEFAULT, TAG_NONE, 200L, 20L, 200L, 20L, 0L)); - - forcePollAndWaitForIdle(); - - assertUidTotal(sTemplateWifi, UID_RED, 600L, 60L, 600L, 60L, 0); - assertUidTotal(sTemplateWifi, UID_VPN, 0L, 0L, 0L, 0L, 0); - - assertUidTotal(buildTemplateMobileWildcard(), UID_RED, 200L, 20L, 200L, 20L, 0); - assertUidTotal(buildTemplateMobileWildcard(), UID_VPN, 0L, 0L, 0L, 0L, 0); - } - - @Test public void vpnWithIncorrectUnderlyingIface() throws Exception { // WiFi and Cell networks are connected and VPN is using Cell (which has TEST_IFACE2), // but has declared only WiFi (TEST_IFACE) in its underlying network set. @@ -1248,7 +1001,7 @@ public class NetworkStatsServiceTest { new NetworkState[] { buildWifiState(), buildMobile4gState(TEST_IFACE2), buildVpnState() }; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(TEST_IFACE)}; expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); @@ -1277,134 +1030,6 @@ public class NetworkStatsServiceTest { } @Test - public void recordSnapshot_migratesTunTrafficAndUpdatesTunAdjustedStats() throws Exception { - assertEquals(0, mService.getTunAdjustedStats().size()); - // VPN using WiFi (TEST_IFACE). - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; - expectBandwidthControlCheck(); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were downloaded by UID_RED over VPN. - // VPN received 1100 bytes (100 packets) over WiFi. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 0L, 0L, 0L) - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 1100L, 100L, 0L, 0L, 0L)); - - // this should lead to NSS#recordSnapshotLocked - mService.forceUpdateIfaces( - new Network[0], vpnInfos, new NetworkState[0], null /* activeIface */); - - // Verify TUN adjusted stats have traffic migrated correctly. - // Of 1100 bytes VPN received over WiFi, expect 1000 bytes attributed to UID_RED and 100 - // bytes attributed to UID_VPN. - NetworkStats tunAdjStats = mService.getTunAdjustedStats(); - assertValues( - tunAdjStats, TEST_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 1000L, 100L, 0L, 0L, 0); - assertValues( - tunAdjStats, TEST_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 100L, 0L, 0L, 0L, 0); - } - - @Test - public void getDetailedUidStats_migratesTunTrafficAndUpdatesTunAdjustedStats() - throws Exception { - assertEquals(0, mService.getTunAdjustedStats().size()); - // VPN using WiFi (TEST_IFACE). - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; - expectBandwidthControlCheck(); - mService.forceUpdateIfaces( - new Network[0], vpnInfos, new NetworkState[0], null /* activeIface */); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were downloaded by UID_RED over VPN. - // VPN received 1100 bytes (100 packets) over WiFi. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 0L, 0L, 0L) - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 1100L, 100L, 0L, 0L, 0L)); - - mService.getDetailedUidStats(INTERFACES_ALL); - - // Verify internally maintained TUN adjusted stats - NetworkStats tunAdjStats = mService.getTunAdjustedStats(); - // Verify stats for TEST_IFACE (WiFi): - // Of 1100 bytes VPN received over WiFi, expect 1000 bytes attributed to UID_RED and 100 - // bytes attributed to UID_VPN. - assertValues( - tunAdjStats, TEST_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 1000L, 100L, 0L, 0L, 0); - assertValues( - tunAdjStats, TEST_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 100L, 0L, 0L, 0L, 0); - // Verify stats for TUN_IFACE; only UID_RED should have usage on it. - assertValues( - tunAdjStats, TUN_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 1000L, 100L, 0L, 0L, 0); - assertValues( - tunAdjStats, TUN_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 0L, 0L, 0L, 0L, 0); - - // lets assume that since last time, VPN received another 1100 bytes (same assumptions as - // before i.e. UID_RED downloaded another 1000 bytes). - incrementCurrentTime(HOUR_IN_MILLIS); - // Note - NetworkStatsFactory returns counters that are monotonically increasing. - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 2000L, 200L, 0L, 0L, 0L) - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 2200L, 200L, 0L, 0L, 0L)); - - mService.getDetailedUidStats(INTERFACES_ALL); - - tunAdjStats = mService.getTunAdjustedStats(); - // verify TEST_IFACE stats: - assertValues( - tunAdjStats, TEST_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 2000L, 200L, 0L, 0L, 0); - assertValues( - tunAdjStats, TEST_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 200L, 0L, 0L, 0L, 0); - // verify TUN_IFACE stats: - assertValues( - tunAdjStats, TUN_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 2000L, 200L, 0L, 0L, 0); - assertValues( - tunAdjStats, TUN_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 0L, 0L, 0L, 0L, 0); - } - - @Test - public void getDetailedUidStats_returnsCorrectStatsWithVpnRunning() throws Exception { - // VPN using WiFi (TEST_IFACE). - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; - expectBandwidthControlCheck(); - mService.forceUpdateIfaces( - new Network[0], vpnInfos, new NetworkState[0], null /* activeIface */); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were downloaded by UID_RED over VPN. - // VPN received 1100 bytes (100 packets) over WiFi. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 0L, 0L, 0L) - .addValues(TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 1100L, 100L, 0L, 0L, 0L)); - - // Query realtime stats for TEST_IFACE. - NetworkStats queriedStats = - mService.getDetailedUidStats(new String[] {TEST_IFACE}); - - assertEquals(HOUR_IN_MILLIS, queriedStats.getElapsedRealtime()); - // verify that returned stats are only for TEST_IFACE and VPN traffic is migrated correctly. - assertEquals(new String[] {TEST_IFACE}, queriedStats.getUniqueIfaces()); - assertValues( - queriedStats, TEST_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 1000L, 100L, 0L, 0L, 0); - assertValues( - queriedStats, TEST_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, 100L, 0L, 0L, 0L, 0); - } - - @Test public void testRegisterUsageCallback() throws Exception { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. @@ -1757,11 +1382,11 @@ public class NetworkStatsServiceTest { return new NetworkState(info, prop, new NetworkCapabilities(), VPN_NETWORK, null, null); } - private static VpnInfo createVpnInfo(String[] underlyingIfaces) { + private static VpnInfo createVpnInfo(String underlyingIface) { VpnInfo info = new VpnInfo(); info.ownerUid = UID_VPN; info.vpnIface = TUN_IFACE; - info.underlyingIfaces = underlyingIfaces; + info.primaryUnderlyingIface = underlyingIface; return info; } diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp index c9c0edc59585..91f875ed9918 100644 --- a/tools/incident_section_gen/main.cpp +++ b/tools/incident_section_gen/main.cpp @@ -408,9 +408,10 @@ static bool generateSectionListCpp(Descriptor const* descriptor) { for (int i=0; i<descriptor->field_count(); i++) { const FieldDescriptor* field = descriptor->field(i); - if (field->type() != FieldDescriptor::TYPE_MESSAGE - && field->type() != FieldDescriptor::TYPE_STRING) { - continue; + if (field->type() != FieldDescriptor::TYPE_MESSAGE && + field->type() != FieldDescriptor::TYPE_STRING && + field->type() != FieldDescriptor::TYPE_BYTES) { + continue; } const SectionFlags s = getSectionFlags(field); diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp index 1aad4be5d66f..f62fef076f48 100644 --- a/tools/stats_log_api_gen/main.cpp +++ b/tools/stats_log_api_gen/main.cpp @@ -131,14 +131,10 @@ static void write_atoms_info_cpp(FILE *out, const Atoms &atoms) { "mobile_bytes_transfer"}; fprintf(out, "const std::set<int> " - "AtomsInfo::kNotTruncatingTimestampAtomWhiteList = {\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); - atom != atoms.decls.end(); atom++) { - if (kTruncatingAtomNames.find(atom->name) == - kTruncatingAtomNames.end()) { - string constant = make_constant_name(atom->name); - fprintf(out, " %s,\n", constant.c_str()); - } + "AtomsInfo::kTruncatingTimestampAtomBlackList = {\n"); + for (set<string>::const_iterator blacklistedAtom = kTruncatingAtomNames.begin(); + blacklistedAtom != kTruncatingAtomNames.end(); blacklistedAtom++) { + fprintf(out, " %s,\n", make_constant_name(*blacklistedAtom).c_str()); } fprintf(out, "};\n"); fprintf(out, "\n"); @@ -840,7 +836,7 @@ write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl &attributio fprintf(out, "struct AtomsInfo {\n"); fprintf(out, " const static std::set<int> " - "kNotTruncatingTimestampAtomWhiteList;\n"); + "kTruncatingTimestampAtomBlackList;\n"); fprintf(out, " const static std::map<int, int> kAtomsWithUidField;\n"); fprintf(out, " const static std::set<int> kAtomsWithAttributionChain;\n"); |