Merge "Assign leash layer when starting animations." into pi-dev
diff --git a/api/current.txt b/api/current.txt
index 01117c9..307fc4b 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -73,6 +73,7 @@
field public static final java.lang.String DUMP = "android.permission.DUMP";
field public static final java.lang.String EXPAND_STATUS_BAR = "android.permission.EXPAND_STATUS_BAR";
field public static final java.lang.String FACTORY_TEST = "android.permission.FACTORY_TEST";
+ field public static final java.lang.String FOREGROUND_SERVICE = "android.permission.FOREGROUND_SERVICE";
field public static final java.lang.String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
field public static final java.lang.String GET_ACCOUNTS_PRIVILEGED = "android.permission.GET_ACCOUNTS_PRIVILEGED";
field public static final java.lang.String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE";
@@ -24371,8 +24372,6 @@
field public static final int MEDIA_CALL_PAUSE = 4; // 0x4
field public static final int MEDIA_CALL_PLAY = 5; // 0x5
field public static final int MEDIA_CALL_PREPARE = 6; // 0x6
- field public static final int MEDIA_CALL_PREPARE_DRM = 7; // 0x7
- field public static final int MEDIA_CALL_PROVIDE_DRM_KEY_RESPONSE = 8; // 0x8
field public static final int MEDIA_CALL_RELEASE_DRM = 12; // 0xc
field public static final int MEDIA_CALL_RESTORE_DRM_KEYS = 13; // 0xd
field public static final int MEDIA_CALL_SEEK_TO = 14; // 0xe
@@ -24381,8 +24380,6 @@
field public static final int MEDIA_CALL_SET_AUDIO_SESSION_ID = 17; // 0x11
field public static final int MEDIA_CALL_SET_AUX_EFFECT_SEND_LEVEL = 18; // 0x12
field public static final int MEDIA_CALL_SET_DATA_SOURCE = 19; // 0x13
- field public static final int MEDIA_CALL_SET_DRM_CONFIG_HELPER = 20; // 0x14
- field public static final int MEDIA_CALL_SET_DRM_PROPERTY_STRING = 21; // 0x15
field public static final int MEDIA_CALL_SET_NEXT_DATA_SOURCE = 22; // 0x16
field public static final int MEDIA_CALL_SET_NEXT_DATA_SOURCES = 23; // 0x17
field public static final int MEDIA_CALL_SET_PLAYBACK_PARAMS = 24; // 0x18
@@ -33590,6 +33587,7 @@
method public static final int getUidForName(java.lang.String);
method public static final boolean is64Bit();
method public static boolean isApplicationUid(int);
+ method public static final boolean isIsolated();
method public static final void killProcess(int);
method public static final int myPid();
method public static final int myTid();
@@ -37535,11 +37533,11 @@
field public static final java.lang.String ADDRESS = "address";
}
- public static final class Telephony.CarrierIdentification implements android.provider.BaseColumns {
+ public static final class Telephony.CarrierId implements android.provider.BaseColumns {
method public static android.net.Uri getUriForSubscriptionId(int);
- field public static final java.lang.String CID = "carrier_id";
+ field public static final java.lang.String CARRIER_ID = "carrier_id";
+ field public static final java.lang.String CARRIER_NAME = "carrier_name";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String NAME = "carrier_name";
}
public static final class Telephony.Carriers implements android.provider.BaseColumns {
diff --git a/cmds/incident_helper/src/ih_util.cpp b/cmds/incident_helper/src/ih_util.cpp
index 847b26a..5b413e9 100644
--- a/cmds/incident_helper/src/ih_util.cpp
+++ b/cmds/incident_helper/src/ih_util.cpp
@@ -440,7 +440,7 @@
Message::startSession(ProtoOutputStream* proto, const string& name)
{
uint64_t fieldId = mTable->mFields[name];
- long long token = proto->start(fieldId);
+ uint64_t token = proto->start(fieldId);
mPreviousField = name;
mTokens.push(token);
}
diff --git a/cmds/incident_helper/src/ih_util.h b/cmds/incident_helper/src/ih_util.h
index 53f4438..c4eda4a 100644
--- a/cmds/incident_helper/src/ih_util.h
+++ b/cmds/incident_helper/src/ih_util.h
@@ -194,7 +194,7 @@
private:
Table* mTable;
std::string mPreviousField;
- stack<long long> mTokens;
+ stack<uint64_t> mTokens;
map<std::string, Message*> mSubMessages;
};
diff --git a/cmds/incident_helper/src/parsers/CpuFreqParser.cpp b/cmds/incident_helper/src/parsers/CpuFreqParser.cpp
index fde17bd..43a12f6 100644
--- a/cmds/incident_helper/src/parsers/CpuFreqParser.cpp
+++ b/cmds/incident_helper/src/parsers/CpuFreqParser.cpp
@@ -65,10 +65,10 @@
proto.write(CpuFreqProto::JIFFY_HZ, (int)jiffyHz);
for (int i=0; i<numCpus; i++) {
- long long token = proto.start(CpuFreqProto::CPU_FREQS);
+ uint64_t token = proto.start(CpuFreqProto::CPU_FREQS);
proto.write(CpuFreqProto::Stats::CPU_NAME, header[i+1]);
for (vector<pair<int, long long>>::iterator it = cpucores[i].begin(); it != cpucores[i].end(); it++) {
- long long stateToken = proto.start(CpuFreqProto::Stats::TIMES);
+ uint64_t stateToken = proto.start(CpuFreqProto::Stats::TIMES);
proto.write(CpuFreqProto::Stats::TimeInState::STATE_KHZ, it->first);
proto.write(CpuFreqProto::Stats::TimeInState::TIME_JIFFY, it->second);
proto.end(stateToken);
diff --git a/cmds/incident_helper/src/parsers/CpuInfoParser.cpp b/cmds/incident_helper/src/parsers/CpuInfoParser.cpp
index b2b431c..eed68b9 100644
--- a/cmds/incident_helper/src/parsers/CpuInfoParser.cpp
+++ b/cmds/incident_helper/src/parsers/CpuInfoParser.cpp
@@ -28,7 +28,7 @@
const int count, const char* names[], const uint64_t ids[])
{
record_t record = parseRecord(line, delimiter);
- long long token = proto->start(fieldId);
+ uint64_t token = proto->start(fieldId);
for (int i=0; i<(int)record.size(); i++) {
for (int j=0; j<count; j++) {
if (stripSuffix(&record[i], names[j], true)) {
@@ -138,7 +138,7 @@
continue;
}
- long long token = proto.start(CpuInfoProto::TASKS);
+ uint64_t token = proto.start(CpuInfoProto::TASKS);
for (int i=0; i<(int)record.size(); i++) {
if (!table.insertField(&proto, header[i], record[i])) {
fprintf(stderr, "[%s]Line %d fails to insert field %s with value %s\n",
diff --git a/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp b/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp
index 73e37bd..4fd6b06 100644
--- a/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp
+++ b/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp
@@ -41,7 +41,7 @@
continue;
}
- long long token = proto.start(EventLogTagMapProto::EVENT_LOG_TAGS);
+ uint64_t token = proto.start(EventLogTagMapProto::EVENT_LOG_TAGS);
proto.write(EventLogTag::TAG_NUMBER, toInt(tagNumber));
proto.write(EventLogTag::TAG_NAME, tagName);
@@ -52,7 +52,7 @@
// If the parts doesn't contains pipe, then skips it.
continue;
}
- long long descriptorToken = proto.start(EventLogTag::VALUE_DESCRIPTORS);
+ uint64_t descriptorToken = proto.start(EventLogTag::VALUE_DESCRIPTORS);
proto.write(EventLogTag::ValueDescriptor::NAME, valueDescriptor[0]);
proto.write(EventLogTag::ValueDescriptor::TYPE, toInt(valueDescriptor[1]));
if (valueDescriptor.size() == 3) {
diff --git a/cmds/incident_helper/src/parsers/KernelWakesParser.cpp b/cmds/incident_helper/src/parsers/KernelWakesParser.cpp
index 28816ea..85beaf0 100644
--- a/cmds/incident_helper/src/parsers/KernelWakesParser.cpp
+++ b/cmds/incident_helper/src/parsers/KernelWakesParser.cpp
@@ -59,7 +59,7 @@
continue;
}
- long long token = proto.start(KernelWakeSourcesProto::WAKEUP_SOURCES);
+ uint64_t token = proto.start(KernelWakeSourcesProto::WAKEUP_SOURCES);
for (int i=0; i<(int)record.size(); i++) {
if (!table.insertField(&proto, header[i], record[i])) {
fprintf(stderr, "[%s]Line %d has bad value %s of %s\n",
diff --git a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp
index ab4382a..0615c74 100644
--- a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp
+++ b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp
@@ -64,7 +64,7 @@
record_t record = parseRecord(line, COMMA_DELIMITER);
if (migrateTypeSession && record.size() == 3) {
- long long token = proto.start(PageTypeInfoProto::MIGRATE_TYPES);
+ uint64_t token = proto.start(PageTypeInfoProto::MIGRATE_TYPES);
// expect part 0 starts with "Node"
if (stripPrefix(&record[0], "Node")) {
proto.write(PageTypeInfoProto::MigrateType::NODE, toInt(record[0]));
@@ -93,7 +93,7 @@
proto.end(token);
} else if (!blockHeader.empty() && record.size() == 2) {
- long long token = proto.start(PageTypeInfoProto::BLOCKS);
+ uint64_t token = proto.start(PageTypeInfoProto::BLOCKS);
if (stripPrefix(&record[0], "Node")) {
proto.write(PageTypeInfoProto::Block::NODE, toInt(record[0]));
} else return BAD_VALUE;
diff --git a/cmds/incident_helper/src/parsers/ProcrankParser.cpp b/cmds/incident_helper/src/parsers/ProcrankParser.cpp
index c1c458e..4763b48 100644
--- a/cmds/incident_helper/src/parsers/ProcrankParser.cpp
+++ b/cmds/incident_helper/src/parsers/ProcrankParser.cpp
@@ -66,7 +66,7 @@
continue;
}
- long long token = proto.start(ProcrankProto::PROCESSES);
+ uint64_t token = proto.start(ProcrankProto::PROCESSES);
for (int i=0; i<(int)record.size(); i++) {
if (!table.insertField(&proto, header[i], record[i])) {
fprintf(stderr, "[%s]Line %d has bad value %s of %s\n",
@@ -77,22 +77,22 @@
}
// add summary
- long long token = proto.start(ProcrankProto::SUMMARY);
+ uint64_t token = proto.start(ProcrankProto::SUMMARY);
if (!total.empty()) {
record = parseRecord(total);
- long long token = proto.start(ProcrankProto::Summary::TOTAL);
+ uint64_t token = proto.start(ProcrankProto::Summary::TOTAL);
for (int i=(int)record.size(); i>0; i--) {
table.insertField(&proto, header[header.size() - i].c_str(), record[record.size() - i].c_str());
}
proto.end(token);
}
if (!zram.empty()) {
- long long token = proto.start(ProcrankProto::Summary::ZRAM);
+ uint64_t token = proto.start(ProcrankProto::Summary::ZRAM);
proto.write(ProcrankProto::Summary::Zram::RAW_TEXT, zram);
proto.end(token);
}
if (!ram.empty()) {
- long long token = proto.start(ProcrankProto::Summary::RAM);
+ uint64_t token = proto.start(ProcrankProto::Summary::RAM);
proto.write(ProcrankProto::Summary::Ram::RAW_TEXT, ram);
proto.end(token);
}
diff --git a/cmds/incident_helper/src/parsers/PsParser.cpp b/cmds/incident_helper/src/parsers/PsParser.cpp
index 420775f..8d64064 100644
--- a/cmds/incident_helper/src/parsers/PsParser.cpp
+++ b/cmds/incident_helper/src/parsers/PsParser.cpp
@@ -71,7 +71,7 @@
continue;
}
- long long token = proto.start(PsProto::PROCESSES);
+ uint64_t token = proto.start(PsProto::PROCESSES);
for (int i=0; i<(int)record.size(); i++) {
if (!table.insertField(&proto, header[i], record[i])) {
fprintf(stderr, "[%s]Line %d has bad value %s of %s\n",
diff --git a/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp b/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp
index 7b0ac0b..eba536b 100644
--- a/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp
+++ b/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp
@@ -207,7 +207,7 @@
sysProp.endSession(&proto);
for (auto it = extras.begin(); it != extras.end(); it++) {
- long long token = proto.start(SystemPropertiesProto::EXTRA_PROPERTIES);
+ uint64_t token = proto.start(SystemPropertiesProto::EXTRA_PROPERTIES);
proto.write(SystemPropertiesProto::Property::NAME, it->first);
proto.write(SystemPropertiesProto::Property::VALUE, it->second);
proto.end(token);
diff --git a/cmds/incidentd/src/PrivacyBuffer.cpp b/cmds/incidentd/src/PrivacyBuffer.cpp
index ee57f4d..73ee1cb 100644
--- a/cmds/incidentd/src/PrivacyBuffer.cpp
+++ b/cmds/incidentd/src/PrivacyBuffer.cpp
@@ -91,7 +91,7 @@
// current field is message type and its sub-fields have extra privacy policies
uint32_t msgSize = mData.readRawVarint();
size_t start = mData.rp()->pos();
- long long token = mProto.start(encode_field_id(policy));
+ uint64_t token = mProto.start(encode_field_id(policy));
while (mData.rp()->pos() - start != msgSize) {
status_t err = stripField(policy, spec, depth + 1);
if (err != NO_ERROR) return err;
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index 334d77c..46243c05 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -735,7 +735,7 @@
lastTimestamp.tv_nsec = msg.entry_v1.nsec;
// format a BinaryLogEntry
- long long token = proto.start(LogProto::BINARY_LOGS);
+ uint64_t token = proto.start(LogProto::BINARY_LOGS);
proto.write(BinaryLogEntry::SEC, msg.entry_v1.sec);
proto.write(BinaryLogEntry::NANOSEC, msg.entry_v1.nsec);
proto.write(BinaryLogEntry::UID, (int)msg.entry_v4.uid);
@@ -745,7 +745,7 @@
get4LE(reinterpret_cast<uint8_t const*>(msg.msg())));
do {
elem = android_log_read_next(context);
- long long elemToken = proto.start(BinaryLogEntry::ELEMS);
+ uint64_t elemToken = proto.start(BinaryLogEntry::ELEMS);
switch (elem.type) {
case EVENT_TYPE_INT:
proto.write(BinaryLogEntry::Elem::TYPE,
@@ -797,7 +797,7 @@
lastTimestamp.tv_nsec = entry.tv_nsec;
// format a TextLogEntry
- long long token = proto.start(LogProto::TEXT_LOGS);
+ uint64_t token = proto.start(LogProto::TEXT_LOGS);
proto.write(TextLogEntry::SEC, (long long)entry.tv_sec);
proto.write(TextLogEntry::NANOSEC, (long long)entry.tv_nsec);
proto.write(TextLogEntry::PRIORITY, (int)entry.priority);
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index e98b54d..3127e94 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -249,14 +249,14 @@
ProtoOutputStream proto;
// Start of ConfigKey.
- long long configKeyToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_CONFIG_KEY);
+ uint64_t configKeyToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_CONFIG_KEY);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID, key.GetUid());
proto.write(FIELD_TYPE_INT64 | FIELD_ID_ID, (long long)key.GetId());
proto.end(configKeyToken);
// End of ConfigKey.
// Start of ConfigMetricsReport (reports).
- long long reportsToken =
+ uint64_t reportsToken =
proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_REPORTS);
int64_t lastReportTimeNs = it->second->getLastReportTimeNs();
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index 22faaa1..d626d90 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -455,7 +455,7 @@
}
void addConfigStatsToProto(const ConfigStats& configStats, ProtoOutputStream* proto) {
- long long token =
+ uint64_t token =
proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_CONFIG_STATS);
proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_UID, configStats.uid);
proto->write(FIELD_TYPE_INT64 | FIELD_ID_CONFIG_STATS_ID, (long long)configStats.id);
@@ -487,7 +487,7 @@
}
for (const auto& pair : configStats.matcher_stats) {
- long long tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+ uint64_t tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
FIELD_ID_CONFIG_STATS_MATCHER_STATS);
proto->write(FIELD_TYPE_INT64 | FIELD_ID_MATCHER_STATS_ID, (long long)pair.first);
proto->write(FIELD_TYPE_INT32 | FIELD_ID_MATCHER_STATS_COUNT, pair.second);
@@ -495,7 +495,7 @@
}
for (const auto& pair : configStats.condition_stats) {
- long long tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+ uint64_t tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
FIELD_ID_CONFIG_STATS_CONDITION_STATS);
proto->write(FIELD_TYPE_INT64 | FIELD_ID_CONDITION_STATS_ID, (long long)pair.first);
proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONDITION_STATS_COUNT, pair.second);
@@ -503,7 +503,7 @@
}
for (const auto& pair : configStats.metric_stats) {
- long long tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+ uint64_t tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
FIELD_ID_CONFIG_STATS_METRIC_STATS);
proto->write(FIELD_TYPE_INT64 | FIELD_ID_METRIC_STATS_ID, (long long)pair.first);
proto->write(FIELD_TYPE_INT32 | FIELD_ID_METRIC_STATS_COUNT, pair.second);
@@ -511,7 +511,7 @@
}
for (const auto& pair : configStats.alert_stats) {
- long long tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+ uint64_t tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
FIELD_ID_CONFIG_STATS_ALERT_STATS);
proto->write(FIELD_TYPE_INT64 | FIELD_ID_ALERT_STATS_ID, (long long)pair.first);
proto->write(FIELD_TYPE_INT32 | FIELD_ID_ALERT_STATS_COUNT, pair.second);
@@ -539,7 +539,7 @@
const size_t atomCounts = mPushedAtomStats.size();
for (size_t i = 2; i < atomCounts; i++) {
if (mPushedAtomStats[i] > 0) {
- long long token =
+ uint64_t token =
proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOM_STATS | FIELD_COUNT_REPEATED);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_TAG, (int32_t)i);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_COUNT, mPushedAtomStats[i]);
@@ -552,20 +552,20 @@
}
if (mAnomalyAlarmRegisteredStats > 0) {
- long long token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ANOMALY_ALARM_STATS);
+ uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ANOMALY_ALARM_STATS);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_ANOMALY_ALARMS_REGISTERED,
mAnomalyAlarmRegisteredStats);
proto.end(token);
}
if (mPeriodicAlarmRegisteredStats > 0) {
- long long token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_SUBSCRIBER_ALARM_STATS);
+ uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_SUBSCRIBER_ALARM_STATS);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_SUBSCRIBER_ALARMS_REGISTERED,
mPeriodicAlarmRegisteredStats);
proto.end(token);
}
- long long uidMapToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_UIDMAP_STATS);
+ uint64_t uidMapToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_UIDMAP_STATS);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_SNAPSHOTS, mUidMapStats.snapshots);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_CHANGES, mUidMapStats.changes);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_BYTES_USED, mUidMapStats.bytes_used);
@@ -575,7 +575,7 @@
proto.end(uidMapToken);
for (const auto& error : mLoggerErrors) {
- long long token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_LOGGER_ERROR_STATS |
+ uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_LOGGER_ERROR_STATS |
FIELD_COUNT_REPEATED);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOGGER_STATS_TIME, error.first);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOGGER_STATS_ERROR_CODE, error.second);
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp
index 671c57f..da5ef44 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp
@@ -109,23 +109,23 @@
return;
}
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_ID, (long long)mMetricId);
- long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_COUNT_METRICS);
+ uint64_t protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_COUNT_METRICS);
for (const auto& counter : mPastBuckets) {
const MetricDimensionKey& dimensionKey = counter.first;
VLOG(" dimension key %s", dimensionKey.c_str());
- long long wrapperToken =
+ uint64_t wrapperToken =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
// First fill dimension.
- long long dimensionInWhatToken = protoOutput->start(
+ uint64_t dimensionInWhatToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_WHAT);
writeDimensionToProto(dimensionKey.getDimensionKeyInWhat(), protoOutput);
protoOutput->end(dimensionInWhatToken);
if (dimensionKey.hasDimensionKeyInCondition()) {
- long long dimensionInConditionToken = protoOutput->start(
+ uint64_t dimensionInConditionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_CONDITION);
writeDimensionToProto(dimensionKey.getDimensionKeyInCondition(), protoOutput);
protoOutput->end(dimensionInConditionToken);
@@ -134,7 +134,7 @@
// Then fill bucket_info (CountBucketInfo).
for (const auto& bucket : counter.second) {
- long long bucketInfoToken = protoOutput->start(
+ uint64_t bucketInfoToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_BUCKET_INFO);
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_BUCKET_ELAPSED_NANOS,
(long long)bucket.mBucketStartNs);
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
index ac39662..29a892d 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
@@ -235,7 +235,7 @@
}
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_ID, (long long)mMetricId);
- long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_DURATION_METRICS);
+ uint64_t protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_DURATION_METRICS);
VLOG("Duration metric %lld dump report now...", (long long)mMetricId);
@@ -243,17 +243,17 @@
const MetricDimensionKey& dimensionKey = pair.first;
VLOG(" dimension key %s", dimensionKey.c_str());
- long long wrapperToken =
+ uint64_t wrapperToken =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
// First fill dimension.
- long long dimensionToken = protoOutput->start(
+ uint64_t dimensionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_WHAT);
writeDimensionToProto(dimensionKey.getDimensionKeyInWhat(), protoOutput);
protoOutput->end(dimensionToken);
if (dimensionKey.hasDimensionKeyInCondition()) {
- long long dimensionInConditionToken = protoOutput->start(
+ uint64_t dimensionInConditionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_CONDITION);
writeDimensionToProto(dimensionKey.getDimensionKeyInCondition(), protoOutput);
protoOutput->end(dimensionInConditionToken);
@@ -261,7 +261,7 @@
// Then fill bucket_info (DurationBucketInfo).
for (const auto& bucket : pair.second) {
- long long bucketInfoToken = protoOutput->start(
+ uint64_t bucketInfoToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_BUCKET_INFO);
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_BUCKET_ELAPSED_NANOS,
(long long)bucket.mBucketStartNs);
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp
index fff91f6..778eb8e 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp
@@ -131,7 +131,7 @@
return;
}
- long long wrapperToken =
+ uint64_t wrapperToken =
mProto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
const bool truncateTimestamp =
android::util::kNotTruncatingTimestampAtomWhiteList.find(event.GetTagId()) ==
@@ -148,7 +148,7 @@
(long long)getWallClockNs());
}
- long long eventToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOMS);
+ uint64_t eventToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOMS);
event.ToProto(*mProto);
mProto->end(eventToken);
mProto->end(wrapperToken);
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index 000c7a7..288f563c 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -135,23 +135,23 @@
}
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_ID, (long long)mMetricId);
- long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_GAUGE_METRICS);
+ uint64_t protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_GAUGE_METRICS);
for (const auto& pair : mPastBuckets) {
const MetricDimensionKey& dimensionKey = pair.first;
VLOG(" dimension key %s", dimensionKey.c_str());
- long long wrapperToken =
+ uint64_t wrapperToken =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
// First fill dimension.
- long long dimensionToken = protoOutput->start(
+ uint64_t dimensionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_WHAT);
writeDimensionToProto(dimensionKey.getDimensionKeyInWhat(), protoOutput);
protoOutput->end(dimensionToken);
if (dimensionKey.hasDimensionKeyInCondition()) {
- long long dimensionInConditionToken = protoOutput->start(
+ uint64_t dimensionInConditionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_CONDITION);
writeDimensionToProto(dimensionKey.getDimensionKeyInCondition(), protoOutput);
protoOutput->end(dimensionInConditionToken);
@@ -159,7 +159,7 @@
// Then fill bucket_info (GaugeBucketInfo).
for (const auto& bucket : pair.second) {
- long long bucketInfoToken = protoOutput->start(
+ uint64_t bucketInfoToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_BUCKET_INFO);
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_BUCKET_ELAPSED_NANOS,
(long long)bucket.mBucketStartNs);
@@ -167,7 +167,7 @@
(long long)bucket.mBucketEndNs);
if (!bucket.mGaugeAtoms.empty()) {
- long long atomsToken =
+ uint64_t atomsToken =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ATOM);
for (const auto& atom : bucket.mGaugeAtoms) {
writeFieldValueTreeToStream(mTagId, *(atom.mFields), protoOutput);
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp
index 0301466..1ca59a3 100644
--- a/cmds/statsd/src/metrics/MetricsManager.cpp
+++ b/cmds/statsd/src/metrics/MetricsManager.cpp
@@ -186,7 +186,7 @@
// one StatsLogReport per MetricProduer
for (const auto& producer : mAllMetricProducers) {
if (mNoReportMetricIds.find(producer->getMetricId()) == mNoReportMetricIds.end()) {
- long long token =
+ uint64_t token =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_METRICS);
producer->onDumpReport(dumpTimeStampNs, protoOutput);
protoOutput->end(token);
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index f6bba3d..e88daf7 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -142,21 +142,21 @@
return;
}
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_ID, (long long)mMetricId);
- long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_VALUE_METRICS);
+ uint64_t protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_VALUE_METRICS);
for (const auto& pair : mPastBuckets) {
const MetricDimensionKey& dimensionKey = pair.first;
VLOG(" dimension key %s", dimensionKey.c_str());
- long long wrapperToken =
+ uint64_t wrapperToken =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
// First fill dimension.
- long long dimensionToken = protoOutput->start(
+ uint64_t dimensionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_WHAT);
writeDimensionToProto(dimensionKey.getDimensionKeyInWhat(), protoOutput);
protoOutput->end(dimensionToken);
if (dimensionKey.hasDimensionKeyInCondition()) {
- long long dimensionInConditionToken = protoOutput->start(
+ uint64_t dimensionInConditionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_CONDITION);
writeDimensionToProto(dimensionKey.getDimensionKeyInCondition(), protoOutput);
protoOutput->end(dimensionInConditionToken);
@@ -164,7 +164,7 @@
// Then fill bucket_info (ValueBucketInfo).
for (const auto& bucket : pair.second) {
- long long bucketInfoToken = protoOutput->start(
+ uint64_t bucketInfoToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_BUCKET_INFO);
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_BUCKET_NANOS,
(long long)bucket.mBucketStartNs);
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index 78ebe33..cab61e9 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -70,7 +70,7 @@
}
if (depth == valueDepth && valuePrefix == prefix) {
- long long token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+ uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
DIMENSIONS_VALUE_TUPLE_VALUE);
protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, fieldNum);
switch (dim.mValue.getType()) {
@@ -99,10 +99,10 @@
(*index)++;
} else if (valueDepth > depth && valuePrefix == prefix) {
// Writing the sub tree
- long long dimensionToken = protoOutput->start(
+ uint64_t dimensionToken = protoOutput->start(
FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | DIMENSIONS_VALUE_TUPLE_VALUE);
protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD, fieldNum);
- long long tupleToken =
+ uint64_t tupleToken =
protoOutput->start(FIELD_TYPE_MESSAGE | DIMENSIONS_VALUE_VALUE_TUPLE);
writeDimensionToProtoHelper(dims, index, valueDepth, dim.mField.getPrefix(valueDepth),
protoOutput);
@@ -123,7 +123,7 @@
}
protoOutput->write(FIELD_TYPE_INT32 | DIMENSIONS_VALUE_FIELD,
dimension.getValues()[0].mField.getTag());
- long long topToken = protoOutput->start(FIELD_TYPE_MESSAGE | DIMENSIONS_VALUE_VALUE_TUPLE);
+ uint64_t topToken = protoOutput->start(FIELD_TYPE_MESSAGE | DIMENSIONS_VALUE_VALUE_TUPLE);
size_t index = 0;
writeDimensionToProtoHelper(dimension.getValues(), &index, 0, 0, protoOutput);
protoOutput->end(topToken);
@@ -189,7 +189,7 @@
(*index)++;
} else if (valueDepth > depth && valuePrefix == prefix) {
// Writing the sub tree
- long long msg_token = 0;
+ uint64_t msg_token = 0ULL;
if (valueDepth == depth + 2) {
msg_token =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | fieldNum);
@@ -212,7 +212,7 @@
void writeFieldValueTreeToStream(int tagId, const std::vector<FieldValue>& values,
util::ProtoOutputStream* protoOutput) {
- long long atomToken = protoOutput->start(FIELD_TYPE_MESSAGE | tagId);
+ uint64_t atomToken = protoOutput->start(FIELD_TYPE_MESSAGE | tagId);
size_t index = 0;
writeFieldValueTreeToStreamHelper(values, &index, 0, 0, protoOutput);
@@ -257,7 +257,7 @@
void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats>& pair,
util::ProtoOutputStream* protoOutput) {
- long long token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_PULLED_ATOM_STATS |
+ uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_PULLED_ATOM_STATS |
FIELD_COUNT_REPEATED);
protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_PULL_ATOM_ID, (int32_t)pair.first);
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_TOTAL_PULL, (long long)pair.second.totalPull);
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index fb4d3b8..9528ff1 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -33,6 +33,7 @@
Landroid/app/Activity;->mFragments:Landroid/app/FragmentController;
Landroid/app/Activity;->mHandler:Landroid/os/Handler;
Landroid/app/Activity;->mInstrumentation:Landroid/app/Instrumentation;
+Landroid/app/Activity;->mMainThread:Landroid/app/ActivityThread;
Landroid/app/Activity;->mReferrer:Ljava/lang/String;
Landroid/app/Activity;->mResultCode:I
Landroid/app/Activity;->mResultData:Landroid/content/Intent;
@@ -76,6 +77,7 @@
Landroid/app/ActivityThread;->getPackageManager()Landroid/content/pm/IPackageManager;
Landroid/app/ActivityThread;->getProcessName()Ljava/lang/String;
Landroid/app/ActivityThread;->getSystemContext()Landroid/app/ContextImpl;
+Landroid/app/ActivityThread;->handleBindApplication(Landroid/app/ActivityThread$AppBindData;)V
Landroid/app/ActivityThread$H;->BIND_SERVICE:I
Landroid/app/ActivityThread$H;->CREATE_SERVICE:I
Landroid/app/ActivityThread$H;->DUMP_PROVIDER:I
@@ -97,6 +99,7 @@
Landroid/app/ActivityThread;->mInitialApplication:Landroid/app/Application;
Landroid/app/ActivityThread;->mInstrumentation:Landroid/app/Instrumentation;
Landroid/app/ActivityThread;->mLocalProvidersByName:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mLocalProviders:Landroid/util/ArrayMap;
Landroid/app/ActivityThread;->mNumVisibleActivities:I
Landroid/app/ActivityThread;->mPackages:Landroid/util/ArrayMap;
Landroid/app/ActivityThread;->mProviderMap:Landroid/util/ArrayMap;
@@ -244,6 +247,7 @@
Landroid/app/DownloadManager$Request;->mUri:Landroid/net/Uri;
Landroid/app/FragmentManagerImpl;->mAdded:Ljava/util/ArrayList;
Landroid/app/Fragment;->mChildFragmentManager:Landroid/app/FragmentManagerImpl;
+Landroid/app/Fragment;->mWho:Ljava/lang/String;
Landroid/app/IActivityManager;->bindService(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I
Landroid/app/IActivityManager;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
Landroid/app/IActivityManager;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V
@@ -313,6 +317,7 @@
Landroid/app/NotificationManager;->getService()Landroid/app/INotificationManager;
Landroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V
Landroid/app/NotificationManager;->sService:Landroid/app/INotificationManager;
+Landroid/app/Notification;->mGroupKey:Ljava/lang/String;
Landroid/app/Notification;->mLargeIcon:Landroid/graphics/drawable/Icon;
Landroid/app/Notification;->mSmallIcon:Landroid/graphics/drawable/Icon;
Landroid/app/Notification;->setLatestEventInfo(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V
@@ -345,6 +350,7 @@
Landroid/app/StatusBarManager;->getService()Lcom/android/internal/statusbar/IStatusBarService;
Landroid/app/TimePickerDialog;->mTimePicker:Landroid/widget/TimePicker;
Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/usage/UsageStatsManager;->getAppStandbyBucket(Ljava/lang/String;)I
Landroid/app/usage/UsageStatsManager;->getAppStandbyBuckets()Ljava/util/Map;
Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager;
Landroid/app/usage/UsageStatsManager;->setAppStandbyBuckets(Ljava/util/Map;)V
@@ -360,6 +366,7 @@
Landroid/appwidget/AppWidgetManager;->bindAppWidgetIdIfAllowed(IILandroid/content/ComponentName;Landroid/os/Bundle;)Z
Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;Landroid/os/Bundle;)V
Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;)V
+Landroid/appwidget/AppWidgetManager;->mService:Lcom/android/internal/appwidget/IAppWidgetService;
Landroid/bluetooth/BluetoothA2dp;->connect(Landroid/bluetooth/BluetoothDevice;)Z
Landroid/bluetooth/BluetoothAdapter;->disableBLE()Z
Landroid/bluetooth/BluetoothAdapter;->disable(Z)Z
@@ -387,6 +394,7 @@
Landroid/bluetooth/BluetoothHeadset;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
Landroid/bluetooth/BluetoothUuid;->RESERVED_UUIDS:[Landroid/os/ParcelUuid;
Landroid/bluetooth/IBluetooth;->getAddress()Ljava/lang/String;
+Landroid/bluetooth/IBluetoothManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/bluetooth/IBluetooth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetooth;
Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAddress()Ljava/lang/String;
Landroid/bluetooth/le/BluetoothLeScanner;->startScanFromSource(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/os/WorkSource;Landroid/bluetooth/le/ScanCallback;)V
@@ -429,6 +437,7 @@
Landroid/content/CursorLoader;->mCancellationSignal:Landroid/os/CancellationSignal;
Landroid/content/CursorLoader;->mObserver:Landroid/content/Loader$ForceLoadContentObserver;
Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard;
+Landroid/content/IClipboard$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/IContentProvider;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
Landroid/content/IContentService;->cancelSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)V
Landroid/content/IContentService;->getMasterSyncAutomatically()Z
@@ -439,6 +448,7 @@
Landroid/content/IntentFilter;->mActions:Ljava/util/ArrayList;
Landroid/content/IntentFilter;->setOrder(I)V
Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/IBinder;)Landroid/content/Intent;
+Landroid/content/pm/ActivityInfo;->resizeMode:I
Landroid/content/pm/ApplicationInfo;->enabledSetting:I
Landroid/content/pm/ApplicationInfo;->getBaseResourcePath()Ljava/lang/String;
Landroid/content/pm/ApplicationInfo;->installLocation:I
@@ -585,6 +595,7 @@
Landroid/content/res/TypedArray;->mXml:Landroid/content/res/XmlBlock$Parser;
Landroid/content/res/XmlBlock;-><init>([B)V
Landroid/content/res/XmlBlock;->newParser()Landroid/content/res/XmlResourceParser;
+Landroid/content/res/XmlBlock$Parser;->mBlock:Landroid/content/res/XmlBlock;
Landroid/content/res/XmlBlock$Parser;->mParseState:J
Landroid/content/SyncStatusInfo;->lastSuccessTime:J
Landroid/database/AbstractCursor;->mExtras:Landroid/os/Bundle;
@@ -625,20 +636,42 @@
Landroid/graphics/Canvas;-><init>(J)V
Landroid/graphics/Canvas;->release()V
Landroid/graphics/drawable/AnimatedImageDrawable;->onAnimationEnd()V
+Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mStateIds:Landroid/util/SparseIntArray;
+Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mTransitions:Landroid/util/LongSparseLongArray;
+Landroid/graphics/drawable/AnimatedStateListDrawable;->mState:Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;
Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->callOnFinished(Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V
Landroid/graphics/drawable/AnimationDrawable;->mCurFrame:I
+Landroid/graphics/drawable/BitmapDrawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/BitmapDrawable;->getTint()Landroid/content/res/ColorStateList;
Landroid/graphics/drawable/BitmapDrawable;->getTintMode()Landroid/graphics/PorterDuff$Mode;
Landroid/graphics/drawable/BitmapDrawable;->setBitmap(Landroid/graphics/Bitmap;)V
Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mConstantPadding:Landroid/graphics/Rect;
Landroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/DrawableContainer;->mDrawableContainerState:Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
+Landroid/graphics/drawable/Drawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/Drawable;->inflateWithAttributes(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/TypedArray;I)V
Landroid/graphics/drawable/Drawable;->mCallback:Ljava/lang/ref/WeakReference;
Landroid/graphics/drawable/GradientDrawable$GradientState;->mAngle:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradientColors:[I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradient:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mHeight:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mInnerRadius:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mInnerRadiusRatio:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mOrientation:Landroid/graphics/drawable/GradientDrawable$Orientation;
Landroid/graphics/drawable/GradientDrawable$GradientState;->mPadding:Landroid/graphics/Rect;
Landroid/graphics/drawable/GradientDrawable$GradientState;->mPositions:[F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mRadiusArray:[F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mRadius:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mShape:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeDashGap:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeDashWidth:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeWidth:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mThickness:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mThicknessRatio:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mWidth:I
Landroid/graphics/drawable/GradientDrawable;->mPadding:Landroid/graphics/Rect;
+Landroid/graphics/drawable/Icon;->mType:I
+Landroid/graphics/drawable/InsetDrawable;->mState:Landroid/graphics/drawable/InsetDrawable$InsetState;
Landroid/graphics/drawable/NinePatchDrawable;->mNinePatchState:Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;
Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;->mNinePatch:Landroid/graphics/NinePatch;
Landroid/graphics/drawable/StateListDrawable;->extractStateSet(Landroid/util/AttributeSet;)[I
@@ -692,6 +725,7 @@
Landroid/hardware/HardwareBuffer;-><init>(J)V
Landroid/hardware/HardwareBuffer;->mNativeObject:J
Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager;
+Landroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/input/InputManager;->getInstance()Landroid/hardware/input/InputManager;
Landroid/hardware/input/InputManager;->mIm:Landroid/hardware/input/IInputManager;
Landroid/hardware/location/ContextHubInfo;->getId()I
@@ -763,6 +797,7 @@
Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchAdditionalInfoEvent(III[F[I)V
Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchFlushCompleteEvent(I)V
Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchSensorEvent(I[FIJ)V
+Landroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/usb/UsbDeviceConnection;->mNativeContext:J
Landroid/hardware/usb/UsbManager;->setCurrentFunction(Ljava/lang/String;Z)V
Landroid/hardware/usb/UsbRequest;->mNativeContext:J
@@ -798,6 +833,7 @@
Landroid/icu/util/ChineseCalendar;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/icu/util/IslamicCalendar;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/icu/util/SimpleTimeZone;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/inputmethodservice/InputMethodService;->mExtractEditText:Landroid/inputmethodservice/ExtractEditText;
Landroid/location/CountryDetector;->detectCountry()Landroid/location/Country;
Landroid/location/Country;->getCountryIso()Ljava/lang/String;
Landroid/location/Country;->getSource()I
@@ -837,6 +873,7 @@
Landroid/media/AudioHandle;-><init>(I)V
Landroid/media/AudioHandle;->mId:I
Landroid/media/AudioManager;->abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/media/AudioAttributes;)I
+Landroid/media/AudioManager;->getOutputLatency(I)I
Landroid/media/AudioManager;->getService()Landroid/media/IAudioService;
Landroid/media/AudioManager;->mAudioFocusIdListenerMap:Ljava/util/concurrent/ConcurrentHashMap;
Landroid/media/AudioManager;->registerAudioPolicy(Landroid/media/audiopolicy/AudioPolicy;)I
@@ -907,6 +944,7 @@
Landroid/media/AudioTrack;->mStreamType:I
Landroid/media/AudioTrack;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService;
+Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/media/JetPlayer;->mNativePlayerInJavaObj:J
Landroid/media/JetPlayer;->postEventFromNative(Ljava/lang/Object;III)V
Landroid/media/MediaCodec;->releaseOutputBuffer(IZZJ)V
@@ -921,6 +959,8 @@
Landroid/media/MediaFile$MediaFileType;->fileType:I
Landroid/media/MediaFile$MediaFileType;->mimeType:Ljava/lang/String;
Landroid/media/MediaFile;->sFileTypeMap:Ljava/util/HashMap;
+Landroid/media/MediaFormat;->getMap()Ljava/util/Map;
+Landroid/media/MediaHTTPService;->createHttpServiceBinderIfNecessary(Ljava/lang/String;)Landroid/os/IBinder;
Landroid/media/MediaMetadataRetriever;->getEmbeddedPicture(I)[B
Landroid/media/MediaPlayer;->getMetadata(ZZ)Landroid/media/Metadata;
Landroid/media/MediaPlayer;->invoke(Landroid/os/Parcel;Landroid/os/Parcel;)V
@@ -957,6 +997,8 @@
Landroid/media/RemoteDisplay;->notifyDisplayError(I)V
Landroid/media/RingtoneManager;->getRingtone(Landroid/content/Context;Landroid/net/Uri;I)Landroid/media/Ringtone;
Landroid/media/session/MediaSessionLegacyHelper;->getHelper(Landroid/content/Context;)Landroid/media/session/MediaSessionLegacyHelper;
+Landroid/media/soundtrigger/SoundTriggerManager;->stopRecognition(Ljava/util/UUID;)I
+Landroid/media/soundtrigger/SoundTriggerManager;->unloadSoundModel(Ljava/util/UUID;)I
Landroid/media/SubtitleController;->mHandler:Landroid/os/Handler;
Landroid/media/ThumbnailUtils;->createImageThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;
Landroid/media/ToneGenerator;->mNativeContext:J
@@ -1020,9 +1062,12 @@
Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/lang/String;
Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String;
+Landroid/net/IpConfiguration;->httpProxy:Landroid/net/ProxyInfo;
Landroid/net/LinkProperties;->setHttpProxy(Landroid/net/ProxyInfo;)V
Landroid/net/LocalSocketImpl;->inboundFileDescriptors:[Ljava/io/FileDescriptor;
Landroid/net/LocalSocketImpl;->outboundFileDescriptors:[Ljava/io/FileDescriptor;
+Landroid/net/NetworkCapabilities;->getCapabilities()[I
+Landroid/net/NetworkCapabilities;->getTransportTypes()[I
Landroid/net/NetworkKey;-><init>(Landroid/net/WifiKey;)V
Landroid/net/NetworkPolicyManager;->mService:Landroid/net/INetworkPolicyManager;
Landroid/net/NetworkRecommendationProvider;-><init>(Landroid/content/Context;Ljava/util/concurrent/Executor;)V
@@ -1187,6 +1232,7 @@
Landroid/os/Bundle;->putIBinder(Ljava/lang/String;Landroid/os/IBinder;)V
Landroid/os/Debug;->countInstancesOfClass(Ljava/lang/Class;)J
Landroid/os/Debug;->dumpReferenceTables()V
+Landroid/os/Debug;-><init>()V
Landroid/os/Debug$MemoryInfo;->dalvikPrivateClean:I
Landroid/os/Debug$MemoryInfo;->dalvikRss:I
Landroid/os/Debug$MemoryInfo;->dalvikSharedClean:I
@@ -1231,7 +1277,9 @@
Landroid/os/Handler;->hasCallbacks(Ljava/lang/Runnable;)Z
Landroid/os/Handler;->mCallback:Landroid/os/Handler$Callback;
Landroid/os/Handler;->mMessenger:Landroid/os/IMessenger;
+Landroid/os/HwBlob;-><init>(I)V
Landroid/os/HwParcel;-><init>(Z)V
+Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/os/IPermissionController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPermissionController;
Landroid/os/IPermissionController$Stub$Proxy;->checkPermission(Ljava/lang/String;II)Z
Landroid/os/IPowerManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPowerManager;
@@ -1275,7 +1323,6 @@
Landroid/os/Process;->getTotalMemory()J
Landroid/os/Process;->getUidForPid(I)I
Landroid/os/Process;->isIsolated(I)Z
-Landroid/os/Process;->isIsolated()Z
Landroid/os/Process;->readProcFile(Ljava/lang/String;[I[Ljava/lang/String;[J[F)Z
Landroid/os/Process;->readProcLines(Ljava/lang/String;[Ljava/lang/String;[J)V
Landroid/os/RecoverySystem;->cancelScheduledUpdate(Landroid/content/Context;)V
@@ -1387,12 +1434,14 @@
Landroid/os/VintfObject;->report()[Ljava/lang/String;
Landroid/os/WorkSource;->add(ILjava/lang/String;)Z
Landroid/os/WorkSource;->add(I)Z
+Landroid/os/WorkSource;->createWorkChain()Landroid/os/WorkSource$WorkChain;
Landroid/os/WorkSource;->get(I)I
Landroid/os/WorkSource;->getName(I)Ljava/lang/String;
Landroid/os/WorkSource;->mNames:[Ljava/lang/String;
Landroid/os/WorkSource;->mNum:I
Landroid/os/WorkSource;->mUids:[I
Landroid/os/WorkSource;->size()I
+Landroid/os/WorkSource$WorkChain;->addNode(ILjava/lang/String;)Landroid/os/WorkSource$WorkChain;
Landroid/preference/DialogPreference;->mBuilder:Landroid/app/AlertDialog$Builder;
Landroid/preference/DialogPreference;->mDialogIcon:Landroid/graphics/drawable/Drawable;
Landroid/preference/DialogPreference;->mDialog:Landroid/app/Dialog;
@@ -1412,6 +1461,7 @@
Landroid/preference/PreferenceManager;->inflateFromIntent(Landroid/content/Intent;Landroid/preference/PreferenceScreen;)Landroid/preference/PreferenceScreen;
Landroid/preference/PreferenceManager;->inflateFromResource(Landroid/content/Context;ILandroid/preference/PreferenceScreen;)Landroid/preference/PreferenceScreen;
Landroid/preference/PreferenceManager;-><init>(Landroid/app/Activity;I)V
+Landroid/preference/PreferenceManager;-><init>(Landroid/content/Context;)V
Landroid/preference/PreferenceManager;->mActivityDestroyListeners:Ljava/util/List;
Landroid/preference/PreferenceManager;->mOnPreferenceTreeClickListener:Landroid/preference/PreferenceManager$OnPreferenceTreeClickListener;
Landroid/preference/PreferenceManager;->mSharedPreferences:Landroid/content/SharedPreferences;
@@ -1445,6 +1495,7 @@
Landroid/provider/Settings$Secure;->ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:Ljava/lang/String;
Landroid/provider/Settings$Secure;->ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED:Ljava/lang/String;
Landroid/provider/Settings$Secure;->ACCESSIBILITY_LARGE_POINTER_ICON:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->ENABLED_NOTIFICATION_LISTENERS:Ljava/lang/String;
Landroid/provider/Settings$Secure;->INCALL_POWER_BUTTON_BEHAVIOR:Ljava/lang/String;
Landroid/provider/Settings$Secure;->LONG_PRESS_TIMEOUT:Ljava/lang/String;
Landroid/provider/Settings$Secure;->PACKAGE_VERIFIER_USER_CONSENT:Ljava/lang/String;
@@ -1468,10 +1519,201 @@
Landroid/renderscript/RenderScript;->create(Landroid/content/Context;I)Landroid/renderscript/RenderScript;
Landroid/renderscript/RenderScript;->create(Landroid/content/Context;ILandroid/renderscript/RenderScript$ContextType;I)Landroid/renderscript/RenderScript;
Landroid/renderscript/RenderScript;->getMinorID()J
+Landroid/R$styleable;->ActionBar_background:I
+Landroid/R$styleable;->ActionBar_backgroundSplit:I
+Landroid/R$styleable;->ActionBar_backgroundStacked:I
+Landroid/R$styleable;->ActionBar_divider:I
+Landroid/R$styleable;->ActionBar:[I
+Landroid/R$styleable;->ActionBar_itemPadding:I
+Landroid/R$styleable;->CalendarView_dateTextAppearance:I
+Landroid/R$styleable;->CalendarView_firstDayOfWeek:I
+Landroid/R$styleable;->CalendarView_focusedMonthDateColor:I
+Landroid/R$styleable;->CalendarView:[I
+Landroid/R$styleable;->CalendarView_selectedDateVerticalBar:I
+Landroid/R$styleable;->CalendarView_selectedWeekBackgroundColor:I
+Landroid/R$styleable;->CalendarView_shownWeekCount:I
+Landroid/R$styleable;->CalendarView_showWeekNumber:I
+Landroid/R$styleable;->CalendarView_unfocusedMonthDateColor:I
+Landroid/R$styleable;->CalendarView_weekDayTextAppearance:I
+Landroid/R$styleable;->CalendarView_weekNumberColor:I
+Landroid/R$styleable;->CalendarView_weekSeparatorLineColor:I
+Landroid/R$styleable;->CheckedTextView_checkMark:I
+Landroid/R$styleable;->CheckedTextView:[I
+Landroid/R$styleable;->CompoundButton_button:I
+Landroid/R$styleable;->CompoundButton:[I
+Landroid/R$styleable;->ImageView_adjustViewBounds:I
+Landroid/R$styleable;->ImageView_baselineAlignBottom:I
+Landroid/R$styleable;->ImageView_cropToPadding:I
+Landroid/R$styleable;->ImageView:[I
+Landroid/R$styleable;->ImageView_maxHeight:I
+Landroid/R$styleable;->ImageView_maxWidth:I
+Landroid/R$styleable;->ImageView_scaleType:I
+Landroid/R$styleable;->ImageView_src:I
+Landroid/R$styleable;->ImageView_tint:I
+Landroid/R$styleable;->LinearLayout_divider:I
+Landroid/R$styleable;->LinearLayout_dividerPadding:I
+Landroid/R$styleable;->LinearLayout:[I
+Landroid/R$styleable;->LinearLayout_showDividers:I
+Landroid/R$styleable;->ListView_dividerHeight:I
+Landroid/R$styleable;->ListView_divider:I
+Landroid/R$styleable;->ListView:[I
+Landroid/R$styleable;->ProgressBar:[I
+Landroid/R$styleable;->ProgressBar_indeterminateDrawable:I
+Landroid/R$styleable;->ProgressBar_indeterminateDuration:I
+Landroid/R$styleable;->ProgressBar_maxHeight:I
+Landroid/R$styleable;->ProgressBar_maxWidth:I
+Landroid/R$styleable;->ProgressBar_minHeight:I
+Landroid/R$styleable;->ProgressBar_minWidth:I
+Landroid/R$styleable;->ProgressBar_progressDrawable:I
+Landroid/R$styleable;->SeekBar:[I
+Landroid/R$styleable;->SeekBar_thumb:I
+Landroid/R$styleable;->SeekBar_thumbOffset:I
+Landroid/R$styleable;->Switch:[I
+Landroid/R$styleable;->Switch_showText:I
+Landroid/R$styleable;->Switch_splitTrack:I
+Landroid/R$styleable;->Switch_switchMinWidth:I
+Landroid/R$styleable;->Switch_switchPadding:I
+Landroid/R$styleable;->Switch_switchTextAppearance:I
+Landroid/R$styleable;->Switch_textOff:I
+Landroid/R$styleable;->Switch_textOn:I
+Landroid/R$styleable;->Switch_thumb:I
+Landroid/R$styleable;->Switch_thumbTextPadding:I
+Landroid/R$styleable;->Switch_track:I
Landroid/R$styleable;->TextAppearance:[I
+Landroid/R$styleable;->TextAppearance_textAllCaps:I
+Landroid/R$styleable;->TextAppearance_textColorHighlight:I
+Landroid/R$styleable;->TextAppearance_textColorHint:I
Landroid/R$styleable;->TextAppearance_textColor:I
+Landroid/R$styleable;->TextAppearance_textColorLink:I
Landroid/R$styleable;->TextAppearance_textSize:I
+Landroid/R$styleable;->TextAppearance_textStyle:I
+Landroid/R$styleable;->TextAppearance_typeface:I
+Landroid/R$styleable;->TextView_autoLink:I
+Landroid/R$styleable;->TextView_autoText:I
+Landroid/R$styleable;->TextView_bufferType:I
+Landroid/R$styleable;->TextView_capitalize:I
+Landroid/R$styleable;->TextView_cursorVisible:I
+Landroid/R$styleable;->TextView_digits:I
+Landroid/R$styleable;->TextView_drawableBottom:I
+Landroid/R$styleable;->TextView_drawableEnd:I
+Landroid/R$styleable;->TextView_drawableLeft:I
+Landroid/R$styleable;->TextView_drawablePadding:I
+Landroid/R$styleable;->TextView_drawableRight:I
+Landroid/R$styleable;->TextView_drawableStart:I
+Landroid/R$styleable;->TextView_drawableTop:I
+Landroid/R$styleable;->TextView_editable:I
+Landroid/R$styleable;->TextView_ellipsize:I
+Landroid/R$styleable;->TextView_ems:I
+Landroid/R$styleable;->TextView_enabled:I
+Landroid/R$styleable;->TextView_freezesText:I
+Landroid/R$styleable;->TextView_gravity:I
+Landroid/R$styleable;->TextView_height:I
+Landroid/R$styleable;->TextView_hint:I
+Landroid/R$styleable;->TextView:[I
+Landroid/R$styleable;->TextView_imeActionId:I
+Landroid/R$styleable;->TextView_imeActionLabel:I
+Landroid/R$styleable;->TextView_imeOptions:I
+Landroid/R$styleable;->TextView_includeFontPadding:I
+Landroid/R$styleable;->TextView_inputMethod:I
+Landroid/R$styleable;->TextView_inputType:I
+Landroid/R$styleable;->TextView_lines:I
+Landroid/R$styleable;->TextView_lineSpacingExtra:I
+Landroid/R$styleable;->TextView_lineSpacingMultiplier:I
+Landroid/R$styleable;->TextView_linksClickable:I
+Landroid/R$styleable;->TextView_marqueeRepeatLimit:I
+Landroid/R$styleable;->TextView_maxEms:I
+Landroid/R$styleable;->TextView_maxHeight:I
+Landroid/R$styleable;->TextView_maxLength:I
+Landroid/R$styleable;->TextView_maxLines:I
+Landroid/R$styleable;->TextView_maxWidth:I
+Landroid/R$styleable;->TextView_minEms:I
+Landroid/R$styleable;->TextView_minHeight:I
+Landroid/R$styleable;->TextView_minLines:I
+Landroid/R$styleable;->TextView_minWidth:I
+Landroid/R$styleable;->TextView_numeric:I
+Landroid/R$styleable;->TextView_password:I
+Landroid/R$styleable;->TextView_phoneNumber:I
+Landroid/R$styleable;->TextView_privateImeOptions:I
+Landroid/R$styleable;->TextView_scrollHorizontally:I
+Landroid/R$styleable;->TextView_selectAllOnFocus:I
+Landroid/R$styleable;->TextView_shadowColor:I
+Landroid/R$styleable;->TextView_shadowDx:I
+Landroid/R$styleable;->TextView_shadowDy:I
+Landroid/R$styleable;->TextView_shadowRadius:I
+Landroid/R$styleable;->TextView_singleLine:I
+Landroid/R$styleable;->TextView_textAllCaps:I
+Landroid/R$styleable;->TextView_textAppearance:I
+Landroid/R$styleable;->TextView_textColorHighlight:I
+Landroid/R$styleable;->TextView_textColorHint:I
+Landroid/R$styleable;->TextView_textColor:I
+Landroid/R$styleable;->TextView_textColorLink:I
+Landroid/R$styleable;->TextView_textCursorDrawable:I
+Landroid/R$styleable;->TextView_text:I
+Landroid/R$styleable;->TextView_textIsSelectable:I
+Landroid/R$styleable;->TextView_textScaleX:I
+Landroid/R$styleable;->TextView_textSelectHandle:I
+Landroid/R$styleable;->TextView_textSelectHandleLeft:I
+Landroid/R$styleable;->TextView_textSelectHandleRight:I
+Landroid/R$styleable;->TextView_textSize:I
+Landroid/R$styleable;->TextView_textStyle:I
+Landroid/R$styleable;->TextView_typeface:I
+Landroid/R$styleable;->TextView_width:I
+Landroid/R$styleable;->View_background:I
+Landroid/R$styleable;->View_clickable:I
+Landroid/R$styleable;->View_contentDescription:I
+Landroid/R$styleable;->ViewDrawableStates:[I
+Landroid/R$styleable;->View_drawingCacheQuality:I
+Landroid/R$styleable;->View_duplicateParentState:I
+Landroid/R$styleable;->View_fadingEdge:I
+Landroid/R$styleable;->View_filterTouchesWhenObscured:I
+Landroid/R$styleable;->View_fitsSystemWindows:I
+Landroid/R$styleable;->View_focusable:I
+Landroid/R$styleable;->View_focusableInTouchMode:I
+Landroid/R$styleable;->View_hapticFeedbackEnabled:I
+Landroid/R$styleable;->View:[I
+Landroid/R$styleable;->View_id:I
+Landroid/R$styleable;->View_isScrollContainer:I
+Landroid/R$styleable;->View_keepScreenOn:I
+Landroid/R$styleable;->View_longClickable:I
+Landroid/R$styleable;->View_minHeight:I
+Landroid/R$styleable;->View_minWidth:I
+Landroid/R$styleable;->View_nextFocusDown:I
+Landroid/R$styleable;->View_nextFocusLeft:I
+Landroid/R$styleable;->View_nextFocusRight:I
+Landroid/R$styleable;->View_nextFocusUp:I
+Landroid/R$styleable;->View_onClick:I
+Landroid/R$styleable;->View_overScrollMode:I
+Landroid/R$styleable;->View_paddingBottom:I
+Landroid/R$styleable;->View_paddingEnd:I
+Landroid/R$styleable;->View_padding:I
+Landroid/R$styleable;->View_paddingLeft:I
+Landroid/R$styleable;->View_paddingRight:I
+Landroid/R$styleable;->View_paddingStart:I
+Landroid/R$styleable;->View_paddingTop:I
+Landroid/R$styleable;->View_saveEnabled:I
+Landroid/R$styleable;->View_scrollbarDefaultDelayBeforeFade:I
+Landroid/R$styleable;->View_scrollbarFadeDuration:I
+Landroid/R$styleable;->View_scrollbars:I
+Landroid/R$styleable;->View_scrollbarSize:I
+Landroid/R$styleable;->View_scrollbarStyle:I
+Landroid/R$styleable;->View_scrollbarThumbHorizontal:I
+Landroid/R$styleable;->View_scrollbarThumbVertical:I
+Landroid/R$styleable;->View_scrollbarTrackHorizontal:I
+Landroid/R$styleable;->View_scrollbarTrackVertical:I
+Landroid/R$styleable;->View_scrollX:I
+Landroid/R$styleable;->View_scrollY:I
+Landroid/R$styleable;->View_soundEffectsEnabled:I
+Landroid/R$styleable;->View_tag:I
+Landroid/R$styleable;->View_visibility:I
+Landroid/R$styleable;->Window:[I
+Landroid/R$styleable;->Window_windowBackground:I
+Landroid/R$styleable;->Window_windowFrame:I
Landroid/security/KeyStore;->getInstance()Landroid/security/KeyStore;
+Landroid/security/keystore/RecoveryController;->getInstance()Landroid/security/keystore/RecoveryController;
+Landroid/security/keystore/RecoveryController;->initRecoveryService(Ljava/lang/String;[B)V
+Landroid/security/keystore/RecoveryController;->setRecoverySecretTypes([I)V
+Landroid/security/keystore/RecoveryController;->setServerParams([B)V
+Landroid/security/keystore/RecoveryController;->setSnapshotCreatedPendingIntent(Landroid/app/PendingIntent;)V
Landroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnectFailed()V
Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnect(Ljava/lang/String;Landroid/media/session/MediaSession$Token;Landroid/os/Bundle;)V
@@ -1521,6 +1763,9 @@
Landroid/telephony/CellSignalStrengthLte;->mRsrp:I
Landroid/telephony/CellSignalStrengthLte;->mRsrq:I
Landroid/telephony/CellSignalStrengthLte;->mRssnr:I
+Landroid/telephony/CellSignalStrengthLte;->mSignalStrength:I
+Landroid/telephony/CellSignalStrengthWcdma;->mBitErrorRate:I
+Landroid/telephony/CellSignalStrengthWcdma;->mSignalStrength:I
Landroid/telephony/PhoneStateListener;->mSubId:Ljava/lang/Integer;
Landroid/telephony/ServiceState;->newFromBundle(Landroid/os/Bundle;)Landroid/telephony/ServiceState;
Landroid/telephony/SignalStrength;->getAsuLevel()I
@@ -1580,6 +1825,7 @@
Landroid/telephony/TelephonyManager;->getSimOperatorNameForPhone(I)Ljava/lang/String;
Landroid/telephony/TelephonyManager;->getSimOperatorName(I)Ljava/lang/String;
Landroid/telephony/TelephonyManager;->getSimOperatorNumericForPhone(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSimOperatorNumeric(I)Ljava/lang/String;
Landroid/telephony/TelephonyManager;->getSimSerialNumber(I)Ljava/lang/String;
Landroid/telephony/TelephonyManager;->getSubIdForPhoneAccount(Landroid/telecom/PhoneAccount;)I
Landroid/telephony/TelephonyManager;->getSubscriberId(I)Ljava/lang/String;
@@ -1634,6 +1880,7 @@
Landroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;III)V
Landroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;IIIZ)V
Landroid/text/SpannableStringInternal;->START:I
+Landroid/text/SpanSet;->spans:[Ljava/lang/Object;
Landroid/text/StaticLayout;-><init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZLandroid/text/TextUtils$TruncateAt;II)V
Landroid/text/StaticLayout$LineBreaks;->ascents:[F
Landroid/text/StaticLayout$LineBreaks;->breaks:[I
@@ -1643,6 +1890,11 @@
Landroid/text/StaticLayout;->mColumns:I
Landroid/text/StaticLayout;->mLineCount:I
Landroid/text/StaticLayout;->mLines:[I
+Landroid/text/TextLine;->mCharacterStyleSpanSet:Landroid/text/SpanSet;
+Landroid/text/TextLine;->mMetricAffectingSpanSpanSet:Landroid/text/SpanSet;
+Landroid/text/TextLine;->mReplacementSpanSpanSet:Landroid/text/SpanSet;
+Landroid/text/TextLine;->mSpanned:Landroid/text/Spanned;
+Landroid/text/TextLine;->mText:Ljava/lang/CharSequence;
Landroid/text/TextLine;->obtain()Landroid/text/TextLine;
Landroid/text/TextLine;->sCached:[Landroid/text/TextLine;
Landroid/text/TextPaint;->setUnderlineText(IF)V
@@ -1654,11 +1906,23 @@
Landroid/util/DisplayMetrics;->noncompatWidthPixels:I
Landroid/util/EventLog$Event;-><init>([B)V
Landroid/util/Log;->wtf(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ZZ)I
+Landroid/util/LongSparseLongArray;->mKeys:[J
+Landroid/util/LongSparseLongArray;->mSize:I
+Landroid/util/LongSparseLongArray;->mValues:[J
+Landroid/util/NtpTrustedTime;->forceRefresh()Z
+Landroid/util/NtpTrustedTime;->getCachedNtpTime()J
+Landroid/util/NtpTrustedTime;->getCachedNtpTimeReference()J
+Landroid/util/NtpTrustedTime;->getInstance(Landroid/content/Context;)Landroid/util/NtpTrustedTime;
+Landroid/util/NtpTrustedTime;->hasCache()Z
Landroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;
Landroid/util/Rational;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/util/Singleton;->mInstance:Ljava/lang/Object;
+Landroid/util/SparseIntArray;->mKeys:[I
+Landroid/util/SparseIntArray;->mSize:I
+Landroid/util/SparseIntArray;->mValues:[I
Landroid/view/accessibility/AccessibilityManager;->getInstance(Landroid/content/Context;)Landroid/view/accessibility/AccessibilityManager;
Landroid/view/accessibility/AccessibilityManager;->isHighTextContrastEnabled()Z
+Landroid/view/accessibility/AccessibilityManager;->mIsEnabled:Z
Landroid/view/accessibility/AccessibilityManager;->mIsHighTextContrastEnabled:Z
Landroid/view/accessibility/AccessibilityManager;->sInstance:Landroid/view/accessibility/AccessibilityManager;
Landroid/view/accessibility/AccessibilityManager;->sInstanceSync:Ljava/lang/Object;
@@ -1668,6 +1932,7 @@
Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/view/ActionMode;->isUiFocusable()Z
Landroid/view/animation/Animation;->mListener:Landroid/view/animation/Animation$AnimationListener;
+Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V
Landroid/view/Choreographer;->doFrame(JI)V
Landroid/view/Choreographer;->getFrameTime()J
@@ -1772,6 +2037,7 @@
Landroid/view/PointerIcon;->mType:I
Landroid/view/RenderNodeAnimator;->callOnFinished(Landroid/view/RenderNodeAnimator;)V
Landroid/view/ScaleGestureDetector;->mListener:Landroid/view/ScaleGestureDetector$OnScaleGestureListener;
+Landroid/view/ScaleGestureDetector;->mMinSpan:I
Landroid/view/SurfaceControl$PhysicalDisplayInfo;->appVsyncOffsetNanos:J
Landroid/view/SurfaceControl$PhysicalDisplayInfo;->density:F
Landroid/view/SurfaceControl$PhysicalDisplayInfo;->height:I
@@ -1801,6 +2067,7 @@
Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionStarted(I)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
Landroid/view/textservice/TextServicesManager;->isSpellCheckerEnabled()Z
+Landroid/view/TextureView;->destroyHardwareLayer()V
Landroid/view/TextureView;->mLayer:Landroid/view/TextureLayer;
Landroid/view/TextureView;->mNativeWindow:J
Landroid/view/TextureView;->mSurface:Landroid/graphics/SurfaceTexture;
@@ -1879,8 +2146,10 @@
Landroid/view/View;->notifySubtreeAccessibilityStateChangedIfNeeded()V
Landroid/view/View;->recomputePadding()V
Landroid/view/View;->requestAccessibilityFocus()Z
+Landroid/view/View;->resetDisplayList()V
Landroid/view/View;->resetPaddingToInitialValues()V
Landroid/view/ViewRootImpl;->detachFunctor(J)V
+Landroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;)V
Landroid/view/ViewRootImpl;->invokeFunctor(JZ)V
Landroid/view/ViewRootImpl;->mStopped:Z
Landroid/view/ViewRootImpl;->mView:Landroid/view/View;
@@ -2040,6 +2309,7 @@
Landroid/widget/AbsSeekBar;->mSplitTrack:Z
Landroid/widget/AbsSeekBar;->mThumb:Landroid/graphics/drawable/Drawable;
Landroid/widget/AbsSeekBar;->mTouchProgressOffset:F
+Landroid/widget/ActivityChooserModel;->get(Landroid/content/Context;Ljava/lang/String;)Landroid/widget/ActivityChooserModel;
Landroid/widget/ActivityChooserView;->setExpandActivityOverflowButtonDrawable(Landroid/graphics/drawable/Drawable;)V
Landroid/widget/AdapterView;->mDataChanged:Z
Landroid/widget/AdapterView;->mFirstPosition:I
@@ -2053,10 +2323,17 @@
Landroid/widget/CompoundButton;->mButtonDrawable:Landroid/graphics/drawable/Drawable;
Landroid/widget/DatePicker;->mDelegate:Landroid/widget/DatePicker$DatePickerDelegate;
Landroid/widget/EdgeEffect;->mPaint:Landroid/graphics/Paint;
+Landroid/widget/Editor;->invalidateTextDisplayList()V
Landroid/widget/Editor;->mShowCursor:J
Landroid/widget/ExpandableListView;->mChildDivider:Landroid/graphics/drawable/Drawable;
+Landroid/widget/FastScroller;->mContainerRect:Landroid/graphics/Rect;
+Landroid/widget/FastScroller;->mHeaderCount:I
+Landroid/widget/FastScroller;->mLongList:Z
+Landroid/widget/FastScroller;->mMinimumTouchTarget:I
Landroid/widget/FastScroller;->mThumbDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/FastScroller;->mThumbImage:Landroid/widget/ImageView;
Landroid/widget/FastScroller;->mTrackDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/FastScroller;->mTrackImage:Landroid/widget/ImageView;
Landroid/widget/Gallery;->fillToGalleryLeft()V
Landroid/widget/Gallery;->fillToGalleryRight()V
Landroid/widget/Gallery$FlingRunnable;->startUsingVelocity(I)V
@@ -2141,6 +2418,8 @@
Landroid/widget/RelativeLayout;->mGravity:I
Landroid/widget/RemoteViews$Action;->mergeBehavior()I
Landroid/widget/RemoteViews$Action;->viewId:I
+Landroid/widget/RemoteViewsAdapter;->mCache:Landroid/widget/RemoteViewsAdapter$FixedSizeRemoteViewsCache;
+Landroid/widget/RemoteViewsAdapter;->mWorkerThread:Landroid/os/HandlerThread;
Landroid/widget/RemoteViews$BitmapCache;->mBitmaps:Ljava/util/ArrayList;
Landroid/widget/RemoteViews$BitmapReflectionAction;->bitmap:Landroid/graphics/Bitmap;
Landroid/widget/RemoteViews$BitmapReflectionAction;->methodName:Ljava/lang/String;
@@ -2164,6 +2443,7 @@
Landroid/widget/SearchView;->mCloseButton:Landroid/widget/ImageView;
Landroid/widget/SearchView;->mSearchButton:Landroid/widget/ImageView;
Landroid/widget/SearchView;->mSearchPlate:Landroid/view/View;
+Landroid/widget/SearchView;->mSearchSrcTextView:Landroid/widget/SearchView$SearchAutoComplete;
Landroid/widget/SearchView;->onCloseClicked()V
Landroid/widget/SearchView;->setQuery(Ljava/lang/CharSequence;)V
Landroid/widget/SlidingDrawer;->mTopOffset:I
@@ -2174,6 +2454,7 @@
Landroid/widget/TabWidget;->setTabSelectionListener(Landroid/widget/TabWidget$OnTabSelectionChanged;)V
Landroid/widget/TextView;->assumeLayout()V
Landroid/widget/TextView;->createEditorIfNeeded()V
+Landroid/widget/TextView;->isSingleLine()Z
Landroid/widget/TextView;->mCursorDrawableRes:I
Landroid/widget/TextView;->mCurTextColor:I
Landroid/widget/TextView;->mEditor:Landroid/widget/Editor;
@@ -2197,6 +2478,7 @@
Lcom/android/internal/app/IAppOpsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/app/IBatteryStats;->getStatistics()[B
Lcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats;
+Lcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService;
Lcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;->showSessionFromSession(Landroid/os/IBinder;Landroid/os/Bundle;I)Z
Lcom/android/internal/os/BatterySipper;->add(Lcom/android/internal/os/BatterySipper;)V
@@ -2248,6 +2530,7 @@
Lcom/android/internal/R$array;->config_tether_wifi_regexs:I
Lcom/android/internal/R$array;->maps_starting_lat_lng:I
Lcom/android/internal/R$array;->maps_starting_zoom:I
+Lcom/android/internal/R$attr;->actionBarStyle:I
Lcom/android/internal/R$attr;->mapViewStyle:I
Lcom/android/internal/R$attr;->state_focused:I
Lcom/android/internal/R$attr;->state_pressed:I
@@ -2317,6 +2600,10 @@
Lcom/android/internal/R$styleable;->AndroidManifestUsesSdk_targetSdkVersion:I
Lcom/android/internal/R$styleable;->AndroidManifest_versionCode:I
Lcom/android/internal/R$styleable;->AndroidManifest_versionName:I
+Lcom/android/internal/R$styleable;->CheckBoxPreference_disableDependentsState:I
+Lcom/android/internal/R$styleable;->CheckBoxPreference:[I
+Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOff:I
+Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOn:I
Lcom/android/internal/R$styleable;->CompoundButton_button:I
Lcom/android/internal/R$styleable;->CompoundButton:[I
Lcom/android/internal/R$styleable;->EdgeEffect_colorEdgeEffect:I
@@ -2324,6 +2611,23 @@
Lcom/android/internal/R$styleable;->IconMenuView:[I
Lcom/android/internal/R$styleable;->ImageView:[I
Lcom/android/internal/R$styleable;->ImageView_src:I
+Lcom/android/internal/R$styleable;->Preference_defaultValue:I
+Lcom/android/internal/R$styleable;->Preference_dependency:I
+Lcom/android/internal/R$styleable;->Preference_enabled:I
+Lcom/android/internal/R$styleable;->Preference_fragment:I
+Lcom/android/internal/R$styleable;->PreferenceGroup:[I
+Lcom/android/internal/R$styleable;->PreferenceGroup_orderingFromXml:I
+Lcom/android/internal/R$styleable;->Preference:[I
+Lcom/android/internal/R$styleable;->Preference_icon:I
+Lcom/android/internal/R$styleable;->Preference_key:I
+Lcom/android/internal/R$styleable;->Preference_layout:I
+Lcom/android/internal/R$styleable;->Preference_order:I
+Lcom/android/internal/R$styleable;->Preference_persistent:I
+Lcom/android/internal/R$styleable;->Preference_selectable:I
+Lcom/android/internal/R$styleable;->Preference_shouldDisableView:I
+Lcom/android/internal/R$styleable;->Preference_summary:I
+Lcom/android/internal/R$styleable;->Preference_title:I
+Lcom/android/internal/R$styleable;->Preference_widgetLayout:I
Lcom/android/internal/R$styleable;->ScrollView_fillViewport:I
Lcom/android/internal/R$styleable;->ScrollView:[I
Lcom/android/internal/R$styleable;->SyncAdapter_accountType:I
@@ -2340,6 +2644,7 @@
Lcom/android/internal/R$styleable;->TextView_drawableRight:I
Lcom/android/internal/R$styleable;->TextView_drawableTop:I
Lcom/android/internal/R$styleable;->TextView:[I
+Lcom/android/internal/R$styleable;->TextView_maxLines:I
Lcom/android/internal/R$styleable;->View_background:I
Lcom/android/internal/R$styleable;->ViewGroup_Layout:[I
Lcom/android/internal/R$styleable;->ViewGroup_Layout_layout_height:I
@@ -2361,12 +2666,16 @@
Lcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISms;
Lcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/telephony/ITelephony;->call(Ljava/lang/String;Ljava/lang/String;)V
+Lcom/android/internal/telephony/ITelephony;->disableDataConnectivity()Z
+Lcom/android/internal/telephony/ITelephony;->enableDataConnectivity()Z
Lcom/android/internal/telephony/ITelephony;->endCall()Z
Lcom/android/internal/telephony/ITelephony;->isIdle(Ljava/lang/String;)Z
Lcom/android/internal/telephony/ITelephony;->silenceRinger()V
Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony;
+Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCall()Z
Lcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I
+Lcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/util/XmlUtils;->readMapXml(Ljava/io/InputStream;)Ljava/util/HashMap;
Lcom/android/internal/view/IInputMethodManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethodManager;
Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList()Ljava/util/List;
@@ -2377,6 +2686,7 @@
Lcom/android/internal/view/menu/MenuBuilder;->setOptionalIconsVisible(Z)V
Lcom/android/internal/view/menu/MenuItemImpl;->mIconResId:I
Lcom/android/internal/view/menu/MenuItemImpl;->setMenuInfo(Landroid/view/ContextMenu$ContextMenuInfo;)V
+Lcom/android/internal/view/menu/MenuPopupHelper;->setForceShowIcon(Z)V
Lcom/android/internal/view/menu/MenuView$ItemView;->getItemData()Lcom/android/internal/view/menu/MenuItemImpl;
Lcom/android/okhttp/ConnectionPool;->keepAliveDurationNs:J
Lcom/android/okhttp/ConnectionPool;->maxIdleConnections:I
@@ -2386,6 +2696,7 @@
Lcom/android/okhttp/OkHttpClient;->DEFAULT_PROTOCOLS:Ljava/util/List;
Lcom/android/okhttp/OkHttpClient;->dns:Lcom/android/okhttp/Dns;
Lcom/android/okhttp/OkHttpClient;->setProtocols(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
+Lcom/android/okhttp/OkHttpClient;->setRetryOnConnectionFailure(Z)V
Lcom/android/okhttp/okio/ByteString;->readObject(Ljava/io/ObjectInputStream;)V
Lcom/android/okhttp/okio/ByteString;->writeObject(Ljava/io/ObjectOutputStream;)V
Lcom/android/org/conscrypt/AbstractConscryptSocket;->getAlpnSelectedProtocol()[B
@@ -2397,8 +2708,8 @@
Lcom/android/org/conscrypt/AbstractConscryptSocket;->getHostnameOrIP()Ljava/lang/String;
Lcom/android/org/conscrypt/AbstractConscryptSocket;->getNpnSelectedProtocol()[B
Lcom/android/org/conscrypt/AbstractConscryptSocket;->getSoWriteTimeout()I
-Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([Ljava/lang/String;)V
Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([B)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([Ljava/lang/String;)V
Lcom/android/org/conscrypt/AbstractConscryptSocket;->setApplicationProtocols([Ljava/lang/String;)V
Lcom/android/org/conscrypt/AbstractConscryptSocket;->setChannelIdEnabled(Z)V
Lcom/android/org/conscrypt/AbstractConscryptSocket;->setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
@@ -2419,8 +2730,8 @@
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getHostnameOrIP()Ljava/lang/String;
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getNpnSelectedProtocol()[B
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getSoWriteTimeout()I
-Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([Ljava/lang/String;)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([Ljava/lang/String;)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setChannelIdEnabled(Z)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHandshakeTimeout(I)V
@@ -2428,6 +2739,7 @@
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setNpnProtocols([B)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setSoWriteTimeout(I)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setUseSessionTickets(Z)V
+Lcom/android/org/conscrypt/OpenSSLX509Certificate;->mContext:J
Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;)V
Ldalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String;
Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;
@@ -2448,6 +2760,7 @@
Ldalvik/system/DexPathList$Element;-><init>(Ldalvik/system/DexFile;Ljava/io/File;)V
Ldalvik/system/DexPathList$Element;-><init>(Ljava/io/File;ZLjava/io/File;Ldalvik/system/DexFile;)V
Ldalvik/system/DexPathList;-><init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)V
+Ldalvik/system/DexPathList;->loadDexFile(Ljava/io/File;Ljava/io/File;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ldalvik/system/DexFile;
Ldalvik/system/DexPathList;->makeDexElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;Ljava/lang/ClassLoader;)[Ldalvik/system/DexPathList$Element;
Ldalvik/system/DexPathList;->makeInMemoryDexElements([Ljava/nio/ByteBuffer;Ljava/util/List;)[Ldalvik/system/DexPathList$Element;
Ldalvik/system/DexPathList;->makePathElements(Ljava/util/List;)[Ldalvik/system/DexPathList$NativeLibraryElement;
@@ -2536,6 +2849,7 @@
Ljava/lang/StringBuilder;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/lang/StringBuilder;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/lang/String;-><init>(II[C)V
+Ljava/lang/System;-><init>()V
Ljava/lang/Thread;->daemon:Z
Ljava/lang/Thread;->dispatchUncaughtException(Ljava/lang/Throwable;)V
Ljava/lang/ThreadGroup;->add(Ljava/lang/Thread;)V
@@ -2596,6 +2910,7 @@
Ljava/net/URI;->host:Ljava/lang/String;
Ljava/net/URI;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/net/URI;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/net/URL;->handler:Ljava/net/URLStreamHandler;
Ljava/net/URL;->handlers:Ljava/util/Hashtable;
Ljava/net/URL;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/net/URL;->writeObject(Ljava/io/ObjectOutputStream;)V
@@ -2692,6 +3007,7 @@
Ljava/util/concurrent/atomic/DoubleAdder;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/concurrent/atomic/LongAccumulator;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/concurrent/atomic/LongAdder;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasMoreElements()Z
Ljava/util/concurrent/ConcurrentHashMap;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/concurrent/ConcurrentHashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/concurrent/ConcurrentLinkedDeque;->readObject(Ljava/io/ObjectInputStream;)V
@@ -2740,6 +3056,7 @@
Ljava/util/InvalidPropertiesFormatException;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/InvalidPropertiesFormatException;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry;
+Ljava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z
Ljava/util/LinkedList;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/LinkedList;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/Locale;->createConstant(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale;
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index 256c479..ea0fd75 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -471,14 +471,6 @@
* {@link #onStart} and returns either {@link #START_STICKY}
* or {@link #START_STICKY_COMPATIBILITY}.
*
- * <p>If you need your application to run on platform versions prior to API
- * level 5, you can use the following model to handle the older {@link #onStart}
- * callback in that case. The <code>handleCommand</code> method is implemented by
- * you as appropriate:
- *
- * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.java
- * start_compatibility}
- *
* <p class="caution">Note that the system calls this on your
* service's main thread. A service's main thread is the same
* thread where UI operations take place for Activities running in the
@@ -687,6 +679,10 @@
* {@link #startService(Intent)} first to tell the system it should keep the service running,
* and then use this method to tell it to keep it running harder.</p>
*
+ * <p>Apps targeting API {@link android.os.Build.VERSION_CODES#P} or later must request
+ * the permission {@link android.Manifest.permission#FOREGROUND_SERVICE} in order to use
+ * this API.</p>
+ *
* @param id The identifier for this notification as per
* {@link NotificationManager#notify(int, Notification)
* NotificationManager.notify(int, Notification)}; must not be 0.
diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java
index a2864b9..2d007ad 100644
--- a/core/java/android/app/WallpaperColors.java
+++ b/core/java/android/app/WallpaperColors.java
@@ -21,6 +21,7 @@
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
@@ -107,6 +108,11 @@
* @param drawable Source where to extract from.
*/
public static WallpaperColors fromDrawable(Drawable drawable) {
+ if (drawable == null) {
+ throw new IllegalArgumentException("Drawable cannot be null");
+ }
+
+ Rect initialBounds = drawable.copyBounds();
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
@@ -126,6 +132,7 @@
final WallpaperColors colors = WallpaperColors.fromBitmap(bitmap);
bitmap.recycle();
+ drawable.setBounds(initialBounds);
return colors;
}
@@ -137,6 +144,13 @@
* @param bitmap Source where to extract from.
*/
public static WallpaperColors fromBitmap(@NonNull Bitmap bitmap) {
+ return fromBitmap(bitmap, false /* computeHints */);
+ }
+
+ /**
+ * @hide
+ */
+ public static WallpaperColors fromBitmap(@NonNull Bitmap bitmap, boolean computeHints) {
if (bitmap == null) {
throw new IllegalArgumentException("Bitmap can't be null");
}
@@ -186,7 +200,7 @@
}
}
- int hints = calculateDarkHints(bitmap);
+ int hints = computeHints ? calculateDarkHints(bitmap) : 0;
if (shouldRecycle) {
bitmap.recycle();
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index ee5ea80..83707ab 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -5579,10 +5579,13 @@
}
/**
- * Called by a profile owner or device owner to add a default intent handler activity for
- * intents that match a certain intent filter. This activity will remain the default intent
- * handler even if the set of potential event handlers for the intent filter changes and if the
- * intent preferences are reset.
+ * Called by a profile owner or device owner to set a default activity that the system selects
+ * to handle intents that match the given {@link IntentFilter}. This activity will remain the
+ * default intent handler even if the set of potential event handlers for the intent filter
+ * changes and if the intent preferences are reset.
+ * <p>
+ * Note that the caller should still declare the activity in the manifest, the API just sets
+ * the activity to be the default one to handle the given intent filter.
* <p>
* The default disambiguation mechanism takes over if the activity is not installed (anymore).
* When the activity is (re)installed, it is automatically reset as default intent handler for
@@ -5878,7 +5881,7 @@
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param disabled If true caller-Id information in the managed profile is not displayed.
- * @throws SecurityException if {@code admin} is not a device or profile owner.
+ * @throws SecurityException if {@code admin} is not a profile owner.
*/
public void setCrossProfileCallerIdDisabled(@NonNull ComponentName admin, boolean disabled) {
throwIfParentInstance("setCrossProfileCallerIdDisabled");
@@ -5899,7 +5902,7 @@
* thrown.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
- * @throws SecurityException if {@code admin} is not a device or profile owner.
+ * @throws SecurityException if {@code admin} is not a profile owner.
*/
public boolean getCrossProfileCallerIdDisabled(@NonNull ComponentName admin) {
throwIfParentInstance("getCrossProfileCallerIdDisabled");
@@ -5939,7 +5942,7 @@
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param disabled If true contacts search in the managed profile is not displayed.
- * @throws SecurityException if {@code admin} is not a device or profile owner.
+ * @throws SecurityException if {@code admin} is not a profile owner.
*/
public void setCrossProfileContactsSearchDisabled(@NonNull ComponentName admin,
boolean disabled) {
@@ -5961,7 +5964,7 @@
* thrown.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
- * @throws SecurityException if {@code admin} is not a device or profile owner.
+ * @throws SecurityException if {@code admin} is not a profile owner.
*/
public boolean getCrossProfileContactsSearchDisabled(@NonNull ComponentName admin) {
throwIfParentInstance("getCrossProfileContactsSearchDisabled");
@@ -6032,7 +6035,7 @@
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param disabled If true, bluetooth devices cannot access enterprise contacts.
- * @throws SecurityException if {@code admin} is not a device or profile owner.
+ * @throws SecurityException if {@code admin} is not a profile owner.
*/
public void setBluetoothContactSharingDisabled(@NonNull ComponentName admin, boolean disabled) {
throwIfParentInstance("setBluetoothContactSharingDisabled");
@@ -6055,7 +6058,7 @@
* This API works on managed profile only.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
- * @throws SecurityException if {@code admin} is not a device or profile owner.
+ * @throws SecurityException if {@code admin} is not a profile owner.
*/
public boolean getBluetoothContactSharingDisabled(@NonNull ComponentName admin) {
throwIfParentInstance("getBluetoothContactSharingDisabled");
@@ -6125,7 +6128,7 @@
* {@link UserManager#DISALLOW_SHARE_INTO_MANAGED_PROFILE}.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
- * @throws SecurityException if {@code admin} is not a device or profile owner.
+ * @throws SecurityException if {@code admin} is not a profile owner.
*/
public void clearCrossProfileIntentFilters(@NonNull ComponentName admin) {
throwIfParentInstance("clearCrossProfileIntentFilters");
@@ -6139,21 +6142,22 @@
}
/**
- * Called by a profile or device owner to set the permitted accessibility services. When set by
+ * Called by a profile or device owner to set the permitted
+ * {@link android.accessibilityservice.AccessibilityService}. When set by
* a device owner or profile owner the restriction applies to all profiles of the user the
- * device owner or profile owner is an admin for. By default the user can use any accessiblity
- * service. When zero or more packages have been added, accessiblity services that are not in
+ * device owner or profile owner is an admin for. By default, the user can use any accessibility
+ * service. When zero or more packages have been added, accessibility services that are not in
* the list and not part of the system can not be enabled by the user.
* <p>
* Calling with a null value for the list disables the restriction so that all services can be
- * used, calling with an empty list only allows the builtin system's services.
+ * used, calling with an empty list only allows the built-in system services. Any non-system
+ * accessibility service that's currently enabled must be included in the list.
* <p>
* System accessibility services are always available to the user the list can't modify this.
- *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param packageNames List of accessibility service package names.
- * @return true if setting the restriction succeeded. It fail if there is one or more non-system
- * accessibility services enabled, that are not in the list.
+ * @return {@code true} if the operation succeeded, or {@code false} if the list didn't
+ * contain every enabled non-system accessibility service.
* @throws SecurityException if {@code admin} is not a device or profile owner.
*/
public boolean setPermittedAccessibilityServices(@NonNull ComponentName admin,
@@ -6242,10 +6246,11 @@
/**
* Called by a profile or device owner to set the permitted input methods services. When set by
* a device owner or profile owner the restriction applies to all profiles of the user the
- * device owner or profile owner is an admin for. By default the user can use any input method.
+ * device owner or profile owner is an admin for. By default, the user can use any input method.
* When zero or more packages have been added, input method that are not in the list and not
* part of the system can not be enabled by the user. This method will fail if it is called for
- * a admin that is not for the foreground user or a profile of the foreground user.
+ * a admin that is not for the foreground user or a profile of the foreground user. Any
+ * non-system input method service that's currently enabled must be included in the list.
* <p>
* Calling with a null value for the list disables the restriction so that all input methods can
* be used, calling with an empty list disables all but the system's own input methods.
@@ -6254,8 +6259,8 @@
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param packageNames List of input method package names.
- * @return true if setting the restriction succeeded. It will fail if there are one or more
- * non-system input methods currently enabled that are not in the packageNames list.
+ * @return {@code true} if the operation succeeded, or {@code false} if the list didn't
+ * contain every enabled non-system input method service.
* @throws SecurityException if {@code admin} is not a device or profile owner.
*/
public boolean setPermittedInputMethods(
@@ -7854,11 +7859,14 @@
* {@link #PERMISSION_GRANT_STATE_DEFAULT default} in which a user can manage it through the UI,
* {@link #PERMISSION_GRANT_STATE_DENIED denied}, in which the permission is denied and the user
* cannot manage it through the UI, and {@link #PERMISSION_GRANT_STATE_GRANTED granted} in which
- * the permission is granted and the user cannot manage it through the UI. This might affect all
- * permissions in a group that the runtime permission belongs to. This method can only be called
- * by a profile owner, device owner, or a delegate given the
+ * the permission is granted and the user cannot manage it through the UI. This method can only
+ * be called by a profile owner, device owner, or a delegate given the
* {@link #DELEGATION_PERMISSION_GRANT} scope via {@link #setDelegatedScopes}.
* <p/>
+ * Note that user cannot manage other permissions in the affected group through the UI
+ * either and their granted state will be kept as the current value. Thus, it's recommended that
+ * you set the grant state of all the permissions in the affected group.
+ * <p/>
* Setting the grant state to {@link #PERMISSION_GRANT_STATE_DEFAULT default} does not revoke
* the permission. It retains the previous grant, if any.
* <p/>
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 1dc7549..ee667c2 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -541,13 +541,14 @@
"android.bluetooth.adapter.action.BLE_ACL_DISCONNECTED";
/** The profile is in disconnected state */
- public static final int STATE_DISCONNECTED = 0;
+ public static final int STATE_DISCONNECTED = BluetoothProtoEnums.CONNECTION_STATE_DISCONNECTED;
/** The profile is in connecting state */
- public static final int STATE_CONNECTING = 1;
+ public static final int STATE_CONNECTING = BluetoothProtoEnums.CONNECTION_STATE_CONNECTING;
/** The profile is in connected state */
- public static final int STATE_CONNECTED = 2;
+ public static final int STATE_CONNECTED = BluetoothProtoEnums.CONNECTION_STATE_CONNECTED;
/** The profile is in disconnecting state */
- public static final int STATE_DISCONNECTING = 3;
+ public static final int STATE_DISCONNECTING =
+ BluetoothProtoEnums.CONNECTION_STATE_DISCONNECTING;
/** @hide */
public static final String BLUETOOTH_MANAGER_SERVICE = "bluetooth_manager";
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index f7649c9..4a8f61c 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -763,13 +763,15 @@
public String[] resourceDirs;
/**
- * String retrieved from the seinfo tag found in selinux policy. This value can be set through
- * the mac_permissions.xml policy construct. This value is used for setting an SELinux security
- * context on the process as well as its data directory.
+ * String retrieved from the seinfo tag found in selinux policy. This value
+ * can be overridden with a value set through the mac_permissions.xml policy
+ * construct. This value is useful in setting an SELinux security context on
+ * the process as well as its data directory. The String default is being used
+ * here to represent a catchall label when no policy matches.
*
* {@hide}
*/
- public String seInfo;
+ public String seInfo = "default";
/**
* The seinfo tag generated per-user. This value may change based upon the
@@ -1188,6 +1190,7 @@
if (category != CATEGORY_UNDEFINED) {
pw.println(prefix + "category=" + category);
}
+ pw.println("isAllowedToUseHiddenApi=" + isAllowedToUseHiddenApi());
}
super.dumpBack(pw, prefix);
}
@@ -1604,8 +1607,7 @@
public boolean isAllowedToUseHiddenApi() {
boolean whitelisted =
SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
- return isSystemApp() || // TODO get rid of this once the whitelist has been populated
- (whitelisted && (isSystemApp() || isUpdatedSystemApp()));
+ return whitelisted && (isSystemApp() || isUpdatedSystemApp());
}
/**
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 514112f..5b3d3e5 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -544,16 +544,4 @@
/** Updates the flags for the given permission. */
public abstract void updatePermissionFlagsTEMP(@NonNull String permName,
@NonNull String packageName, int flagMask, int flagValues, int userId);
-
- /**
- * Returns true if it's still safe to restore data backed up from this app's version
- * that was signed with restoringFromSigHash.
- */
- public abstract boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName);
-
- /**
- * Returns true if it's still safe to restore data backed up from this app's version
- * that was signed with restoringFromSig.
- */
- public abstract boolean isDataRestoreSafe(Signature restoringFromSig, String packageName);
}
diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java
index a94b928..f8a63ce 100644
--- a/core/java/android/net/metrics/IpManagerEvent.java
+++ b/core/java/android/net/metrics/IpManagerEvent.java
@@ -40,11 +40,12 @@
public static final int ERROR_STARTING_IPV6 = 5;
public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6;
public static final int ERROR_INVALID_PROVISIONING = 7;
+ public static final int ERROR_INTERFACE_NOT_FOUND = 8;
@IntDef(value = {
PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE,
ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR,
- ERROR_INVALID_PROVISIONING,
+ ERROR_INVALID_PROVISIONING, ERROR_INTERFACE_NOT_FOUND,
})
@Retention(RetentionPolicy.SOURCE)
public @interface EventType {}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 6d8831b..df6ce8e 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -896,6 +896,14 @@
/**
* P.
+ *
+ * <p>Applications targeting this or a later release will get these
+ * new changes in behavior:</p>
+ * <ul>
+ * <li>{@link android.app.Service#startForeground Service.startForeground} requires
+ * that apps hold the permission
+ * {@link android.Manifest.permission#FOREGROUND_SERVICE}.</li>
+ * </ul>
*/
public static final int P = CUR_DEVELOPMENT; // STOPSHIP Replace with the real version.
}
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 96e2ae3..21c1263 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -599,7 +599,6 @@
/**
* Returns whether the current process is in an isolated sandbox.
- * @hide
*/
public static final boolean isIsolated() {
return isIsolated(myUid());
diff --git a/core/java/android/os/UserManagerInternal.java b/core/java/android/os/UserManagerInternal.java
index 6c9f1b2..f09d5ce 100644
--- a/core/java/android/os/UserManagerInternal.java
+++ b/core/java/android/os/UserManagerInternal.java
@@ -186,4 +186,24 @@
* @return the array of user ids.
*/
public abstract int[] getUserIds();
+
+ /**
+ * Checks if the {@code callingUserId} and {@code targetUserId} are same or in same group
+ * and that the {@code callingUserId} is not a managed profile and
+ * {@code targetUserId} is enabled.
+ *
+ * @return TRUE if the {@code callingUserId} can access {@code targetUserId}. FALSE
+ * otherwise
+ *
+ * @throws SecurityException if the calling user and {@code targetUser} are not in the same
+ * group and {@code throwSecurityException} is true, otherwise if will simply return false.
+ */
+ public abstract boolean isProfileAccessible(int callingUserId, int targetUserId,
+ String debugMsg, boolean throwSecurityException);
+
+ /**
+ * If {@code userId} is of a managed profile, return the parent user ID. Otherwise return
+ * itself.
+ */
+ public abstract int getProfileParentId(int userId);
}
diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl
index 3b53260..55a202f 100644
--- a/core/java/android/os/storage/IStorageManager.aidl
+++ b/core/java/android/os/storage/IStorageManager.aidl
@@ -185,7 +185,6 @@
long getCacheSizeBytes(String volumeUuid, int uid) = 76;
long getAllocatableBytes(String volumeUuid, int flags, String callingPackage) = 77;
void allocateBytes(String volumeUuid, long bytes, int flags, String callingPackage) = 78;
- void secdiscard(in String path) = 79;
- void runIdleMaintenance() = 80;
- void abortIdleMaintenance() = 81;
+ void runIdleMaintenance() = 79;
+ void abortIdleMaintenance() = 80;
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index f593e80..bf20e6a 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -50,7 +50,6 @@
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.SystemProperties;
-import android.os.UserHandle;
import android.provider.Settings;
import android.system.ErrnoException;
import android.system.Os;
@@ -1323,15 +1322,6 @@
}
/** {@hide} */
- public void secdiscard(String path) {
- try {
- mStorageManager.secdiscard(path);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /** {@hide} */
public static boolean isUserKeyUnlocked(int userId) {
if (sStorageManager == null) {
sStorageManager = IStorageManager.Stub
diff --git a/core/java/android/widget/MediaControlView2.java b/core/java/android/widget/MediaControlView2.java
index 4fb303e..adc4432 100644
--- a/core/java/android/widget/MediaControlView2.java
+++ b/core/java/android/widget/MediaControlView2.java
@@ -134,24 +134,6 @@
*/
public static final int BUTTON_SETTINGS = 11;
- /**
- * String for receiving command to show subtitle from MediaSession. Can be checked by
- * implementing {@link android.media.session.MediaSession.Callback#onCommand}
- * @hide
- */
- public static final String COMMAND_SHOW_SUBTITLE = "showSubtitle";
- /**
- * String for receiving command to hide subtitle from MediaSession. Can be checked by
- * implementing {@link android.media.session.MediaSession.Callback#onCommand}
- * @hide
- */
- public static final String COMMAND_HIDE_SUBTITLE = "hideSubtitle";
-
- /**
- * @hide TODO: remove once the implementation is revised
- */
- public static final String COMMAND_SET_FULLSCREEN = "setFullscreen";
-
public MediaControlView2(@NonNull Context context) {
this(context, null);
}
diff --git a/core/java/com/android/internal/os/BatterySipper.java b/core/java/com/android/internal/os/BatterySipper.java
index 5b6291e..5abc6d4 100644
--- a/core/java/com/android/internal/os/BatterySipper.java
+++ b/core/java/com/android/internal/os/BatterySipper.java
@@ -73,14 +73,16 @@
public double usagePowerMah;
// Subsystem usage times.
- public long cpuTimeMs;
- public long gpsTimeMs;
- public long wifiRunningTimeMs;
- public long cpuFgTimeMs;
- public long wakeLockTimeMs;
- public long cameraTimeMs;
- public long flashlightTimeMs;
+ public long audioTimeMs;
public long bluetoothRunningTimeMs;
+ public long cameraTimeMs;
+ public long cpuFgTimeMs;
+ public long cpuTimeMs;
+ public long flashlightTimeMs;
+ public long gpsTimeMs;
+ public long videoTimeMs;
+ public long wakeLockTimeMs;
+ public long wifiRunningTimeMs;
public long mobileRxPackets;
public long mobileTxPackets;
@@ -102,15 +104,17 @@
// Measured in mAh (milli-ampere per hour).
// These are included when summed.
- public double wifiPowerMah;
- public double cpuPowerMah;
- public double wakeLockPowerMah;
- public double mobileRadioPowerMah;
- public double gpsPowerMah;
- public double sensorPowerMah;
- public double cameraPowerMah;
- public double flashlightPowerMah;
+ public double audioPowerMah;
public double bluetoothPowerMah;
+ public double cameraPowerMah;
+ public double cpuPowerMah;
+ public double flashlightPowerMah;
+ public double gpsPowerMah;
+ public double mobileRadioPowerMah;
+ public double sensorPowerMah;
+ public double videoPowerMah;
+ public double wakeLockPowerMah;
+ public double wifiPowerMah;
public enum DrainType {
AMBIENT_DISPLAY,
@@ -177,10 +181,12 @@
totalPowerMah += other.totalPowerMah;
usageTimeMs += other.usageTimeMs;
usagePowerMah += other.usagePowerMah;
+ audioTimeMs += other.audioTimeMs;
cpuTimeMs += other.cpuTimeMs;
gpsTimeMs += other.gpsTimeMs;
wifiRunningTimeMs += other.wifiRunningTimeMs;
cpuFgTimeMs += other.cpuFgTimeMs;
+ videoTimeMs += other.videoTimeMs;
wakeLockTimeMs += other.wakeLockTimeMs;
cameraTimeMs += other.cameraTimeMs;
flashlightTimeMs += other.flashlightTimeMs;
@@ -197,6 +203,7 @@
wifiTxBytes += other.wifiTxBytes;
btRxBytes += other.btRxBytes;
btTxBytes += other.btTxBytes;
+ audioPowerMah += other.audioPowerMah;
wifiPowerMah += other.wifiPowerMah;
gpsPowerMah += other.gpsPowerMah;
cpuPowerMah += other.cpuPowerMah;
@@ -207,6 +214,7 @@
flashlightPowerMah += other.flashlightPowerMah;
bluetoothPowerMah += other.bluetoothPowerMah;
screenPowerMah += other.screenPowerMah;
+ videoPowerMah += other.videoPowerMah;
proportionalSmearMah += other.proportionalSmearMah;
totalSmearedPowerMah += other.totalSmearedPowerMah;
}
@@ -220,7 +228,7 @@
public double sumPower() {
totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah +
sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah +
- flashlightPowerMah + bluetoothPowerMah;
+ flashlightPowerMah + bluetoothPowerMah + audioPowerMah + videoPowerMah;
totalSmearedPowerMah = totalPowerMah + screenPowerMah + proportionalSmearMah;
return totalPowerMah;
diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java
index a76cf0a..1e5bd18 100644
--- a/core/java/com/android/internal/os/BatteryStatsHelper.java
+++ b/core/java/com/android/internal/os/BatteryStatsHelper.java
@@ -136,6 +136,7 @@
PowerCalculator mCameraPowerCalculator;
PowerCalculator mFlashlightPowerCalculator;
PowerCalculator mMemoryPowerCalculator;
+ PowerCalculator mMediaPowerCalculator;
boolean mHasWifiPowerReporting = false;
boolean mHasBluetoothPowerReporting = false;
@@ -424,6 +425,11 @@
}
mFlashlightPowerCalculator.reset();
+ if (mMediaPowerCalculator == null) {
+ mMediaPowerCalculator = new MediaPowerCalculator(mPowerProfile);
+ }
+ mMediaPowerCalculator.reset();
+
mStatsType = statsType;
mRawUptimeUs = rawUptimeUs;
mRawRealtimeUs = rawRealtimeUs;
@@ -560,6 +566,7 @@
mCameraPowerCalculator.calculateApp(app, u, mRawRealtimeUs, mRawUptimeUs, mStatsType);
mFlashlightPowerCalculator.calculateApp(app, u, mRawRealtimeUs, mRawUptimeUs,
mStatsType);
+ mMediaPowerCalculator.calculateApp(app, u, mRawRealtimeUs, mRawUptimeUs, mStatsType);
final double totalPower = app.sumPower();
if (DEBUG && totalPower != 0) {
diff --git a/core/java/com/android/internal/os/MediaPowerCalculator.java b/core/java/com/android/internal/os/MediaPowerCalculator.java
new file mode 100644
index 0000000..a35c134
--- /dev/null
+++ b/core/java/com/android/internal/os/MediaPowerCalculator.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.os;
+
+import android.os.BatteryStats;
+
+/**
+ * A {@link PowerCalculator} to calculate power consumed by audio and video hardware.
+ *
+ * Also see {@link PowerProfile#POWER_AUDIO} and {@link PowerProfile#POWER_VIDEO}.
+ */
+public class MediaPowerCalculator extends PowerCalculator {
+ private static final int MS_IN_HR = 1000 * 60 * 60;
+ private final double mAudioAveragePowerMa;
+ private final double mVideoAveragePowerMa;
+
+ public MediaPowerCalculator(PowerProfile profile) {
+ mAudioAveragePowerMa = profile.getAveragePower(PowerProfile.POWER_AUDIO);
+ mVideoAveragePowerMa = profile.getAveragePower(PowerProfile.POWER_VIDEO);
+ }
+
+ @Override
+ public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
+ long rawUptimeUs, int statsType) {
+ // Calculate audio power usage, an estimate based on the average power routed to different
+ // components like speaker, bluetooth, usb-c, earphone, etc.
+ final BatteryStats.Timer audioTimer = u.getAudioTurnedOnTimer();
+ if (audioTimer == null) {
+ app.audioTimeMs = 0;
+ app.audioPowerMah = 0;
+ } else {
+ final long totalTime = audioTimer.getTotalTimeLocked(rawRealtimeUs, statsType) / 1000;
+ app.audioTimeMs = totalTime;
+ app.audioPowerMah = (totalTime * mAudioAveragePowerMa) / MS_IN_HR;
+ }
+
+ // Calculate video power usage.
+ final BatteryStats.Timer videoTimer = u.getVideoTurnedOnTimer();
+ if (videoTimer == null) {
+ app.videoTimeMs = 0;
+ app.videoPowerMah = 0;
+ } else {
+ final long totalTime = videoTimer.getTotalTimeLocked(rawRealtimeUs, statsType) / 1000;
+ app.videoTimeMs = totalTime;
+ app.videoPowerMah = (totalTime * mVideoAveragePowerMa) / MS_IN_HR;
+ }
+ }
+}
diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java
index 747d633..344c772 100644
--- a/core/java/com/android/internal/os/PowerProfile.java
+++ b/core/java/com/android/internal/os/PowerProfile.java
@@ -43,12 +43,12 @@
*/
public static final String POWER_NONE = "none";
- /**
+ /*
* POWER_CPU_SUSPEND: Power consumption when CPU is in power collapse mode.
* POWER_CPU_IDLE: Power consumption when CPU is awake (when a wake lock is held). This should
* be zero on devices that can go into full CPU power collapse even when a wake
* lock is held. Otherwise, this is the power consumption in addition to
- * POWER_CPU_SUSPEND due to a wake lock being held but with no CPU activity.
+ * POWER_CPU_SUSPEND due to a wake lock being held but with no CPU activity.
* POWER_CPU_ACTIVE: Power consumption when CPU is running, excluding power consumed by clusters
* and cores.
*
@@ -84,7 +84,6 @@
// Updated power constants. These are not estimated, they are real world
// currents and voltages for the underlying bluetooth and wifi controllers.
//
-
public static final String POWER_WIFI_CONTROLLER_IDLE = "wifi.controller.idle";
public static final String POWER_WIFI_CONTROLLER_RX = "wifi.controller.rx";
public static final String POWER_WIFI_CONTROLLER_TX = "wifi.controller.tx";
@@ -117,6 +116,7 @@
/**
* Power consumption when Bluetooth driver is on.
+ *
* @deprecated
*/
@Deprecated
@@ -124,6 +124,7 @@
/**
* Power consumption when Bluetooth driver is transmitting/receiving.
+ *
* @deprecated
*/
@Deprecated
@@ -131,6 +132,7 @@
/**
* Power consumption when Bluetooth driver gets an AT command.
+ *
* @deprecated
*/
@Deprecated
@@ -171,13 +173,13 @@
* Power consumed by the audio hardware when playing back audio content. This is in addition
* to the CPU power, probably due to a DSP and / or amplifier.
*/
- public static final String POWER_AUDIO = "dsp.audio";
+ public static final String POWER_AUDIO = "audio";
/**
* Power consumed by any media hardware when playing back video content. This is in addition
* to the CPU power, probably due to a DSP.
*/
- public static final String POWER_VIDEO = "dsp.video";
+ public static final String POWER_VIDEO = "video";
/**
* Average power consumption when camera flashlight is on.
@@ -409,6 +411,7 @@
/**
* Returns the number of memory bandwidth buckets defined in power_profile.xml, or a
* default value if the subsystem has no recorded value.
+ *
* @return the number of memory bandwidth buckets.
*/
public int getNumElements(String key) {
@@ -423,7 +426,8 @@
/**
* Returns the average current in mA consumed by the subsystem, or the given
* default value if the subsystem has no recorded value.
- * @param type the subsystem type
+ *
+ * @param type the subsystem type
* @param defaultValue the value to return if the subsystem has no recorded value.
* @return the average current in milliAmps.
*/
@@ -439,19 +443,21 @@
/**
* Returns the average current in mA consumed by the subsystem
+ *
* @param type the subsystem type
* @return the average current in milliAmps.
*/
public double getAveragePower(String type) {
return getAveragePowerOrDefault(type, 0);
}
-
+
/**
* Returns the average current in mA consumed by the subsystem for the given level.
- * @param type the subsystem type
+ *
+ * @param type the subsystem type
* @param level the level of power at which the subsystem is running. For instance, the
- * signal strength of the cell network between 0 and 4 (if there are 4 bars max.)
- * If there is no data for multiple levels, the level is ignored.
+ * signal strength of the cell network between 0 and 4 (if there are 4 bars max.)
+ * If there is no data for multiple levels, the level is ignored.
* @return the average current in milliAmps.
*/
public double getAveragePower(String type, int level) {
@@ -474,6 +480,7 @@
/**
* Returns the battery capacity, if available, in milli Amp Hours. If not available,
* it returns zero.
+ *
* @return the battery capacity in mAh
*/
public double getBatteryCapacity() {
diff --git a/core/java/com/android/internal/view/RotationPolicy.java b/core/java/com/android/internal/view/RotationPolicy.java
index d7b9132..e9472fa 100644
--- a/core/java/com/android/internal/view/RotationPolicy.java
+++ b/core/java/com/android/internal/view/RotationPolicy.java
@@ -41,7 +41,8 @@
public final class RotationPolicy {
private static final String TAG = "RotationPolicy";
private static final int CURRENT_ROTATION = -1;
- private static final int NATURAL_ROTATION = Surface.ROTATION_0;
+
+ public static final int NATURAL_ROTATION = Surface.ROTATION_0;
private RotationPolicy() {
}
diff --git a/core/proto/android/bluetooth/enums.proto b/core/proto/android/bluetooth/enums.proto
new file mode 100644
index 0000000..06ae2d3
--- /dev/null
+++ b/core/proto/android/bluetooth/enums.proto
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.bluetooth;
+
+option java_outer_classname = "BluetoothProtoEnums";
+option java_multiple_files = true;
+
+// Bluetooth connection states.
+// Primarily used by android/bluetooth/BluetoothAdapter.java
+enum ConnectionStateEnum {
+ CONNECTION_STATE_DISCONNECTED = 0;
+ CONNECTION_STATE_CONNECTING = 1;
+ CONNECTION_STATE_CONNECTED = 2;
+ CONNECTION_STATE_DISCONNECTING = 3;
+}
\ No newline at end of file
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 5e12e7e..6c2db764 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -3827,6 +3827,15 @@
<permission android:name="android.permission.INSTANT_APP_FOREGROUND_SERVICE"
android:protectionLevel="signature|development|instant|appop" />
+ <!-- Allows a regular application to use {@link android.app.Service#startForeground
+ Service.startForeground}.
+ <p>Protection level: normal
+ -->
+ <permission android:name="android.permission.FOREGROUND_SERVICE"
+ android:description="@string/permdesc_foregroundService"
+ android:label="@string/permlab_foregroundService"
+ android:protectionLevel="normal|instant" />
+
<!-- @SystemApi Allows to access all app shortcuts.
@hide -->
<permission android:name="android.permission.ACCESS_SHORTCUTS"
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 375627d..fa9cab5 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1637,7 +1637,7 @@
<integer translatable="false" name="config_bluetooth_operating_voltage_mv">0</integer>
<!-- Max number of connected audio devices supported by Bluetooth stack -->
- <integer name="config_bluetooth_max_connected_audio_devices">1</integer>
+ <integer name="config_bluetooth_max_connected_audio_devices">5</integer>
<!-- Whether supported profiles should be reloaded upon enabling bluetooth -->
<bool name="config_bluetooth_reload_supported_profiles_when_enabled">false</bool>
@@ -3362,4 +3362,6 @@
<item>"wifi"</item>
</string-array>
+ <!-- Package name for ManagedProvisioning which is responsible for provisioning work profiles. -->
+ <string name="config_managed_provisioning_package" translatable="false">com.android.managedprovisioning</string>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index d59ba18..147b64a 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -927,6 +927,11 @@
<string name="permdesc_persistentActivity" product="default">Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the phone.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_foregroundService">run foreground service</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_foregroundService">Allows the app to make use of foreground services.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_getPackageSize">measure app storage space</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_getPackageSize">Allows the app to retrieve its code, data, and cache sizes</string>
@@ -3077,7 +3082,7 @@
<!-- Notification action name for connecting to the network specified in the notification body. -->
<string name="wifi_available_action_connect">Connect</string>
<!-- Notification action name for opening the wifi picker, showing the user all the nearby networks. -->
- <string name="wifi_available_action_all_networks">All Networks</string>
+ <string name="wifi_available_action_all_networks">All networks</string>
<!--Notification title for Wi-Fi Wake onboarding. This is displayed the first time a user disables Wi-Fi with the feature enabled. -->
<string name="wifi_wakeup_onboarding_title">Wi\u2011Fi will turn on automatically</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 0cd1007..979a0d6 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3288,4 +3288,6 @@
<java-symbol type="string" name="zen_upgrade_notification_title" />
<java-symbol type="string" name="zen_upgrade_notification_content" />
+ <java-symbol type="string" name="config_managed_provisioning_package" />
+
</resources>
diff --git a/core/res/res/xml/power_profile.xml b/core/res/res/xml/power_profile.xml
index bd0958d..eff7c55 100644
--- a/core/res/res/xml/power_profile.xml
+++ b/core/res/res/xml/power_profile.xml
@@ -36,8 +36,8 @@
<item name="wifi.on">0.1</item> <!-- ~3mA -->
<item name="wifi.active">0.1</item> <!-- WIFI data transfer, ~200mA -->
<item name="wifi.scan">0.1</item> <!-- WIFI network scanning, ~100mA -->
- <item name="dsp.audio">0.1</item> <!-- ~10mA -->
- <item name="dsp.video">0.1</item> <!-- ~50mA -->
+ <item name="audio">0.1</item> <!-- ~10mA -->
+ <item name="video">0.1</item> <!-- ~50mA -->
<item name="camera.flashlight">0.1</item> <!-- Avg. power for camera flash, ~160mA -->
<item name="camera.avg">0.1</item> <!-- Avg. power use of camera in standard usecases, ~550mA -->
<item name="gps.on">0.1</item> <!-- ~50mA -->
diff --git a/core/res/res/xml/power_profile_test.xml b/core/res/res/xml/power_profile_test.xml
index eb34732..6dc5c7e 100644
--- a/core/res/res/xml/power_profile_test.xml
+++ b/core/res/res/xml/power_profile_test.xml
@@ -96,8 +96,11 @@
minute. -->
<item name="camera.avg">600</item>
- <!-- Additional power used when audio decoding/encoding via DSP -->
- <item name="dsp.audio">100</item>
+ <!-- Additional power used by the audio hardware, probably due to DSP -->
+ <item name="audio">100.0</item>
+
+ <!-- Additional power used by the video hardware, probably due to DSP -->
+ <item name="video">150.0</item> <!-- ~50mA -->
<!-- Additional power used when GPS is acquiring a signal -->
<item name="gps.on">10</item>
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 7d5c60a..53c22f6 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -51,6 +51,7 @@
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
<uses-permission android:name="android.permission.DOWNLOAD_CACHE_NON_PURGEABLE" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INJECT_EVENTS" />
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index 98b7a3f..f5fe80c 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -44,6 +44,7 @@
KernelUidCpuClusterTimeReaderTest.class,
KernelWakelockReaderTest.class,
LongSamplingCounterArrayTest.class,
+ PowerCalculatorTest.class,
PowerProfileTest.class
})
public class BatteryStatsTests {
diff --git a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java
new file mode 100644
index 0000000..14d62e0
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package com.android.internal.os;
+
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.os.BatteryStats;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import junit.framework.TestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PowerCalculatorTest extends TestCase {
+ private static final long US_IN_HR = 1000L * 1000L * 60L * 60L;
+
+ @Mock
+ private PowerProfile mPowerProfile;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ /** Test {@link MediaPowerCalculator#calculateApp} */
+ @Test
+ public void testMediaPowerCalculator() {
+ when(mPowerProfile.getAveragePower(PowerProfile.POWER_AUDIO)).thenReturn(12.0);
+ when(mPowerProfile.getAveragePower(PowerProfile.POWER_VIDEO)).thenReturn(25.0);
+
+ BatteryStats.Uid u = mock(BatteryStats.Uid.class);
+ BatteryStats.Timer audioTimer = mock(BatteryStats.Timer.class);
+ when(u.getAudioTurnedOnTimer()).thenReturn(audioTimer);
+ when(audioTimer.getTotalTimeLocked(2L * US_IN_HR, 0)).thenReturn(2L * US_IN_HR);
+ BatteryStats.Timer videoTimer = mock(BatteryStats.Timer.class);
+ when(u.getVideoTurnedOnTimer()).thenReturn(videoTimer);
+ when(videoTimer.getTotalTimeLocked(2L * US_IN_HR, 0)).thenReturn(1L * US_IN_HR);
+
+ MediaPowerCalculator mediaPowerCalculator = new MediaPowerCalculator(mPowerProfile);
+ BatterySipper app = new BatterySipper(BatterySipper.DrainType.APP, null, 0);
+
+ mediaPowerCalculator.calculateApp(app, u, 2L * US_IN_HR, 2L * US_IN_HR, 0);
+ assertEquals(49.0, app.sumPower());
+ }
+
+
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java
index c7de99a..2853c96 100644
--- a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java
@@ -54,6 +54,8 @@
assertEquals(60.0, mProfile.getAveragePowerForCpuCore(1, 3));
assertEquals(3000.0, mProfile.getBatteryCapacity());
assertEquals(0.5, mProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY));
+ assertEquals(100.0, mProfile.getAveragePower(PowerProfile.POWER_AUDIO));
+ assertEquals(150.0, mProfile.getAveragePower(PowerProfile.POWER_VIDEO));
}
}
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 8e76dd3..b4de3a3 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -322,6 +322,8 @@
<permission name="android.permission.SET_ANIMATION_SCALE"/>
<permission name="android.permission.SET_DEBUG_APP"/>
<permission name="android.permission.SET_PROCESS_LIMIT"/>
+ <permission name="android.permission.SET_TIME"/>
+ <permission name="android.permission.SET_TIME_ZONE"/>
<permission name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h
index 52830d3..43ac1ec 100644
--- a/libs/protoutil/include/android/util/ProtoOutputStream.h
+++ b/libs/protoutil/include/android/util/ProtoOutputStream.h
@@ -25,7 +25,7 @@
namespace util {
/**
- * Position of the field type in a (long long) fieldId.
+ * Position of the field type in a 64-bits fieldId.
*/
const uint64_t FIELD_TYPE_SHIFT = 32;
@@ -106,8 +106,8 @@
* Returns a token of this write session.
* Must call end(token) when finish write this sub-message.
*/
- long long start(uint64_t fieldId);
- void end(long long token);
+ uint64_t start(uint64_t fieldId);
+ void end(uint64_t token);
/**
* Returns how many bytes are buffered in ProtoOutputStream.
@@ -139,7 +139,7 @@
bool mCompact;
int mDepth;
int mObjectId;
- long long mExpectedObjectToken;
+ uint64_t mExpectedObjectToken;
inline void writeDoubleImpl(uint32_t id, double val);
inline void writeFloatImpl(uint32_t id, float val);
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index 9d9ffec..a040bd2 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -28,7 +28,7 @@
mCompact(false),
mDepth(0),
mObjectId(0),
- mExpectedObjectToken(0LL)
+ mExpectedObjectToken(0ULL)
{
}
@@ -45,7 +45,7 @@
mCompact = false;
mDepth = 0;
mObjectId = 0;
- mExpectedObjectToken = 0LL;
+ mExpectedObjectToken = 0ULL;
}
bool
@@ -222,37 +222,37 @@
* because of the overflow, and only the tokens are compared.
* Bits 0-31 - offset of the first size field in the buffer.
*/
-long long
+uint64_t
makeToken(int tagSize, bool repeated, int depth, int objectId, int sizePos) {
- return ((0x07L & (long long)tagSize) << 61)
+ return ((0x07L & (uint64_t)tagSize) << 61)
| (repeated ? (1LL << 60) : 0)
- | (0x01ffL & (long long)depth) << 51
- | (0x07ffffL & (long long)objectId) << 32
- | (0x0ffffffffL & (long long)sizePos);
+ | (0x01ffL & (uint64_t)depth) << 51
+ | (0x07ffffL & (uint64_t)objectId) << 32
+ | (0x0ffffffffL & (uint64_t)sizePos);
}
/**
* Get the encoded tag size from the token.
*/
-static int getTagSizeFromToken(long long token) {
+static int getTagSizeFromToken(uint64_t token) {
return (int)(0x7 & (token >> 61));
}
/**
* Get the nesting depth of startObject calls from the token.
*/
-static int getDepthFromToken(long long token) {
+static int getDepthFromToken(uint64_t token) {
return (int)(0x01ff & (token >> 51));
}
/**
* Get the location of the childRawSize (the first 32 bit size field) in this object.
*/
-static int getSizePosFromToken(long long token) {
+static int getSizePosFromToken(uint64_t token) {
return (int)token;
}
-long long
+uint64_t
ProtoOutputStream::start(uint64_t fieldId)
{
if ((fieldId & FIELD_TYPE_MASK) != FIELD_TYPE_MESSAGE) {
@@ -275,10 +275,10 @@
}
void
-ProtoOutputStream::end(long long token)
+ProtoOutputStream::end(uint64_t token)
{
if (token != mExpectedObjectToken) {
- ALOGE("Unexpected token: 0x%llx, should be 0x%llx", token, mExpectedObjectToken);
+ ALOGE("Unexpected token: 0x%llx, should be 0x%llx", (long long)token, (long long)mExpectedObjectToken);
return;
}
diff --git a/media/OWNERS b/media/OWNERS
index 287ec39..f198f43 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -3,3 +3,4 @@
lajos@google.com
marcone@google.com
sungsoo@google.com
+wjia@google.com
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java
index 0d472ab..f73c38e 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/java/android/media/MediaPlayer2.java
@@ -22,17 +22,6 @@
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.SurfaceTexture;
-import android.media.MediaDrm;
-import android.media.MediaFormat;
-import android.media.MediaPlayer2Impl;
-import android.media.MediaPlayerBase;
-import android.media.MediaTimeProvider;
-import android.media.PlaybackParams;
-import android.media.SubtitleController;
-import android.media.SubtitleController.Anchor;
-import android.media.SubtitleData;
-import android.media.SubtitleTrack.RenderingWidget;
-import android.media.SyncParams;
import android.net.Uri;
import android.os.Handler;
import android.os.Parcel;
@@ -43,14 +32,13 @@
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
-import java.lang.AutoCloseable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.Executor;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.Executor;
/**
@@ -142,22 +130,21 @@
* the internal player engine.</li>
* <li>IllegalStateException is
* thrown to prevent programming errors such as calling
- * {@link #prepare()}, {@link #setDataSource(DataSourceDesc)}, or
- * {@code setPlaylist} methods in an invalid state. </li>
+ * {@link #prepare()}, {@link #setDataSource(DataSourceDesc)}
+ * methods in an invalid state. </li>
* </ul>
* </li>
* <li>Calling
- * {@link #setDataSource(DataSourceDesc)}, or
- * {@code setPlaylist} transfers a
+ * {@link #setDataSource(DataSourceDesc)} transfers a
* MediaPlayer2 object in the <em>Idle</em> state to the
* <em>Initialized</em> state.
* <ul>
* <li>An IllegalStateException is thrown if
- * setDataSource() or setPlaylist() is called in any other state.</li>
+ * setDataSource() is called in any other state.</li>
* <li>It is good programming
* practice to always look out for <code>IllegalArgumentException</code>
* and <code>IOException</code> that may be thrown from
- * <code>setDataSource</code> and <code>setPlaylist</code> methods.</li>
+ * <code>setDataSource</code>.</li>
* </ul>
* </li>
* <li>A MediaPlayer2 object must first enter the <em>Prepared</em> state
@@ -270,7 +257,7 @@
* <tr><td>attachAuxEffect </p></td>
* <td>{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} </p></td>
* <td>{Idle, Error} </p></td>
- * <td>This method must be called after setDataSource or setPlaylist.
+ * <td>This method must be called after setDataSource.
* Calling it does not change the object state. </p></td></tr>
* <tr><td>getAudioSessionId </p></td>
* <td>any </p></td>
@@ -350,7 +337,7 @@
* <td>{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted,
* Error} </p></td>
* <td>This method must be called in idle state as the audio session ID must be known before
- * calling setDataSource or setPlaylist. Calling it does not change the object
+ * calling setDataSource. Calling it does not change the object
* state. </p></td></tr>
* <tr><td>setAudioStreamType (deprecated)</p></td>
* <td>{Idle, Initialized, Stopped, Prepared, Started, Paused,
@@ -370,13 +357,6 @@
* <td>Successful invoke of this method in a valid state transfers the
* object to the <em>Initialized</em> state. Calling this method in an
* invalid state throws an IllegalStateException.</p></td></tr>
- * <tr><td>setPlaylist </p></td>
- * <td>{Idle} </p></td>
- * <td>{Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted,
- * Error} </p></td>
- * <td>Successful invoke of this method in a valid state transfers the
- * object to the <em>Initialized</em> state. Calling this method in an
- * invalid state throws an IllegalStateException.</p></td></tr>
* <tr><td>setDisplay </p></td>
* <td>any </p></td>
* <td>{} </p></td>
@@ -512,6 +492,7 @@
* This class implements the Java {@code AutoCloseable} interface and
* may be used with try-with-resources.
*/
+ // This is a synchronous call.
@Override
public abstract void close();
@@ -523,6 +504,7 @@
* prepared, the player will prepare the source and play.
*
*/
+ // This is an asynchronous call.
@Override
public abstract void play();
@@ -533,18 +515,21 @@
* call prepare().
*
*/
+ // This is an asynchronous call.
@Override
public abstract void prepare();
/**
* Pauses playback. Call play() to resume.
*/
+ // This is an asynchronous call.
@Override
public abstract void pause();
/**
* Tries to play next data source if applicable.
*/
+ // This is an asynchronous call.
@Override
public abstract void skipToNext();
@@ -554,6 +539,7 @@
*
* @param msec the offset in milliseconds from the start to seek to
*/
+ // This is an asynchronous call.
@Override
public void seekTo(long msec) {
seekTo(msec, SEEK_PREVIOUS_SYNC /* mode */);
@@ -612,6 +598,7 @@
* for the audio attributes to become effective thereafter.
* @param attributes a non-null set of audio attributes
*/
+ // This is an asynchronous call.
@Override
public abstract void setAudioAttributes(@NonNull AudioAttributes attributes);
@@ -627,6 +614,7 @@
*
* @param dsd the descriptor of data source you want to play
*/
+ // This is an asynchronous call.
@Override
public abstract void setDataSource(@NonNull DataSourceDesc dsd);
@@ -636,6 +624,7 @@
*
* @param dsd the descriptor of data source you want to play after current one
*/
+ // This is an asynchronous call.
@Override
public abstract void setNextDataSource(@NonNull DataSourceDesc dsd);
@@ -644,6 +633,7 @@
*
* @param dsds the list of data sources you want to play after current one
*/
+ // This is an asynchronous call.
@Override
public abstract void setNextDataSources(@NonNull List<DataSourceDesc> dsds);
@@ -659,6 +649,7 @@
* Configures the player to loop on the current data source.
* @param loop true if the current data source is meant to loop.
*/
+ // This is an asynchronous call.
@Override
public abstract void loopCurrent(boolean loop);
@@ -671,6 +662,7 @@
* by the player, see {@link #getPlaybackSpeed()}.
* @param speed the desired playback speed
*/
+ // This is an asynchronous call.
@Override
public abstract void setPlaybackSpeed(float speed);
@@ -704,6 +696,7 @@
* gain. See {@link #getMaxPlayerVolume()} for the volume range supported by this player.
* @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}.
*/
+ // This is an asynchronous call.
@Override
public abstract void setPlayerVolume(float volume);
@@ -728,6 +721,7 @@
* @param e the {@link Executor} to be used for the events.
* @param cb the callback to receive the events.
*/
+ // This is a synchronous call.
@Override
public abstract void registerPlayerEventCallback(@NonNull Executor e,
@NonNull PlayerEventCallback cb);
@@ -736,6 +730,7 @@
* Removes a previously registered callback for player events
* @param cb the callback to remove
*/
+ // This is a synchronous call.
@Override
public abstract void unregisterPlayerEventCallback(@NonNull PlayerEventCallback cb);
@@ -758,7 +753,7 @@
* Invoke a generic method on the native player using opaque
* parcels for the request and reply. Both payloads' format is a
* convention between the java caller and the native player.
- * Must be called after setDataSource or setPlaylist to make sure a native player
+ * Must be called after setDataSource to make sure a native player
* exists. On failure, a RuntimeException is thrown.
*
* @param request Parcel with the data for the extension. The
@@ -781,6 +776,7 @@
* @param label An application specific Object used to help to identify the completeness
* of a batch of commands.
*/
+ // This is an asynchronous call.
public void notifyWhenCommandLabelReached(Object label) { }
/**
@@ -819,6 +815,7 @@
* @throws IllegalStateException if the internal player engine has not been
* initialized or has been released.
*/
+ // This is an asynchronous call.
public abstract void setSurface(Surface surface);
/* Do not change these video scaling mode values below without updating
@@ -867,6 +864,7 @@
/**
* Discards all pending commands.
*/
+ // This is a synchronous call.
public abstract void clearPendingCommands();
/**
@@ -890,6 +888,7 @@
* @return true if succesful, false if the specified {@link AudioDeviceInfo} is non-null and
* does not correspond to a valid audio device.
*/
+ // This is an asynchronous call.
@Override
public abstract boolean setPreferredDevice(AudioDeviceInfo deviceInfo);
@@ -917,6 +916,7 @@
* @param handler Specifies the {@link Handler} object for the thread on which to execute
* the callback. If <code>null</code>, the handler on the main looper will be used.
*/
+ // This is a synchronous call.
@Override
public abstract void addOnRoutingChangedListener(AudioRouting.OnRoutingChangedListener listener,
Handler handler);
@@ -927,6 +927,7 @@
* @param listener The previously added {@link AudioRouting.OnRoutingChangedListener} interface
* to remove.
*/
+ // This is a synchronous call.
@Override
public abstract void removeOnRoutingChangedListener(AudioRouting.OnRoutingChangedListener listener);
@@ -1082,6 +1083,7 @@
* @throws IllegalArgumentException if params is invalid or not supported.
* @hide
*/
+ // This is an asynchronous call.
public void setBufferingParams(@NonNull BufferingParams params) { }
/**
@@ -1164,6 +1166,7 @@
*
* @param params the playback params.
*/
+ // This is an asynchronous call.
public abstract void setPlaybackParams(@NonNull PlaybackParams params);
/**
@@ -1179,6 +1182,7 @@
*
* @param params the A/V sync params to apply
*/
+ // This is an asynchronous call.
public abstract void setSyncParams(@NonNull SyncParams params);
/**
@@ -1267,6 +1271,7 @@
* {@link #SEEK_CLOSEST} often has larger performance overhead compared
* to the other options if there is no sync frame located at msec.
*/
+ // This is an asynchronous call.
public abstract void seekTo(long msec, @SeekMode int mode);
/**
@@ -1339,6 +1344,7 @@
* this method, you will have to initialize it again by setting the
* data source and calling prepare().
*/
+ // This is a synchronous call.
@Override
public abstract void reset();
@@ -1377,6 +1383,7 @@
* by calling this method.
* This method must be called before one of the overloaded <code> setDataSource </code> methods.
*/
+ // This is an asynchronous call.
public abstract void setAudioSessionId(int sessionId);
/**
@@ -1401,6 +1408,7 @@
* methods.
* @param effectId system wide unique id of the effect to attach
*/
+ // This is an asynchronous call.
public abstract void attachAuxEffect(int effectId);
@@ -1416,6 +1424,7 @@
* 0 < x <= R -> level = 10^(72*(x-R)/20/R)
* @param level send level scalar
*/
+ // This is an asynchronous call.
public abstract void setAuxEffectSendLevel(float level);
/**
@@ -1630,6 +1639,7 @@
*
* @see android.media.MediaPlayer2#getTrackInfo
*/
+ // This is an asynchronous call.
public abstract void selectTrack(int index);
/**
@@ -1646,6 +1656,7 @@
*
* @see android.media.MediaPlayer2#getTrackInfo
*/
+ // This is an asynchronous call.
public abstract void deselectTrack(int index);
/** @hide */
@@ -1766,8 +1777,6 @@
* <li>{@link #MEDIA_CALL_PAUSE}
* <li>{@link #MEDIA_CALL_PLAY}
* <li>{@link #MEDIA_CALL_PREPARE}
- * <li>{@link #MEDIA_CALL_PREPARE_DRM}
- * <li>{@link #MEDIA_CALL_PROVIDE_DRM_KEY_RESPONSE}
* <li>{@link #MEDIA_CALL_RELEASE_DRM}
* <li>{@link #MEDIA_CALL_RESTORE_DRM_KEYS}
* <li>{@link #MEDIA_CALL_SEEK_TO}
@@ -1776,8 +1785,6 @@
* <li>{@link #MEDIA_CALL_SET_AUDIO_SESSION_ID}
* <li>{@link #MEDIA_CALL_SET_AUX_EFFECT_SEND_LEVEL}
* <li>{@link #MEDIA_CALL_SET_DATA_SOURCE}
- * <li>{@link #MEDIA_CALL_SET_DRM_CONFIG_HELPER}
- * <li>{@link #MEDIA_CALL_SET_DRM_PROPERTY_STRING}
* <li>{@link #MEDIA_CALL_SET_NEXT_DATA_SOURCE}
* <li>{@link #MEDIA_CALL_SET_NEXT_DATA_SOURCES}
* <li>{@link #MEDIA_CALL_SET_PLAYBACK_PARAMS}
@@ -1816,12 +1823,14 @@
* @param eventCallback the callback that will be run
* @param executor the executor through which the callback should be invoked
*/
+ // This is a synchronous call.
public abstract void setMediaPlayer2EventCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull MediaPlayer2EventCallback eventCallback);
/**
* Clears the {@link MediaPlayer2EventCallback}.
*/
+ // This is a synchronous call.
public abstract void clearMediaPlayer2EventCallback();
/**
@@ -1842,6 +1851,7 @@
*
* @hide
*/
+ // This is a synchronous call.
public void setOnSubtitleDataListener(OnSubtitleDataListener listener) { }
@@ -2008,136 +2018,128 @@
public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;
//--------------------------------------------------------------------------
- /** The player just completed a call {@code attachAuxEffect}.
+ /** The player just completed a call {@link #attachAuxEffect}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_ATTACH_AUX_EFFECT = 1;
- /** The player just completed a call {@code deselectTrack}.
+ /** The player just completed a call {@link #deselectTrack}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_DESELECT_TRACK = 2;
- /** The player just completed a call {@code loopCurrent}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback.CallComplete
+ /** The player just completed a call {@link #loopCurrent}.
+ * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_LOOP_CURRENT = 3;
- /** The player just completed a call {@code pause}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback.CallComplete
+ /** The player just completed a call {@link #pause}.
+ * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_PAUSE = 4;
- /** The player just completed a call {@code play}.
+ /** The player just completed a call {@link #play}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_PLAY = 5;
- /** The player just completed a call {@code prepare}.
+ /** The player just completed a call {@link #prepare}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_PREPARE = 6;
- /** The player just completed a call {@code prepareDrm}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
- */
- public static final int MEDIA_CALL_PREPARE_DRM = 7;
-
- /** The player just completed a call {@code provideDrmKeyResponse}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
- */
- public static final int MEDIA_CALL_PROVIDE_DRM_KEY_RESPONSE = 8;
-
- /** The player just completed a call {@code releaseDrm}.
+ /** The player just completed a call {@link #releaseDrm}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_RELEASE_DRM = 12;
- /** The player just completed a call {@code restoreDrmKeys}.
+ /** The player just completed a call {@link #restoreDrmKeys}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_RESTORE_DRM_KEYS = 13;
- /** The player just completed a call {@code seekTo}.
+ /** The player just completed a call {@link #seekTo}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SEEK_TO = 14;
- /** The player just completed a call {@code selectTrack}.
+ /** The player just completed a call {@link #selectTrack}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SELECT_TRACK = 15;
- /** The player just completed a call {@code setAudioAttributes}.
+ /** The player just completed a call {@link #setAudioAttributes}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_AUDIO_ATTRIBUTES = 16;
- /** The player just completed a call {@code setAudioSessionId}.
+ /** The player just completed a call {@link #setAudioSessionId}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_AUDIO_SESSION_ID = 17;
- /** The player just completed a call {@code setAuxEffectSendLevel}.
+ /** The player just completed a call {@link #setAuxEffectSendLevel}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_AUX_EFFECT_SEND_LEVEL = 18;
- /** The player just completed a call {@code setDataSource}.
+ /** The player just completed a call {@link #setDataSource}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_DATA_SOURCE = 19;
- /** The player just completed a call {@code setOnDrmConfigHelper}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
- */
- public static final int MEDIA_CALL_SET_DRM_CONFIG_HELPER = 20;
-
- /** The player just completed a call {@code setDrmPropertyString}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
- */
- public static final int MEDIA_CALL_SET_DRM_PROPERTY_STRING = 21;
-
- /** The player just completed a call {@code setNextDataSource}.
+ /** The player just completed a call {@link #setNextDataSource}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_NEXT_DATA_SOURCE = 22;
- /** The player just completed a call {@code setNextDataSources}.
+ /** The player just completed a call {@link #setNextDataSources}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_NEXT_DATA_SOURCES = 23;
- /** The player just completed a call {@code setPlaybackParams}.
+ /** The player just completed a call {@link #setPlaybackParams}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_PLAYBACK_PARAMS = 24;
- /** The player just completed a call {@code setPlaybackSpeed}.
+ /** The player just completed a call {@link #setPlaybackSpeed}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_PLAYBACK_SPEED = 25;
- /** The player just completed a call {@code setPlayerVolume}.
+ /** The player just completed a call {@link #setPlayerVolume}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_PLAYER_VOLUME = 26;
- /** The player just completed a call {@code setSurface}.
+ /** The player just completed a call {@link #setSurface}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_SURFACE = 27;
- /** The player just completed a call {@code setSyncParams}.
+ /** The player just completed a call {@link #setSyncParams}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SET_SYNC_PARAMS = 28;
- /** The player just completed a call {@code skipToNext}.
+ /** The player just completed a call {@link #skipToNext}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_SKIP_TO_NEXT = 29;
+ /** The player just completed a call {@link #setBufferingParams}.
+ * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
+ * @hide
+ */
+ public static final int MEDIA_CALL_SET_BUFFERING_PARAMS = 1001;
+
+ /** The player just completed a call {@link #setPreferredDevice}.
+ * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
+ * @hide
+ */
+ public static final int MEDIA_CALL_SET_PREFERRED_DEVICE = 1002;
+
// Modular DRM begin
@@ -2148,8 +2150,8 @@
* 'securityLevel', which has to be set after DRM scheme creation but
* before the DRM session is opened.
*
- * The only allowed DRM calls in this listener are {@code getDrmPropertyString}
- * and {@code setDrmPropertyString}.
+ * The only allowed DRM calls in this listener are {@link #getDrmPropertyString}
+ * and {@link #setDrmPropertyString}.
*/
public interface OnDrmConfigHelper
{
@@ -2170,6 +2172,7 @@
*
* @param listener the callback that will be run
*/
+ // This is a synchronous call.
public abstract void setOnDrmConfigHelper(OnDrmConfigHelper listener);
/**
@@ -2188,7 +2191,7 @@
public void onDrmInfo(MediaPlayer2 mp, DataSourceDesc dsd, DrmInfo drmInfo) { }
/**
- * Called to notify the client that {@code prepareDrm} is finished and ready for
+ * Called to notify the client that {@link #prepareDrm} is finished and ready for
* key request/response.
*
* @param mp the {@code MediaPlayer2} associated with this callback
@@ -2208,12 +2211,14 @@
* @param eventCallback the callback that will be run
* @param executor the executor through which the callback should be invoked
*/
+ // This is a synchronous call.
public abstract void setDrmEventCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull DrmEventCallback eventCallback);
/**
* Clears the {@link DrmEventCallback}.
*/
+ // This is a synchronous call.
public abstract void clearDrmEventCallback();
/**
@@ -2260,10 +2265,10 @@
/**
* Prepares the DRM for the current source
* <p>
- * If {@code OnDrmConfigHelper} is registered, it will be called during
+ * If {@link OnDrmConfigHelper} is registered, it will be called during
* preparation to allow configuration of the DRM properties before opening the
* DRM session. Note that the callback is called synchronously in the thread that called
- * {@code prepareDrm}. It should be used only for a series of {@code getDrmPropertyString}
+ * {@link #prepareDrm}. It should be used only for a series of {@code getDrmPropertyString}
* and {@code setDrmPropertyString} calls and refrain from any lengthy operation.
* <p>
* If the device has not been provisioned before, this call also provisions the device
@@ -2293,6 +2298,7 @@
* @throws ProvisioningServerErrorException if provisioning is required but failed due to
* the request denied by the provisioning server
*/
+ // This is a synchronous call.
public abstract void prepareDrm(@NonNull UUID uuid)
throws UnsupportedSchemeException, ResourceBusyException,
ProvisioningNetworkErrorException, ProvisioningServerErrorException;
@@ -2306,6 +2312,7 @@
*
* @throws NoDrmSchemeException if there is no active DRM session to release
*/
+ // This is an asynchronous call.
public abstract void releaseDrm() throws NoDrmSchemeException;
/**
@@ -2371,6 +2378,7 @@
* @throws DeniedByServerException if the response indicates that the
* server rejected the request
*/
+ // This is a synchronous call.
public abstract byte[] provideDrmKeyResponse(
@Nullable byte[] keySetId, @NonNull byte[] response)
throws NoDrmSchemeException, DeniedByServerException;
@@ -2381,6 +2389,7 @@
*
* @param keySetId identifies the saved key set to restore
*/
+ // This is an asynchronous call.
public abstract void restoreDrmKeys(@NonNull byte[] keySetId)
throws NoDrmSchemeException;
@@ -2408,6 +2417,7 @@
* {@link MediaDrm#PROPERTY_VENDOR}, {@link MediaDrm#PROPERTY_VERSION},
* {@link MediaDrm#PROPERTY_DESCRIPTION}, {@link MediaDrm#PROPERTY_ALGORITHMS}
*/
+ // This is a synchronous call.
public abstract void setDrmPropertyString(
@NonNull @MediaDrm.StringProperty String propertyName, @NonNull String value)
throws NoDrmSchemeException;
diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java
index 50e3543..7c114df 100644
--- a/media/java/android/media/MediaPlayer2Impl.java
+++ b/media/java/android/media/MediaPlayer2Impl.java
@@ -35,16 +35,16 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
-import android.os.Process;
import android.os.PowerManager;
+import android.os.Process;
import android.os.SystemProperties;
import android.provider.Settings;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
+import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
-import android.util.ArrayMap;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.widget.VideoView;
@@ -63,10 +63,7 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.lang.Runnable;
import java.lang.ref.WeakReference;
-import java.net.CookieHandler;
-import java.net.CookieManager;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -74,15 +71,15 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
-import java.util.Collections;
-import java.util.concurrent.Executor;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.UUID;
import java.util.Vector;
+import java.util.concurrent.Executor;
/**
@@ -135,6 +132,14 @@
private ProvisioningThread mDrmProvisioningThread;
//--- guarded by |mDrmLock| end
+ private HandlerThread mHandlerThread;
+ private final Handler mTaskHandler;
+ private final Object mTaskLock = new Object();
+ @GuardedBy("mTaskLock")
+ private final List<Task> mPendingTasks = new LinkedList<>();
+ @GuardedBy("mTaskLock")
+ private Task mCurrentTask;
+
/**
* Default constructor.
* <p>When done with the MediaPlayer2Impl, you should call {@link #close()},
@@ -151,6 +156,11 @@
mEventHandler = null;
}
+ mHandlerThread = new HandlerThread("MediaPlayer2TaskThread");
+ mHandlerThread.start();
+ looper = mHandlerThread.getLooper();
+ mTaskHandler = new Handler(looper);
+
mTimeProvider = new TimeProvider(this);
mOpenSubtitleSources = new Vector<InputStream>();
mGuard.open("close");
@@ -201,8 +211,18 @@
*/
@Override
public void play() {
- stayAwake(true);
- _start();
+ synchronized (mTaskLock) {
+ mPendingTasks.add(new Task(MEDIA_CALL_PLAY, false) {
+ @Override
+ int process() {
+ stayAwake(true);
+ _start();
+ // TODO: define public constants for return value (status).
+ return 0;
+ }
+ });
+ processPendingTask_l();
+ }
}
private native void _start() throws IllegalStateException;
@@ -218,7 +238,21 @@
* @throws IllegalStateException if it is called in an invalid state
*/
@Override
- public native void prepare();
+ public void prepare() {
+ synchronized (mTaskLock) {
+ mPendingTasks.add(new Task(MEDIA_CALL_PREPARE, true) {
+ @Override
+ int process() {
+ _prepare();
+ // TODO: define public constants for return value (status).
+ return 0;
+ }
+ });
+ processPendingTask_l();
+ }
+ }
+
+ public native void _prepare();
/**
* Pauses playback. Call play() to resume.
@@ -695,6 +729,18 @@
public void clearPendingCommands() {
}
+ @GuardedBy("mTaskLock")
+ private void processPendingTask_l() {
+ if (mCurrentTask != null) {
+ return;
+ }
+ if (!mPendingTasks.isEmpty()) {
+ Task task = mPendingTasks.remove(0);
+ mCurrentTask = task;
+ mTaskHandler.post(task);
+ }
+ }
+
private void handleDataSource(boolean isCurrent, @NonNull DataSourceDesc dsd, long srcId)
throws IOException {
Preconditions.checkNotNull(dsd, "the DataSourceDesc cannot be null");
@@ -2525,6 +2571,10 @@
synchronized (mEventCbLock) {
mEventCallbackRecords.clear();
}
+ if (mHandlerThread != null) {
+ mHandlerThread.quitSafely();
+ mHandlerThread = null;
+ }
if (mTimeProvider != null) {
mTimeProvider.close();
mTimeProvider = null;
@@ -2638,6 +2688,13 @@
}
}
}
+ synchronized (mTaskLock) {
+ if (mCurrentTask.mMediaCallType == MEDIA_CALL_PREPARE
+ && mCurrentTask.mNeedToWaitForEventToComplete) {
+ mCurrentTask = null;
+ processPendingTask_l();
+ }
+ }
return;
}
@@ -4506,4 +4563,38 @@
}
}
}
+
+ private abstract class Task implements Runnable {
+ private final int mMediaCallType;
+ private final boolean mNeedToWaitForEventToComplete;
+
+ public Task (int mediaCallType, boolean needToWaitForEventToComplete) {
+ mMediaCallType = mediaCallType;
+ mNeedToWaitForEventToComplete = needToWaitForEventToComplete;
+ }
+
+ abstract int process();
+
+ @Override
+ public void run() {
+ int status = process();
+
+ if (!mNeedToWaitForEventToComplete) {
+ final DataSourceDesc dsd;
+ synchronized (mSrcLock) {
+ dsd = mCurrentDSD;
+ }
+ synchronized (mEventCbLock) {
+ for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ cb.first.execute(() -> cb.second.onCallComplete(
+ MediaPlayer2Impl.this, dsd, mMediaCallType, status));
+ }
+ }
+ synchronized (mTaskLock) {
+ mCurrentTask = null;
+ processPendingTask_l();
+ }
+ }
+ }
+ };
}
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index d94be66..cad63e3 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -709,8 +709,7 @@
* @param player a {@link MediaPlayerBase} that handles actual media playback in your app.
*/
U setPlayer(@NonNull MediaPlayerBase player) {
- // TODO(jaewan): Change the provider properly (b/74093082)
- mProvider.setPlayer_impl(player, null, null);
+ mProvider.setPlayer_impl(player);
return (U) this;
}
@@ -722,7 +721,7 @@
* {@code player.}
*/
U setPlaylistController(@NonNull MediaPlaylistController mplc) {
- // TODO(jaewan): implement this (b/74093082)
+ mProvider.setPlaylistController_impl(mplc);
return (U) this;
}
@@ -733,7 +732,7 @@
* @param volumeProvider The provider that will receive volume button events.
*/
U setVolumeProvider(@NonNull VolumeProvider2 volumeProvider) {
- // TODO(jaewan): implement this (b/74093082)
+ mProvider.setVolumeProvider_impl(volumeProvider);
return (U) this;
}
@@ -805,25 +804,16 @@
@Override
public Builder setPlayer(@NonNull MediaPlayerBase player) {
- if (player == null) {
- throw new IllegalArgumentException("Illegal null MediaPlayerBase");
- }
return super.setPlayer(player);
}
@Override
public Builder setPlaylistController(@NonNull MediaPlaylistController mplc) {
- if (mplc == null) {
- throw new IllegalArgumentException("Illegal null MediaPlaylistController");
- }
return super.setPlaylistController(mplc);
}
@Override
public Builder setVolumeProvider(@NonNull VolumeProvider2 volumeProvider) {
- if (volumeProvider == null) {
- throw new IllegalArgumentException("Illegal null VolumeProvider2");
- }
return super.setVolumeProvider(volumeProvider);
}
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index 50b4acb..963457b 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -52,6 +52,7 @@
void setOnMediaKeyListener(in IOnMediaKeyListener listener);
// MediaSession2
+ boolean isTrusted(int uid, String packageName);
boolean createSession2(in Bundle sessionToken);
void destroySession2(in Bundle sessionToken);
List<Bundle> getSessionTokens(boolean activeSessionOnly, boolean sessionServiceOnly);
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index d079b7a..6b130cc 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -340,6 +340,25 @@
}
/**
+ * Returns whether the api
+ *
+ * @param uid uid of the app
+ * @param packageName packageName
+ * @hide
+ */
+ public boolean isTrusted(int uid, @NonNull String packageName) {
+ if (packageName == null) {
+ return false;
+ }
+ try {
+ return mService.isTrusted(uid, packageName);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Cannot communicate with the service.", e);
+ }
+ return false;
+ }
+
+ /**
* Called when a {@link MediaSession2} is created.
* @hide
*/
diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java
index f97a6f0..2951752 100644
--- a/media/java/android/media/update/MediaSession2Provider.java
+++ b/media/java/android/media/update/MediaSession2Provider.java
@@ -123,8 +123,9 @@
}
interface BuilderBaseProvider<T extends MediaSession2, C extends SessionCallback> {
- void setPlayer_impl(MediaPlayerBase player, MediaPlaylistController mplc,
- VolumeProvider2 volumeProvider);
+ void setPlayer_impl(MediaPlayerBase player);
+ void setPlaylistController_impl(MediaPlaylistController mplc);
+ void setVolumeProvider_impl(VolumeProvider2 volumeProvider);
void setSessionActivity_impl(PendingIntent pi);
void setId_impl(String id);
void setSessionCallback_impl(Executor executor, C callback);
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java
index a647dcc..32a00d5 100755
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -292,7 +292,9 @@
mCloseGuard.close();
if (mClosed.compareAndSet(false, true)) {
mMediaScanner.close();
- mMediaProvider.close();
+ if (mMediaProvider != null) {
+ mMediaProvider.close();
+ }
native_finalize();
}
}
diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp
index af78777..918b82b 100644
--- a/media/jni/android_media_MediaPlayer2.cpp
+++ b/media/jni/android_media_MediaPlayer2.cpp
@@ -1490,7 +1490,7 @@
{"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer2_setVideoSurface},
{"getBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer2_getBufferingParams},
{"setBufferingParams", "(Landroid/media/BufferingParams;)V", (void *)android_media_MediaPlayer2_setBufferingParams},
- {"prepare", "()V", (void *)android_media_MediaPlayer2_prepare},
+ {"_prepare", "()V", (void *)android_media_MediaPlayer2_prepare},
{"_start", "()V", (void *)android_media_MediaPlayer2_start},
{"_stop", "()V", (void *)android_media_MediaPlayer2_stop},
{"native_getMediaPlayer2State", "()I", (void *)android_media_MediaPlayer2_getMediaPlayer2State},
diff --git a/packages/CaptivePortalLogin/res/values-as/strings.xml b/packages/CaptivePortalLogin/res/values-as/strings.xml
index 2281ce7..6791d1b 100644
--- a/packages/CaptivePortalLogin/res/values-as/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-as/strings.xml
@@ -6,8 +6,7 @@
<string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটৱৰ্কটো ব্যৱহাৰ নকৰিব"</string>
<!-- no translation found for action_bar_label (917235635415966620) -->
<skip />
- <!-- no translation found for action_bar_title (5645564790486983117) -->
- <skip />
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$st ছাইন ইন কৰক"</string>
<!-- no translation found for ssl_error_warning (6653188881418638872) -->
<skip />
<!-- no translation found for ssl_error_example (647898534624078900) -->
diff --git a/packages/CarrierDefaultApp/res/values-as/strings.xml b/packages/CarrierDefaultApp/res/values-as/strings.xml
index 61171bc..8650171 100644
--- a/packages/CarrierDefaultApp/res/values-as/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-as/strings.xml
@@ -7,12 +7,9 @@
<string name="no_data_notification_id" msgid="668400731803969521">"আপোনাৰ ম\'বাইল ডেটা সেৱা নিষ্ক্ৰিয় কৰা হৈছে"</string>
<string name="portal_notification_detail" msgid="2295729385924660881">"%s ৱেবছাইটটোলৈ যাবলৈ টিপক"</string>
<string name="no_data_notification_detail" msgid="3112125343857014825">"অনুগ্ৰহ কৰি আপোনাৰ সেৱা প্ৰদানকাৰী %sৰ সৈতে যোগাযোগ কৰক"</string>
- <!-- no translation found for no_mobile_data_connection_title (7449525772416200578) -->
- <skip />
- <!-- no translation found for no_mobile_data_connection (544980465184147010) -->
- <skip />
- <!-- no translation found for mobile_data_status_notification_channel_name (833999690121305708) -->
- <skip />
+ <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"কোনো ম\'বাইল ডেটা সংযোগ নাই"</string>
+ <string name="no_mobile_data_connection" msgid="544980465184147010">"%sৰ যোগেৰে ডেটা বা ৰ\'মিঙৰ আঁচনি যোগ কৰক"</string>
+ <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"ম\'বাইল ডেটাৰ স্থিতি"</string>
<string name="action_bar_label" msgid="4290345990334377177">"ম\'বাইল নেটৱৰ্কত ছাইন ইন কৰক"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"আপুনি সংযোগ কৰিবলৈ বিচৰা নেটৱৰ্কটোত সুৰক্ষাজনিত সমস্যা আছে।"</string>
<string name="ssl_error_example" msgid="6188711843183058764">"উদাহৰণ স্বৰূপে, আপোনাক দেখুওৱা লগ ইনৰ পৃষ্ঠাটো প্ৰতিষ্ঠানটোৰ নিজা নহ\'বও পাৰে।"</string>
diff --git a/packages/InputDevices/res/values-as/strings.xml b/packages/InputDevices/res/values-as/strings.xml
index 26da1b1..078eedd 100644
--- a/packages/InputDevices/res/values-as/strings.xml
+++ b/packages/InputDevices/res/values-as/strings.xml
@@ -8,8 +8,7 @@
<string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ইংৰাজী (ইউ. কে.), আন্তঃৰাষ্ট্ৰীয় ষ্টাইল"</string>
<string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ইংৰাজী (ইউ. কে.), ক\'লমেক ষ্টাইল"</string>
<string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ইংৰাজী (ইউ. কে.), ডভ\'ৰাক ষ্টাইল"</string>
- <!-- no translation found for keyboard_layout_english_us_workman_label (2944541595262173111) -->
- <skip />
+ <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"ইংৰাজী (ইউ. এছ.), ৱার্কমেন ষ্টাইল"</string>
<string name="keyboard_layout_german_label" msgid="8451565865467909999">"জাৰ্মান"</string>
<string name="keyboard_layout_french_label" msgid="813450119589383723">"ফৰাচী"</string>
<string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ফৰাচী (কানাডা)"</string>
@@ -42,8 +41,6 @@
<string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"লিথুৱানিয়ান"</string>
<string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"স্পেনিশ্ব (লেটিন)"</string>
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"লাটভিয়ান"</string>
- <!-- no translation found for keyboard_layout_persian (3920643161015888527) -->
- <skip />
- <!-- no translation found for keyboard_layout_azerbaijani (7315895417176467567) -->
- <skip />
+ <string name="keyboard_layout_persian" msgid="3920643161015888527">"ফাৰ্চী"</string>
+ <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"আজাৰবাইজানী"</string>
</resources>
diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml
index 2b982da..eece5b7 100644
--- a/packages/InputDevices/res/values-or/strings.xml
+++ b/packages/InputDevices/res/values-or/strings.xml
@@ -8,8 +8,7 @@
<string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ଇଂରାଜୀ (ୟୁଏସ୍), ଇଣ୍ଟରନେସନାଲ୍ ଷ୍ଟାଇଲ୍"</string>
<string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ଇଂରାଜୀ (ୟୁଏସ୍), କୋଲେମକ୍ ଷ୍ଟାଇଲ୍"</string>
<string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ଇଂରାଜୀ (ୟୁଏସ୍), ଡଭୋରାକ୍ ଷ୍ଟାଇଲ୍"</string>
- <!-- no translation found for keyboard_layout_english_us_workman_label (2944541595262173111) -->
- <skip />
+ <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"ଇଂରାଜୀ (ୟୁଏସ୍), ୱର୍କମ୍ୟାନ୍ ଷ୍ଟାଇଲ୍"</string>
<string name="keyboard_layout_german_label" msgid="8451565865467909999">"ଜର୍ମାନ୍"</string>
<string name="keyboard_layout_french_label" msgid="813450119589383723">"ଫ୍ରେଞ୍ଚ"</string>
<string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ଫ୍ରେଞ୍ଚ (କାନାଡ଼ା)"</string>
diff --git a/packages/MtpDocumentsProvider/AndroidManifest.xml b/packages/MtpDocumentsProvider/AndroidManifest.xml
index 8d79f62..c0a59b3 100644
--- a/packages/MtpDocumentsProvider/AndroidManifest.xml
+++ b/packages/MtpDocumentsProvider/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="com.android.mtp"
android:sharedUserId="android.media">
<uses-feature android:name="android.hardware.usb.host" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.MANAGE_USB" />
<application android:label="@string/app_label">
<provider
diff --git a/packages/MtpDocumentsProvider/res/values-as/strings.xml b/packages/MtpDocumentsProvider/res/values-as/strings.xml
new file mode 100644
index 0000000..c8bdbd6
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-as/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"এমটিপি হ\'ষ্ট"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ডাউনল\'ডসমূহ"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>ৰ পৰা ফাইলসমূহ চোৱা হৈছে"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"আনটো ডিভাইচ ব্যস্ত হৈ আছে। সেইটো উপলব্ধ নোহোৱালৈকে আপুনি ফাইলসমূহ স্থানান্তৰ কৰিব নোৱাৰে।"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"কোনো ফাইল পোৱা নগ\'ল। আনটো ডিভাইচ লক হৈ থাকিব পাৰে। যদি লক হৈ আছে, তেন্তে আনলক কৰি আকৌ চেষ্টা কৰক।"</string>
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-or/strings.xml b/packages/MtpDocumentsProvider/res/values-or/strings.xml
new file mode 100644
index 0000000..79de689
--- /dev/null
+++ b/packages/MtpDocumentsProvider/res/values-or/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="6271216747302322594">"MTP ହୋଷ୍ଟ"</string>
+ <string name="downloads_app_label" msgid="7120690641874849726">"ଡାଉନଲୋଡ୍"</string>
+ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>ରୁ ଫାଇଲ୍ ଆକ୍ସେସ୍ କରାଯାଉଛି"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"ଅନ୍ୟ ଡିଭାଇସଟି ବ୍ୟସ୍ତ ଅଛି। ଏହା ଉପଲବ୍ଧ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଆପଣ ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ କରିପାରିବେ ନାହିଁ।"</string>
+ <string name="error_locked_device" msgid="7557872102188356147">"କୌଣସି ଫାଇଲ୍ ମିଳିଲା ନାହିଁ। ଅନ୍ୟ ଡିଭାଇସଟି ଲକ୍ ହୋଇଯାଇଥାଇପାରେ। ଯଦି ଏପରି ହୋଇଥାଏ, ଏହାକୁ ଅନଲକ୍ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+</resources>
diff --git a/packages/PrintSpooler/res/values-as/strings.xml b/packages/PrintSpooler/res/values-as/strings.xml
index 2beaac8..0a95c84 100644
--- a/packages/PrintSpooler/res/values-as/strings.xml
+++ b/packages/PrintSpooler/res/values-as/strings.xml
@@ -28,8 +28,7 @@
<skip />
<string name="label_orientation" msgid="2853142581990496477">"দিশ"</string>
<string name="label_pages" msgid="7768589729282182230">"পৃষ্ঠাসমূহ"</string>
- <!-- no translation found for destination_default_text (5422708056807065710) -->
- <skip />
+ <string name="destination_default_text" msgid="5422708056807065710">"প্ৰিণ্টাৰ বাছনি কৰক"</string>
<string name="template_all_pages" msgid="3322235982020148762">"সকলো <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
<string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ৰ পৰিসৰ"</string>
<string name="pages_range_example" msgid="8558694453556945172">"যেনে: ১—৫, ৮, ১১—১৩"</string>
@@ -40,8 +39,7 @@
<string name="save_as_pdf" msgid="5718454119847596853">"PDF ৰূপে ছেভ কৰক"</string>
<string name="all_printers" msgid="5018829726861876202">"সকলো প্ৰিণ্টাৰ…"</string>
<string name="print_dialog" msgid="32628687461331979">"প্ৰিণ্ট সংবাদ"</string>
- <!-- no translation found for current_page_template (5145005201131935302) -->
- <skip />
+ <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="page_description_template" msgid="6831239682256197161">"পৃষ্ঠা <xliff:g id="PAGE_COUNT">%2$d</xliff:g>ৰ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g>"</string>
<string name="summary_template" msgid="8899734908625669193">"সাৰাংশ, প্ৰতিলিপিসমূহ <xliff:g id="COPIES">%1$s</xliff:g>, কাগজৰ আকাৰ <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
<string name="expand_handle" msgid="7282974448109280522">"হেণ্ডেল বিস্তাৰ কৰক"</string>
@@ -59,36 +57,22 @@
<string name="print_select_printer" msgid="7388760939873368698">"প্ৰিণ্টাৰ বাছনি কৰক"</string>
<string name="print_forget_printer" msgid="5035287497291910766">"প্ৰিণ্টাৰ পাহৰি যাওক"</string>
<!-- no translation found for print_search_result_count_utterance (6997663738361080868) -->
- <!-- no translation found for printer_extended_description_template (1366699227703381874) -->
- <skip />
- <!-- no translation found for printer_info_desc (7181988788991581654) -->
- <skip />
- <!-- no translation found for notification_channel_progress (872788690775721436) -->
- <skip />
- <!-- no translation found for notification_channel_failure (9042250774797916414) -->
- <skip />
- <!-- no translation found for could_not_create_file (3425025039427448443) -->
- <skip />
- <!-- no translation found for print_services_disabled_toast (9089060734685174685) -->
- <skip />
+ <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
+ <string name="printer_info_desc" msgid="7181988788991581654">"এই প্ৰিণ্টাৰটোৰ বিষয়ে অধিক তথ্য"</string>
+ <string name="notification_channel_progress" msgid="872788690775721436">"প্ৰিণ্ট হৈ থকা কামবোৰ"</string>
+ <string name="notification_channel_failure" msgid="9042250774797916414">"প্ৰিণ্ট কৰিব নোৱাৰা কামবোৰ"</string>
+ <string name="could_not_create_file" msgid="3425025039427448443">"ফাইল সৃষ্টি কৰিব পৰা নগ\'ল"</string>
+ <string name="print_services_disabled_toast" msgid="9089060734685174685">"কিছুমান প্ৰিণ্ট সেৱা অক্ষম কৰা আছে"</string>
<string name="print_searching_for_printers" msgid="6550424555079932867">"প্ৰিণ্টাৰৰ সন্ধান কৰি আছে"</string>
- <!-- no translation found for print_no_print_services (8561247706423327966) -->
- <skip />
+ <string name="print_no_print_services" msgid="8561247706423327966">"কোনো প্ৰিণ্টাৰ সেৱা সক্ষম কৰা হোৱা নাই"</string>
<string name="print_no_printers" msgid="4869403323900054866">"প্ৰিণ্টাৰ পোৱা নগ\'ল"</string>
- <!-- no translation found for cannot_add_printer (7840348733668023106) -->
- <skip />
- <!-- no translation found for select_to_add_printers (3800709038689830974) -->
- <skip />
- <!-- no translation found for enable_print_service (3482815747043533842) -->
- <skip />
- <!-- no translation found for enabled_services_title (7036986099096582296) -->
- <skip />
- <!-- no translation found for recommended_services_title (3799434882937956924) -->
- <skip />
- <!-- no translation found for disabled_services_title (7313253167968363211) -->
- <skip />
- <!-- no translation found for all_services_title (5578662754874906455) -->
- <skip />
+ <string name="cannot_add_printer" msgid="7840348733668023106">"প্ৰিণ্টাৰ যোগ কৰিব নোৱাৰি"</string>
+ <string name="select_to_add_printers" msgid="3800709038689830974">"প্ৰিণ্টাৰ যোগ কৰিবলৈ বাছনি কৰক"</string>
+ <string name="enable_print_service" msgid="3482815747043533842">"সক্ষম কৰিবলৈ বাছনি কৰক"</string>
+ <string name="enabled_services_title" msgid="7036986099096582296">"সক্ষম কৰা সেৱাসমূহ"</string>
+ <string name="recommended_services_title" msgid="3799434882937956924">"অনুমোদিত সেৱাসমূহ"</string>
+ <string name="disabled_services_title" msgid="7313253167968363211">"অক্ষম কৰা সেৱাসমূহ"</string>
+ <string name="all_services_title" msgid="5578662754874906455">"সকলো সেৱা"</string>
<!-- no translation found for print_services_recommendation_subtitle (5678487708807185138) -->
<string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> প্ৰিণ্ট কৰি থকা হৈছে"</string>
<string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> বাতিল কৰি থকা হৈছে"</string>
@@ -98,10 +82,8 @@
<string name="restart" msgid="2472034227037808749">"ৰিষ্টাৰ্ট কৰক"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"প্ৰিণ্টাৰ সংযোগ হৈ থকা নাই"</string>
<string name="reason_unknown" msgid="5507940196503246139">"অজ্ঞাত"</string>
- <!-- no translation found for print_service_security_warning_title (2160752291246775320) -->
- <skip />
- <!-- no translation found for print_service_security_warning_summary (1427434625361692006) -->
- <skip />
+ <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> ব্যৱহাৰ কৰিবনে?"</string>
+ <string name="print_service_security_warning_summary" msgid="1427434625361692006">"আপোনাৰ নথি এক বা একাধিক ছার্ভাৰৰ যোগেৰে প্ৰিণ্টাৰলৈ যাব পাৰে।"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"ক\'লা আৰু বগা"</item>
<item msgid="2762241247228983754">"ৰং"</item>
@@ -119,7 +101,6 @@
<string name="print_error_default_message" msgid="8602678405502922346">"দুঃখিত, প্ৰিণ্টিঙৰ কাম নহ\'ল। পুনৰ চেষ্টা কৰক।"</string>
<string name="print_error_retry" msgid="1426421728784259538">"পুনৰ চেষ্টা কৰক"</string>
<string name="print_error_printer_unavailable" msgid="8985614415253203381">"এই প্ৰিণ্টাৰটো বৰ্তমান উপলব্ধ নহয়।"</string>
- <!-- no translation found for print_cannot_load_page (6179560924492912009) -->
- <skip />
+ <string name="print_cannot_load_page" msgid="6179560924492912009">"পূৰ্বদৰ্শন দেখুৱাব নোৱাৰি"</string>
<string name="print_preparing_preview" msgid="3939930735671364712">"পূৰ্বদৰ্শন প্ৰস্তুত কৰি আছে…"</string>
</resources>
diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml
index bfe4bfe..d9328d0 100644
--- a/packages/PrintSpooler/res/values-or/strings.xml
+++ b/packages/PrintSpooler/res/values-or/strings.xml
@@ -27,8 +27,7 @@
<string name="label_duplex" msgid="5370037254347072243">"ଦୁଇ-ତରଫା"</string>
<string name="label_orientation" msgid="2853142581990496477">"ଓରିଏଣ୍ଟେଶନ୍"</string>
<string name="label_pages" msgid="7768589729282182230">"ପୃଷ୍ଠା"</string>
- <!-- no translation found for destination_default_text (5422708056807065710) -->
- <skip />
+ <string name="destination_default_text" msgid="5422708056807065710">"ଗୋଟିଏ ପ୍ରିଣ୍ଟର୍ ଚୟନ କରନ୍ତୁ"</string>
<string name="template_all_pages" msgid="3322235982020148762">"ସମସ୍ତ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
<string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ର ରେଞ୍ଜ"</string>
<string name="pages_range_example" msgid="8558694453556945172">"ଯେପରିକି 1—5,8,11—13"</string>
@@ -39,8 +38,7 @@
<string name="save_as_pdf" msgid="5718454119847596853">"PDF ଭାବରେ ସେଭ୍ କରନ୍ତୁ"</string>
<string name="all_printers" msgid="5018829726861876202">"ସମସ୍ତ ପ୍ରିଣ୍ଟର୍…"</string>
<string name="print_dialog" msgid="32628687461331979">"ପ୍ରିଣ୍ଟ ଡାୟଲଗ୍"</string>
- <!-- no translation found for current_page_template (5145005201131935302) -->
- <skip />
+ <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="PAGE_COUNT">%2$d</xliff:g>ରୁ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> ପୃଷ୍ଠା"</string>
<string name="summary_template" msgid="8899734908625669193">"ସାରାଂଶ, କପୀ <xliff:g id="COPIES">%1$s</xliff:g>, କାଗଜ ଆକାର <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
<string name="expand_handle" msgid="7282974448109280522">"ହ୍ୟାଣ୍ଡେଲ୍ ବଡ଼ କରନ୍ତୁ"</string>
@@ -61,21 +59,17 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା</item>
</plurals>
- <!-- no translation found for printer_extended_description_template (1366699227703381874) -->
- <skip />
- <!-- no translation found for printer_info_desc (7181988788991581654) -->
- <skip />
+ <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
+ <string name="printer_info_desc" msgid="7181988788991581654">"ଏହି ପ୍ରିଣ୍ଟର୍ ବିଷୟରେ ଅଧିକ ସୂଚନା"</string>
<!-- no translation found for notification_channel_progress (872788690775721436) -->
<skip />
<!-- no translation found for notification_channel_failure (9042250774797916414) -->
<skip />
- <!-- no translation found for could_not_create_file (3425025039427448443) -->
- <skip />
+ <string name="could_not_create_file" msgid="3425025039427448443">"ଫାଇଲ୍ ତିଆରି କରିହେଲା ନାହିଁ"</string>
<!-- no translation found for print_services_disabled_toast (9089060734685174685) -->
<skip />
<string name="print_searching_for_printers" msgid="6550424555079932867">"ପ୍ରିଣ୍ଟର୍ ଖୋଜାଯାଉଛି"</string>
- <!-- no translation found for print_no_print_services (8561247706423327966) -->
- <skip />
+ <string name="print_no_print_services" msgid="8561247706423327966">"କୌଣସି ପ୍ରିଣ୍ଟ ସେବା ସକ୍ଷମ କରାଯାଇନାହିଁ"</string>
<string name="print_no_printers" msgid="4869403323900054866">"କୌଣସି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା ନାହିଁ"</string>
<!-- no translation found for cannot_add_printer (7840348733668023106) -->
<skip />
@@ -100,10 +94,8 @@
<string name="restart" msgid="2472034227037808749">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"ପ୍ରିଣ୍ଟର୍କୁ କୌଣସି ସଂଯୋଗ ନାହିଁ"</string>
<string name="reason_unknown" msgid="5507940196503246139">"ଅଜଣା"</string>
- <!-- no translation found for print_service_security_warning_title (2160752291246775320) -->
- <skip />
- <!-- no translation found for print_service_security_warning_summary (1427434625361692006) -->
- <skip />
+ <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> ବ୍ୟବହାର କରିବେ?"</string>
+ <string name="print_service_security_warning_summary" msgid="1427434625361692006">"ଆପଣଙ୍କ ଡକୁମେଣ୍ଟ ପ୍ରିଣ୍ଟରକୁ ଯିବାବେଳେ ଏକ କିମ୍ବା ଅଧିକ ସର୍ଭର ଦେଇ ଯାଇପାରେ।"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"କଳା ଓ ଧଳା"</item>
<item msgid="2762241247228983754">"ରଙ୍ଗ"</item>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 8ff83b0..0f8152f 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -220,8 +220,7 @@
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Select private DNS mode"</string>
<string name="private_dns_mode_off" msgid="8236575187318721684">"Off"</string>
- <!-- no translation found for private_dns_mode_opportunistic (8314986739896927399) -->
- <skip />
+ <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Private DNS provider hostname"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Enter hostname of DNS provider"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
@@ -357,39 +356,24 @@
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">%1$s</xliff:g> left"</string>
- <!-- no translation found for power_discharging_duration (6655472132189365839) -->
- <skip />
+ <string name="power_discharging_duration" msgid="6655472132189365839">"About <xliff:g id="TIME">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage"</string>
- <!-- no translation found for power_discharging_duration_enhanced (5726302316642148671) -->
- <skip />
+ <string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> left"</string>
- <!-- no translation found for power_discharge_by_enhanced (8788299408879961465) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (7692297898877104416) -->
- <skip />
- <!-- no translation found for power_discharge_by (6427074755635635749) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (5888058889261108064) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="8788299408879961465">"Will last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="7692297898877104416">"Will last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
+ <string name="power_discharge_by" msgid="6427074755635635749">"Will last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="5888058889261108064">"Will last until about <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
- <!-- no translation found for power_remaining_less_than_duration (5751885147712659423) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (3176771815132876675) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8931654680569617380) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1181059207608751924) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2606370266981054691) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2918084807716859985) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (3090926004324573908) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7466484148515796216) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (603933521600231649) -->
- <skip />
+ <string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8931654680569617380">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="1181059207608751924">"Phone may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="2606370266981054691">"Tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="2918084807716859985">"Device may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="3090926004324573908">"Phone may shutdown soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7466484148515796216">"Tablet may shutdown soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"Device may shutdown soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> left until fully charged"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> until fully charged"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 56e97e4..945a78e 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -220,8 +220,7 @@
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Select Private DNS Mode"</string>
<string name="private_dns_mode_off" msgid="8236575187318721684">"Off"</string>
- <!-- no translation found for private_dns_mode_opportunistic (8314986739896927399) -->
- <skip />
+ <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Private DNS provider hostname"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Enter hostname of DNS provider"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
@@ -357,39 +356,24 @@
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">%1$s</xliff:g> left"</string>
- <!-- no translation found for power_discharging_duration (6655472132189365839) -->
- <skip />
+ <string name="power_discharging_duration" msgid="6655472132189365839">"About <xliff:g id="TIME">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage"</string>
- <!-- no translation found for power_discharging_duration_enhanced (5726302316642148671) -->
- <skip />
+ <string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> left"</string>
- <!-- no translation found for power_discharge_by_enhanced (8788299408879961465) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (7692297898877104416) -->
- <skip />
- <!-- no translation found for power_discharge_by (6427074755635635749) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (5888058889261108064) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="8788299408879961465">"Will last until about about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="7692297898877104416">"Will last until about about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
+ <string name="power_discharge_by" msgid="6427074755635635749">"Will last until about about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="5888058889261108064">"Will last until about about <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
- <!-- no translation found for power_remaining_less_than_duration (5751885147712659423) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (3176771815132876675) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8931654680569617380) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1181059207608751924) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2606370266981054691) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2918084807716859985) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (3090926004324573908) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7466484148515796216) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (603933521600231649) -->
- <skip />
+ <string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8931654680569617380">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="1181059207608751924">"Phone may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="2606370266981054691">"Tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="2918084807716859985">"Device may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="3090926004324573908">"Phone may shutdown soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7466484148515796216">"Tablet may shutdown soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"Device may shutdown soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> left until fully charged"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> until fully charged"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 8225c4d..9af818e 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -220,8 +220,7 @@
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privé"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Sélectionner le mode DNS privé"</string>
<string name="private_dns_mode_off" msgid="8236575187318721684">"Désactivé"</string>
- <!-- no translation found for private_dns_mode_opportunistic (8314986739896927399) -->
- <skip />
+ <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatique"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'hôte du fournisseur DNS privé"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Saisissez le nom d\'hôte du fournisseur DNS"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options de la certification de l\'affichage sans fil"</string>
@@ -357,39 +356,24 @@
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Cette fonctionnalité est expérimentale et peut affecter les performances."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"Il reste environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharging_duration (6655472132189365839) -->
- <skip />
+ <string name="power_discharging_duration" msgid="6655472132189365839">"Temps restant : environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharging_duration_enhanced (5726302316642148671) -->
- <skip />
+ <string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Temps restant en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>) : environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant : <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (8788299408879961465) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (7692297898877104416) -->
- <skip />
- <!-- no translation found for power_discharge_by (6427074755635635749) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (5888058889261108064) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="8788299408879961465">"Temps restant en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>) : jusqu\'à <xliff:g id="TIME">%1$s</xliff:g> environ"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="7692297898877104416">"Temps restant en fonction de votre utilisation : jusqu\'à <xliff:g id="TIME">%1$s</xliff:g> environ"</string>
+ <string name="power_discharge_by" msgid="6427074755635635749">"Temps restant : jusqu\'à <xliff:g id="TIME">%1$s</xliff:g> environ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="5888058889261108064">"Temps restant : jusqu\'à <xliff:g id="TIME">%1$s</xliff:g> environ"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
- <!-- no translation found for power_remaining_less_than_duration (5751885147712659423) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (3176771815132876675) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8931654680569617380) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1181059207608751924) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2606370266981054691) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2918084807716859985) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (3090926004324573908) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7466484148515796216) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (603933521600231649) -->
- <skip />
+ <string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8931654680569617380">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="1181059207608751924">"Il est possible que le téléphone s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="2606370266981054691">"Il est possible que la tablette s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="2918084807716859985">"Il est possible que l\'appareil s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="3090926004324573908">"Il est possible que le téléphone s\'éteigne bientôt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7466484148515796216">"Il est possible que la tablette s\'éteigne bientôt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"Il est possible que l\'appareil s\'éteigne bientôt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> avant charge complète"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> jusqu\'à la charge complète"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index bc9c82e..e4c0131 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -220,8 +220,7 @@
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS particular"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecione o modo DNS particular"</string>
<string name="private_dns_mode_off" msgid="8236575187318721684">"Desativado"</string>
- <!-- no translation found for private_dns_mode_opportunistic (8314986739896927399) -->
- <skip />
+ <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nome do host do provedor de DNS particular"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Informe o nome do host do provedor de DNS"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções de certificação de Display sem fio"</string>
@@ -357,39 +356,24 @@
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Este recurso é experimental e pode afetar o desempenho."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
- <!-- no translation found for power_discharging_duration (6655472132189365839) -->
- <skip />
+ <string name="power_discharging_duration" msgid="6655472132189365839">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso"</string>
- <!-- no translation found for power_discharging_duration_enhanced (5726302316642148671) -->
- <skip />
+ <string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
- <!-- no translation found for power_discharge_by_enhanced (8788299408879961465) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (7692297898877104416) -->
- <skip />
- <!-- no translation found for power_discharge_by (6427074755635635749) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (5888058889261108064) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="8788299408879961465">"Com base no seu uso, ela durará até aproximadamente <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="7692297898877104416">"Com base no seu uso, ela durará até aproximadamente <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6427074755635635749">"Durará até aproximadamente <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="5888058889261108064">"Durará até aproximadamente <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string>
- <!-- no translation found for power_remaining_less_than_duration (5751885147712659423) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (3176771815132876675) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8931654680569617380) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1181059207608751924) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2606370266981054691) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2918084807716859985) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (3090926004324573908) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7466484148515796216) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (603933521600231649) -->
- <skip />
+ <string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8931654680569617380">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="1181059207608751924">"O smartphone pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="2606370266981054691">"O tablet pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="2918084807716859985">"O dispositivo pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="3090926004324573908">"O smartphone pode ser desligado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7466484148515796216">"O tablet pode ser desligado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"O dispositivo pode ser desligado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> restante(s) até a carga completa"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> até a carga completa"</string>
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index d59df6c..c173225 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -80,6 +80,7 @@
<string name="def_unlock_sound" translatable="false">/system/media/audio/ui/Unlock.ogg</string>
<string name="def_trusted_sound" translatable="false">/system/media/audio/ui/Trusted.ogg</string>
<string name="def_wireless_charging_started_sound" translatable="false">/system/media/audio/ui/WirelessChargingStarted.ogg</string>
+ <string name="def_charging_started_sound" translatable="false">/system/media/audio/ui/ChargingStarted.ogg</string>
<bool name="def_lockscreen_disabled">false</bool>
<bool name="def_device_provisioned">false</bool>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index bbb4fc8..a317e3e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -3028,7 +3028,7 @@
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 155;
+ private static final int SETTINGS_VERSION = 156;
private final int mUserId;
@@ -3673,6 +3673,28 @@
currentVersion = 155;
}
+ if (currentVersion == 155) {
+ // Version 155: Set the default value for CHARGING_STARTED_SOUND.
+ final SettingsState globalSettings = getGlobalSettingsLocked();
+ final String oldValue = globalSettings.getSettingLocked(
+ Global.CHARGING_STARTED_SOUND).getValue();
+ final String oldDefault = getContext().getResources().getString(
+ R.string.def_wireless_charging_started_sound);
+ if (TextUtils.equals(null, oldValue)
+ || TextUtils.equals(oldValue, oldDefault)) {
+ final String defaultValue = getContext().getResources().getString(
+ R.string.def_charging_started_sound);
+ if (!TextUtils.isEmpty(defaultValue)) {
+ globalSettings.insertSettingLocked(
+ Settings.Global.CHARGING_STARTED_SOUND, defaultValue,
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+
+ }
+ currentVersion = 156;
+ }
+
+
// vXXX: Add new settings above this point.
if (currentVersion != newVersion) {
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index d284bf9..937b939 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -44,6 +44,7 @@
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.MANAGE_USB" />
<uses-permission android:name="android.permission.USE_RESERVED_DISK" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!-- System tool permissions granted to the shell. -->
<uses-permission android:name="android.permission.REAL_GET_TASKS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
@@ -125,6 +126,8 @@
<uses-permission android:name="android.permission.MANAGE_AUTO_FILL" />
<uses-permission android:name="android.permission.NETWORK_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+ <uses-permission android:name="android.permission.SET_TIME" />
+ <uses-permission android:name="android.permission.SET_TIME_ZONE" />
<!-- Permission needed to rename bugreport notifications (so they're not shown as Shell) -->
<uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
<!-- Permission needed to hold a wakelock in dumpstate.cpp (drop_root_user()) -->
diff --git a/packages/Shell/res/values-as/strings.xml b/packages/Shell/res/values-as/strings.xml
index 9d6c37a..de6f78c 100644
--- a/packages/Shell/res/values-as/strings.xml
+++ b/packages/Shell/res/values-as/strings.xml
@@ -18,56 +18,31 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="3701846017049540910">"শ্বেল"</string>
<string name="bugreport_notification_channel" msgid="2574150205913861141">"বাগ সম্পৰ্কীয় প্ৰতিবেদন"</string>
- <!-- no translation found for bugreport_in_progress_title (4311705936714972757) -->
- <skip />
- <!-- no translation found for bugreport_finished_title (4429132808670114081) -->
- <skip />
- <!-- no translation found for bugreport_updating_title (4423539949559634214) -->
- <skip />
- <!-- no translation found for bugreport_updating_wait (3322151947853929470) -->
- <skip />
- <!-- no translation found for bugreport_finished_text (1223616207145252689) -->
- <skip />
- <!-- no translation found for bugreport_finished_text (5758325479058638893) -->
- <skip />
- <!-- no translation found for bugreport_finished_text (8353769438382138847) -->
- <skip />
- <!-- no translation found for bugreport_finished_pending_screenshot_text (2343263822812016950) -->
- <skip />
- <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
- <skip />
- <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
- <skip />
- <!-- no translation found for bugreport_confirm (5917407234515812495) -->
- <skip />
- <!-- no translation found for bugreport_confirm_dont_repeat (6179945398364357318) -->
- <skip />
+ <string name="bugreport_in_progress_title" msgid="4311705936714972757">"বাগ সম্পর্কীয় অভিযোগ <xliff:g id="ID">#%d</xliff:g> সৃষ্টি কৰি থকা হৈছে"</string>
+ <string name="bugreport_finished_title" msgid="4429132808670114081">"বাগ সম্পর্কীয় অভিযোগ <xliff:g id="ID">#%d</xliff:g> ৰেকৰ্ড কৰা হ\'ল"</string>
+ <string name="bugreport_updating_title" msgid="4423539949559634214">"বাগ সম্পর্কীয় অভিযোগটোত বিশদ তথ্য যোগ কৰি থকা হৈছে"</string>
+ <string name="bugreport_updating_wait" msgid="3322151947853929470">"অনুগ্রহ কৰি অপেক্ষা কৰক…"</string>
+ <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"ফ\'নত বাগ সম্পর্কীয় অভিযোগ অতি সোনকালে উপলব্ধ হ\'ব"</string>
+ <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"আপোনাৰ বাগ সম্পৰ্কীয় অভিযোগ শ্বেয়াৰ কৰিবৰ বাবে বাছনি কৰক"</string>
+ <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"আপোনাৰ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবৰ বাবে ইয়াত টিপক"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"ষ্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পৰ্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ বাছনি কৰক বা ষ্ক্ৰীণশ্বট লোৱা কাৰ্য সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"স্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীণশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"স্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীণশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
+ <string name="bugreport_confirm" msgid="5917407234515812495">"বাগ সম্পর্কীয় অভিযোগত ছিষ্টেমৰ বিভিন্ন লগ ফাইল থাকে, ইয়াৰ ভিতৰত আপুনি স্পর্শকাতৰ বুলি গণ্য কৰা ডেটা (যেনে এপৰ ব্য়ৱহাৰ আৰু অৱস্থান সম্পৰ্কীয় তথ্য়) অন্তর্ভুক্ত হ\'ব পাৰে। কেৱল আপোনাৰ বিশ্বাসী লোক বা এপৰ সৈতেহে বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিব।"</string>
+ <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"পুনৰাই নেদেখুৱাব"</string>
<!-- no translation found for bugreport_storage_title (5332488144740527109) -->
<skip />
- <!-- no translation found for bugreport_unreadable_text (586517851044535486) -->
- <skip />
- <!-- no translation found for bugreport_add_details_to_zip_failed (1302931926486712371) -->
- <skip />
- <!-- no translation found for bugreport_unnamed (2800582406842092709) -->
- <skip />
- <!-- no translation found for bugreport_info_action (2158204228510576227) -->
- <skip />
- <!-- no translation found for bugreport_screenshot_action (8677781721940614995) -->
- <skip />
- <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) -->
- <skip />
- <!-- no translation found for bugreport_screenshot_failed (5853049140806834601) -->
- <skip />
- <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) -->
- <skip />
- <!-- no translation found for bugreport_info_name (4414036021935139527) -->
- <skip />
- <!-- no translation found for bugreport_info_title (2306030793918239804) -->
- <skip />
- <!-- no translation found for bugreport_info_description (5072835127481627722) -->
- <skip />
- <!-- no translation found for save (4781509040564835759) -->
- <skip />
- <!-- no translation found for bugreport_intent_chooser_title (7605709494790894076) -->
- <skip />
+ <string name="bugreport_unreadable_text" msgid="586517851044535486">"বাগ সম্পর্কীয় অভিযোগৰ ফাইলটো পঢ়িব পৰা নগ\'ল"</string>
+ <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"বাগ সম্পর্কীয় অভিযোগৰ বিৱৰণ জিপ ফাইলত যোগ কৰিব পৰা নগ\'ল"</string>
+ <string name="bugreport_unnamed" msgid="2800582406842092709">"নামবিহীন"</string>
+ <string name="bugreport_info_action" msgid="2158204228510576227">"সবিশেষ"</string>
+ <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্ৰীণশ্বট"</string>
+ <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"স্ক্ৰীণশ্বট সফলতাৰে লোৱা হ\'ল৷"</string>
+ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্ৰীণশ্বট ল\'ব পৰা নগ\'ল।"</string>
+ <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"বাগ সম্পর্কীয় অভিযোগৰ বিৱৰণ <xliff:g id="ID">#%d</xliff:g>"</string>
+ <string name="bugreport_info_name" msgid="4414036021935139527">"ফাইলৰ নাম"</string>
+ <string name="bugreport_info_title" msgid="2306030793918239804">"বাগৰ শিৰোনাম"</string>
+ <string name="bugreport_info_description" msgid="5072835127481627722">"বাগ সাৰাংশ"</string>
+ <string name="save" msgid="4781509040564835759">"ছেভ কৰক"</string>
+ <string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰক"</string>
</resources>
diff --git a/packages/Shell/res/values-or/strings.xml b/packages/Shell/res/values-or/strings.xml
index bfb3b53..30aeb9c 100644
--- a/packages/Shell/res/values-or/strings.xml
+++ b/packages/Shell/res/values-or/strings.xml
@@ -23,12 +23,9 @@
<skip />
<!-- no translation found for bugreport_finished_title (4429132808670114081) -->
<skip />
- <!-- no translation found for bugreport_updating_title (4423539949559634214) -->
- <skip />
- <!-- no translation found for bugreport_updating_wait (3322151947853929470) -->
- <skip />
- <!-- no translation found for bugreport_finished_text (1223616207145252689) -->
- <skip />
+ <string name="bugreport_updating_title" msgid="4423539949559634214">"ବଗ୍ ରିପୋର୍ଟରେ ବିବରଣୀ ଯୋଡ଼ାଯାଉଛି"</string>
+ <string name="bugreport_updating_wait" msgid="3322151947853929470">"ଦୟାକରି ଅପେକ୍ଷା କରନ୍ତୁ…"</string>
+ <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"ଅଳ୍ପ ସମୟ ମଧ୍ୟରେ ଫୋନ୍ରେ ବଗ୍ ରିପୋର୍ଟ ଦେଖାଯିବ"</string>
<!-- no translation found for bugreport_finished_text (5758325479058638893) -->
<skip />
<!-- no translation found for bugreport_finished_text (8353769438382138847) -->
@@ -44,30 +41,22 @@
<!-- no translation found for bugreport_confirm_dont_repeat (6179945398364357318) -->
<skip />
<string name="bugreport_storage_title" msgid="5332488144740527109">"ବଗ୍ ରିପୋର୍ଟ"</string>
- <!-- no translation found for bugreport_unreadable_text (586517851044535486) -->
- <skip />
- <!-- no translation found for bugreport_add_details_to_zip_failed (1302931926486712371) -->
- <skip />
- <!-- no translation found for bugreport_unnamed (2800582406842092709) -->
- <skip />
- <!-- no translation found for bugreport_info_action (2158204228510576227) -->
- <skip />
- <!-- no translation found for bugreport_screenshot_action (8677781721940614995) -->
- <skip />
+ <string name="bugreport_unreadable_text" msgid="586517851044535486">"ବଗ୍ ରିପୋର୍ଟ ଫାଇଲ୍ ପଢ଼ାଯାଇପାରିଲା ନାହିଁ"</string>
+ <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"ଜିପ୍ ଫାଇଲରେ ବଗ୍ ରିପୋର୍ଟ ବିବରଣୀ ଯୋଡ଼ାଯାଇପାରିଲା ନାହିଁ"</string>
+ <string name="bugreport_unnamed" msgid="2800582406842092709">"ବେନାମୀ"</string>
+ <string name="bugreport_info_action" msgid="2158204228510576227">"ବିବରଣୀ"</string>
+ <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ସ୍କ୍ରୀନ୍ଶଟ୍"</string>
<!-- no translation found for bugreport_screenshot_taken (5684211273096253120) -->
<skip />
- <!-- no translation found for bugreport_screenshot_failed (5853049140806834601) -->
- <skip />
+ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ସ୍କ୍ରୀନ୍ଶଟ୍ ନିଆଯାଇପାରିଲା ନାହିଁ।"</string>
<!-- no translation found for bugreport_info_dialog_title (1355948594292983332) -->
<skip />
- <!-- no translation found for bugreport_info_name (4414036021935139527) -->
- <skip />
+ <string name="bugreport_info_name" msgid="4414036021935139527">"ଫାଇଲ୍ ନାମ"</string>
<!-- no translation found for bugreport_info_title (2306030793918239804) -->
<skip />
<!-- no translation found for bugreport_info_description (5072835127481627722) -->
<skip />
<!-- no translation found for save (4781509040564835759) -->
<skip />
- <!-- no translation found for bugreport_intent_chooser_title (7605709494790894076) -->
- <skip />
+ <string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରନ୍ତୁ"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 06820a6..40e2a30 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -29,12 +29,14 @@
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"আনলক কৰিবলৈ পাছৱৰ্ড লিখক"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"আনলক কৰিবলৈ পিন লিখক"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ভুল পিন ক\'ড।"</string>
- <!-- no translation found for keyguard_sim_error_message_short (592109500618448312) -->
- <skip />
+ <string name="keyguard_sim_error_message_short" msgid="592109500618448312">"ব্যৱহাৰৰ অযোগ্য ছিম কাৰ্ড"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"চ্চার্জ কৰা হ\'ল"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"চ্চার্জ কৰি থকা হৈছে"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"দ্ৰুত গতিৰে চ্চাৰ্জ কৰি থকা হৈছে"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"লাহে লাহে চ্চাৰ্জ হৈ আছে"</string>
+ <!-- no translation found for keyguard_plugged_in (3161102098900158923) -->
+ <skip />
+ <!-- no translation found for keyguard_plugged_in_charging_fast (3684592786276709342) -->
+ <skip />
+ <!-- no translation found for keyguard_plugged_in_charging_slowly (509533586841478405) -->
+ <skip />
<string name="keyguard_low_battery" msgid="9218432555787624490">"আপোনাৰ চ্চার্জাৰ সংযোগ কৰক।"</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"আনলক কৰিবলৈ মেনু টিপক।"</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"নেটৱর্ক লক কৰা অৱস্থাত আছে"</string>
@@ -53,8 +55,7 @@
<string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"ছিমৰ PUK ক্ষেত্ৰ"</string>
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"পৰৱৰ্তী এলাৰ্ম <xliff:g id="ALARM">%1$s</xliff:g> বজাত ছেট কৰা হৈছে"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"মচক"</string>
- <!-- no translation found for disable_carrier_button_text (6914341927421916114) -->
- <skip />
+ <string name="disable_carrier_button_text" msgid="6914341927421916114">"ই-ছিম অক্ষম কৰক"</string>
<!-- no translation found for error_disable_esim_title (4852978431156228006) -->
<skip />
<!-- no translation found for error_disable_esim_msg (676694908770135639) -->
@@ -64,12 +65,13 @@
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ভুল আৰ্হি"</string>
<string name="kg_wrong_password" msgid="4580683060277329277">"ভুল পাছৱৰ্ড"</string>
<string name="kg_wrong_pin" msgid="4785660766909463466">"ভুল পিন"</string>
- <!-- no translation found for kg_too_many_failed_attempts_countdown (4368805541257003755) -->
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক।</item>
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="5547646893001491340">"আপোনাৰ আৰ্হি আঁকক"</string>
- <!-- no translation found for kg_sim_pin_instructions (6389000973113699187) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1643757228644271861) -->
- <skip />
+ <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ছিমৰ পিন দিয়ক।"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"ৰ ছিমৰ পিন দিয়ক।"</string>
<!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
<skip />
<string name="kg_pin_instructions" msgid="4069609316644030034">"পিন দিয়ক"</string>
@@ -126,8 +128,7 @@
<string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"প্ৰ\'ফাইল সলনি কৰোঁতে আৰ্হি দিয়াটো বাধ্যতামূলক"</string>
<string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পিন দিয়াটো বাধ্যতামূলক"</string>
<string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"প্ৰ\'ফাইল সলনি কৰোঁতে পাছৱৰ্ড দিয়াটো বাধ্যতামূলক"</string>
- <!-- no translation found for kg_prompt_reason_device_admin (3452168247888906179) -->
- <skip />
+ <string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"প্ৰশাসকে ডিভাইচ লক কৰি ৰাখিছে"</string>
<string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
<item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। আর্হি নিশ্চিত কৰক।</item>
@@ -142,6 +143,12 @@
<item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পাছৱৰ্ড নিশ্চিত কৰক।</item>
</plurals>
<string name="fingerprint_not_recognized" msgid="348813995267914625">"চিনাক্ত কৰিব পৰা নগ\'ল"</string>
- <!-- no translation found for kg_password_default_pin_message (6203676909479972943) -->
- <!-- no translation found for kg_password_default_puk_message (8744416410184198352) -->
+ <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943">
+ <item quantity="one">ছিম পিন দিয়ক। আপোনাৰ হাতত <xliff:g id="NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে।</item>
+ <item quantity="other">ছিম পিন দিয়ক। আপোনাৰ হাতত <xliff:g id="NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে।</item>
+ </plurals>
+ <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352">
+ <item quantity="one">ছিমখন অক্ষম হ\'ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item>
+ <item quantity="other">ছিমখন অক্ষম হ\'ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item>
+ </plurals>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 57b98fa..fc7e134 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -31,9 +31,9 @@
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Incorrect PIN code."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Invalid card."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Charged"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"Charging"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Charging rapidly"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Charging slowly"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging rapidly"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging slowly"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"Connect your charger."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Press Menu to unlock."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Network locked"</string>
@@ -112,7 +112,7 @@
<string name="kg_pin_accepted" msgid="7637293533973802143">"Code accepted"</string>
<string name="keyguard_carrier_default" msgid="4274828292998453695">"No service"</string>
<string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Switch input method"</string>
- <string name="airplane_mode" msgid="3807209033737676010">"Aeroplane mode"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Airplane mode"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pattern required after device restarts"</string>
<string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN required after device restarts"</string>
<string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Password required after device restarts"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index d27d204..682b2b8 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -31,9 +31,9 @@
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Incorrect PIN code."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Invalid Card."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Charged"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"Charging"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Charging rapidly"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Charging slowly"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging rapidly"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging slowly"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"Connect your charger."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Press Menu to unlock."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Network locked"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 5d5e363..5e967b2 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -31,9 +31,9 @@
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Le code est incorrect."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Carte non valide."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Chargé"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"En charge…"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Chargement rapide…"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Chargement lent…"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Rechargement…"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Rechargement rapide…"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Rechargement lent…"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"Branchez votre chargeur."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Appuyez sur \"Menu\" pour déverrouiller le clavier."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Réseau verrouillé"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 5c02d4f..1f8254a 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -31,9 +31,9 @@
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorreto."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Cartão inválido."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Carregada"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"Carregando"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Carregando rapidamente"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Carregando lentamente"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando rapidamente"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando lentamente"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"Conecte o seu carregador."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pressione Menu para desbloquear."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rede bloqueada"</string>
diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml
index 029d16e..ef442e5 100644
--- a/packages/SystemUI/res/layout/super_status_bar.xml
+++ b/packages/SystemUI/res/layout/super_status_bar.xml
@@ -43,7 +43,8 @@
android:visibility="invisible" />
</com.android.systemui.statusbar.BackDropView>
- <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind"
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_behind"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:importantForAccessibility="no"
@@ -75,7 +76,8 @@
android:layout_height="match_parent"
android:visibility="invisible" />
- <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_in_front"
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_in_front"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:importantForAccessibility="no"
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index e2ac574..0076927 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -40,17 +40,14 @@
<skip />
<!-- no translation found for battery_low_percent_format_hybrid_short (9025795469949145586) -->
<skip />
- <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) -->
- <skip />
+ <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকী আছে। বেটাৰি সঞ্চয়কাৰী অন হৈ আছে।"</string>
<string name="invalid_charger" msgid="4549105996740522523">"ইউএছবি চ্চার্জিং কৰিব পৰা নাযাব।\nআপোনাৰ ফ\'নৰ লগত দিয়া চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string>
<string name="invalid_charger_title" msgid="3515740382572798460">"ইউএছবি চ্চার্জিং সমৰ্থিত নহয়।"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"কেৱল যোগান ধৰা চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ছেটিংসমূহ"</string>
- <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) -->
- <skip />
+ <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"বেটাৰি সঞ্চয়কাৰী অন কৰেনে?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"অন কৰক"</string>
- <!-- no translation found for battery_saver_start_action (8187820911065797519) -->
- <skip />
+ <string name="battery_saver_start_action" msgid="8187820911065797519">"বেটাৰি সঞ্চয়কাৰী অন কৰক"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ছেটিংসমূহ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ৱাই-ফাই"</string>
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"স্বয়ং-ঘূৰ্ণন স্ক্ৰীণ"</string>
@@ -60,28 +57,21 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"ব্লুটুথ টেডাৰিং কৰা হ\'ল"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ইনপুট পদ্ধতি ছেট আপ কৰক"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"বাস্তৱিক কীব\'ৰ্ড"</string>
- <!-- no translation found for usb_device_permission_prompt (1825685909587559679) -->
- <skip />
- <!-- no translation found for usb_accessory_permission_prompt (2465531696941369047) -->
- <skip />
- <!-- no translation found for usb_device_confirm_prompt (7440562274256843905) -->
- <skip />
- <!-- no translation found for usb_accessory_confirm_prompt (4333670517539993561) -->
- <skip />
+ <string name="usb_device_permission_prompt" msgid="1825685909587559679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g>ত প্ৰৱেশ কৰিবলৈ <xliff:g id="APPLICATION">%1$s</xliff:g>ক অনুমতি দিবনে?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"<xliff:g id="APPLICATION">%1$s</xliff:g>ক <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>ত প্ৰৱেশ কৰিবলৈ অনুমতি দিবনে?"</string>
+ <string name="usb_device_confirm_prompt" msgid="7440562274256843905">"<xliff:g id="USB_DEVICE">%2$s</xliff:g>ক ব্যৱহাৰ কৰিবলৈ <xliff:g id="APPLICATION">%1$s</xliff:g>ক খোলেনে?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="4333670517539993561">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g>ক ব্যৱহাৰ কৰিবলৈ <xliff:g id="APPLICATION">%1$s</xliff:g>ক খোলেনে?"</string>
<string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ইনষ্টল হৈ থকা কোনো এপে ইউএছবি সহায়ক সামগ্ৰীটো চলাব নোৱাৰে। এই সহায়ক সামগ্ৰীৰ বিষয়ে <xliff:g id="URL">%1$s</xliff:g>ৰ জৰিয়তে অধিক জানক৷"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"ইউএছবিৰ সহায়ক সামগ্ৰী"</string>
<string name="label_view" msgid="6304565553218192990">"চাওক"</string>
- <!-- no translation found for always_use_device (4015357883336738417) -->
- <skip />
- <!-- no translation found for always_use_accessory (3257892669444535154) -->
- <skip />
+ <string name="always_use_device" msgid="4015357883336738417">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> সংযুক্ত হ\'লে সদায় <xliff:g id="APPLICATION">%1$s</xliff:g> খোলক"</string>
+ <string name="always_use_accessory" msgid="3257892669444535154">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> সংযুক্ত হ\'লে সদায় <xliff:g id="APPLICATION">%1$s</xliff:g> খোলক"</string>
<string name="usb_debugging_title" msgid="4513918393387141949">"ইউএছবি ডিবাগিংৰ অনুমতি দিবনে?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"এয়া হৈছে কম্পিউটাৰটোৰ RSA কী ফিংগাৰপ্ৰিণ্ট:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটাৰটোৰ পৰা সদায় অনুমতি দিয়ক"</string>
<!-- no translation found for usb_debugging_secondary_user_title (6353808721761220421) -->
<skip />
- <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) -->
- <skip />
+ <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string>
<!-- no translation found for global_action_screenshot (8329831278085426283) -->
@@ -100,8 +90,7 @@
<skip />
<!-- no translation found for screenshot_failed_to_save_text (3041612585107107310) -->
<skip />
- <!-- no translation found for screenshot_failed_to_capture_text (173674476457581486) -->
- <skip />
+ <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"এপটোৱে বা আপোনাৰ প্ৰতিষ্ঠানে স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি নিদিয়ে"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"ইউএছবিৰে ফাইল স্থানান্তৰণৰ বিকল্পসমূহ"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"মিডিয়া প্লেয়াৰ (এমটিপি) হিচাপে সংলগ্ন কৰক"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"কেমেৰা (পিটিপি) হিচাপে সংলগ্ন কৰক"</string>
@@ -119,10 +108,8 @@
<!-- no translation found for accessibility_voice_assist_button (487611083884852965) -->
<skip />
<string name="accessibility_unlock_button" msgid="128158454631118828">"আনলক কৰক"</string>
- <!-- no translation found for accessibility_waiting_for_fingerprint (4808860050517462885) -->
- <skip />
- <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) -->
- <skip />
+ <string name="accessibility_waiting_for_fingerprint" msgid="4808860050517462885">"ফিংগাৰপ্ৰিণ্টৰ বাবে ৰৈ থকা হৈছে"</string>
+ <string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ নকৰাকৈ আনলক কৰক"</string>
<string name="unlock_label" msgid="8779712358041029439">"আনলক কৰক"</string>
<string name="phone_label" msgid="2320074140205331708">"ফ\'ন খোলক"</string>
<!-- no translation found for voice_assist_label (3956854378310019854) -->
@@ -160,8 +147,7 @@
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"ডেটা ছিগনেল পূৰা আছে।"</string>
<string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g>ৰ লগত সংযোগ কৰা হ\'ল।"</string>
<string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g>ৰ লগত সংযোগ কৰা হ\'ল।"</string>
- <!-- no translation found for accessibility_cast_name (4026393061247081201) -->
- <skip />
+ <string name="accessibility_cast_name" msgid="4026393061247081201">"<xliff:g id="CAST">%s</xliff:g>ত সংযোগ হ\'ল।"</string>
<string name="accessibility_no_wimax" msgid="4329180129727630368">"কোনো WiMAX নাই।"</string>
<string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAXৰ এডাল দণ্ড৷"</string>
<string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAXৰ দুডাল দণ্ড আছে।"</string>
@@ -188,39 +174,29 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_4g_plus (3032226872470658661) -->
- <skip />
+ <string name="accessibility_data_connection_4g_plus" msgid="3032226872470658661">"4G+"</string>
<string name="accessibility_data_connection_lte" msgid="5413468808637540658">"এলটিই"</string>
- <!-- no translation found for accessibility_data_connection_lte_plus (361876866906946007) -->
- <skip />
+ <string name="accessibility_data_connection_lte_plus" msgid="361876866906946007">"LTE+"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ৰ\'মিং"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ৱাই-ফাই"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ছিম নাই।"</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"ম\'বাইল ডেটা"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"ম\'বাইল ডেটা অন অৱস্থাত আছে"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"ম\'বাইল ডেটা অফ অৱস্থাত আছে"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ব্লুটুথ টেডাৰিং।"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"এয়াৰপ্লেইন ম\'ড।"</string>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
- <!-- no translation found for accessibility_no_sims (3957997018324995781) -->
- <skip />
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"ভিপিএন অন অৱস্থাত আছে।"</string>
+ <string name="accessibility_no_sims" msgid="3957997018324995781">"কোনো ছিম কাৰ্ড নাই"</string>
<!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
<skip />
- <!-- no translation found for accessibility_battery_details (7645516654955025422) -->
- <skip />
+ <string name="accessibility_battery_details" msgid="7645516654955025422">"বেটাৰিৰ বিৱৰণসমূহ খোলক"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ বেটাৰি।"</string>
- <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) -->
- <skip />
+ <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"বেটাৰি চ্চাৰ্জ কৰি থকা হৈছে, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> শতাংশ।"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"ছিষ্টেমৰ ছেটিংসমূহ৷"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"জাননীসমূহ।"</string>
- <!-- no translation found for accessibility_overflow_action (5681882033274783311) -->
- <skip />
+ <string name="accessibility_overflow_action" msgid="5681882033274783311">"সকলো জাননীবোৰ চাওক"</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"জাননী মচক৷"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"জিপিএছ সক্ষম হ\'ল৷"</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"জিপিএছ বিচাৰি থকা হৈছে।"</string>
@@ -235,8 +211,7 @@
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> আঁতৰোৱা হৈছে৷"</string>
<!-- no translation found for accessibility_recents_all_items_dismissed (4464697366179168836) -->
<skip />
- <!-- no translation found for accessibility_recents_item_open_app_info (5107479759905883540) -->
- <skip />
+ <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> এপ্লিকেশ্বনৰ তথ্য় খোলক।"</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰা হৈছে।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"জাননী অগ্ৰাহ্য কৰা হৈছে।"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"জাননী পেনেল।"</string>
@@ -262,16 +237,14 @@
<skip />
<!-- no translation found for accessibility_quick_settings_dnd_alarms_on (9152834845587554157) -->
<skip />
- <!-- no translation found for accessibility_quick_settings_dnd (6607873236717185815) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"অসুবিধা নিদিব।"</string>
<!-- no translation found for accessibility_quick_settings_dnd_off (2371832603753738581) -->
<skip />
<!-- no translation found for accessibility_quick_settings_dnd_changed_off (898107593453022935) -->
<skip />
<!-- no translation found for accessibility_quick_settings_dnd_changed_on (4483780856613561039) -->
<skip />
- <!-- no translation found for accessibility_quick_settings_bluetooth (6341675755803320038) -->
- <skip />
+ <string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"ব্লুটুথ।"</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ব্লুটুথ অফ হৈ আছে।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ব্লুটুথ অন হৈ আছে।"</string>
<string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ব্লুটুথ সংযোগ কৰি থকা হৈছে।"</string>
@@ -287,8 +260,7 @@
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"অধিক সময়।"</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"কম সময়।"</string>
<string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ফ্লাশ্বলাইট অফ হৈ আছে।"</string>
- <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) -->
- <skip />
+ <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"ফ্লাশ্বলাইট উপলব্ধ নহয়।"</string>
<string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ফ্লাশ্বলাইট অন হৈ আছে৷"</string>
<string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ফ্লাশ্বলাইট অফ কৰা হ\'ল।"</string>
<string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ফ্লাশ্বলাইট অন কৰা হ\'ল।"</string>
@@ -297,39 +269,33 @@
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ম\'বাইল হটস্পট অফ কৰা হ\'ল।"</string>
<string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ম\'বাইল হটস্পট অন কৰা হ\'ল।"</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"স্ক্ৰীণ কাষ্টিং বন্ধ কৰা হ\'ল।"</string>
- <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) -->
- <skip />
+ <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"কৰ্মস্থান ম\'ড অফ হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"কৰ্মস্থান ম\'ড অন হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"কৰ্মস্থান ম\'ড অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"কৰ্মস্থান ম\'ড অন কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ডেটা সঞ্চয়কাৰী সুবিধা অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ডেটা সঞ্চয়কাৰী সুবিধা অন কৰা হ\'ল।"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ডিছপ্লেৰ উজ্জ্বলতা"</string>
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"চ্চার্জ কৰি থকা হৈছে"</string>
<!-- no translation found for data_usage_disabled_dialog_3g_title (5281770593459841889) -->
<skip />
<!-- no translation found for data_usage_disabled_dialog_4g_title (1601769736881078016) -->
<skip />
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ম\'বাইল ডেটা পজ কৰা হৈছে"</string>
<!-- no translation found for data_usage_disabled_dialog_title (3932437232199671967) -->
<skip />
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"আপুনি নির্ধাৰণ কৰা ডেটাৰ সীমা শেষ হৈছে। আপুনি এতিয়া ম\'বাইল ডেটা ব্যৱহাৰ কৰিব নোৱাৰে। \n\nযদিহে আপুনি আকৌ ম\'বাইল ডেটা ব্যৱহাৰ কৰে তেন্তে ডেটাৰ ব্যৱহাৰৰ বাবে মাচুল ভৰিবলগীয়া হ\'ব পাৰে।"</string>
<!-- no translation found for data_usage_disabled_dialog_enable (1412395410306390593) -->
<skip />
<string name="gps_notification_searching_text" msgid="8574247005642736060">"জিপিএছ সন্ধান কৰি থকা হৈছে"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"জিপিএছএ অৱস্থান ছেট কৰিছে"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"অৱস্থানৰ অনুৰোধ সক্ৰিয় হৈ আছে"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"সকলো জাননী মচক৷"</string>
- <!-- no translation found for notification_group_overflow_indicator (1863231301642314183) -->
- <skip />
- <!-- no translation found for notification_group_overflow_description (4579313201268495404) -->
+ <string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
+ <item quantity="one"> ভিতৰত আৰু <xliff:g id="NUMBER_1">%s</xliff:g>টা জাননী আছে।</item>
+ <item quantity="other"> ভিতৰত আৰু <xliff:g id="NUMBER_1">%s</xliff:g>টা জাননী আছে।</item>
+ </plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"জাননীৰ ছেটিংসমূহ"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ছেটিংসমূহ"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"আপোনাৰ ফ\'নৰ স্ক্ৰীণ স্বয়ংক্ৰিয়ভাৱে ঘূৰিব৷"</string>
@@ -339,8 +305,7 @@
<string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"স্ক্ৰীণখন এতিয়া লেণ্ডস্কেইপ দিশত লক কৰা অৱস্থাত আছে।"</string>
<string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"স্ক্ৰীণখন এতিয়া প\'ৰ্ট্ৰেইট দিশত লক কৰা অৱস্থাত আছে।"</string>
<string name="dessert_case" msgid="1295161776223959221">"মিষ্টান্ন ভাণ্ডাৰ"</string>
- <!-- no translation found for start_dreams (5640361424498338327) -->
- <skip />
+ <string name="start_dreams" msgid="5640361424498338327">"স্ক্ৰীণ ছেভাৰ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ইথাৰনেট"</string>
<!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
<skip />
@@ -364,12 +329,12 @@
<skip />
<!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) -->
<skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_transient (4551281899312150640) -->
+ <skip />
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বয়ং-ঘূৰ্ণন"</string>
- <!-- no translation found for accessibility_quick_settings_rotation (4231661040698488779) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_rotation_value (8187398200140760213) -->
- <skip />
+ <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"স্বয়ং-ঘূৰ্ণন স্ক্ৰীণ"</string>
+ <string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"<xliff:g id="ID_1">%s</xliff:g> ম\'ড"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ঘূৰ্ণন লক কৰা হ\'ল"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"প\'ৰ্ট্ৰেইট"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"লেণ্ডস্কেইপ"</string>
@@ -388,11 +353,10 @@
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"সংযোগ হৈ থকা নাই"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"নেটৱৰ্ক নাই"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ৱাই-ফাই অফ"</string>
- <!-- no translation found for quick_settings_wifi_on_label (7607810331387031235) -->
- <skip />
+ <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ৱাই-ফাই অন হৈ আছে"</string>
<!-- no translation found for quick_settings_wifi_detail_empty_text (269990350383909226) -->
<skip />
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
+ <!-- no translation found for quick_settings_wifi_secondary_label_transient (7748206246119760554) -->
<skip />
<!-- no translation found for quick_settings_cast_title (7709016546426454729) -->
<skip />
@@ -407,30 +371,25 @@
<string name="quick_settings_more_settings" msgid="326112621462813682">"অধিক ছেটিং"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"সম্পন্ন কৰা হ\'ল"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"সংযোগ কৰা হ’ল"</string>
- <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) -->
- <skip />
+ <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"সংযুক্ত, বেটাৰি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"সংযোগ কৰি থকা হৈছে..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"টেডাৰ কৰি থকা হৈছে"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
+ <!-- no translation found for quick_settings_hotspot_secondary_label_transient (8010579363691405477) -->
<skip />
<!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"জাননীসমূহ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ফ্লাশ্বলাইট"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ম\'বাইল ডেটা"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ডেটা ব্যৱহাৰ"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"বাকী থকা ডেটা"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"সর্ব্বোচ সীমা"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যৱহৃত"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সীমা"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সকীয়নি"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
+ <!-- no translation found for quick_settings_work_mode_label (7608026833638817218) -->
<skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
- <!-- no translation found for quick_settings_night_display_label (3577098011487644395) -->
- <skip />
+ <string name="quick_settings_night_display_label" msgid="3577098011487644395">"ৰাতিৰ লাইট"</string>
<!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) -->
<skip />
<!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) -->
@@ -442,20 +401,15 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC নিষ্ক্ৰিয় হৈ আছে"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম হৈ আছে"</string>
- <!-- no translation found for recents_empty_message (808480104164008572) -->
- <skip />
- <!-- no translation found for recents_empty_message_dismissed_all (2791312568666558651) -->
- <skip />
+ <string name="recents_empty_message" msgid="808480104164008572">"কোনো শেহতীয়া বস্তু নাই"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"আপুনি সকলোবোৰ খালী কৰিছে"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"এপ্লিকেশ্বনৰ তথ্য"</string>
<string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"স্ক্ৰীণ পিনিং"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"সন্ধান কৰক"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰিব পৰা নগ\'ল৷"</string>
- <!-- no translation found for recents_launch_disabled_message (1624523193008871793) -->
- <skip />
- <!-- no translation found for recents_stack_action_button_label (6593727103310426253) -->
- <skip />
- <!-- no translation found for recents_drag_hint_message (2649739267073203985) -->
- <skip />
+ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>টো সুৰক্ষিত ম\'ডত অক্ষম কৰা হ\'ল।"</string>
+ <string name="recents_stack_action_button_label" msgid="6593727103310426253">"সকলো মচক"</string>
+ <string name="recents_drag_hint_message" msgid="2649739267073203985">"বিভাজিত স্ক্ৰীণ ব্য়ৱহাৰ কৰিবলৈ ইয়ালৈ টানি আনি এৰক"</string>
<!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) -->
<skip />
<!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) -->
@@ -473,31 +427,25 @@
<string name="description_target_search" msgid="3091587249776033139">"অনুসন্ধান কৰক"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে ওপৰলৈ শ্লাইড কৰক।"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে বাওঁফাললৈ শ্লাইড কৰক।"</string>
- <!-- no translation found for zen_priority_introduction (1149025108714420281) -->
- <skip />
- <!-- no translation found for zen_alarms_introduction (4934328096749380201) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্ম, ৰিমাইণ্ডাৰ, ইভেন্ট আৰু কল কৰোঁতাৰ বাহিৰে আন কোনো শব্দৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্মৰ বাহিৰে আন কোনো ধ্বনি আৰু কম্পনৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string>
<!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
<skip />
- <!-- no translation found for zen_silence_introduction_voice (3948778066295728085) -->
- <skip />
- <!-- no translation found for zen_silence_introduction (3137882381093271568) -->
- <skip />
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"এই কার্যই এলার্ম, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি সকলোৰে বাবে ধ্বনি আৰু কম্পন অৱৰোধ কৰিব। আপুনি ফ\'ন কল তথাপি কৰিবলৈ সক্ষম হ\'ব।"</string>
+ <string name="zen_silence_introduction" msgid="3137882381093271568">"এই কার্যই এলার্ম, মিউজিক, ভিডিঅ\' আৰু গেইমকে ধৰি সকলোৰে ধ্বনি আৰু কম্পন অৱৰোধ কৰে।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"কম জৰুৰী জাননীসমূহ তলত"</string>
<string name="notification_tap_again" msgid="7590196980943943842">"খুলিবলৈ পুনৰাই টিপক"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"আনলক কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string>
<string name="do_disclosure_generic" msgid="5615898451805157556">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে"</string>
- <!-- no translation found for do_disclosure_with_name (5640615509915445501) -->
- <skip />
+ <string name="do_disclosure_with_name" msgid="5640615509915445501">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>ৰ দ্বাৰা পৰিচালিত।"</string>
<!-- no translation found for phone_hint (4872890986869209950) -->
<skip />
<!-- no translation found for voice_hint (8939888732119726665) -->
<skip />
<!-- no translation found for camera_hint (7939688436797157483) -->
<skip />
- <!-- no translation found for interruption_level_none_with_warning (5114872171614161084) -->
- <skip />
+ <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"সম্পূর্ণ নিৰৱতা। এই কার্যই স্ক্ৰীণ ৰীডাৰসমূহকো নিৰৱ কৰিব।"</string>
<!-- no translation found for interruption_level_none (6000083681244492992) -->
<skip />
<!-- no translation found for interruption_level_priority (6426766465363855505) -->
@@ -510,15 +458,15 @@
<skip />
<!-- no translation found for interruption_level_alarms_twoline (3266909566410106146) -->
<skip />
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"চ্চার্জ হৈ আছে (সম্পূর্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>সময় বাকী)"</string>
- <!-- no translation found for keyguard_indication_charging_time_fast (9018981952053914986) -->
+ <!-- no translation found for keyguard_indication_charging_time (2056340799276374421) -->
<skip />
- <!-- no translation found for keyguard_indication_charging_time_slowly (955252797961724952) -->
+ <!-- no translation found for keyguard_indication_charging_time_fast (7767562163577492332) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_charging_time_slowly (3769655133567307069) -->
<skip />
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ব্যৱহাৰকাৰী সলনি কৰক"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ব্যৱহাৰকাৰী সলনি কৰক, বৰ্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
- <!-- no translation found for accessibility_multi_user_switch_inactive (1424081831468083402) -->
- <skip />
+ <string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"বর্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"প্ৰ\'ফাইল দেখুৱাওক"</string>
<string name="user_add_user" msgid="5110251524486079492">"ব্যৱহাৰকাৰী যোগ কৰক"</string>
<string name="user_new_user_name" msgid="426540612051178753">"নতুন ব্যৱহাৰকাৰী"</string>
@@ -534,29 +482,20 @@
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"হয়, অব্যাহত ৰাখক"</string>
<!-- no translation found for guest_notification_title (1585278533840603063) -->
<skip />
- <!-- no translation found for guest_notification_text (335747957734796689) -->
- <skip />
+ <string name="guest_notification_text" msgid="335747957734796689">"এপসমূহ আৰু ডেটা মচিবলৈ অতিথি ব্যৱহাৰকাৰীক আঁতৰাওক"</string>
<!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
<skip />
- <!-- no translation found for user_logout_notification_title (1453960926437240727) -->
- <skip />
- <!-- no translation found for user_logout_notification_text (3350262809611876284) -->
- <skip />
- <!-- no translation found for user_logout_notification_action (1195428991423425062) -->
- <skip />
+ <string name="user_logout_notification_title" msgid="1453960926437240727">"ব্যৱহাৰকাৰীক লগ আউট কৰক"</string>
+ <string name="user_logout_notification_text" msgid="3350262809611876284">"বর্তমানৰ ব্যৱহাৰকাৰীক লগ আউট কৰক"</string>
+ <string name="user_logout_notification_action" msgid="1195428991423425062">"ব্যৱহাৰকাৰীক লগ আউট কৰক"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যৱহাৰকাৰী যোগ কৰিবনে?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰী যোগ কৰে, তেওঁ নিজৰ স্থান ছেট আপ কৰা প্ৰয়োজন।\n\nযিকোনো ব্যৱহাৰকাৰীয়ে নিজৰ লগতে আন ব্যৱহাৰকাৰীৰো এপ্ আপডেট কৰিব পাৰে।"</string>
- <!-- no translation found for user_remove_user_title (4681256956076895559) -->
- <skip />
- <!-- no translation found for user_remove_user_message (1453218013959498039) -->
- <skip />
- <!-- no translation found for user_remove_user_remove (7479275741742178297) -->
- <skip />
- <!-- no translation found for battery_saver_notification_title (8614079794522291840) -->
- <skip />
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ব্যৱহাৰকাৰীক আঁতৰাবনে?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"এই ব্যৱহাৰকাৰীৰ সকলো এপ্ আৰু ডেটা মচা হ\'ব।"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"আঁতৰাওক"</string>
+ <string name="battery_saver_notification_title" msgid="8614079794522291840">"বেটাৰি সঞ্চয়কাৰী অন হৈ আছে"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে"</string>
- <!-- no translation found for battery_saver_notification_action_text (132118784269455533) -->
- <skip />
+ <string name="battery_saver_notification_action_text" msgid="132118784269455533">"বেটাৰি সঞ্চয়কাৰী অফ কৰক"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"আপোনাৰ স্ক্ৰীণত প্ৰদৰ্শন হোৱা সকলো <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> কেপশ্বাৰ কৰা আৰম্ভ কৰিব।"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"পুনৰাই নেদেখুৱাব"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"সকলো মচক"</string>
@@ -564,81 +503,51 @@
<string name="empty_shade_text" msgid="708135716272867002">"কোনো জাননী নাই"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"প্ৰ\'ফাইল নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
<string name="vpn_footer" msgid="2388611096129106812">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
- <!-- no translation found for branded_vpn_footer (2168111859226496230) -->
- <skip />
+ <string name="branded_vpn_footer" msgid="2168111859226496230">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
<string name="quick_settings_disclosure_management_monitoring" msgid="6645176135063957394">"আপোনাৰ প্ৰতিষ্ঠানটোৱে এই ডিভাইচটো পৰিচালনা কৰে আৰু ই নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
- <!-- no translation found for quick_settings_disclosure_named_management_monitoring (370622174777570853) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_management_named_vpn (1085137869053332307) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_management_named_vpn (6290456493852584017) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_management (3294967280853150271) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_management (1059403025094542908) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_management_vpns (3698767349925266482) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_management_vpns (7777821385318891527) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_managed_profile_monitoring (5125463987558278215) -->
- <skip />
+ <string name="quick_settings_disclosure_named_management_monitoring" msgid="370622174777570853">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ এই ডিভাইচটো পৰিচালনা কৰে আৰু নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string>
+ <string name="quick_settings_disclosure_management_named_vpn" msgid="1085137869053332307">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে আৰু ই <xliff:g id="VPN_APP">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে"</string>
+ <string name="quick_settings_disclosure_named_management_named_vpn" msgid="6290456493852584017">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ ডিভাইচটো পৰিচালনা কৰে আৰু এই ডিভাইচটো <xliff:g id="VPN_APP">%2$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে"</string>
+ <string name="quick_settings_disclosure_management" msgid="3294967280853150271">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে"</string>
+ <string name="quick_settings_disclosure_named_management" msgid="1059403025094542908">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ ডিভাইচটো পৰিচালনা কৰে"</string>
+ <string name="quick_settings_disclosure_management_vpns" msgid="3698767349925266482">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে আৰু ই ভিপিএনৰ সৈতে সংযুক্ত হৈ আছে"</string>
+ <string name="quick_settings_disclosure_named_management_vpns" msgid="7777821385318891527">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ ডিভাইচটো পৰিচালনা কৰে এই ডিভাইচটো ভিপিএনৰ সৈতে সংযুক্ত হৈ আছে"</string>
+ <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="5125463987558278215">"আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8973606847896650284">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string>
- <!-- no translation found for quick_settings_disclosure_monitoring (679658227269205728) -->
- <skip />
+ <string name="quick_settings_disclosure_monitoring" msgid="679658227269205728">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
<string name="quick_settings_disclosure_vpns" msgid="8170318392053156330">"ডিভাইচটো ভিপিএনবোৰৰ সৈতে সংযুক্ত হৈ আছে"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_named_vpn (3494535754792751741) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_personal_profile_named_vpn (4467456202486569906) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_vpn (6943724064780847080) -->
- <skip />
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"<xliff:g id="VPN_APP">%1$s</xliff:g>ৰ সৈতে কৰ্মস্থানৰ প্ৰ\'ফাইলটো সংযুক্ত হৈ আছে"</string>
+ <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ব্যক্তিগত প্ৰ\'ফাইলটো <xliff:g id="VPN_APP">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে"</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"ডিভাইচটো <xliff:g id="VPN_APP">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে"</string>
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ডিভাইচৰ পৰিচালনা"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"প্ৰ\'ফাইল নিৰীক্ষণ"</string>
<string name="monitoring_title" msgid="169206259253048106">"নেটৱৰ্ক নিৰীক্ষণ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"ভিপিএন"</string>
- <!-- no translation found for monitoring_subtitle_network_logging (3341264304793193386) -->
- <skip />
- <!-- no translation found for monitoring_subtitle_ca_certificate (3874151893894355988) -->
- <skip />
+ <string name="monitoring_subtitle_network_logging" msgid="3341264304793193386">"নেটৱৰ্ক লগিং"</string>
+ <string name="monitoring_subtitle_ca_certificate" msgid="3874151893894355988">"CA প্ৰমাণপত্ৰসমূহ"</string>
<string name="disable_vpn" msgid="4435534311510272506">"ভিপিএন অক্ষম কৰক"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"ভিপিএন সংযোগ বিচ্ছিন্ন কৰক"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"নীতিসমূহ চাওক"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>য়ে আপোনাৰ ডিভাইচ পৰিচালনা কৰে।\n\nআপোনাৰ প্ৰশাসকে এই ডিভাইচটোৰ লগত জড়িত ছেটিংসমূহ, কৰ্প\'ৰেইট অনুমতি, এপসমূহ, ডেটা আৰু ডিভাইচটোৰ অৱস্থান সম্পৰ্কীয় তথ্য পৰ্যবেক্ষণ কৰাৰ লগতে পৰিচালনা কৰিব পাৰে।\n\nঅধিক তথ্য়ৰ বাবে আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ ডিভাইচটো পৰিচালনা কৰে।\n\nআপোনাৰ প্ৰশাসকে এই ডিভাইচটোৰ লগত জড়িত ছেটিংসমূহ, কৰ্প\'ৰেইট অনুমতি, এপসমূহ, ডেটা আৰু ডিভাইচটোৰ অৱস্থান সম্পৰ্কীয় তথ্য পৰ্যবেক্ষণ কৰাৰ লগতে পৰিচালনা কৰিব পাৰে।\n\nঅধিক তথ্য়ৰ বাবে আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰিছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string>
- <!-- no translation found for monitoring_description_managed_profile_ca_certificate (4683248196789897964) -->
- <skip />
+ <string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰিছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰা হৈছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"আপুনি <xliff:g id="VPN_APP">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"আপুনি <xliff:g id="VPN_APP_0">%1$s</xliff:g> আৰু <xliff:g id="VPN_APP_1">%2$s</xliff:g>ৰে সংযুক্ত হৈ আছে, যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"আপুনি <xliff:g id="VPN_APP">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
- <!-- no translation found for monitoring_description_personal_profile_named_vpn (3133980926929069283) -->
- <skip />
- <!-- no translation found for monitoring_description_do_header_generic (96588491028288691) -->
- <skip />
- <!-- no translation found for monitoring_description_do_header_with_name (5511133708978206460) -->
- <skip />
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"আপোনাৰ ব্যক্তিগত প্ৰ\'ফাইলটো <xliff:g id="VPN_APP">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে, যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
+ <string name="monitoring_description_do_header_generic" msgid="96588491028288691">"আপোনাৰ ডিভাইচটো <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>ৰ দ্বাৰা পৰিচালিত।"</string>
+ <string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ আপোনাৰ ডিভাইচটো পৰিচালনা কৰিবলৈ <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> ব্যৱহাৰ কৰে।"</string>
<string name="monitoring_description_do_body" msgid="3639594537660975895">"আপোনাৰ প্ৰশাসকে আপোনাৰ ডিভাইচৰ লগত জড়িত ছেটিংসমূহ, কৰ্প\'ৰেইট অনুমতি, এপসমূহ, ডেটা আৰু ডিভাইচৰ অৱস্থান সম্পৰ্কীয় তথ্য পৰ্যবেক্ষণ কৰাৰ লগতে পৰিচালনা কৰিব পাৰিব।"</string>
- <!-- no translation found for monitoring_description_do_learn_more_separator (3785251953067436862) -->
- <skip />
- <!-- no translation found for monitoring_description_do_learn_more (1849514470437907421) -->
- <skip />
- <!-- no translation found for monitoring_description_do_body_vpn (8255218762488901796) -->
- <skip />
+ <string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
+ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"অধিক জানক"</string>
+ <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"আপুনি <xliff:g id="VPN_APP">%1$s</xliff:g> ৰে সংযুক্ত হৈ আছে, ই ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি আপোনাৰ নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
<string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
- <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) -->
- <skip />
- <!-- no translation found for monitoring_description_ca_cert_settings_separator (4987350385906393626) -->
- <skip />
- <!-- no translation found for monitoring_description_ca_cert_settings (5489969458872997092) -->
- <skip />
+ <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"ভিপিএন ছেটিংসমূহ খোলক"</string>
+ <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
+ <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"বিশ্বাসী পৰিচয়-পত্ৰসমূহ খোলক"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।\n\nএই সম্পৰ্কে অধিক জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
<!-- no translation found for monitoring_description_vpn (4445150119515393526) -->
<skip />
@@ -646,26 +555,19 @@
<!-- no translation found for legacy_vpn_name (6604123105765737830) -->
<skip />
<string name="monitoring_description_app" msgid="1828472472674709532">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
- <!-- no translation found for monitoring_description_app_personal (484599052118316268) -->
- <skip />
- <!-- no translation found for branded_monitoring_description_app_personal (2669518213949202599) -->
- <skip />
- <!-- no translation found for monitoring_description_app_work (4612997849787922906) -->
- <skip />
- <!-- no translation found for monitoring_description_app_personal_work (5664165460056859391) -->
- <skip />
- <!-- no translation found for keyguard_indication_trust_granted (4985003749105182372) -->
- <skip />
- <!-- no translation found for keyguard_indication_trust_managed (8319646760022357585) -->
- <skip />
+ <string name="monitoring_description_app_personal" msgid="484599052118316268">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে, যি ইমেইল, এপ্ আৰু ৱেবছাইটসমূহকে ধৰি আপোনাৰ ব্যক্তিগত নেটৱর্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিব পাৰে।"</string>
+ <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে, যিয়ে ইমেইল, এপ্ আৰু ৱেবছাইটসমূহকে সামৰি আপোনাৰ ব্যক্তিগত নেটৱর্কৰ কার্যকলাপ নিৰীক্ষণ কৰিব পাৰে।"</string>
+ <string name="monitoring_description_app_work" msgid="4612997849787922906">"<xliff:g id="ORGANIZATION">%1$s</xliff:g>য়ে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইল পৰিচালনা কৰে। এই প্ৰ\'ফাইলটো <xliff:g id="APPLICATION">%2$s</xliff:g>ৰে সংযুক্ত হৈ আছে যি ইমেইল, এপ্ আৰু ৱেবছাইটসমূহকে ধৰি আপোনাৰ কর্মস্থানৰ নেটৱর্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিব পাৰিব। \n\nঅধিক তথ্যৰ বাবে আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"<xliff:g id="ORGANIZATION">%1$s</xliff:g>য়ে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইল পৰিচালনা কৰে। এই প্ৰ\'ফাইলটো <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>ৰে সংযুক্ত হৈ আছে যি ইমেইল, এপ্ আৰু ৱেবছাইটসমূহকে ধৰি আপোনাৰ কর্মস্থানৰ নেটৱর্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিব পাৰিব। \n\nআপুনি <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>ৰ সৈতেও সংযুক্ত হৈ আছে, যি আপোনাৰ ব্য়ক্তিগত নেটৱৰ্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিব পাৰে।"</string>
+ <string name="keyguard_indication_trust_granted" msgid="4985003749105182372">"<xliff:g id="USER_NAME">%1$s</xliff:g>ৰ বাবে আনলক কৰা হৈছে"</string>
+ <string name="keyguard_indication_trust_managed" msgid="8319646760022357585">"<xliff:g id="TRUST_AGENT">%1$s</xliff:g> চলি আছে"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"আপুনি নিজে আনলক নকৰালৈকে ডিভাইচ লক হৈ থাকিব"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"জাননী ক্ষিপ্ৰতাৰে লাভ কৰক"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"আপুনি আনলক কৰাৰ পূৰ্বে তেওঁলোকক চাওক"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"নালাগে, ধন্যবাদ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"ছেট আপ কৰক"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <!-- no translation found for volume_zen_end_now (6930243045593601084) -->
- <skip />
+ <string name="volume_zen_end_now" msgid="6930243045593601084">"এতিয়া অফ কৰক"</string>
<!-- no translation found for accessibility_volume_expand (5946812790999244205) -->
<skip />
<!-- no translation found for accessibility_volume_collapse (3609549593031810875) -->
@@ -692,34 +594,23 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকুৱাবনে?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপুনি ইয়াক পৰৱৰ্তী সময়ত ছেটিংসমূহত অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকুৱাওক"</string>
- <!-- no translation found for managed_profile_foreground_toast (5421487114739245972) -->
- <skip />
- <!-- no translation found for stream_voice_call (4410002696470423714) -->
- <skip />
- <!-- no translation found for stream_system (7493299064422163147) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইল ব্যৱহাৰ কৰি আছে"</string>
+ <string name="stream_voice_call" msgid="4410002696470423714">"কল"</string>
+ <string name="stream_system" msgid="7493299064422163147">"ছিষ্টেম"</string>
<string name="stream_ring" msgid="8213049469184048338">"ৰিং"</string>
<string name="stream_music" msgid="9086982948697544342">"মিডিয়া"</string>
- <!-- no translation found for stream_alarm (5209444229227197703) -->
- <skip />
+ <string name="stream_alarm" msgid="5209444229227197703">"এলাৰ্ম"</string>
<string name="stream_notification" msgid="2563720670905665031">"জাননী"</string>
<string name="stream_bluetooth_sco" msgid="2055645746402746292">"ব্লুটুথ"</string>
<string name="stream_dtmf" msgid="2447177903892477915">"ডুৱেল মাল্টি ট\'ন ফ্ৰিকুৱেন্সী"</string>
<string name="stream_accessibility" msgid="301136219144385106">"দিব্যাংগসকলৰ বাবে থকা সুবিধাসমূহ"</string>
- <!-- no translation found for ring_toggle_title (3281244519428819576) -->
- <skip />
- <!-- no translation found for volume_ringer_status_normal (4273142424125855384) -->
- <skip />
- <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) -->
- <skip />
- <!-- no translation found for volume_ringer_status_silent (6896394161022916369) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_vibrate (1187944970457807498) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_mute (3625049841390467354) -->
- <skip />
+ <string name="ring_toggle_title" msgid="3281244519428819576">"কলসমূহ"</string>
+ <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ৰিং"</string>
+ <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"কম্পন"</string>
+ <string name="volume_ringer_status_silent" msgid="6896394161022916369">"মিউট"</string>
+ <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। আনমিউট কৰিবৰ বাবে টিপক।"</string>
+ <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। কম্পনৰ বাবে টিপক। দিব্য়াংগসকলৰ বাবে থকা সেৱা মিউট হৈ থাকিব পাৰে।"</string>
+ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। মিউট কৰিবলৈ টিপক। দিব্য়াংগসকলৰ বাবে থকা সেৱা মিউট হৈ থাকিব পাৰে।"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। কম্পন অৱস্থাত ছেট কৰিবলৈ টিপক।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। মিউট কৰিবলৈ টিপক।"</string>
<!-- no translation found for volume_dialog_title (7272969888820035876) -->
@@ -730,22 +621,14 @@
<skip />
<!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
<skip />
- <!-- no translation found for output_title (5355078100792942802) -->
- <skip />
- <!-- no translation found for output_calls_title (8717692905017206161) -->
- <skip />
- <!-- no translation found for output_none_found (5544982839808921091) -->
- <skip />
- <!-- no translation found for output_none_found_service_off (8631969668659757069) -->
- <skip />
- <!-- no translation found for output_service_bt (6224213415445509542) -->
- <skip />
- <!-- no translation found for output_service_wifi (3749735218931825054) -->
- <skip />
- <!-- no translation found for output_service_bt_wifi (4486837869988770896) -->
- <skip />
- <!-- no translation found for system_ui_tuner (708224127392452018) -->
- <skip />
+ <string name="output_title" msgid="5355078100792942802">"মিডিয়া আউটপুট"</string>
+ <string name="output_calls_title" msgid="8717692905017206161">"ফ\'ন কল আউটপুট"</string>
+ <string name="output_none_found" msgid="5544982839808921091">"কোনো ডিভাইচ বিচাৰি পোৱা নগ\'ল"</string>
+ <string name="output_none_found_service_off" msgid="8631969668659757069">"কোনো ডিভাইচ বিচাৰি পোৱা নগ\'ল। <xliff:g id="SERVICE">%1$s</xliff:g>ক অন কৰি চাওক"</string>
+ <string name="output_service_bt" msgid="6224213415445509542">"ব্লুটুথ"</string>
+ <string name="output_service_wifi" msgid="3749735218931825054">"ৱাই-ফাই"</string>
+ <string name="output_service_bt_wifi" msgid="4486837869988770896">"ব্লুটুথ আৰু ৱাই-ফাই"</string>
+ <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
<!-- no translation found for show_battery_percentage (5444136600512968798) -->
<skip />
<!-- no translation found for show_battery_percentage_summary (3215025775576786037) -->
@@ -754,8 +637,7 @@
<skip />
<!-- no translation found for status_bar (4877645476959324760) -->
<skip />
- <!-- no translation found for overview (4018602013895926956) -->
- <skip />
+ <string name="overview" msgid="4018602013895926956">"অৱলোকন"</string>
<string name="demo_mode" msgid="2532177350215638026">"ছিষ্টেমৰ UI প্ৰদৰ্শন ম\'ড"</string>
<!-- no translation found for enable_demo_mode (4844205668718636518) -->
<skip />
@@ -785,56 +667,31 @@
<skip />
<!-- no translation found for accessibility_status_bar_hotspot (4099381329956402865) -->
<skip />
- <!-- no translation found for accessibility_managed_profile (6613641363112584120) -->
- <skip />
- <!-- no translation found for tuner_warning_title (7094689930793031682) -->
- <skip />
- <!-- no translation found for tuner_warning (8730648121973575701) -->
- <skip />
- <!-- no translation found for tuner_persistent_warning (8597333795565621795) -->
- <skip />
- <!-- no translation found for got_it (2239653834387972602) -->
- <skip />
- <!-- no translation found for tuner_toast (603429811084428439) -->
- <skip />
- <!-- no translation found for remove_from_settings (8389591916603406378) -->
- <skip />
- <!-- no translation found for remove_from_settings_prompt (6069085993355887748) -->
- <skip />
- <!-- no translation found for activity_not_found (348423244327799974) -->
- <skip />
- <!-- no translation found for clock_seconds (7689554147579179507) -->
- <skip />
- <!-- no translation found for clock_seconds_desc (6282693067130470675) -->
- <skip />
- <!-- no translation found for qs_rearrange (8060918697551068765) -->
- <skip />
- <!-- no translation found for show_brightness (6613930842805942519) -->
- <skip />
- <!-- no translation found for experimental (6198182315536726162) -->
- <skip />
- <!-- no translation found for enable_bluetooth_title (5027037706500635269) -->
- <skip />
- <!-- no translation found for enable_bluetooth_message (9106595990708985385) -->
- <skip />
- <!-- no translation found for enable_bluetooth_confirmation_ok (6258074250948309715) -->
- <skip />
- <!-- no translation found for show_silently (6841966539811264192) -->
- <skip />
- <!-- no translation found for block (2734508760962682611) -->
- <skip />
- <!-- no translation found for do_not_silence (6878060322594892441) -->
- <skip />
- <!-- no translation found for do_not_silence_block (4070647971382232311) -->
- <skip />
- <!-- no translation found for tuner_full_importance_settings (3207312268609236827) -->
- <skip />
- <!-- no translation found for tuner_full_importance_settings_on (7545060756610299966) -->
- <skip />
- <!-- no translation found for tuner_full_importance_settings_off (8208165412614935229) -->
- <skip />
- <!-- no translation found for power_notification_controls_description (4372459941671353358) -->
- <skip />
+ <string name="accessibility_managed_profile" msgid="6613641363112584120">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
+ <string name="tuner_warning_title" msgid="7094689930793031682">"কিছুমানৰ বাবে আমোদজনক হয় কিন্তু সকলোৰে বাবে নহয়"</string>
+ <string name="tuner_warning" msgid="8730648121973575701">"System UI Tunerএ আপোনাক Android ব্যৱহাৰকাৰী ইণ্টাৰফেইচ সলনি কৰিবলৈ আৰু নিজৰ উপযোগিতা অনুসৰি ব্যৱহাৰ কৰিবলৈ অতিৰিক্ত সুবিধা প্ৰদান কৰে। এই পৰীক্ষামূলক সুবিধাসমূহ সলনি হ\'ব পাৰে, সেইবোৰে কাম নকৰিব পাৰে বা আগন্তুক সংস্কৰণসমূহত সেইবোৰ অন্তৰ্ভুক্ত কৰা নহ\'ব পাৰে। সাৱধানেৰে আগবাঢ়ক।"</string>
+ <string name="tuner_persistent_warning" msgid="8597333795565621795">"এই পৰীক্ষামূলক সুবিধাসমূহ সলনি হ\'ব পাৰে, সেইবোৰে কাম নকৰিব পাৰে বা আগন্তুক সংস্কৰণসমূহত সেইবোৰ অন্তৰ্ভুক্ত কৰা নহ\'ব পাৰে। সাৱধানেৰে আগবাঢ়ক।"</string>
+ <string name="got_it" msgid="2239653834387972602">"বুজি পালোঁ"</string>
+ <string name="tuner_toast" msgid="603429811084428439">"অভিনন্দন! ছেটিংসমূহত System UI Tuner যোগ কৰা হৈছে"</string>
+ <string name="remove_from_settings" msgid="8389591916603406378">"ছেটিংসমূহৰ পৰা আঁতৰাওক"</string>
+ <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ছেটিংসমূহৰ পৰা System UI Tuner আঁতৰাই ইয়াৰ সুবিধাসমূহ ব্যৱহাৰ কৰাটো বন্ধ কৰিবনে?"</string>
+ <string name="activity_not_found" msgid="348423244327799974">"আপোনাৰ ডিভাইচত এপ্লিকেশ্বনটো ইনষ্টল কৰা হোৱা নাই"</string>
+ <string name="clock_seconds" msgid="7689554147579179507">"ঘড়ীৰ ছেকেণ্ড দেখুৱাওক"</string>
+ <string name="clock_seconds_desc" msgid="6282693067130470675">"স্থিতি দণ্ডত ঘড়ীৰ ছেকেণ্ড দেখুৱাওক। এই কার্যই বেটাৰিৰ অৱস্থাত প্ৰভাৱ পেলাব পাৰে।"</string>
+ <string name="qs_rearrange" msgid="8060918697551068765">"ক্ষিপ্ৰ ছেটিংসমূহ পুনৰ সজাওক"</string>
+ <string name="show_brightness" msgid="6613930842805942519">"দ্ৰুত ছেটিংসমূহত উজ্জ্বলতা দেখুৱাওক"</string>
+ <string name="experimental" msgid="6198182315536726162">"পৰীক্ষামূলক"</string>
+ <string name="enable_bluetooth_title" msgid="5027037706500635269">"ব্লুটুথ অন কৰিবনে?"</string>
+ <string name="enable_bluetooth_message" msgid="9106595990708985385">"আপোনাৰ টেবলেটত আপোনাৰ কীব\'ৰ্ড সংযোগ কৰিবলৈ আপুনি প্ৰথমে ব্লুটুথ অন কৰিব লাগিব।"</string>
+ <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"অন কৰক"</string>
+ <string name="show_silently" msgid="6841966539811264192">"জাননীসমূহ নীৰৱে দেখুৱাওক"</string>
+ <string name="block" msgid="2734508760962682611">"সকলো জাননী অৱৰোধ কৰক"</string>
+ <string name="do_not_silence" msgid="6878060322594892441">"নীৰৱ নকৰিব"</string>
+ <string name="do_not_silence_block" msgid="4070647971382232311">"নীৰৱ অথবা অৱৰোধ নকৰিব"</string>
+ <string name="tuner_full_importance_settings" msgid="3207312268609236827">"জাননী নিয়ন্ত্ৰণৰ অধিক কৰ্তৃত্ব"</string>
+ <string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"অন"</string>
+ <string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"অফ"</string>
+ <string name="power_notification_controls_description" msgid="4372459941671353358">"জাননী নিয়ন্ত্ৰণৰ অধিক কৰ্তৃত্বৰ সৈতে আপুনি এটা এপৰ জাননীৰ গুৰুত্বৰ স্তৰ ০ৰ পৰা ৫লৈ ছেট কৰিব পাৰে।\n\n"<b>"স্তৰ ৫"</b>" \n- জাননী তালিকাৰ একেবাৰে ওপৰত দেখুৱাওক \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ অনুমতি দিয়ক\n- সদায় ভুমুকি মাৰিবলৈ দিয়ক\n\n"<b>"স্তৰ ৪"</b>" \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- সদায় ভুমুকি মাৰিবলৈ দিয়ক\n\n"<b>"স্তৰ ৩"</b>" \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n\n"<b>"স্তৰ ২"</b>" \n- সম্পূর্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব \n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n- কেতিয়াও শব্দ আৰু কম্পন কৰিবলৈ নিদিব\n\n"<b>" স্তৰ ১"</b>" \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n-কেতিয়াও শব্দ আৰু কম্পন কৰিবলৈ নিদিব \n- লক স্ক্ৰীণ আৰু স্থিতি দণ্ডৰ পৰা লুকুৱাই ৰাখক \n- জাননী তালিকাৰ একেবাৰে তলত দেখুৱাওক\n\n"<b>"স্তৰ ০"</b>" \n- এই এপৰ সকলো জাননী অৱৰোধ কৰক"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"জাননীসমূহ"</string>
<!-- no translation found for notification_channel_disabled (344536703863700565) -->
<skip />
@@ -850,18 +707,13 @@
<skip />
<!-- no translation found for notification_unblockable_desc (1037434112919403708) -->
<skip />
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
- <!-- no translation found for notification_more_settings (816306283396553571) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জাননী নিয়ন্ত্ৰণসমূহ খোলা অৱস্থাত আছে"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জাননী নিয়ন্ত্ৰণসমূহ বন্ধ অৱস্থাত আছে"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"এই চ্চেনেলৰ পৰা জাননী দিবলৈ অনুমতি দিয়ক"</string>
+ <string name="notification_more_settings" msgid="816306283396553571">"অধিক ছেটিং"</string>
<!-- no translation found for notification_app_settings (420348114670768449) -->
<skip />
- <!-- no translation found for notification_done (5279426047273930175) -->
- <skip />
+ <string name="notification_done" msgid="5279426047273930175">"সম্পন্ন হ\'ল"</string>
<!-- no translation found for inline_undo (558916737624706010) -->
<skip />
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
@@ -869,130 +721,75 @@
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"জাননীক স্নুজ কৰাৰ বিকল্পসমূহ"</string>
<string name="snooze_undo" msgid="6074877317002985129">"আনডু কৰক"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ৰ বাবে স্নুজ কৰক"</string>
- <!-- no translation found for snoozeHourOptions (2124335842674413030) -->
- <!-- no translation found for snoozeMinuteOptions (4127251700591510196) -->
- <!-- no translation found for battery_panel_title (7944156115535366613) -->
- <skip />
- <!-- no translation found for battery_detail_charging_summary (1279095653533044008) -->
- <skip />
- <!-- no translation found for battery_detail_switch_title (6285872470260795421) -->
- <skip />
- <!-- no translation found for battery_detail_switch_summary (9049111149407626804) -->
- <skip />
- <!-- no translation found for keyboard_key_button_template (6230056639734377300) -->
- <skip />
- <!-- no translation found for keyboard_key_home (2243500072071305073) -->
- <skip />
- <!-- no translation found for keyboard_key_back (2337450286042721351) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_up (5584144111755734686) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_down (7331518671788337815) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_left (1346446024676962251) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_right (3317323247127515341) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_center (2566737770049304658) -->
- <skip />
- <!-- no translation found for keyboard_key_tab (3871485650463164476) -->
- <skip />
- <!-- no translation found for keyboard_key_space (2499861316311153293) -->
- <skip />
- <!-- no translation found for keyboard_key_enter (5739632123216118137) -->
- <skip />
- <!-- no translation found for keyboard_key_backspace (1559580097512385854) -->
- <skip />
- <!-- no translation found for keyboard_key_media_play_pause (3861975717393887428) -->
- <skip />
- <!-- no translation found for keyboard_key_media_stop (2859963958595908962) -->
- <skip />
- <!-- no translation found for keyboard_key_media_next (1894394911630345607) -->
- <skip />
- <!-- no translation found for keyboard_key_media_previous (4256072387192967261) -->
- <skip />
- <!-- no translation found for keyboard_key_media_rewind (2654808213360820186) -->
- <skip />
- <!-- no translation found for keyboard_key_media_fast_forward (3849417047738200605) -->
- <skip />
- <!-- no translation found for keyboard_key_page_up (5654098530106845603) -->
- <skip />
- <!-- no translation found for keyboard_key_page_down (8720502083731906136) -->
- <skip />
- <!-- no translation found for keyboard_key_forward_del (1391451334716490176) -->
- <skip />
- <!-- no translation found for keyboard_key_move_home (2765693292069487486) -->
- <skip />
- <!-- no translation found for keyboard_key_move_end (5901174332047975247) -->
- <skip />
- <!-- no translation found for keyboard_key_insert (8530501581636082614) -->
- <skip />
- <!-- no translation found for keyboard_key_num_lock (5052537581246772117) -->
- <skip />
- <!-- no translation found for keyboard_key_numpad_template (8729216555174634026) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system (6472647649616541064) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_home (3054369431319891965) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_recents (3154851905021926744) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_back (2207004531216446378) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_notifications (8366964080041773224) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_shortcuts_helper (4892255911160332762) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_switch_input (2334164096341310324) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications (9129465955073449206) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_assist (9095441910537146013) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_browser (6465985474000766533) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_contacts (2064197111278436375) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_email (6257036897441939004) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_sms (638701213803242744) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_music (4775559515850922780) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_youtube (6555453761294723317) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_calendar (9043614299194991263) -->
- <skip />
- <!-- no translation found for tuner_full_zen_title (4540823317772234308) -->
- <skip />
- <!-- no translation found for volume_and_do_not_disturb (3373784330208603030) -->
- <skip />
- <!-- no translation found for volume_dnd_silent (4363882330723050727) -->
- <skip />
- <!-- no translation found for volume_up_silent (7141255269783588286) -->
- <skip />
- <!-- no translation found for battery (7498329822413202973) -->
- <skip />
- <!-- no translation found for clock (7416090374234785905) -->
- <skip />
- <!-- no translation found for headset (4534219457597457353) -->
- <skip />
- <!-- no translation found for accessibility_status_bar_headphones (9156307120060559989) -->
- <skip />
- <!-- no translation found for accessibility_status_bar_headset (8666419213072449202) -->
- <skip />
- <!-- no translation found for data_saver (5037565123367048522) -->
- <skip />
- <!-- no translation found for accessibility_data_saver_on (8454111686783887148) -->
- <skip />
- <!-- no translation found for accessibility_data_saver_off (8841582529453005337) -->
- <skip />
- <!-- no translation found for switch_bar_on (1142437840752794229) -->
- <skip />
- <!-- no translation found for switch_bar_off (8803270596930432874) -->
- <skip />
- <!-- no translation found for nav_bar (1993221402773877607) -->
- <skip />
+ <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
+ <item quantity="one"> %d ঘণ্টা</item>
+ <item quantity="other"> %d ঘণ্টা</item>
+ </plurals>
+ <plurals name="snoozeMinuteOptions" formatted="false" msgid="4127251700591510196">
+ <item quantity="one"> %d মিনিট</item>
+ <item quantity="other"> %d মিনিট</item>
+ </plurals>
+ <string name="battery_panel_title" msgid="7944156115535366613">"বেটাৰিৰ ব্যৱহাৰ"</string>
+ <string name="battery_detail_charging_summary" msgid="1279095653533044008">"চ্চাৰ্জ কৰি থকাৰ সময়ত বেটাৰি সঞ্চয়কাৰী উপলব্ধ নহয়।"</string>
+ <string name="battery_detail_switch_title" msgid="6285872470260795421">"বেটাৰি সঞ্চয়কাৰী"</string>
+ <string name="battery_detail_switch_summary" msgid="9049111149407626804">"কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে"</string>
+ <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> বুটাম"</string>
+ <string name="keyboard_key_home" msgid="2243500072071305073">"হ\'ম"</string>
+ <string name="keyboard_key_back" msgid="2337450286042721351">"উভতি যাওক"</string>
+ <string name="keyboard_key_dpad_up" msgid="5584144111755734686">"ওপৰলৈ"</string>
+ <string name="keyboard_key_dpad_down" msgid="7331518671788337815">"তললৈ"</string>
+ <string name="keyboard_key_dpad_left" msgid="1346446024676962251">"বাওঁফালে"</string>
+ <string name="keyboard_key_dpad_right" msgid="3317323247127515341">"সোঁফালে"</string>
+ <string name="keyboard_key_dpad_center" msgid="2566737770049304658">"স্ক্ৰীণৰ মাজত"</string>
+ <string name="keyboard_key_tab" msgid="3871485650463164476">"টেব"</string>
+ <string name="keyboard_key_space" msgid="2499861316311153293">"স্পেচ"</string>
+ <string name="keyboard_key_enter" msgid="5739632123216118137">"এণ্টাৰ"</string>
+ <string name="keyboard_key_backspace" msgid="1559580097512385854">"বেকস্পেচ"</string>
+ <string name="keyboard_key_media_play_pause" msgid="3861975717393887428">"প্লে/পজ কৰক"</string>
+ <string name="keyboard_key_media_stop" msgid="2859963958595908962">"বন্ধ কৰক"</string>
+ <string name="keyboard_key_media_next" msgid="1894394911630345607">"পৰৱৰ্তী"</string>
+ <string name="keyboard_key_media_previous" msgid="4256072387192967261">"পূৰ্বৱৰ্তী"</string>
+ <string name="keyboard_key_media_rewind" msgid="2654808213360820186">"ৰিৱাইণ্ড কৰক"</string>
+ <string name="keyboard_key_media_fast_forward" msgid="3849417047738200605">"ফাষ্ট ফৰৱাৰ্ড"</string>
+ <string name="keyboard_key_page_up" msgid="5654098530106845603">"পেজ আপ"</string>
+ <string name="keyboard_key_page_down" msgid="8720502083731906136">"পেজ ডাউন"</string>
+ <string name="keyboard_key_forward_del" msgid="1391451334716490176">"মচক"</string>
+ <string name="keyboard_key_move_home" msgid="2765693292069487486">"হ\'ম"</string>
+ <string name="keyboard_key_move_end" msgid="5901174332047975247">"সমাপ্ত"</string>
+ <string name="keyboard_key_insert" msgid="8530501581636082614">"ভৰাওক"</string>
+ <string name="keyboard_key_num_lock" msgid="5052537581246772117">"সংখ্য়া লক"</string>
+ <string name="keyboard_key_numpad_template" msgid="8729216555174634026">"নামপেড <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"ছিষ্টেম"</string>
+ <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"হ\'ম স্ক্ৰীণ"</string>
+ <string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"শেহতীয়াসমূহ"</string>
+ <string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"উভতি যাওক"</string>
+ <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"জাননীসমূহ"</string>
+ <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"কীব\'ৰ্ড শ্বৰ্টকাটসমূহ"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ইনপুট পদ্ধতি সলনি কৰক"</string>
+ <string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"এপ্লিকেশ্বনসমূহ"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"সহায়"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ব্ৰাউজাৰ"</string>
+ <string name="keyboard_shortcut_group_applications_contacts" msgid="2064197111278436375">"সম্পৰ্কসূচী"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="6257036897441939004">"ইমেইল"</string>
+ <string name="keyboard_shortcut_group_applications_sms" msgid="638701213803242744">"এছএমএছ"</string>
+ <string name="keyboard_shortcut_group_applications_music" msgid="4775559515850922780">"সংগীত"</string>
+ <string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
+ <string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"কেলেণ্ডাৰ"</string>
+ <string name="tuner_full_zen_title" msgid="4540823317772234308">"ভলিউম নিয়ন্ত্ৰণৰ সৈতে দেখুৱাওক"</string>
+ <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"অসুবিধা নিদিব"</string>
+ <string name="volume_dnd_silent" msgid="4363882330723050727">"ভলিউম বুটামসমূহৰ শ্বৰ্টকাট"</string>
+ <string name="volume_up_silent" msgid="7141255269783588286">"ভলিউম বঢ়ালে অসুবিধা নিদিব-ক নিষ্ক্ৰিয় কৰক"</string>
+ <string name="battery" msgid="7498329822413202973">"বেটাৰি"</string>
+ <string name="clock" msgid="7416090374234785905">"ঘড়ী"</string>
+ <string name="headset" msgid="4534219457597457353">"হেডছেট"</string>
+ <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"হেডফ\'ন সংযোগ হৈ আছে"</string>
+ <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"হেডছেট সংযোগ হৈ আছে"</string>
+ <string name="data_saver" msgid="5037565123367048522">"ডেটা সঞ্চয়কাৰী"</string>
+ <string name="accessibility_data_saver_on" msgid="8454111686783887148">"ডেটা সঞ্চয়কাৰী অন হৈ আছে"</string>
+ <string name="accessibility_data_saver_off" msgid="8841582529453005337">"ডেটা সঞ্চয়কাৰী অফ হৈ আছে"</string>
+ <string name="switch_bar_on" msgid="1142437840752794229">"অন"</string>
+ <string name="switch_bar_off" msgid="8803270596930432874">"অফ"</string>
+ <string name="nav_bar" msgid="1993221402773877607">"নেভিগেশ্বন দণ্ড"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"লেআউট"</string>
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"বাওঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string>
<string name="right_nav_bar_button_type" msgid="2481056627065649656">"সোঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string>
@@ -1005,133 +802,81 @@
<item msgid="586019486955594690">"সোঁফালে হালি যোৱা"</item>
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"কীব\'ৰ্ড সলনি কৰাৰ সুবিধা"</string>
- <!-- no translation found for save (2311877285724540644) -->
- <skip />
+ <string name="save" msgid="2311877285724540644">"ছেভ কৰক"</string>
<string name="reset" msgid="2448168080964209908">"ৰিছেট কৰক"</string>
- <!-- no translation found for adjust_button_width (6138616087197632947) -->
- <skip />
- <!-- no translation found for clipboard (1313879395099896312) -->
- <skip />
- <!-- no translation found for accessibility_key (5701989859305675896) -->
- <skip />
+ <string name="adjust_button_width" msgid="6138616087197632947">"বুটামৰ প্ৰস্থ খাপ খুৱাওক"</string>
+ <string name="clipboard" msgid="1313879395099896312">"ক্লিপব\'ৰ্ড"</string>
+ <string name="accessibility_key" msgid="5701989859305675896">"উপযোগিতা অনুসৰি তৈয়াৰ কৰা নেভিগেশ্বনৰ বুটাম"</string>
<string name="left_keycode" msgid="2010948862498918135">"বাওঁ কীক\'ড"</string>
<string name="right_keycode" msgid="708447961000848163">"সোঁ কীক\'ড"</string>
<string name="left_icon" msgid="3096287125959387541">"বাওঁ আইকন"</string>
<string name="right_icon" msgid="3952104823293824311">"সোঁ আইকন"</string>
- <!-- no translation found for drag_to_add_tiles (7058945779098711293) -->
- <skip />
- <!-- no translation found for drag_to_remove_tiles (3361212377437088062) -->
- <skip />
- <!-- no translation found for qs_edit (2232596095725105230) -->
- <skip />
- <!-- no translation found for tuner_time (6572217313285536011) -->
- <skip />
- <!-- no translation found for clock_options:0 (5965318737560463480) -->
- <!-- no translation found for clock_options:1 (1427801730816895300) -->
- <!-- no translation found for clock_options:2 (3830170141562534721) -->
- <!-- no translation found for battery_options:0 (3160236755818672034) -->
- <!-- no translation found for battery_options:1 (2139628951880142927) -->
- <!-- no translation found for battery_options:2 (3327323682209964956) -->
- <!-- no translation found for other (4060683095962566764) -->
- <skip />
- <!-- no translation found for accessibility_divider (5903423481953635044) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_full (2801570521881574972) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_70 (3612060638991687254) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_50 (1248083470322193075) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_30 (543324403127069386) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_right_full (4639381073802030463) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_full (5357010904067731654) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_70 (5090779195650364522) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_50 (6385859741925078668) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_30 (6201455163864841205) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_bottom_full (301433196679548001) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_label (8374924053307764245) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_add_tile_label (8133209638023882667) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_position_label (5055306305919289819) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_move_tile (2461819993780159542) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_remove_tile (7484493384665907197) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_added (8050200862063548309) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_removed (8584304916627913440) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_moved (4343693412689365038) -->
- <skip />
- <!-- no translation found for accessibility_desc_quick_settings_edit (8073587401747016103) -->
- <skip />
- <!-- no translation found for accessibility_desc_notification_icon (8352414185263916335) -->
- <skip />
- <!-- no translation found for dock_forced_resizable (5914261505436217520) -->
- <skip />
- <!-- no translation found for dock_non_resizeble_failed_to_dock_text (3871617304250207291) -->
- <skip />
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_settings (6132460890024942157) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_expand (2375165227880477530) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_collapse (1792625797142648105) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_alarm_set (1863000242431528676) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_user (1567445362870421770) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_no_internet (31890692343084075) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_open_details (4230931801728005194) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_open_settings (7806613775728380737) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_edit (7839992848995240393) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_page (5032979051755200721) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="7058945779098711293">"টাইল যোগ কৰিবৰ বাবে টানি আনি এৰক"</string>
+ <string name="drag_to_remove_tiles" msgid="3361212377437088062">"আঁতৰাবৰ বাবে টানি আনি ইয়াত এৰি দিয়ক"</string>
+ <string name="qs_edit" msgid="2232596095725105230">"সম্পাদনা কৰক"</string>
+ <string name="tuner_time" msgid="6572217313285536011">"সময়"</string>
+ <string-array name="clock_options">
+ <item msgid="5965318737560463480">"ঘন্টা, মিনিট আৰু ছেকেণ্ড দেখুৱাওক"</item>
+ <item msgid="1427801730816895300">"ঘন্টা আৰু মিনিট দেখুৱাওক (ডিফ\'ল্ট)"</item>
+ <item msgid="3830170141562534721">"এই আইকনটো নেদেখুৱাব"</item>
+ </string-array>
+ <string-array name="battery_options">
+ <item msgid="3160236755818672034">"সদায় শতাংশত দেখুৱাব"</item>
+ <item msgid="2139628951880142927">"চ্চাৰ্জ কৰি থকাৰ সময়ত শতাংশ দেখুৱাওক (ডিফ\'ল্ট)"</item>
+ <item msgid="3327323682209964956">"এই আইকনটো নেদেখুৱাব"</item>
+ </string-array>
+ <string name="other" msgid="4060683095962566764">"অন্যান্য"</string>
+ <string name="accessibility_divider" msgid="5903423481953635044">"স্প্লিট স্ক্ৰীণৰ বিভাজক"</string>
+ <string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"বাওঁফালৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+ <string name="accessibility_action_divider_left_70" msgid="3612060638991687254">"বাওঁফালৰ স্ক্ৰীণখন ৭০% কৰক"</string>
+ <string name="accessibility_action_divider_left_50" msgid="1248083470322193075">"বাওঁফালৰ স্ক্ৰীণখন ৫০% কৰক"</string>
+ <string name="accessibility_action_divider_left_30" msgid="543324403127069386">"বাওঁফালৰ স্ক্ৰীণখন ৩০% কৰক"</string>
+ <string name="accessibility_action_divider_right_full" msgid="4639381073802030463">"সোঁফালৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+ <string name="accessibility_action_divider_top_full" msgid="5357010904067731654">"শীৰ্ষ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+ <string name="accessibility_action_divider_top_70" msgid="5090779195650364522">"শীর্ষ স্ক্ৰীণখন ৭০% কৰক"</string>
+ <string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"শীর্ষ স্ক্ৰীণখন ৫০% কৰক"</string>
+ <string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"শীর্ষ স্ক্ৰীণখন ৩০% কৰক"</string>
+ <string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"তলৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+ <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"অৱস্থান <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>। সম্পাদনা কৰিবৰ বাবে দুবাৰ টিপক।"</string>
+ <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>। যোগ কৰিবলৈ দুবাৰ টিপক।"</string>
+ <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"অৱস্থান <xliff:g id="POSITION">%1$d</xliff:g>। বাছনি কৰিবলৈ দুবাৰ টিপক।"</string>
+ <string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"<xliff:g id="TILE_NAME">%1$s</xliff:g> স্থানান্তৰ কৰক"</string>
+ <string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"<xliff:g id="TILE_NAME">%1$s</xliff:g>ক আঁতৰাওক"</string>
+ <string name="accessibility_qs_edit_tile_added" msgid="8050200862063548309">"<xliff:g id="TILE_NAME">%1$s</xliff:g>ক <xliff:g id="POSITION">%2$d</xliff:g> অৱস্থানত যোগ কৰা হৈছে"</string>
+ <string name="accessibility_qs_edit_tile_removed" msgid="8584304916627913440">"<xliff:g id="TILE_NAME">%1$s</xliff:g>ক আঁতৰোৱা হৈছে"</string>
+ <string name="accessibility_qs_edit_tile_moved" msgid="4343693412689365038">"<xliff:g id="TILE_NAME">%1$s</xliff:g>ক <xliff:g id="POSITION">%2$d</xliff:g> অৱস্থানলৈ স্থানান্তৰ কৰা হৈছে"</string>
+ <string name="accessibility_desc_quick_settings_edit" msgid="8073587401747016103">"ক্ষিপ্ৰ ছেটিংসমূহৰ সম্পাদক।"</string>
+ <string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> জাননী: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+ <string name="dock_forced_resizable" msgid="5914261505436217520">"বিভাজিত স্ক্ৰীণৰ সৈতে এপে হয়তো কাম নকৰিব।"</string>
+ <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"এপটোৱে বিভাজিত স্ক্ৰীণ সমৰ্থন নকৰে।"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"গৌণ ডিছপ্লেত এপে সঠিকভাৱে কাম নকৰিব পাৰে।"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"গৌণ ডিছপ্লেত এপ্ লঞ্চ কৰিব নোৱাৰি।"</string>
+ <string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ছেটিংসমূহ খোলক।"</string>
+ <string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ক্ষিপ্ৰ ছেটিংসমূহ খোলক।"</string>
+ <string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ক্ষিপ্ৰ ছেটিংসমূহ বন্ধ কৰক।"</string>
+ <string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"এলার্ম ছেট কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_user" msgid="1567445362870421770">"<xliff:g id="ID_1">%s</xliff:g> হিচাপে ছাইন ইন হ\'ল"</string>
+ <string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"ইণ্টাৰনেট সংযোগ নাই।"</string>
+ <string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"বিৱৰণসমূহ খোলক।"</string>
+ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g>ৰ ছেটিংসমূহ খোলক।"</string>
+ <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ছেটিংসমূহৰ ক্ৰম সম্পাদনা কৰক।"</string>
+ <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>ৰ পৃষ্ঠা <xliff:g id="ID_1">%1$d</xliff:g>"</string>
<string name="tuner_lock_screen" msgid="5755818559638850294">"লক স্ক্ৰীণ"</string>
- <!-- no translation found for pip_phone_expand (5889780005575693909) -->
- <skip />
+ <string name="pip_phone_expand" msgid="5889780005575693909">"বিস্তাৰ কৰক"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"সৰু কৰক"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"বন্ধ কৰক"</string>
- <!-- no translation found for pip_phone_settings (8080777499521528521) -->
- <skip />
- <!-- no translation found for pip_phone_dismiss_hint (6351678169095923899) -->
- <skip />
- <!-- no translation found for pip_menu_title (4707292089961887657) -->
- <skip />
+ <string name="pip_phone_settings" msgid="8080777499521528521">"ছেটিংসমূহ"</string>
+ <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"অগ্ৰাহ্য কৰিবলৈ তললৈ টানক"</string>
+ <string name="pip_menu_title" msgid="4707292089961887657">"মেনু"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> চিত্ৰৰ ভিতৰৰ চিত্ৰত আছে"</string>
- <!-- no translation found for pip_notification_message (5619512781514343311) -->
- <skip />
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
- <!-- no translation found for thermal_shutdown_title (4458304833443861111) -->
- <skip />
- <!-- no translation found for thermal_shutdown_message (9006456746902370523) -->
- <skip />
- <!-- no translation found for thermal_shutdown_dialog_message (566347880005304139) -->
- <skip />
+ <string name="pip_notification_message" msgid="5619512781514343311">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g> সুবিধাটো ব্যৱহাৰ কৰিব নোখোজে, তেন্তে ছেটিংসমূহ খুলিবলৈ টিপক আৰু তালৈ গৈ ইয়াক অফ কৰক।"</string>
+ <string name="pip_play" msgid="1417176722760265888">"প্লে কৰক"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"পজ কৰক"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"পৰৱৰ্তী মিডিয়ালৈ যাওক"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"আগৰটো মিডিয়ালৈ যাওক"</string>
+ <string name="thermal_shutdown_title" msgid="4458304833443861111">"আপোনাৰ ফ\'নটো গৰম হোৱাৰ কাৰণে অফ কৰা হৈছিল"</string>
+ <string name="thermal_shutdown_message" msgid="9006456746902370523">"আপোনাৰ ফ\'নটো এতিয়া স্বাভাৱিকভাৱে চলি আছে"</string>
+ <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"আপোনাৰ ফ\'নটো অত্যধিক গৰম হোৱাৰ বাবে ইয়াক ঠাণ্ডা কৰিবলৈ অফ কৰা হৈছিল। আপোনাৰ ফ\'নটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\n\nআপোনাৰ ফ\'নটো গৰম হ\'ব পাৰে, যদিহে আপুনি:\n • ফ\'নটোৰ হাৰ্ডৱেৰ অত্যধিক মাত্ৰাত ব্যৱহাৰ কৰা এপসমূহ চলালে (যেনে, ভিডিঅ\' গেইম, ভিডিঅ\', দিক্-নিৰ্দেশনা এপসমূহ)\n • খুউব ডাঙৰ আকাৰৰ ফাইল আপল\'ড বা ডাউনল\'ড কৰিলে\n • আপোনাৰ ফ\'নটো উচ্চ তাপমাত্ৰাৰ পৰিৱেশত ব্যৱহাৰ কৰিলে"</string>
<string name="high_temp_title" msgid="4589508026407318374">"ফ\'নটো গৰম হ\'বলৈ ধৰিছে"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ফ\'নটো ঠাণ্ডা হৈ থকা সময়ত কিছুমান সুবিধা উপলব্ধ নহ\'ব"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পিছত ই আগৰ নিচিনাকৈয়েই চলিব।"</string>
@@ -1150,43 +895,28 @@
<string name="tuner_menu" msgid="191640047241552081">"মেনু"</string>
<string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> এপ্"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"সতৰ্কবাণীসমূহ"</string>
- <!-- no translation found for notification_channel_battery (5786118169182888462) -->
- <skip />
+ <string name="notification_channel_battery" msgid="5786118169182888462">"বেটাৰি"</string>
<string name="notification_channel_screenshot" msgid="6314080179230000938">"স্ক্ৰীণশ্বটসমূহ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"সাধাৰণ বার্তাসমূহ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়াগাৰ"</string>
<string name="instant_apps" msgid="6647570248119804907">"তাৎক্ষণিক এপসমূহ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"তাৎক্ষণিক এপসমূহক ইনষ্টল কৰাৰ প্ৰয়োজন নাই।"</string>
- <!-- no translation found for app_info (6856026610594615344) -->
- <skip />
- <!-- no translation found for go_to_web (2650669128861626071) -->
- <skip />
+ <string name="app_info" msgid="6856026610594615344">"এপ্ সম্পৰ্কীয় তথ্য"</string>
+ <string name="go_to_web" msgid="2650669128861626071">"ব্ৰাউজাৰলৈ যাওক"</string>
<string name="mobile_data" msgid="7094582042819250762">"ম\'বাইল ডেটা"</string>
- <!-- no translation found for wifi_is_off (1838559392210456893) -->
- <skip />
- <!-- no translation found for bt_is_off (2640685272289706392) -->
- <skip />
- <!-- no translation found for dnd_is_off (6167780215212497572) -->
- <skip />
- <!-- no translation found for qs_dnd_prompt_auto_rule (862559028345233052) -->
- <skip />
- <!-- no translation found for qs_dnd_prompt_app (7978037419334156034) -->
- <skip />
- <!-- no translation found for qs_dnd_prompt_auto_rule_app (2599343675391111951) -->
- <skip />
- <!-- no translation found for qs_dnd_until (3469471136280079874) -->
- <skip />
- <!-- no translation found for qs_dnd_keep (1825009164681928736) -->
- <skip />
- <!-- no translation found for qs_dnd_replace (8019520786644276623) -->
- <skip />
- <!-- no translation found for running_foreground_services_title (381024150898615683) -->
- <skip />
- <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
- <skip />
+ <string name="wifi_is_off" msgid="1838559392210456893">"ৱাই-ফাই অফ অৱস্থাত আছে"</string>
+ <string name="bt_is_off" msgid="2640685272289706392">"ব্লুটুথ অফ অৱস্থাত আছে"</string>
+ <string name="dnd_is_off" msgid="6167780215212497572">"অসুবিধা নিদিব অফ অৱস্থাত আছে"</string>
+ <string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"অসুবিধা নিদিব-ক এটা স্বয়ংক্ৰিয় নিয়ম (<xliff:g id="ID_1">%s</xliff:g>)এ অন কৰিলে।"</string>
+ <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"অসুবিধা নিদিব-ক কোনো এপ্ (<xliff:g id="ID_1">%s</xliff:g>)এ অন কৰিলে।"</string>
+ <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"অসুবিধা নিদিব-ক এটা স্বয়ংক্ৰিয় নিয়ম বা এপে অন কৰিলে।"</string>
+ <string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> পৰ্যন্ত"</string>
+ <string name="qs_dnd_keep" msgid="1825009164681928736">"ৰাখক"</string>
+ <string name="qs_dnd_replace" msgid="8019520786644276623">"সলনি কৰক"</string>
+ <string name="running_foreground_services_title" msgid="381024150898615683">"নেপথ্যত চলি থকা এপসমূহ"</string>
+ <string name="running_foreground_services_msg" msgid="6326247670075574355">"বেটাৰি আৰু ডেটাৰ ব্যৱহাৰৰ বিষয়ে বিশদভাৱে জানিবলৈ টিপক"</string>
<string name="data_usage_disable_mobile" msgid="5116269981510015864">"ম’বাইল ডেটা অফ কৰিবনে?"</string>
- <!-- no translation found for touch_filtered_warning (8671693809204767551) -->
- <skip />
+ <string name="touch_filtered_warning" msgid="8671693809204767551">"এটা এপে অনুমতি বিচাৰি কৰা অনুৰোধ এটা ঢাকি ধৰা বাবে ছেটিংসমূহে আপোনাৰ উত্তৰ সত্যাপন কৰিব পৰা নাই।"</string>
<!-- no translation found for slice_permission_title (7465009437851044444) -->
<skip />
<!-- no translation found for slice_permission_text_1 (3514586565609596523) -->
diff --git a/packages/SystemUI/res/values-as/strings_car.xml b/packages/SystemUI/res/values-as/strings_car.xml
new file mode 100644
index 0000000..8583c27
--- /dev/null
+++ b/packages/SystemUI/res/values-as/strings_car.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="unknown_user_label" msgid="4323896111737677955">"অজ্ঞাত"</string>
+ <string name="start_driving" msgid="864023351402918991">"গাড়ী চলোৱা আৰম্ভ কৰক"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-as/strings_tv.xml b/packages/SystemUI/res/values-as/strings_tv.xml
new file mode 100644
index 0000000..9d0ebb3
--- /dev/null
+++ b/packages/SystemUI/res/values-as/strings_tv.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"চিত্ৰৰ ভিতৰত চিত্ৰ"</string>
+ <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(শিৰোনামবিহীন কাৰ্যক্ৰম)"</string>
+ <string name="pip_close" msgid="3480680679023423574">"পিপ বন্ধ কৰক"</string>
+ <string name="pip_fullscreen" msgid="8604643018538487816">"সম্পূৰ্ণ স্ক্ৰীণ"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 4c05e96..4edb5fc 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -165,7 +165,7 @@
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobile data on"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobile data off"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
- <string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Airplane mode."</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN on."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"No SIM card."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier network changing."</string>
@@ -203,10 +203,10 @@
<string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wi-Fi turned on."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobile <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Battery <xliff:g id="STATE">%s</xliff:g>."</string>
- <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Aeroplane mode off."</string>
- <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Aeroplane mode on."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Aeroplane mode turned off."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Aeroplane mode turned on."</string>
+ <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Airplane mode off."</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Airplane mode on."</string>
+ <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Airplane mode off."</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Airplane mode turned on."</string>
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\'Do not disturb\' on, priority only."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Do not disturb on, total silence."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Do not disturb on, alarms only."</string>
@@ -286,6 +286,8 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_transient (4551281899312150640) -->
+ <skip />
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Auto-rotate screen"</string>
@@ -310,7 +312,8 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
- <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
+ <!-- no translation found for quick_settings_wifi_secondary_label_transient (7748206246119760554) -->
+ <skip />
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
@@ -327,7 +330,8 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Turning on..."</string>
+ <!-- no translation found for quick_settings_hotspot_secondary_label_transient (8010579363691405477) -->
+ <skip />
<plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
<item quantity="other">%d devices</item>
<item quantity="one">%d device</item>
@@ -341,8 +345,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> used"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> limit"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> warning"</string>
- <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Work profile"</string>
- <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Notifications & apps are off"</string>
+ <!-- no translation found for quick_settings_work_mode_label (7608026833638817218) -->
+ <skip />
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Night Light"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"On at sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string>
@@ -395,9 +399,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Total\nsilence"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priority\nonly"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarms\nonly"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charging (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Charging rapidly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Charging slowly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging rapidly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging slowly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Switch user"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Switch user, current user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Current user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -535,12 +539,9 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
- <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
- <skip />
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
+ <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Calls and notifications will ring"</string>
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -560,7 +561,7 @@
<string name="status_bar_ethernet" msgid="5044290963549500128">"Ethernet"</string>
<string name="status_bar_alarm" msgid="8536256753575881818">"Alarm"</string>
<string name="status_bar_work" msgid="6022553324802866373">"Work profile"</string>
- <string name="status_bar_airplane" msgid="7057575501472249002">"Aeroplane mode"</string>
+ <string name="status_bar_airplane" msgid="7057575501472249002">"Airplane mode"</string>
<string name="add_tile" msgid="2995389510240786221">"Add tile"</string>
<string name="broadcast_tile" msgid="3894036511763289383">"Broadcast Tile"</string>
<string name="zen_alarm_warning_indef" msgid="3482966345578319605">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g> unless you turn this off before then"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index fc3482f..720fbff 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -286,6 +286,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
+ <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Auto-rotate screen"</string>
@@ -310,7 +311,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
- <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
+ <string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
@@ -327,7 +328,7 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Turning on..."</string>
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="8010579363691405477">"Turning on…"</string>
<plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
<item quantity="other">%d devices</item>
<item quantity="one">%d device</item>
@@ -341,8 +342,7 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> used"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> limit"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> warning"</string>
- <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Work profile"</string>
- <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Notifications & apps are off"</string>
+ <string name="quick_settings_work_mode_label" msgid="7608026833638817218">"Work profile"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Night Light"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"On at sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string>
@@ -395,9 +395,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Total\nsilence"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priority\nonly"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarms\nonly"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charging (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Charging rapidly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Charging slowly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging rapidly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging slowly (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Switch user"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Switch user, current user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Current user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -535,6 +535,9 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
+ <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Calls and notifications will ring"</string>
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 1c0b8c0..12fccd4 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -103,8 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"ouvrir l\'appareil photo"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau plan de tâche"</string>
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
- <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Appuyez sur le lecteur d\'empreinte digitale"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icône d\'application"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zone de message d\'aide"</string>
@@ -276,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="5640361424498338327">"Économiseur d\'écran"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Appuyez de manière prolongée sur les icônes pour accéder à d\'autres options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires uniquement"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes uniquement"</string>
@@ -290,6 +288,8 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Casque"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string>
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_transient (4551281899312150640) -->
+ <skip />
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Rotation automatique de l\'écran"</string>
@@ -314,7 +314,8 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi désactivé"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi disponible"</string>
- <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string>
+ <!-- no translation found for quick_settings_wifi_secondary_label_transient (7748206246119760554) -->
+ <skip />
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Caster"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string>
@@ -331,7 +332,8 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès"</string>
- <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activation..."</string>
+ <!-- no translation found for quick_settings_hotspot_secondary_label_transient (8010579363691405477) -->
+ <skip />
<plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
<item quantity="one">%d appareil</item>
<item quantity="other">%d appareils</item>
@@ -345,8 +347,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilisés"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> au maximum"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertissement : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil professionnel"</string>
- <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Les notifications et les applications sont désactivées"</string>
+ <!-- no translation found for quick_settings_work_mode_label (7608026833638817218) -->
+ <skip />
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Éclairage nocturne"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activé au crépuscule"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'à l\'aube"</string>
@@ -399,9 +401,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Aucune\ninterruption"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priorité\nuniquement"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmes\nuniquement"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charge en cours… (chargé à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Charge rapide… (chargé à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Charge lente… (chargé à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement… (rechargé à 100 % dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement rapide… (à 100 % dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement lent… (à 100 % dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Changer d\'utilisateur"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Changer d\'utilisateur (utilisateur actuel : <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Utilisateur actuel : <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -539,6 +541,9 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Appuyez pour mettre en mode vibreur."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Appuyez pour ignorer."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Commandes de volume %s"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Vibreur pour les appels et les notifications"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Sonnerie désactivée pour les appels et les notifications"</string>
+ <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Sonnerie pour les appels et les notifications"</string>
<string name="output_title" msgid="5355078100792942802">"Sortie multimédia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Sortie de l\'appel téléphonique"</string>
<string name="output_none_found" msgid="5544982839808921091">"Aucun appareil détecté"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index c35c8a7..30ec2d5 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -120,8 +120,7 @@
<string name="accessibility_unlock_button" msgid="128158454631118828">"ଅନଲକ୍ କରନ୍ତୁ"</string>
<!-- no translation found for accessibility_waiting_for_fingerprint (4808860050517462885) -->
<skip />
- <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) -->
- <skip />
+ <string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"ଆଙ୍ଗୁଠିଚିହ୍ନ ବ୍ୟବହାର ନକରି ଅନଲକ୍ କରନ୍ତୁ"</string>
<string name="unlock_label" msgid="8779712358041029439">"ଅନଲକ୍"</string>
<string name="phone_label" msgid="2320074140205331708">"ଫୋନ୍ ଖୋଲନ୍ତୁ"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ଭଏସ୍ ସହାୟକ ଖୋଲନ୍ତୁ"</string>
@@ -157,8 +156,7 @@
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"ଡାଟା ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string>
<string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string>
<string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> ସହ ସଂଯୁକ୍ତ"</string>
- <!-- no translation found for accessibility_cast_name (4026393061247081201) -->
- <skip />
+ <string name="accessibility_cast_name" msgid="4026393061247081201">"<xliff:g id="CAST">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string>
<string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX ନାହିଁ।"</string>
<string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAXର ଗୋଟିଏ ବାର୍ ଅଛି।"</string>
<string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAXର ଦୁଇଟି ବାର୍ ଅଛି।"</string>
@@ -183,11 +181,9 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_4g_plus (3032226872470658661) -->
- <skip />
+ <string name="accessibility_data_connection_4g_plus" msgid="3032226872470658661">"4G+"</string>
<string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
- <!-- no translation found for accessibility_data_connection_lte_plus (361876866906946007) -->
- <skip />
+ <string name="accessibility_data_connection_lte_plus" msgid="361876866906946007">"LTE+"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ରୋମିଙ୍ଗ"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ଏଜ୍"</string>
@@ -203,11 +199,9 @@
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍।"</string>
<!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
<skip />
- <!-- no translation found for accessibility_no_sims (3957997018324995781) -->
- <skip />
+ <string name="accessibility_no_sims" msgid="3957997018324995781">"କୌଣସି SIM କାର୍ଡ ନାହିଁ।"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"କେରିଅର୍ ନେଟ୍ୱର୍କ ବଦଳାଯାଉଛି।"</string>
- <!-- no translation found for accessibility_battery_details (7645516654955025422) -->
- <skip />
+ <string name="accessibility_battery_details" msgid="7645516654955025422">"ବ୍ୟାଟେରୀ ବିବରଣୀ ଖୋଲନ୍ତୁ"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ବ୍ୟାଟେରୀ <xliff:g id="NUMBER">%d</xliff:g> ଶତକଡ଼ା ଅଛି।"</string>
<!-- no translation found for accessibility_battery_level_charging (1147587904439319646) -->
<skip />
@@ -252,13 +246,11 @@
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଗୁରୁତ୍ୱର୍ଣ୍ଣ।"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ।"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଆଲାର୍ମ।"</string>
- <!-- no translation found for accessibility_quick_settings_dnd (6607873236717185815) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ।"</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ ଅଛି।"</string>
<string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ କରାଯାଇଛି।"</string>
<string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରଯାଇଛି।"</string>
- <!-- no translation found for accessibility_quick_settings_bluetooth (6341675755803320038) -->
- <skip />
+ <string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"ବ୍ଲୁ-ଟୁଥ୍।"</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ବ୍ଲୁ-ଟୂଥ୍ ଅଫ୍ ଅଛି।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ବ୍ଲୁ-ଟୁଥ୍ ଅନ୍ ଅଛି।"</string>
<string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ ହେଉଛି।"</string>
@@ -284,14 +276,10 @@
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ବନ୍ଦ ଅଛି।"</string>
<string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ଅନ୍ ଅଛି।"</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ସ୍କ୍ରୀନ୍ କାଷ୍ଟ କରିବା ରହିଯାଇଛି।"</string>
- <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) -->
- <skip />
+ <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"ୱର୍କ ମୋଡ୍ ଅଫ୍।"</string>
+ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"ୱର୍କ ମୋଡ୍ ଅନ୍।"</string>
+ <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"ୱର୍କ ମୋଡ୍କୁ ଅଫ୍ କରାଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"ୱର୍କ ମୋଡ୍କୁ ଅନ୍ କରାଯାଇଛି।"</string>
<!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) -->
<skip />
<!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) -->
@@ -313,7 +301,10 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string>
<!-- no translation found for notification_group_overflow_indicator (1863231301642314183) -->
<skip />
- <!-- no translation found for notification_group_overflow_description (4579313201268495404) -->
+ <plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
+ <item quantity="other">ଭିତରେ ଆଉ <xliff:g id="NUMBER_1">%s</xliff:g>ଟି ଅଧିକ ବିଜ୍ଞପ୍ତି ରହିଛି।</item>
+ <item quantity="one">ଭିତରେ ଆଉ <xliff:g id="NUMBER_0">%s</xliff:g>ଟି ଅଧିକ ବିଜ୍ଞପ୍ତି ରହିଛି।</item>
+ </plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"ବିଜ୍ଞପ୍ତି ସେଟିଙ୍ଗ"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ସେଟିଙ୍ଗ"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ସ୍କ୍ରୀନ୍ ସ୍ୱଚାଳିତ ଭାବେ ବୁଲିବ।"</string>
@@ -323,8 +314,7 @@
<string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଦିଗରେ ଲକ୍ ଅଛି।"</string>
<string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ପୋର୍ଟେଟ୍ ଦିଗରେ ଲକ୍ ଅଛି।"</string>
<string name="dessert_case" msgid="1295161776223959221">"ଡେଜର୍ଟ କେସ୍"</string>
- <!-- no translation found for start_dreams (5640361424498338327) -->
- <skip />
+ <string name="start_dreams" msgid="5640361424498338327">"ସ୍କ୍ରୀନ୍ ସେଭର୍"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ଇଥରନେଟ୍"</string>
<!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
<skip />
@@ -344,10 +334,11 @@
<skip />
<!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) -->
<skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_transient (4551281899312150640) -->
+ <skip />
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"ଉଜ୍ଜ୍ୱଳତା"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string>
- <!-- no translation found for accessibility_quick_settings_rotation (4231661040698488779) -->
- <skip />
+ <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"ସ୍କ୍ରୀନ୍କୁ ଅଟୋ-ରୋଟେଟ୍ କରନ୍ତୁ"</string>
<!-- no translation found for accessibility_quick_settings_rotation_value (8187398200140760213) -->
<skip />
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ଘୂର୍ଣ୍ଣନ ଲକ୍ ହୋଇଛି"</string>
@@ -368,10 +359,9 @@
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ନେଟ୍ୱର୍କ ନାହିଁ"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ୱାଇ-ଫାଇ ଅଫ୍"</string>
- <!-- no translation found for quick_settings_wifi_on_label (7607810331387031235) -->
- <skip />
+ <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ୱାଇ-ଫାଇ ଅନ୍ ଅଛି"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"କୌଣସି ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
+ <!-- no translation found for quick_settings_wifi_secondary_label_transient (7748206246119760554) -->
<skip />
<string name="quick_settings_cast_title" msgid="7709016546426454729">"କାଷ୍ଟ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"କାଷ୍ଟିଙ୍ଗ"</string>
@@ -390,7 +380,7 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"ସଂଯୋଗ କରୁଛି..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ଟିଥରିଙ୍ଗ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ହଟସ୍ପଟ୍"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
+ <!-- no translation found for quick_settings_hotspot_secondary_label_transient (8010579363691405477) -->
<skip />
<!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ବିଜ୍ଞପ୍ତି"</string>
@@ -403,12 +393,9 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ବ୍ୟବହାର କରାଯାଇଛି"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ସୀମା"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ଚେତାବନୀ"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
+ <!-- no translation found for quick_settings_work_mode_label (7608026833638817218) -->
<skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
- <!-- no translation found for quick_settings_night_display_label (3577098011487644395) -->
- <skip />
+ <string name="quick_settings_night_display_label" msgid="3577098011487644395">"ରାତି ଆଲୋକ"</string>
<!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) -->
<skip />
<!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) -->
@@ -461,36 +448,33 @@
<string name="zen_priority_customize_button" msgid="7948043278226955063">"କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ"</string>
<!-- no translation found for zen_silence_introduction_voice (3948778066295728085) -->
<skip />
- <!-- no translation found for zen_silence_introduction (3137882381093271568) -->
- <skip />
+ <string name="zen_silence_introduction" msgid="3137882381093271568">"ଆଲାର୍ମ, ମ୍ୟୁଜିକ୍, ଭିଡିଓ ଓ ଗେମ୍ସ ସମେତ ଏହାଦ୍ୱାରା ସମସ୍ତ ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଶନ୍ ଅବରୋଧ ହୁଏ।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ନିମ୍ନରେ କମ୍ ଜରୁରୀ ବିଜ୍ଞପ୍ତି"</string>
<string name="notification_tap_again" msgid="7590196980943943842">"ଖୋଲିବା ପାଇଁ ପୁଣି ଟାପ୍ କରନ୍ତୁ"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"ଅନଲକ୍ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
<!-- no translation found for do_disclosure_generic (5615898451805157556) -->
<skip />
- <!-- no translation found for do_disclosure_with_name (5640615509915445501) -->
- <skip />
+ <string name="do_disclosure_with_name" msgid="5640615509915445501">"ଏହି ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି"</string>
<string name="phone_hint" msgid="4872890986869209950">"ଫୋନ୍ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
<string name="voice_hint" msgid="8939888732119726665">"ଭଏସ୍ ସହାୟକ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
<string name="camera_hint" msgid="7939688436797157483">"କ୍ୟାମେରା ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for interruption_level_none_with_warning (5114872171614161084) -->
- <skip />
+ <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ। ଏହାଦ୍ୱାରା ସ୍କ୍ରୀନ୍ ରିଡର୍ ମଧ୍ୟ ନୀରବ ହୋଇଯିବ।"</string>
<string name="interruption_level_none" msgid="6000083681244492992">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ"</string>
<string name="interruption_level_priority" msgid="6426766465363855505">"କେବଳ ପ୍ରାଥମିକତା"</string>
<string name="interruption_level_alarms" msgid="5226306993448328896">"କେବଳ ଆଲାର୍ମ"</string>
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"ସମ୍ପୂର୍ଣ୍ଣ\nନୀରବ"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"କେବଳ\nପ୍ରାଥମିକତା"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"କେବଳ\nଆଲାର୍ମ"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ଚାର୍ଜ କରାଯାଉଛି (ପୂର୍ଣ୍ଣ ହେବାକୁ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ରହିଛି)"</string>
- <!-- no translation found for keyguard_indication_charging_time_fast (9018981952053914986) -->
+ <!-- no translation found for keyguard_indication_charging_time (2056340799276374421) -->
<skip />
- <!-- no translation found for keyguard_indication_charging_time_slowly (955252797961724952) -->
+ <!-- no translation found for keyguard_indication_charging_time_fast (7767562163577492332) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_charging_time_slowly (3769655133567307069) -->
<skip />
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ୟୁଜର୍ ବଦଳାନ୍ତୁ"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ୟୁଜର୍ ବଦଳାନ୍ତୁ, ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
- <!-- no translation found for accessibility_multi_user_switch_inactive (1424081831468083402) -->
- <skip />
+ <string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ପ୍ରୋଫାଇଲ୍ ଦେଖାନ୍ତୁ"</string>
<string name="user_add_user" msgid="5110251524486079492">"ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string>
<string name="user_new_user_name" msgid="426540612051178753">"ନୂତନ ୟୁଜର୍"</string>
@@ -505,23 +489,16 @@
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ହଁ, ଜାରି ରଖନ୍ତୁ"</string>
<string name="guest_notification_title" msgid="1585278533840603063">"ଅତିଥି ୟୁଜର୍"</string>
- <!-- no translation found for guest_notification_text (335747957734796689) -->
- <skip />
+ <string name="guest_notification_text" msgid="335747957734796689">"ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ କରିବା ପାଇଁ, ଅତିଥି ୟୁଜରଙ୍କୁ ବାହାର କରନ୍ତୁ"</string>
<string name="guest_notification_remove_action" msgid="8820670703892101990">"ଅତିଥିଙ୍କୁ ବାହାର କରନ୍ତୁ"</string>
- <!-- no translation found for user_logout_notification_title (1453960926437240727) -->
- <skip />
- <!-- no translation found for user_logout_notification_text (3350262809611876284) -->
- <skip />
- <!-- no translation found for user_logout_notification_action (1195428991423425062) -->
- <skip />
+ <string name="user_logout_notification_title" msgid="1453960926437240727">"ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"</string>
+ <string name="user_logout_notification_text" msgid="3350262809611876284">"ବର୍ତ୍ତମାନର ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"</string>
+ <string name="user_logout_notification_action" msgid="1195428991423425062">"ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ନୂତନ ୟୁଜର୍ ଯୋଡ଼ିବେ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ଜଣେ ନୂଆ ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ିବାବେଳେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ସ୍ଥାନ ସେଟ୍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ୟୁଜର୍ଙ୍କ ପାଇଁ ଯେକୌଣସି ୟୁଜର୍ ଆପ୍ଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"</string>
- <!-- no translation found for user_remove_user_title (4681256956076895559) -->
- <skip />
- <!-- no translation found for user_remove_user_message (1453218013959498039) -->
- <skip />
- <!-- no translation found for user_remove_user_remove (7479275741742178297) -->
- <skip />
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ୟୁଜରଙ୍କୁ ବାହାର କରିବେ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ଏହି ୟୁଜରଙ୍କ ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହେବ।"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"ବାହାର କରନ୍ତୁ"</string>
<!-- no translation found for battery_saver_notification_title (8614079794522291840) -->
<skip />
<string name="battery_saver_notification_text" msgid="820318788126672692">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string>
@@ -534,8 +511,7 @@
<string name="empty_shade_text" msgid="708135716272867002">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ପ୍ରୋଫାଇଲ୍ ନିରୀକ୍ଷଣ କରାଯାଇପାରେ।"</string>
<string name="vpn_footer" msgid="2388611096129106812">"ନେଟ୍ୱର୍କ ନୀରିକ୍ଷଣ କରାଯାଇପାରେ"</string>
- <!-- no translation found for branded_vpn_footer (2168111859226496230) -->
- <skip />
+ <string name="branded_vpn_footer" msgid="2168111859226496230">"ନେଟ୍ୱର୍କକୁ ନିରୀକ୍ଷଣ କରାଯାଇପାରେ"</string>
<!-- no translation found for quick_settings_disclosure_management_monitoring (6645176135063957394) -->
<skip />
<!-- no translation found for quick_settings_disclosure_named_management_monitoring (370622174777570853) -->
@@ -600,18 +576,13 @@
<skip />
<!-- no translation found for monitoring_description_personal_profile_named_vpn (3133980926929069283) -->
<skip />
- <!-- no translation found for monitoring_description_do_header_generic (96588491028288691) -->
- <skip />
- <!-- no translation found for monitoring_description_do_header_with_name (5511133708978206460) -->
- <skip />
+ <string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ଆପଣଙ୍କ ଡିଭାଇସ୍ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି।"</string>
+ <string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"ଆପଣଙ୍କ ଡିଭାଇସ୍ ପରିଚାଳନା କରିବାକୁ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> ବ୍ୟବହାର କରନ୍ତି।"</string>
<!-- no translation found for monitoring_description_do_body (3639594537660975895) -->
<skip />
- <!-- no translation found for monitoring_description_do_learn_more_separator (3785251953067436862) -->
- <skip />
- <!-- no translation found for monitoring_description_do_learn_more (1849514470437907421) -->
- <skip />
- <!-- no translation found for monitoring_description_do_body_vpn (8255218762488901796) -->
- <skip />
+ <string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
+ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
+ <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"ଆପଣ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ ଅଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟ୍ୱର୍କର ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
<!-- no translation found for monitoring_description_vpn_settings_separator (1933186756733474388) -->
<skip />
<!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) -->
@@ -628,10 +599,8 @@
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
<!-- no translation found for monitoring_description_app (1828472472674709532) -->
<skip />
- <!-- no translation found for monitoring_description_app_personal (484599052118316268) -->
- <skip />
- <!-- no translation found for branded_monitoring_description_app_personal (2669518213949202599) -->
- <skip />
+ <string name="monitoring_description_app_personal" msgid="484599052118316268">"ଆପଣ <xliff:g id="APPLICATION">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟ୍ୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
+ <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"ଆପଣ <xliff:g id="APPLICATION">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ ଅଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟ୍ୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
<!-- no translation found for monitoring_description_app_work (4612997849787922906) -->
<skip />
<!-- no translation found for monitoring_description_app_personal_work (5664165460056859391) -->
@@ -674,18 +643,14 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ଲୁଚାନ୍ତୁ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ଆଗକୁ ଆପଣ ଯେତେବେଳେ ଏହି ସେଟିଙ୍ଗକୁ ଚାଲୁ କରିବେ, ଏହା ପୁଣି ଦେଖାଦେବ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ଲୁଚାନ୍ତୁ"</string>
- <!-- no translation found for managed_profile_foreground_toast (5421487114739245972) -->
- <skip />
- <!-- no translation found for stream_voice_call (4410002696470423714) -->
- <skip />
- <!-- no translation found for stream_system (7493299064422163147) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ଆପଣ ନିଜ ୱର୍କ ପ୍ରୋଫାଇଲ୍ ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
+ <string name="stream_voice_call" msgid="4410002696470423714">"କଲ୍ କରନ୍ତୁ"</string>
+ <string name="stream_system" msgid="7493299064422163147">"ସିଷ୍ଟମ୍"</string>
<!-- no translation found for stream_ring (8213049469184048338) -->
<skip />
<!-- no translation found for stream_music (9086982948697544342) -->
<skip />
- <!-- no translation found for stream_alarm (5209444229227197703) -->
- <skip />
+ <string name="stream_alarm" msgid="5209444229227197703">"ଆଲାର୍ମ"</string>
<!-- no translation found for stream_notification (2563720670905665031) -->
<skip />
<!-- no translation found for stream_bluetooth_sco (2055645746402746292) -->
@@ -734,14 +699,12 @@
<skip />
<!-- no translation found for output_service_bt_wifi (4486837869988770896) -->
<skip />
- <!-- no translation found for system_ui_tuner (708224127392452018) -->
- <skip />
+ <string name="system_ui_tuner" msgid="708224127392452018">"ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍"</string>
<string name="show_battery_percentage" msgid="5444136600512968798">"ଏମ୍ବେଡ୍ ହୋଇଥିବା ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string>
<string name="show_battery_percentage_summary" msgid="3215025775576786037">"ଚାର୍ଜ ହେଉନଥିବାବେଳେ ଷ୍ଟାଟସ୍ ବାର୍ ଆଇକନ୍ ଭିତରେ ବ୍ୟାଟେରୀ ସ୍ତର ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string>
<string name="quick_settings" msgid="10042998191725428">"ଦ୍ରୁତ ସେଟିଙ୍ଗ"</string>
<string name="status_bar" msgid="4877645476959324760">"ଷ୍ଟାଟସ୍ ବାର୍"</string>
- <!-- no translation found for overview (4018602013895926956) -->
- <skip />
+ <string name="overview" msgid="4018602013895926956">"ଅବଲୋକନ"</string>
<!-- no translation found for demo_mode (2532177350215638026) -->
<skip />
<string name="enable_demo_mode" msgid="4844205668718636518">"ଡେମୋ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
@@ -758,40 +721,23 @@
<string name="alarm_template_far" msgid="4242179982586714810">"<xliff:g id="WHEN">%1$s</xliff:g> ବେଳେ"</string>
<string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ଦ୍ରୁତ ସେଟିଙ୍ଗ, <xliff:g id="TITLE">%s</xliff:g>।"</string>
<string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ହଟସ୍ପଟ୍"</string>
- <!-- no translation found for accessibility_managed_profile (6613641363112584120) -->
- <skip />
- <!-- no translation found for tuner_warning_title (7094689930793031682) -->
- <skip />
- <!-- no translation found for tuner_warning (8730648121973575701) -->
- <skip />
- <!-- no translation found for tuner_persistent_warning (8597333795565621795) -->
- <skip />
- <!-- no translation found for got_it (2239653834387972602) -->
- <skip />
- <!-- no translation found for tuner_toast (603429811084428439) -->
- <skip />
- <!-- no translation found for remove_from_settings (8389591916603406378) -->
- <skip />
- <!-- no translation found for remove_from_settings_prompt (6069085993355887748) -->
- <skip />
- <!-- no translation found for activity_not_found (348423244327799974) -->
- <skip />
- <!-- no translation found for clock_seconds (7689554147579179507) -->
- <skip />
- <!-- no translation found for clock_seconds_desc (6282693067130470675) -->
- <skip />
- <!-- no translation found for qs_rearrange (8060918697551068765) -->
- <skip />
- <!-- no translation found for show_brightness (6613930842805942519) -->
- <skip />
- <!-- no translation found for experimental (6198182315536726162) -->
- <skip />
- <!-- no translation found for enable_bluetooth_title (5027037706500635269) -->
- <skip />
- <!-- no translation found for enable_bluetooth_message (9106595990708985385) -->
- <skip />
- <!-- no translation found for enable_bluetooth_confirmation_ok (6258074250948309715) -->
- <skip />
+ <string name="accessibility_managed_profile" msgid="6613641363112584120">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
+ <string name="tuner_warning_title" msgid="7094689930793031682">"କେତେକଙ୍କ ପାଇଁ ମଜାଦାର, କିନ୍ତୁ ସମସ୍ତଙ୍କ ପାଇଁ ନୁହେଁ"</string>
+ <string name="tuner_warning" msgid="8730648121973575701">"Android ୟୁଜର୍ ଇଣ୍ଟରଫେସ୍ ବଦଳାଇବାକୁ ତଥା ନିଜ ପସନ୍ଦ ଅନୁଯାୟୀ କରିବାକୁ ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍ ଆପଣଙ୍କୁ ଅତିରିକ୍ତ ଉପାୟ ପ୍ରଦାନ କରେ। ଏହି ପରୀକ୍ଷାମୂଳକ ସୁବିଧାମାନ ବଦଳିପାରେ, ଭାଙ୍ଗିପାରେ କିମ୍ବା ଭବିଷ୍ୟତର ରିଲିଜ୍ଗୁଡ଼ିକରେ ନଦେଖାଯାଇପାରେ। ସତର୍କତାର ସହ ଆଗକୁ ବଢ଼ନ୍ତୁ।"</string>
+ <string name="tuner_persistent_warning" msgid="8597333795565621795">"ଏହି ପରୀକ୍ଷାମୂଳକ ସୁବିଧାମାନ ବଦଳିପାରେ, ଭାଙ୍ଗିପାରେ କିମ୍ବା ଭବିଷ୍ୟତର ରିଲିଜ୍ଗୁଡ଼ିକରେ ନଦେଖାଯାଇପାରେ। ସତର୍କତାର ସହ ଆଗକୁ ବଢ଼ନ୍ତୁ।"</string>
+ <string name="got_it" msgid="2239653834387972602">"ବୁଝିଗଲି"</string>
+ <string name="tuner_toast" msgid="603429811084428439">"ଅଭିନନ୍ଦନ! ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍କୁ ସେଟିଙ୍ଗରେ ଯୋଡ଼ାଯାଇଛି"</string>
+ <string name="remove_from_settings" msgid="8389591916603406378">"ସେଟିଙ୍ଗରୁ ବାହାର କରିଦିଅନ୍ତୁ"</string>
+ <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ସେଟିଙ୍ଗରୁ ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍କୁ ବାହାର କରି ତାହାର ସମସ୍ତ ସୁବିଧା ବ୍ୟବହାର କରିବା ବନ୍ଦ କରିବେ?"</string>
+ <string name="activity_not_found" msgid="348423244327799974">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଆପ୍ଲିକେଶନ୍ ଇନଷ୍ଟଲ୍ କରାଯାଇନାହିଁ"</string>
+ <string name="clock_seconds" msgid="7689554147579179507">"ଘଣ୍ଟାର ସେକେଣ୍ଡ ଦେଖାନ୍ତୁ"</string>
+ <string name="clock_seconds_desc" msgid="6282693067130470675">"ଷ୍ଟାଟସ୍ ବାର୍ରେ ଘଣ୍ଟାର ସେକେଣ୍ଡ ଦେଖାନ୍ତୁ। ଏହାଦ୍ୱାରା ବ୍ୟାଟେରୀ ଲାଇଫ୍ ପ୍ରଭାବିତ ହୋଇପାରେ।"</string>
+ <string name="qs_rearrange" msgid="8060918697551068765">"ଦ୍ରୁତ ସେଟିଙ୍ଗକୁ ପୁଣି ସଜାନ୍ତୁ"</string>
+ <string name="show_brightness" msgid="6613930842805942519">"ଦ୍ରୁତ ସେଟିଙ୍ଗରେ ବ୍ରାଇଟନେସ୍ ଦେଖାନ୍ତୁ"</string>
+ <string name="experimental" msgid="6198182315536726162">"ପରୀକ୍ଷାମୂଳକ"</string>
+ <string name="enable_bluetooth_title" msgid="5027037706500635269">"ବ୍ଲୁ-ଟୁଥ୍ ଅନ୍ କରିବେ?"</string>
+ <string name="enable_bluetooth_message" msgid="9106595990708985385">"ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ କୀ’ବୋର୍ଡ ସଂଯୋଗ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ପ୍ରଥମେ ବ୍ଲୁ-ଟୁଥ୍ ଅନ୍ କରିବାକୁ ହେବ।"</string>
+ <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ଅନ୍ କରନ୍ତୁ"</string>
<!-- no translation found for show_silently (6841966539811264192) -->
<skip />
<!-- no translation found for block (2734508760962682611) -->
@@ -830,12 +776,10 @@
<skip />
<!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
<skip />
- <!-- no translation found for notification_more_settings (816306283396553571) -->
- <skip />
+ <string name="notification_more_settings" msgid="816306283396553571">"ଅଧିକ ସେଟିଙ୍ଗ"</string>
<!-- no translation found for notification_app_settings (420348114670768449) -->
<skip />
- <!-- no translation found for notification_done (5279426047273930175) -->
- <skip />
+ <string name="notification_done" msgid="5279426047273930175">"ହୋଇଗଲା"</string>
<!-- no translation found for inline_undo (558916737624706010) -->
<skip />
<!-- no translation found for notification_menu_accessibility (2046162834248888553) -->
@@ -852,12 +796,9 @@
<!-- no translation found for snoozeMinuteOptions (4127251700591510196) -->
<!-- no translation found for battery_panel_title (7944156115535366613) -->
<skip />
- <!-- no translation found for battery_detail_charging_summary (1279095653533044008) -->
- <skip />
- <!-- no translation found for battery_detail_switch_title (6285872470260795421) -->
- <skip />
- <!-- no translation found for battery_detail_switch_summary (9049111149407626804) -->
- <skip />
+ <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ଚାର୍ଜ କରାଯିବାବେଳେ ବ୍ୟାଟେରୀ ସେଭର୍ ଉପଲବ୍ଧ ନଥାଏ"</string>
+ <string name="battery_detail_switch_title" msgid="6285872470260795421">"ବ୍ୟାଟେରୀ ସେଭର୍"</string>
+ <string name="battery_detail_switch_summary" msgid="9049111149407626804">"କାର୍ଯ୍ୟଦକ୍ଷତା ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରେ"</string>
<!-- no translation found for keyboard_key_button_template (6230056639734377300) -->
<skip />
<!-- no translation found for keyboard_key_home (2243500072071305073) -->
@@ -910,14 +851,10 @@
<skip />
<!-- no translation found for keyboard_key_numpad_template (8729216555174634026) -->
<skip />
- <!-- no translation found for keyboard_shortcut_group_system (6472647649616541064) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_home (3054369431319891965) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_recents (3154851905021926744) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_back (2207004531216446378) -->
- <skip />
+ <string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"ସିଷ୍ଟମ୍"</string>
+ <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"ହୋମ୍"</string>
+ <string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"ସମ୍ପ୍ରତି"</string>
+ <string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ଫେରନ୍ତୁ"</string>
<!-- no translation found for keyboard_shortcut_group_system_notifications (8366964080041773224) -->
<skip />
<!-- no translation found for keyboard_shortcut_group_system_shortcuts_helper (4892255911160332762) -->
@@ -934,8 +871,7 @@
<skip />
<!-- no translation found for keyboard_shortcut_group_applications_email (6257036897441939004) -->
<skip />
- <!-- no translation found for keyboard_shortcut_group_applications_sms (638701213803242744) -->
- <skip />
+ <string name="keyboard_shortcut_group_applications_sms" msgid="638701213803242744">"SMS"</string>
<!-- no translation found for keyboard_shortcut_group_applications_music (4775559515850922780) -->
<skip />
<!-- no translation found for keyboard_shortcut_group_applications_youtube (6555453761294723317) -->
@@ -948,24 +884,15 @@
<skip />
<!-- no translation found for volume_dnd_silent (4363882330723050727) -->
<skip />
- <!-- no translation found for volume_up_silent (7141255269783588286) -->
- <skip />
- <!-- no translation found for battery (7498329822413202973) -->
- <skip />
- <!-- no translation found for clock (7416090374234785905) -->
- <skip />
- <!-- no translation found for headset (4534219457597457353) -->
- <skip />
- <!-- no translation found for accessibility_status_bar_headphones (9156307120060559989) -->
- <skip />
- <!-- no translation found for accessibility_status_bar_headset (8666419213072449202) -->
- <skip />
- <!-- no translation found for data_saver (5037565123367048522) -->
- <skip />
- <!-- no translation found for accessibility_data_saver_on (8454111686783887148) -->
- <skip />
- <!-- no translation found for accessibility_data_saver_off (8841582529453005337) -->
- <skip />
+ <string name="volume_up_silent" msgid="7141255269783588286">"ଭଲ୍ୟୁମ୍ ବଢ଼ାଇ \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\"ରୁ ବାହାରି ଯାଆନ୍ତୁ"</string>
+ <string name="battery" msgid="7498329822413202973">"ବ୍ୟାଟେରୀ"</string>
+ <string name="clock" msgid="7416090374234785905">"ଘଣ୍ଟା"</string>
+ <string name="headset" msgid="4534219457597457353">"ହେଡସେଟ୍"</string>
+ <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ହେଡଫୋନ୍ ସଂଯୁକ୍ତ"</string>
+ <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ହେଡସେଟ୍ ସଂଯୁକ୍ତ"</string>
+ <string name="data_saver" msgid="5037565123367048522">"ଡାଟା ସେଭର୍"</string>
+ <string name="accessibility_data_saver_on" msgid="8454111686783887148">"ଡାଟା ସେଭର୍ ଅନ୍ ଅଛି"</string>
+ <string name="accessibility_data_saver_off" msgid="8841582529453005337">"ଡାଟା ସେଭର୍ ଅଫ୍ ଅଛି"</string>
<!-- no translation found for switch_bar_on (1142437840752794229) -->
<skip />
<!-- no translation found for switch_bar_off (8803270596930432874) -->
@@ -1063,8 +990,7 @@
<skip />
<!-- no translation found for accessibility_desc_quick_settings_edit (8073587401747016103) -->
<skip />
- <!-- no translation found for accessibility_desc_notification_icon (8352414185263916335) -->
- <skip />
+ <string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> ବିଜ୍ଞପ୍ତି: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<!-- no translation found for dock_forced_resizable (5914261505436217520) -->
<skip />
<!-- no translation found for dock_non_resizeble_failed_to_dock_text (3871617304250207291) -->
@@ -1073,30 +999,20 @@
<skip />
<!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
<skip />
- <!-- no translation found for accessibility_quick_settings_settings (6132460890024942157) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_expand (2375165227880477530) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_collapse (1792625797142648105) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_alarm_set (1863000242431528676) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_user (1567445362870421770) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_no_internet (31890692343084075) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_open_details (4230931801728005194) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_open_settings (7806613775728380737) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_edit (7839992848995240393) -->
- <skip />
+ <string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
+ <string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ଦ୍ରୁତ ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
+ <string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ଦ୍ରୁତ ସେଟିଙ୍ଗ ବନ୍ଦ କରନ୍ତୁ।"</string>
+ <string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"ଆଲାର୍ମ ସେଟ୍।"</string>
+ <string name="accessibility_quick_settings_user" msgid="1567445362870421770">"<xliff:g id="ID_1">%s</xliff:g> ଭାବରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି"</string>
+ <string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"କୌଣସି ଇଣ୍ଟରନେଟ୍ ନାହିଁ"</string>
+ <string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"ବିବରଣୀ ଖୋଲନ୍ତୁ"</string>
+ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
+ <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ସେଟିଙ୍ଗର କ୍ରମ ସଂଶୋଧନ କରନ୍ତୁ।"</string>
<!-- no translation found for accessibility_quick_settings_page (5032979051755200721) -->
<skip />
<!-- no translation found for tuner_lock_screen (5755818559638850294) -->
<skip />
- <!-- no translation found for pip_phone_expand (5889780005575693909) -->
- <skip />
+ <string name="pip_phone_expand" msgid="5889780005575693909">"ବଢ଼ାନ୍ତୁ"</string>
<!-- no translation found for pip_phone_minimize (1079119422589131792) -->
<skip />
<!-- no translation found for pip_phone_close (8416647892889710330) -->
@@ -1173,8 +1089,7 @@
<skip />
<!-- no translation found for instant_apps_message (8116608994995104836) -->
<skip />
- <!-- no translation found for app_info (6856026610594615344) -->
- <skip />
+ <string name="app_info" msgid="6856026610594615344">"ଆପ୍ ସୂଚନା"</string>
<!-- no translation found for go_to_web (2650669128861626071) -->
<skip />
<!-- no translation found for mobile_data (7094582042819250762) -->
diff --git a/packages/SystemUI/res/values-or/strings_tv.xml b/packages/SystemUI/res/values-or/strings_tv.xml
new file mode 100644
index 0000000..2048def
--- /dev/null
+++ b/packages/SystemUI/res/values-or/strings_tv.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for notification_channel_tv_pip (134047986446577723) -->
+ <skip />
+ <!-- no translation found for pip_notification_unknown_title (6289156118095849438) -->
+ <skip />
+ <!-- no translation found for pip_close (3480680679023423574) -->
+ <skip />
+ <string name="pip_fullscreen" msgid="8604643018538487816">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 29ac90e..c9cb784 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -103,8 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
- <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone do app"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string>
@@ -276,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protetor de tela"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Toque nos ícones e mantenha-os pressionados para ver mais opções"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Somente prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string>
@@ -290,6 +288,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Fone de ouvido"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
+ <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ativando…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automaticamente"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Girar tela automaticamente"</string>
@@ -314,7 +313,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string>
- <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string>
+ <string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ativando…"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
@@ -331,7 +330,7 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Ponto de acesso"</string>
- <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Ativando…"</string>
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="8010579363691405477">"Ativando…"</string>
<plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
<item quantity="one">%d dispositivo</item>
<item quantity="other">%d dispositivos</item>
@@ -345,8 +344,7 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Usados: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Aviso de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil de trabalho"</string>
- <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"As notificações e os apps estão desativados"</string>
+ <string name="quick_settings_work_mode_label" msgid="7608026833638817218">"Perfil de trabalho"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Modo noturno"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ativ. ao pôr do sol"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até o nascer do sol"</string>
@@ -399,9 +397,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Silêncio\ntotal"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Somente\nprioridade"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Somente\nalarmes"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Carregando (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> até concluir)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Carregando rapidamente (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> para conclusão)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Carregando lentamente (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> para conclusão)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregando (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> até a conclusão)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga rápida (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> até a conclusão)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga lenta (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> até a conclusão)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Trocar usuário"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Alternar usuário. Usuário atual <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Usuário atual <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -539,6 +537,9 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para configurar para vibrar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para silenciar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volume %s"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Chamadas e notificações farão o dispositivo vibrar"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Chamadas e notificações ficarão silenciadas"</string>
+ <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Chamadas e notificações emitirão um toque"</string>
<string name="output_title" msgid="5355078100792942802">"Saída de mídia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de chamada telefônica"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo foi encontrado"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 8cb68c0..c89d818 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -946,13 +946,13 @@
<!-- Interruption level: Alarms only. Optimized for narrow two-line display. [CHAR LIMIT=40] -->
<string name="interruption_level_alarms_twoline">Alarms\nonly</string>
- <!-- Indication on the keyguard that is shown when the device is charging. [CHAR LIMIT=40]-->
+ <!-- Indication on the keyguard that is shown when the device is charging. [CHAR LIMIT=50]-->
<string name="keyguard_indication_charging_time"><xliff:g id="percentage">%2$s</xliff:g> • Charging (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string>
- <!-- Indication on the keyguard that is shown when the device is charging rapidly. Should match keyguard_plugged_in_charging_fast [CHAR LIMIT=40]-->
+ <!-- Indication on the keyguard that is shown when the device is charging rapidly. Should match keyguard_plugged_in_charging_fast [CHAR LIMIT=50]-->
<string name="keyguard_indication_charging_time_fast"><xliff:g id="percentage">%2$s</xliff:g> • Charging rapidly (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string>
- <!-- Indication on the keyguard that is shown when the device is charging slowly. Should match keyguard_plugged_in_charging_slowly [CHAR LIMIT=40]-->
+ <!-- Indication on the keyguard that is shown when the device is charging slowly. Should match keyguard_plugged_in_charging_slowly [CHAR LIMIT=50]-->
<string name="keyguard_indication_charging_time_slowly"><xliff:g id="percentage">%2$s</xliff:g> • Charging slowly (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string>
<!-- Related to user switcher --><skip/>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 7572512..6b99206 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -72,6 +72,7 @@
private int mIconSize;
private Consumer<Boolean> mListener;
private boolean mHasHeader;
+ private boolean mHideContent;
public KeyguardSliceView(Context context) {
this(context, null, 0);
@@ -192,12 +193,16 @@
}
}
- final int visibility = mHasHeader || subItemsCount > 0 ? VISIBLE : GONE;
+ updateVisibility();
+ mListener.accept(mHasHeader);
+ }
+
+ private void updateVisibility() {
+ final boolean hasContent = mHasHeader || mRow.getChildCount() > 0;
+ final int visibility = hasContent && !mHideContent ? VISIBLE : GONE;
if (visibility != getVisibility()) {
setVisibility(visibility);
}
-
- mListener.accept(mHasHeader);
}
/**
@@ -321,6 +326,11 @@
updateTextColors();
}
+ public void setHideContent(boolean hideContent) {
+ mHideContent = hideContent;
+ updateVisibility();
+ }
+
/**
* Representation of an item that appears under the clock on main keyguard message.
*/
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 3b5f34c..a3ffa40 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -362,7 +362,7 @@
public void setPulsing(boolean pulsing) {
mPulsing = pulsing;
- mKeyguardSlice.setVisibility(pulsing ? INVISIBLE : VISIBLE);
+ mKeyguardSlice.setHideContent(pulsing);
onSliceContentChanged(mKeyguardSlice.hasHeader());
updateDozeVisibleViews();
}
diff --git a/packages/SystemUI/src/com/android/systemui/ForegroundServiceControllerImpl.java b/packages/SystemUI/src/com/android/systemui/ForegroundServiceControllerImpl.java
index fc2b5b4..1fa925e 100644
--- a/packages/SystemUI/src/com/android/systemui/ForegroundServiceControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/ForegroundServiceControllerImpl.java
@@ -23,6 +23,7 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.messages.nano.SystemMessageProto;
@@ -174,9 +175,9 @@
@Override
public boolean isSystemAlertNotification(StatusBarNotification sbn) {
- // TODO: tag system alert notifications so they can be suppressed if app's notification
- // is tagged
- return false;
+ return sbn.getPackageName().equals("android")
+ && sbn.getTag() != null
+ && sbn.getTag().contains("AlertWindowNotification");
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index 127361a..d9359a4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -21,6 +21,7 @@
import android.annotation.TargetApi;
import android.app.ActivityManager;
+import android.content.ComponentName;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -65,6 +66,8 @@
private static final long SHOW_HIDE_DURATION_MS = 300;
// Don't show the onboarding until the user has launched this number of apps.
private static final int SHOW_ON_APP_LAUNCH = 2;
+ // After explicitly dismissing, show again after launching this number of apps.
+ private static final int SHOW_ON_APP_LAUNCH_AFTER_DISMISS = 5;
private final Context mContext;
private final WindowManager mWindowManager;
@@ -84,6 +87,9 @@
private boolean mTaskListenerRegistered;
private boolean mLayoutAttachedToWindow;
private boolean mBackgroundIsLight;
+ private int mLastTaskId;
+ private boolean mHasDismissed;
+ private int mNumAppsLaunchedSinceDismiss;
private final SysUiTaskStackChangeListener mTaskListener = new SysUiTaskStackChangeListener() {
@Override
@@ -94,14 +100,26 @@
hide(true);
return;
}
+ if (info.id == mLastTaskId) {
+ // We only count launches that go to a new task.
+ return;
+ }
int activityType = info.configuration.windowConfiguration.getActivityType();
- int numAppsLaunched = Prefs.getInt(mContext, Prefs.Key.NUM_APPS_LAUNCHED, 0);
if (activityType == ACTIVITY_TYPE_STANDARD) {
+ mLastTaskId = info.id;
+ int numAppsLaunched = mHasDismissed ? mNumAppsLaunchedSinceDismiss
+ : Prefs.getInt(mContext, Prefs.Key.NUM_APPS_LAUNCHED, 0);
+ int showOnAppLaunch = mHasDismissed ? SHOW_ON_APP_LAUNCH_AFTER_DISMISS
+ : SHOW_ON_APP_LAUNCH;
numAppsLaunched++;
- if (numAppsLaunched >= SHOW_ON_APP_LAUNCH) {
+ if (numAppsLaunched >= showOnAppLaunch) {
show();
} else {
- Prefs.putInt(mContext, Prefs.Key.NUM_APPS_LAUNCHED, numAppsLaunched);
+ if (mHasDismissed) {
+ mNumAppsLaunchedSinceDismiss = numAppsLaunched;
+ } else {
+ Prefs.putInt(mContext, Prefs.Key.NUM_APPS_LAUNCHED, numAppsLaunched);
+ }
}
} else {
hide(false);
@@ -115,6 +133,7 @@
public void onViewAttachedToWindow(View view) {
if (view == mLayout) {
mLayoutAttachedToWindow = true;
+ mHasDismissed = false;
}
}
@@ -149,7 +168,11 @@
mLayout.addOnAttachStateChangeListener(mOnAttachStateChangeListener);
mLayout.setBackground(mBackgroundDrawable);
- mDismissView.setOnClickListener(v -> hide(true));
+ mDismissView.setOnClickListener(v -> {
+ hide(true);
+ mHasDismissed = true;
+ mNumAppsLaunchedSinceDismiss = 0;
+ });
if (RESET_PREFS_FOR_DEBUG) {
Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_RECENTS_ONBOARDING, false);
@@ -180,6 +203,8 @@
ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTaskListener);
mTaskListenerRegistered = false;
}
+ mHasDismissed = false;
+ mNumAppsLaunchedSinceDismiss = 0;
hide(false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
index 8830352..475a609 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
@@ -107,6 +107,11 @@
}
@Override
+ public void setBackground(Drawable background) {
+ Log.wtfStack(TAG, "ScrimView should never have a background.");
+ }
+
+ @Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int densityDpi = newConfig.densityDpi;
@@ -321,18 +326,6 @@
return mViewAlpha;
}
- public void animateViewAlpha(float alpha, long durationOut, Interpolator interpolator) {
- if (mAlphaAnimator != null) {
- mAlphaAnimator.cancel();
- }
- mAlphaAnimator = ValueAnimator.ofFloat(getViewAlpha(), alpha);
- mAlphaAnimator.addUpdateListener(mAlphaUpdateListener);
- mAlphaAnimator.addListener(mClearAnimatorListener);
- mAlphaAnimator.setInterpolator(interpolator);
- mAlphaAnimator.setDuration(durationOut);
- mAlphaAnimator.start();
- }
-
public void setExcludedArea(Rect area) {
if (area == null) {
mHasExcludedArea = false;
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 da042d2..9fa06f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -19,6 +19,8 @@
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.windowStateToString;
+import static com.android.internal.view.RotationPolicy.NATURAL_ROTATION;
+
import static com.android.systemui.shared.system.NavigationBarCompat.InteractionType;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_WINDOW_STATE;
@@ -113,7 +115,7 @@
private static final String EXTRA_DISABLE_STATE = "disabled_state";
private final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100;
- private final static int ROTATE_BUTTON_LOOP_DURATION_MS = 2000;
+ private final static int NAVBAR_HIDDEN_PENDING_ICON_TIMEOUT_MS = 20000;
private static final int NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION = 3;
@@ -152,11 +154,14 @@
public boolean mHomeBlockedThisTouch;
private int mLastRotationSuggestion;
+ private boolean mPendingRotationSuggestion;
private boolean mHoveringRotationSuggestion;
private RotationLockController mRotationLockController;
private TaskStackListenerImpl mTaskStackListener;
private final Runnable mRemoveRotationProposal = () -> setRotateSuggestionButtonState(false);
+ private final Runnable mCancelPendingRotationProposal =
+ () -> mPendingRotationSuggestion = false;
private Animator mRotateHideAnimator;
private ViewRippler mViewRippler = new ViewRippler();
@@ -219,6 +224,13 @@
mRotationLockController = Dependency.get(RotationLockController.class);
+ // Reset user rotation pref to match that of the WindowManager if starting in locked mode
+ // This will automatically happen when switching from auto-rotate to locked mode
+ if (mRotationLockController.isRotationLocked()) {
+ final int winRotation = mWindowManager.getDefaultDisplay().getRotation();
+ mRotationLockController.setRotationLockedAtAngle(true, winRotation);
+ }
+
// Register the task stack listener
mTaskStackListener = new TaskStackListenerImpl();
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
@@ -365,6 +377,11 @@
&& mNavigationBarWindowState != state) {
mNavigationBarWindowState = state;
if (DEBUG_WINDOW_STATE) Log.d(TAG, "Navigation bar " + windowStateToString(state));
+
+ // If the navbar is visible, show the rotate button if there's a pending suggestion
+ if (state == WINDOW_STATE_SHOWING && mPendingRotationSuggestion) {
+ showAndLogRotationSuggestion();
+ }
}
}
@@ -373,38 +390,51 @@
// This method will be called on rotation suggestion changes even if the proposed rotation
// is not valid for the top app. Use invalid rotation choices as a signal to remove the
// rotate button if shown.
-
if (!isValid) {
setRotateSuggestionButtonState(false);
return;
}
+ // If window rotation matches suggested rotation, remove any current suggestions
final int winRotation = mWindowManager.getDefaultDisplay().getRotation();
if (rotation == winRotation) {
- // Use this as a signal to remove any current suggestions
- getView().getHandler().removeCallbacks(mRemoveRotationProposal);
+ getView().removeCallbacks(mRemoveRotationProposal);
setRotateSuggestionButtonState(false);
- } else {
- mLastRotationSuggestion = rotation; // Remember rotation for click
-
- // Update the icon style to change animation parameters
- if (mNavigationBarView != null) {
- final boolean rotationCCW = isRotationAnimationCCW(winRotation, rotation);
- int style;
- if (winRotation == Surface.ROTATION_0 || winRotation == Surface.ROTATION_180) {
- style = rotationCCW ? R.style.RotateButtonCCWStart90 :
- R.style.RotateButtonCWStart90;
- } else { // 90 or 270
- style = rotationCCW ? R.style.RotateButtonCCWStart0 :
- R.style.RotateButtonCWStart0;
- }
- mNavigationBarView.updateRotateSuggestionButtonStyle(style, true);
- }
-
- setRotateSuggestionButtonState(true);
- rescheduleRotationTimeout(false);
- mMetricsLogger.visible(MetricsEvent.ROTATION_SUGGESTION_SHOWN);
+ return;
}
+
+ // Prepare to show the navbar icon by updating the icon style to change anim params
+ mLastRotationSuggestion = rotation; // Remember rotation for click
+ if (mNavigationBarView != null) {
+ final boolean rotationCCW = isRotationAnimationCCW(winRotation, rotation);
+ int style;
+ if (winRotation == Surface.ROTATION_0 || winRotation == Surface.ROTATION_180) {
+ style = rotationCCW ? R.style.RotateButtonCCWStart90 :
+ R.style.RotateButtonCWStart90;
+ } else { // 90 or 270
+ style = rotationCCW ? R.style.RotateButtonCCWStart0 :
+ R.style.RotateButtonCWStart0;
+ }
+ mNavigationBarView.updateRotateSuggestionButtonStyle(style, true);
+ }
+
+ if (mNavigationBarWindowState != WINDOW_STATE_SHOWING) {
+ // If the navbar isn't shown, flag the rotate icon to be shown should the navbar become
+ // visible given some time limit.
+ mPendingRotationSuggestion = true;
+ getView().removeCallbacks(mCancelPendingRotationProposal);
+ getView().postDelayed(mCancelPendingRotationProposal,
+ NAVBAR_HIDDEN_PENDING_ICON_TIMEOUT_MS);
+
+ } else { // The navbar is visible so show the icon right away
+ showAndLogRotationSuggestion();
+ }
+ }
+
+ private void showAndLogRotationSuggestion() {
+ setRotateSuggestionButtonState(true);
+ rescheduleRotationTimeout(false);
+ mMetricsLogger.visible(MetricsEvent.ROTATION_SUGGESTION_SHOWN);
}
private boolean isRotationAnimationCCW(int from, int to) {
@@ -453,6 +483,11 @@
animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0);
}
+ // Clear any pending suggestion flag as it has either been nullified or is being shown
+ mPendingRotationSuggestion = false;
+ getView().removeCallbacks(mCancelPendingRotationProposal);
+
+ // Handle the visibility change and animation
if (visible) { // Appear and change (cannot force)
// Stop and clear any currently running hide animations
if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) {
@@ -516,9 +551,8 @@
if (!mNavigationBarView.isRotateButtonVisible()) return;
}
- Handler h = getView().getHandler();
- h.removeCallbacks(mRemoveRotationProposal); // Stop any pending removal
- h.postDelayed(mRemoveRotationProposal,
+ getView().removeCallbacks(mRemoveRotationProposal); // Stop any pending removal
+ getView().postDelayed(mRemoveRotationProposal,
computeRotationProposalTimeout()); // Schedule timeout
}
@@ -640,7 +674,7 @@
}
private void notifyNavigationBarScreenOn() {
- mNavigationBarView.notifyScreenOn();
+ mNavigationBarView.updateNavButtonIcons();
}
private void prepareNavigationBarView() {
@@ -788,7 +822,7 @@
if ((time - mLastLockToAppLongPress) < LOCK_TO_APP_GESTURE_TOLERENCE) {
activityManager.stopSystemLockTaskMode();
// When exiting refresh disabled flags.
- mNavigationBarView.setDisabledFlags(mDisabledFlags1, true);
+ mNavigationBarView.updateNavButtonIcons();
return true;
} else if (v.getId() == btnId1) {
ButtonDispatcher button = btnId2 == R.id.recent_apps
@@ -810,7 +844,7 @@
// should stop lock task.
activityManager.stopSystemLockTaskMode();
// When exiting refresh disabled flags.
- mNavigationBarView.setDisabledFlags(mDisabledFlags1, true);
+ mNavigationBarView.updateNavButtonIcons();
return true;
} else if (v.getId() == btnId2) {
return btnId2 == R.id.recent_apps
@@ -974,9 +1008,9 @@
}
private boolean shouldOverrideUserLockPrefs(final int rotation) {
- // Only override user prefs when returning to portrait.
+ // Only override user prefs when returning to the natural rotation (normally portrait).
// Don't let apps that force landscape or 180 alter user lock.
- return rotation == Surface.ROTATION_0;
+ return rotation == NATURAL_ROTATION;
}
};
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 74fbed1..3b080cf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -244,7 +244,7 @@
mConfiguration = new Configuration();
mConfiguration.updateFrom(context.getResources().getConfiguration());
- updateIcons(context, Configuration.EMPTY, mConfiguration);
+ reloadNavIcons();
mBarTransitions = new NavigationBarTransitions(this);
@@ -291,7 +291,7 @@
public void onConnectionChanged(boolean isConnected) {
updateSlippery();
- setDisabledFlags(mDisabledFlags, true);
+ updateNavButtonIcons();
setUpSwipeUpOnboarding(isConnected);
}
@@ -403,6 +403,10 @@
R.drawable.ic_sysbar_home_carmode, R.drawable.ic_sysbar_home_carmode);
}
+ private void reloadNavIcons() {
+ updateIcons(mContext, Configuration.EMPTY, mConfiguration);
+ }
+
private void updateIcons(Context ctx, Configuration oldConfig, Configuration newConfig) {
if (oldConfig.orientation != newConfig.orientation
|| oldConfig.densityDpi != newConfig.densityDpi) {
@@ -482,20 +486,11 @@
@Override
public void setLayoutDirection(int layoutDirection) {
- // Reload all the icons
- updateIcons(getContext(), Configuration.EMPTY, mConfiguration);
+ reloadNavIcons();
super.setLayoutDirection(layoutDirection);
}
- public void notifyScreenOn() {
- setDisabledFlags(mDisabledFlags, true);
- }
-
- public void setNavigationIconHints(int hints) {
- setNavigationIconHints(hints, false);
- }
-
private KeyButtonDrawable getBackIconWithAlt(boolean carMode, boolean landscape) {
return landscape
? carMode ? mBackAltLandCarModeIcon : mBackAltLandIcon
@@ -508,8 +503,8 @@
: carMode ? mBackCarModeIcon : mBackIcon;
}
- public void setNavigationIconHints(int hints, boolean force) {
- if (!force && hints == mNavigationIconHints) return;
+ public void setNavigationIconHints(int hints) {
+ if (hints == mNavigationIconHints) return;
final boolean backAlt = (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
if ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0 && !backAlt) {
mTransitionListener.onBackAltCleared();
@@ -519,16 +514,32 @@
"Navigation icon hints = " + hints,
500).show();
}
-
mNavigationIconHints = hints;
+ updateNavButtonIcons();
+ }
+ public void setDisabledFlags(int disabledFlags) {
+ if (mDisabledFlags == disabledFlags) return;
+
+ final boolean overviewEnabledBefore = isOverviewEnabled();
+ mDisabledFlags = disabledFlags;
+
+ // Update icons if overview was just enabled to ensure the correct icons are present
+ if (!overviewEnabledBefore && isOverviewEnabled()) {
+ reloadNavIcons();
+ }
+
+ updateNavButtonIcons();
+ }
+
+ public void updateNavButtonIcons() {
// We have to replace or restore the back and home button icons when exiting or entering
// carmode, respectively. Recents are not available in CarMode in nav bar so change
// to recent icon is not required.
- KeyButtonDrawable backIcon = (backAlt)
- ? getBackIconWithAlt(mUseCarModeUi, mVertical)
- : getBackIcon(mUseCarModeUi, mVertical);
-
+ KeyButtonDrawable backIcon
+ = ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0)
+ ? getBackIconWithAlt(mUseCarModeUi, mVertical)
+ : getBackIcon(mUseCarModeUi, mVertical);
getBackButton().setImageDrawable(backIcon);
updateRecentsIcon();
@@ -542,8 +553,8 @@
// Update IME button visibility, a11y and rotate button always overrides the appearance
final boolean showImeButton =
!mShowAccessibilityButton &&
- !mShowRotateButton &&
- ((hints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0);
+ !mShowRotateButton &&
+ ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0);
getImeSwitchButton().setVisibility(showImeButton ? View.VISIBLE : View.INVISIBLE);
getImeSwitchButton().setImageDrawable(mImeIcon);
@@ -558,26 +569,14 @@
setAccessibilityButtonState(mShowAccessibilityButton, mLongClickableAccessibilityButton);
getAccessibilityButton().setImageDrawable(mAccessibilityIcon);
- setDisabledFlags(mDisabledFlags, true);
-
mBarTransitions.reapplyDarkIntensity();
- }
- public void setDisabledFlags(int disabledFlags) {
- setDisabledFlags(disabledFlags, false);
- }
-
- public void setDisabledFlags(int disabledFlags, boolean force) {
- if (!force && mDisabledFlags == disabledFlags) return;
-
- mDisabledFlags = disabledFlags;
-
- boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
+ boolean disableHome = ((mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
// Always disable recents when alternate car mode UI is active.
boolean disableRecent = mUseCarModeUi || !isOverviewEnabled();
- boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)
+ boolean disableBack = ((mDisabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)
&& ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0);
// When screen pinning, don't hide back and home when connected service or back and
@@ -670,7 +669,7 @@
public void updateStates() {
updateSlippery();
- setDisabledFlags(mDisabledFlags, true);
+ updateNavButtonIcons();
}
private void updateSlippery() {
@@ -773,7 +772,7 @@
}
// Hide/restore other button visibility, if necessary
- setNavigationIconHints(mNavigationIconHints, true);
+ updateNavButtonIcons();
}
public boolean isRotateButtonVisible() { return mShowRotateButton; }
@@ -802,8 +801,8 @@
public void onOverviewProxyConnectionChanged(boolean isConnected) {
updateStates();
setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled());
- updateIcons(getContext(), Configuration.EMPTY, mConfiguration);
- setNavigationIconHints(mNavigationIconHints, true);
+ reloadNavIcons();
+ updateNavButtonIcons();
}
@Override
@@ -879,7 +878,6 @@
// force the low profile & disabled states into compliance
mBarTransitions.init();
- setDisabledFlags(mDisabledFlags, true /* force */);
setMenuVisibility(mShowMenu, true /* force */);
if (DEBUG) {
@@ -892,7 +890,7 @@
resolveLayoutDirection();
}
updateTaskSwitchHelper();
- setNavigationIconHints(mNavigationIconHints, true);
+ updateNavButtonIcons();
getHomeButton().setVertical(mVertical);
}
@@ -937,7 +935,7 @@
if (uiCarModeChanged || mConfiguration.densityDpi != newConfig.densityDpi
|| mConfiguration.getLayoutDirection() != newConfig.getLayoutDirection()) {
// If car mode or density changes, we need to reset the icons.
- setNavigationIconHints(mNavigationIconHints, true);
+ updateNavButtonIcons();
}
mConfiguration.updateFrom(newConfig);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
index 18dd3c7..f278a17 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
@@ -369,6 +369,17 @@
}
@Test
+ public void testOverlayPredicate() {
+ StatusBarNotification sbn_user1_app1 = makeMockSBN(USERID_ONE, "com.example.app1",
+ 5000, "monkeys", Notification.FLAG_AUTO_CANCEL);
+ StatusBarNotification sbn_user1_overlay = makeMockSBN(USERID_ONE, "android",
+ 0, "AlertWindowNotification", Notification.FLAG_NO_CLEAR);
+
+ assertTrue(fsc.isSystemAlertNotification(sbn_user1_overlay));
+ assertFalse(fsc.isSystemAlertNotification(sbn_user1_app1));
+ }
+
+ @Test
public void testStdLayoutBasic() {
final String PKG1 = "com.example.app0";
@@ -439,7 +450,7 @@
when(sbn.getNotification()).thenReturn(n);
when(sbn.getId()).thenReturn(id);
when(sbn.getPackageName()).thenReturn(pkg);
- when(sbn.getTag()).thenReturn(null);
+ when(sbn.getTag()).thenReturn(tag);
when(sbn.getUserId()).thenReturn(userid);
when(sbn.getUser()).thenReturn(new UserHandle(userid));
when(sbn.getKey()).thenReturn("MOCK:"+userid+"|"+pkg+"|"+id+"|"+tag);
diff --git a/packages/VpnDialogs/res/values-as/strings.xml b/packages/VpnDialogs/res/values-as/strings.xml
index 4f16c74..25f16e3 100644
--- a/packages/VpnDialogs/res/values-as/strings.xml
+++ b/packages/VpnDialogs/res/values-as/strings.xml
@@ -24,20 +24,13 @@
<string name="data_transmitted" msgid="7988167672982199061">"পঠিওৱা হ\'ল:"</string>
<string name="data_received" msgid="4062776929376067820">"পোৱা গ\'ল:"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_1">%2$s</xliff:g> পেকেট / <xliff:g id="NUMBER_0">%1$s</xliff:g> বাইট"</string>
- <!-- no translation found for always_on_disconnected_title (1906740176262776166) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message (555634519845992917) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message_lockdown (4232225539869452120) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message_separator (3310614409322581371) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message_settings_link (6172280302829992412) -->
- <skip />
+ <string name="always_on_disconnected_title" msgid="1906740176262776166">"সদা-সক্ৰিয় ভিপিএনৰ লগত সংযোগ কৰিবপৰা নাই"</string>
+ <string name="always_on_disconnected_message" msgid="555634519845992917">"<xliff:g id="VPN_APP_0">%1$s</xliff:g>ক সকলো সময়তে সংযুক্ত হৈ থাকিবলৈ ছেট কৰি থোৱা হৈছে, কিন্তু ই বৰ্তমান সংযোগ কৰিবপৰা নাই। আপোনাৰ ফ\'নটোৱে <xliff:g id="VPN_APP_1">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰিব নোৱাৰালৈকে এটা ৰাজহুৱা নেটৱৰ্ক ব্যৱহাৰ কৰিব।"</string>
+ <string name="always_on_disconnected_message_lockdown" msgid="4232225539869452120">"<xliff:g id="VPN_APP">%1$s</xliff:g>ক সকলো সময়তে সংযুক্ত হৈ থাকিবলৈ ছেট কৰি থোৱা হৈছে, কিন্তু ই বৰ্তমান সংযোগ কৰিবপৰা নাই। ভিপিএনটোৰ সৈতে পুনৰ সংযুক্ত নোহোৱালৈকে আপোনাৰ কোনো সংযোগ নাথাকিব।"</string>
+ <string name="always_on_disconnected_message_separator" msgid="3310614409322581371">" "</string>
+ <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"ভিপিএন ছেটিংসমূহ সলনি কৰক"</string>
<string name="configure" msgid="4905518375574791375">"কনফিগাৰ কৰক"</string>
<string name="disconnect" msgid="971412338304200056">"সংযোগ বিচ্ছিন্ন কৰক"</string>
- <!-- no translation found for open_app (3717639178595958667) -->
- <skip />
- <!-- no translation found for dismiss (6192859333764711227) -->
- <skip />
+ <string name="open_app" msgid="3717639178595958667">"এপ্ খোলক"</string>
+ <string name="dismiss" msgid="6192859333764711227">"অগ্ৰাহ্য কৰক"</string>
</resources>
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index a1f184d..e962c0b 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -5419,6 +5419,40 @@
// OS: P
ZEN_WHAT_TO_BLOCK = 1339;
+ // ACTION: DND Settings > Priority only allows > System toggle
+ // SUBTYPE: 0 is off, 1 is on
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ZEN_ALLOW_SYSTEM = 1340;
+
+ // OPEN: Settings > Sounds > Do Not Disturb > Duration
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_DURATION_DIALOG = 1341;
+
+ // OPEN: Settings > Sound & notification > Do Not Disturb > Duration -> Time Option (ie: for one hour)
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_DURATION_TIME = 1342;
+
+ // OPEN: Settings > Sound & notification > Do Not Disturb > Duration -> Until you turn off
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_DURATION_FOREVER = 1343;
+
+ // OPEN: Settings > Sound & notification > Do Not Disturb > Duration -> Ask every time
+ // CATEGORY: SETTINGS
+ // OS: P
+ NOTIFICATION_ZEN_MODE_DURATION_PROMPT = 1344;
+
+ // Notification Guts, active app ops variant
+ // OS: P
+ APP_OPS_GUTS = 1345;
+
+ // ACTION: Notification Guts, active app ops variant > Settings button
+ // OS: P
+ ACTION_OPS_GUTS_SETTINGS = 1346;
+
// ---- End P Constants, all P constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index bcfe1b6..5eee9ed 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -52,6 +52,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.IBinder.DeathRecipient;
import android.os.Parcelable;
import android.os.RemoteCallback;
import android.os.RemoteException;
@@ -87,7 +88,6 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.os.HandlerCaller;
import com.android.internal.util.ArrayUtils;
import com.android.server.autofill.ui.AutoFillUI;
import com.android.server.autofill.ui.PendingUi;
@@ -158,6 +158,9 @@
@GuardedBy("mLock")
private IAutoFillManagerClient mClient;
+ @GuardedBy("mLock")
+ private DeathRecipient mClientVulture;
+
private final RemoteFillService mRemoteFillService;
@GuardedBy("mLock")
@@ -509,7 +512,7 @@
mWtfHistory = wtfHistory;
mComponentName = componentName;
mCompatMode = compatMode;
- mClient = IAutoFillManagerClient.Stub.asInterface(client);
+ setClientLocked(client);
mMetricsLogger.write(newLogMaker(MetricsEvent.AUTOFILL_SESSION_STARTED)
.addTaggedData(MetricsEvent.FIELD_FLAGS, flags));
@@ -539,13 +542,44 @@
return;
}
mActivityToken = newActivity;
- mClient = IAutoFillManagerClient.Stub.asInterface(newClient);
+ setClientLocked(newClient);
// The tracked id are not persisted in the client, hence update them
updateTrackedIdsLocked();
}
}
+ @GuardedBy("mLock")
+ private void setClientLocked(@NonNull IBinder client) {
+ unlinkClientVultureLocked();
+ mClient = IAutoFillManagerClient.Stub.asInterface(client);
+ mClientVulture = () -> {
+ Slog.d(TAG, "handling death of " + mActivityToken + " when saving=" + mIsSaving);
+ synchronized (mLock) {
+ if (mIsSaving) {
+ mUi.hideFillUi(this);
+ } else {
+ mUi.destroyAll(mPendingSaveUi, this, false);
+ }
+ }
+ };
+ try {
+ mClient.asBinder().linkToDeath(mClientVulture, 0);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "could not set binder death listener on autofill client: " + e);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void unlinkClientVultureLocked() {
+ if (mClient != null && mClientVulture != null) {
+ final boolean unlinked = mClient.asBinder().unlinkToDeath(mClientVulture, 0);
+ if (!unlinked) {
+ Slog.w(TAG, "unlinking vulture from death failed for " + mActivityToken);
+ }
+ }
+ }
+
// FillServiceCallbacks
@Override
public void onFillRequestSuccess(int requestFlags, @Nullable FillResponse response,
@@ -2443,6 +2477,7 @@
if (mDestroyed) {
return null;
}
+ unlinkClientVultureLocked();
mUi.destroyAll(mPendingSaveUi, this, true);
mUi.clearCallback(this);
mDestroyed = true;
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index e28a204..21a39e4 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -136,7 +136,7 @@
* Hides the fill UI.
*/
public void hideFillUi(@NonNull AutoFillUiCallback callback) {
- mHandler.post(() -> hideFillUiUiThread(callback));
+ mHandler.post(() -> hideFillUiUiThread(callback, true));
}
/**
@@ -189,7 +189,7 @@
@Override
public void onResponsePicked(FillResponse response) {
log.setType(MetricsEvent.TYPE_DETAIL);
- hideFillUiUiThread(callback);
+ hideFillUiUiThread(callback, true);
if (mCallback != null) {
mCallback.authenticate(response.getRequestId(),
AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED,
@@ -200,7 +200,7 @@
@Override
public void onDatasetPicked(Dataset dataset) {
log.setType(MetricsEvent.TYPE_ACTION);
- hideFillUiUiThread(callback);
+ hideFillUiUiThread(callback, true);
if (mCallback != null) {
final int datasetIndex = response.getDatasets().indexOf(dataset);
mCallback.fill(response.getRequestId(), datasetIndex, dataset);
@@ -210,7 +210,7 @@
@Override
public void onCanceled() {
log.setType(MetricsEvent.TYPE_DISMISS);
- hideFillUiUiThread(callback);
+ hideFillUiUiThread(callback, true);
}
@Override
@@ -367,9 +367,9 @@
}
@android.annotation.UiThread
- private void hideFillUiUiThread(@Nullable AutoFillUiCallback callback) {
+ private void hideFillUiUiThread(@Nullable AutoFillUiCallback callback, boolean notifyClient) {
if (mFillUi != null && (callback == null || callback == mCallback)) {
- mFillUi.destroy();
+ mFillUi.destroy(notifyClient);
mFillUi = null;
}
}
@@ -413,13 +413,13 @@
@android.annotation.UiThread
private void destroyAllUiThread(@Nullable PendingUi pendingSaveUi,
@Nullable AutoFillUiCallback callback, boolean notifyClient) {
- hideFillUiUiThread(callback);
+ hideFillUiUiThread(callback, notifyClient);
destroySaveUiUiThread(pendingSaveUi, notifyClient);
}
@android.annotation.UiThread
private void hideAllUiThread(@Nullable AutoFillUiCallback callback) {
- hideFillUiUiThread(callback);
+ hideFillUiUiThread(callback, true);
final PendingUi pendingSaveUi = hideSaveUiUiThread(callback);
if (pendingSaveUi != null && pendingSaveUi.getState() == PendingUi.STATE_FINISHED) {
if (sDebug) {
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index a32078c..ef4656b 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -415,10 +415,15 @@
applyNewFilterText();
}
- public void destroy() {
+ public void destroy(boolean notifyClient) {
throwIfDestroyed();
+ if (mWindow != null) {
+ mWindow.hide(false);
+ }
mCallback.onDestroy();
- mCallback.requestHideFillUi();
+ if (notifyClient) {
+ mCallback.requestHideFillUi();
+ }
mDestroyed = true;
}
@@ -644,6 +649,10 @@
* Hides the window.
*/
void hide() {
+ hide(true);
+ }
+
+ void hide(boolean destroyCallbackOnError) {
try {
if (mShowing) {
mWm.removeView(mContentView);
@@ -654,7 +663,9 @@
// happen - since show() and hide() are always called in the UIThread - but if it
// does, it should not crash the system.
Slog.e(TAG, "Exception hiding window ", e);
- mCallback.onDestroy();
+ if (destroyCallbackOnError) {
+ mCallback.onDestroy();
+ }
} finally {
mOverlayControl.showOverlays();
}
diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
index 4443130..3cf374f 100644
--- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
+++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
@@ -23,7 +23,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
@@ -31,7 +30,6 @@
import android.os.ParcelFileDescriptor;
import android.util.Slog;
-import com.android.server.LocalServices;
import com.android.server.backup.utils.AppBackupUtils;
import java.io.BufferedInputStream;
@@ -237,7 +235,7 @@
if (home != null) {
try {
homeInfo = mPackageManager.getPackageInfo(home.getPackageName(),
- PackageManager.GET_SIGNING_CERTIFICATES);
+ PackageManager.GET_SIGNATURES);
homeInstaller = mPackageManager.getInstallerPackageName(home.getPackageName());
homeVersion = homeInfo.getLongVersionCode();
homeSigHashes = BackupUtils.hashSignatureArray(homeInfo.signatures);
@@ -254,11 +252,10 @@
// 2. the home app [or absence] we now use differs from the prior state,
// OR 3. it looks like we use the same home app + version as before, but
// the signatures don't match so we treat them as different apps.
- PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
final boolean needHomeBackup = (homeVersion != mStoredHomeVersion)
|| !Objects.equals(home, mStoredHomeComponent)
|| (home != null
- && !BackupUtils.signaturesMatch(mStoredHomeSigHashes, homeInfo, pmi));
+ && !BackupUtils.signaturesMatch(mStoredHomeSigHashes, homeInfo));
if (needHomeBackup) {
if (DEBUG) {
Slog.i(TAG, "Home preference changed; backing up new state " + home);
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index c1a1c1d..0ca4f25 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -36,13 +36,11 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.server.LocalServices;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.FileMetadata;
import com.android.server.backup.KeyValueAdbRestoreEngine;
@@ -209,11 +207,8 @@
if (info.path.equals(BACKUP_MANIFEST_FILENAME)) {
Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
info);
- PackageManagerInternal pmi = LocalServices.getService(
- PackageManagerInternal.class);
RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
- mBackupManagerService.getPackageManager(), allowApks, info, signatures,
- pmi);
+ mBackupManagerService.getPackageManager(), allowApks, info, signatures);
mManifestSignatures.put(info.packageName, signatures);
mPackagePolicies.put(pkg, restorePolicy);
mPackageInstallers.put(pkg, info.installerPackageName);
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index dacde0b..e576b3c 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -40,7 +40,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
@@ -48,7 +47,6 @@
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.LocalServices;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.FileMetadata;
import com.android.server.backup.KeyValueAdbRestoreEngine;
@@ -472,11 +470,9 @@
if (info.path.equals(BACKUP_MANIFEST_FILENAME)) {
Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
info);
- PackageManagerInternal pmi = LocalServices.getService(
- PackageManagerInternal.class);
RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
mBackupManagerService.getPackageManager(), allowApks,
- info, signatures, pmi);
+ info, signatures);
mManifestSignatures.put(info.packageName, signatures);
mPackagePolicies.put(pkg, restorePolicy);
mPackageInstallers.put(pkg, info.installerPackageName);
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 4b467e5..3caa1e7 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -43,7 +43,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Message;
@@ -58,7 +57,6 @@
import com.android.internal.backup.IBackupTransport;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
-import com.android.server.LocalServices;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.BackupUtils;
import com.android.server.backup.PackageManagerBackupAgent;
@@ -506,7 +504,7 @@
try {
mCurrentPackage = backupManagerService.getPackageManager().getPackageInfo(
- pkgName, PackageManager.GET_SIGNING_CERTIFICATES);
+ pkgName, PackageManager.GET_SIGNATURES);
} catch (NameNotFoundException e) {
// Whoops, we thought we could restore this package but it
// turns out not to be present. Skip it.
@@ -621,8 +619,7 @@
}
Metadata metaInfo = mPmAgent.getRestoredMetadata(packageName);
- PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
- if (!BackupUtils.signaturesMatch(metaInfo.sigHashes, mCurrentPackage, pmi)) {
+ if (!BackupUtils.signaturesMatch(metaInfo.sigHashes, mCurrentPackage)) {
Slog.w(TAG, "Signature mismatch restoring " + packageName);
mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor,
BackupManagerMonitor.LOG_EVENT_ID_SIGNATURE_MISMATCH, mCurrentPackage,
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index 90c1387..6780563 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -25,7 +25,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Process;
import android.util.Slog;
@@ -38,9 +37,6 @@
* Utility methods wrapping operations on ApplicationInfo and PackageInfo.
*/
public class AppBackupUtils {
-
- private static final boolean DEBUG = false;
-
/**
* Returns whether app is eligible for backup.
*
@@ -92,8 +88,7 @@
public static boolean appIsRunningAndEligibleForBackupWithTransport(
@Nullable TransportClient transportClient, String packageName, PackageManager pm) {
try {
- PackageInfo packageInfo = pm.getPackageInfo(packageName,
- PackageManager.GET_SIGNING_CERTIFICATES);
+ PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
if (!appIsEligibleForBackup(applicationInfo, pm)
|| appIsStopped(applicationInfo)
@@ -170,18 +165,12 @@
*
* <ul>
* <li>Source and target have at least one signature each
- * <li>Target contains all signatures in source, and nothing more
+ * <li>Target contains all signatures in source
* </ul>
*
- * or if both source and target have exactly one signature, and they don't match, we check
- * if the app was ever signed with source signature (i.e. app has rotated key)
- * Note: key rotation is only supported for apps ever signed with one key, and those apps will
- * not be allowed to be signed by more certificates in the future
- *
* Note that if {@param target} is null we return false.
*/
- public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target,
- PackageManagerInternal pmi) {
+ public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) {
if (target == null) {
return false;
}
@@ -198,52 +187,33 @@
return true;
}
+ Signature[] deviceSigs = target.signatures;
+ if (MORE_DEBUG) {
+ Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device=" + deviceSigs);
+ }
+
// Don't allow unsigned apps on either end
- if (ArrayUtils.isEmpty(storedSigs)) {
+ if (ArrayUtils.isEmpty(storedSigs) || ArrayUtils.isEmpty(deviceSigs)) {
return false;
}
- Signature[][] deviceHistorySigs = target.signingCertificateHistory;
- if (ArrayUtils.isEmpty(deviceHistorySigs)) {
- Slog.w(TAG, "signingCertificateHistory is empty, app was either unsigned or the flag" +
- " PackageManager#GET_SIGNING_CERTIFICATES was not specified");
- return false;
- }
+ // Signatures can be added over time, so the target-device apk needs to contain all the
+ // source-device apk signatures, but not necessarily the other way around.
+ int nStored = storedSigs.length;
+ int nDevice = deviceSigs.length;
- if (DEBUG) {
- Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device=" + deviceHistorySigs);
- }
-
- final int nStored = storedSigs.length;
- if (nStored == 1) {
- // if the app is only signed with one sig, it's possible it has rotated its key
- // (the checks with signing history are delegated to PackageManager)
- // TODO: address the case that app has declared restoreAnyVersion and is restoring
- // from higher version to lower after having rotated the key (i.e. higher version has
- // different sig than lower version that we want to restore to)
- return pmi.isDataRestoreSafe(storedSigs[0], target.packageName);
- } else {
- // the app couldn't have rotated keys, since it was signed with multiple sigs - do
- // a comprehensive 1-to-1 signatures check
- // since app hasn't rotated key, we only need to check with deviceHistorySigs[0]
- Signature[] deviceSigs = deviceHistorySigs[0];
- int nDevice = deviceSigs.length;
-
- // ensure that each stored sig matches an on-device sig
- for (int i = 0; i < nStored; i++) {
- boolean match = false;
- for (int j = 0; j < nDevice; j++) {
- if (storedSigs[i].equals(deviceSigs[j])) {
- match = true;
- break;
- }
- }
- if (!match) {
- return false;
+ for (int i = 0; i < nStored; i++) {
+ boolean match = false;
+ for (int j = 0; j < nDevice; j++) {
+ if (storedSigs[i].equals(deviceSigs[j])) {
+ match = true;
+ break;
}
}
- // we have found a match for all stored sigs
- return true;
+ if (!match) {
+ return false;
+ }
}
+ return true;
}
}
diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
index df7e6d4..10f0695 100644
--- a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
@@ -30,7 +30,6 @@
import android.content.pm.PackageInstaller.Session;
import android.content.pm.PackageInstaller.SessionParams;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Bundle;
import android.os.IBinder;
@@ -38,7 +37,6 @@
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
-import com.android.server.LocalServices;
import com.android.server.backup.FileMetadata;
import com.android.server.backup.restore.RestoreDeleteObserver;
import com.android.server.backup.restore.RestorePolicy;
@@ -144,8 +142,9 @@
uninstall = true;
} else {
try {
- PackageInfo pkg = packageManager.getPackageInfo(info.packageName,
- PackageManager.GET_SIGNING_CERTIFICATES);
+ PackageInfo pkg = packageManager.getPackageInfo(
+ info.packageName,
+ PackageManager.GET_SIGNATURES);
if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP)
== 0) {
Slog.w(TAG, "Restore stream contains apk of package "
@@ -155,9 +154,7 @@
} else {
// So far so good -- do the signatures match the manifest?
Signature[] sigs = manifestSignatures.get(info.packageName);
- PackageManagerInternal pmi = LocalServices.getService(
- PackageManagerInternal.class);
- if (AppBackupUtils.signaturesMatch(sigs, pkg, pmi)) {
+ if (AppBackupUtils.signaturesMatch(sigs, pkg)) {
// If this is a system-uid app without a declared backup agent,
// don't restore any of the file data.
if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID)
diff --git a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
index 6dd5284..cc26ff8 100644
--- a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
+++ b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
@@ -50,7 +50,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Bundle;
import android.os.Process;
@@ -386,8 +385,7 @@
* @return a restore policy constant.
*/
public RestorePolicy chooseRestorePolicy(PackageManager packageManager,
- boolean allowApks, FileMetadata info, Signature[] signatures,
- PackageManagerInternal pmi) {
+ boolean allowApks, FileMetadata info, Signature[] signatures) {
if (signatures == null) {
return RestorePolicy.IGNORE;
}
@@ -397,7 +395,7 @@
// Okay, got the manifest info we need...
try {
PackageInfo pkgInfo = packageManager.getPackageInfo(
- info.packageName, PackageManager.GET_SIGNING_CERTIFICATES);
+ info.packageName, PackageManager.GET_SIGNATURES);
// Fall through to IGNORE if the app explicitly disallows backup
final int flags = pkgInfo.applicationInfo.flags;
if ((flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0) {
@@ -413,7 +411,7 @@
// such packages are signed with the platform cert instead of
// the app developer's cert, so they're different on every
// device.
- if (AppBackupUtils.signaturesMatch(signatures, pkgInfo, pmi)) {
+ if (AppBackupUtils.signaturesMatch(signatures, pkgInfo)) {
if ((pkgInfo.applicationInfo.flags
& ApplicationInfo.FLAG_RESTORE_ANY_VERSION) != 0) {
Slog.i(TAG, "Package has restoreAnyVersion; taking data");
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index d17ca7f..d066056 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -57,6 +57,9 @@
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
@@ -1369,6 +1372,17 @@
}
}
+ boolean setTimeImpl(long millis) {
+ if (mNativeData == 0) {
+ Slog.w(TAG, "Not setting time since no alarm driver is available.");
+ return false;
+ }
+
+ synchronized (mLock) {
+ return setKernelTime(mNativeData, millis) == 0;
+ }
+ }
+
void setTimeZoneImpl(String tz) {
if (TextUtils.isEmpty(tz)) {
return;
@@ -1766,14 +1780,7 @@
"android.permission.SET_TIME",
"setTime");
- if (mNativeData == 0) {
- Slog.w(TAG, "Not setting time since no alarm driver is available.");
- return false;
- }
-
- synchronized (mLock) {
- return setKernelTime(mNativeData, millis) == 0;
- }
+ return setTimeImpl(millis);
}
@Override
@@ -1836,6 +1843,13 @@
dumpImpl(pw);
}
}
+
+ @Override
+ public void onShellCommand(FileDescriptor in, FileDescriptor out,
+ FileDescriptor err, String[] args, ShellCallback callback,
+ ResultReceiver resultReceiver) {
+ (new ShellCmd()).exec(this, in, out, err, args, callback, resultReceiver);
+ }
};
void dumpImpl(PrintWriter pw) {
@@ -4244,4 +4258,49 @@
}
}
}
+
+ private class ShellCmd extends ShellCommand {
+
+ IAlarmManager getBinderService() {
+ return IAlarmManager.Stub.asInterface(mService);
+ }
+
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+
+ final PrintWriter pw = getOutPrintWriter();
+ try {
+ switch (cmd) {
+ case "set-time":
+ final long millis = Long.parseLong(getNextArgRequired());
+ return (getBinderService().setTime(millis)) ? 0 : -1;
+ case "set-timezone":
+ final String tz = getNextArgRequired();
+ getBinderService().setTimeZone(tz);
+ return 0;
+ default:
+ return handleDefaultCommands(cmd);
+ }
+ } catch (Exception e) {
+ pw.println(e);
+ }
+ return -1;
+ }
+
+ @Override
+ public void onHelp() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Alarm manager service (alarm) commands:");
+ pw.println(" help");
+ pw.println(" Print this help text.");
+ pw.println(" set-time TIME");
+ pw.println(" Set the system clock time to TIME where TIME is milliseconds");
+ pw.println(" since the Epoch.");
+ pw.println(" set-timezone TZ");
+ pw.println(" Set the system timezone to TZ where TZ is an Olson id.");
+ }
+ }
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 7c109d5..3d7b21d 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -2583,17 +2583,6 @@
}
}
- @Override
- public void secdiscard(String path) {
- enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
-
- try {
- mVold.secdiscard(path);
- } catch (Exception e) {
- Slog.wtf(TAG, e);
- }
- }
-
class AppFuseMountScope extends AppFuseBridge.MountScope {
boolean opened = false;
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index e202618..3927ebd 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -203,6 +203,10 @@
private PreciseDataConnectionState mPreciseDataConnectionState =
new PreciseDataConnectionState();
+ static final int ENFORCE_COARSE_LOCATION_PERMISSION_MASK =
+ PhoneStateListener.LISTEN_CELL_LOCATION
+ | PhoneStateListener.LISTEN_CELL_INFO;
+
static final int ENFORCE_PHONE_STATE_PERMISSION_MASK =
PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR |
PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR |
@@ -1721,16 +1725,13 @@
}
private boolean checkListenerPermission(int events, String callingPackage, String message) {
- if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) {
+ if ((events & ENFORCE_COARSE_LOCATION_PERMISSION_MASK) != 0) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
-
- }
-
- if ((events & PhoneStateListener.LISTEN_CELL_INFO) != 0) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
-
+ if (mAppOps.noteOp(AppOpsManager.OP_COARSE_LOCATION, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return false;
+ }
}
if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) {
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 0c6746e..26f83f5 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1043,20 +1043,14 @@
throw new SecurityException("Instant app " + r.appInfo.packageName
+ " does not have permission to create foreground services");
default:
- try {
- if (AppGlobals.getPackageManager().checkPermission(
- android.Manifest.permission.INSTANT_APP_FOREGROUND_SERVICE,
- r.appInfo.packageName, UserHandle.getUserId(r.appInfo.uid))
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Instant app " + r.appInfo.packageName
- + " does not have permission to create foreground"
- + "services");
- }
- } catch (RemoteException e) {
- throw new SecurityException("Failed to check instant app permission." ,
- e);
- }
+ mAm.enforcePermission(
+ android.Manifest.permission.INSTANT_APP_FOREGROUND_SERVICE,
+ r.app.pid, r.appInfo.uid, "startForeground");
}
+ } else if (r.appInfo.targetSdkVersion >= Build.VERSION_CODES.P) {
+ mAm.enforcePermission(
+ android.Manifest.permission.FOREGROUND_SERVICE,
+ r.app.pid, r.appInfo.uid, "startForeground");
}
if (r.fgRequired) {
if (DEBUG_SERVICE || DEBUG_BACKGROUND_CHECK) {
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index bac81e7..dd83a36 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -664,6 +664,10 @@
while (getChildCount() > 0) {
final ActivityStack stack = getChildAt(0);
if (destroyContentOnRemoval) {
+ // Override the stack configuration to make it equal to the current applied one, so
+ // that we don't accidentally report configuration change to activities that are
+ // going to be finished.
+ stack.onOverrideConfigurationChanged(stack.getConfiguration());
mSupervisor.moveStackToDisplayLocked(stack.mStackId, DEFAULT_DISPLAY,
false /* onTop */);
stack.finishAllActivitiesLocked(true /* immediately */);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7656453..3c058fc 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8973,6 +8973,20 @@
/**
* This can be called with or without the global lock held.
*/
+ void enforcePermission(String permission, int pid, int uid, String func) {
+ if (checkPermission(permission, pid, uid) == PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
+
+ String msg = "Permission Denial: " + func + " from pid=" + pid + ", uid=" + uid
+ + " requires " + permission;
+ Slog.w(TAG, msg);
+ throw new SecurityException(msg);
+ }
+
+ /**
+ * This can be called with or without the global lock held.
+ */
void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
if (!mRecentTasks.isCallerRecents(Binder.getCallingUid())) {
enforceCallingPermission(permission, func);
diff --git a/services/core/java/com/android/server/am/MemoryStatUtil.java b/services/core/java/com/android/server/am/MemoryStatUtil.java
index da36bd1..f9dccea0 100644
--- a/services/core/java/com/android/server/am/MemoryStatUtil.java
+++ b/services/core/java/com/android/server/am/MemoryStatUtil.java
@@ -179,4 +179,4 @@
/** Number of bytes of swap usage */
long swapInBytes;
}
-}
\ No newline at end of file
+}
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index 5fd300c..99f5298 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -19,6 +19,7 @@
import static android.app.ActivityManager.FLAG_AND_UNLOCKED;
import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE;
import static android.app.ActivityManager.RECENT_WITH_EXCLUDED;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
@@ -1099,13 +1100,22 @@
+ " sessionDuration=" + mActiveTasksSessionDurationMs
+ " inactiveDuration=" + task.getInactiveDuration()
+ " activityType=" + task.getActivityType()
- + " windowingMode=" + task.getWindowingMode());
+ + " windowingMode=" + task.getWindowingMode()
+ + " intentFlags=" + task.getBaseIntent().getFlags());
- // Ignore certain activity types completely
switch (task.getActivityType()) {
case ACTIVITY_TYPE_HOME:
case ACTIVITY_TYPE_RECENTS:
+ // Ignore certain activity types completely
return false;
+ case ACTIVITY_TYPE_ASSISTANT:
+ // Ignore assistant that chose to be excluded from Recents, even if it's a top
+ // task.
+ if ((task.getBaseIntent().getFlags()
+ & Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
+ == Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) {
+ return false;
+ }
}
// Ignore certain windowing modes
diff --git a/services/core/java/com/android/server/backup/BackupUtils.java b/services/core/java/com/android/server/backup/BackupUtils.java
index f44afe4..e5d564d 100644
--- a/services/core/java/com/android/server/backup/BackupUtils.java
+++ b/services/core/java/com/android/server/backup/BackupUtils.java
@@ -18,12 +18,9 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.util.Slog;
-import com.android.internal.util.ArrayUtils;
-
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
@@ -33,10 +30,9 @@
public class BackupUtils {
private static final String TAG = "BackupUtils";
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = false; // STOPSHIP if true
- public static boolean signaturesMatch(ArrayList<byte[]> storedSigHashes, PackageInfo target,
- PackageManagerInternal pmi) {
+ public static boolean signaturesMatch(ArrayList<byte[]> storedSigHashes, PackageInfo target) {
if (target == null) {
return false;
}
@@ -51,54 +47,48 @@
return true;
}
- // Don't allow unsigned apps on either end
- if (ArrayUtils.isEmpty(storedSigHashes)) {
- return false;
- }
-
- Signature[][] deviceHistorySigs = target.signingCertificateHistory;
- if (ArrayUtils.isEmpty(deviceHistorySigs)) {
- Slog.w(TAG, "signingCertificateHistory is empty, app was either unsigned or the flag" +
- " PackageManager#GET_SIGNING_CERTIFICATES was not specified");
- return false;
- }
-
- if (DEBUG) {
- Slog.v(TAG, "signaturesMatch(): stored=" + storedSigHashes
- + " device=" + deviceHistorySigs);
- }
-
- final int nStored = storedSigHashes.size();
- if (nStored == 1) {
- // if the app is only signed with one sig, it's possible it has rotated its key
- // the checks with signing history are delegated to PackageManager
- // TODO: address the case that app has declared restoreAnyVersion and is restoring
- // from higher version to lower after having rotated the key (i.e. higher version has
- // different sig than lower version that we want to restore to)
- return pmi.isDataRestoreSafe(storedSigHashes.get(0), target.packageName);
- } else {
- // the app couldn't have rotated keys, since it was signed with multiple sigs - do
- // a comprehensive 1-to-1 signatures check
- // since app hasn't rotated key, we only need to check with deviceHistorySigs[0]
- ArrayList<byte[]> deviceHashes = hashSignatureArray(deviceHistorySigs[0]);
- int nDevice = deviceHashes.size();
-
- // ensure that each stored sig matches an on-device sig
- for (int i = 0; i < nStored; i++) {
- boolean match = false;
- for (int j = 0; j < nDevice; j++) {
- if (Arrays.equals(storedSigHashes.get(i), deviceHashes.get(j))) {
- match = true;
- break;
- }
- }
- if (!match) {
- return false;
- }
- }
- // we have found a match for all stored sigs
+ // Allow unsigned apps, but not signed on one device and unsigned on the other
+ // !!! TODO: is this the right policy?
+ Signature[] deviceSigs = target.signatures;
+ if (DEBUG) Slog.v(TAG, "signaturesMatch(): stored=" + storedSigHashes
+ + " device=" + deviceSigs);
+ if ((storedSigHashes == null || storedSigHashes.size() == 0)
+ && (deviceSigs == null || deviceSigs.length == 0)) {
return true;
}
+ if (storedSigHashes == null || deviceSigs == null) {
+ return false;
+ }
+
+ // !!! TODO: this demands that every stored signature match one
+ // that is present on device, and does not demand the converse.
+ // Is this this right policy?
+ final int nStored = storedSigHashes.size();
+ final int nDevice = deviceSigs.length;
+
+ // hash each on-device signature
+ ArrayList<byte[]> deviceHashes = new ArrayList<byte[]>(nDevice);
+ for (int i = 0; i < nDevice; i++) {
+ deviceHashes.add(hashSignature(deviceSigs[i]));
+ }
+
+ // now ensure that each stored sig (hash) matches an on-device sig (hash)
+ for (int n = 0; n < nStored; n++) {
+ boolean match = false;
+ final byte[] storedHash = storedSigHashes.get(n);
+ for (int i = 0; i < nDevice; i++) {
+ if (Arrays.equals(storedHash, deviceHashes.get(i))) {
+ match = true;
+ break;
+ }
+ }
+ // match is false when no on-device sig matched one of the stored ones
+ if (!match) {
+ return false;
+ }
+ }
+
+ return true;
}
public static byte[] hashSignature(byte[] signature) {
diff --git a/services/core/java/com/android/server/location/ContextHubClientManager.java b/services/core/java/com/android/server/location/ContextHubClientManager.java
index a61842b..74930c8 100644
--- a/services/core/java/com/android/server/location/ContextHubClientManager.java
+++ b/services/core/java/com/android/server/location/ContextHubClientManager.java
@@ -198,7 +198,7 @@
ContextHubClientBroker broker = null;
int id = mNextHostEndpointId;
for (int i = 0; i <= MAX_CLIENT_ID; i++) {
- if (!mHostEndPointIdToClientMap.containsKey(id)) {
+ if (!mHostEndPointIdToClientMap.containsKey((short)id)) {
broker = new ContextHubClientBroker(
mContext, mContextHubProxy, this, contextHubId, (short)id, clientCallback);
mHostEndPointIdToClientMap.put((short)id, broker);
diff --git a/services/core/java/com/android/server/location/OWNERS b/services/core/java/com/android/server/location/OWNERS
index 5f0369b..92b4d5f 100644
--- a/services/core/java/com/android/server/location/OWNERS
+++ b/services/core/java/com/android/server/location/OWNERS
@@ -1,4 +1,4 @@
-ashutoshj@google.com
+arthuri@google.com
bduddie@google.com
gomo@google.com
sooniln@google.com
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
index f62e8a9..8b3a1a6 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
@@ -495,10 +495,11 @@
String path = getSynthenticPasswordStateFilePathForUser(userId, handle, name);
File file = new File(path);
if (file.exists()) {
- try {
- mContext.getSystemService(StorageManager.class).secdiscard(file.getAbsolutePath());
+ try (RandomAccessFile raf = new RandomAccessFile(path, "rws")) {
+ final int fileSize = (int) raf.length();
+ raf.write(new byte[fileSize]);
} catch (Exception e) {
- Slog.w(TAG, "Failed to secdiscard " + path, e);
+ Slog.w(TAG, "Failed to zeroize " + path, e);
} finally {
file.delete();
}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 6411ae1..6939537 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -19,6 +19,7 @@
import static android.media.SessionToken2.TYPE_SESSION;
import android.app.ActivityManager;
+import android.app.AppGlobals;
import android.app.INotificationManager;
import android.app.KeyguardManager;
import android.app.PendingIntent;
@@ -30,6 +31,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
@@ -117,12 +119,13 @@
private final MessageHandler mHandler = new MessageHandler();
private final PowerManager.WakeLock mMediaEventWakeLock;
private final int mLongPressTimeout;
+ private final INotificationManager mNotificationManager;
+ private final IPackageManager mPackageManager;
private KeyguardManager mKeyguardManager;
private IAudioService mAudioService;
private ContentResolver mContentResolver;
private SettingsObserver mSettingsObserver;
- private INotificationManager mNotificationManager;
private boolean mHasFeatureLeanback;
// The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile)
@@ -150,6 +153,7 @@
mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
mNotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ mPackageManager = AppGlobals.getPackageManager();
}
@Override
@@ -1494,6 +1498,59 @@
}
/**
+ * Returns if the controller's package is trusted (i.e. has either MEDIA_CONTENT_CONTROL
+ * permission or an enabled notification listener)
+ *
+ * @param uid uid of the controller app
+ * @param packageName package name of the controller app
+ */
+ @Override
+ public boolean isTrusted(int uid, String packageName) throws RemoteException {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ int userId = UserHandle.getUserId(uid);
+ // Sanity check whether uid and packageName matches
+ if (uid != mPackageManager.getPackageUid(packageName, 0, userId)) {
+ throw new IllegalArgumentException("uid=" + uid + " and packageName="
+ + packageName + " doesn't match");
+ }
+
+ // Check if it's system server or has MEDIA_CONTENT_CONTROL.
+ // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra
+ // check here.
+ if (uid == Process.SYSTEM_UID || mPackageManager.checkPermission(
+ android.Manifest.permission.MEDIA_CONTENT_CONTROL, packageName, uid)
+ == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ }
+ if (DEBUG) {
+ Log.d(TAG, packageName + " (uid=" + uid + ") hasn't granted"
+ + " MEDIA_CONTENT_CONTROL");
+ }
+
+ // TODO(jaewan): Add hasEnabledNotificationListener(String pkgName) for
+ // optimization (Post-P)
+ final List<ComponentName> enabledNotificationListeners =
+ mNotificationManager.getEnabledNotificationListeners(userId);
+ if (enabledNotificationListeners != null) {
+ for (int i = 0; i < enabledNotificationListeners.size(); i++) {
+ if (TextUtils.equals(packageName,
+ enabledNotificationListeners.get(i).getPackageName())) {
+ return true;
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ if (DEBUG) {
+ Log.d(TAG, packageName + " (uid=" + uid + ") doesn't have an enabled notification"
+ + " listener");
+ }
+ return false;
+ }
+
+ /**
* Called when a {@link android.media.MediaSession2} instance is created.
* <p>
* This does two things.
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 14995b3..fb38398 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -39,7 +39,6 @@
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener;
-import android.content.pm.UserInfo;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Binder;
@@ -50,7 +49,7 @@
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.os.UserManager;
+import android.os.UserManagerInternal;
import android.provider.Settings;
import android.util.Log;
import android.util.Slog;
@@ -102,7 +101,7 @@
private static final boolean DEBUG = false;
private static final String TAG = "LauncherAppsService";
private final Context mContext;
- private final UserManager mUm;
+ private final UserManagerInternal mUserManagerInternal;
private final ActivityManagerInternal mActivityManagerInternal;
private final ShortcutServiceInternal mShortcutServiceInternal;
private final PackageCallbackList<IOnAppsChangedListener> mListeners
@@ -114,7 +113,8 @@
public LauncherAppsImpl(Context context) {
mContext = context;
- mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ mUserManagerInternal = Preconditions.checkNotNull(
+ LocalServices.getService(UserManagerInternal.class));
mActivityManagerInternal = Preconditions.checkNotNull(
LocalServices.getService(ActivityManagerInternal.class));
mShortcutServiceInternal = Preconditions.checkNotNull(
@@ -222,12 +222,6 @@
}
}
- /** See {@link #canAccessProfile(String, int, String)} */
- private boolean canAccessProfile(
- String callingPackage, UserHandle targetUser, String message) {
- return canAccessProfile(callingPackage, targetUser.getIdentifier(), message);
- }
-
/**
* Checks if the calling user is in the same group as {@code targetUser}, and allowed
* to access it.
@@ -238,30 +232,9 @@
* @throws SecurityException if the calling user and {@code targetUser} are not in the same
* group.
*/
- private boolean canAccessProfile(String callingPackage, int targetUserId, String message) {
- final int callingUserId = injectCallingUserId();
-
- if (targetUserId == callingUserId) return true;
-
- long ident = injectClearCallingIdentity();
- try {
- UserInfo callingUserInfo = mUm.getUserInfo(callingUserId);
- if (callingUserInfo.isManagedProfile()) {
- Slog.w(TAG, message + " by " + callingPackage + " for another profile "
- + targetUserId + " from " + callingUserId);
- return false;
- }
-
- UserInfo targetUserInfo = mUm.getUserInfo(targetUserId);
- if (targetUserInfo == null
- || targetUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID
- || targetUserInfo.profileGroupId != callingUserInfo.profileGroupId) {
- throw new SecurityException(message + " for unrelated profile " + targetUserId);
- }
- } finally {
- injectRestoreCallingIdentity(ident);
- }
- return true;
+ private boolean canAccessProfile(int targetUserId, String message) {
+ return mUserManagerInternal.isProfileAccessible(injectCallingUserId(), targetUserId,
+ message, true);
}
@VisibleForTesting // We override it in unit tests
@@ -283,23 +256,6 @@
}
}
- /**
- * Checks if the user is enabled.
- */
- private boolean isUserEnabled(UserHandle user) {
- return isUserEnabled(user.getIdentifier());
- }
-
- private boolean isUserEnabled(int userId) {
- long ident = injectClearCallingIdentity();
- try {
- UserInfo targetUserInfo = mUm.getUserInfo(userId);
- return targetUserInfo != null && targetUserInfo.isEnabled();
- } finally {
- injectRestoreCallingIdentity(ident);
- }
- }
-
@Override
public ParceledListSlice<ResolveInfo> getLauncherActivities(String callingPackage,
String packageName, UserHandle user)
@@ -315,10 +271,7 @@
public ActivityInfo resolveActivity(
String callingPackage, ComponentName component, UserHandle user)
throws RemoteException {
- if (!canAccessProfile(callingPackage, user, "Cannot resolve activity")) {
- return null;
- }
- if (!isUserEnabled(user)) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot resolve activity")) {
return null;
}
@@ -346,10 +299,7 @@
private ParceledListSlice<ResolveInfo> queryActivitiesForUser(String callingPackage,
Intent intent, UserHandle user) {
- if (!canAccessProfile(callingPackage, user, "Cannot retrieve activities")) {
- return null;
- }
- if (!isUserEnabled(user)) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot retrieve activities")) {
return null;
}
@@ -372,11 +322,10 @@
public IntentSender getShortcutConfigActivityIntent(String callingPackage,
ComponentName component, UserHandle user) throws RemoteException {
ensureShortcutPermission(callingPackage);
- if (!canAccessProfile(callingPackage, user, "Cannot check package")) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot check package")) {
return null;
}
Preconditions.checkNotNull(component);
- Preconditions.checkArgument(isUserEnabled(user), "User not enabled");
// All right, create the sender.
Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT).setComponent(component);
@@ -395,10 +344,7 @@
@Override
public boolean isPackageEnabled(String callingPackage, String packageName, UserHandle user)
throws RemoteException {
- if (!canAccessProfile(callingPackage, user, "Cannot check package")) {
- return false;
- }
- if (!isUserEnabled(user)) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot check package")) {
return false;
}
@@ -421,10 +367,7 @@
public ApplicationInfo getApplicationInfo(
String callingPackage, String packageName, int flags, UserHandle user)
throws RemoteException {
- if (!canAccessProfile(callingPackage, user, "Cannot check package")) {
- return null;
- }
- if (!isUserEnabled(user)) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot check package")) {
return null;
}
@@ -454,8 +397,7 @@
String packageName, List shortcutIds, ComponentName componentName, int flags,
UserHandle targetUser) {
ensureShortcutPermission(callingPackage);
- if (!canAccessProfile(callingPackage, targetUser, "Cannot get shortcuts")
- || !isUserEnabled(targetUser)) {
+ if (!canAccessProfile(targetUser.getIdentifier(), "Cannot get shortcuts")) {
return new ParceledListSlice<>(Collections.EMPTY_LIST);
}
if (shortcutIds != null && packageName == null) {
@@ -475,13 +417,9 @@
public void pinShortcuts(String callingPackage, String packageName, List<String> ids,
UserHandle targetUser) {
ensureShortcutPermission(callingPackage);
- if (!canAccessProfile(callingPackage, targetUser, "Cannot pin shortcuts")) {
+ if (!canAccessProfile(targetUser.getIdentifier(), "Cannot pin shortcuts")) {
return;
}
- if (!isUserEnabled(targetUser)) {
- throw new IllegalStateException("Cannot pin shortcuts for disabled profile "
- + targetUser);
- }
mShortcutServiceInternal.pinShortcuts(getCallingUserId(),
callingPackage, packageName, ids, targetUser.getIdentifier());
@@ -491,10 +429,7 @@
public int getShortcutIconResId(String callingPackage, String packageName, String id,
int targetUserId) {
ensureShortcutPermission(callingPackage);
- if (!canAccessProfile(callingPackage, targetUserId, "Cannot access shortcuts")) {
- return 0;
- }
- if (!isUserEnabled(targetUserId)) {
+ if (!canAccessProfile(targetUserId, "Cannot access shortcuts")) {
return 0;
}
@@ -506,10 +441,7 @@
public ParcelFileDescriptor getShortcutIconFd(String callingPackage,
String packageName, String id, int targetUserId) {
ensureShortcutPermission(callingPackage);
- if (!canAccessProfile(callingPackage, targetUserId, "Cannot access shortcuts")) {
- return null;
- }
- if (!isUserEnabled(targetUserId)) {
+ if (!canAccessProfile(targetUserId, "Cannot access shortcuts")) {
return null;
}
@@ -528,13 +460,9 @@
public boolean startShortcut(String callingPackage, String packageName, String shortcutId,
Rect sourceBounds, Bundle startActivityOptions, int targetUserId) {
verifyCallingPackage(callingPackage);
- if (!canAccessProfile(callingPackage, targetUserId, "Cannot start activity")) {
+ if (!canAccessProfile(targetUserId, "Cannot start activity")) {
return false;
}
- if (!isUserEnabled(targetUserId)) {
- throw new IllegalStateException("Cannot start a shortcut for disabled profile "
- + targetUserId);
- }
// Even without the permission, pinned shortcuts are always launchable.
if (!mShortcutServiceInternal.isPinnedByCaller(getCallingUserId(),
@@ -581,10 +509,7 @@
public boolean isActivityEnabled(
String callingPackage, ComponentName component, UserHandle user)
throws RemoteException {
- if (!canAccessProfile(callingPackage , user, "Cannot check component")) {
- return false;
- }
- if (!isUserEnabled(user)) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot check component")) {
return false;
}
@@ -607,12 +532,9 @@
public void startActivityAsUser(String callingPackage,
ComponentName component, Rect sourceBounds,
Bundle opts, UserHandle user) throws RemoteException {
- if (!canAccessProfile(callingPackage, user, "Cannot start activity")) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot start activity")) {
return;
}
- if (!isUserEnabled(user)) {
- throw new IllegalStateException("Cannot start activity for disabled profile " + user);
- }
Intent launchIntent = new Intent(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
@@ -665,13 +587,9 @@
@Override
public void showAppDetailsAsUser(String callingPackage, ComponentName component,
Rect sourceBounds, Bundle opts, UserHandle user) throws RemoteException {
- if (!canAccessProfile(callingPackage, user, "Cannot show app details")) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot show app details")) {
return;
}
- if (!isUserEnabled(user)) {
- throw new IllegalStateException("Cannot show app details for disabled profile "
- + user);
- }
long ident = Binder.clearCallingIdentity();
try {
@@ -688,39 +606,10 @@
/** Checks if user is a profile of or same as listeningUser.
* and the user is enabled. */
- private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser,
+ private boolean isEnabledProfileOf(UserHandle listeningUser, UserHandle user,
String debugMsg) {
- if (user.getIdentifier() == listeningUser.getIdentifier()) {
- if (DEBUG) Log.d(TAG, "Delivering msg to same user: " + debugMsg);
- return true;
- }
- if (mUm.isManagedProfile(listeningUser.getIdentifier())) {
- if (DEBUG) Log.d(TAG, "Managed profile can't see other profiles: " + debugMsg);
- return false;
- }
- long ident = injectClearCallingIdentity();
- try {
- UserInfo userInfo = mUm.getUserInfo(user.getIdentifier());
- UserInfo listeningUserInfo = mUm.getUserInfo(listeningUser.getIdentifier());
- if (userInfo == null || listeningUserInfo == null
- || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID
- || userInfo.profileGroupId != listeningUserInfo.profileGroupId
- || !userInfo.isEnabled()) {
- if (DEBUG) {
- Log.d(TAG, "Not delivering msg from " + user + " to " + listeningUser + ":"
- + debugMsg);
- }
- return false;
- } else {
- if (DEBUG) {
- Log.d(TAG, "Delivering msg from " + user + " to " + listeningUser + ":"
- + debugMsg);
- }
- return true;
- }
- } finally {
- injectRestoreCallingIdentity(ident);
- }
+ return mUserManagerInternal.isProfileAccessible(listeningUser.getIdentifier(),
+ user.getIdentifier(), debugMsg, false);
}
@VisibleForTesting
@@ -740,7 +629,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onPackageAdded")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onPackageAdded")) continue;
try {
listener.onPackageAdded(user, packageName);
} catch (RemoteException re) {
@@ -762,7 +651,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onPackageRemoved")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onPackageRemoved")) continue;
try {
listener.onPackageRemoved(user, packageName);
} catch (RemoteException re) {
@@ -784,7 +673,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onPackageModified")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onPackageModified")) continue;
try {
listener.onPackageChanged(user, packageName);
} catch (RemoteException re) {
@@ -806,7 +695,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onPackagesAvailable")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onPackagesAvailable")) continue;
try {
listener.onPackagesAvailable(user, packages, isReplacing());
} catch (RemoteException re) {
@@ -828,7 +717,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnavailable")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onPackagesUnavailable")) continue;
try {
listener.onPackagesUnavailable(user, packages, isReplacing());
} catch (RemoteException re) {
@@ -850,7 +739,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onPackagesSuspended")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onPackagesSuspended")) continue;
try {
listener.onPackagesSuspended(user, packages);
} catch (RemoteException re) {
@@ -872,7 +761,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnsuspended")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onPackagesUnsuspended")) continue;
try {
listener.onPackagesUnsuspended(user, packages);
} catch (RemoteException re) {
@@ -901,7 +790,7 @@
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
- if (!isEnabledProfileOf(user, cookie.user, "onShortcutChanged")) continue;
+ if (!isEnabledProfileOf(cookie.user, user, "onShortcutChanged")) continue;
final int launcherUserId = cookie.user.getIdentifier();
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 6513683..f12795b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -176,7 +176,6 @@
import android.content.pm.PackageParser.PackageParserException;
import android.content.pm.PackageParser.ParseFlags;
import android.content.pm.PackageParser.ServiceIntentInfo;
-import android.content.pm.PackageParser.SigningDetails;
import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion;
import android.content.pm.PackageStats;
import android.content.pm.PackageUserState;
@@ -2981,9 +2980,6 @@
}
}
}
- // Adjust seInfo to ensure apps which share a sharedUserId are placed in the same
- // SELinux domain.
- setting.fixSeInfoLocked();
}
// Now that we know all the packages we are keeping,
@@ -4096,8 +4092,15 @@
return false;
}
if (callerIsInstantApp) {
- // request for a specific component; if it hasn't been explicitly exposed, filter
+ // request for a specific component; if it hasn't been explicitly exposed through
+ // property or instrumentation target, filter
if (component != null) {
+ final PackageParser.Instrumentation instrumentation =
+ mInstrumentation.get(component);
+ if (instrumentation != null
+ && isCallerSameApp(instrumentation.info.targetPackage, callingUid)) {
+ return false;
+ }
return !isComponentVisibleToInstantApp(component, componentType);
}
// request for application; if no components have been explicitly exposed, filter
@@ -10373,24 +10376,20 @@
pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
}
- // Apps which share a sharedUserId must be placed in the same selinux domain. If this
- // package is the first app installed as this shared user, set seInfoTargetSdkVersion to its
- // targetSdkVersion. These are later adjusted in PackageManagerService's constructor to be
- // the lowest targetSdkVersion of all apps within the shared user, which corresponds to the
- // least restrictive selinux domain.
- // NOTE: As new packages are installed / updated, the shared user's seinfoTargetSdkVersion
- // will NOT be modified until next boot, even if a lower targetSdkVersion is used. This
- // ensures that all packages continue to run in the same selinux domain.
- final int targetSdkVersion =
- ((sharedUserSetting != null) && (sharedUserSetting.packages.size() != 0)) ?
- sharedUserSetting.seInfoTargetSdkVersion : pkg.applicationInfo.targetSdkVersion;
+ // SELinux sandboxes become more restrictive as targetSdkVersion increases.
+ // To ensure that apps with sharedUserId are placed in the same selinux domain
+ // without breaking any assumptions about access, put them into the least
+ // restrictive targetSdkVersion=25 domain.
+ // TODO(b/72290969): Base this on the actual targetSdkVersion(s) of the apps within the
+ // sharedUserSetting, instead of defaulting to the least restrictive domain.
+ final int targetSdk = (sharedUserSetting != null) ? 25
+ : pkg.applicationInfo.targetSdkVersion;
// TODO(b/71593002): isPrivileged for sharedUser and appInfo should never be out of sync.
// They currently can be if the sharedUser apps are signed with the platform key.
final boolean isPrivileged = (sharedUserSetting != null) ?
sharedUserSetting.isPrivileged() | pkg.isPrivileged() : pkg.isPrivileged();
- pkg.applicationInfo.seInfo = SELinuxMMAC.getSeInfo(pkg, isPrivileged,
- pkg.applicationInfo.targetSandboxVersion, targetSdkVersion);
+ SELinuxMMAC.assignSeInfoValue(pkg, isPrivileged, targetSdk);
pkg.mExtras = pkgSetting;
pkg.applicationInfo.processName = fixProcessName(
@@ -23329,39 +23328,6 @@
}
@Override
- public boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName) {
- SigningDetails sd = getSigningDetails(packageName);
- if (sd == null) {
- return false;
- }
- return sd.hasSha256Certificate(restoringFromSigHash,
- SigningDetails.CertCapabilities.INSTALLED_DATA);
- }
-
- @Override
- public boolean isDataRestoreSafe(Signature restoringFromSig, String packageName) {
- SigningDetails sd = getSigningDetails(packageName);
- if (sd == null) {
- return false;
- }
- return sd.hasCertificate(restoringFromSig,
- SigningDetails.CertCapabilities.INSTALLED_DATA);
- }
-
- private SigningDetails getSigningDetails(String packageName) {
- synchronized (mPackages) {
- if (packageName == null) {
- return null;
- }
- PackageParser.Package p = mPackages.get(packageName);
- if (p == null) {
- return null;
- }
- return p.mSigningDetails;
- }
- }
-
- @Override
public int getPermissionFlagsTEMP(String permName, String packageName, int userId) {
return PackageManagerService.this.getPermissionFlags(permName, packageName, userId);
}
diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java
index b47d966..a9f1528 100644
--- a/services/core/java/com/android/server/pm/SELinuxMMAC.java
+++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java
@@ -64,8 +64,6 @@
/** Required MAC permissions files */
private static List<File> sMacPermissions = new ArrayList<>();
- private static final String DEFAULT_SEINFO = "default";
-
// Append privapp to existing seinfo label
private static final String PRIVILEGED_APP_STR = ":privapp";
@@ -309,56 +307,45 @@
}
/**
- * Selects a security label to a package based on input parameters and the seinfo tag taken
- * from a matched policy. All signature based policy stanzas are consulted and, if no match
- * is found, the default seinfo label of 'default' is used. The security label is attached to
- * the ApplicationInfo instance of the package.
+ * Applies a security label to a package based on an seinfo tag taken from a matched
+ * policy. All signature based policy stanzas are consulted and, if no match is
+ * found, the default seinfo label of 'default' (set in ApplicationInfo object) is
+ * used. The security label is attached to the ApplicationInfo instance of the package
+ * in the event that a matching policy was found.
*
* @param pkg object representing the package to be labeled.
- * @param isPrivileged boolean.
- * @param targetSandboxVersion int.
- * @param targetSdkVersion int. If this pkg runs as a sharedUser, targetSdkVersion is the
- * greater of: lowest targetSdk for all pkgs in the sharedUser, or
- * MINIMUM_TARGETSDKVERSION.
- * @return String representing the resulting seinfo.
*/
- public static String getSeInfo(PackageParser.Package pkg, boolean isPrivileged,
- int targetSandboxVersion, int targetSdkVersion) {
- String seInfo = null;
+ public static void assignSeInfoValue(PackageParser.Package pkg, boolean isPrivileged,
+ int targetSdkVersion) {
synchronized (sPolicies) {
if (!sPolicyRead) {
if (DEBUG_POLICY) {
Slog.d(TAG, "Policy not read");
}
- } else {
- for (Policy policy : sPolicies) {
- seInfo = policy.getMatchedSeInfo(pkg);
- if (seInfo != null) {
- break;
- }
+ return;
+ }
+ for (Policy policy : sPolicies) {
+ String seInfo = policy.getMatchedSeInfo(pkg);
+ if (seInfo != null) {
+ pkg.applicationInfo.seInfo = seInfo;
+ break;
}
}
}
- if (seInfo == null) {
- seInfo = DEFAULT_SEINFO;
- }
-
- if (targetSandboxVersion == 2) {
- seInfo += SANDBOX_V2_STR;
- }
+ if (pkg.applicationInfo.targetSandboxVersion == 2)
+ pkg.applicationInfo.seInfo += SANDBOX_V2_STR;
if (isPrivileged) {
- seInfo += PRIVILEGED_APP_STR;
+ pkg.applicationInfo.seInfo += PRIVILEGED_APP_STR;
}
- seInfo += TARGETSDKVERSION_STR + targetSdkVersion;
+ pkg.applicationInfo.seInfo += TARGETSDKVERSION_STR + targetSdkVersion;
if (DEBUG_POLICY_INSTALL) {
Slog.i(TAG, "package (" + pkg.packageName + ") labeled with " +
- "seinfo=" + seInfo);
+ "seinfo=" + pkg.applicationInfo.seInfo);
}
- return seInfo;
}
}
diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java
index 1d9afd9..2446131 100644
--- a/services/core/java/com/android/server/pm/SharedUserSetting.java
+++ b/services/core/java/com/android/server/pm/SharedUserSetting.java
@@ -39,10 +39,6 @@
int uidFlags;
int uidPrivateFlags;
- // The lowest targetSdkVersion of all apps in the sharedUserSetting, used to assign seinfo so
- // that all apps within the sharedUser run in the same selinux context.
- int seInfoTargetSdkVersion;
-
final ArraySet<PackageSetting> packages = new ArraySet<PackageSetting>();
final PackageSignatures signatures = new PackageSignatures();
@@ -88,11 +84,6 @@
}
void addPackage(PackageSetting packageSetting) {
- // If this is the first package added to this shared user, temporarily (until next boot) use
- // its targetSdkVersion when assigning seInfo for the shared user.
- if ((packages.size() == 0) && (packageSetting.pkg != null)) {
- seInfoTargetSdkVersion = packageSetting.pkg.applicationInfo.targetSdkVersion;
- }
if (packages.add(packageSetting)) {
setFlags(this.pkgFlags | packageSetting.pkgFlags);
setPrivateFlags(this.pkgPrivateFlags | packageSetting.pkgPrivateFlags);
@@ -116,26 +107,4 @@
public boolean isPrivileged() {
return (this.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
}
-
- /**
- * Determine the targetSdkVersion for a sharedUser and update pkg.applicationInfo.seInfo
- * to ensure that all apps within the sharedUser share an SELinux domain. Use the lowest
- * targetSdkVersion of all apps within the shared user, which corresponds to the least
- * restrictive selinux domain.
- */
- public void fixSeInfoLocked() {
- final List<PackageParser.Package> pkgList = getPackages();
-
- for (PackageParser.Package pkg : pkgList) {
- if (pkg.applicationInfo.targetSdkVersion < seInfoTargetSdkVersion) {
- seInfoTargetSdkVersion = pkg.applicationInfo.targetSdkVersion;
- }
- }
- for (PackageParser.Package pkg : pkgList) {
- final boolean isPrivileged = isPrivileged() | pkg.isPrivileged();
- pkg.applicationInfo.seInfo = SELinuxMMAC.getSeInfo(pkg, isPrivileged,
- pkg.applicationInfo.targetSandboxVersion, seInfoTargetSdkVersion);
- }
- }
-
}
diff --git a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
index 44dd924..520ed25 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
@@ -18,12 +18,10 @@
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.ShortcutInfo;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.LocalServices;
import com.android.server.backup.BackupUtils;
import libcore.util.HexEncoding;
@@ -139,8 +137,7 @@
//@DisabledReason
public int canRestoreTo(ShortcutService s, PackageInfo currentPackage, boolean anyVersionOkay) {
- PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
- if (!BackupUtils.signaturesMatch(mSigHashes, currentPackage, pmi)) {
+ if (!BackupUtils.signaturesMatch(mSigHashes, currentPackage)) {
Slog.w(TAG, "Can't restore: Package signature mismatch");
return ShortcutInfo.DISABLED_REASON_SIGNATURE_MISMATCH;
}
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 70fb616..265cc8e 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -77,7 +77,7 @@
import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.os.UserManager;
+import android.os.UserManagerInternal;
import android.text.TextUtils;
import android.text.format.Time;
import android.util.ArraySet;
@@ -315,7 +315,7 @@
private final IPackageManager mIPackageManager;
private final PackageManagerInternal mPackageManagerInternal;
- private final UserManager mUserManager;
+ private final UserManagerInternal mUserManagerInternal;
private final UsageStatsManagerInternal mUsageStatsManagerInternal;
private final ActivityManagerInternal mActivityManagerInternal;
@@ -430,7 +430,8 @@
mIPackageManager = AppGlobals.getPackageManager();
mPackageManagerInternal = Preconditions.checkNotNull(
LocalServices.getService(PackageManagerInternal.class));
- mUserManager = Preconditions.checkNotNull(context.getSystemService(UserManager.class));
+ mUserManagerInternal = Preconditions.checkNotNull(
+ LocalServices.getService(UserManagerInternal.class));
mUsageStatsManagerInternal = Preconditions.checkNotNull(
LocalServices.getService(UsageStatsManagerInternal.class));
mActivityManagerInternal = Preconditions.checkNotNull(
@@ -1176,12 +1177,7 @@
// the user might just have been unlocked.
// Note we just don't use isUserUnlockingOrUnlocked() here, because it'll return false
// when the user is STOPPING, which we still want to consider as "unlocked".
- final long token = injectClearCallingIdentity();
- try {
- return mUserManager.isUserUnlockingOrUnlocked(userId);
- } finally {
- injectRestoreCallingIdentity(token);
- }
+ return mUserManagerInternal.isUserUnlockingOrUnlocked(userId);
}
// Requires mLock held, but "Locked" prefix would look weired so we jsut say "L".
@@ -3125,8 +3121,7 @@
try {
return mIPackageManager.getPackageInfo(
packageName, PACKAGE_MATCH_FLAGS
- | (getSignatures ? PackageManager.GET_SIGNING_CERTIFICATES : 0),
- userId);
+ | (getSignatures ? PackageManager.GET_SIGNATURES : 0), userId);
} catch (RemoteException e) {
// Shouldn't happen.
Slog.wtf(TAG, "RemoteException", e);
@@ -3494,13 +3489,7 @@
* itself.
*/
int getParentOrSelfUserId(int userId) {
- final long token = injectClearCallingIdentity();
- try {
- final UserInfo parent = mUserManager.getProfileParent(userId);
- return (parent != null) ? parent.id : userId;
- } finally {
- injectRestoreCallingIdentity(token);
- }
+ return mUserManagerInternal.getProfileParentId(userId);
}
void injectSendIntentSender(IntentSender intentSender, Intent extras) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 2c7df6c..ced2a7e 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -781,14 +781,7 @@
@Override
public int getProfileParentId(int userHandle) {
checkManageUsersPermission("get the profile parent");
- synchronized (mUsersLock) {
- UserInfo profileParent = getProfileParentLU(userHandle);
- if (profileParent == null) {
- return userHandle;
- }
-
- return profileParent.id;
- }
+ return mLocalService.getProfileParentId(userHandle);
}
private UserInfo getProfileParentLU(int userHandle) {
@@ -3928,6 +3921,56 @@
public boolean exists(int userId) {
return getUserInfoNoChecks(userId) != null;
}
+
+ @Override
+ public boolean isProfileAccessible(int callingUserId, int targetUserId, String debugMsg,
+ boolean throwSecurityException) {
+ if (targetUserId == callingUserId) {
+ return true;
+ }
+ synchronized (mUsersLock) {
+ UserInfo callingUserInfo = getUserInfoLU(callingUserId);
+ if (callingUserInfo == null || callingUserInfo.isManagedProfile()) {
+ if (throwSecurityException) {
+ throw new SecurityException(
+ debugMsg + " for another profile "
+ + targetUserId + " from " + callingUserId);
+ }
+ }
+
+ UserInfo targetUserInfo = getUserInfoLU(targetUserId);
+ if (targetUserInfo == null || !targetUserInfo.isEnabled()) {
+ // Do not throw any exception here as this could happen due to race conditions
+ // between the system updating its state and the client getting notified.
+ if (throwSecurityException) {
+ Slog.w(LOG_TAG, debugMsg + " for disabled profile "
+ + targetUserId + " from " + callingUserId);
+ }
+ return false;
+ }
+
+ if (targetUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID ||
+ targetUserInfo.profileGroupId != callingUserInfo.profileGroupId) {
+ if (throwSecurityException) {
+ throw new SecurityException(
+ debugMsg + " for unrelated profile " + targetUserId);
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getProfileParentId(int userId) {
+ synchronized (mUsersLock) {
+ UserInfo profileParent = getProfileParentLU(userId);
+ if (profileParent == null) {
+ return userId;
+ }
+ return profileParent.id;
+ }
+ }
}
/* Remove all the users except of the system one. */
diff --git a/services/core/java/com/android/server/updates/CarrierIdInstallReceiver.java b/services/core/java/com/android/server/updates/CarrierIdInstallReceiver.java
index 0450816..a123304 100644
--- a/services/core/java/com/android/server/updates/CarrierIdInstallReceiver.java
+++ b/services/core/java/com/android/server/updates/CarrierIdInstallReceiver.java
@@ -22,7 +22,6 @@
import android.content.Intent;
import android.net.Uri;
import android.provider.Telephony;
-import android.util.Log;
public class CarrierIdInstallReceiver extends ConfigUpdateInstallReceiver {
@@ -33,7 +32,7 @@
@Override
protected void postInstall(Context context, Intent intent) {
ContentResolver resolver = context.getContentResolver();
- resolver.update(Uri.withAppendedPath(Telephony.CarrierIdentification.All.CONTENT_URI,
+ resolver.update(Uri.withAppendedPath(Telephony.CarrierId.All.CONTENT_URI,
"update_db"), new ContentValues(), null, null);
}
}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 397c50f..8901b04 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -458,7 +458,7 @@
if (cropFile != null) {
Bitmap bitmap = BitmapFactory.decodeFile(cropFile);
if (bitmap != null) {
- colors = WallpaperColors.fromBitmap(bitmap);
+ colors = WallpaperColors.fromBitmap(bitmap, true /* computeHints */);
bitmap.recycle();
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index c5b270e..2398661 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2291,9 +2291,10 @@
}
mPowerManagerWrapper.wakeUp(SystemClock.uptimeMillis(),
"android.server.wm:TURN_ON");
- }
- if (mAppToken != null) {
- mAppToken.setCanTurnScreenOn(false);
+
+ if (mAppToken != null) {
+ mAppToken.setCanTurnScreenOn(false);
+ }
}
// If we were already visible, skip rest of preparation.
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6a468b1..ab8a6c4 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -332,8 +332,6 @@
private static final String ATTR_APPLICATION_RESTRICTIONS_MANAGER
= "application-restrictions-manager";
- private static final String MANAGED_PROVISIONING_PKG = "com.android.managedprovisioning";
-
// Comprehensive list of delegations.
private static final String DELEGATIONS[] = {
DELEGATION_CERT_INSTALL,
@@ -766,7 +764,7 @@
// Notify ManagedProvisioning to update the built-in cross profile intent filters.
Intent intent = new Intent(
DevicePolicyManager.ACTION_DATA_SHARING_RESTRICTION_CHANGED);
- intent.setPackage(MANAGED_PROVISIONING_PKG);
+ intent.setPackage(getManagedProvisioningPackage(mContext));
intent.putExtra(Intent.EXTRA_USER_ID, userId);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM);
@@ -8957,7 +8955,7 @@
.putExtra(
DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
leaveAllSystemAppsEnabled)
- .setPackage(MANAGED_PROVISIONING_PKG)
+ .setPackage(getManagedProvisioningPackage(mContext))
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM);
@@ -11591,7 +11589,7 @@
if (profileOwner == null) {
return false;
}
-
+
final Set<String> userAffiliationIds = getUserData(userId).mAffiliationIds;
final Set<String> deviceAffiliationIds =
getUserData(UserHandle.USER_SYSTEM).mAffiliationIds;
@@ -13093,4 +13091,8 @@
metrics.symbols);
}
}
+
+ private static String getManagedProvisioningPackage(Context context) {
+ return context.getResources().getString(R.string.config_managed_provisioning_package);
+ }
}
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java
index 1f370a5..9863370 100644
--- a/services/net/java/android/net/ip/IpClient.java
+++ b/services/net/java/android/net/ip/IpClient.java
@@ -540,6 +540,8 @@
// TODO: Revert this hack once IpClient and Nat464Xlat work in concert.
private static final String CLAT_PREFIX = "v4-";
+ private static final int IMMEDIATE_FAILURE_DURATION = 0;
+
private final State mStoppedState = new StoppedState();
private final State mStoppingState = new StoppingState();
private final State mStartedState = new StartedState();
@@ -551,6 +553,7 @@
private final String mClatInterfaceName;
@VisibleForTesting
protected final Callback mCallback;
+ private final Dependencies mDependencies;
private final CountDownLatch mShutdownLatch;
private final INetworkManagementService mNwService;
private final NetlinkTracker mNetlinkTracker;
@@ -579,10 +582,23 @@
private boolean mMulticastFiltering;
private long mStartTimeMillis;
+ public static class Dependencies {
+ public INetworkManagementService getNMS() {
+ return INetworkManagementService.Stub.asInterface(
+ ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
+ }
+
+ public INetd getNetd() {
+ return NetdService.getInstance();
+ }
+
+ public InterfaceParams getInterfaceParams(String ifname) {
+ return InterfaceParams.getByName(ifname);
+ }
+ }
+
public IpClient(Context context, String ifName, Callback callback) {
- this(context, ifName, callback, INetworkManagementService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)),
- NetdService.getInstance());
+ this(context, ifName, callback, new Dependencies());
}
/**
@@ -591,27 +607,35 @@
*/
public IpClient(Context context, String ifName, Callback callback,
INetworkManagementService nwService) {
- this(context, ifName, callback, nwService, NetdService.getInstance());
+ this(context, ifName, callback, new Dependencies() {
+ @Override
+ public INetworkManagementService getNMS() { return nwService; }
+ });
}
@VisibleForTesting
- IpClient(Context context, String ifName, Callback callback,
- INetworkManagementService nwService, INetd netd) {
+ IpClient(Context context, String ifName, Callback callback, Dependencies deps) {
super(IpClient.class.getSimpleName() + "." + ifName);
+ Preconditions.checkNotNull(ifName);
+ Preconditions.checkNotNull(callback);
+
mTag = getName();
mContext = context;
mInterfaceName = ifName;
mClatInterfaceName = CLAT_PREFIX + ifName;
mCallback = new LoggingCallbackWrapper(callback);
+ mDependencies = deps;
mShutdownLatch = new CountDownLatch(1);
- mNwService = nwService;
+ mNwService = deps.getNMS();
mLog = new SharedLog(MAX_LOG_RECORDS, mTag);
mConnectivityPacketLog = new LocalLog(MAX_PACKET_RECORDS);
mMsgStateLogger = new MessageHandlingLogger();
- mInterfaceCtrl = new InterfaceController(mInterfaceName, mNwService, netd, mLog);
+ // TODO: Consider creating, constructing, and passing in some kind of
+ // InterfaceController.Dependencies class.
+ mInterfaceCtrl = new InterfaceController(mInterfaceName, mNwService, deps.getNetd(), mLog);
mNetlinkTracker = new NetlinkTracker(
mInterfaceName,
@@ -742,11 +766,11 @@
return;
}
- mInterfaceParams = InterfaceParams.getByName(mInterfaceName);
+ mInterfaceParams = mDependencies.getInterfaceParams(mInterfaceName);
if (mInterfaceParams == null) {
logError("Failed to find InterfaceParams for " + mInterfaceName);
- // TODO: call doImmediateProvisioningFailure() with an error code
- // indicating something like "interface not ready".
+ doImmediateProvisioningFailure(IpManagerEvent.ERROR_INTERFACE_NOT_FOUND);
+ return;
}
mCallback.setNeighborDiscoveryOffload(true);
@@ -930,8 +954,11 @@
}
private void recordMetric(final int type) {
- if (mStartTimeMillis <= 0) { Log.wtf(mTag, "Start time undefined!"); }
- final long duration = SystemClock.elapsedRealtime() - mStartTimeMillis;
+ // We may record error metrics prior to starting.
+ // Map this to IMMEDIATE_FAILURE_DURATION.
+ final long duration = (mStartTimeMillis > 0)
+ ? (SystemClock.elapsedRealtime() - mStartTimeMillis)
+ : IMMEDIATE_FAILURE_DURATION;
mMetricsLog.log(mInterfaceName, new IpManagerEvent(type, duration));
}
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 3898145..508a43d 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -144,20 +144,7 @@
}
public IpManager(Context context, String ifName, Callback callback) {
- this(context, ifName, callback, INetworkManagementService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)),
- NetdService.getInstance());
- }
-
- public IpManager(Context context, String ifName, Callback callback,
- INetworkManagementService nwService) {
- this(context, ifName, callback, nwService, NetdService.getInstance());
- }
-
- @VisibleForTesting
- public IpManager(Context context, String ifName, Callback callback,
- INetworkManagementService nwService, INetd netd) {
- super(context, ifName, callback, nwService, netd);
+ super(context, ifName, callback);
}
public void startProvisioning(ProvisioningConfiguration req) {
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 568d7a7..372b8cc 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -61,6 +61,7 @@
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WATCH_APPOPS" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!-- Uses API introduced in O (26) -->
<uses-sdk android:minSdkVersion="1"
diff --git a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
index 8005bc7..5518ca5 100644
--- a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import static com.android.server.am.MemoryStatUtil.parseMemoryStatFromMemcg;
+import static com.android.server.am.MemoryStatUtil.parseMemoryStatFromProcfs;
import static com.android.server.am.MemoryStatUtil.MemoryStat;
import static org.junit.Assert.assertEquals;
@@ -31,58 +32,131 @@
@RunWith(AndroidJUnit4.class)
@SmallTest
public class MemoryStatUtilTest {
- private String MEMORY_STAT_CONTENTS = String.join(
- "\n",
- "cache 96", // keep different from total_cache to catch reading wrong value
- "rss 97", // keep different from total_rss to catch reading wrong value
- "rss_huge 0",
- "mapped_file 524288",
- "writeback 0",
- "swap 95", // keep different from total_rss to catch reading wrong value
- "pgpgin 16717",
- "pgpgout 5037",
- "pgfault 99", // keep different from total_pgfault to catch reading wrong value
- "pgmajfault 98", // keep different from total_pgmajfault to catch reading wrong value
- "inactive_anon 503808",
- "active_anon 46309376",
- "inactive_file 876544",
- "active_file 81920",
- "unevictable 0",
- "hierarchical_memory_limit 18446744073709551615",
- "hierarchical_memsw_limit 18446744073709551615",
- "total_cache 4",
- "total_rss 3",
- "total_rss_huge 0",
- "total_mapped_file 524288",
- "total_writeback 0",
- "total_swap 5",
- "total_pgpgin 16717",
- "total_pgpgout 5037",
- "total_pgfault 1",
- "total_pgmajfault 2",
- "total_inactive_anon 503808",
- "total_active_anon 46309376",
- "total_inactive_file 876544",
- "total_active_file 81920",
- "total_unevictable 0");
+ private String MEMORY_STAT_CONTENTS = String.join(
+ "\n",
+ "cache 96", // keep different from total_cache to catch reading wrong value
+ "rss 97", // keep different from total_rss to catch reading wrong value
+ "rss_huge 0",
+ "mapped_file 524288",
+ "writeback 0",
+ "swap 95", // keep different from total_rss to catch reading wrong value
+ "pgpgin 16717",
+ "pgpgout 5037",
+ "pgfault 99", // keep different from total_pgfault to catch reading wrong value
+ "pgmajfault 98", // keep different from total_pgmajfault to catch reading wrong value
+ "inactive_anon 503808",
+ "active_anon 46309376",
+ "inactive_file 876544",
+ "active_file 81920",
+ "unevictable 0",
+ "hierarchical_memory_limit 18446744073709551615",
+ "hierarchical_memsw_limit 18446744073709551615",
+ "total_cache 4",
+ "total_rss 3",
+ "total_rss_huge 0",
+ "total_mapped_file 524288",
+ "total_writeback 0",
+ "total_swap 5",
+ "total_pgpgin 16717",
+ "total_pgpgout 5037",
+ "total_pgfault 1",
+ "total_pgmajfault 2",
+ "total_inactive_anon 503808",
+ "total_active_anon 46309376",
+ "total_inactive_file 876544",
+ "total_active_file 81920",
+ "total_unevictable 0");
+ private String PROC_STAT_CONTENTS = String.join(
+ " ",
+ "1040",
+ "(system_server)",
+ "S",
+ "544",
+ "544",
+ "0",
+ "0",
+ "-1",
+ "1077936448",
+ "1", // this is pgfault
+ "0",
+ "2", // this is pgmajfault
+ "0",
+ "44533",
+ "13471",
+ "0",
+ "0",
+ "18",
+ "-2",
+ "117",
+ "0",
+ "2206",
+ "1257177088",
+ "3", // this is rss in bytes
+ "4294967295",
+ "2936971264",
+ "2936991289",
+ "3198888320",
+ "3198879848",
+ "2903927664",
+ "0",
+ "4612",
+ "0",
+ "1073775864",
+ "4294967295",
+ "0",
+ "0",
+ "17",
+ "0",
+ "0",
+ "0",
+ "0",
+ "0",
+ "0",
+ "2936999088",
+ "2936999936",
+ "2958692352",
+ "3198888595",
+ "3198888671",
+ "3198888671",
+ "3198889956",
+ "0");
- @Test
- public void testParseMemoryStat_parsesCorrectValues() throws Exception {
- MemoryStat stat = parseMemoryStatFromMemcg(MEMORY_STAT_CONTENTS);
- assertEquals(stat.pgfault, 1);
- assertEquals(stat.pgmajfault, 2);
- assertEquals(stat.rssInBytes, 3);
- assertEquals(stat.cacheInBytes, 4);
- assertEquals(stat.swapInBytes, 5);
- }
+ @Test
+ public void testParseMemoryStatFromMemcg_parsesCorrectValues() throws Exception {
+ MemoryStat stat = parseMemoryStatFromMemcg(MEMORY_STAT_CONTENTS);
+ assertEquals(stat.pgfault, 1);
+ assertEquals(stat.pgmajfault, 2);
+ assertEquals(stat.rssInBytes, 3);
+ assertEquals(stat.cacheInBytes, 4);
+ assertEquals(stat.swapInBytes, 5);
+ }
- @Test
- public void testParseMemoryStat_emptyMemoryStatContents() throws Exception {
- MemoryStat stat = parseMemoryStatFromMemcg("");
- assertNull(stat);
+ @Test
+ public void testParseMemoryStatFromMemcg_emptyMemoryStatContents() throws Exception {
+ MemoryStat stat = parseMemoryStatFromMemcg("");
+ assertNull(stat);
- stat = parseMemoryStatFromMemcg(null);
- assertNull(stat);
- }
+ stat = parseMemoryStatFromMemcg(null);
+ assertNull(stat);
+ }
+
+ @Test
+ public void testParseMemoryStatFromProcfs_parsesCorrectValues() throws Exception {
+ MemoryStat stat = parseMemoryStatFromProcfs(PROC_STAT_CONTENTS);
+ assertEquals(1, stat.pgfault);
+ assertEquals(2, stat.pgmajfault);
+ assertEquals(3, stat.rssInBytes);
+ assertEquals(0, stat.cacheInBytes);
+ assertEquals(0, stat.swapInBytes);
+ }
+
+ @Test
+ public void testParseMemoryStatFromProcfs_emptyContents() throws Exception {
+ MemoryStat stat = parseMemoryStatFromProcfs("");
+ assertNull(stat);
+
+ stat = parseMemoryStatFromProcfs(null);
+ assertNull(stat);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
index 8ccacb8..86c83d6 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
@@ -18,14 +18,9 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Process;
import android.platform.test.annotations.Presubmit;
@@ -35,7 +30,6 @@
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.testutils.PackageManagerStub;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -51,14 +45,7 @@
private static final Signature SIGNATURE_3 = generateSignature((byte) 3);
private static final Signature SIGNATURE_4 = generateSignature((byte) 4);
- private PackageManagerStub mPackageManagerStub;
- private PackageManagerInternal mMockPackageManagerInternal;
-
- @Before
- public void setUp() throws Exception {
- mPackageManagerStub = new PackageManagerStub();
- mMockPackageManagerInternal = mock(PackageManagerInternal.class);
- }
+ private final PackageManagerStub mPackageManagerStub = new PackageManagerStub();
@Test
public void appIsEligibleForBackup_backupNotAllowed_returnsFalse() throws Exception {
@@ -371,8 +358,7 @@
@Test
public void signaturesMatch_targetIsNull_returnsFalse() throws Exception {
- boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, null,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, null);
assertThat(result).isFalse();
}
@@ -383,8 +369,7 @@
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
- boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo);
assertThat(result).isTrue();
}
@@ -393,11 +378,10 @@
public void signaturesMatch_disallowsUnsignedApps_storedSignatureNull_returnsFalse()
throws Exception {
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signatures = new Signature[] {SIGNATURE_1};
packageInfo.applicationInfo = new ApplicationInfo();
- boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(null, packageInfo);
assertThat(result).isFalse();
}
@@ -406,11 +390,10 @@
public void signaturesMatch_disallowsUnsignedApps_storedSignatureEmpty_returnsFalse()
throws Exception {
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signatures = new Signature[] {SIGNATURE_1};
packageInfo.applicationInfo = new ApplicationInfo();
- boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo);
assertThat(result).isFalse();
}
@@ -421,11 +404,11 @@
signaturesMatch_disallowsUnsignedApps_targetSignatureEmpty_returnsFalse()
throws Exception {
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[0][0];
+ packageInfo.signatures = new Signature[0];
packageInfo.applicationInfo = new ApplicationInfo();
- boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1},
+ packageInfo);
assertThat(result).isFalse();
}
@@ -435,11 +418,11 @@
signaturesMatch_disallowsUnsignedApps_targetSignatureNull_returnsFalse()
throws Exception {
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = null;
+ packageInfo.signatures = null;
packageInfo.applicationInfo = new ApplicationInfo();
- boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1},
+ packageInfo);
assertThat(result).isFalse();
}
@@ -448,11 +431,10 @@
public void signaturesMatch_disallowsUnsignedApps_bothSignaturesNull_returnsFalse()
throws Exception {
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = null;
+ packageInfo.signatures = null;
packageInfo.applicationInfo = new ApplicationInfo();
- boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(null, packageInfo);
assertThat(result).isFalse();
}
@@ -461,11 +443,10 @@
public void signaturesMatch_disallowsUnsignedApps_bothSignaturesEmpty_returnsFalse()
throws Exception {
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[0][0];
+ packageInfo.signatures = new Signature[0];
packageInfo.applicationInfo = new ApplicationInfo();
- boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
- mMockPackageManagerInternal);
+ boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo);
assertThat(result).isFalse();
}
@@ -477,14 +458,11 @@
Signature signature3Copy = new Signature(SIGNATURE_3.toByteArray());
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signatures = new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3};
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
- new Signature[] {signature3Copy, signature1Copy, signature2Copy}, packageInfo,
- mMockPackageManagerInternal);
+ new Signature[]{signature3Copy, signature1Copy, signature2Copy}, packageInfo);
assertThat(result).isTrue();
}
@@ -495,14 +473,11 @@
Signature signature2Copy = new Signature(SIGNATURE_2.toByteArray());
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signatures = new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3};
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
- new Signature[]{signature2Copy, signature1Copy}, packageInfo,
- mMockPackageManagerInternal);
+ new Signature[]{signature2Copy, signature1Copy}, packageInfo);
assertThat(result).isTrue();
}
@@ -513,14 +488,11 @@
Signature signature2Copy = new Signature(SIGNATURE_2.toByteArray());
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {
- {signature1Copy, signature2Copy}
- };
+ packageInfo.signatures = new Signature[]{signature1Copy, signature2Copy};
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
- new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo,
- mMockPackageManagerInternal);
+ new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo);
assertThat(result).isFalse();
}
@@ -531,76 +503,11 @@
Signature signature2Copy = new Signature(SIGNATURE_2.toByteArray());
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signatures = new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3};
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
- new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void signaturesMatch_singleStoredSignatureNoRotation_returnsTrue()
- throws Exception {
- Signature signature1Copy = new Signature(SIGNATURE_1.toByteArray());
-
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
- packageInfo.packageName);
-
- boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy},
- packageInfo, mMockPackageManagerInternal);
-
- assertThat(result).isTrue();
- }
-
- @Test
- public void signaturesMatch_singleStoredSignatureWithRotationAssumeDataCapability_returnsTrue()
- throws Exception {
- Signature signature1Copy = new Signature(SIGNATURE_1.toByteArray());
-
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- // we know signature1Copy is in history, and we want to assume it has
- // SigningDetails.CertCapabilities.INSTALLED_DATA capability
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
- packageInfo.packageName);
-
- boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy},
- packageInfo, mMockPackageManagerInternal);
-
- assertThat(result).isTrue();
- }
-
- @Test
- public void
- signaturesMatch_singleStoredSignatureWithRotationAssumeNoDataCapability_returnsFalse()
- throws Exception {
- Signature signature1Copy = new Signature(SIGNATURE_1.toByteArray());
-
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- // we know signature1Copy is in history, but we want to assume it does not have
- // SigningDetails.CertCapabilities.INSTALLED_DATA capability
- doReturn(false).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
- packageInfo.packageName);
-
- boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy},
- packageInfo, mMockPackageManagerInternal);
+ new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo);
assertThat(result).isFalse();
}
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
index 5f052ce..0cdf04b 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
@@ -28,9 +28,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
@@ -40,7 +37,6 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Bundle;
import android.os.Process;
@@ -83,7 +79,6 @@
@Mock private BytesReadListener mBytesReadListenerMock;
@Mock private IBackupManagerMonitor mBackupManagerMonitorMock;
- @Mock private PackageManagerInternal mMockPackageManagerInternal;
private final PackageManagerStub mPackageManagerStub = new PackageManagerStub();
private Context mContext;
@@ -144,8 +139,7 @@
Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
fileMetadata);
RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
- mPackageManagerStub, false /* allowApks */, fileMetadata, signatures,
- mMockPackageManagerInternal);
+ mPackageManagerStub, false /* allowApks */, fileMetadata, signatures);
assertThat(restorePolicy).isEqualTo(RestorePolicy.IGNORE);
assertThat(fileMetadata.packageName).isEqualTo(TEST_PACKAGE_NAME);
@@ -158,8 +152,7 @@
signatures = tarBackupReader.readAppManifestAndReturnSignatures(
fileMetadata);
restorePolicy = tarBackupReader.chooseRestorePolicy(
- mPackageManagerStub, false /* allowApks */, fileMetadata, signatures,
- mMockPackageManagerInternal);
+ mPackageManagerStub, false /* allowApks */, fileMetadata, signatures);
assertThat(restorePolicy).isEqualTo(RestorePolicy.IGNORE);
assertThat(fileMetadata.packageName).isEqualTo(TEST_PACKAGE_NAME);
@@ -221,8 +214,7 @@
mBytesReadListenerMock, mBackupManagerMonitorMock);
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- true /* allowApks */, new FileMetadata(), null /* signatures */,
- mMockPackageManagerInternal);
+ true /* allowApks */, new FileMetadata(), null /* signatures */);
assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
verifyZeroInteractions(mBackupManagerMonitorMock);
@@ -242,8 +234,7 @@
PackageManagerStub.sPackageInfo = null;
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- true /* allowApks */, info, new Signature[0] /* signatures */,
- mMockPackageManagerInternal);
+ true /* allowApks */, info, new Signature[0] /* signatures */);
assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -267,8 +258,7 @@
PackageManagerStub.sPackageInfo = null;
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- true /* allowApks */, info, new Signature[0] /* signatures */,
- mMockPackageManagerInternal);
+ true /* allowApks */, info, new Signature[0] /* signatures */);
assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -293,8 +283,7 @@
PackageManagerStub.sPackageInfo = null;
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */,
- mMockPackageManagerInternal);
+ false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */);
assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -318,8 +307,7 @@
PackageManagerStub.sPackageInfo = packageInfo;
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */,
- mMockPackageManagerInternal);
+ false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */);
assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -345,8 +333,7 @@
PackageManagerStub.sPackageInfo = packageInfo;
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */,
- mMockPackageManagerInternal);
+ false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */);
assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -371,11 +358,11 @@
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_2}};
+ packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_2};
PackageManagerStub.sPackageInfo = packageInfo;
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, new FileMetadata(), signatures, mMockPackageManagerInternal);
+ false /* allowApks */, new FileMetadata(), signatures);
assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -396,19 +383,16 @@
Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.flags |=
ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.SYSTEM_UID;
packageInfo.applicationInfo.backupAgentName = "backup.agent";
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
PackageManagerStub.sPackageInfo = packageInfo;
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
- packageInfo.packageName);
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, new FileMetadata(), signatures, mMockPackageManagerInternal);
+ false /* allowApks */, new FileMetadata(), signatures);
assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -428,19 +412,16 @@
Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.flags |=
ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
PackageManagerStub.sPackageInfo = packageInfo;
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
- packageInfo.packageName);
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, new FileMetadata(), signatures, mMockPackageManagerInternal);
+ false /* allowApks */, new FileMetadata(), signatures);
assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -463,20 +444,17 @@
info.version = 1;
PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
packageInfo.versionCode = 2;
PackageManagerStub.sPackageInfo = packageInfo;
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
- packageInfo.packageName);
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, info, signatures, mMockPackageManagerInternal);
+ false /* allowApks */, info, signatures);
assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
@@ -501,20 +479,17 @@
info.hasApk = true;
PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
packageInfo.versionCode = 1;
PackageManagerStub.sPackageInfo = packageInfo;
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
- packageInfo.packageName);
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- true /* allowApks */, info, signatures, mMockPackageManagerInternal);
+ true /* allowApks */, info, signatures);
assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
verifyNoMoreInteractions(mBackupManagerMonitorMock);
@@ -535,20 +510,17 @@
info.version = 2;
PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
packageInfo.versionCode = 1;
PackageManagerStub.sPackageInfo = packageInfo;
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
- packageInfo.packageName);
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
- false /* allowApks */, info, signatures, mMockPackageManagerInternal);
+ false /* allowApks */, info, signatures);
assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index f58766f..e8170ee 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -4694,6 +4694,8 @@
}
public void testDisallowSharingIntoProfileSetRestriction() {
+ when(mServiceContext.resources.getString(R.string.config_managed_provisioning_package))
+ .thenReturn("com.android.managedprovisioning");
Bundle restriction = new Bundle();
restriction.putBoolean(UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, true);
@@ -4705,6 +4707,8 @@
}
public void testDisallowSharingIntoProfileClearRestriction() {
+ when(mServiceContext.resources.getString(R.string.config_managed_provisioning_package))
+ .thenReturn("com.android.managedprovisioning");
Bundle restriction = new Bundle();
restriction.putBoolean(UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, true);
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 4ca1647..51d27fe 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -23,6 +23,7 @@
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.makeBundle;
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.set;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
@@ -76,6 +77,7 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
+import android.os.UserManagerInternal;
import android.test.InstrumentationTestCase;
import android.test.mock.MockContext;
import android.util.ArrayMap;
@@ -90,8 +92,6 @@
import org.junit.Assert;
import org.mockito.ArgumentCaptor;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
@@ -111,7 +111,6 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
-import java.util.function.Function;
public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected static final String TAG = "ShortcutManagerTest";
@@ -604,6 +603,7 @@
protected PackageManager mMockPackageManager;
protected PackageManagerInternal mMockPackageManagerInternal;
protected UserManager mMockUserManager;
+ protected UserManagerInternal mMockUserManagerInternal;
protected UsageStatsManagerInternal mMockUsageStatsManagerInternal;
protected ActivityManagerInternal mMockActivityManagerInternal;
@@ -742,6 +742,7 @@
mMockPackageManager = mock(PackageManager.class);
mMockPackageManagerInternal = mock(PackageManagerInternal.class);
mMockUserManager = mock(UserManager.class);
+ mMockUserManagerInternal = mock(UserManagerInternal.class);
mMockUsageStatsManagerInternal = mock(UsageStatsManagerInternal.class);
mMockActivityManagerInternal = mock(ActivityManagerInternal.class);
@@ -751,6 +752,8 @@
LocalServices.addService(UsageStatsManagerInternal.class, mMockUsageStatsManagerInternal);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
LocalServices.addService(ActivityManagerInternal.class, mMockActivityManagerInternal);
+ LocalServices.removeServiceForTest(UserManagerInternal.class);
+ LocalServices.addService(UserManagerInternal.class, mMockUserManagerInternal);
// Prepare injection values.
@@ -782,50 +785,54 @@
deleteAllSavedFiles();
// Set up users.
- when(mMockUserManager.getUserInfo(anyInt())).thenAnswer(new AnswerWithSystemCheck<>(
- inv -> mUserInfos.get((Integer) inv.getArguments()[0])));
-
mUserInfos.put(USER_0, USER_INFO_0);
mUserInfos.put(USER_10, USER_INFO_10);
mUserInfos.put(USER_11, USER_INFO_11);
mUserInfos.put(USER_P0, USER_INFO_P0);
mUserInfos.put(USER_P1, USER_INFO_P1);
- // Set up isUserRunning and isUserUnlocked.
- when(mMockUserManager.isUserRunning(anyInt())).thenAnswer(new AnswerWithSystemCheck<>(
- inv -> b(mRunningUsers.get((Integer) inv.getArguments()[0]))));
-
- when(mMockUserManager.isUserUnlocked(anyInt()))
- .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
+ when(mMockUserManagerInternal.isUserUnlockingOrUnlocked(anyInt()))
+ .thenAnswer(inv -> {
final int userId = (Integer) inv.getArguments()[0];
return b(mRunningUsers.get(userId)) && b(mUnlockedUsers.get(userId));
- }));
- // isUserUnlockingOrUnlocked() return the same value as isUserUnlocked().
- when(mMockUserManager.isUserUnlockingOrUnlocked(anyInt()))
- .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
- final int userId = (Integer) inv.getArguments()[0];
- return b(mRunningUsers.get(userId)) && b(mUnlockedUsers.get(userId));
- }));
-
- when(mMockUserManager.getProfileParent(anyInt()))
- .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
+ });
+ when(mMockUserManagerInternal.getProfileParentId(anyInt()))
+ .thenAnswer(inv -> {
final int userId = (Integer) inv.getArguments()[0];
final UserInfo ui = mUserInfos.get(userId);
assertNotNull(ui);
if (ui.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID) {
- return null;
+ return userId;
}
final UserInfo parent = mUserInfos.get(ui.profileGroupId);
assertNotNull(parent);
- return parent;
- }));
- when(mMockUserManager.isManagedProfile(anyInt()))
- .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
- final int userId = (Integer) inv.getArguments()[0];
- final UserInfo ui = mUserInfos.get(userId);
- assertNotNull(ui);
- return ui.isManagedProfile();
- }));
+ return parent.id;
+ });
+
+ when(mMockUserManagerInternal.isProfileAccessible(anyInt(), anyInt(), anyString(),
+ anyBoolean())).thenAnswer(inv -> {
+ final int callingUserId = (Integer) inv.getArguments()[0];
+ final int targetUserId = (Integer) inv.getArguments()[1];
+ if (targetUserId == callingUserId) {
+ return true;
+ }
+ final UserInfo callingUserInfo = mUserInfos.get(callingUserId);
+ final UserInfo targetUserInfo = mUserInfos.get(targetUserId);
+ if (callingUserInfo == null || callingUserInfo.isManagedProfile()
+ || targetUserInfo == null || !targetUserInfo.isEnabled()) {
+ return false;
+ }
+ if (targetUserInfo.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
+ && targetUserInfo.profileGroupId == callingUserInfo.profileGroupId) {
+ return true;
+ }
+ final boolean isExternal = (Boolean) inv.getArguments()[3];
+ if (!isExternal) {
+ return false;
+ }
+ throw new SecurityException(inv.getArguments()[2] + " for unrelated profile "
+ + targetUserId);
+ });
when(mMockActivityManagerInternal.getUidProcessState(anyInt())).thenReturn(
ActivityManager.PROCESS_STATE_CACHED_EMPTY);
@@ -860,24 +867,6 @@
return (value != null && value);
}
- /**
- * Returns a boolean but also checks if the current UID is SYSTEM_UID.
- */
- protected class AnswerWithSystemCheck<T> implements Answer<T> {
- private final Function<InvocationOnMock, T> mChecker;
-
- public AnswerWithSystemCheck(Function<InvocationOnMock, T> checker) {
- mChecker = checker;
- }
-
- @Override
- public T answer(InvocationOnMock invocation) throws Throwable {
- assertEquals("Must be called on SYSTEM UID.",
- Process.SYSTEM_UID, mInjectedCallingUid);
- return mChecker.apply(invocation);
- }
- }
-
protected void setUpAppResources() throws Exception {
setUpAppResources(/* offset = */ 0);
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
index a0cefbf..c016e61 100644
--- a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
@@ -15,298 +15,73 @@
*/
package com.android.server.pm.backup;
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageParser.Package;
import android.content.pm.Signature;
+import android.test.AndroidTestCase;
import android.test.MoreAsserts;
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
import com.android.server.backup.BackupUtils;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import java.util.ArrayList;
import java.util.Arrays;
@SmallTest
-@Presubmit
-@RunWith(AndroidJUnit4.class)
-public class BackupUtilsTest {
+public class BackupUtilsTest extends AndroidTestCase {
- private static final Signature SIGNATURE_1 = generateSignature((byte) 1);
- private static final Signature SIGNATURE_2 = generateSignature((byte) 2);
- private static final Signature SIGNATURE_3 = generateSignature((byte) 3);
- private static final Signature SIGNATURE_4 = generateSignature((byte) 4);
- private static final byte[] SIGNATURE_HASH_1 = BackupUtils.hashSignature(SIGNATURE_1);
- private static final byte[] SIGNATURE_HASH_2 = BackupUtils.hashSignature(SIGNATURE_2);
- private static final byte[] SIGNATURE_HASH_3 = BackupUtils.hashSignature(SIGNATURE_3);
- private static final byte[] SIGNATURE_HASH_4 = BackupUtils.hashSignature(SIGNATURE_4);
-
- private PackageManagerInternal mMockPackageManagerInternal;
-
- @Before
- public void setUp() throws Exception {
- mMockPackageManagerInternal = mock(PackageManagerInternal.class);
+ private Signature[] genSignatures(String... signatures) {
+ final Signature[] sigs = new Signature[signatures.length];
+ for (int i = 0; i < signatures.length; i++){
+ sigs[i] = new Signature(signatures[i].getBytes());
+ }
+ return sigs;
}
- @Test
- public void signaturesMatch_targetIsNull_returnsFalse() throws Exception {
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, null,
- mMockPackageManagerInternal);
+ private PackageInfo genPackage(String... signatures) {
+ final PackageInfo pi = new PackageInfo();
+ pi.packageName = "package";
+ pi.applicationInfo = new ApplicationInfo();
+ pi.signatures = genSignatures(signatures);
- assertThat(result).isFalse();
+ return pi;
}
- @Test
- public void signaturesMatch_systemApplication_returnsTrue() throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.applicationInfo = new ApplicationInfo();
- packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+ public void testSignaturesMatch() {
+ final ArrayList<byte[]> stored1 = BackupUtils.hashSignatureArray(Arrays.asList(
+ "abc".getBytes()));
+ final ArrayList<byte[]> stored2 = BackupUtils.hashSignatureArray(Arrays.asList(
+ "abc".getBytes(), "def".getBytes()));
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
+ PackageInfo pi;
- assertThat(result).isTrue();
+ // False for null package.
+ assertFalse(BackupUtils.signaturesMatch(stored1, null));
+
+ // If it's a system app, signatures don't matter.
+ pi = genPackage("xyz");
+ pi.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+ assertTrue(BackupUtils.signaturesMatch(stored1, pi));
+
+ // Non system apps.
+ assertTrue(BackupUtils.signaturesMatch(stored1, genPackage("abc")));
+
+ // Superset is okay.
+ assertTrue(BackupUtils.signaturesMatch(stored1, genPackage("abc", "xyz")));
+ assertTrue(BackupUtils.signaturesMatch(stored1, genPackage("xyz", "abc")));
+
+ assertFalse(BackupUtils.signaturesMatch(stored1, genPackage("xyz")));
+ assertFalse(BackupUtils.signaturesMatch(stored1, genPackage("xyz", "def")));
+
+ assertTrue(BackupUtils.signaturesMatch(stored2, genPackage("def", "abc")));
+ assertTrue(BackupUtils.signaturesMatch(stored2, genPackage("x", "def", "abc", "y")));
+
+ // Subset is not okay.
+ assertFalse(BackupUtils.signaturesMatch(stored2, genPackage("abc")));
+ assertFalse(BackupUtils.signaturesMatch(stored2, genPackage("def")));
}
- @Test
- public void signaturesMatch_disallowsUnsignedApps_storedSignatureNull_returnsFalse()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- boolean result = BackupUtils.signaturesMatch(null, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void signaturesMatch_disallowsUnsignedApps_storedSignatureEmpty_returnsFalse()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
-
- @Test
- public void
- signaturesMatch_disallowsUnsignedApps_targetSignatureEmpty_returnsFalse()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[0][0];
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void
- signaturesMatch_disallowsUnsignedApps_targetSignatureNull_returnsFalse()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = null;
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void signaturesMatch_disallowsUnsignedApps_bothSignaturesNull_returnsFalse()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = null;
- packageInfo.applicationInfo = new ApplicationInfo();
-
- boolean result = BackupUtils.signaturesMatch(null, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void signaturesMatch_disallowsUnsignedApps_bothSignaturesEmpty_returnsFalse()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[0][0];
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void signaturesMatch_equalSignatures_returnsTrue() throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- storedSigHashes.add(SIGNATURE_HASH_2);
- storedSigHashes.add(SIGNATURE_HASH_3);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isTrue();
- }
-
- @Test
- public void signaturesMatch_extraSignatureInTarget_returnsTrue() throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- storedSigHashes.add(SIGNATURE_HASH_2);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isTrue();
- }
-
- @Test
- public void signaturesMatch_extraSignatureInStored_returnsFalse() throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1, SIGNATURE_2}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- storedSigHashes.add(SIGNATURE_HASH_2);
- storedSigHashes.add(SIGNATURE_HASH_3);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void signaturesMatch_oneNonMatchingSignature_returnsFalse() throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
- packageInfo.applicationInfo = new ApplicationInfo();
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- storedSigHashes.add(SIGNATURE_HASH_2);
- storedSigHashes.add(SIGNATURE_HASH_4);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void signaturesMatch_singleStoredSignatureNoRotation_returnsTrue()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(SIGNATURE_HASH_1,
- packageInfo.packageName);
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isTrue();
- }
-
- @Test
- public void signaturesMatch_singleStoredSignatureWithRotationAssumeDataCapability_returnsTrue()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- // we know SIGNATURE_1 is in history, and we want to assume it has
- // SigningDetails.CertCapabilities.INSTALLED_DATA capability
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(SIGNATURE_HASH_1,
- packageInfo.packageName);
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isTrue();
- }
-
- @Test
- public void
- signaturesMatch_singleStoredSignatureWithRotationAssumeNoDataCapability_returnsFalse()
- throws Exception {
- PackageInfo packageInfo = new PackageInfo();
- packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
- packageInfo.applicationInfo = new ApplicationInfo();
-
- // we know SIGNATURE_1 is in history, but we want to assume it does not have
- // SigningDetails.CertCapabilities.INSTALLED_DATA capability
- doReturn(false).when(mMockPackageManagerInternal).isDataRestoreSafe(SIGNATURE_HASH_1,
- packageInfo.packageName);
-
- ArrayList<byte[]> storedSigHashes = new ArrayList<>();
- storedSigHashes.add(SIGNATURE_HASH_1);
- boolean result = BackupUtils.signaturesMatch(storedSigHashes, packageInfo,
- mMockPackageManagerInternal);
-
- assertThat(result).isFalse();
- }
-
- @Test
public void testHashSignature() {
final byte[] sig1 = "abc".getBytes();
final byte[] sig2 = "def".getBytes();
@@ -340,10 +115,4 @@
MoreAsserts.assertEquals(hash2a, listA.get(1));
MoreAsserts.assertEquals(hash2a, listB.get(1));
}
-
- private static Signature generateSignature(byte i) {
- byte[] signatureBytes = new byte[256];
- signatureBytes[0] = i;
- return new Signature(signatureBytes);
- }
}
diff --git a/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java b/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java
index 9c010a0..4d99b32 100644
--- a/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java
@@ -20,6 +20,8 @@
import static org.junit.Assert.assertTrue;
import android.app.WallpaperColors;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
@@ -85,4 +87,17 @@
assertEquals("OnComputeColors should have been deferred.",
0, eventCountdown.getCount());
}
+
+ @Test
+ public void testFromDrawableTest_doesntComputeHints() {
+ WallpaperColors wallpaperColors = WallpaperColors.fromDrawable(
+ new ColorDrawable(Color.BLACK));
+ assertEquals("WallpaperColors should not support dark theme.", 0,
+ wallpaperColors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_THEME);
+
+ wallpaperColors = WallpaperColors.fromDrawable(
+ new ColorDrawable(Color.WHITE));
+ assertEquals("WallpaperColors should not support dark text.", 0,
+ wallpaperColors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 83868d6..678aa64 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -27,6 +27,8 @@
import java.util.LinkedList;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
@@ -36,6 +38,7 @@
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
+import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static org.junit.Assert.assertEquals;
@@ -44,6 +47,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
@@ -218,6 +222,60 @@
public void testPrepareWindowToDisplayDuringRelayout() throws Exception {
testPrepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
testPrepareWindowToDisplayDuringRelayout(true /*wasVisible*/);
+
+ // Call prepareWindowToDisplayDuringRelayout for a window without FLAG_TURN_SCREEN_ON
+ // before calling prepareWindowToDisplayDuringRelayout for windows with flag in the same
+ // appWindowToken.
+ final AppWindowToken appWindowToken = createAppWindowToken(mDisplayContent,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ final WindowState first = createWindow(null, TYPE_APPLICATION, appWindowToken, "first");
+ final WindowState second = createWindow(null, TYPE_APPLICATION, appWindowToken, "second");
+ second.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+
+ reset(mPowerManagerWrapper);
+ first.prepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ verify(mPowerManagerWrapper, never()).wakeUp(anyLong(), anyString());
+ assertTrue(appWindowToken.canTurnScreenOn());
+
+ reset(mPowerManagerWrapper);
+ second.prepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ verify(mPowerManagerWrapper).wakeUp(anyLong(), anyString());
+ assertFalse(appWindowToken.canTurnScreenOn());
+
+ // Call prepareWindowToDisplayDuringRelayout for two window that have FLAG_TURN_SCREEN_ON
+ // from the same appWindowToken. Only one should trigger the wakeup.
+ appWindowToken.setCanTurnScreenOn(true);
+ first.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+ second.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+
+ reset(mPowerManagerWrapper);
+ first.prepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ verify(mPowerManagerWrapper).wakeUp(anyLong(), anyString());
+ assertFalse(appWindowToken.canTurnScreenOn());
+
+ reset(mPowerManagerWrapper);
+ second.prepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ verify(mPowerManagerWrapper, never()).wakeUp(anyLong(), anyString());
+ assertFalse(appWindowToken.canTurnScreenOn());
+
+ // Call prepareWindowToDisplayDuringRelayout for a windows that are not children of an
+ // appWindowToken. Both windows have the FLAG_TURNS_SCREEN_ON so both should call wakeup
+ final WindowToken windowToken = new WindowTestUtils.TestWindowToken(FIRST_SUB_WINDOW,
+ mDisplayContent);
+ final WindowState firstWindow = createWindow(null, TYPE_APPLICATION, windowToken,
+ "firstWindow");
+ final WindowState secondWindow = createWindow(null, TYPE_APPLICATION, windowToken,
+ "secondWindow");
+ firstWindow.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+ secondWindow.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+
+ reset(mPowerManagerWrapper);
+ firstWindow.prepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ verify(mPowerManagerWrapper).wakeUp(anyLong(), anyString());
+
+ reset(mPowerManagerWrapper);
+ secondWindow.prepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ verify(mPowerManagerWrapper).wakeUp(anyLong(), anyString());
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 91d5ea4..57c1a00 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -198,12 +198,17 @@
return new WindowTestUtils.TestWindowToken(type, dc);
}
- final TaskStack stack =
- createStackControllerOnStackOnDisplay(windowingMode, activityType, dc).mContainer;
+ return createAppWindowToken(dc, windowingMode, activityType);
+ }
+
+ AppWindowToken createAppWindowToken(DisplayContent dc, int windowingMode, int activityType) {
+ final TaskStack stack = createStackControllerOnStackOnDisplay(windowingMode, activityType,
+ dc).mContainer;
final Task task = createTaskInStack(stack, 0 /* userId */);
- final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(dc);
- task.addChild(token, 0);
- return token;
+ final WindowTestUtils.TestAppWindowToken appWindowToken =
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
+ task.addChild(appWindowToken, 0);
+ return appWindowToken;
}
WindowState createWindow(WindowState parent, int type, String name) {
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index cb87d1f..fb52ff7 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -3356,23 +3356,23 @@
* Contains carrier identification information for the current subscriptions.
* @see SubscriptionManager#getActiveSubscriptionIdList()
*/
- public static final class CarrierIdentification implements BaseColumns {
+ public static final class CarrierId implements BaseColumns {
/**
* Not instantiable.
* @hide
*/
- private CarrierIdentification() {}
+ private CarrierId() {}
/**
* The {@code content://} style URI for this provider.
*/
- public static final Uri CONTENT_URI = Uri.parse("content://carrier_identification");
+ public static final Uri CONTENT_URI = Uri.parse("content://carrier_id");
/**
- * The authority string for the CarrierIdentification Provider
+ * The authority string for the CarrierId Provider
* @hide
*/
- public static final String AUTHORITY = "carrier_identification";
+ public static final String AUTHORITY = "carrier_id";
/**
@@ -3399,14 +3399,14 @@
* @see TelephonyManager#getAndroidCarrierNameForSubscription()
* <P>Type: TEXT </P>
*/
- public static final String NAME = "carrier_name";
+ public static final String CARRIER_NAME = "carrier_name";
/**
* A unique carrier id
* @see TelephonyManager#getAndroidCarrierIdForSubscription()
* <P>Type: INTEGER </P>
*/
- public static final String CID = "carrier_id";
+ public static final String CARRIER_ID = "carrier_id";
/**
* Contains mappings between matching rules with carrier id for all carriers.
@@ -3464,7 +3464,7 @@
/**
* The {@code content://} URI for this table.
*/
- public static final Uri CONTENT_URI = Uri.parse("content://carrier_identification/all");
+ public static final Uri CONTENT_URI = Uri.parse("content://carrier_id/all");
}
}
}
diff --git a/tests/FrameworkPerf/AndroidManifest.xml b/tests/FrameworkPerf/AndroidManifest.xml
index 2591aaf..d62ef9e 100644
--- a/tests/FrameworkPerf/AndroidManifest.xml
+++ b/tests/FrameworkPerf/AndroidManifest.xml
@@ -1,5 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.frameworkperf">
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-sdk android:minSdkVersion="5" />
diff --git a/tests/OneMedia/AndroidManifest.xml b/tests/OneMedia/AndroidManifest.xml
index c6824ec..8697f1b 100644
--- a/tests/OneMedia/AndroidManifest.xml
+++ b/tests/OneMedia/AndroidManifest.xml
@@ -5,6 +5,7 @@
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="19"/>
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
diff --git a/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java b/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
index c491b46..23311b0 100644
--- a/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
+++ b/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
@@ -22,6 +22,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -29,6 +30,7 @@
import android.hardware.usb.UsbManager;
import android.os.Handler;
import android.os.Looper;
+import android.os.Message;
import android.os.UserHandle;
import android.provider.Settings;
import android.support.test.InstrumentationRegistry;
@@ -147,6 +149,7 @@
}
@SmallTest
+ @Test
public void setFunctionsMtp() {
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
UsbManager.FUNCTION_MTP));
@@ -154,6 +157,7 @@
}
@SmallTest
+ @Test
public void setFunctionsPtp() {
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
UsbManager.FUNCTION_PTP));
@@ -161,6 +165,7 @@
}
@SmallTest
+ @Test
public void setFunctionsMidi() {
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
UsbManager.FUNCTION_MIDI));
@@ -168,6 +173,7 @@
}
@SmallTest
+ @Test
public void setFunctionsRndis() {
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
UsbManager.FUNCTION_RNDIS));
@@ -175,14 +181,17 @@
}
@SmallTest
+ @Test
public void enableAdb() {
sendBootCompleteMessages(mUsbHandler);
- mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_ENABLE_ADB, 1));
+ Message msg = mUsbHandler.obtainMessage(MSG_ENABLE_ADB);
+ msg.arg1 = 1;
+ mUsbHandler.handleMessage(msg);
assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
- assertTrue(mUsbHandler.mAdbEnabled);
assertEquals(mMockProperties.get(UsbDeviceManager.UsbHandler
.USB_PERSISTENT_CONFIG_PROPERTY), UsbManager.USB_FUNCTION_ADB);
verify(mUsbDebuggingManager).setAdbEnabled(true);
+ assertTrue(mUsbHandler.mAdbEnabled);
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 1, 1));
@@ -194,6 +203,7 @@
}
@SmallTest
+ @Test
public void disableAdb() {
mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY,
UsbManager.USB_FUNCTION_ADB);
@@ -211,13 +221,14 @@
}
@SmallTest
+ @Test
public void bootCompletedCharging() {
sendBootCompleteMessages(mUsbHandler);
assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
}
- @Test
@SmallTest
+ @Test
public void bootCompletedAdbEnabled() {
mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY, "adb");
mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
@@ -232,17 +243,20 @@
}
@SmallTest
+ @Test
public void userSwitchedDisablesMtp() {
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
UsbManager.FUNCTION_MTP));
assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
- mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_USER_SWITCHED,
- UserHandle.getCallingUserId() + 1));
+ Message msg = mUsbHandler.obtainMessage(MSG_USER_SWITCHED);
+ msg.arg1 = ActivityManager.getCurrentUser() + 1;
+ mUsbHandler.handleMessage(msg);
assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
}
@SmallTest
+ @Test
public void changedRestrictionsDisablesMtp() {
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
UsbManager.FUNCTION_MTP));
@@ -254,6 +268,7 @@
}
@SmallTest
+ @Test
public void disconnectResetsCharging() {
sendBootCompleteMessages(mUsbHandler);
@@ -267,6 +282,7 @@
}
@SmallTest
+ @Test
public void configuredSendsBroadcast() {
sendBootCompleteMessages(mUsbHandler);
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
@@ -284,6 +300,7 @@
}
@SmallTest
+ @Test
public void setScreenUnlockedFunctions() {
sendBootCompleteMessages(mUsbHandler);
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 0));
@@ -298,11 +315,16 @@
}
@SmallTest
+ @Test
public void unlockScreen() {
when(mSharedPreferences.getString(String.format(Locale.ENGLISH,
UsbDeviceManager.UNLOCKED_CONFIG_PREF, mUsbHandler.mCurrentUser), ""))
.thenReturn(UsbManager.USB_FUNCTION_MTP);
+ mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
+ InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
+ mUsbAlsaManager, mUsbSettingsManager);
sendBootCompleteMessages(mUsbHandler);
+ mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 1));
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 0));
assertNotEquals(mUsbHandler.getScreenUnlockedFunctions() & UsbManager.FUNCTION_MTP, 0);
diff --git a/tests/net/java/android/net/ip/IpManagerTest.java b/tests/net/java/android/net/ip/IpClientTest.java
similarity index 80%
rename from tests/net/java/android/net/ip/IpManagerTest.java
rename to tests/net/java/android/net/ip/IpClientTest.java
index 22d88fb..e9e880d 100644
--- a/tests/net/java/android/net/ip/IpManagerTest.java
+++ b/tests/net/java/android/net/ip/IpClientTest.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -38,10 +39,12 @@
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
+import android.net.MacAddress;
import android.net.RouteInfo;
-import android.net.ip.IpManager.Callback;
-import android.net.ip.IpManager.InitialConfiguration;
-import android.net.ip.IpManager.ProvisioningConfiguration;
+import android.net.ip.IpClient.Callback;
+import android.net.ip.IpClient.InitialConfiguration;
+import android.net.ip.IpClient.ProvisioningConfiguration;
+import android.net.util.InterfaceParams;
import android.os.INetworkManagementService;
import android.provider.Settings;
import android.support.test.filters.SmallTest;
@@ -68,15 +71,19 @@
import java.util.Set;
/**
- * Tests for IpManager.
+ * Tests for IpClient.
*/
@RunWith(AndroidJUnit4.class)
@SmallTest
-public class IpManagerTest {
+public class IpClientTest {
private static final int DEFAULT_AVOIDBADWIFI_CONFIG_VALUE = 1;
private static final String VALID = "VALID";
private static final String INVALID = "INVALID";
+ private static final String TEST_IFNAME = "test_wlan0";
+ private static final int TEST_IFINDEX = 1001;
+ // See RFC 7042#section-2.1.2 for EUI-48 documentation values.
+ private static final MacAddress TEST_MAC = MacAddress.fromString("00:00:5E:00:53:01");
@Mock private Context mContext;
@Mock private INetworkManagementService mNMService;
@@ -84,9 +91,11 @@
@Mock private Resources mResources;
@Mock private Callback mCb;
@Mock private AlarmManager mAlarm;
+ @Mock private IpClient.Dependencies mDependecies;
private MockContentResolver mContentResolver;
- BaseNetworkObserver mObserver;
+ private BaseNetworkObserver mObserver;
+ private InterfaceParams mIfParams;
@Before
public void setUp() throws Exception {
@@ -100,10 +109,23 @@
mContentResolver = new MockContentResolver();
mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
when(mContext.getContentResolver()).thenReturn(mContentResolver);
+
+ mIfParams = null;
+
+ when(mDependecies.getNMS()).thenReturn(mNMService);
+ when(mDependecies.getNetd()).thenReturn(mNetd);
}
- private IpManager makeIpManager(String ifname) throws Exception {
- final IpManager ipm = new IpManager(mContext, ifname, mCb, mNMService, mNetd);
+ private void setTestInterfaceParams(String ifname) {
+ mIfParams = (ifname != null)
+ ? new InterfaceParams(ifname, TEST_IFINDEX, TEST_MAC)
+ : null;
+ when(mDependecies.getInterfaceParams(anyString())).thenReturn(mIfParams);
+ }
+
+ private IpClient makeIpClient(String ifname) throws Exception {
+ setTestInterfaceParams(ifname);
+ final IpClient ipc = new IpClient(mContext, ifname, mCb, mDependecies);
verify(mNMService, timeout(100).times(1)).disableIpv6(ifname);
verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(ifname);
ArgumentCaptor<BaseNetworkObserver> arg =
@@ -111,23 +133,54 @@
verify(mNMService, times(1)).registerObserver(arg.capture());
mObserver = arg.getValue();
reset(mNMService);
- return ipm;
+ return ipc;
}
@Test
- public void testNullCallbackDoesNotThrow() throws Exception {
- final IpManager ipm = new IpManager(mContext, "lo", null, mNMService);
+ public void testNullInterfaceNameMostDefinitelyThrows() throws Exception {
+ setTestInterfaceParams(null);
+ try {
+ final IpClient ipc = new IpClient(mContext, null, mCb, mDependecies);
+ ipc.shutdown();
+ fail();
+ } catch (NullPointerException npe) {
+ // Phew; null interface names not allowed.
+ }
+ }
+
+ @Test
+ public void testNullCallbackMostDefinitelyThrows() throws Exception {
+ final String ifname = "lo";
+ setTestInterfaceParams(ifname);
+ try {
+ final IpClient ipc = new IpClient(mContext, ifname, null, mDependecies);
+ ipc.shutdown();
+ fail();
+ } catch (NullPointerException npe) {
+ // Phew; null callbacks not allowed.
+ }
}
@Test
public void testInvalidInterfaceDoesNotThrow() throws Exception {
- final IpManager ipm = new IpManager(mContext, "test_wlan0", mCb, mNMService);
+ setTestInterfaceParams(TEST_IFNAME);
+ final IpClient ipc = new IpClient(mContext, TEST_IFNAME, mCb, mDependecies);
+ ipc.shutdown();
+ }
+
+ @Test
+ public void testInterfaceNotFoundFailsImmediately() throws Exception {
+ setTestInterfaceParams(null);
+ final IpClient ipc = new IpClient(mContext, TEST_IFNAME, mCb, mDependecies);
+ ipc.startProvisioning(new IpClient.ProvisioningConfiguration());
+ verify(mCb, times(1)).onProvisioningFailure(any());
+ ipc.shutdown();
}
@Test
public void testDefaultProvisioningConfiguration() throws Exception {
- final String iface = "test_wlan0";
- final IpManager ipm = makeIpManager(iface);
+ final String iface = TEST_IFNAME;
+ final IpClient ipc = makeIpClient(iface);
ProvisioningConfiguration config = new ProvisioningConfiguration.Builder()
.withoutIPv4()
@@ -136,20 +189,20 @@
.withoutIpReachabilityMonitor()
.build();
- ipm.startProvisioning(config);
+ ipc.startProvisioning(config);
verify(mCb, times(1)).setNeighborDiscoveryOffload(true);
verify(mCb, timeout(100).times(1)).setFallbackMulticastFilter(false);
verify(mCb, never()).onProvisioningFailure(any());
- ipm.stop();
+ ipc.shutdown();
verify(mNMService, timeout(100).times(1)).disableIpv6(iface);
verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(iface);
}
@Test
public void testProvisioningWithInitialConfiguration() throws Exception {
- final String iface = "test_wlan0";
- final IpManager ipm = makeIpManager(iface);
+ final String iface = TEST_IFNAME;
+ final IpClient ipc = makeIpClient(iface);
String[] addresses = {
"fe80::a4be:f92:e1f7:22d1/64",
@@ -164,7 +217,7 @@
.withInitialConfiguration(conf(links(addresses), prefixes(prefixes), ips()))
.build();
- ipm.startProvisioning(config);
+ ipc.startProvisioning(config);
verify(mCb, times(1)).setNeighborDiscoveryOffload(true);
verify(mCb, timeout(100).times(1)).setFallbackMulticastFilter(false);
verify(mCb, never()).onProvisioningFailure(any());
@@ -190,7 +243,7 @@
want.setInterfaceName(iface);
verify(mCb, timeout(100).times(1)).onProvisioningSuccess(eq(want));
- ipm.stop();
+ ipc.shutdown();
verify(mNMService, timeout(100).times(1)).disableIpv6(iface);
verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(iface);
}
@@ -228,7 +281,7 @@
};
for (IsProvisionedTestCase testcase : testcases) {
- if (IpManager.isProvisioned(testcase.lp, testcase.config) != testcase.isProvisioned) {
+ if (IpClient.isProvisioned(testcase.lp, testcase.config) != testcase.isProvisioned) {
fail(testcase.errorMessage());
}
}
@@ -424,11 +477,11 @@
List<String> list3 = Arrays.asList("bar", "baz");
List<String> list4 = Arrays.asList("foo", "bar", "baz");
- assertTrue(IpManager.all(list1, (x) -> false));
- assertFalse(IpManager.all(list2, (x) -> false));
- assertTrue(IpManager.all(list3, (x) -> true));
- assertTrue(IpManager.all(list2, (x) -> x.charAt(0) == 'f'));
- assertFalse(IpManager.all(list4, (x) -> x.charAt(0) == 'f'));
+ assertTrue(IpClient.all(list1, (x) -> false));
+ assertFalse(IpClient.all(list2, (x) -> false));
+ assertTrue(IpClient.all(list3, (x) -> true));
+ assertTrue(IpClient.all(list2, (x) -> x.charAt(0) == 'f'));
+ assertFalse(IpClient.all(list4, (x) -> x.charAt(0) == 'f'));
}
@Test
@@ -438,11 +491,11 @@
List<String> list3 = Arrays.asList("bar", "baz");
List<String> list4 = Arrays.asList("foo", "bar", "baz");
- assertFalse(IpManager.any(list1, (x) -> true));
- assertTrue(IpManager.any(list2, (x) -> true));
- assertTrue(IpManager.any(list2, (x) -> x.charAt(0) == 'f'));
- assertFalse(IpManager.any(list3, (x) -> x.charAt(0) == 'f'));
- assertTrue(IpManager.any(list4, (x) -> x.charAt(0) == 'f'));
+ assertFalse(IpClient.any(list1, (x) -> true));
+ assertTrue(IpClient.any(list2, (x) -> true));
+ assertTrue(IpClient.any(list2, (x) -> x.charAt(0) == 'f'));
+ assertFalse(IpClient.any(list3, (x) -> x.charAt(0) == 'f'));
+ assertTrue(IpClient.any(list4, (x) -> x.charAt(0) == 'f'));
}
@Test
@@ -451,9 +504,9 @@
List<String> list2 = Arrays.asList("foo");
List<String> list3 = Arrays.asList("foo", "bar", "baz");
- assertEquals(list1, IpManager.findAll(list1, (x) -> true));
- assertEquals(list1, IpManager.findAll(list3, (x) -> false));
- assertEquals(list3, IpManager.findAll(list3, (x) -> true));
- assertEquals(list2, IpManager.findAll(list3, (x) -> x.charAt(0) == 'f'));
+ assertEquals(list1, IpClient.findAll(list1, (x) -> true));
+ assertEquals(list1, IpClient.findAll(list3, (x) -> false));
+ assertEquals(list3, IpClient.findAll(list3, (x) -> true));
+ assertEquals(list2, IpClient.findAll(list3, (x) -> x.charAt(0) == 'f'));
}
}