diff options
58 files changed, 2267 insertions, 1187 deletions
diff --git a/api/current.txt b/api/current.txt index b3be727272ab..5936ae9fd126 100644 --- a/api/current.txt +++ b/api/current.txt @@ -7266,6 +7266,7 @@ package android.app.slice { public class SliceManager { method public android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>); method public android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>); + method public java.util.List<android.net.Uri> getPinnedSlices(); method public java.util.List<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri); method public java.util.Collection<android.net.Uri> getSliceDescendants(android.net.Uri); method public android.net.Uri mapIntentToUri(android.content.Intent); @@ -7418,12 +7419,14 @@ package android.app.usage { method public int getEventType(); method public java.lang.String getPackageName(); method public java.lang.String getShortcutId(); + method public int getStandbyBucket(); method public long getTimeStamp(); field public static final int CONFIGURATION_CHANGE = 5; // 0x5 field public static final int MOVE_TO_BACKGROUND = 2; // 0x2 field public static final int MOVE_TO_FOREGROUND = 1; // 0x1 field public static final int NONE = 0; // 0x0 field public static final int SHORTCUT_INVOCATION = 8; // 0x8 + field public static final int STANDBY_BUCKET_CHANGED = 11; // 0xb field public static final int USER_INTERACTION = 7; // 0x7 } diff --git a/api/system-current.txt b/api/system-current.txt index 5ec84fee4905..288fb00c6852 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -719,10 +719,8 @@ package android.app.usage { public static final class UsageEvents.Event { method public java.lang.String getNotificationChannelId(); - method public int getStandbyBucket(); field public static final int NOTIFICATION_INTERRUPTION = 12; // 0xc field public static final int NOTIFICATION_SEEN = 10; // 0xa - field public static final int STANDBY_BUCKET_CHANGED = 11; // 0xb } public final class UsageStatsManager { diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk index 3b679fc5cef3..50a5ddda4840 100644 --- a/cmds/statsd/Android.mk +++ b/cmds/statsd/Android.mk @@ -196,7 +196,7 @@ LOCAL_SRC_FILES := \ tests/e2e/WakelockDuration_e2e_test.cpp \ tests/e2e/MetricConditionLink_e2e_test.cpp \ tests/e2e/Attribution_e2e_test.cpp \ - tests/e2e/GaugeMetric_e2e_test.cpp \ + tests/e2e/GaugeMetric_e2e_push_test.cpp \ tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp \ tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp \ tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index 02d4dc985e84..8f72a8f0958c 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -62,6 +62,9 @@ const int FIELD_ID_ID = 2; const int FIELD_ID_UID_MAP = 2; const int FIELD_ID_LAST_REPORT_ELAPSED_NANOS = 3; const int FIELD_ID_CURRENT_REPORT_ELAPSED_NANOS = 4; +const int FIELD_ID_LAST_REPORT_WALL_CLOCK_NANOS = 5; +const int FIELD_ID_CURRENT_REPORT_WALL_CLOCK_NANOS = 6; + #define STATS_DATA_DIR "/data/misc/stats-data" @@ -260,6 +263,8 @@ void StatsLogProcessor::onDumpReportLocked(const ConfigKey& key, const uint64_t proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_REPORTS); int64_t lastReportTimeNs = it->second->getLastReportTimeNs(); + int64_t lastReportWallClockNs = it->second->getLastReportWallClockNs(); + // First, fill in ConfigMetricsReport using current data on memory, which // starts from filling in StatsLogReport's. it->second->onDumpReport(dumpTimeStampNs, &proto); @@ -276,6 +281,10 @@ void StatsLogProcessor::onDumpReportLocked(const ConfigKey& key, const uint64_t (long long)lastReportTimeNs); proto.write(FIELD_TYPE_INT64 | FIELD_ID_CURRENT_REPORT_ELAPSED_NANOS, (long long)dumpTimeStampNs); + proto.write(FIELD_TYPE_INT64 | FIELD_ID_LAST_REPORT_WALL_CLOCK_NANOS, + (long long)lastReportWallClockNs); + proto.write(FIELD_TYPE_INT64 | FIELD_ID_CURRENT_REPORT_WALL_CLOCK_NANOS, + (long long)getWallClockNs()); // End of ConfigMetricsReport (reports). proto.end(reportsToken); diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp index c6c4d135ad3f..7a55f6065e88 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.cpp +++ b/cmds/statsd/src/guardrail/StatsdStats.cpp @@ -21,6 +21,7 @@ #include <android/util/ProtoOutputStream.h> #include "../stats_log_util.h" #include "statslog.h" +#include "storage/StorageManager.h" namespace android { namespace os { @@ -403,6 +404,8 @@ void StatsdStats::dumpStats(FILE* out) const { fprintf(out, "alert %lld declared %d times\n", (long long)stats.first, stats.second); } } + fprintf(out, "********Disk Usage stats***********\n"); + StorageManager::printStats(out); fprintf(out, "********Pushed Atom stats***********\n"); const size_t atomCounts = mPushedAtomStats.size(); for (size_t i = 2; i < atomCounts; i++) { diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp index 079eb69d7fcc..55a281ed61a0 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp @@ -56,6 +56,7 @@ const int FIELD_ID_START_BUCKET_ELAPSED_NANOS = 1; const int FIELD_ID_END_BUCKET_ELAPSED_NANOS = 2; const int FIELD_ID_ATOM = 3; const int FIELD_ID_ELAPSED_ATOM_TIMESTAMP = 4; +const int FIELD_ID_WALL_CLOCK_ATOM_TIMESTAMP = 5; GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& metric, const int conditionIndex, @@ -186,21 +187,28 @@ void GaugeMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs, (long long)bucket.mBucketEndNs); if (!bucket.mGaugeAtoms.empty()) { - uint64_t atomsToken = - protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ATOM); for (const auto& atom : bucket.mGaugeAtoms) { + uint64_t atomsToken = + protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | + FIELD_ID_ATOM); writeFieldValueTreeToStream(mTagId, *(atom.mFields), protoOutput); + protoOutput->end(atomsToken); } - protoOutput->end(atomsToken); + const bool truncateTimestamp = + android::util::kNotTruncatingTimestampAtomWhiteList.find(mTagId) == + android::util::kNotTruncatingTimestampAtomWhiteList.end(); + const int64_t wall_clock_ns = truncateTimestamp ? + truncateTimestampNsToFiveMinutes(getWallClockNs()) : getWallClockNs(); for (const auto& atom : bucket.mGaugeAtoms) { - const bool truncateTimestamp = - android::util::kNotTruncatingTimestampAtomWhiteList.find(mTagId) == - android::util::kNotTruncatingTimestampAtomWhiteList.end(); int64_t timestampNs = truncateTimestamp ? truncateTimestampNsToFiveMinutes(atom.mTimestamps) : atom.mTimestamps; protoOutput->write( FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED | FIELD_ID_ELAPSED_ATOM_TIMESTAMP, (long long)timestampNs); + protoOutput->write( + FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED | + FIELD_ID_WALL_CLOCK_ATOM_TIMESTAMP, + (long long)wall_clock_ns); } } protoOutput->end(bucketInfoToken); diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index 1ca59a366fcb..6209bbe75812 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -53,7 +53,9 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, const sp<UidMap> &uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& periodicAlarmMonitor) - : mConfigKey(key), mUidMap(uidMap), mLastReportTimeNs(timeBaseSec * NS_PER_SEC) { + : mConfigKey(key), mUidMap(uidMap), + mLastReportTimeNs(timeBaseSec * NS_PER_SEC), + mLastReportWallClockNs(getWallClockNs()) { mConfigValid = initStatsdConfig(key, config, *uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, mTagIds, mAllAtomMatchers, @@ -193,6 +195,7 @@ void MetricsManager::onDumpReport(const uint64_t dumpTimeStampNs, ProtoOutputStr } } mLastReportTimeNs = dumpTimeStampNs; + mLastReportWallClockNs = getWallClockNs(); VLOG("=========================Metric Reports End=========================="); } diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index dbab81431743..bebd53c29886 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -69,10 +69,14 @@ public: void dumpStates(FILE* out, bool verbose); // Returns the elapsed realtime when this metric manager last reported metrics. - uint64_t getLastReportTimeNs() { + inline int64_t getLastReportTimeNs() const { return mLastReportTimeNs; }; + inline int64_t getLastReportWallClockNs() const { + return mLastReportWallClockNs; + }; + virtual void dropData(const uint64_t dropTimeNs); // Config source owner can call onDumpReport() to get all the metrics collected. @@ -89,7 +93,8 @@ private: bool mConfigValid = false; - uint64_t mLastReportTimeNs; + int64_t mLastReportTimeNs; + int64_t mLastReportWallClockNs; // The uid log sources from StatsdConfig. std::vector<int32_t> mAllowedUid; diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index 3c5f5a2b9907..0412538ef058 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -46,7 +46,7 @@ message EventMetricData { optional Atom atom = 2; - optional int64 wall_clock_timestamp_sec = 3; + optional int64 wall_clock_timestamp_nanos = 3; } message CountBucketInfo { @@ -105,6 +105,8 @@ message GaugeBucketInfo { repeated Atom atom = 3; repeated int64 elapsed_timestamp_nanos = 4; + + repeated int64 wall_clock_timestamp_nanos = 5; } message GaugeMetricData { @@ -154,6 +156,10 @@ message ConfigMetricsReport { optional int64 last_report_elapsed_nanos = 3; optional int64 current_report_elapsed_nanos = 4; + + optional int64 last_report_wall_clock_nanos = 5; + + optional int64 current_report_wall_clock_nanos = 6; } message ConfigMetricsReportList { diff --git a/cmds/statsd/src/storage/StorageManager.cpp b/cmds/statsd/src/storage/StorageManager.cpp index 77387cb8b143..cd41f533fecf 100644 --- a/cmds/statsd/src/storage/StorageManager.cpp +++ b/cmds/statsd/src/storage/StorageManager.cpp @@ -345,6 +345,53 @@ void StorageManager::trimToFit(const char* path) { } } +void StorageManager::printStats(FILE* out) { + printDirStats(out, STATS_SERVICE_DIR); + printDirStats(out, STATS_DATA_DIR); +} + +void StorageManager::printDirStats(FILE* out, const char* path) { + fprintf(out, "Printing stats of %s\n", path); + unique_ptr<DIR, decltype(&closedir)> dir(opendir(path), closedir); + if (dir == NULL) { + VLOG("Path %s does not exist", path); + return; + } + dirent* de; + int fileCount = 0; + int totalFileSize = 0; + while ((de = readdir(dir.get()))) { + char* name = de->d_name; + if (name[0] == '.') { + continue; + } + int64_t result[3]; + parseFileName(name, result); + if (result[0] == -1) continue; + int64_t timestamp = result[0]; + int64_t uid = result[1]; + int64_t configID = result[2]; + fprintf(out, "\t #%d, Last updated: %lld, UID: %d, Config ID: %lld", + fileCount + 1, + (long long)timestamp, + (int)uid, + (long long)configID); + string file_name = getFilePath(path, timestamp, uid, configID); + ifstream file(file_name.c_str(), ifstream::in | ifstream::binary); + if (file.is_open()) { + file.seekg(0, ios::end); + int fileSize = file.tellg(); + file.close(); + fprintf(out, ", File Size: %d bytes", fileSize); + totalFileSize += fileSize; + } + fprintf(out, "\n"); + fileCount++; + } + fprintf(out, "\tTotal number of files: %d, Total size of files: %d bytes.\n", + fileCount, totalFileSize); +} + } // namespace statsd } // namespace os } // namespace android diff --git a/cmds/statsd/src/storage/StorageManager.h b/cmds/statsd/src/storage/StorageManager.h index 13ce5c6c0698..4b7562855f30 100644 --- a/cmds/statsd/src/storage/StorageManager.h +++ b/cmds/statsd/src/storage/StorageManager.h @@ -84,6 +84,17 @@ public: */ static bool hasIdenticalConfig(const ConfigKey& key, const vector<uint8_t>& config); + + /** + * Prints disk usage statistics related to statsd. + */ + static void printStats(FILE* out); + +private: + /** + * Prints disk usage statistics about a directory related to statsd. + */ + static void printDirStats(FILE* out, const char* path); }; } // namespace statsd diff --git a/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp b/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp new file mode 100644 index 000000000000..9ceffc816e68 --- /dev/null +++ b/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp @@ -0,0 +1,281 @@ +// Copyright (C) 2017 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include <gtest/gtest.h> + +#include "src/StatsLogProcessor.h" +#include "src/stats_log_util.h" +#include "tests/statsd_test_util.h" + +#include <vector> + +namespace android { +namespace os { +namespace statsd { + +#ifdef __ANDROID__ + +namespace { + +StatsdConfig CreateStatsdConfigForPushedEvent(const GaugeMetric::SamplingType sampling_type) { + StatsdConfig config; + *config.add_atom_matcher() = CreateMoveToBackgroundAtomMatcher(); + *config.add_atom_matcher() = CreateMoveToForegroundAtomMatcher(); + + auto atomMatcher = CreateSimpleAtomMatcher("", android::util::APP_START_CHANGED); + *config.add_atom_matcher() = atomMatcher; + + auto isInBackgroundPredicate = CreateIsInBackgroundPredicate(); + *isInBackgroundPredicate.mutable_simple_predicate()->mutable_dimensions() = + CreateDimensions(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, {1 /* uid field */ }); + *config.add_predicate() = isInBackgroundPredicate; + + auto gaugeMetric = config.add_gauge_metric(); + gaugeMetric->set_id(123456); + gaugeMetric->set_what(atomMatcher.id()); + gaugeMetric->set_condition(isInBackgroundPredicate.id()); + gaugeMetric->mutable_gauge_fields_filter()->set_include_all(false); + gaugeMetric->set_sampling_type(sampling_type); + auto fieldMatcher = gaugeMetric->mutable_gauge_fields_filter()->mutable_fields(); + fieldMatcher->set_field(android::util::APP_START_CHANGED); + fieldMatcher->add_child()->set_field(3); // type (enum) + fieldMatcher->add_child()->set_field(4); // activity_name(str) + fieldMatcher->add_child()->set_field(7); // activity_start_msec(int64) + *gaugeMetric->mutable_dimensions_in_what() = + CreateDimensions(android::util::APP_START_CHANGED, {1 /* uid field */ }); + gaugeMetric->set_bucket(FIVE_MINUTES); + + auto links = gaugeMetric->add_links(); + links->set_condition(isInBackgroundPredicate.id()); + auto dimensionWhat = links->mutable_fields_in_what(); + dimensionWhat->set_field(android::util::APP_START_CHANGED); + dimensionWhat->add_child()->set_field(1); // uid field. + auto dimensionCondition = links->mutable_fields_in_condition(); + dimensionCondition->set_field(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED); + dimensionCondition->add_child()->set_field(1); // uid field. + return config; +} + +std::unique_ptr<LogEvent> CreateAppStartChangedEvent( + const int uid, const string& pkg_name, AppStartChanged::TransitionType type, + const string& activity_name, const string& calling_pkg_name, const bool is_instant_app, + int64_t activity_start_msec, uint64_t timestampNs) { + auto logEvent = std::make_unique<LogEvent>( + android::util::APP_START_CHANGED, timestampNs); + logEvent->write(uid); + logEvent->write(pkg_name); + logEvent->write(type); + logEvent->write(activity_name); + logEvent->write(calling_pkg_name); + logEvent->write(is_instant_app); + logEvent->write(activity_start_msec); + logEvent->init(); + return logEvent; +} + +} // namespace + +TEST(GaugeMetricE2eTest, TestMultipleFieldsForPushedEvent) { + for (const auto& sampling_type : + { GaugeMetric::ALL_CONDITION_CHANGES, GaugeMetric:: RANDOM_ONE_SAMPLE }) { + auto config = CreateStatsdConfigForPushedEvent(sampling_type); + int64_t bucketStartTimeNs = 10000000000; + int64_t bucketSizeNs = + TimeUnitToBucketSizeInMillis(config.gauge_metric(0).bucket()) * 1000000; + + ConfigKey cfgKey; + auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey); + EXPECT_EQ(processor->mMetricsManagers.size(), 1u); + EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); + + int appUid1 = 123; + int appUid2 = 456; + std::vector<std::unique_ptr<LogEvent>> events; + events.push_back(CreateMoveToBackgroundEvent(appUid1, bucketStartTimeNs + 15)); + events.push_back(CreateMoveToForegroundEvent( + appUid1, bucketStartTimeNs + bucketSizeNs + 250)); + events.push_back(CreateMoveToBackgroundEvent( + appUid1, bucketStartTimeNs + bucketSizeNs + 350)); + events.push_back(CreateMoveToForegroundEvent( + appUid1, bucketStartTimeNs + 2 * bucketSizeNs + 100)); + + + events.push_back(CreateAppStartChangedEvent( + appUid1, "app1", AppStartChanged::WARM, "activity_name1", "calling_pkg_name1", + true /*is_instant_app*/, 101 /*activity_start_msec*/, bucketStartTimeNs + 10)); + events.push_back(CreateAppStartChangedEvent( + appUid1, "app1", AppStartChanged::HOT, "activity_name2", "calling_pkg_name2", + true /*is_instant_app*/, 102 /*activity_start_msec*/, bucketStartTimeNs + 20)); + events.push_back(CreateAppStartChangedEvent( + appUid1, "app1", AppStartChanged::COLD, "activity_name3", "calling_pkg_name3", + true /*is_instant_app*/, 103 /*activity_start_msec*/, bucketStartTimeNs + 30)); + events.push_back(CreateAppStartChangedEvent( + appUid1, "app1", AppStartChanged::WARM, "activity_name4", "calling_pkg_name4", + true /*is_instant_app*/, 104 /*activity_start_msec*/, + bucketStartTimeNs + bucketSizeNs + 30)); + events.push_back(CreateAppStartChangedEvent( + appUid1, "app1", AppStartChanged::COLD, "activity_name5", "calling_pkg_name5", + true /*is_instant_app*/, 105 /*activity_start_msec*/, + bucketStartTimeNs + 2 * bucketSizeNs)); + events.push_back(CreateAppStartChangedEvent( + appUid1, "app1", AppStartChanged::HOT, "activity_name6", "calling_pkg_name6", + false /*is_instant_app*/, 106 /*activity_start_msec*/, + bucketStartTimeNs + 2 * bucketSizeNs + 10)); + + events.push_back(CreateMoveToBackgroundEvent( + appUid2, bucketStartTimeNs + bucketSizeNs + 10)); + events.push_back(CreateAppStartChangedEvent( + appUid2, "app2", AppStartChanged::COLD, "activity_name7", "calling_pkg_name7", + true /*is_instant_app*/, 201 /*activity_start_msec*/, + bucketStartTimeNs + 2 * bucketSizeNs + 10)); + + sortLogEventsByTimestamp(&events); + + for (const auto& event : events) { + processor->OnLogEvent(event.get()); + } + ConfigMetricsReportList reports; + vector<uint8_t> buffer; + processor->onDumpReport(cfgKey, bucketStartTimeNs + 3 * bucketSizeNs, &buffer); + EXPECT_TRUE(buffer.size() > 0); + EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); + EXPECT_EQ(1, reports.reports_size()); + EXPECT_EQ(1, reports.reports(0).metrics_size()); + StatsLogReport::GaugeMetricDataWrapper gaugeMetrics; + sortMetricDataByDimensionsValue( + reports.reports(0).metrics(0).gauge_metrics(), &gaugeMetrics); + EXPECT_EQ(2, gaugeMetrics.data_size()); + + auto data = gaugeMetrics.data(0); + EXPECT_EQ(android::util::APP_START_CHANGED, data.dimensions_in_what().field()); + EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size()); + EXPECT_EQ(1 /* uid field */, + data.dimensions_in_what().value_tuple().dimensions_value(0).field()); + EXPECT_EQ(appUid1, data.dimensions_in_what().value_tuple().dimensions_value(0).value_int()); + EXPECT_EQ(3, data.bucket_info_size()); + if (sampling_type == GaugeMetric::ALL_CONDITION_CHANGES) { + EXPECT_EQ(2, data.bucket_info(0).atom_size()); + EXPECT_EQ(2, data.bucket_info(0).elapsed_timestamp_nanos_size()); + EXPECT_EQ(2, data.bucket_info(0).wall_clock_timestamp_nanos_size()); + EXPECT_EQ(bucketStartTimeNs, data.bucket_info(0).start_bucket_nanos()); + EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(0).end_bucket_nanos()); + EXPECT_EQ(AppStartChanged::HOT, data.bucket_info(0).atom(0).app_start_changed().type()); + EXPECT_EQ("activity_name2", + data.bucket_info(0).atom(0).app_start_changed().activity_name()); + EXPECT_EQ(102L, + data.bucket_info(0).atom(0).app_start_changed().activity_start_millis()); + EXPECT_EQ(AppStartChanged::COLD, + data.bucket_info(0).atom(1).app_start_changed().type()); + EXPECT_EQ("activity_name3", + data.bucket_info(0).atom(1).app_start_changed().activity_name()); + EXPECT_EQ(103L, + data.bucket_info(0).atom(1).app_start_changed().activity_start_millis()); + + EXPECT_EQ(1, data.bucket_info(1).atom_size()); + EXPECT_EQ(1, data.bucket_info(1).elapsed_timestamp_nanos_size()); + EXPECT_EQ(1, data.bucket_info(1).wall_clock_timestamp_nanos_size()); + EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(1).start_bucket_nanos()); + EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, data.bucket_info(1).end_bucket_nanos()); + EXPECT_EQ(AppStartChanged::WARM, + data.bucket_info(1).atom(0).app_start_changed().type()); + EXPECT_EQ("activity_name4", + data.bucket_info(1).atom(0).app_start_changed().activity_name()); + EXPECT_EQ(104L, + data.bucket_info(1).atom(0).app_start_changed().activity_start_millis()); + + EXPECT_EQ(2, data.bucket_info(2).atom_size()); + EXPECT_EQ(2, data.bucket_info(2).elapsed_timestamp_nanos_size()); + EXPECT_EQ(2, data.bucket_info(2).wall_clock_timestamp_nanos_size()); + EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, + data.bucket_info(2).start_bucket_nanos()); + EXPECT_EQ(bucketStartTimeNs + 3 * bucketSizeNs, + data.bucket_info(2).end_bucket_nanos()); + EXPECT_EQ(AppStartChanged::COLD, + data.bucket_info(2).atom(0).app_start_changed().type()); + EXPECT_EQ("activity_name5", + data.bucket_info(2).atom(0).app_start_changed().activity_name()); + EXPECT_EQ(105L, + data.bucket_info(2).atom(0).app_start_changed().activity_start_millis()); + EXPECT_EQ(AppStartChanged::HOT, + data.bucket_info(2).atom(1).app_start_changed().type()); + EXPECT_EQ("activity_name6", + data.bucket_info(2).atom(1).app_start_changed().activity_name()); + EXPECT_EQ(106L, + data.bucket_info(2).atom(1).app_start_changed().activity_start_millis()); + } else { + EXPECT_EQ(1, data.bucket_info(0).atom_size()); + EXPECT_EQ(1, data.bucket_info(0).elapsed_timestamp_nanos_size()); + EXPECT_EQ(1, data.bucket_info(0).wall_clock_timestamp_nanos_size()); + EXPECT_EQ(bucketStartTimeNs, data.bucket_info(0).start_bucket_nanos()); + EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(0).end_bucket_nanos()); + EXPECT_EQ(AppStartChanged::HOT, data.bucket_info(0).atom(0).app_start_changed().type()); + EXPECT_EQ("activity_name2", + data.bucket_info(0).atom(0).app_start_changed().activity_name()); + EXPECT_EQ(102L, + data.bucket_info(0).atom(0).app_start_changed().activity_start_millis()); + + EXPECT_EQ(1, data.bucket_info(1).atom_size()); + EXPECT_EQ(1, data.bucket_info(1).elapsed_timestamp_nanos_size()); + EXPECT_EQ(1, data.bucket_info(1).wall_clock_timestamp_nanos_size()); + EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(1).start_bucket_nanos()); + EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, data.bucket_info(1).end_bucket_nanos()); + EXPECT_EQ(AppStartChanged::WARM, + data.bucket_info(1).atom(0).app_start_changed().type()); + EXPECT_EQ("activity_name4", + data.bucket_info(1).atom(0).app_start_changed().activity_name()); + EXPECT_EQ(104L, + data.bucket_info(1).atom(0).app_start_changed().activity_start_millis()); + + EXPECT_EQ(1, data.bucket_info(2).atom_size()); + EXPECT_EQ(1, data.bucket_info(2).elapsed_timestamp_nanos_size()); + EXPECT_EQ(1, data.bucket_info(2).wall_clock_timestamp_nanos_size()); + EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, + data.bucket_info(2).start_bucket_nanos()); + EXPECT_EQ(bucketStartTimeNs + 3 * bucketSizeNs, + data.bucket_info(2).end_bucket_nanos()); + EXPECT_EQ(AppStartChanged::COLD, + data.bucket_info(2).atom(0).app_start_changed().type()); + EXPECT_EQ("activity_name5", + data.bucket_info(2).atom(0).app_start_changed().activity_name()); + EXPECT_EQ(105L, + data.bucket_info(2).atom(0).app_start_changed().activity_start_millis()); + } + + data = gaugeMetrics.data(1); + + EXPECT_EQ(data.dimensions_in_what().field(), android::util::APP_START_CHANGED); + EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); + EXPECT_EQ(1 /* uid field */, + data.dimensions_in_what().value_tuple().dimensions_value(0).field()); + EXPECT_EQ(appUid2, data.dimensions_in_what().value_tuple().dimensions_value(0).value_int()); + EXPECT_EQ(1, data.bucket_info_size()); + EXPECT_EQ(1, data.bucket_info(0).atom_size()); + EXPECT_EQ(1, data.bucket_info(0).elapsed_timestamp_nanos_size()); + EXPECT_EQ(1, data.bucket_info(0).wall_clock_timestamp_nanos_size()); + EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_nanos()); + EXPECT_EQ(bucketStartTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_nanos()); + EXPECT_EQ(AppStartChanged::COLD, data.bucket_info(0).atom(0).app_start_changed().type()); + EXPECT_EQ("activity_name7", + data.bucket_info(0).atom(0).app_start_changed().activity_name()); + EXPECT_EQ(201L, data.bucket_info(0).atom(0).app_start_changed().activity_start_millis()); + } +} + +#else +GTEST_LOG_(INFO) << "This test does nothing.\n"; +#endif + +} // namespace statsd +} // namespace os +} // namespace android diff --git a/cmds/statsd/tests/e2e/GaugeMetric_e2e_test.cpp b/cmds/statsd/tests/e2e/GaugeMetric_e2e_test.cpp deleted file mode 100644 index 3843e0a3c67d..000000000000 --- a/cmds/statsd/tests/e2e/GaugeMetric_e2e_test.cpp +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (C) 2017 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include <gtest/gtest.h> - -#include "src/StatsLogProcessor.h" -#include "src/stats_log_util.h" -#include "tests/statsd_test_util.h" - -#include <vector> - -namespace android { -namespace os { -namespace statsd { - -#ifdef __ANDROID__ - -namespace { - -StatsdConfig CreateStatsdConfigForPushedEvent() { - StatsdConfig config; - *config.add_atom_matcher() = CreateMoveToBackgroundAtomMatcher(); - *config.add_atom_matcher() = CreateMoveToForegroundAtomMatcher(); - - auto atomMatcher = CreateSimpleAtomMatcher("", android::util::APP_START_CHANGED); - *config.add_atom_matcher() = atomMatcher; - - auto isInBackgroundPredicate = CreateIsInBackgroundPredicate(); - *isInBackgroundPredicate.mutable_simple_predicate()->mutable_dimensions() = - CreateDimensions(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, {1 /* uid field */ }); - *config.add_predicate() = isInBackgroundPredicate; - - auto gaugeMetric = config.add_gauge_metric(); - gaugeMetric->set_id(123456); - gaugeMetric->set_what(atomMatcher.id()); - gaugeMetric->set_condition(isInBackgroundPredicate.id()); - gaugeMetric->mutable_gauge_fields_filter()->set_include_all(false); - auto fieldMatcher = gaugeMetric->mutable_gauge_fields_filter()->mutable_fields(); - fieldMatcher->set_field(android::util::APP_START_CHANGED); - fieldMatcher->add_child()->set_field(3); // type (enum) - fieldMatcher->add_child()->set_field(4); // activity_name(str) - fieldMatcher->add_child()->set_field(7); // activity_start_msec(int64) - *gaugeMetric->mutable_dimensions_in_what() = - CreateDimensions(android::util::APP_START_CHANGED, {1 /* uid field */ }); - gaugeMetric->set_bucket(FIVE_MINUTES); - - auto links = gaugeMetric->add_links(); - links->set_condition(isInBackgroundPredicate.id()); - auto dimensionWhat = links->mutable_fields_in_what(); - dimensionWhat->set_field(android::util::APP_START_CHANGED); - dimensionWhat->add_child()->set_field(1); // uid field. - auto dimensionCondition = links->mutable_fields_in_condition(); - dimensionCondition->set_field(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED); - dimensionCondition->add_child()->set_field(1); // uid field. - return config; -} - -std::unique_ptr<LogEvent> CreateAppStartChangedEvent( - const int uid, const string& pkg_name, AppStartChanged::TransitionType type, - const string& activity_name, const string& calling_pkg_name, const bool is_instant_app, - int64_t activity_start_msec, uint64_t timestampNs) { - auto logEvent = std::make_unique<LogEvent>( - android::util::APP_START_CHANGED, timestampNs); - logEvent->write(uid); - logEvent->write(pkg_name); - logEvent->write(type); - logEvent->write(activity_name); - logEvent->write(calling_pkg_name); - logEvent->write(is_instant_app); - logEvent->write(activity_start_msec); - logEvent->init(); - return logEvent; -} - -} // namespace - -TEST(GaugeMetricE2eTest, TestMultipleFieldsForPushedEvent) { - auto config = CreateStatsdConfigForPushedEvent(); - int64_t bucketStartTimeNs = 10000000000; - int64_t bucketSizeNs = - TimeUnitToBucketSizeInMillis(config.gauge_metric(0).bucket()) * 1000000; - - ConfigKey cfgKey; - auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey); - EXPECT_EQ(processor->mMetricsManagers.size(), 1u); - EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); - - int appUid1 = 123; - int appUid2 = 456; - std::vector<std::unique_ptr<LogEvent>> events; - events.push_back(CreateMoveToBackgroundEvent(appUid1, bucketStartTimeNs + 15)); - events.push_back(CreateMoveToForegroundEvent(appUid1, bucketStartTimeNs + bucketSizeNs + 250)); - events.push_back(CreateMoveToBackgroundEvent(appUid1, bucketStartTimeNs + bucketSizeNs + 350)); - events.push_back(CreateMoveToForegroundEvent( - appUid1, bucketStartTimeNs + 2 * bucketSizeNs + 100)); - - - events.push_back(CreateAppStartChangedEvent( - appUid1, "app1", AppStartChanged::WARM, "activity_name1", "calling_pkg_name1", - true /*is_instant_app*/, 101 /*activity_start_msec*/, bucketStartTimeNs + 10)); - events.push_back(CreateAppStartChangedEvent( - appUid1, "app1", AppStartChanged::HOT, "activity_name2", "calling_pkg_name2", - true /*is_instant_app*/, 102 /*activity_start_msec*/, bucketStartTimeNs + 20)); - events.push_back(CreateAppStartChangedEvent( - appUid1, "app1", AppStartChanged::COLD, "activity_name3", "calling_pkg_name3", - true /*is_instant_app*/, 103 /*activity_start_msec*/, bucketStartTimeNs + 30)); - events.push_back(CreateAppStartChangedEvent( - appUid1, "app1", AppStartChanged::WARM, "activity_name4", "calling_pkg_name4", - true /*is_instant_app*/, 104 /*activity_start_msec*/, - bucketStartTimeNs + bucketSizeNs + 30)); - events.push_back(CreateAppStartChangedEvent( - appUid1, "app1", AppStartChanged::COLD, "activity_name5", "calling_pkg_name5", - true /*is_instant_app*/, 105 /*activity_start_msec*/, - bucketStartTimeNs + 2 * bucketSizeNs)); - events.push_back(CreateAppStartChangedEvent( - appUid1, "app1", AppStartChanged::HOT, "activity_name6", "calling_pkg_name6", - false /*is_instant_app*/, 106 /*activity_start_msec*/, - bucketStartTimeNs + 2 * bucketSizeNs + 10)); - - events.push_back(CreateMoveToBackgroundEvent(appUid2, bucketStartTimeNs + bucketSizeNs + 10)); - events.push_back(CreateAppStartChangedEvent( - appUid2, "app2", AppStartChanged::COLD, "activity_name7", "calling_pkg_name7", - true /*is_instant_app*/, 201 /*activity_start_msec*/, - bucketStartTimeNs + 2 * bucketSizeNs + 10)); - - sortLogEventsByTimestamp(&events); - - for (const auto& event : events) { - processor->OnLogEvent(event.get()); - } - ConfigMetricsReportList reports; - vector<uint8_t> buffer; - processor->onDumpReport(cfgKey, bucketStartTimeNs + 3 * bucketSizeNs, &buffer); - EXPECT_TRUE(buffer.size() > 0); - EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); - EXPECT_EQ(reports.reports_size(), 1); - EXPECT_EQ(reports.reports(0).metrics_size(), 1); - StatsLogReport::GaugeMetricDataWrapper gaugeMetrics; - sortMetricDataByDimensionsValue(reports.reports(0).metrics(0).gauge_metrics(), &gaugeMetrics); - EXPECT_EQ(gaugeMetrics.data_size(), 2); - - auto data = gaugeMetrics.data(0); - EXPECT_EQ(data.dimensions_in_what().field(), android::util::APP_START_CHANGED); - EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); - EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1 /* uid field */); - EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), appUid1); - EXPECT_EQ(data.bucket_info_size(), 3); - EXPECT_EQ(data.bucket_info(0).atom_size(), 1); - EXPECT_EQ(data.bucket_info(0).start_bucket_nanos(), bucketStartTimeNs); - EXPECT_EQ(data.bucket_info(0).end_bucket_nanos(), bucketStartTimeNs + bucketSizeNs); - EXPECT_EQ(data.bucket_info(0).atom(0).app_start_changed().type(), AppStartChanged::HOT); - EXPECT_EQ(data.bucket_info(0).atom(0).app_start_changed().activity_name(), "activity_name2"); - EXPECT_EQ(data.bucket_info(0).atom(0).app_start_changed().activity_start_millis(), 102L); - - EXPECT_EQ(data.bucket_info(1).atom_size(), 1); - EXPECT_EQ(data.bucket_info(1).start_bucket_nanos(), bucketStartTimeNs + bucketSizeNs); - EXPECT_EQ(data.bucket_info(1).end_bucket_nanos(), bucketStartTimeNs + 2 * bucketSizeNs); - EXPECT_EQ(data.bucket_info(1).atom(0).app_start_changed().type(), AppStartChanged::WARM); - EXPECT_EQ(data.bucket_info(1).atom(0).app_start_changed().activity_name(), "activity_name4"); - EXPECT_EQ(data.bucket_info(1).atom(0).app_start_changed().activity_start_millis(), 104L); - - EXPECT_EQ(data.bucket_info(2).atom_size(), 1); - EXPECT_EQ(data.bucket_info(2).start_bucket_nanos(), bucketStartTimeNs + 2 * bucketSizeNs); - EXPECT_EQ(data.bucket_info(2).end_bucket_nanos(), bucketStartTimeNs + 3 * bucketSizeNs); - EXPECT_EQ(data.bucket_info(2).atom(0).app_start_changed().type(), AppStartChanged::COLD); - EXPECT_EQ(data.bucket_info(2).atom(0).app_start_changed().activity_name(), "activity_name5"); - EXPECT_EQ(data.bucket_info(2).atom(0).app_start_changed().activity_start_millis(), 105L); - - data = gaugeMetrics.data(1); - - EXPECT_EQ(data.dimensions_in_what().field(), android::util::APP_START_CHANGED); - EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); - EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1 /* uid field */); - EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), appUid2); - EXPECT_EQ(data.bucket_info_size(), 1); - EXPECT_EQ(data.bucket_info(0).atom_size(), 1); - EXPECT_EQ(data.bucket_info(0).start_bucket_nanos(), bucketStartTimeNs + 2 * bucketSizeNs); - EXPECT_EQ(data.bucket_info(0).end_bucket_nanos(), bucketStartTimeNs + 3 * bucketSizeNs); - EXPECT_EQ(data.bucket_info(0).atom(0).app_start_changed().type(), AppStartChanged::COLD); - EXPECT_EQ(data.bucket_info(0).atom(0).app_start_changed().activity_name(), "activity_name7"); - EXPECT_EQ(data.bucket_info(0).atom(0).app_start_changed().activity_start_millis(), 201L); -} - -#else -GTEST_LOG_(INFO) << "This test does nothing.\n"; -#endif - -} // namespace statsd -} // namespace os -} // namespace android diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java index 41eeb9acb5ec..4531f53bd86f 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -16,8 +16,6 @@ package android.app; -import java.util.ArrayList; - import android.annotation.CallSuper; import android.content.ComponentCallbacks; import android.content.ComponentCallbacks2; @@ -26,8 +24,11 @@ import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; +import android.util.Log; import android.view.autofill.AutofillManager; +import java.util.ArrayList; + /** * Base class for maintaining global application state. You can provide your own * implementation by creating a subclass and specifying the fully-qualified name @@ -46,6 +47,7 @@ import android.view.autofill.AutofillManager; * </p> */ public class Application extends ContextWrapper implements ComponentCallbacks2 { + private static final String TAG = "Application"; private ArrayList<ComponentCallbacks> mComponentCallbacks = new ArrayList<ComponentCallbacks>(); private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = @@ -318,6 +320,9 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { if (client != null) { return client; } + if (android.view.autofill.Helper.sVerbose) { + Log.v(TAG, "getAutofillClient(): null on super, trying to find activity thread"); + } // Okay, ppl use the application context when they should not. This breaks // autofill among other things. We pick the focused activity since autofill // interacts only with the currently focused activity and we need the fill @@ -338,9 +343,16 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { continue; } if (activity.getWindow().getDecorView().hasFocus()) { - return record.activity; + if (android.view.autofill.Helper.sVerbose) { + Log.v(TAG, "getAutofillClient(): found activity for " + this + ": " + activity); + } + return activity; } } + if (android.view.autofill.Helper.sVerbose) { + Log.v(TAG, "getAutofillClient(): none of the " + activityCount + " activities on " + + this + " have focus"); + } return null; } } diff --git a/core/java/android/app/slice/ISliceManager.aidl b/core/java/android/app/slice/ISliceManager.aidl index 20ec75a36ad3..74e3c3ee4c81 100644 --- a/core/java/android/app/slice/ISliceManager.aidl +++ b/core/java/android/app/slice/ISliceManager.aidl @@ -27,6 +27,7 @@ interface ISliceManager { SliceSpec[] getPinnedSpecs(in Uri uri, String pkg); int checkSlicePermission(in Uri uri, String pkg, int pid, int uid); void grantPermissionFromUser(in Uri uri, String pkg, String callingPkg, boolean allSlices); + Uri[] getPinnedSlices(String pkg); byte[] getBackupPayload(int user); void applyRestore(in byte[] payload, int user); diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java index 4f3cd63841eb..c5ea9b23fece 100644 --- a/core/java/android/app/slice/SliceManager.java +++ b/core/java/android/app/slice/SliceManager.java @@ -184,6 +184,18 @@ public class SliceManager { } /** + * Get the list of currently pinned slices for this app. + * @see SliceProvider#onSlicePinned + */ + public @NonNull List<Uri> getPinnedSlices() { + try { + return Arrays.asList(mService.getPinnedSlices(mContext.getPackageName())); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Obtains a list of slices that are descendants of the specified Uri. * <p> * Not all slice providers will implement this functionality, in which case, diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java index f7fb84ba9d0a..4c7e97bcb8da 100644 --- a/core/java/android/app/usage/UsageEvents.java +++ b/core/java/android/app/usage/UsageEvents.java @@ -109,11 +109,11 @@ public final class UsageEvents implements Parcelable { public static final int NOTIFICATION_SEEN = 10; /** - * An event type denoting a change in App Standby Bucket. Additional bucket information - * is contained in mBucketAndReason. - * @hide + * An event type denoting a change in App Standby Bucket. The new bucket can be + * retrieved by calling {@link #getStandbyBucket()}. + * + * @see UsageStatsManager#getAppStandbyBucket() */ - @SystemApi public static final int STANDBY_BUCKET_CHANGED = 11; /** @@ -254,8 +254,11 @@ public final class UsageEvents implements Parcelable { /** * The event type. * - * See {@link #MOVE_TO_BACKGROUND} - * See {@link #MOVE_TO_FOREGROUND} + * @see #MOVE_TO_BACKGROUND + * @see #MOVE_TO_FOREGROUND + * @see #CONFIGURATION_CHANGE + * @see #USER_INTERACTION + * @see #STANDBY_BUCKET_CHANGED */ public int getEventType() { return mEventType; @@ -283,9 +286,8 @@ public final class UsageEvents implements Parcelable { * Returns the standby bucket of the app, if the event is of type * {@link #STANDBY_BUCKET_CHANGED}, otherwise returns 0. * @return the standby bucket associated with the event. - * @hide + * */ - @SystemApi public int getStandbyBucket() { return (mBucketAndReason & 0xFFFF0000) >>> 16; } diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index efa90d308ee0..387a836e6961 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -1188,7 +1188,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { if (category != CATEGORY_UNDEFINED) { pw.println(prefix + "category=" + category); } - pw.println("isAllowedToUseHiddenApi=" + isAllowedToUseHiddenApi()); + pw.println(prefix + "isAllowedToUseHiddenApi=" + isAllowedToUseHiddenApi()); } super.dumpBack(pw, prefix); } diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 5b3d3e595a91..6feb170b341d 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -451,6 +451,9 @@ public abstract class PackageManagerInternal { /** Whether the binder caller can access instant apps. */ public abstract boolean canAccessInstantApps(int callingUid, int userId); + /** Whether the binder caller can access the given component. */ + public abstract boolean canAccessComponent(int callingUid, ComponentName component, int userId); + /** * Returns {@code true} if a given package has instant application meta-data. * Otherwise, returns {@code false}. Meta-data is state (eg. cookie, app icon, etc) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ef1dce3aabe6..60f72953c312 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -10271,31 +10271,6 @@ public final class Settings { "battery_saver_device_specific_constants"; /** - * Battery anomaly detection specific settings - * This is encoded as a key=value list, separated by commas. - * wakeup_blacklisted_tags is a string, encoded as a set of tags, encoded via - * {@link Uri#encode(String)}, separated by colons. Ex: - * - * "anomaly_detection_enabled=true,wakelock_threshold=2000,wakeup_alarm_enabled=true," - * "wakeup_alarm_threshold=10,wakeup_blacklisted_tags=tag1:tag2:with%2Ccomma:with%3Acolon" - * - * The following keys are supported: - * - * <pre> - * anomaly_detection_enabled (boolean) - * wakelock_enabled (boolean) - * wakelock_threshold (long) - * wakeup_alarm_enabled (boolean) - * wakeup_alarm_threshold (long) - * wakeup_blacklisted_tags (string) - * bluetooth_scan_enabled (boolean) - * bluetooth_scan_threshold (long) - * </pre> - * @hide - */ - public static final String ANOMALY_DETECTION_CONSTANTS = "anomaly_detection_constants"; - - /** * Battery tip specific settings * This is encoded as a key=value list, separated by commas. Ex: * @@ -10324,6 +10299,31 @@ public final class Settings { public static final String BATTERY_TIP_CONSTANTS = "battery_tip_constants"; /** + * Battery anomaly detection specific settings + * This is encoded as a key=value list, separated by commas. + * wakeup_blacklisted_tags is a string, encoded as a set of tags, encoded via + * {@link Uri#encode(String)}, separated by colons. Ex: + * + * "anomaly_detection_enabled=true,wakelock_threshold=2000,wakeup_alarm_enabled=true," + * "wakeup_alarm_threshold=10,wakeup_blacklisted_tags=tag1:tag2:with%2Ccomma:with%3Acolon" + * + * The following keys are supported: + * + * <pre> + * anomaly_detection_enabled (boolean) + * wakelock_enabled (boolean) + * wakelock_threshold (long) + * wakeup_alarm_enabled (boolean) + * wakeup_alarm_threshold (long) + * wakeup_blacklisted_tags (string) + * bluetooth_scan_enabled (boolean) + * bluetooth_scan_threshold (long) + * </pre> + * @hide + */ + public static final String ANOMALY_DETECTION_CONSTANTS = "anomaly_detection_constants"; + + /** * An integer to show the version of the anomaly config. Ex: 1, which means * current version is 1. * @hide @@ -10598,7 +10598,7 @@ public final class Settings { * Default: 1 * @hide */ - public static final java.lang.String APP_STANDBY_ENABLED = "app_standby_enabled"; + public static final String APP_STANDBY_ENABLED = "app_standby_enabled"; /** * Whether or not app auto restriction is enabled. When it is enabled, settings app will @@ -10609,7 +10609,7 @@ public final class Settings { * * @hide */ - public static final java.lang.String APP_AUTO_RESTRICTION_ENABLED = + public static final String APP_AUTO_RESTRICTION_ENABLED = "app_auto_restriction_enabled"; private static final Validator APP_AUTO_RESTRICTION_ENABLED_VALIDATOR = diff --git a/core/java/android/view/RemoteAnimationDefinition.java b/core/java/android/view/RemoteAnimationDefinition.java index 8def43512e51..d2240e1f2775 100644 --- a/core/java/android/view/RemoteAnimationDefinition.java +++ b/core/java/android/view/RemoteAnimationDefinition.java @@ -16,10 +16,14 @@ package android.view; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; + import android.annotation.Nullable; +import android.app.WindowConfiguration; +import android.app.WindowConfiguration.ActivityType; import android.os.Parcel; import android.os.Parcelable; -import android.util.ArrayMap; +import android.util.ArraySet; import android.util.SparseArray; import android.view.WindowManager.TransitionType; @@ -30,7 +34,7 @@ import android.view.WindowManager.TransitionType; */ public class RemoteAnimationDefinition implements Parcelable { - private final SparseArray<RemoteAnimationAdapter> mTransitionAnimationMap; + private final SparseArray<RemoteAnimationAdapterEntry> mTransitionAnimationMap; public RemoteAnimationDefinition() { mTransitionAnimationMap = new SparseArray<>(); @@ -40,34 +44,70 @@ public class RemoteAnimationDefinition implements Parcelable { * Registers a remote animation for a specific transition. * * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. + * @param activityTypeFilter The remote animation only runs if an activity with type of this + * parameter is involved in the transition. + * @param adapter The adapter that described how to run the remote animation. + */ + public void addRemoteAnimation(@TransitionType int transition, + @ActivityType int activityTypeFilter, RemoteAnimationAdapter adapter) { + mTransitionAnimationMap.put(transition, + new RemoteAnimationAdapterEntry(adapter, activityTypeFilter)); + } + + /** + * Registers a remote animation for a specific transition without defining an activity type + * filter. + * + * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. * @param adapter The adapter that described how to run the remote animation. */ public void addRemoteAnimation(@TransitionType int transition, RemoteAnimationAdapter adapter) { - mTransitionAnimationMap.put(transition, adapter); + addRemoteAnimation(transition, ACTIVITY_TYPE_UNDEFINED, adapter); } /** * Checks whether a remote animation for specific transition is defined. * * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. + * @param activityTypes The set of activity types of activities that are involved in the + * transition. Will be used for filtering. * @return Whether this definition has defined a remote animation for the specified transition. */ - public boolean hasTransition(@TransitionType int transition) { - return mTransitionAnimationMap.get(transition) != null; + public boolean hasTransition(@TransitionType int transition, ArraySet<Integer> activityTypes) { + return getAdapter(transition, activityTypes) != null; } /** * Retrieves the remote animation for a specific transition. * * @param transition The transition type. Must be one of WindowManager.TRANSIT_* values. + * @param activityTypes The set of activity types of activities that are involved in the + * transition. Will be used for filtering. * @return The remote animation adapter for the specified transition. */ - public @Nullable RemoteAnimationAdapter getAdapter(@TransitionType int transition) { - return mTransitionAnimationMap.get(transition); + public @Nullable RemoteAnimationAdapter getAdapter(@TransitionType int transition, + ArraySet<Integer> activityTypes) { + final RemoteAnimationAdapterEntry entry = mTransitionAnimationMap.get(transition); + if (entry == null) { + return null; + } + if (entry.activityTypeFilter == ACTIVITY_TYPE_UNDEFINED + || activityTypes.contains(entry.activityTypeFilter)) { + return entry.adapter; + } else { + return null; + } } public RemoteAnimationDefinition(Parcel in) { - mTransitionAnimationMap = in.readSparseArray(null /* loader */); + final int size = in.readInt(); + mTransitionAnimationMap = new SparseArray<>(size); + for (int i = 0; i < size; i++) { + final int transition = in.readInt(); + final RemoteAnimationAdapterEntry entry = in.readTypedObject( + RemoteAnimationAdapterEntry.CREATOR); + mTransitionAnimationMap.put(transition, entry); + } } /** @@ -76,7 +116,7 @@ public class RemoteAnimationDefinition implements Parcelable { */ public void setCallingPid(int pid) { for (int i = mTransitionAnimationMap.size() - 1; i >= 0; i--) { - mTransitionAnimationMap.valueAt(i).setCallingPid(pid); + mTransitionAnimationMap.valueAt(i).adapter.setCallingPid(pid); } } @@ -87,7 +127,12 @@ public class RemoteAnimationDefinition implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeSparseArray((SparseArray) mTransitionAnimationMap); + final int size = mTransitionAnimationMap.size(); + dest.writeInt(size); + for (int i = 0; i < size; i++) { + dest.writeInt(mTransitionAnimationMap.keyAt(i)); + dest.writeTypedObject(mTransitionAnimationMap.valueAt(i), flags); + } } public static final Creator<RemoteAnimationDefinition> CREATOR = @@ -100,4 +145,50 @@ public class RemoteAnimationDefinition implements Parcelable { return new RemoteAnimationDefinition[size]; } }; + + private static class RemoteAnimationAdapterEntry implements Parcelable { + + final RemoteAnimationAdapter adapter; + + /** + * Only run the transition if one of the activities matches the filter. + * {@link WindowConfiguration.ACTIVITY_TYPE_UNDEFINED} means no filter + */ + @ActivityType final int activityTypeFilter; + + RemoteAnimationAdapterEntry(RemoteAnimationAdapter adapter, int activityTypeFilter) { + this.adapter = adapter; + this.activityTypeFilter = activityTypeFilter; + } + + private RemoteAnimationAdapterEntry(Parcel in) { + adapter = in.readParcelable(RemoteAnimationAdapter.class.getClassLoader()); + activityTypeFilter = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(adapter, flags); + dest.writeInt(activityTypeFilter); + } + + @Override + public int describeContents() { + return 0; + } + + private static final Creator<RemoteAnimationAdapterEntry> CREATOR + = new Creator<RemoteAnimationAdapterEntry>() { + + @Override + public RemoteAnimationAdapterEntry createFromParcel(Parcel in) { + return new RemoteAnimationAdapterEntry(in); + } + + @Override + public RemoteAnimationAdapterEntry[] newArray(int size) { + return new RemoteAnimationAdapterEntry[size]; + } + }; + } } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index f39b73e671d4..5178a97e6b68 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -251,7 +251,7 @@ import java.util.Map; * density, or high density screens, respectively. For example: * <pre> * <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="hdpi.css" /></pre> - * <p>The {@code hdpi.css} stylesheet is only used for devices with a screen pixel ration of 1.5, + * <p>The {@code hdpi.css} stylesheet is only used for devices with a screen pixel ratio of 1.5, * which is the high density pixel ratio. * </li> * </ul> diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java index 07593a512216..49e11b8baf51 100644 --- a/core/java/android/webkit/WebViewZygote.java +++ b/core/java/android/webkit/WebViewZygote.java @@ -19,6 +19,7 @@ package android.webkit; import android.app.LoadedApk; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; +import android.os.AsyncTask; import android.os.Build; import android.os.ChildZygoteProcess; import android.os.Process; @@ -93,11 +94,17 @@ public class WebViewZygote { synchronized (sLock) { sMultiprocessEnabled = enabled; - // When multi-process is disabled, kill the zygote. When it is enabled, - // the zygote is not explicitly started here to avoid waiting on the - // zygote launch at boot. Instead, the zygote will be started when it is - // first needed in getProcess(). - if (!enabled) { + // When toggling between multi-process being on/off, start or stop the + // zygote. If it is enabled and the zygote is not yet started, launch it. + // Otherwise, kill it. The name may be null if the package information has + // not yet been resolved. + if (enabled) { + // Run on a background thread as this waits for the zygote to start and we don't + // want to block the caller on this. It's okay if this is delayed as anyone trying + // to use the zygote will call it first anyway. + AsyncTask.THREAD_POOL_EXECUTOR.execute(WebViewZygote::getProcess); + } else { + // No need to run this in the background, it's very brief. stopZygoteLocked(); } } diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java index 44adbb22eb7e..59504360f3cf 100644 --- a/core/java/com/android/internal/notification/SystemNotificationChannels.java +++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java @@ -50,6 +50,7 @@ public class SystemNotificationChannels { public static String FOREGROUND_SERVICE = "FOREGROUND_SERVICE"; public static String HEAVY_WEIGHT_APP = "HEAVY_WEIGHT_APP"; public static String SYSTEM_CHANGES = "SYSTEM_CHANGES"; + public static String DO_NOT_DISTURB = "DO_NOT_DISTURB"; public static void createAll(Context context) { final NotificationManager nm = context.getSystemService(NotificationManager.class); @@ -158,6 +159,11 @@ public class SystemNotificationChannels { NotificationManager.IMPORTANCE_LOW); channelsList.add(systemChanges); + NotificationChannel dndChanges = new NotificationChannel(DO_NOT_DISTURB, + context.getString(R.string.notification_channel_do_not_disturb), + NotificationManager.IMPORTANCE_LOW); + channelsList.add(dndChanges); + nm.createNotificationChannels(channelsList); } diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index d05be2ca787b..7c8a52d1432b 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -71,6 +71,9 @@ using android::String8; using android::base::StringPrintf; using android::base::WriteStringToFile; +#define CREATE_ERROR(...) StringPrintf("%s:%d: ", __FILE__, __LINE__). \ + append(StringPrintf(__VA_ARGS__)) + static pid_t gSystemServerPid = 0; static const char kZygoteClassName[] = "com/android/internal/os/Zygote"; @@ -186,30 +189,32 @@ static void UnsetChldSignalHandler() { // Calls POSIX setgroups() using the int[] object as an argument. // A NULL argument is tolerated. -static void SetGids(JNIEnv* env, jintArray javaGids) { +static bool SetGids(JNIEnv* env, jintArray javaGids, std::string* error_msg) { if (javaGids == NULL) { - return; + return true; } ScopedIntArrayRO gids(env, javaGids); if (gids.get() == NULL) { - RuntimeAbort(env, __LINE__, "Getting gids int array failed"); + *error_msg = CREATE_ERROR("Getting gids int array failed"); + return false; } int rc = setgroups(gids.size(), reinterpret_cast<const gid_t*>(&gids[0])); if (rc == -1) { - std::ostringstream oss; - oss << "setgroups failed: " << strerror(errno) << ", gids.size=" << gids.size(); - RuntimeAbort(env, __LINE__, oss.str().c_str()); + *error_msg = CREATE_ERROR("setgroups failed: %s, gids.size=%zu", strerror(errno), gids.size()); + return false; } + + return true; } // Sets the resource limits via setrlimit(2) for the values in the // two-dimensional array of integers that's passed in. The second dimension // contains a tuple of length 3: (resource, rlim_cur, rlim_max). NULL is // treated as an empty array. -static void SetRLimits(JNIEnv* env, jobjectArray javaRlimits) { +static bool SetRLimits(JNIEnv* env, jobjectArray javaRlimits, std::string* error_msg) { if (javaRlimits == NULL) { - return; + return true; } rlimit rlim; @@ -219,7 +224,8 @@ static void SetRLimits(JNIEnv* env, jobjectArray javaRlimits) { ScopedLocalRef<jobject> javaRlimitObject(env, env->GetObjectArrayElement(javaRlimits, i)); ScopedIntArrayRO javaRlimit(env, reinterpret_cast<jintArray>(javaRlimitObject.get())); if (javaRlimit.size() != 3) { - RuntimeAbort(env, __LINE__, "rlimits array must have a second dimension of size 3"); + *error_msg = CREATE_ERROR("rlimits array must have a second dimension of size 3"); + return false; } rlim.rlim_cur = javaRlimit[1]; @@ -227,11 +233,13 @@ static void SetRLimits(JNIEnv* env, jobjectArray javaRlimits) { int rc = setrlimit(javaRlimit[0], &rlim); if (rc == -1) { - ALOGE("setrlimit(%d, {%ld, %ld}) failed", javaRlimit[0], rlim.rlim_cur, + *error_msg = CREATE_ERROR("setrlimit(%d, {%ld, %ld}) failed", javaRlimit[0], rlim.rlim_cur, rlim.rlim_max); - RuntimeAbort(env, __LINE__, "setrlimit failed"); + return false; } } + + return true; } // The debug malloc library needs to know whether it's the zygote or a child. @@ -259,14 +267,16 @@ static void SetUpSeccompFilter(uid_t uid) { } } -static void EnableKeepCapabilities(JNIEnv* env) { +static bool EnableKeepCapabilities(std::string* error_msg) { int rc = prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); if (rc == -1) { - RuntimeAbort(env, __LINE__, "prctl(PR_SET_KEEPCAPS) failed"); + *error_msg = CREATE_ERROR("prctl(PR_SET_KEEPCAPS) failed: %s", strerror(errno)); + return false; } + return true; } -static void DropCapabilitiesBoundingSet(JNIEnv* env) { +static bool DropCapabilitiesBoundingSet(std::string* error_msg) { for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) { int rc = prctl(PR_CAPBSET_DROP, i, 0, 0, 0); if (rc == -1) { @@ -274,14 +284,15 @@ static void DropCapabilitiesBoundingSet(JNIEnv* env) { ALOGE("prctl(PR_CAPBSET_DROP) failed with EINVAL. Please verify " "your kernel is compiled with file capabilities support"); } else { - ALOGE("prctl(PR_CAPBSET_DROP, %d) failed: %s", i, strerror(errno)); - RuntimeAbort(env, __LINE__, "prctl(PR_CAPBSET_DROP) failed"); + *error_msg = CREATE_ERROR("prctl(PR_CAPBSET_DROP, %d) failed: %s", i, strerror(errno)); + return false; } } } + return true; } -static void SetInheritable(JNIEnv* env, uint64_t inheritable) { +static bool SetInheritable(uint64_t inheritable, std::string* error_msg) { __user_cap_header_struct capheader; memset(&capheader, 0, sizeof(capheader)); capheader.version = _LINUX_CAPABILITY_VERSION_3; @@ -289,21 +300,23 @@ static void SetInheritable(JNIEnv* env, uint64_t inheritable) { __user_cap_data_struct capdata[2]; if (capget(&capheader, &capdata[0]) == -1) { - ALOGE("capget failed: %s", strerror(errno)); - RuntimeAbort(env, __LINE__, "capget failed"); + *error_msg = CREATE_ERROR("capget failed: %s", strerror(errno)); + return false; } capdata[0].inheritable = inheritable; capdata[1].inheritable = inheritable >> 32; if (capset(&capheader, &capdata[0]) == -1) { - ALOGE("capset(inh=%" PRIx64 ") failed: %s", inheritable, strerror(errno)); - RuntimeAbort(env, __LINE__, "capset failed"); + *error_msg = CREATE_ERROR("capset(inh=%" PRIx64 ") failed: %s", inheritable, strerror(errno)); + return false; } + + return true; } -static void SetCapabilities(JNIEnv* env, uint64_t permitted, uint64_t effective, - uint64_t inheritable) { +static bool SetCapabilities(uint64_t permitted, uint64_t effective, uint64_t inheritable, + std::string* error_msg) { __user_cap_header_struct capheader; memset(&capheader, 0, sizeof(capheader)); capheader.version = _LINUX_CAPABILITY_VERSION_3; @@ -319,18 +332,20 @@ static void SetCapabilities(JNIEnv* env, uint64_t permitted, uint64_t effective, capdata[1].inheritable = inheritable >> 32; if (capset(&capheader, &capdata[0]) == -1) { - ALOGE("capset(perm=%" PRIx64 ", eff=%" PRIx64 ", inh=%" PRIx64 ") failed: %s", permitted, - effective, inheritable, strerror(errno)); - RuntimeAbort(env, __LINE__, "capset failed"); + *error_msg = CREATE_ERROR("capset(perm=%" PRIx64 ", eff=%" PRIx64 ", inh=%" PRIx64 ") " + "failed: %s", permitted, effective, inheritable, strerror(errno)); + return false; } + return true; } -static void SetSchedulerPolicy(JNIEnv* env) { +static bool SetSchedulerPolicy(std::string* error_msg) { errno = -set_sched_policy(0, SP_DEFAULT); if (errno != 0) { - ALOGE("set_sched_policy(0, SP_DEFAULT) failed"); - RuntimeAbort(env, __LINE__, "set_sched_policy(0, SP_DEFAULT) failed"); + *error_msg = CREATE_ERROR("set_sched_policy(0, SP_DEFAULT) failed: %s", strerror(errno)); + return false; } + return true; } static int UnmountTree(const char* path) { @@ -364,7 +379,7 @@ static int UnmountTree(const char* path) { // Create a private mount namespace and bind mount appropriate emulated // storage for the given user. static bool MountEmulatedStorage(uid_t uid, jint mount_mode, - bool force_mount_namespace) { + bool force_mount_namespace, std::string* error_msg) { // See storage config details at http://source.android.com/tech/storage/ String8 storageSource; @@ -381,7 +396,7 @@ static bool MountEmulatedStorage(uid_t uid, jint mount_mode, // Create a second private mount namespace for our process if (unshare(CLONE_NEWNS) == -1) { - ALOGW("Failed to unshare(): %s", strerror(errno)); + *error_msg = CREATE_ERROR("Failed to unshare(): %s", strerror(errno)); return false; } @@ -392,7 +407,9 @@ static bool MountEmulatedStorage(uid_t uid, jint mount_mode, if (TEMP_FAILURE_RETRY(mount(storageSource.string(), "/storage", NULL, MS_BIND | MS_REC | MS_SLAVE, NULL)) == -1) { - ALOGW("Failed to mount %s to /storage: %s", storageSource.string(), strerror(errno)); + *error_msg = CREATE_ERROR("Failed to mount %s to /storage: %s", + storageSource.string(), + strerror(errno)); return false; } @@ -400,11 +417,14 @@ static bool MountEmulatedStorage(uid_t uid, jint mount_mode, userid_t user_id = multiuser_get_user_id(uid); const String8 userSource(String8::format("/mnt/user/%d", user_id)); if (fs_prepare_dir(userSource.string(), 0751, 0, 0) == -1) { + *error_msg = CREATE_ERROR("fs_prepare_dir failed on %s", userSource.string()); return false; } if (TEMP_FAILURE_RETRY(mount(userSource.string(), "/storage/self", NULL, MS_BIND, NULL)) == -1) { - ALOGW("Failed to mount %s to /storage/self: %s", userSource.string(), strerror(errno)); + *error_msg = CREATE_ERROR("Failed to mount %s to /storage/self: %s", + userSource.string(), + strerror(errno)); return false; } @@ -436,31 +456,32 @@ static bool NeedsNoRandomizeWorkaround() { // descriptor (if any) is closed via dup2(), replacing it with a valid // (open) descriptor to /dev/null. -static void DetachDescriptors(JNIEnv* env, jintArray fdsToClose) { +static bool DetachDescriptors(JNIEnv* env, jintArray fdsToClose, std::string* error_msg) { if (!fdsToClose) { - return; + return true; } jsize count = env->GetArrayLength(fdsToClose); ScopedIntArrayRO ar(env, fdsToClose); if (ar.get() == NULL) { - RuntimeAbort(env, __LINE__, "Bad fd array"); + *error_msg = "Bad fd array"; + return false; } jsize i; int devnull; for (i = 0; i < count; i++) { devnull = open("/dev/null", O_RDWR); if (devnull < 0) { - ALOGE("Failed to open /dev/null: %s", strerror(errno)); - RuntimeAbort(env, __LINE__, "Failed to open /dev/null"); - continue; + *error_msg = std::string("Failed to open /dev/null: ").append(strerror(errno)); + return false; } ALOGV("Switching descriptor %d to /dev/null: %s", ar[i], strerror(errno)); if (dup2(devnull, ar[i]) < 0) { - ALOGE("Failed dup2() on descriptor %d: %s", ar[i], strerror(errno)); - RuntimeAbort(env, __LINE__, "Failed dup2()"); + *error_msg = StringPrintf("Failed dup2() on descriptor %d: %s", ar[i], strerror(errno)); + return false; } close(devnull); } + return true; } void SetThreadName(const char* thread_name) { @@ -495,20 +516,23 @@ void SetThreadName(const char* thread_name) { // The list of open zygote file descriptors. static FileDescriptorTable* gOpenFdTable = NULL; -static void FillFileDescriptorVector(JNIEnv* env, +static bool FillFileDescriptorVector(JNIEnv* env, jintArray java_fds, - std::vector<int>* fds) { + std::vector<int>* fds, + std::string* error_msg) { CHECK(fds != nullptr); if (java_fds != nullptr) { ScopedIntArrayRO ar(env, java_fds); if (ar.get() == nullptr) { - RuntimeAbort(env, __LINE__, "Bad fd array"); + *error_msg = "Bad fd array"; + return false; } fds->reserve(ar.size()); for (size_t i = 0; i < ar.size(); ++i) { fds->push_back(ar[i]); } } + return true; } // Utility routine to fork zygote and specialize the child process. @@ -526,32 +550,53 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra sigemptyset(&sigchld); sigaddset(&sigchld, SIGCHLD); + auto fail_fn = [env, java_se_name, is_system_server](const std::string& msg) + __attribute__ ((noreturn)) { + const char* se_name_c_str = nullptr; + std::unique_ptr<ScopedUtfChars> se_name; + if (java_se_name != nullptr) { + se_name.reset(new ScopedUtfChars(env, java_se_name)); + se_name_c_str = se_name->c_str(); + } + if (se_name_c_str == nullptr && is_system_server) { + se_name_c_str = "system_server"; + } + const std::string& error_msg = (se_name_c_str == nullptr) + ? msg + : StringPrintf("(%s) %s", se_name_c_str, msg.c_str()); + env->FatalError(error_msg.c_str()); + __builtin_unreachable(); + }; + // Temporarily block SIGCHLD during forks. The SIGCHLD handler might // log, which would result in the logging FDs we close being reopened. // This would cause failures because the FDs are not whitelisted. // // Note that the zygote process is single threaded at this point. if (sigprocmask(SIG_BLOCK, &sigchld, nullptr) == -1) { - ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); - RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_BLOCK, { SIGCHLD }) failed."); + fail_fn(CREATE_ERROR("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno))); } // Close any logging related FDs before we start evaluating the list of // file descriptors. __android_log_close(); + std::string error_msg; + // If this is the first fork for this zygote, create the open FD table. // If it isn't, we just need to check whether the list of open files has // changed (and it shouldn't in the normal case). std::vector<int> fds_to_ignore; - FillFileDescriptorVector(env, fdsToIgnore, &fds_to_ignore); + if (!FillFileDescriptorVector(env, fdsToIgnore, &fds_to_ignore, &error_msg)) { + fail_fn(error_msg); + } if (gOpenFdTable == NULL) { - gOpenFdTable = FileDescriptorTable::Create(fds_to_ignore); + gOpenFdTable = FileDescriptorTable::Create(fds_to_ignore, &error_msg); if (gOpenFdTable == NULL) { - RuntimeAbort(env, __LINE__, "Unable to construct file descriptor table."); + fail_fn(error_msg); } - } else if (!gOpenFdTable->Restat(fds_to_ignore)) { - RuntimeAbort(env, __LINE__, "Unable to restat file descriptor table."); + } else if (!gOpenFdTable->Restat(fds_to_ignore, &error_msg)) { + fail_fn(error_msg); } pid_t pid = fork(); @@ -560,17 +605,18 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra PreApplicationInit(); // Clean up any descriptors which must be closed immediately - DetachDescriptors(env, fdsToClose); + if (!DetachDescriptors(env, fdsToClose, &error_msg)) { + fail_fn(error_msg); + } // Re-open all remaining open file descriptors so that they aren't shared // with the zygote across a fork. - if (!gOpenFdTable->ReopenOrDetach()) { - RuntimeAbort(env, __LINE__, "Unable to reopen whitelisted descriptors."); + if (!gOpenFdTable->ReopenOrDetach(&error_msg)) { + fail_fn(error_msg); } if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) { - ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); - RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed."); + fail_fn(CREATE_ERROR("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno))); } // Must be called when the new process still has CAP_SYS_ADMIN. The other alternative is to @@ -580,11 +626,17 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra // Keep capabilities across UID change, unless we're staying root. if (uid != 0) { - EnableKeepCapabilities(env); + if (!EnableKeepCapabilities(&error_msg)) { + fail_fn(error_msg); + } } - SetInheritable(env, permittedCapabilities); - DropCapabilitiesBoundingSet(env); + if (!SetInheritable(permittedCapabilities, &error_msg)) { + fail_fn(error_msg); + } + if (!DropCapabilitiesBoundingSet(&error_msg)) { + fail_fn(error_msg); + } bool use_native_bridge = !is_system_server && (instructionSet != NULL) && android::NativeBridgeAvailable(); @@ -601,8 +653,8 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra ALOGW("Native bridge will not be used because dataDir == NULL."); } - if (!MountEmulatedStorage(uid, mount_external, use_native_bridge)) { - ALOGW("Failed to mount emulated storage: %s", strerror(errno)); + if (!MountEmulatedStorage(uid, mount_external, use_native_bridge, &error_msg)) { + ALOGW("Failed to mount emulated storage: %s (%s)", error_msg.c_str(), strerror(errno)); if (errno == ENOTCONN || errno == EROFS) { // When device is actively encrypting, we get ENOTCONN here // since FUSE was mounted before the framework restarted. @@ -610,7 +662,7 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra // FUSE hasn't been created yet by init. // In either case, continue without external storage. } else { - RuntimeAbort(env, __LINE__, "Cannot continue without emulated storage"); + fail_fn(error_msg); } } @@ -625,9 +677,14 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra } } - SetGids(env, javaGids); + std::string error_msg; + if (!SetGids(env, javaGids, &error_msg)) { + fail_fn(error_msg); + } - SetRLimits(env, javaRlimits); + if (!SetRLimits(env, javaRlimits, &error_msg)) { + fail_fn(error_msg); + } if (use_native_bridge) { ScopedUtfChars isa_string(env, instructionSet); @@ -637,14 +694,12 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra int rc = setresgid(gid, gid, gid); if (rc == -1) { - ALOGE("setresgid(%d) failed: %s", gid, strerror(errno)); - RuntimeAbort(env, __LINE__, "setresgid failed"); + fail_fn(CREATE_ERROR("setresgid(%d) failed: %s", gid, strerror(errno))); } rc = setresuid(uid, uid, uid); if (rc == -1) { - ALOGE("setresuid(%d) failed: %s", uid, strerror(errno)); - RuntimeAbort(env, __LINE__, "setresuid failed"); + fail_fn(CREATE_ERROR("setresuid(%d) failed: %s", uid, strerror(errno))); } if (NeedsNoRandomizeWorkaround()) { @@ -656,9 +711,14 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra } } - SetCapabilities(env, permittedCapabilities, effectiveCapabilities, permittedCapabilities); + if (!SetCapabilities(permittedCapabilities, effectiveCapabilities, permittedCapabilities, + &error_msg)) { + fail_fn(error_msg); + } - SetSchedulerPolicy(env); + if (!SetSchedulerPolicy(&error_msg)) { + fail_fn(error_msg); + } const char* se_info_c_str = NULL; ScopedUtfChars* se_info = NULL; @@ -666,7 +726,7 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra se_info = new ScopedUtfChars(env, java_se_info); se_info_c_str = se_info->c_str(); if (se_info_c_str == NULL) { - RuntimeAbort(env, __LINE__, "se_info_c_str == NULL"); + fail_fn("se_info_c_str == NULL"); } } const char* se_name_c_str = NULL; @@ -675,14 +735,13 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra se_name = new ScopedUtfChars(env, java_se_name); se_name_c_str = se_name->c_str(); if (se_name_c_str == NULL) { - RuntimeAbort(env, __LINE__, "se_name_c_str == NULL"); + fail_fn("se_name_c_str == NULL"); } } rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str); if (rc == -1) { - ALOGE("selinux_android_setcontext(%d, %d, \"%s\", \"%s\") failed", uid, - is_system_server, se_info_c_str, se_name_c_str); - RuntimeAbort(env, __LINE__, "selinux_android_setcontext failed"); + fail_fn(CREATE_ERROR("selinux_android_setcontext(%d, %d, \"%s\", \"%s\") failed", uid, + is_system_server, se_info_c_str, se_name_c_str)); } // Make it easier to debug audit logs by setting the main thread's name to the @@ -703,15 +762,14 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, runtime_flags, is_system_server, is_child_zygote, instructionSet); if (env->ExceptionCheck()) { - RuntimeAbort(env, __LINE__, "Error calling post fork hooks."); + fail_fn("Error calling post fork hooks."); } } else if (pid > 0) { // the parent process // We blocked SIGCHLD prior to a fork, we unblock it here. if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) { - ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); - RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed."); + fail_fn(CREATE_ERROR("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno))); } } return pid; diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp index 2e6058268115..c5904e0e9e5e 100644 --- a/core/jni/fd_utils.cpp +++ b/core/jni/fd_utils.cpp @@ -123,14 +123,57 @@ FileDescriptorWhitelist::FileDescriptorWhitelist() FileDescriptorWhitelist* FileDescriptorWhitelist::instance_ = nullptr; +// Keeps track of all relevant information (flags, offset etc.) of an +// open zygote file descriptor. +class FileDescriptorInfo { + public: + // Create a FileDescriptorInfo for a given file descriptor. Returns + // |NULL| if an error occurred. + static FileDescriptorInfo* CreateFromFd(int fd, std::string* error_msg); + + // Checks whether the file descriptor associated with this object + // refers to the same description. + bool Restat() const; + + bool ReopenOrDetach(std::string* error_msg) const; + + const int fd; + const struct stat stat; + const std::string file_path; + const int open_flags; + const int fd_flags; + const int fs_flags; + const off_t offset; + const bool is_sock; + + private: + FileDescriptorInfo(int fd); + + FileDescriptorInfo(struct stat stat, const std::string& file_path, int fd, int open_flags, + int fd_flags, int fs_flags, off_t offset); + + // Returns the locally-bound name of the socket |fd|. Returns true + // iff. all of the following hold : + // + // - the socket's sa_family is AF_UNIX. + // - the length of the path is greater than zero (i.e, not an unnamed socket). + // - the first byte of the path isn't zero (i.e, not a socket with an abstract + // address). + static bool GetSocketName(const int fd, std::string* result); + + bool DetachSocket(std::string* error_msg) const; + + DISALLOW_COPY_AND_ASSIGN(FileDescriptorInfo); +}; + // static -FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd) { +FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd, std::string* error_msg) { struct stat f_stat; // This should never happen; the zygote should always have the right set // of permissions required to stat all its open files. if (TEMP_FAILURE_RETRY(fstat(fd, &f_stat)) == -1) { - PLOG(ERROR) << "Unable to stat fd " << fd; - return NULL; + *error_msg = android::base::StringPrintf("Unable to stat %d", fd); + return nullptr; } const FileDescriptorWhitelist* whitelist = FileDescriptorWhitelist::Get(); @@ -138,13 +181,15 @@ FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd) { if (S_ISSOCK(f_stat.st_mode)) { std::string socket_name; if (!GetSocketName(fd, &socket_name)) { - return NULL; + *error_msg = "Unable to get socket name"; + return nullptr; } if (!whitelist->IsAllowed(socket_name)) { - LOG(ERROR) << "Socket name not whitelisted : " << socket_name - << " (fd=" << fd << ")"; - return NULL; + *error_msg = android::base::StringPrintf("Socket name not whitelisted : %s (fd=%d)", + socket_name.c_str(), + fd); + return nullptr; } return new FileDescriptorInfo(fd); @@ -161,19 +206,22 @@ FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd) { // with the child process across forks but those should have been closed // before we got to this point. if (!S_ISCHR(f_stat.st_mode) && !S_ISREG(f_stat.st_mode)) { - LOG(ERROR) << "Unsupported st_mode " << f_stat.st_mode; - return NULL; + *error_msg = android::base::StringPrintf("Unsupported st_mode %u", f_stat.st_mode); + return nullptr; } std::string file_path; const std::string fd_path = android::base::StringPrintf("/proc/self/fd/%d", fd); if (!android::base::Readlink(fd_path, &file_path)) { - return NULL; + *error_msg = android::base::StringPrintf("Could not read fd link %s: %s", + fd_path.c_str(), + strerror(errno)); + return nullptr; } if (!whitelist->IsAllowed(file_path)) { - LOG(ERROR) << "Not whitelisted : " << file_path; - return NULL; + *error_msg = std::string("Not whitelisted : ").append(file_path); + return nullptr; } // File descriptor flags : currently on FD_CLOEXEC. We can set these @@ -181,8 +229,11 @@ FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd) { // there won't be any races. const int fd_flags = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD)); if (fd_flags == -1) { - PLOG(ERROR) << "Failed fcntl(" << fd << ", F_GETFD)"; - return NULL; + *error_msg = android::base::StringPrintf("Failed fcntl(%d, F_GETFD) (%s): %s", + fd, + file_path.c_str(), + strerror(errno)); + return nullptr; } // File status flags : @@ -199,8 +250,11 @@ FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd) { // their presence and pass them in to open(). int fs_flags = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL)); if (fs_flags == -1) { - PLOG(ERROR) << "Failed fcntl(" << fd << ", F_GETFL)"; - return NULL; + *error_msg = android::base::StringPrintf("Failed fcntl(%d, F_GETFL) (%s): %s", + fd, + file_path.c_str(), + strerror(errno)); + return nullptr; } // File offset : Ignore the offset for non seekable files. @@ -225,9 +279,9 @@ bool FileDescriptorInfo::Restat() const { return f_stat.st_ino == stat.st_ino && f_stat.st_dev == stat.st_dev; } -bool FileDescriptorInfo::ReopenOrDetach() const { +bool FileDescriptorInfo::ReopenOrDetach(std::string* error_msg) const { if (is_sock) { - return DetachSocket(); + return DetachSocket(error_msg); } // NOTE: This might happen if the file was unlinked after being opened. @@ -236,31 +290,49 @@ bool FileDescriptorInfo::ReopenOrDetach() const { const int new_fd = TEMP_FAILURE_RETRY(open(file_path.c_str(), open_flags)); if (new_fd == -1) { - PLOG(ERROR) << "Failed open(" << file_path << ", " << open_flags << ")"; + *error_msg = android::base::StringPrintf("Failed open(%s, %i): %s", + file_path.c_str(), + open_flags, + strerror(errno)); return false; } if (TEMP_FAILURE_RETRY(fcntl(new_fd, F_SETFD, fd_flags)) == -1) { close(new_fd); - PLOG(ERROR) << "Failed fcntl(" << new_fd << ", F_SETFD, " << fd_flags << ")"; + *error_msg = android::base::StringPrintf("Failed fcntl(%d, F_SETFD, %d) (%s): %s", + new_fd, + fd_flags, + file_path.c_str(), + strerror(errno)); return false; } if (TEMP_FAILURE_RETRY(fcntl(new_fd, F_SETFL, fs_flags)) == -1) { close(new_fd); - PLOG(ERROR) << "Failed fcntl(" << new_fd << ", F_SETFL, " << fs_flags << ")"; + *error_msg = android::base::StringPrintf("Failed fcntl(%d, F_SETFL, %d) (%s): %s", + new_fd, + fs_flags, + file_path.c_str(), + strerror(errno)); return false; } if (offset != -1 && TEMP_FAILURE_RETRY(lseek64(new_fd, offset, SEEK_SET)) == -1) { close(new_fd); - PLOG(ERROR) << "Failed lseek64(" << new_fd << ", SEEK_SET)"; + *error_msg = android::base::StringPrintf("Failed lseek64(%d, SEEK_SET) (%s): %s", + new_fd, + file_path.c_str(), + strerror(errno)); return false; } if (TEMP_FAILURE_RETRY(dup2(new_fd, fd)) == -1) { close(new_fd); - PLOG(ERROR) << "Failed dup2(" << fd << ", " << new_fd << ")"; + *error_msg = android::base::StringPrintf("Failed dup2(%d, %d) (%s): %s", + fd, + new_fd, + file_path.c_str(), + strerror(errno)); return false; } @@ -336,20 +408,22 @@ bool FileDescriptorInfo::GetSocketName(const int fd, std::string* result) { return true; } -bool FileDescriptorInfo::DetachSocket() const { +bool FileDescriptorInfo::DetachSocket(std::string* error_msg) const { const int dev_null_fd = open("/dev/null", O_RDWR); if (dev_null_fd < 0) { - PLOG(ERROR) << "Failed to open /dev/null"; + *error_msg = std::string("Failed to open /dev/null: ").append(strerror(errno)); return false; } if (dup2(dev_null_fd, fd) == -1) { - PLOG(ERROR) << "Failed dup2 on socket descriptor " << fd; + *error_msg = android::base::StringPrintf("Failed dup2 on socket descriptor %d: %s", + fd, + strerror(errno)); return false; } if (close(dev_null_fd) == -1) { - PLOG(ERROR) << "Failed close(" << dev_null_fd << ")"; + *error_msg = android::base::StringPrintf("Failed close(%d): %s", dev_null_fd, strerror(errno)); return false; } @@ -357,11 +431,12 @@ bool FileDescriptorInfo::DetachSocket() const { } // static -FileDescriptorTable* FileDescriptorTable::Create(const std::vector<int>& fds_to_ignore) { +FileDescriptorTable* FileDescriptorTable::Create(const std::vector<int>& fds_to_ignore, + std::string* error_msg) { DIR* d = opendir(kFdPath); - if (d == NULL) { - PLOG(ERROR) << "Unable to open directory " << std::string(kFdPath); - return NULL; + if (d == nullptr) { + *error_msg = std::string("Unable to open directory ").append(kFdPath); + return nullptr; } int dir_fd = dirfd(d); dirent* e; @@ -377,7 +452,7 @@ FileDescriptorTable* FileDescriptorTable::Create(const std::vector<int>& fds_to_ continue; } - FileDescriptorInfo* info = FileDescriptorInfo::CreateFromFd(fd); + FileDescriptorInfo* info = FileDescriptorInfo::CreateFromFd(fd, error_msg); if (info == NULL) { if (closedir(d) == -1) { PLOG(ERROR) << "Unable to close directory"; @@ -388,19 +463,21 @@ FileDescriptorTable* FileDescriptorTable::Create(const std::vector<int>& fds_to_ } if (closedir(d) == -1) { - PLOG(ERROR) << "Unable to close directory"; - return NULL; + *error_msg = "Unable to close directory"; + return nullptr; } return new FileDescriptorTable(open_fd_map); } -bool FileDescriptorTable::Restat(const std::vector<int>& fds_to_ignore) { +bool FileDescriptorTable::Restat(const std::vector<int>& fds_to_ignore, std::string* error_msg) { std::set<int> open_fds; // First get the list of open descriptors. DIR* d = opendir(kFdPath); if (d == NULL) { - PLOG(ERROR) << "Unable to open directory " << std::string(kFdPath); + *error_msg = android::base::StringPrintf("Unable to open directory %s: %s", + kFdPath, + strerror(errno)); return false; } @@ -420,21 +497,21 @@ bool FileDescriptorTable::Restat(const std::vector<int>& fds_to_ignore) { } if (closedir(d) == -1) { - PLOG(ERROR) << "Unable to close directory"; + *error_msg = android::base::StringPrintf("Unable to close directory: %s", strerror(errno)); return false; } - return RestatInternal(open_fds); + return RestatInternal(open_fds, error_msg); } // Reopens all file descriptors that are contained in the table. Returns true // if all descriptors were successfully re-opened or detached, and false if an // error occurred. -bool FileDescriptorTable::ReopenOrDetach() { +bool FileDescriptorTable::ReopenOrDetach(std::string* error_msg) { std::unordered_map<int, FileDescriptorInfo*>::const_iterator it; for (it = open_fd_map_.begin(); it != open_fd_map_.end(); ++it) { const FileDescriptorInfo* info = it->second; - if (info == NULL || !info->ReopenOrDetach()) { + if (info == NULL || !info->ReopenOrDetach(error_msg)) { return false; } } @@ -447,7 +524,7 @@ FileDescriptorTable::FileDescriptorTable( : open_fd_map_(map) { } -bool FileDescriptorTable::RestatInternal(std::set<int>& open_fds) { +bool FileDescriptorTable::RestatInternal(std::set<int>& open_fds, std::string* error_msg) { bool error = false; // Iterate through the list of file descriptors we've already recorded @@ -455,6 +532,8 @@ bool FileDescriptorTable::RestatInternal(std::set<int>& open_fds) { // // (a) they continue to be open. // (b) they refer to the same file. + // + // We'll only store the last error message. std::unordered_map<int, FileDescriptorInfo*>::iterator it = open_fd_map_.begin(); while (it != open_fd_map_.end()) { std::set<int>::const_iterator element = open_fds.find(it->first); @@ -475,7 +554,7 @@ bool FileDescriptorTable::RestatInternal(std::set<int>& open_fds) { // The file descriptor refers to a different description. We must // update our entry in the table. delete it->second; - it->second = FileDescriptorInfo::CreateFromFd(*element); + it->second = FileDescriptorInfo::CreateFromFd(*element, error_msg); if (it->second == NULL) { // The descriptor no longer no longer refers to a whitelisted file. // We flag an error and remove it from the list of files we're @@ -510,7 +589,7 @@ bool FileDescriptorTable::RestatInternal(std::set<int>& open_fds) { std::set<int>::const_iterator it; for (it = open_fds.begin(); it != open_fds.end(); ++it) { const int fd = (*it); - FileDescriptorInfo* info = FileDescriptorInfo::CreateFromFd(fd); + FileDescriptorInfo* info = FileDescriptorInfo::CreateFromFd(fd, error_msg); if (info == NULL) { // A newly opened file is not on the whitelist. Flag an error and // continue. diff --git a/core/jni/fd_utils.h b/core/jni/fd_utils.h index a39e387fde6c..a3570d7ed1fb 100644 --- a/core/jni/fd_utils.h +++ b/core/jni/fd_utils.h @@ -28,6 +28,8 @@ #include <android-base/macros.h> +class FileDescriptorInfo; + // Whitelist of open paths that the zygote is allowed to keep open. // // In addition to the paths listed in kPathWhitelist in file_utils.cpp, and @@ -66,49 +68,6 @@ class FileDescriptorWhitelist { DISALLOW_COPY_AND_ASSIGN(FileDescriptorWhitelist); }; -// Keeps track of all relevant information (flags, offset etc.) of an -// open zygote file descriptor. -class FileDescriptorInfo { - public: - // Create a FileDescriptorInfo for a given file descriptor. Returns - // |NULL| if an error occurred. - static FileDescriptorInfo* CreateFromFd(int fd); - - // Checks whether the file descriptor associated with this object - // refers to the same description. - bool Restat() const; - - bool ReopenOrDetach() const; - - const int fd; - const struct stat stat; - const std::string file_path; - const int open_flags; - const int fd_flags; - const int fs_flags; - const off_t offset; - const bool is_sock; - - private: - FileDescriptorInfo(int fd); - - FileDescriptorInfo(struct stat stat, const std::string& file_path, int fd, int open_flags, - int fd_flags, int fs_flags, off_t offset); - - // Returns the locally-bound name of the socket |fd|. Returns true - // iff. all of the following hold : - // - // - the socket's sa_family is AF_UNIX. - // - the length of the path is greater than zero (i.e, not an unnamed socket). - // - the first byte of the path isn't zero (i.e, not a socket with an abstract - // address). - static bool GetSocketName(const int fd, std::string* result); - - bool DetachSocket() const; - - DISALLOW_COPY_AND_ASSIGN(FileDescriptorInfo); -}; - // A FileDescriptorTable is a collection of FileDescriptorInfo objects // keyed by their FDs. class FileDescriptorTable { @@ -116,19 +75,20 @@ class FileDescriptorTable { // Creates a new FileDescriptorTable. This function scans // /proc/self/fd for the list of open file descriptors and collects // information about them. Returns NULL if an error occurs. - static FileDescriptorTable* Create(const std::vector<int>& fds_to_ignore); + static FileDescriptorTable* Create(const std::vector<int>& fds_to_ignore, + std::string* error_msg); - bool Restat(const std::vector<int>& fds_to_ignore); + bool Restat(const std::vector<int>& fds_to_ignore, std::string* error_msg); // Reopens all file descriptors that are contained in the table. Returns true // if all descriptors were successfully re-opened or detached, and false if an // error occurred. - bool ReopenOrDetach(); + bool ReopenOrDetach(std::string* error_msg); private: FileDescriptorTable(const std::unordered_map<int, FileDescriptorInfo*>& map); - bool RestatInternal(std::set<int>& open_fds); + bool RestatInternal(std::set<int>& open_fds, std::string* error_msg); static int ParseFd(dirent* e, int dir_fd); diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto index 914a7db56f1d..23c5661f0533 100644 --- a/core/proto/android/providers/settings.proto +++ b/core/proto/android/providers/settings.proto @@ -56,388 +56,455 @@ message GlobalSettingsProto { optional SettingProto enable_accessibility_global_gesture_enabled = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto airplane_mode_on = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto theater_mode_on = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; - reserved 6,7,8,9,10; // Accidentally used. They are currently free to be reused. // A comma-separated list of radios that need to be disabled when airplane // mode is on. This overrides wifi_on and bluetooth_on if wifi and bluetooth // are included in the comma-separated list. - optional SettingProto airplane_mode_radios = 11 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto airplane_mode_toggleable_radios = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_class_of_device = 293 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_disabled_profiles = 13; - optional SettingProto bluetooth_interoperability_list = 14; - optional SettingProto wifi_sleep_policy = 15 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto auto_time = 16 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto auto_time_zone = 17 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto car_dock_sound = 18; - optional SettingProto car_undock_sound = 19; - optional SettingProto desk_dock_sound = 20; - optional SettingProto desk_undock_sound = 21; - optional SettingProto dock_sounds_enabled = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dock_sounds_enabled_when_accessibility = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lock_sound = 24; - optional SettingProto unlock_sound = 25; - optional SettingProto trusted_sound = 26; - optional SettingProto low_battery_sound = 27; - optional SettingProto power_sounds_enabled = 28 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wireless_charging_started_sound = 29; - optional SettingProto charging_sounds_enabled = 30 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto stay_on_while_plugged_in = 31 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bugreport_in_power_menu = 32 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto adb_enabled = 33 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto airplane_mode_radios = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto airplane_mode_toggleable_radios = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto bluetooth_class_of_device = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto bluetooth_disabled_profiles = 9; + optional SettingProto bluetooth_interoperability_list = 10; + optional SettingProto wifi_sleep_policy = 11 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto auto_time = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto auto_time_zone = 13 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto car_dock_sound = 14; + optional SettingProto car_undock_sound = 15; + optional SettingProto desk_dock_sound = 16; + optional SettingProto desk_undock_sound = 17; + optional SettingProto dock_sounds_enabled = 18 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dock_sounds_enabled_when_accessibility = 19 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lock_sound = 20; + optional SettingProto unlock_sound = 21; + optional SettingProto trusted_sound = 22; + optional SettingProto low_battery_sound = 23; + optional SettingProto power_sounds_enabled = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wireless_charging_started_sound = 25; + optional SettingProto charging_sounds_enabled = 26 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto stay_on_while_plugged_in = 27 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto bugreport_in_power_menu = 28 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto adb_enabled = 29 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Whether views are allowed to save their attribute data. - optional SettingProto debug_view_attributes = 34 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assisted_gps_enabled = 35 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_on = 36 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto cdma_cell_broadcast_sms = 37 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto cdma_roaming_mode = 38 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto cdma_subscription_mode = 39 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto data_activity_timeout_mobile = 40 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto data_activity_timeout_wifi = 41 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto data_roaming = 42 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mdc_initial_max_retry = 43 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto force_allow_on_external = 44 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto euicc_provisioned = 294 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto development_force_resizable_activities = 45 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto development_enable_freeform_windows_support = 46 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto development_settings_enabled = 47 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto device_provisioned = 48 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto device_provisioning_mobile_data_enabled = 49 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto display_size_forced = 50 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto display_scaling_force = 51 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto download_max_bytes_over_mobile = 52 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto download_recommended_max_bytes_over_mobile = 53 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto hdmi_control_enabled = 54 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto hdmi_system_audio_control_enabled = 55 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto hdmi_control_auto_wakeup_enabled = 56 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto hdmi_control_auto_device_off_enabled = 57 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto location_background_throttle_interval_ms = 295 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto location_background_throttle_proximity_alert_interval_ms = 296 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto debug_view_attributes = 30 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assisted_gps_enabled = 31 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto bluetooth_on = 32 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto cdma_cell_broadcast_sms = 33 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto cdma_roaming_mode = 34 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto cdma_subscription_mode = 35 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto data_activity_timeout_mobile = 36 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto data_activity_timeout_wifi = 37 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto data_roaming = 38 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mdc_initial_max_retry = 39 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto force_allow_on_external = 40 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto euicc_provisioned = 41 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto development_force_resizable_activities = 42 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto development_enable_freeform_windows_support = 43 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto development_settings_enabled = 44 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto device_provisioned = 45 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto device_provisioning_mobile_data_enabled = 46 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto display_size_forced = 47 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto display_scaling_force = 48 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto download_max_bytes_over_mobile = 49 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto download_recommended_max_bytes_over_mobile = 50 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto hdmi_control_enabled = 51 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto hdmi_system_audio_control_enabled = 52 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto hdmi_control_auto_wakeup_enabled = 53 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto hdmi_control_auto_device_off_enabled = 54 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // If true, out-of-the-box execution for priv apps is enabled. + optional SettingProto priv_app_oob_enabled = 55 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto location_background_throttle_interval_ms = 56 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto location_background_throttle_proximity_alert_interval_ms = 57 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Packages that are whitelisted for background throttling (throttling will // not be applied). - optional SettingProto location_background_throttle_package_whitelist = 297 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_scan_background_throttle_interval_ms = 298 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_scan_background_throttle_package_whitelist = 299 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mhl_input_switching_enabled = 58 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mhl_power_charge_enabled = 59 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mobile_data = 60 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mobile_data_always_on = 61 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto connectivity_metrics_buffer_size = 62 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_enabled = 63 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_poll_interval = 64 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_time_cache_max_age = 65 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_global_alert_bytes = 66 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_sample_enabled = 67 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_augment_enabled = 300 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_dev_bucket_duration = 68 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_dev_persist_bytes = 69 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_dev_rotate_age = 70 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_dev_delete_age = 71 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_bucket_duration = 72 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_persist_bytes = 73 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_rotate_age = 74 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_delete_age = 75 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_tag_bucket_duration = 76 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_tag_persist_bytes = 77 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_tag_rotate_age = 78 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto netstats_uid_tag_delete_age = 79 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto location_background_throttle_package_whitelist = 58 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_scan_background_throttle_interval_ms = 59 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_scan_background_throttle_package_whitelist = 60 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mhl_input_switching_enabled = 61 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mhl_power_charge_enabled = 62 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mobile_data = 63 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mobile_data_always_on = 64 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto connectivity_metrics_buffer_size = 65 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_enabled = 66 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_poll_interval = 67 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_time_cache_max_age = 68 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_global_alert_bytes = 69 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_sample_enabled = 70 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_augment_enabled = 71 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_dev_bucket_duration = 72 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_dev_persist_bytes = 73 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_dev_rotate_age = 74 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_dev_delete_age = 75 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_bucket_duration = 76 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_persist_bytes = 77 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_rotate_age = 78 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_delete_age = 79 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_tag_bucket_duration = 80 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_tag_persist_bytes = 81 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_tag_rotate_age = 82 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto netstats_uid_tag_delete_age = 83 [ (android.privacy).dest = DEST_AUTOMATIC ]; // User preference for which network(s) should be used. - optional SettingProto network_preference = 80; - optional SettingProto network_scorer_app = 81 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto nitz_update_diff = 82 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto nitz_update_spacing = 83 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto ntp_server = 84; - optional SettingProto ntp_timeout = 85 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto storage_benchmark_interval = 86 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dns_resolver_sample_validity_seconds = 87 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dns_resolver_success_threshold_percent = 88 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dns_resolver_min_samples = 89 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dns_resolver_max_samples = 90 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_preference = 84; + optional SettingProto network_scorer_app = 85 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto night_display_forced_auto_mode_available = 86 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto nitz_update_diff = 87 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto nitz_update_spacing = 88 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ntp_server = 89; + optional SettingProto ntp_timeout = 90 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto storage_benchmark_interval = 91 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dns_resolver_sample_validity_seconds = 92 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dns_resolver_success_threshold_percent = 93 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dns_resolver_min_samples = 94 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dns_resolver_max_samples = 95 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Whether to disable the automatic scheduling of system updates. - optional SettingProto ota_disable_automatic_update = 91 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto package_verifier_enable = 92 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto package_verifier_timeout = 93 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto package_verifier_default_response = 94; - optional SettingProto package_verifier_setting_visible = 95 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto package_verifier_include_adb = 96 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto fstrim_mandatory_interval = 97 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pdp_watchdog_poll_interval_ms = 98 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pdp_watchdog_long_poll_interval_ms = 99 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pdp_watchdog_error_poll_interval_ms = 100 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pdp_watchdog_trigger_packet_count = 101 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pdp_watchdog_error_poll_count = 102 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pdp_watchdog_max_pdp_reset_fail_count = 103 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto setup_prepaid_data_service_url = 105; - optional SettingProto setup_prepaid_detection_target_url = 106; - optional SettingProto setup_prepaid_detection_redir_host = 107; - optional SettingProto sms_outgoing_check_interval_ms = 108 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sms_outgoing_check_max_count = 109 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ota_disable_automatic_update = 96 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto package_verifier_enable = 97 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto package_verifier_timeout = 98 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto package_verifier_default_response = 99; + optional SettingProto package_verifier_setting_visible = 100 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto package_verifier_include_adb = 101 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto fstrim_mandatory_interval = 102 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pdp_watchdog_poll_interval_ms = 103 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pdp_watchdog_long_poll_interval_ms = 104 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pdp_watchdog_error_poll_interval_ms = 105 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pdp_watchdog_trigger_packet_count = 106 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pdp_watchdog_error_poll_count = 107 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pdp_watchdog_max_pdp_reset_fail_count = 108 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto setup_prepaid_data_service_url = 109; + optional SettingProto setup_prepaid_detection_target_url = 110; + optional SettingProto setup_prepaid_detection_redir_host = 111; + optional SettingProto sms_outgoing_check_interval_ms = 112 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sms_outgoing_check_max_count = 113 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Used to disable SMS short code confirmation. Defaults to true. - optional SettingProto sms_short_code_confirmation = 110 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sms_short_code_rule = 111 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tcp_default_init_rwnd = 112 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tether_supported = 113 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tether_dun_required = 114 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tether_dun_apn = 115; - optional SettingProto tether_offload_disabled = 301 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sms_short_code_confirmation = 114 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sms_short_code_rule = 115 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tcp_default_init_rwnd = 116 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tether_supported = 117 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tether_dun_required = 118 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tether_dun_apn = 119; + optional SettingProto tether_offload_disabled = 120 [ (android.privacy).dest = DEST_AUTOMATIC ]; // List of carrier app certificate mapped to carrier app package id which are whitelisted to // prompt the user for install when a SIM card with matching UICC carrier privilege rules is // inserted. - optional SettingProto carrier_app_whitelist = 116 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto carrier_app_names = 358 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto usb_mass_storage_enabled = 117 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto use_google_mail = 118 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto webview_data_reduction_proxy_key = 119; - optional SettingProto webview_fallback_logic_enabled = 120 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto carrier_app_whitelist = 121 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto carrier_app_names = 122 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto usb_mass_storage_enabled = 123 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto use_google_mail = 124 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto webview_data_reduction_proxy_key = 125; + optional SettingProto webview_fallback_logic_enabled = 126 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Name of the package used as WebView provider. - optional SettingProto webview_provider = 121 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto webview_multiprocess = 122 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_switch_notification_daily_limit = 123 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_switch_notification_rate_limit_millis = 124 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_avoid_bad_wifi = 125 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_metered_multipath_preference = 302 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_watchlist_last_report_time = 303 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_badging_thresholds = 304 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_display_on = 126 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_display_certification_on = 127 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_display_wps_config = 128 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_networks_available_notification_on = 129 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wimax_networks_available_notification_on = 130 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_networks_available_repeat_delay = 131 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_country_code = 132; - optional SettingProto wifi_framework_scan_interval_ms = 133 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_idle_ms = 134 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_num_open_networks_kept = 135 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_on = 136 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_scan_always_available = 137 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_wakeup_enabled = 138 [ (android.privacy).dest = DEST_AUTOMATIC ]; - reserved 305; // Removed wifi_wakeup_available - optional SettingProto network_scoring_ui_enabled = 306 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto speed_label_cache_eviction_age_millis = 307 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto recommended_network_evaluator_cache_expiry_ms = 308 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_recommendations_enabled = 139 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_recommendations_package = 286 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto use_open_wifi_package = 309 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_recommendation_request_timeout_ms = 310 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto ble_scan_always_available = 140 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_saved_state = 141 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_supplicant_scan_interval_ms = 142 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_enhanced_auto_join = 143 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_network_show_rssi = 144 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_scan_interval_when_p2p_connected_ms = 145 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_watchdog_on = 146 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_watchdog_poor_network_test_enabled = 147 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_suspend_optimizations_enabled = 148 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_verbose_logging_enabled = 149 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_connected_mac_randomization_enabled = 350 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_max_dhcp_retry_count = 150 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_mobile_data_transition_wakelock_timeout_ms = 151 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_device_owner_configs_lockdown = 152 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_frequency_band = 153 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_p2p_device_name = 154; - optional SettingProto wifi_reenable_delay_ms = 155 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_ephemeral_out_of_range_timeout_ms = 156 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto data_stall_alarm_non_aggressive_delay_in_ms = 157 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto data_stall_alarm_aggressive_delay_in_ms = 158 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto provisioning_apn_alarm_delay_in_ms = 159 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto gprs_register_check_period_ms = 160 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wtf_is_fatal = 161 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto webview_provider = 127 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto webview_multiprocess = 128 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_switch_notification_daily_limit = 129 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_switch_notification_rate_limit_millis = 130 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_avoid_bad_wifi = 131 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_metered_multipath_preference = 132 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_watchlist_last_report_time = 133 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_badging_thresholds = 134 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_display_on = 135 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_display_certification_on = 136 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_display_wps_config = 137 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_networks_available_notification_on = 138 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_carrier_networks_available_notification_on = 139 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wimax_networks_available_notification_on = 140 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_networks_available_repeat_delay = 141 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_country_code = 142; + optional SettingProto wifi_framework_scan_interval_ms = 143 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_idle_ms = 144 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_num_open_networks_kept = 145 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_on = 146 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_scan_always_available = 147 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto soft_ap_timeout_enabled = 148 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_wakeup_enabled = 149 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_scoring_ui_enabled = 150 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto speed_label_cache_eviction_age_millis = 151 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto recommended_network_evaluator_cache_expiry_ms = 152 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_recommendations_enabled = 153 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_recommendations_package = 154 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto use_open_wifi_package = 155 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_recommendation_request_timeout_ms = 156 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ble_scan_always_available = 157 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ble_scan_low_power_window_ms = 158 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ble_scan_balanced_window_ms = 159 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ble_scan_low_latency_window_ms = 160 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ble_scan_low_power_interval_ms = 161 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ble_scan_balanced_interval_ms = 162 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ble_scan_low_latency_interval_ms = 163 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_saved_state = 164 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_supplicant_scan_interval_ms = 165 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_enhanced_auto_join = 166 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_network_show_rssi = 167 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_scan_interval_when_p2p_connected_ms = 168 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_watchdog_on = 169 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_watchdog_poor_network_test_enabled = 170 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_suspend_optimizations_enabled = 171 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_verbose_logging_enabled = 172 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_connected_mac_randomization_enabled = 173 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_max_dhcp_retry_count = 174 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_mobile_data_transition_wakelock_timeout_ms = 175 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_device_owner_configs_lockdown = 176 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_frequency_band = 177 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_p2p_device_name = 178; + optional SettingProto wifi_reenable_delay_ms = 179 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_ephemeral_out_of_range_timeout_ms = 180 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto data_stall_alarm_non_aggressive_delay_in_ms = 181 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto data_stall_alarm_aggressive_delay_in_ms = 182 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto provisioning_apn_alarm_delay_in_ms = 183 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto gprs_register_check_period_ms = 184 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wtf_is_fatal = 185 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Ringer mode. A change in this value will not reflect as a change in the // ringer mode. - optional SettingProto mode_ringer = 162 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mode_ringer = 186 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Overlay display devices setting. // The value is a specially formatted string that describes the size and // density of simulated secondary devices. // Format: {width}x{height}/dpi;... - optional SettingProto overlay_display_devices = 163 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto battery_discharge_duration_threshold = 164 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto battery_discharge_threshold = 165 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto send_action_app_error = 166 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dropbox_age_seconds = 167 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dropbox_max_files = 168 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dropbox_quota_kb = 169 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dropbox_quota_percent = 170 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dropbox_reserve_percent = 171 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dropbox_tag_prefix = 172 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto error_logcat_prefix = 173 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sys_free_storage_log_interval = 174 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto disk_free_change_reporting_threshold = 175 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sys_storage_threshold_percentage = 176 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sys_storage_threshold_max_bytes = 177 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sys_storage_full_threshold_bytes = 178 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sys_storage_cache_percentage = 311 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sys_storage_cache_max_bytes = 312 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sync_max_retry_delay_in_seconds = 179 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto connectivity_change_delay = 180 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto connectivity_sampling_interval_in_seconds = 181 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pac_change_delay = 182 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto captive_portal_mode = 183 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto captive_portal_detection_enabled = 313 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto captive_portal_server = 184; - optional SettingProto captive_portal_https_url = 185; - optional SettingProto captive_portal_http_url = 186; - optional SettingProto captive_portal_fallback_url = 187; - optional SettingProto captive_portal_other_fallback_urls = 314; - optional SettingProto captive_portal_use_https = 188 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto captive_portal_user_agent = 189; - optional SettingProto nsd_on = 190 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto overlay_display_devices = 187 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto battery_discharge_duration_threshold = 188 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto battery_discharge_threshold = 189 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto send_action_app_error = 190 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dropbox_age_seconds = 191 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dropbox_max_files = 192 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dropbox_quota_kb = 193 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dropbox_quota_percent = 194 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dropbox_reserve_percent = 195 [ (android.privacy).dest = DEST_AUTOMATIC ]; + repeated SettingProto dropbox_settings = 196; + repeated SettingProto error_logcat_lines = 197; + optional SettingProto sys_free_storage_log_interval = 198 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto disk_free_change_reporting_threshold = 199 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sys_storage_threshold_percentage = 200 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sys_storage_threshold_max_bytes = 201 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sys_storage_full_threshold_bytes = 202 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sys_storage_cache_percentage = 203 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sys_storage_cache_max_bytes = 204 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sync_max_retry_delay_in_seconds = 205 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto connectivity_change_delay = 206 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto connectivity_sampling_interval_in_seconds = 207 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pac_change_delay = 208 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto captive_portal_mode = 209 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto captive_portal_detection_enabled = 210 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto captive_portal_server = 211; + optional SettingProto captive_portal_https_url = 212; + optional SettingProto captive_portal_http_url = 213; + optional SettingProto captive_portal_fallback_url = 214; + optional SettingProto captive_portal_other_fallback_urls = 215; + optional SettingProto captive_portal_use_https = 216 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto captive_portal_user_agent = 217; + optional SettingProto nsd_on = 218 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Let user pick default install location. - optional SettingProto set_install_location = 191 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto default_install_location = 192 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto inet_condition_debounce_up_delay = 193 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto inet_condition_debounce_down_delay = 194 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto read_external_storage_enforced_default = 195 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto http_proxy = 196; - optional SettingProto global_http_proxy_host = 197; - optional SettingProto global_http_proxy_port = 198; - optional SettingProto global_http_proxy_exclusion_list = 199; - optional SettingProto global_http_proxy_pac = 200; + optional SettingProto set_install_location = 219 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto default_install_location = 220 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto inet_condition_debounce_up_delay = 221 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto inet_condition_debounce_down_delay = 222 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto read_external_storage_enforced_default = 223 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto http_proxy = 224; + optional SettingProto global_http_proxy_host = 225; + optional SettingProto global_http_proxy_port = 226; + optional SettingProto global_http_proxy_exclusion_list = 227; + optional SettingProto global_http_proxy_pac = 228; // Enables the UI setting to allow the user to specify the global HTTP proxy // and associated exclusion list. - optional SettingProto set_global_http_proxy = 201 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto default_dns_server = 202; + optional SettingProto set_global_http_proxy = 229 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto default_dns_server = 230; // The requested Private DNS mode and an accompanying specifier. - optional SettingProto private_dns_mode = 315; - optional SettingProto private_dns_specifier = 316; - optional SettingProto bluetooth_headset_priority_prefix = 203 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_a2dp_sink_priority_prefix = 204 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_a2dp_src_priority_prefix = 205 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_a2dp_supports_optional_codecs_prefix = 287 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_a2dp_optional_codecs_enabled_prefix = 288 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_input_device_priority_prefix = 206 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_map_priority_prefix = 207 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_map_client_priority_prefix = 208 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_pbap_client_priority_prefix = 209 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_sap_priority_prefix = 210 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_pan_priority_prefix = 211 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_hearing_aid_priority_prefix = 345 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto activity_manager_constants = 317; - optional SettingProto device_idle_constants = 212; - optional SettingProto device_idle_constants_watch = 213; - optional SettingProto battery_saver_constants = 318; - optional SettingProto anomaly_detection_constants = 319; - optional SettingProto always_on_display_constants = 320; - optional SettingProto app_idle_constants = 214; - optional SettingProto power_manager_constants = 321; - optional SettingProto alarm_manager_constants = 215; - optional SettingProto job_scheduler_constants = 216; - optional SettingProto shortcut_manager_constants = 217; - optional SettingProto device_policy_constants = 322; - optional SettingProto text_classifier_constants = 323; - optional SettingProto window_animation_scale = 218 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto transition_animation_scale = 219 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto animator_duration_scale = 220 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto fancy_ime_animations = 221 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto compatibility_mode = 222 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto emergency_tone = 223 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto call_auto_retry = 224 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto emergency_affordance_needed = 225 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto preferred_network_mode = 226 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto private_dns_mode = 231; + optional SettingProto private_dns_specifier = 232; + repeated SettingProto bluetooth_headset_priorities = 233; + repeated SettingProto bluetooth_a2dp_sink_priorities = 234; + repeated SettingProto bluetooth_a2dp_src_priorities = 235; + repeated SettingProto bluetooth_a2dp_supports_optional_codecs = 236; + repeated SettingProto bluetooth_a2dp_optional_codecs_enabled = 237; + repeated SettingProto bluetooth_input_device_priorities = 238; + repeated SettingProto bluetooth_map_priorities = 239; + repeated SettingProto bluetooth_map_client_priorities = 240; + repeated SettingProto bluetooth_pbap_client_priorities = 241; + repeated SettingProto bluetooth_sap_priorities = 242; + repeated SettingProto bluetooth_pan_priorities = 243; + repeated SettingProto bluetooth_hearing_aid_priorities = 244; + // These are key=value lists, separated by commas. + optional SettingProto activity_manager_constants = 245; + optional SettingProto device_idle_constants = 246; + optional SettingProto battery_saver_constants = 247; + optional SettingProto battery_saver_device_specific_constants = 248; + optional SettingProto battery_tip_constants = 249; + optional SettingProto anomaly_detection_constants = 250; + // Version of the anomaly config. + optional SettingProto anomaly_config_version = 251 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // A base64-encoded string represents anomaly stats config. + optional SettingProto anomaly_config = 252; + // This is a key=value list, separated by commas. + optional SettingProto always_on_display_constants = 253; + // System VDSO global setting. This links to the "sys.vdso" system property. + // The following values are supported: + // false -> both 32 and 64 bit vdso disabled + // 32 -> 32 bit vdso enabled + // 64 -> 64 bit vdso enabled + // Any other value defaults to both 32 bit and 64 bit true. + optional SettingProto sys_vdso = 254 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // UidCpuPower global setting. This links the sys.uidcpupower system property. + // The following values are supported: + // 0 -> /proc/uid_cpupower/* are disabled + // 1 -> /proc/uid_cpupower/* are enabled + // Any other value defaults to enabled. + optional SettingProto sys_uidcpupower = 255 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // An integer to reduce the FPS by this factor. Only for experiments. + optional SettingProto fps_divisor = 256 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // Flag to enable or disable display panel low power mode (lpm) + // false -> Display panel power saving mode is disabled. + // true -> Display panel power saving mode is enabled. + optional SettingProto display_panel_lpm = 257 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // These are key=value lists, separated by commas. + optional SettingProto app_idle_constants = 258; + optional SettingProto power_manager_constants = 259; + optional SettingProto alarm_manager_constants = 260; + optional SettingProto job_scheduler_constants = 261; + optional SettingProto shortcut_manager_constants = 262; + optional SettingProto device_policy_constants = 263; + optional SettingProto text_classifier_constants = 264; + optional SettingProto battery_stats_constants = 265; + optional SettingProto sync_manager_constants = 266; + optional SettingProto app_standby_enabled = 267 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto app_auto_restriction_enabled = 268 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto forced_app_standby_enabled = 269 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto forced_app_standby_for_small_battery_enabled = 270 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto off_body_radios_off_for_small_battery_enabled = 271 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto off_body_radios_off_delay_ms = 272 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_on_when_proxy_disconnected = 273 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto time_only_mode_enabled = 274 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_watchlist_enabled = 275 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto keep_profile_in_background = 276 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto window_animation_scale = 277 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto transition_animation_scale = 278 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto animator_duration_scale = 279 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto fancy_ime_animations = 280 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto compatibility_mode = 281 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto emergency_tone = 282 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto call_auto_retry = 283 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto emergency_affordance_needed = 284 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto preferred_network_mode = 285 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Name of an application package to be debugged. - optional SettingProto debug_app = 227; - optional SettingProto wait_for_debugger = 228 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enable_gpu_debug_layers = 342 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto debug_app = 286; + optional SettingProto wait_for_debugger = 287 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enable_gpu_debug_layers = 288 [ (android.privacy).dest = DEST_AUTOMATIC ]; // App allowed to load GPU debug layers. - optional SettingProto gpu_debug_app = 343; - optional SettingProto gpu_debug_layers = 344 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto low_power_mode = 229 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto low_power_mode_trigger_level = 230 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto always_finish_activities = 231 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dock_audio_media_enabled = 232 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto encoded_surround_output = 233 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto audio_safe_volume_state = 234 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tzinfo_update_content_url = 235; - optional SettingProto tzinfo_update_metadata_url = 236; - optional SettingProto selinux_update_content_url = 237; - optional SettingProto selinux_update_metadata_url = 238; - optional SettingProto sms_short_codes_update_content_url = 239; - optional SettingProto sms_short_codes_update_metadata_url = 240; - optional SettingProto apn_db_update_content_url = 241; - optional SettingProto apn_db_update_metadata_url = 242; - optional SettingProto cert_pin_update_content_url = 243; - optional SettingProto cert_pin_update_metadata_url = 244; - optional SettingProto intent_firewall_update_content_url = 245; - optional SettingProto intent_firewall_update_metadata_url = 246; - optional SettingProto lang_id_update_content_url = 324; - optional SettingProto lang_id_update_metadata_url = 325; - optional SettingProto smart_selection_update_content_url = 326; - optional SettingProto smart_selection_update_metadata_url = 327; - optional SettingProto selinux_status = 247 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto development_force_rtl = 248 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto low_battery_sound_timeout = 249 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_bounce_delay_override_ms = 250 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto policy_control = 251 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto zen_mode = 252 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto zen_mode_ringer_level = 253 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto zen_mode_config_etag = 254; - optional SettingProto heads_up_notifications_enabled = 255 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto device_name = 256; - optional SettingProto network_scoring_provisioned = 257 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto require_password_to_decrypt = 258 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enhanced_4g_mode_enabled = 259 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto vt_ims_enabled = 260 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wfc_ims_enabled = 261 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wfc_ims_mode = 262 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wfc_ims_roaming_mode = 263 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wfc_ims_roaming_enabled = 264 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lte_service_forced = 265 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto ephemeral_cookie_max_size_bytes = 266 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enable_ephemeral_feature = 267 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto instant_app_dexopt_enabled = 328 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto installed_instant_app_min_cache_period = 268 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto installed_instant_app_max_cache_period = 289 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto uninstalled_instant_app_min_cache_period = 290 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto uninstalled_instant_app_max_cache_period = 291 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto unused_static_shared_lib_min_cache_period = 292 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto allow_user_switching_when_system_user_locked = 269 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto boot_count = 270 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto safe_boot_disallowed = 271 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto device_demo_mode = 272 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto network_access_timeout_ms = 329 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto database_downgrade_reason = 274; - optional SettingProto database_creation_buildid = 330 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto contacts_database_wal_enabled = 275 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto location_settings_link_to_permissions_enabled = 331 [ (android.privacy).dest = DEST_AUTOMATIC ]; - reserved 332; // Removed backup_refactored_service_disabled - optional SettingProto euicc_factory_reset_timeout_millis = 333 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto storage_settings_clobber_threshold = 334 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto chained_battery_attribution_enabled = 353 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto hidden_api_blacklist_exemptions = 355 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto gpu_debug_app = 289; + optional SettingProto gpu_debug_layers = 290 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto low_power_mode = 291 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // Battery level [1-100] at which low power mode automatically turns on. If + // 0, it will not automatically turn on. + optional SettingProto low_power_mode_trigger_level = 292 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // The max value for {@link #LOW_POWER_MODE_TRIGGER_LEVEL}. If this setting + // is not set or the value is 0, the default max will be used. + optional SettingProto low_power_mode_trigger_level_max = 293 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto always_finish_activities = 294 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dock_audio_media_enabled = 295 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto encoded_surround_output = 296 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto audio_safe_volume_state = 297 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tzinfo_update_content_url = 298; + optional SettingProto tzinfo_update_metadata_url = 299; + optional SettingProto selinux_update_content_url = 300; + optional SettingProto selinux_update_metadata_url = 301; + optional SettingProto sms_short_codes_update_content_url = 302; + optional SettingProto sms_short_codes_update_metadata_url = 303; + optional SettingProto apn_db_update_content_url = 304; + optional SettingProto apn_db_update_metadata_url = 305; + optional SettingProto cert_pin_update_content_url = 306; + optional SettingProto cert_pin_update_metadata_url = 307; + optional SettingProto intent_firewall_update_content_url = 308; + optional SettingProto intent_firewall_update_metadata_url = 309; + optional SettingProto lang_id_update_content_url = 310; + optional SettingProto lang_id_update_metadata_url = 311; + optional SettingProto smart_selection_update_content_url = 312; + optional SettingProto smart_selection_update_metadata_url = 313; + optional SettingProto selinux_status = 314 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto development_force_rtl = 315 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto low_battery_sound_timeout = 316 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wifi_bounce_delay_override_ms = 317 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto policy_control = 318 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto emulate_display_cutout = 319 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto zen_mode = 320 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto zen_mode_ringer_level = 321 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto zen_mode_config_etag = 322; + // If 0, turning on dnd manually will last indefinitely. Else if + // non-negative, turning on dnd manually will last for this many minutes. + // Else (if negative), turning on dnd manually will surface a dialog that + // prompts user to specify a duration. + optional SettingProto zen_duration = 323 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto heads_up_notifications_enabled = 324 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto device_name = 325; + optional SettingProto network_scoring_provisioned = 326 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto require_password_to_decrypt = 327 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enhanced_4g_mode_enabled = 328 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto vt_ims_enabled = 329 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wfc_ims_enabled = 330 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wfc_ims_mode = 331 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wfc_ims_roaming_mode = 332 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wfc_ims_roaming_enabled = 333 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lte_service_forced = 334 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ephemeral_cookie_max_size_bytes = 335 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enable_ephemeral_feature = 336 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto instant_app_dexopt_enabled = 337 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto installed_instant_app_min_cache_period = 338 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto installed_instant_app_max_cache_period = 339 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto uninstalled_instant_app_min_cache_period = 340 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto uninstalled_instant_app_max_cache_period = 341 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto unused_static_shared_lib_min_cache_period = 342 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto allow_user_switching_when_system_user_locked = 343 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto boot_count = 344 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto safe_boot_disallowed = 345 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto device_demo_mode = 346 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto network_access_timeout_ms = 347 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto database_downgrade_reason = 348; + optional SettingProto database_creation_buildid = 349 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto contacts_database_wal_enabled = 350 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto location_settings_link_to_permissions_enabled = 351 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto euicc_factory_reset_timeout_millis = 352 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto storage_settings_clobber_threshold = 353 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // If set to 1, {@link Secure#LOCATION_MODE} will be set to {@link + // Secure#LOCATION_MODE_OFF} temporarily for all users. + optional SettingProto location_global_kill_switch = 354 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // If set to 1, SettingsProvider's restoreAnyVersion="true" attribute will + // be ignored and restoring to lower version of platform API will be + // skipped. + optional SettingProto override_settings_provider_restore_any_version = 355 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto chained_battery_attribution_enabled = 356 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto autofill_compat_allowed_packages = 357 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto hidden_api_blacklist_exemptions = 358 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Subscription to be used for voice call on a multi sim device. The // supported values are 0 = SUB1, 1 = SUB2 and etc. - optional SettingProto multi_sim_voice_call_subscription = 276 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto multi_sim_voice_prompt = 277 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto multi_sim_data_call_subscription = 278 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto multi_sim_sms_subscription = 279 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto multi_sim_sms_prompt = 280 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto multi_sim_voice_call_subscription = 359 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto multi_sim_voice_prompt = 360 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto multi_sim_data_call_subscription = 361 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto multi_sim_sms_subscription = 362 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto multi_sim_sms_prompt = 363 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Whether to enable new contacts aggregator or not. // 1 = enable, 0 = disable. - optional SettingProto new_contact_aggregator = 281 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto contact_metadata_sync_enabled = 282 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enable_cellular_on_boot = 283 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto max_notification_enqueue_rate = 284 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_notification_channel_warnings = 335 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto cell_on = 285 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_temperature_warning = 336 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto warning_temperature = 337 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enable_diskstats_logging = 338 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enable_cache_quota_calculation = 339 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enable_deletion_helper_no_threshold_toggle = 340 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto notification_snooze_options = 341 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enable_gnss_raw_meas_full_tracking = 346 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto install_carrier_app_notification_persistent = 356 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto install_carrier_app_notification_sleep_millis = 357 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto zram_enabled = 347 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto smart_replies_in_notifications_flags = 348 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_first_crash_dialog = 349 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_restart_in_crash_dialog = 351 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_mute_in_crash_dialog = 352 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingsProto show_zen_upgrade_notification = 354 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingsProto app_auto_restriction_enabled = 359 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingsProto zen_duration = 360 [ (android.privacy).dest = DEST_AUTOMATIC ]; - + optional SettingProto new_contact_aggregator = 364 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto contact_metadata_sync_enabled = 365 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enable_cellular_on_boot = 366 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto max_notification_enqueue_rate = 367 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_notification_channel_warnings = 368 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto cell_on = 369 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_temperature_warning = 370 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto warning_temperature = 371 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enable_diskstats_logging = 372 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enable_cache_quota_calculation = 373 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enable_deletion_helper_no_threshold_toggle = 374 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto notification_snooze_options = 375 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // Configuration flags for SQLite Compatibility WAL. Encoded as a key-value + // list, separated by commas. + // E.g.: compatibility_wal_supported=true, wal_syncmode=OFF + optional SettingProto sqlite_compatibility_wal_flags = 376 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enable_gnss_raw_meas_full_tracking = 377 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto install_carrier_app_notification_persistent = 378 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto install_carrier_app_notification_sleep_millis = 379 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto zram_enabled = 380 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto smart_replies_in_notifications_flags = 381 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_first_crash_dialog = 382 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_restart_in_crash_dialog = 383 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_mute_in_crash_dialog = 384 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingsProto show_zen_upgrade_notification = 385 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Please insert fields in the same order as in // frameworks/base/core/java/android/provider/Settings.java. - // Next tag = 361; + // Next tag = 386; } message SecureSettingsProto { @@ -454,227 +521,229 @@ message SecureSettingsProto { optional SettingProto voice_interaction_service = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; // The currently selected autofill service flattened ComponentName. optional SettingProto autofill_service = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_hci_log = 9; - optional SettingProto user_setup_complete = 10 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // Boolean indicating if Autofill supports field classification. + optional SettingProto autofill_feature_field_classification = 9 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto autofill_user_data_max_user_data_size = 10 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto autofill_user_data_max_field_classification_ids_size = 11 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto autofill_user_data_max_category_count = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto autofill_user_data_max_value_length = 13 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto autofill_user_data_min_value_length = 14 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto user_setup_complete = 15 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Whether the current user has been set up via setup wizard (0 = false, // 1 = true). This value differs from USER_SETUP_COMPLETE in that it can be // reset back to 0 in case SetupWizard has been re-enabled on TV devices. - optional SettingProto tv_user_setup_complete = 170 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto completed_category_prefix = 11 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enabled_input_methods = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto disabled_system_input_methods = 13 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_ime_with_hard_keyboard = 14 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto always_on_vpn_app = 15; - optional SettingProto always_on_vpn_lockdown = 16 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto install_non_market_apps = 17 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto unknown_sources_default_reversed = 171 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tv_user_setup_complete = 16 [ (android.privacy).dest = DEST_AUTOMATIC ]; + repeated SettingProto completed_categories = 17; + optional SettingProto enabled_input_methods = 18 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto disabled_system_input_methods = 19 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_ime_with_hard_keyboard = 20 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto always_on_vpn_app = 21; + optional SettingProto always_on_vpn_lockdown = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto install_non_market_apps = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto unknown_sources_default_reversed = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; // The degree of location access enabled by the user. - optional SettingProto location_mode = 18 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto location_previous_mode = 19; + optional SettingProto location_mode = 25 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // The App or module that changes the location mode. + optional SettingProto location_changer = 26 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Whether lock-to-app will lock the keyguard when exiting. - optional SettingProto lock_to_app_exit_locked = 20 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lock_screen_lock_after_timeout = 21 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lock_screen_allow_private_notifications = 172 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lock_screen_allow_remote_input = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_note_about_notification_hiding = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto trust_agents_initialized = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto parental_control_enabled = 25 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto parental_control_last_update = 26 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto parental_control_redirect_url = 27 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto settings_classname = 28 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_enabled = 29 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_shortcut_enabled = 173 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_shortcut_on_lock_screen = 174 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_shortcut_dialog_shown = 175 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_shortcut_target_service = 176 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lock_to_app_exit_locked = 27 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lock_screen_lock_after_timeout = 28 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lock_screen_allow_private_notifications = 29 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lock_screen_allow_remote_input = 30 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_note_about_notification_hiding = 31 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto trust_agents_initialized = 32 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto parental_control_enabled = 33 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto parental_control_last_update = 34 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto parental_control_redirect_url = 35 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto settings_classname = 36 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_enabled = 37 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_shortcut_enabled = 38 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_shortcut_on_lock_screen = 39 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_shortcut_dialog_shown = 40 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_shortcut_target_service = 41 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Setting specifying the accessibility service or feature to be toggled via // the accessibility button in the navigation bar. This is either a // flattened ComponentName or the class name of a system class implementing // a supported accessibility feature. - optional SettingProto accessibility_button_target_component = 177 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto touch_exploration_enabled = 30 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_button_target_component = 42 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto touch_exploration_enabled = 43 [ (android.privacy).dest = DEST_AUTOMATIC ]; // List of the enabled accessibility providers. - optional SettingProto enabled_accessibility_services = 31; + optional SettingProto enabled_accessibility_services = 44; // List of the accessibility services to which the user has granted // permission to put the device into touch exploration mode. - optional SettingProto touch_exploration_granted_accessibility_services = 32; + optional SettingProto touch_exploration_granted_accessibility_services = 45; + // Uri of the slice that's presented on the keyguard. Defaults to a slice + // with the date and next alarm. + optional SettingProto keyguard_slice_uri = 46; // Whether to speak passwords while in accessibility mode. - optional SettingProto accessibility_speak_password = 33 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_high_text_contrast_enabled = 34 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_script_injection = 35; - optional SettingProto accessibility_screen_reader_url = 36; - optional SettingProto accessibility_web_content_key_bindings = 37; - optional SettingProto accessibility_display_magnification_enabled = 38 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_display_magnification_navbar_enabled = 178 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_display_magnification_scale = 39 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_display_magnification_auto_update = 179 [deprecated = true]; - optional SettingProto accessibility_soft_keyboard_mode = 40 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_enabled = 41 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_locale = 42 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_preset = 43 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_background_color = 44 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_foreground_color = 45 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_edge_type = 46 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_edge_color = 47 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_window_color = 48 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_typeface = 49 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_captioning_font_scale = 50 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_display_inversion_enabled = 51 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_display_daltonizer_enabled = 52 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_display_daltonizer = 53 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_autoclick_enabled = 54 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_autoclick_delay = 55 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accessibility_large_pointer_icon = 56 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto long_press_timeout = 57 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto multi_press_timeout = 58 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enabled_print_services = 59; - optional SettingProto disabled_print_services = 60; - optional SettingProto display_density_forced = 61 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tts_default_rate = 62 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tts_default_pitch = 63 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tts_default_synth = 64 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tts_default_locale = 65 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tts_enabled_plugins = 66; - optional SettingProto connectivity_release_pending_intent_delay_ms = 67 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto allowed_geolocation_origins = 68; - optional SettingProto preferred_tty_mode = 69 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enhanced_voice_privacy_enabled = 70 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tty_mode_enabled = 71 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto backup_enabled = 72 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto backup_auto_restore = 73 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto backup_provisioned = 74 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto backup_transport = 75 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto last_setup_shown = 76 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_global_search_activity = 77 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_num_promoted_sources = 78 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_max_results_to_display = 79 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_max_results_per_source = 80 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_web_results_override_limit = 81 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_promoted_source_deadline_millis = 82 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_source_timeout_millis = 83 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_prefill_millis = 84 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_max_stat_age_millis = 85 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_max_source_event_age_millis = 86 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_min_impressions_for_source_ranking = 87 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_min_clicks_for_source_ranking = 88 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_max_shortcuts_returned = 89 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_query_thread_core_pool_size = 90 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_query_thread_max_pool_size = 91 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_shortcut_refresh_core_pool_size = 92 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_shortcut_refresh_max_pool_size = 93 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_thread_keepalive_seconds = 94 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto search_per_source_concurrent_query_limit = 95 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_speak_password = 47 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_high_text_contrast_enabled = 48 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_display_magnification_enabled = 49 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_display_magnification_navbar_enabled = 50 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_display_magnification_scale = 51 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_soft_keyboard_mode = 52 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_enabled = 53 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_locale = 54 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_preset = 55 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_background_color = 56 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_foreground_color = 57 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_edge_type = 58 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_edge_color = 59 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_window_color = 60 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_typeface = 61 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_captioning_font_scale = 62 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_display_inversion_enabled = 63 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_display_daltonizer_enabled = 64 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // Integer property that specifies the type of color space adjustment to perform. + optional SettingProto accessibility_display_daltonizer = 65 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_autoclick_enabled = 66 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_autoclick_delay = 67 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accessibility_large_pointer_icon = 68 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto long_press_timeout = 69 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto multi_press_timeout = 70 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enabled_print_services = 71; + optional SettingProto disabled_print_services = 72; + optional SettingProto display_density_forced = 73 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tts_default_rate = 74 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tts_default_pitch = 75 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tts_default_synth = 76 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tts_default_locale = 77 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tts_enabled_plugins = 78; + optional SettingProto connectivity_release_pending_intent_delay_ms = 79 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto allowed_geolocation_origins = 80; + optional SettingProto preferred_tty_mode = 81 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enhanced_voice_privacy_enabled = 82 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tty_mode_enabled = 83 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto backup_enabled = 84 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto backup_auto_restore = 85 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto backup_provisioned = 86 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto backup_transport = 87 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto last_setup_shown = 88 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_global_search_activity = 89 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_num_promoted_sources = 90 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_max_results_to_display = 91 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_max_results_per_source = 92 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_web_results_override_limit = 93 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_promoted_source_deadline_millis = 94 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_source_timeout_millis = 95 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_prefill_millis = 96 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_max_stat_age_millis = 97 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_max_source_event_age_millis = 98 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_min_impressions_for_source_ranking = 99 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_min_clicks_for_source_ranking = 100 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_max_shortcuts_returned = 101 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_query_thread_core_pool_size = 102 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_query_thread_max_pool_size = 103 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_shortcut_refresh_core_pool_size = 104 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_shortcut_refresh_max_pool_size = 105 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_thread_keepalive_seconds = 106 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto search_per_source_concurrent_query_limit = 107 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Whether or not alert sounds are played on StorageManagerService events. - optional SettingProto mount_play_notification_snd = 96 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mount_ums_autostart = 97 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mount_ums_prompt = 98 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mount_ums_notify_enabled = 99 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto anr_show_background = 100 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mount_play_notification_snd = 108 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mount_ums_autostart = 109 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mount_ums_prompt = 110 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mount_ums_notify_enabled = 111 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto anr_show_background = 112 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_first_crash_dialog_dev_option = 113 [ (android.privacy).dest = DEST_AUTOMATIC ]; // The ComponentName string of the service to be used as the voice // recognition service. - optional SettingProto voice_recognition_service = 101 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto package_verifier_user_consent = 102 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto selected_spell_checker = 103 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto selected_spell_checker_subtype = 104 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto spell_checker_enabled = 105 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto incall_power_button_behavior = 106 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto incall_back_button_behavior = 107 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wake_gesture_enabled = 108 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto doze_enabled = 109 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto doze_always_on = 110 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto doze_pulse_on_pick_up = 111 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto doze_pulse_on_long_press = 180 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto doze_pulse_on_double_tap = 112 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto ui_night_mode = 113 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screensaver_enabled = 114 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screensaver_components = 115 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screensaver_activate_on_dock = 116 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screensaver_activate_on_sleep = 117 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screensaver_default_component = 118 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto nfc_payment_default_component = 119 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto nfc_payment_foreground = 120 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sms_default_application = 121 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dialer_default_application = 122 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto emergency_assistance_application = 123 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_structure_enabled = 124 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_screenshot_enabled = 125 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_disclosure_enabled = 126 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto voice_recognition_service = 114 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto package_verifier_user_consent = 115 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto selected_spell_checker = 116 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto selected_spell_checker_subtype = 117 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto spell_checker_enabled = 118 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto incall_power_button_behavior = 119 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto incall_back_button_behavior = 120 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto wake_gesture_enabled = 121 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto doze_enabled = 122 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto doze_always_on = 123 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto doze_pulse_on_pick_up = 124 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto doze_pulse_on_long_press = 125 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto doze_pulse_on_double_tap = 126 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ui_night_mode = 127 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screensaver_enabled = 128 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screensaver_components = 129 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screensaver_activate_on_dock = 130 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screensaver_activate_on_sleep = 131 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screensaver_default_component = 132 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto nfc_payment_default_component = 133 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto nfc_payment_foreground = 134 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sms_default_application = 135 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dialer_default_application = 136 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto emergency_assistance_application = 137 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_structure_enabled = 138 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_screenshot_enabled = 139 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_disclosure_enabled = 140 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_rotation_suggestions = 141 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto num_rotation_suggestions_accepted = 142 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Read only list of the service components that the current user has // explicitly allowed to see and assist with all of the user's // notifications. - optional SettingProto enabled_notification_assistant = 127 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enabled_notification_listeners = 128 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto enabled_notification_policy_access_packages = 129 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enabled_notification_assistant = 143 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enabled_notification_listeners = 144 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enabled_notification_policy_access_packages = 145 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Defines whether managed profile ringtones should be synced from its // parent profile. - optional SettingProto sync_parent_sounds = 130 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto immersive_mode_confirmations = 131 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sync_parent_sounds = 146 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto immersive_mode_confirmations = 147 [ (android.privacy).dest = DEST_AUTOMATIC ]; // The query URI to find a print service to install. - optional SettingProto print_service_search_uri = 132 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto print_service_search_uri = 148 [ (android.privacy).dest = DEST_AUTOMATIC ]; // The query URI to find an NFC service to install. - optional SettingProto payment_service_search_uri = 133 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto payment_service_search_uri = 149 [ (android.privacy).dest = DEST_AUTOMATIC ]; // The query URI to find an auto fill service to install. - optional SettingProto autofill_service_search_uri = 181 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto skip_first_use_hints = 134 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto unsafe_volume_music_active_ms = 135 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lock_screen_show_notifications = 136 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tv_input_hidden_inputs = 137; - optional SettingProto tv_input_custom_labels = 138; - optional SettingProto usb_audio_automatic_routing_disabled = 139 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sleep_timeout = 140 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto double_tap_to_wake = 141 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto autofill_service_search_uri = 150 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto skip_first_use_hints = 151 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto unsafe_volume_music_active_ms = 152 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lock_screen_show_notifications = 153 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tv_input_hidden_inputs = 154; + optional SettingProto tv_input_custom_labels = 155; + optional SettingProto usb_audio_automatic_routing_disabled = 156 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sleep_timeout = 157 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto double_tap_to_wake = 158 [ (android.privacy).dest = DEST_AUTOMATIC ]; // The current assistant component. It could be a voice interaction service, // or an activity that handles ACTION_ASSIST, or empty, which means using // the default handling. - optional SettingProto assistant = 142 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto camera_gesture_disabled = 143 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto camera_double_tap_power_gesture_disabled = 144 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto camera_double_twist_to_flip_enabled = 145 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto camera_lift_trigger_enabled = 182 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_gesture_enabled = 183 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_gesture_sensitivity = 184 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_gesture_silence_alerts_enabled = 185 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_gesture_wake_enabled = 186 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto assist_gesture_setup_complete = 187 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto night_display_activated = 146 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto night_display_auto_mode = 147 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto night_display_color_temperature = 188 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto night_display_custom_start_time = 148 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto night_display_custom_end_time = 149 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto night_display_last_activated_time = 189 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto brightness_use_twilight = 150; - optional SettingProto enabled_vr_listeners = 151 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto vr_display_mode = 152 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto carrier_apps_handled = 153 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto managed_profile_contact_remote_search = 154 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto automatic_storage_manager_enabled = 155 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto automatic_storage_manager_days_to_retain = 156 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto automatic_storage_manager_bytes_cleared = 157 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto automatic_storage_manager_last_run = 158 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto automatic_storage_manager_turned_off_by_policy = 190 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto system_navigation_keys_enabled = 159 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto downloads_backup_enabled = 160; - optional SettingProto downloads_backup_allow_metered = 161; - optional SettingProto downloads_backup_charging_only = 162; - optional SettingProto automatic_storage_manager_downloads_days_to_retain = 163; + optional SettingProto assistant = 159 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto camera_gesture_disabled = 160 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto camera_double_tap_power_gesture_disabled = 161 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto camera_double_twist_to_flip_enabled = 162 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto camera_lift_trigger_enabled = 163 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_gesture_enabled = 164 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_gesture_sensitivity = 165 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_gesture_silence_alerts_enabled = 166 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_gesture_wake_enabled = 167 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto assist_gesture_setup_complete = 168 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto night_display_activated = 169 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto night_display_auto_mode = 170 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto night_display_color_temperature = 171 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto night_display_custom_start_time = 172 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto night_display_custom_end_time = 173 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto night_display_last_activated_time = 174 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto enabled_vr_listeners = 175 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto vr_display_mode = 176 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto carrier_apps_handled = 177 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto managed_profile_contact_remote_search = 178 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto automatic_storage_manager_enabled = 179 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto automatic_storage_manager_days_to_retain = 180 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto automatic_storage_manager_bytes_cleared = 181 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto automatic_storage_manager_last_run = 182 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto automatic_storage_manager_turned_off_by_policy = 183 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto system_navigation_keys_enabled = 184 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Holds comma-separated list of ordering of QuickSettings tiles. - optional SettingProto qs_tiles = 164 [ (android.privacy).dest = DEST_AUTOMATIC ]; - reserved 165; // Removed demo_user_setup_complete - optional SettingProto instant_apps_enabled = 166 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto device_paired = 167 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto package_verifier_state = 191 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto cmas_additional_broadcast_pkg = 192 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto notification_badging = 168 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto qs_auto_added_tiles = 193 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lockdown_in_power_menu = 194 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto backup_manager_constants = 169; - optional SettingProto show_first_crash_dialog_dev_option = 195 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto bluetooth_on_while_driving = 196 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto backup_local_transport_parameters = 197; - + optional SettingProto qs_tiles = 185 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto instant_apps_enabled = 186 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto device_paired = 187 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto package_verifier_state = 188 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto cmas_additional_broadcast_pkg = 189 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto notification_badging = 190 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto qs_auto_added_tiles = 191 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lockdown_in_power_menu = 192 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto backup_manager_constants = 193; + optional SettingProto backup_local_transport_parameters = 194; + optional SettingProto bluetooth_on_while_driving = 195 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Please insert fields in the same order as in // frameworks/base/core/java/android/provider/Settings.java. - // Next tag = 198 + // Next tag = 196 } message SystemSettingsProto { @@ -688,29 +757,31 @@ message SystemSettingsProto { optional SettingProto bluetooth_discoverability_timeout = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto font_scale = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto system_locales = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto display_color_mode = 67 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screen_off_timeout = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screen_brightness = 9 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screen_brightness_for_vr = 10 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screen_brightness_mode = 11 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto screen_auto_brightness_adj = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto display_color_mode = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screen_off_timeout = 9 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screen_brightness = 10 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screen_brightness_for_vr = 11 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screen_brightness_mode = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto screen_auto_brightness_adj = 13 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Determines which streams are affected by ringer mode changes. The stream // type's bit will be set to 1 if it should be muted when going into an // inaudible ringer mode. - optional SettingProto mode_ringer_streams_affected = 13 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto mute_streams_affected = 14 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto vibrate_on = 15 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto vibrate_input_devices = 16 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_ring = 17 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_system = 18 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_voice = 19 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_music = 20 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_alarm = 21 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_notification = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_bluetooth_sco = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_accessibility = 68 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto volume_master = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto master_mono = 25 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mode_ringer_streams_affected = 14 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto mute_streams_affected = 15 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto vibrate_on = 16 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto vibrate_input_devices = 17 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto notification_vibration_intensity = 18 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto haptic_feedback_intensity = 19 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_ring = 20 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_system = 21 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_voice = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_music = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_alarm = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_notification = 25 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_bluetooth_sco = 26 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_accessibility = 27 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto volume_master = 28 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto master_mono = 29 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Whether silent mode should allow vibration feedback. This is used // internally in AudioService and the Sound settings activity to coordinate // decoupling of vibrate and silent modes. This setting will likely be @@ -719,59 +790,63 @@ message SystemSettingsProto { // Not used anymore. On devices with vibrator, the user explicitly selects // silent or vibrate mode. Kept for use by legacy database upgrade code in // DatabaseHelper. - optional SettingProto vibrate_in_silent = 26 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto vibrate_in_silent = 30 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Appended to various volume related settings to record the previous values // before the settings were affected by a silent/vibrate ringer mode change. - optional SettingProto append_for_last_audible = 27 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto ringtone = 28; - optional SettingProto ringtone_cache = 29; - optional SettingProto notification_sound = 30; - optional SettingProto notification_sound_cache = 31; - optional SettingProto alarm_alert = 32; - optional SettingProto alarm_alert_cache = 33; - optional SettingProto media_button_receiver = 34; - optional SettingProto text_auto_replace = 35 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto text_auto_caps = 36 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto text_auto_punctuate = 37 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto text_show_password = 38 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_gtalk_service_status = 39 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto time_12_24 = 40 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto date_format = 41 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto setup_wizard_has_run = 42 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto accelerometer_rotation = 43 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto user_rotation = 44 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto hide_rotation_lock_toggle_for_accessibility = 45 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto vibrate_when_ringing = 46 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dtmf_tone_when_dialing = 47 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto dtmf_tone_type_when_dialing = 48 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto hearing_aid = 49 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto tty_mode = 50 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sound_effects_enabled = 51 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto haptic_feedback_enabled = 52 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto notification_light_pulse = 53 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto append_for_last_audible = 31 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto ringtone = 32; + optional SettingProto ringtone_cache = 33; + optional SettingProto notification_sound = 34; + optional SettingProto notification_sound_cache = 35; + optional SettingProto alarm_alert = 36; + optional SettingProto alarm_alert_cache = 37; + optional SettingProto media_button_receiver = 38; + optional SettingProto text_auto_replace = 39 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto text_auto_caps = 40 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto text_auto_punctuate = 41 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto text_show_password = 42 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_gtalk_service_status = 43 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto time_12_24 = 44 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto date_format = 45 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto setup_wizard_has_run = 46 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto accelerometer_rotation = 47 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto user_rotation = 48 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto hide_rotation_lock_toggle_for_accessibility = 49 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto vibrate_when_ringing = 50 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dtmf_tone_when_dialing = 51 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto dtmf_tone_type_when_dialing = 52 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto hearing_aid = 53 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tty_mode = 54 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // User-selected RTT mode. When on, outgoing and incoming calls will be + // answered as RTT calls when supported by the device and carrier. Boolean + // value. + optional SettingProto rtt_calling_mode = 55 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sound_effects_enabled = 56 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto haptic_feedback_enabled = 57 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto notification_light_pulse = 58 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Show pointer location on screen? 0 = no, 1 = yes. - optional SettingProto pointer_location = 54 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_touches = 55 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pointer_location = 59 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_touches = 60 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Log raw orientation data from {@link // com.android.server.policy.WindowOrientationListener} for use with the // orientationplot.py tool. // 0 = no, 1 = yes - optional SettingProto window_orientation_listener_log = 56 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lockscreen_sounds_enabled = 57 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lockscreen_disabled = 58 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sip_receive_calls = 59 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sip_call_options = 60 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sip_always = 61 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto sip_address_only = 62 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto pointer_speed = 63 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto lock_to_app_enabled = 64 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto egg_mode = 65 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto show_battery_percent = 69 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto when_to_make_wifi_calls = 66 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto window_orientation_listener_log = 61 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lockscreen_sounds_enabled = 62 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lockscreen_disabled = 63 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sip_receive_calls = 64 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sip_call_options = 65 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sip_always = 66 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto sip_address_only = 67 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pointer_speed = 68 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto lock_to_app_enabled = 69 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto egg_mode = 70 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto show_battery_percent = 71 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto when_to_make_wifi_calls = 72 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Please insert fields in the same order as in // frameworks/base/core/java/android/provider/Settings.java. - // Next tag = 70; + // Next tag = 73; } message SettingProto { diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 93e765be9cce..6c0be1b24df1 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4889,10 +4889,16 @@ <!-- Notification action for editing a screenshot (drawing on it, cropping it, etc) --> <string name="screenshot_edit">Edit</string> - <!-- Title for the notification channel notifying user of settings system changes (i.e. Do Not Disturb has changed). [CHAR LIMIT=NONE] --> + <!-- Title for the notification channel notifying user of settings system changes. [CHAR LIMIT=NONE] --> <string name="notification_channel_system_changes">System changes</string> + <!-- Title for the notification channel notifying user of do not disturb system changes (i.e. Do Not Disturb has changed). [CHAR LIMIT=NONE] --> + <string name="notification_channel_do_not_disturb">Do Not Disturb</string> + <!-- Title of notification indicating do not disturb visual interruption settings have changed when upgrading to P --> + <string name="zen_upgrade_notification_visd_title">Do Not Disturb is hiding notifications to help you focus</string> + <!-- Content of notification indicating users can tap on the notification to go to dnd behavior settings --> + <string name="zen_upgrade_notification_visd_content">This is new behavior. Tap to change.</string> <!-- Title of notification indicating do not disturb settings have changed when upgrading to P --> - <string name="zen_upgrade_notification_title">Do Not Disturb is hiding notifications to help you focus</string> + <string name="zen_upgrade_notification_title">Do Not Disturb has changed</string> <!-- Content of notification indicating users can tap on the notification to go to dnd behavior settings --> - <string name="zen_upgrade_notification_content">This is a new feature from the latest system update. Tap to change.</string> + <string name="zen_upgrade_notification_content">Tap to check what\'s blocked.</string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 30193a81d778..55e91571c8c0 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3129,6 +3129,7 @@ <java-symbol type="string" name="notification_channel_usb" /> <java-symbol type="string" name="notification_channel_heavy_weight_app" /> <java-symbol type="string" name="notification_channel_system_changes" /> + <java-symbol type="string" name="notification_channel_do_not_disturb" /> <java-symbol type="string" name="config_defaultAutofillService" /> <java-symbol type="string" name="config_defaultTextClassifierPackage" /> @@ -3295,6 +3296,8 @@ <java-symbol type="string" name="zen_upgrade_notification_title" /> <java-symbol type="string" name="zen_upgrade_notification_content" /> + <java-symbol type="string" name="zen_upgrade_notification_visd_title" /> + <java-symbol type="string" name="zen_upgrade_notification_visd_content" /> <java-symbol type="string" name="config_managed_provisioning_package" /> diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 44e7066c5c66..52d29e32e464 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -461,6 +461,11 @@ public final class Bitmap implements Parcelable { * * This configuration may be useful when using opaque bitmaps * that do not require high color fidelity. + * + * <p>Use this formula to pack into 16 bits:</p> + * <pre class="prettyprint"> + * short color = (R & 0x1f) << 11 | (G & 0x3f) << 5 | (B & 0x1f); + * </pre> */ RGB_565 (3), @@ -493,6 +498,11 @@ public final class Bitmap implements Parcelable { * * This configuration is very flexible and offers the best * quality. It should be used whenever possible. + * + * <p>Use this formula to pack into 32 bits:</p> + * <pre class="prettyprint"> + * int color = (A & 0xff) << 24 | (B & 0xff) << 16 | (G & 0xff) << 8 | (R & 0xff); + * </pre> */ ARGB_8888 (5), @@ -503,6 +513,11 @@ public final class Bitmap implements Parcelable { * * This configuration is particularly suited for wide-gamut and * HDR content. + * + * <p>Use this formula to pack into 64 bits:</p> + * <pre class="prettyprint"> + * long color = (A & 0xffff) << 48 | (B & 0xffff) << 32 | (G & 0xffff) << 16 | (R & 0xffff); + * </pre> */ RGBA_F16 (6), diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index cfcfb95b0f88..4530f8062f0d 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -40,6 +40,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Global; import android.provider.Settings.Secure; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; @@ -2594,15 +2595,26 @@ class DatabaseHelper extends SQLiteOpenHelper { loadSetting(stmt, Settings.Global.CALL_AUTO_RETRY, 0); // Set the preferred network mode to target desired value or Default - // value defined in RILConstants - int type; - type = RILConstants.PREFERRED_NETWORK_MODE; - loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, type); + // value defined in system property + String val = ""; + String mode; + for (int phoneId = 0; + phoneId < TelephonyManager.getDefault().getPhoneCount(); phoneId++) { + mode = TelephonyManager.getTelephonyProperty(phoneId, + "ro.telephony.default_network", + Integer.toString(RILConstants.PREFERRED_NETWORK_MODE)); + if (phoneId == 0) { + val = mode; + } else { + val = val + "," + mode; + } + } + loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, val); // Set the preferred cdma subscription source to target desired value or default // value defined in Phone - type = SystemProperties.getInt("ro.telephony.default_cdma_sub", - Phone.PREFERRED_CDMA_SUBSCRIPTION); + int type = SystemProperties.getInt("ro.telephony.default_cdma_sub", + Phone.PREFERRED_CDMA_SUBSCRIPTION); loadSetting(stmt, Settings.Global.CDMA_SUBSCRIPTION_MODE, type); loadIntegerSetting(stmt, Settings.Global.LOW_BATTERY_SOUND_TIMEOUT, diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index ccb4d8c866da..53cff4e84549 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -39,19 +39,15 @@ class SettingsProtoDumpUtil { SettingsState globalSettings = settingsRegistry.getSettingsLocked( SettingsProvider.SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM); if (globalSettings != null) { - long globalSettingsToken = proto.start(SettingsServiceDumpProto.GLOBAL_SETTINGS); - dumpProtoGlobalSettingsLocked(globalSettings, proto); - proto.end(globalSettingsToken); + dumpProtoGlobalSettingsLocked(proto, SettingsServiceDumpProto.GLOBAL_SETTINGS, globalSettings); } // Per-user settings SparseBooleanArray users = settingsRegistry.getKnownUsersLocked(); final int userCount = users.size(); for (int i = 0; i < userCount; i++) { - long userSettingsToken = proto.start(SettingsServiceDumpProto.USER_SETTINGS); - dumpProtoUserSettingsLocked( - settingsRegistry, UserHandle.of(users.keyAt(i)), proto); - proto.end(userSettingsToken); + dumpProtoUserSettingsLocked(proto, SettingsServiceDumpProto.USER_SETTINGS, + settingsRegistry, UserHandle.of(users.keyAt(i))); } } @@ -63,30 +59,33 @@ class SettingsProtoDumpUtil { * @param proto The proto buf stream to dump to */ private static void dumpProtoUserSettingsLocked( + @NonNull ProtoOutputStream proto, + long fieldId, SettingsProvider.SettingsRegistry settingsRegistry, - @NonNull UserHandle user, - @NonNull ProtoOutputStream proto) { + @NonNull UserHandle user) { + final long token = proto.start(fieldId); + proto.write(UserSettingsProto.USER_ID, user.getIdentifier()); SettingsState secureSettings = settingsRegistry.getSettingsLocked( SettingsProvider.SETTINGS_TYPE_SECURE, user.getIdentifier()); if (secureSettings != null) { - long secureSettingsToken = proto.start(UserSettingsProto.SECURE_SETTINGS); - dumpProtoSecureSettingsLocked(secureSettings, proto); - proto.end(secureSettingsToken); + dumpProtoSecureSettingsLocked(proto, UserSettingsProto.SECURE_SETTINGS, secureSettings); } SettingsState systemSettings = settingsRegistry.getSettingsLocked( SettingsProvider.SETTINGS_TYPE_SYSTEM, user.getIdentifier()); if (systemSettings != null) { - long systemSettingsToken = proto.start(UserSettingsProto.SYSTEM_SETTINGS); - dumpProtoSystemSettingsLocked(systemSettings, proto); - proto.end(systemSettingsToken); + dumpProtoSystemSettingsLocked(proto, UserSettingsProto.SYSTEM_SETTINGS, systemSettings); } + + proto.end(token); } private static void dumpProtoGlobalSettingsLocked( - @NonNull SettingsState s, @NonNull ProtoOutputStream p) { + @NonNull ProtoOutputStream p, long fieldId, @NonNull SettingsState s) { + final long token = p.start(fieldId); + s.dumpHistoricalOperations(p, GlobalSettingsProto.HISTORICAL_OPERATIONS); // This uses the same order as in Settings.Global. @@ -102,6 +101,11 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.THEATER_MODE_ON, GlobalSettingsProto.THEATER_MODE_ON); + // RADIO_BLUETOOTH is just a constant and not an actual setting. + // RADIO_WIFI is just a constant and not an actual setting. + // RADIO_WIMAX is just a constant and not an actual setting. + // RADIO_CELL is just a constant and not an actual setting. + // RADIO_NFC is just a constant and not an actual setting. dumpSetting(s, p, Settings.Global.AIRPLANE_MODE_RADIOS, GlobalSettingsProto.AIRPLANE_MODE_RADIOS); @@ -253,6 +257,9 @@ class SettingsProtoDumpUtil { Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED, GlobalSettingsProto.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED); dumpSetting(s, p, + Settings.Global.PRIV_APP_OOB_ENABLED, + GlobalSettingsProto.PRIV_APP_OOB_ENABLED); + dumpSetting(s, p, Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS, GlobalSettingsProto.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS); dumpSetting(s, p, @@ -343,6 +350,9 @@ class SettingsProtoDumpUtil { Settings.Global.NETWORK_SCORER_APP, GlobalSettingsProto.NETWORK_SCORER_APP); dumpSetting(s, p, + Settings.Global.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE, + GlobalSettingsProto.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE); + dumpSetting(s, p, Settings.Global.NITZ_UPDATE_DIFF, GlobalSettingsProto.NITZ_UPDATE_DIFF); dumpSetting(s, p, @@ -499,6 +509,9 @@ class SettingsProtoDumpUtil { Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, GlobalSettingsProto.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON); dumpSetting(s, p, + Settings.Global.WIFI_CARRIER_NETWORKS_AVAILABLE_NOTIFICATION_ON, + GlobalSettingsProto.WIFI_CARRIER_NETWORKS_AVAILABLE_NOTIFICATION_ON); + dumpSetting(s, p, Settings.Global.WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON, GlobalSettingsProto.WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON); dumpSetting(s, p, @@ -523,6 +536,9 @@ class SettingsProtoDumpUtil { Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, GlobalSettingsProto.WIFI_SCAN_ALWAYS_AVAILABLE); dumpSetting(s, p, + Settings.Global.SOFT_AP_TIMEOUT_ENABLED, + GlobalSettingsProto.SOFT_AP_TIMEOUT_ENABLED); + dumpSetting(s, p, Settings.Global.WIFI_WAKEUP_ENABLED, GlobalSettingsProto.WIFI_WAKEUP_ENABLED); dumpSetting(s, p, @@ -532,6 +548,9 @@ class SettingsProtoDumpUtil { Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS, GlobalSettingsProto.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS); dumpSetting(s, p, + Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS, + GlobalSettingsProto.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS); + dumpSetting(s, p, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, GlobalSettingsProto.NETWORK_RECOMMENDATIONS_ENABLED); dumpSetting(s, p, @@ -544,12 +563,27 @@ class SettingsProtoDumpUtil { Settings.Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS, GlobalSettingsProto.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS); dumpSetting(s, p, - Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS, - GlobalSettingsProto.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS); - dumpSetting(s, p, Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, GlobalSettingsProto.BLE_SCAN_ALWAYS_AVAILABLE); dumpSetting(s, p, + Settings.Global.BLE_SCAN_LOW_POWER_WINDOW_MS, + GlobalSettingsProto.BLE_SCAN_LOW_POWER_WINDOW_MS); + dumpSetting(s, p, + Settings.Global.BLE_SCAN_BALANCED_WINDOW_MS, + GlobalSettingsProto.BLE_SCAN_BALANCED_WINDOW_MS); + dumpSetting(s, p, + Settings.Global.BLE_SCAN_LOW_LATENCY_WINDOW_MS, + GlobalSettingsProto.BLE_SCAN_LOW_LATENCY_WINDOW_MS); + dumpSetting(s, p, + Settings.Global.BLE_SCAN_LOW_POWER_INTERVAL_MS, + GlobalSettingsProto.BLE_SCAN_LOW_POWER_INTERVAL_MS); + dumpSetting(s, p, + Settings.Global.BLE_SCAN_BALANCED_INTERVAL_MS, + GlobalSettingsProto.BLE_SCAN_BALANCED_INTERVAL_MS); + dumpSetting(s, p, + Settings.Global.BLE_SCAN_LOW_LATENCY_INTERVAL_MS, + GlobalSettingsProto.BLE_SCAN_LOW_LATENCY_INTERVAL_MS); + dumpSetting(s, p, Settings.Global.WIFI_SAVED_STATE, GlobalSettingsProto.WIFI_SAVED_STATE); dumpSetting(s, p, @@ -645,12 +679,12 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.DROPBOX_RESERVE_PERCENT, GlobalSettingsProto.DROPBOX_RESERVE_PERCENT); - dumpSetting(s, p, + dumpRepeatedSetting(s, p, Settings.Global.DROPBOX_TAG_PREFIX, - GlobalSettingsProto.DROPBOX_TAG_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.DROPBOX_SETTINGS); + dumpRepeatedSetting(s, p, Settings.Global.ERROR_LOGCAT_PREFIX, - GlobalSettingsProto.ERROR_LOGCAT_PREFIX); + GlobalSettingsProto.ERROR_LOGCAT_LINES); dumpSetting(s, p, Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL, GlobalSettingsProto.SYS_FREE_STORAGE_LOG_INTERVAL); @@ -756,42 +790,42 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.PRIVATE_DNS_SPECIFIER, GlobalSettingsProto.PRIVATE_DNS_SPECIFIER); - dumpSetting(s, p, + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_HEADSET_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_HEADSET_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_HEADSET_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_A2DP_SINK_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_A2DP_SRC_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_A2DP_SUPPORTS_OPTIONAL_CODECS_PREFIX, - GlobalSettingsProto.BLUETOOTH_A2DP_SUPPORTS_OPTIONAL_CODECS_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_A2DP_SUPPORTS_OPTIONAL_CODECS); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_A2DP_OPTIONAL_CODECS_ENABLED_PREFIX, - GlobalSettingsProto.BLUETOOTH_A2DP_OPTIONAL_CODECS_ENABLED_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_A2DP_OPTIONAL_CODECS_ENABLED); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_INPUT_DEVICE_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_MAP_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_MAP_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_MAP_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_MAP_CLIENT_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_MAP_CLIENT_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_MAP_CLIENT_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_PBAP_CLIENT_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_SAP_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_SAP_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_SAP_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_PAN_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_PAN_PRIORITY_PREFIX); - dumpSetting(s, p, + GlobalSettingsProto.BLUETOOTH_PAN_PRIORITIES); + dumpRepeatedSetting(s, p, Settings.Global.BLUETOOTH_HEARING_AID_PRIORITY_PREFIX, - GlobalSettingsProto.BLUETOOTH_HEARING_AID_PRIORITY_PREFIX); + GlobalSettingsProto.BLUETOOTH_HEARING_AID_PRIORITIES); dumpSetting(s, p, Settings.Global.ACTIVITY_MANAGER_CONSTANTS, GlobalSettingsProto.ACTIVITY_MANAGER_CONSTANTS); @@ -802,12 +836,36 @@ class SettingsProtoDumpUtil { Settings.Global.BATTERY_SAVER_CONSTANTS, GlobalSettingsProto.BATTERY_SAVER_CONSTANTS); dumpSetting(s, p, + Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS, + GlobalSettingsProto.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS); + dumpSetting(s, p, + Settings.Global.BATTERY_TIP_CONSTANTS, + GlobalSettingsProto.BATTERY_TIP_CONSTANTS); + dumpSetting(s, p, Settings.Global.ANOMALY_DETECTION_CONSTANTS, GlobalSettingsProto.ANOMALY_DETECTION_CONSTANTS); dumpSetting(s, p, + Settings.Global.ANOMALY_CONFIG_VERSION, + GlobalSettingsProto.ANOMALY_CONFIG_VERSION); + dumpSetting(s, p, + Settings.Global.ANOMALY_CONFIG, + GlobalSettingsProto.ANOMALY_CONFIG); + dumpSetting(s, p, Settings.Global.ALWAYS_ON_DISPLAY_CONSTANTS, GlobalSettingsProto.ALWAYS_ON_DISPLAY_CONSTANTS); dumpSetting(s, p, + Settings.Global.SYS_VDSO, + GlobalSettingsProto.SYS_VDSO); + dumpSetting(s, p, + Settings.Global.SYS_UIDCPUPOWER, + GlobalSettingsProto.SYS_UIDCPUPOWER); + dumpSetting(s, p, + Settings.Global.FPS_DEVISOR, + GlobalSettingsProto.FPS_DIVISOR); + dumpSetting(s, p, + Settings.Global.DISPLAY_PANEL_LPM, + GlobalSettingsProto.DISPLAY_PANEL_LPM); + dumpSetting(s, p, Settings.Global.APP_IDLE_CONSTANTS, GlobalSettingsProto.APP_IDLE_CONSTANTS); dumpSetting(s, p, @@ -829,6 +887,42 @@ class SettingsProtoDumpUtil { Settings.Global.TEXT_CLASSIFIER_CONSTANTS, GlobalSettingsProto.TEXT_CLASSIFIER_CONSTANTS); dumpSetting(s, p, + Settings.Global.BATTERY_STATS_CONSTANTS, + GlobalSettingsProto.BATTERY_STATS_CONSTANTS); + dumpSetting(s, p, + Settings.Global.SYNC_MANAGER_CONSTANTS, + GlobalSettingsProto.SYNC_MANAGER_CONSTANTS); + dumpSetting(s, p, + Settings.Global.APP_STANDBY_ENABLED, + GlobalSettingsProto.APP_STANDBY_ENABLED); + dumpSetting(s, p, + Settings.Global.APP_AUTO_RESTRICTION_ENABLED, + GlobalSettingsProto.APP_AUTO_RESTRICTION_ENABLED); + dumpSetting(s, p, + Settings.Global.FORCED_APP_STANDBY_ENABLED, + GlobalSettingsProto.FORCED_APP_STANDBY_ENABLED); + dumpSetting(s, p, + Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, + GlobalSettingsProto.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED); + dumpSetting(s, p, + Settings.Global.OFF_BODY_RADIOS_OFF_FOR_SMALL_BATTERY_ENABLED, + GlobalSettingsProto.OFF_BODY_RADIOS_OFF_FOR_SMALL_BATTERY_ENABLED); + dumpSetting(s, p, + Settings.Global.OFF_BODY_RADIOS_OFF_DELAY_MS, + GlobalSettingsProto.OFF_BODY_RADIOS_OFF_DELAY_MS); + dumpSetting(s, p, + Settings.Global.WIFI_ON_WHEN_PROXY_DISCONNECTED, + GlobalSettingsProto.WIFI_ON_WHEN_PROXY_DISCONNECTED); + dumpSetting(s, p, + Settings.Global.TIME_ONLY_MODE_ENABLED, + GlobalSettingsProto.TIME_ONLY_MODE_ENABLED); + dumpSetting(s, p, + Settings.Global.NETWORK_WATCHLIST_ENABLED, + GlobalSettingsProto.NETWORK_WATCHLIST_ENABLED); + dumpSetting(s, p, + Settings.Global.KEEP_PROFILE_IN_BACKGROUND, + GlobalSettingsProto.KEEP_PROFILE_IN_BACKGROUND); + dumpSetting(s, p, Settings.Global.WINDOW_ANIMATION_SCALE, GlobalSettingsProto.WINDOW_ANIMATION_SCALE); dumpSetting(s, p, @@ -870,15 +964,6 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.GPU_DEBUG_LAYERS, GlobalSettingsProto.GPU_DEBUG_LAYERS); - dumpSetting(s, p, - Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, - GlobalSettingsProto.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING); - dumpSetting(s, p, - Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, - GlobalSettingsProto.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT); - dumpSetting(s, p, - Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS, - GlobalSettingsProto.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS); // Settings.Global.SHOW_PROCESSES intentionally excluded since it's deprecated. dumpSetting(s, p, Settings.Global.LOW_POWER_MODE, @@ -887,6 +972,9 @@ class SettingsProtoDumpUtil { Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, GlobalSettingsProto.LOW_POWER_MODE_TRIGGER_LEVEL); dumpSetting(s, p, + Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL_MAX, + GlobalSettingsProto.LOW_POWER_MODE_TRIGGER_LEVEL_MAX); + dumpSetting(s, p, Settings.Global.ALWAYS_FINISH_ACTIVITIES, GlobalSettingsProto.ALWAYS_FINISH_ACTIVITIES); dumpSetting(s, p, @@ -962,6 +1050,9 @@ class SettingsProtoDumpUtil { Settings.Global.POLICY_CONTROL, GlobalSettingsProto.POLICY_CONTROL); dumpSetting(s, p, + Settings.Global.EMULATE_DISPLAY_CUTOUT, + GlobalSettingsProto.EMULATE_DISPLAY_CUTOUT); + dumpSetting(s, p, Settings.Global.ZEN_MODE, GlobalSettingsProto.ZEN_MODE); dumpSetting(s, p, @@ -971,6 +1062,9 @@ class SettingsProtoDumpUtil { Settings.Global.ZEN_MODE_CONFIG_ETAG, GlobalSettingsProto.ZEN_MODE_CONFIG_ETAG); dumpSetting(s, p, + Settings.Global.ZEN_DURATION, + GlobalSettingsProto.ZEN_DURATION); + dumpSetting(s, p, Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED, GlobalSettingsProto.HEADS_UP_NOTIFICATIONS_ENABLED); dumpSetting(s, p, @@ -1061,9 +1155,18 @@ class SettingsProtoDumpUtil { Settings.Global.STORAGE_SETTINGS_CLOBBER_THRESHOLD, GlobalSettingsProto.STORAGE_SETTINGS_CLOBBER_THRESHOLD); dumpSetting(s, p, + Settings.Global.LOCATION_GLOBAL_KILL_SWITCH, + GlobalSettingsProto.LOCATION_GLOBAL_KILL_SWITCH); + dumpSetting(s, p, + Settings.Global.OVERRIDE_SETTINGS_PROVIDER_RESTORE_ANY_VERSION, + GlobalSettingsProto.OVERRIDE_SETTINGS_PROVIDER_RESTORE_ANY_VERSION); + dumpSetting(s, p, Global.CHAINED_BATTERY_ATTRIBUTION_ENABLED, GlobalSettingsProto.CHAINED_BATTERY_ATTRIBUTION_ENABLED); dumpSetting(s, p, + Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES, + GlobalSettingsProto.AUTOFILL_COMPAT_ALLOWED_PACKAGES); + dumpSetting(s, p, Global.HIDDEN_API_BLACKLIST_EXEMPTIONS, GlobalSettingsProto.HIDDEN_API_BLACKLIST_EXEMPTIONS); dumpSetting(s, p, @@ -1121,6 +1224,18 @@ class SettingsProtoDumpUtil { Settings.Global.NOTIFICATION_SNOOZE_OPTIONS, GlobalSettingsProto.NOTIFICATION_SNOOZE_OPTIONS); dumpSetting(s, p, + Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS, + GlobalSettingsProto.SQLITE_COMPATIBILITY_WAL_FLAGS); + dumpSetting(s, p, + Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, + GlobalSettingsProto.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING); + dumpSetting(s, p, + Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, + GlobalSettingsProto.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT); + dumpSetting(s, p, + Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS, + GlobalSettingsProto.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS); + dumpSetting(s, p, Settings.Global.ZRAM_ENABLED, GlobalSettingsProto.ZRAM_ENABLED); dumpSetting(s, p, @@ -1138,14 +1253,19 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.SHOW_ZEN_UPGRADE_NOTIFICATION, GlobalSettingsProto.SHOW_ZEN_UPGRADE_NOTIFICATION); - dumpSetting(s, p, - Settings.Global.APP_AUTO_RESTRICTION_ENABLED, - GlobalSettingsProto.APP_AUTO_RESTRICTION_ENABLED); - dumpSetting(s, p, - Settings.Global.ZEN_DURATION, - GlobalSettingsProto.ZEN_DURATION); - // Please insert new settings using the same order as in Settings.Global. + + p.end(token); + } + + /** Dumps settings that use a common prefix into a repeated field. */ + private static void dumpRepeatedSetting(@NonNull SettingsState settings, + @NonNull ProtoOutputStream proto, String settingPrefix, long fieldId) { + for (String s : settings.getSettingNamesLocked()) { + if (s.startsWith(settingPrefix)) { + dumpSetting(settings, proto, s, fieldId); + } + } } /** Dump a single {@link SettingsState.Setting} to a proto buf */ @@ -1167,7 +1287,9 @@ class SettingsProtoDumpUtil { } static void dumpProtoSecureSettingsLocked( - @NonNull SettingsState s, @NonNull ProtoOutputStream p) { + @NonNull ProtoOutputStream p, long fieldId, @NonNull SettingsState s) { + final long token = p.start(fieldId); + s.dumpHistoricalOperations(p, SecureSettingsProto.HISTORICAL_OPERATIONS); // This uses the same order as in Settings.Secure. @@ -1199,6 +1321,24 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.AUTOFILL_SERVICE, SecureSettingsProto.AUTOFILL_SERVICE); + dumpSetting(s, p, + Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION, + SecureSettingsProto.AUTOFILL_FEATURE_FIELD_CLASSIFICATION); + dumpSetting(s, p, + Settings.Secure.AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE, + SecureSettingsProto.AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE); + dumpSetting(s, p, + Settings.Secure.AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE, + SecureSettingsProto.AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE); + dumpSetting(s, p, + Settings.Secure.AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT, + SecureSettingsProto.AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT); + dumpSetting(s, p, + Settings.Secure.AUTOFILL_USER_DATA_MAX_VALUE_LENGTH, + SecureSettingsProto.AUTOFILL_USER_DATA_MAX_VALUE_LENGTH); + dumpSetting(s, p, + Settings.Secure.AUTOFILL_USER_DATA_MIN_VALUE_LENGTH, + SecureSettingsProto.AUTOFILL_USER_DATA_MIN_VALUE_LENGTH); // Settings.Secure.DEVICE_PROVISIONED intentionally excluded since it's deprecated. dumpSetting(s, p, Settings.Secure.USER_SETUP_COMPLETE, @@ -1209,9 +1349,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.TV_USER_SETUP_COMPLETE, SecureSettingsProto.TV_USER_SETUP_COMPLETE); - dumpSetting(s, p, + dumpRepeatedSetting(s, p, Settings.Secure.COMPLETED_CATEGORY_PREFIX, - SecureSettingsProto.COMPLETED_CATEGORY_PREFIX); + SecureSettingsProto.COMPLETED_CATEGORIES); dumpSetting(s, p, Settings.Secure.ENABLED_INPUT_METHODS, SecureSettingsProto.ENABLED_INPUT_METHODS); @@ -1238,6 +1378,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.LOCATION_MODE, SecureSettingsProto.LOCATION_MODE); + dumpSetting(s, p, + Settings.Secure.LOCATION_CHANGER, + SecureSettingsProto.LOCATION_CHANGER); // Settings.Secure.LOCK_BIOMETRIC_WEAK_FLAGS intentionally excluded since it's deprecated. dumpSetting(s, p, Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, @@ -1309,6 +1452,9 @@ class SettingsProtoDumpUtil { Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, SecureSettingsProto.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES); dumpSetting(s, p, + Settings.Secure.KEYGUARD_SLICE_URI, + SecureSettingsProto.KEYGUARD_SLICE_URI); + dumpSetting(s, p, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, SecureSettingsProto.ACCESSIBILITY_SPEAK_PASSWORD); dumpSetting(s, p, @@ -1324,9 +1470,6 @@ class SettingsProtoDumpUtil { Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, SecureSettingsProto.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE); dumpSetting(s, p, - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE, - SecureSettingsProto.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE); - dumpSetting(s, p, Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, SecureSettingsProto.ACCESSIBILITY_SOFT_KEYBOARD_MODE); dumpSetting(s, p, @@ -1618,6 +1761,12 @@ class SettingsProtoDumpUtil { Settings.Secure.ASSIST_DISCLOSURE_ENABLED, SecureSettingsProto.ASSIST_DISCLOSURE_ENABLED); dumpSetting(s, p, + Settings.Secure.SHOW_ROTATION_SUGGESTIONS, + SecureSettingsProto.SHOW_ROTATION_SUGGESTIONS); + dumpSetting(s, p, + Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED, + SecureSettingsProto.NUM_ROTATION_SUGGESTIONS_ACCEPTED); + dumpSetting(s, p, Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT, SecureSettingsProto.ENABLED_NOTIFICATION_ASSISTANT); dumpSetting(s, p, @@ -1776,12 +1925,15 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING, SecureSettingsProto.BLUETOOTH_ON_WHILE_DRIVING); - // Please insert new settings using the same order as in Settings.Secure. + + p.end(token); } private static void dumpProtoSystemSettingsLocked( - @NonNull SettingsState s, @NonNull ProtoOutputStream p) { + @NonNull ProtoOutputStream p, long fieldId, @NonNull SettingsState s) { + final long token = p.start(fieldId); + s.dumpHistoricalOperations(p, SystemSettingsProto.HISTORICAL_OPERATIONS); // This uses the same order as in Settings.System. @@ -1794,11 +1946,11 @@ class SettingsProtoDumpUtil { Settings.System.ADVANCED_SETTINGS, SystemSettingsProto.ADVANCED_SETTINGS); // Settings.System.AIRPLANE_MODE_ON intentionally excluded since it's deprecated. - // Settings.System.RADIO_BLUETOOTH intentionally excluded since it's deprecated. - // Settings.System.RADIO_WIFI intentionally excluded since it's deprecated. - // Settings.System.RADIO_WIMAX intentionally excluded since it's deprecated. - // Settings.System.RADIO_CELL intentionally excluded since it's deprecated. - // Settings.System.RADIO_NFC intentionally excluded since it's deprecated. + // Settings.System.RADIO_BLUETOOTH intentionally excluded since it's just a constant. + // Settings.System.RADIO_WIFI intentionally excluded since it's just a constant. + // Settings.System.RADIO_WIMAX intentionally excluded since it's just a constant. + // Settings.System.RADIO_CELL intentionally excluded since it's just a constant. + // Settings.System.RADIO_NFC intentionally excluded since it's just a constant. // Settings.System.AIRPLANE_MODE_RADIOS intentionally excluded since it's deprecated. // Settings.System.AIRPLANE_MODE_TOGGLABLE_RADIOS intentionally excluded since it's deprecated. // Settings.System.WIFI_SLEEP_POLICY intentionally excluded since it's deprecated. @@ -1861,6 +2013,12 @@ class SettingsProtoDumpUtil { Settings.System.VIBRATE_INPUT_DEVICES, SystemSettingsProto.VIBRATE_INPUT_DEVICES); dumpSetting(s, p, + Settings.System.NOTIFICATION_VIBRATION_INTENSITY, + SystemSettingsProto.NOTIFICATION_VIBRATION_INTENSITY); + dumpSetting(s, p, + Settings.System.HAPTIC_FEEDBACK_INTENSITY, + SystemSettingsProto.HAPTIC_FEEDBACK_INTENSITY); + dumpSetting(s, p, Settings.System.VOLUME_RING, SystemSettingsProto.VOLUME_RING); dumpSetting(s, p, @@ -1973,6 +2131,9 @@ class SettingsProtoDumpUtil { Settings.System.TTY_MODE, SystemSettingsProto.TTY_MODE); dumpSetting(s, p, + Settings.System.RTT_CALLING_MODE, + SystemSettingsProto.RTT_CALLING_MODE); + dumpSetting(s, p, Settings.System.SOUND_EFFECTS_ENABLED, SystemSettingsProto.SOUND_EFFECTS_ENABLED); dumpSetting(s, p, @@ -2038,5 +2199,7 @@ class SettingsProtoDumpUtil { // they're deprecated from Settings.System. // Please insert new settings using the same order as in Settings.System. + + p.end(token); } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationDefinitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationDefinitionCompat.java index 5fff5febec85..098698aa1c5c 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationDefinitionCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationDefinitionCompat.java @@ -29,6 +29,11 @@ public class RemoteAnimationDefinitionCompat { mWrapped.addRemoteAnimation(transition, adapter.getWrapped()); } + public void addRemoteAnimation(int transition, int activityTypeFilter, + RemoteAnimationAdapterCompat adapter) { + mWrapped.addRemoteAnimation(transition, activityTypeFilter, adapter.getWrapped()); + } + RemoteAnimationDefinition getWrapped() { return mWrapped; } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index a9c80c62e998..2de3ae2bd9e4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -18,6 +18,7 @@ package com.android.systemui.shared.system; import static android.view.Display.DEFAULT_DISPLAY; +import android.app.WindowConfiguration; import android.graphics.Rect; import android.os.Handler; import android.os.RemoteException; @@ -58,6 +59,8 @@ public class WindowManagerWrapper { public static final int TRANSIT_KEYGUARD_OCCLUDE = WindowManager.TRANSIT_KEYGUARD_OCCLUDE; public static final int TRANSIT_KEYGUARD_UNOCCLUDE = WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; + public static final int ACTIVITY_TYPE_STANDARD = WindowConfiguration.ACTIVITY_TYPE_STANDARD; + private static final WindowManagerWrapper sInstance = new WindowManagerWrapper(); public static WindowManagerWrapper getInstance() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java index d79f0a1bf758..19544b170d1f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java @@ -200,12 +200,6 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener */ @Override public boolean onInterceptTouchEvent(MotionEvent event) { - if (!mNavigationBarView.isQuickScrubEnabled() - && !mNavigationBarView.isQuickStepSwipeUpEnabled()) { - mNavigationBarView.getHomeButton().setDelayTouchFeedback(false /* delay */); - return false; - } - mNavigationBarView.requestUnbufferedDispatch(event); return handleTouchEvent(event); } @@ -222,6 +216,13 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener } private boolean handleTouchEvent(MotionEvent event) { + if (!mNavigationBarView.isQuickScrubEnabled() + && !mNavigationBarView.isQuickStepSwipeUpEnabled()) { + mNavigationBarView.getHomeButton().setDelayTouchFeedback(false /* delay */); + return false; + } + mNavigationBarView.requestUnbufferedDispatch(event); + final ButtonDispatcher homeButton = mNavigationBarView.getHomeButton(); if (mGestureDetector.onTouchEvent(event)) { // If the fling has been handled on UP, then skip proxying the UP diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 22bf98378ccb..91314fe38118 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -479,6 +479,7 @@ public class VolumeDialogImpl implements VolumeDialog { if (mShowing) return; mShowing = true; + initSettingsH(); mDialog.show(); Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); mController.notifyVisible(true); diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 4541acde14b4..3db1da59b4ea 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -103,7 +103,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub .replaceWith("?"); private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE); private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE); - private static final int MAX_LOW_POWER_STATS_SIZE = 512; + private static final int MAX_LOW_POWER_STATS_SIZE = 2048; /** * Replaces the information in the given rpmStats with up-to-date information. diff --git a/services/core/java/com/android/server/display/OWNERS b/services/core/java/com/android/server/display/OWNERS index 83614219a3b5..98e32997e587 100644 --- a/services/core/java/com/android/server/display/OWNERS +++ b/services/core/java/com/android/server/display/OWNERS @@ -1,3 +1,5 @@ michaelwr@google.com +hackbod@google.com +ogunwale@google.com -per-file ColorDisplayService.java=christyfranks@google.com
\ No newline at end of file +per-file ColorDisplayService.java=christyfranks@google.com diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java index 8efce8602e78..1bd5f42e535f 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java @@ -148,6 +148,11 @@ public class KeySyncTask implements Runnable { mPlatformKeyManager.invalidatePlatformKey(mUserId, generation); return; } + if (isCustomLockScreen()) { + Log.w(TAG, "Unsupported credential type " + mCredentialType + "for user " + mUserId); + mRecoverableKeyStoreDb.invalidateKeysForUserIdOnCustomScreenLock(mUserId); + return; + } List<Integer> recoveryAgents = mRecoverableKeyStoreDb.getRecoveryAgents(mUserId); for (int uid : recoveryAgents) { @@ -158,6 +163,12 @@ public class KeySyncTask implements Runnable { } } + private boolean isCustomLockScreen() { + return mCredentialType != LockPatternUtils.CREDENTIAL_TYPE_NONE + && mCredentialType != LockPatternUtils.CREDENTIAL_TYPE_PATTERN + && mCredentialType != LockPatternUtils.CREDENTIAL_TYPE_PASSWORD; + } + private void syncKeysForAgent(int recoveryAgentUid) { boolean recreateCurrentVersion = false; if (!shoudCreateSnapshot(recoveryAgentUid)) { diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java index 89ddb6c9eb30..2676ee8897af 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java @@ -320,6 +320,20 @@ public class RecoverableKeyStoreDb { } /** + * Updates status of old keys to {@code RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE}. + */ + public void invalidateKeysForUserIdOnCustomScreenLock(int userId) { + SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put(KeysEntry.COLUMN_NAME_RECOVERY_STATUS, + RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE); + String selection = + KeysEntry.COLUMN_NAME_USER_ID + " = ?"; + db.update(KeysEntry.TABLE_NAME, values, selection, + new String[] {String.valueOf(userId)}); + } + + /** * Returns the generation ID associated with the platform key of the user with {@code userId}. */ public int getPlatformKeyGenerationId(int userId) { diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 141b47d6a028..e86253037b08 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -1203,15 +1203,21 @@ public class ZenModeHelper { final Bundle extras = new Bundle(); extras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME, mContext.getResources().getString(R.string.global_action_settings)); - return new Notification.Builder(mContext, SystemNotificationChannels.SYSTEM_CHANGES) + int title = R.string.zen_upgrade_notification_title; + int content = R.string.zen_upgrade_notification_content; + if (NotificationManager.Policy.areAllVisualEffectsSuppressed( + getNotificationPolicy().suppressedVisualEffects)) { + title = R.string.zen_upgrade_notification_visd_title; + content = R.string.zen_upgrade_notification_visd_content; + } + return new Notification.Builder(mContext, SystemNotificationChannels.DO_NOT_DISTURB) .setSmallIcon(R.drawable.ic_settings_24dp) - .setContentTitle(mContext.getResources().getString( - R.string.zen_upgrade_notification_title)) - .setContentText(mContext.getResources().getString( - R.string.zen_upgrade_notification_content)) + .setContentTitle(mContext.getResources().getString(title)) + .setContentText(mContext.getResources().getString(content)) .setAutoCancel(true) .setLocalOnly(true) .addExtras(extras) + .setStyle(new Notification.BigTextStyle()) .setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0, null)) .build(); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f0922b341a22..108247844c64 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -23847,6 +23847,15 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } @Override + public boolean canAccessComponent(int callingUid, ComponentName component, int userId) { + synchronized (mPackages) { + final PackageSetting ps = mSettings.mPackages.get(component.getPackageName()); + return !PackageManagerService.this.filterAppAccessLPr( + ps, callingUid, component, TYPE_UNKNOWN, userId); + } + } + + @Override public boolean hasInstantApplicationMetadata(String packageName, int userId) { synchronized (mPackages) { return mInstantAppRegistry.hasInstantApplicationMetadataLPr(packageName, userId); diff --git a/services/core/java/com/android/server/search/Searchables.java b/services/core/java/com/android/server/search/Searchables.java index 6bacdfdafbda..8af76a17f084 100644 --- a/services/core/java/com/android/server/search/Searchables.java +++ b/services/core/java/com/android/server/search/Searchables.java @@ -26,14 +26,18 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; +import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import com.android.server.LocalServices; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; @@ -119,7 +123,15 @@ public class Searchables { SearchableInfo result; synchronized (this) { result = mSearchablesMap.get(activity); - if (result != null) return result; + if (result != null) { + final PackageManagerInternal pm = + LocalServices.getService(PackageManagerInternal.class); + if (pm.canAccessComponent(Binder.getCallingUid(), result.getSearchActivity(), + UserHandle.getCallingUserId())) { + return result; + } + return null; + } } // Step 2. See if the current activity references a searchable. @@ -170,8 +182,16 @@ public class Searchables { result = mSearchablesMap.get(referredActivity); if (result != null) { mSearchablesMap.put(activity, result); + } + } + if (result != null) { + final PackageManagerInternal pm = + LocalServices.getService(PackageManagerInternal.class); + if (pm.canAccessComponent(Binder.getCallingUid(), result.getSearchActivity(), + UserHandle.getCallingUserId())) { return result; } + return null; } } @@ -410,7 +430,7 @@ public class Searchables { activities = mPm.queryIntentActivities(intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), - flags, mUserId).getList(); + flags | PackageManager.MATCH_INSTANT, mUserId).getList(); } catch (RemoteException re) { // Local call } @@ -421,36 +441,82 @@ public class Searchables { * Returns the list of searchable activities. */ public synchronized ArrayList<SearchableInfo> getSearchablesList() { - ArrayList<SearchableInfo> result = new ArrayList<SearchableInfo>(mSearchablesList); - return result; + return createFilterdSearchableInfoList(mSearchablesList); } /** * Returns a list of the searchable activities that can be included in global search. */ public synchronized ArrayList<SearchableInfo> getSearchablesInGlobalSearchList() { - return new ArrayList<SearchableInfo>(mSearchablesInGlobalSearchList); + return createFilterdSearchableInfoList(mSearchablesInGlobalSearchList); } /** * Returns a list of activities that handle the global search intent. */ public synchronized ArrayList<ResolveInfo> getGlobalSearchActivities() { - return new ArrayList<ResolveInfo>(mGlobalSearchActivities); + return createFilterdResolveInfoList(mGlobalSearchActivities); + } + + private ArrayList<SearchableInfo> createFilterdSearchableInfoList(List<SearchableInfo> list) { + if (list == null) { + return null; + } + final ArrayList<SearchableInfo> resultList = new ArrayList<>(list.size()); + final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getCallingUserId(); + for (SearchableInfo info : list) { + if (pm.canAccessComponent(callingUid, info.getSearchActivity(), callingUserId)) { + resultList.add(info); + } + } + return resultList; + } + + private ArrayList<ResolveInfo> createFilterdResolveInfoList(List<ResolveInfo> list) { + if (list == null) { + return null; + } + final ArrayList<ResolveInfo> resultList = new ArrayList<>(list.size()); + final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getCallingUserId(); + for (ResolveInfo info : list) { + if (pm.canAccessComponent( + callingUid, info.activityInfo.getComponentName(), callingUserId)) { + resultList.add(info); + } + } + return resultList; } /** * Gets the name of the global search activity. */ public synchronized ComponentName getGlobalSearchActivity() { - return mCurrentGlobalSearchActivity; + final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getCallingUserId(); + if (mCurrentGlobalSearchActivity != null + && pm.canAccessComponent(callingUid, mCurrentGlobalSearchActivity, callingUserId)) { + return mCurrentGlobalSearchActivity; + } + return null; } /** * Gets the name of the web search activity. */ public synchronized ComponentName getWebSearchActivity() { - return mWebSearchActivity; + final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getCallingUserId(); + if (mWebSearchActivity != null + && pm.canAccessComponent(callingUid, mWebSearchActivity, callingUserId)) { + return mWebSearchActivity; + } + return null; } void dump(FileDescriptor fd, PrintWriter pw, String[] args) { diff --git a/services/core/java/com/android/server/slice/PinnedSliceState.java b/services/core/java/com/android/server/slice/PinnedSliceState.java index f9a4ea211f07..4e7fb969f398 100644 --- a/services/core/java/com/android/server/slice/PinnedSliceState.java +++ b/services/core/java/com/android/server/slice/PinnedSliceState.java @@ -14,9 +14,6 @@ package com.android.server.slice; -import static android.app.slice.SliceManager.PERMISSION_GRANTED; - -import android.app.slice.Slice; import android.app.slice.SliceProvider; import android.app.slice.SliceSpec; import android.content.ContentProviderClient; @@ -33,7 +30,6 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -54,18 +50,24 @@ public class PinnedSliceState { private final ArraySet<String> mPinnedPkgs = new ArraySet<>(); @GuardedBy("mLock") private final ArrayMap<IBinder, ListenerInfo> mListeners = new ArrayMap<>(); + private final String mPkg; @GuardedBy("mLock") private SliceSpec[] mSupportedSpecs = null; private final DeathRecipient mDeathRecipient = this::handleRecheckListeners; private boolean mSlicePinned; - public PinnedSliceState(SliceManagerService service, Uri uri) { + public PinnedSliceState(SliceManagerService service, Uri uri, String pkg) { mService = service; mUri = uri; + mPkg = pkg; mLock = mService.getLock(); } + public String getPkg() { + return mPkg; + } + public SliceSpec[] getSpecs() { return mSupportedSpecs; } diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java index 51e4709aa7c7..a7dfd35acf1b 100644 --- a/services/core/java/com/android/server/slice/SliceManagerService.java +++ b/services/core/java/com/android/server/slice/SliceManagerService.java @@ -149,11 +149,25 @@ public class SliceManagerService extends ISliceManager.Stub { /// ----- ISliceManager stuff ----- @Override + public Uri[] getPinnedSlices(String pkg) { + verifyCaller(pkg); + ArrayList<Uri> ret = new ArrayList<>(); + synchronized (mLock) { + for (PinnedSliceState state : mPinnedSlicesByUri.values()) { + if (Objects.equals(pkg, state.getPkg())) { + ret.add(state.getUri()); + } + } + } + return ret.toArray(new Uri[ret.size()]); + } + + @Override public void pinSlice(String pkg, Uri uri, SliceSpec[] specs, IBinder token) throws RemoteException { verifyCaller(pkg); enforceAccess(pkg, uri); uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier()); - getOrCreatePinnedSlice(uri).pin(pkg, specs, token); + getOrCreatePinnedSlice(uri, pkg).pin(pkg, specs, token); } @Override @@ -302,11 +316,11 @@ public class SliceManagerService extends ISliceManager.Stub { } } - private PinnedSliceState getOrCreatePinnedSlice(Uri uri) { + private PinnedSliceState getOrCreatePinnedSlice(Uri uri, String pkg) { synchronized (mLock) { PinnedSliceState manager = mPinnedSlicesByUri.get(uri); if (manager == null) { - manager = createPinnedSlice(uri); + manager = createPinnedSlice(uri, pkg); mPinnedSlicesByUri.put(uri, manager); } return manager; @@ -314,8 +328,8 @@ public class SliceManagerService extends ISliceManager.Stub { } @VisibleForTesting - protected PinnedSliceState createPinnedSlice(Uri uri) { - return new PinnedSliceState(this, uri); + protected PinnedSliceState createPinnedSlice(Uri uri, String pkg) { + return new PinnedSliceState(this, uri, pkg); } public Object getLock() { diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 40ee55277302..fc5e33a7bc5a 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -52,6 +52,7 @@ import static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE import static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES; +import android.app.WindowConfiguration; import android.os.Debug; import android.os.Trace; import android.util.ArraySet; @@ -294,12 +295,14 @@ class WindowSurfacePlacer { // what will control the animation theme. If all closing windows are obscured, then there is // no need to do an animation. This is the case, for example, when this transition is being // done behind a dream window. + final ArraySet<Integer> activityTypes = collectActivityTypes(mService.mOpeningApps, + mService.mClosingApps); final AppWindowToken animLpToken = mService.mPolicy.allowAppAnimationsLw() - ? findAnimLayoutParamsToken(transit) + ? findAnimLayoutParamsToken(transit, activityTypes) : null; final LayoutParams animLp = getAnimLp(animLpToken); - overrideWithRemoteAnimationIfSet(animLpToken, transit); + overrideWithRemoteAnimationIfSet(animLpToken, transit, activityTypes); final boolean voiceInteraction = containsVoiceInteraction(mService.mOpeningApps) || containsVoiceInteraction(mService.mOpeningApps); @@ -361,13 +364,14 @@ class WindowSurfacePlacer { * Overrides the pending transition with the remote animation defined for the transition in the * set of defined remote animations in the app window token. */ - private void overrideWithRemoteAnimationIfSet(AppWindowToken animLpToken, int transit) { + private void overrideWithRemoteAnimationIfSet(AppWindowToken animLpToken, int transit, + ArraySet<Integer> activityTypes) { if (animLpToken == null) { return; } final RemoteAnimationDefinition definition = animLpToken.getRemoteAnimationDefinition(); if (definition != null) { - final RemoteAnimationAdapter adapter = definition.getAdapter(transit); + final RemoteAnimationAdapter adapter = definition.getAdapter(transit, activityTypes); if (adapter != null) { mService.mAppTransition.overridePendingAppTransitionRemote(adapter); } @@ -377,13 +381,14 @@ class WindowSurfacePlacer { /** * @return The window token that determines the animation theme. */ - private AppWindowToken findAnimLayoutParamsToken(@TransitionType int transit) { + private AppWindowToken findAnimLayoutParamsToken(@TransitionType int transit, + ArraySet<Integer> activityTypes) { AppWindowToken result; // Remote animations always win, but fullscreen tokens override non-fullscreen tokens. result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps, w -> w.getRemoteAnimationDefinition() != null - && w.getRemoteAnimationDefinition().hasTransition(transit)); + && w.getRemoteAnimationDefinition().hasTransition(transit, activityTypes)); if (result != null) { return result; } @@ -396,6 +401,22 @@ class WindowSurfacePlacer { w -> w.findMainWindow() != null); } + /** + * @return The set of {@link WindowConfiguration.ActivityType}s contained in the set of apps in + * {@code array1} and {@code array2}. + */ + private ArraySet<Integer> collectActivityTypes(ArraySet<AppWindowToken> array1, + ArraySet<AppWindowToken> array2) { + final ArraySet<Integer> result = new ArraySet<>(); + for (int i = array1.size() - 1; i >= 0; i--) { + result.add(array1.valueAt(i).getActivityType()); + } + for (int i = array2.size() - 1; i >= 0; i--) { + result.add(array2.valueAt(i).getActivityType()); + } + return result; + } + private AppWindowToken lookForHighestTokenWithFilter(ArraySet<AppWindowToken> array1, ArraySet<AppWindowToken> array2, Predicate<AppWindowToken> filter) { final int array1count = array1.size(); @@ -403,12 +424,9 @@ class WindowSurfacePlacer { int bestPrefixOrderIndex = Integer.MIN_VALUE; AppWindowToken bestToken = null; for (int i = 0; i < count; i++) { - final AppWindowToken wtoken; - if (i < array1count) { - wtoken = array1.valueAt(i); - } else { - wtoken = array2.valueAt(i - array1count); - } + final AppWindowToken wtoken = i < array1count + ? array1.valueAt(i) + : array2.valueAt(i - array1count); final int prefixOrderIndex = wtoken.getPrefixOrderIndex(); if (filter.test(wtoken) && prefixOrderIndex > bestPrefixOrderIndex) { bestPrefixOrderIndex = prefixOrderIndex; diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java index e40e3a42ee53..e9289e5cadf3 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java @@ -42,11 +42,13 @@ import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; import android.security.keystore.recovery.KeyDerivationParams; import android.security.keystore.recovery.KeyChainSnapshot; +import android.security.keystore.recovery.RecoveryController; import android.security.keystore.recovery.WrappedApplicationKey; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; +import android.util.Log; import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb; import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnapshotStorage; @@ -516,6 +518,34 @@ public class KeySyncTaskTest { recoverySnapshotAvailable(TEST_RECOVERY_AGENT_UID2); } + @Test + public void run_customLockScreen_RecoveryStatusFailure() throws Exception { + mKeySyncTask = new KeySyncTask( + mRecoverableKeyStoreDb, + mRecoverySnapshotStorage, + mSnapshotListenersStorage, + TEST_USER_ID, + /*credentialType=*/ 3, + "12345", + /*credentialUpdated=*/ false, + mPlatformKeyManager); + + addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS); + + int status = + mRecoverableKeyStoreDb + .getStatusForAllKeys(TEST_RECOVERY_AGENT_UID) + .get(TEST_APP_KEY_ALIAS); + assertEquals(RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS, status); + + mKeySyncTask.run(); + + status = mRecoverableKeyStoreDb + .getStatusForAllKeys(TEST_RECOVERY_AGENT_UID) + .get(TEST_APP_KEY_ALIAS); + assertEquals(RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE, status); + } + private SecretKey addApplicationKey(int userId, int recoveryAgentUid, String alias) throws Exception{ SecretKey applicationKey = generateKey(); diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java index dfb2dbf884f0..8b01d972f7e5 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java @@ -342,6 +342,30 @@ public class RecoverableKeyStoreDbTest { } @Test + public void testInvalidateKeysForUserIdOnCustomScreenLock() { + int userId = 12; + int uid = 1009; + int generationId = 6; + int status = 120; + int status2 = 121; + String alias = "test"; + byte[] nonce = getUtf8Bytes("nonce"); + byte[] keyMaterial = getUtf8Bytes("keymaterial"); + WrappedKey wrappedKey = new WrappedKey(nonce, keyMaterial, generationId, status); + mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey); + + WrappedKey retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias); + assertThat(retrievedKey.getRecoveryStatus()).isEqualTo(status); + + mRecoverableKeyStoreDb.setRecoveryStatus(uid, alias, status2); + mRecoverableKeyStoreDb.invalidateKeysForUserIdOnCustomScreenLock(userId); + + retrievedKey = mRecoverableKeyStoreDb.getKey(uid, alias); + assertThat(retrievedKey.getRecoveryStatus()) + .isEqualTo(RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE); + } + + @Test public void setRecoveryServicePublicKey_replaceOldKey() throws Exception { int userId = 12; int uid = 10009; diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java index 1052e8f377a7..3c4e333b6be9 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java @@ -1,7 +1,5 @@ package com.android.server.slice; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; - import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -12,23 +10,18 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.slice.ISliceListener; -import android.app.slice.Slice; import android.app.slice.SliceProvider; import android.app.slice.SliceSpec; import android.content.ContentProvider; -import android.content.Context; import android.content.IContentProvider; import android.net.Uri; import android.os.Binder; -import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.IBinder.DeathRecipient; @@ -83,7 +76,7 @@ public class PinnedSliceStateTest extends UiServiceTestCase { mIContentProvider = mock(IContentProvider.class); when(mContentProvider.getIContentProvider()).thenReturn(mIContentProvider); mContext.getContentResolver().addProvider(AUTH, mContentProvider); - mPinnedSliceManager = new PinnedSliceState(mSliceService, TEST_URI); + mPinnedSliceManager = new PinnedSliceState(mSliceService, TEST_URI, "pkg"); } @Test @@ -164,4 +157,4 @@ public class PinnedSliceStateTest extends UiServiceTestCase { verify(mSliceService).removePinnedSlice(eq(TEST_URI)); assertFalse(mPinnedSliceManager.hasPinOrListener()); } -}
\ No newline at end of file +} diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java index 6fc300959144..4f446a9afb98 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java @@ -18,6 +18,7 @@ import static android.content.ContentProvider.maybeAddUserId; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -28,7 +29,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; -import android.app.slice.ISliceListener; import android.app.slice.SliceSpec; import android.content.pm.PackageManagerInternal; import android.net.Uri; @@ -71,7 +71,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase { mService = spy(new SliceManagerService(mContext, TestableLooper.get(this).getLooper())); mCreatedSliceState = mock(PinnedSliceState.class); - doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI)); + doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI), anyString()); } @After @@ -85,7 +85,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase { mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); - verify(mService, times(1)).createPinnedSlice(eq(TEST_URI)); + verify(mService, times(1)).createPinnedSlice(eq(TEST_URI), eq("pkg")); } @Test diff --git a/telephony/java/android/telephony/AccessNetworkUtils.java b/telephony/java/android/telephony/AccessNetworkUtils.java new file mode 100644 index 000000000000..5d2c225f28ec --- /dev/null +++ b/telephony/java/android/telephony/AccessNetworkUtils.java @@ -0,0 +1,167 @@ +package android.telephony; + +import static android.telephony.ServiceState.DUPLEX_MODE_FDD; +import static android.telephony.ServiceState.DUPLEX_MODE_TDD; +import static android.telephony.ServiceState.DUPLEX_MODE_UNKNOWN; + +import android.telephony.AccessNetworkConstants.EutranBand; +import android.telephony.ServiceState.DuplexMode; + + +/** + * Utilities to map between radio constants. + * + * @hide + */ +public class AccessNetworkUtils { + + // do not instantiate + private AccessNetworkUtils() {} + + public static final int INVALID_BAND = -1; + + /** + * Gets the duplex mode for the given EUTRAN operating band. + * + * <p>See 3GPP 36.101 sec 5.5-1 for calculation + * + * @param band The EUTRAN band number + * @return The duplex mode of the given EUTRAN band + */ + @DuplexMode + public static int getDuplexModeForEutranBand(int band) { + if (band == INVALID_BAND) { + return DUPLEX_MODE_UNKNOWN; + } + + if (band >= EutranBand.BAND_68) { + return DUPLEX_MODE_UNKNOWN; + } else if (band >= EutranBand.BAND_65) { + return DUPLEX_MODE_FDD; + } else if (band >= EutranBand.BAND_47) { + return DUPLEX_MODE_UNKNOWN; + } else if (band >= EutranBand.BAND_33) { + return DUPLEX_MODE_TDD; + } else if (band >= EutranBand.BAND_1) { + return DUPLEX_MODE_FDD; + } + + return DUPLEX_MODE_UNKNOWN; + } + + /** + * Gets the EUTRAN Operating band for a given downlink EARFCN. + * + * <p>See 3GPP 36.101 sec 5.7.3-1 for calculation. + * + * @param earfcn The downlink EARFCN + * @return Operating band number, or {@link #INVALID_BAND} if no corresponding band exists + */ + public static int getOperatingBandForEarfcn(int earfcn) { + if (earfcn > 67535) { + return INVALID_BAND; + } else if (earfcn >= 67366) { + return INVALID_BAND; // band 67 only for CarrierAgg + } else if (earfcn >= 66436) { + return EutranBand.BAND_66; + } else if (earfcn >= 65536) { + return EutranBand.BAND_65; + } else if (earfcn > 54339) { + return INVALID_BAND; + } else if (earfcn >= 46790 /* inferred from the end range of BAND_45 */) { + return EutranBand.BAND_46; + } else if (earfcn >= 46590) { + return EutranBand.BAND_45; + } else if (earfcn >= 45590) { + return EutranBand.BAND_44; + } else if (earfcn >= 43590) { + return EutranBand.BAND_43; + } else if (earfcn >= 41590) { + return EutranBand.BAND_42; + } else if (earfcn >= 39650) { + return EutranBand.BAND_41; + } else if (earfcn >= 38650) { + return EutranBand.BAND_40; + } else if (earfcn >= 38250) { + return EutranBand.BAND_39; + } else if (earfcn >= 37750) { + return EutranBand.BAND_38; + } else if (earfcn >= 37550) { + return EutranBand.BAND_37; + } else if (earfcn >= 36950) { + return EutranBand.BAND_36; + } else if (earfcn >= 36350) { + return EutranBand.BAND_35; + } else if (earfcn >= 36200) { + return EutranBand.BAND_34; + } else if (earfcn >= 36000) { + return EutranBand.BAND_33; + } else if (earfcn > 10359) { + return INVALID_BAND; + } else if (earfcn >= 9920) { + return INVALID_BAND; // band 32 only for CarrierAgg + } else if (earfcn >= 9870) { + return EutranBand.BAND_31; + } else if (earfcn >= 9770) { + return EutranBand.BAND_30; + } else if (earfcn >= 9660) { + return INVALID_BAND; // band 29 only for CarrierAgg + } else if (earfcn >= 9210) { + return EutranBand.BAND_28; + } else if (earfcn >= 9040) { + return EutranBand.BAND_27; + } else if (earfcn >= 8690) { + return EutranBand.BAND_26; + } else if (earfcn >= 8040) { + return EutranBand.BAND_25; + } else if (earfcn >= 7700) { + return EutranBand.BAND_24; + } else if (earfcn >= 7500) { + return EutranBand.BAND_23; + } else if (earfcn >= 6600) { + return EutranBand.BAND_22; + } else if (earfcn >= 6450) { + return EutranBand.BAND_21; + } else if (earfcn >= 6150) { + return EutranBand.BAND_20; + } else if (earfcn >= 6000) { + return EutranBand.BAND_19; + } else if (earfcn >= 5850) { + return EutranBand.BAND_18; + } else if (earfcn >= 5730) { + return EutranBand.BAND_17; + } else if (earfcn > 5379) { + return INVALID_BAND; + } else if (earfcn >= 5280) { + return EutranBand.BAND_14; + } else if (earfcn >= 5180) { + return EutranBand.BAND_13; + } else if (earfcn >= 5010) { + return EutranBand.BAND_12; + } else if (earfcn >= 4750) { + return EutranBand.BAND_11; + } else if (earfcn >= 4150) { + return EutranBand.BAND_10; + } else if (earfcn >= 3800) { + return EutranBand.BAND_9; + } else if (earfcn >= 3450) { + return EutranBand.BAND_8; + } else if (earfcn >= 2750) { + return EutranBand.BAND_7; + } else if (earfcn >= 2650) { + return EutranBand.BAND_6; + } else if (earfcn >= 2400) { + return EutranBand.BAND_5; + } else if (earfcn >= 1950) { + return EutranBand.BAND_4; + } else if (earfcn >= 1200) { + return EutranBand.BAND_3; + } else if (earfcn >= 600) { + return EutranBand.BAND_2; + } else if (earfcn >= 0) { + return EutranBand.BAND_1; + } + + return INVALID_BAND; + } +} diff --git a/telephony/java/android/telephony/CellIdentity.java b/telephony/java/android/telephony/CellIdentity.java index e092d52d91bc..08f8bb6494a0 100644 --- a/telephony/java/android/telephony/CellIdentity.java +++ b/telephony/java/android/telephony/CellIdentity.java @@ -68,6 +68,9 @@ public abstract class CellIdentity implements Parcelable { */ public static final int TYPE_TDSCDMA = 5; + /** @hide */ + public static final int INVALID_CHANNEL_NUMBER = -1; + // Log tag /** @hide */ protected final String mTag; @@ -125,6 +128,16 @@ public abstract class CellIdentity implements Parcelable { public @Type int getType() { return mType; } /** + * Returns the channel number of the cell identity. + * + * @hide + * @return The channel number, or {@link #INVALID_CHANNEL_NUMBER} if not implemented + */ + public int getChannelNumber() { + return INVALID_CHANNEL_NUMBER; + } + + /** * Used by child classes for parceling. * * @hide diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java index d35eb60916f3..52944a8ac261 100644 --- a/telephony/java/android/telephony/CellIdentityGsm.java +++ b/telephony/java/android/telephony/CellIdentityGsm.java @@ -203,6 +203,11 @@ public final class CellIdentityGsm extends CellIdentity { return mAlphaShort; } + /** @hide */ + @Override + public int getChannelNumber() { + return mArfcn; + } /** * @deprecated Primary Scrambling Code is not applicable to GSM. diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java index 2b8eb5f3cca6..37fb07521b0e 100644 --- a/telephony/java/android/telephony/CellIdentityLte.java +++ b/telephony/java/android/telephony/CellIdentityLte.java @@ -213,6 +213,12 @@ public final class CellIdentityLte extends CellIdentity { return mAlphaShort; } + /** @hide */ + @Override + public int getChannelNumber() { + return mEarfcn; + } + @Override public int hashCode() { return Objects.hash(mMccStr, mMncStr, mCi, mPci, mTac, mAlphaLong, mAlphaShort); diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java index a5fd7dd97941..affa0c15862d 100644 --- a/telephony/java/android/telephony/CellIdentityWcdma.java +++ b/telephony/java/android/telephony/CellIdentityWcdma.java @@ -206,6 +206,12 @@ public final class CellIdentityWcdma extends CellIdentity { return mUarfcn; } + /** @hide */ + @Override + public int getChannelNumber() { + return mUarfcn; + } + @Override public boolean equals(Object other) { if (this == other) { diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 82a7450945f7..a9c1cf6c7bc3 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -471,9 +471,13 @@ public class ServiceState implements Parcelable { */ @DuplexMode public int getDuplexMode() { - // TODO(b/72117602) determine duplex mode from channel number, using 3GPP 36.101 sections - // 5.7.3-1 and 5.5-1 - return DUPLEX_MODE_UNKNOWN; + // only support LTE duplex mode + if (!isLte(mRilDataRadioTechnology)) { + return DUPLEX_MODE_UNKNOWN; + } + + int band = AccessNetworkUtils.getOperatingBandForEarfcn(mChannelNumber); + return AccessNetworkUtils.getDuplexModeForEutranBand(band); } /** @@ -891,6 +895,7 @@ public class ServiceState implements Parcelable { .append(", mDataRegState=").append(mDataRegState) .append("(" + rilServiceStateToString(mDataRegState) + ")") .append(", mChannelNumber=").append(mChannelNumber) + .append(", duplexMode()=").append(getDuplexMode()) .append(", mCellBandwidths=").append(Arrays.toString(mCellBandwidths)) .append(", mVoiceRoamingType=").append(getRoamingLogString(mVoiceRoamingType)) .append(", mDataRoamingType=").append(getRoamingLogString(mDataRoamingType)) diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index a3a30807986e..ee7084ad86c0 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -25,6 +25,7 @@ package com.android.internal.telephony; */ import android.os.SystemProperties; +import android.telephony.TelephonyManager; /** * {@hide} @@ -162,8 +163,8 @@ public interface RILConstants { int NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = 20; /* TD-SCDMA, GSM/WCDMA and LTE */ int NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 21; /*TD-SCDMA,EvDo,CDMA,GSM/WCDMA*/ int NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 22; /* TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo */ - int PREFERRED_NETWORK_MODE = SystemProperties.getInt("ro.telephony.default_network", - NETWORK_MODE_WCDMA_PREF); + int PREFERRED_NETWORK_MODE = Integer.parseInt(TelephonyManager.getTelephonyProperty(0, + "ro.telephony.default_network", Integer.toString(NETWORK_MODE_WCDMA_PREF))); int BAND_MODE_UNSPECIFIED = 0; //"unspecified" (selected by baseband automatically) int BAND_MODE_EURO = 1; //"EURO band" (GSM-900 / DCS-1800 / WCDMA-IMT-2000) |