diff --git a/ADPF_OWNERS b/ADPF_OWNERS index bcdc33825a13fbf42ce72eb18f12413ddacebed9..c7ff4640b18569f18e6a83a645168682135dc6d4 100644 --- a/ADPF_OWNERS +++ b/ADPF_OWNERS @@ -1,4 +1,5 @@ -sumir@google.com +adyabr@google.com chingtangyu@google.com -xwxw@google.com mattbuckley@google.com +sumir@google.com +xwxw@google.com \ No newline at end of file diff --git a/AconfigFlags.bp b/AconfigFlags.bp index 8b95679f318f5d5f5d5fc814647f878f0442a146..8bfac03060b5495a94b14bbfc2eb5d2ab8f2246b 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -610,6 +610,13 @@ cc_aconfig_library { vendor_available: true, } +java_aconfig_library { + name: "android.os.vibrator.flags-aconfig-java-host", + aconfig_declarations: "android.os.vibrator.flags-aconfig", + host_supported: true, + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + // View aconfig_declarations { name: "android.view.flags-aconfig", diff --git a/cmds/idmap2/Android.bp b/cmds/idmap2/Android.bp index d9ff19051de9fbe70ef6de239b3d53e3dac73490..f6bee52661da01f6ecf6cc9129c6505fe6e03230 100644 --- a/cmds/idmap2/Android.bp +++ b/cmds/idmap2/Android.bp @@ -348,6 +348,7 @@ filegroup { "idmap2d/aidl/core/android/os/FabricatedOverlayInternal.aidl", "idmap2d/aidl/core/android/os/FabricatedOverlayInternalEntry.aidl", "idmap2d/aidl/core/android/os/FabricatedOverlayInfo.aidl", + "idmap2d/aidl/core/android/os/OverlayConstraint.aidl", ], path: "idmap2d/aidl/core/", } diff --git a/cmds/idmap2/idmap2/Create.cpp b/cmds/idmap2/idmap2/Create.cpp index d5f1b895facf2a360c07f81b9b56841469a71e7f..d94940131c8b3646e08d06f3334c3dc134a6a389 100644 --- a/cmds/idmap2/idmap2/Create.cpp +++ b/cmds/idmap2/idmap2/Create.cpp @@ -35,6 +35,7 @@ using android::idmap2::BinaryStreamVisitor; using android::idmap2::CommandLineOptions; using android::idmap2::Error; using android::idmap2::Idmap; +using android::idmap2::IdmapConstraints; using android::idmap2::OverlayResourceContainer; using android::idmap2::Result; using android::idmap2::TargetResourceContainer; @@ -104,8 +105,10 @@ Result Create(const std::vector& args) { return Error("failed to load apk overlay '%s'", overlay_apk_path.c_str()); } + // TODO(b/371801644): Add command-line support for RRO constraints. + auto constraints = std::make_unique(); const auto idmap = Idmap::FromContainers(**target, **overlay, overlay_name, fulfilled_policies, - !ignore_overlayable); + !ignore_overlayable, std::move(constraints)); if (!idmap) { return Error(idmap.GetError(), "failed to create idmap"); } diff --git a/cmds/idmap2/idmap2/CreateMultiple.cpp b/cmds/idmap2/idmap2/CreateMultiple.cpp index 2608c69be66f8fedb81380683a297f03954b7995..70a2ed1940b28315f80da7142ebfc986b2b843bb 100644 --- a/cmds/idmap2/idmap2/CreateMultiple.cpp +++ b/cmds/idmap2/idmap2/CreateMultiple.cpp @@ -39,6 +39,7 @@ using android::idmap2::BinaryStreamVisitor; using android::idmap2::CommandLineOptions; using android::idmap2::Error; using android::idmap2::Idmap; +using android::idmap2::IdmapConstraints; using android::idmap2::OverlayResourceContainer; using android::idmap2::Result; using android::idmap2::TargetResourceContainer; @@ -115,8 +116,11 @@ Result CreateMultiple(const std::vector& args) { continue; } + // TODO(b/371801644): Add command-line support for RRO constraints. + auto constraints = std::make_unique(); const auto idmap = - Idmap::FromContainers(**target, **overlay, "", fulfilled_policies, !ignore_overlayable); + Idmap::FromContainers(**target, **overlay, "", fulfilled_policies, !ignore_overlayable, + std::move(constraints)); if (!idmap) { LOG(WARNING) << "failed to create idmap"; continue; diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp index 6902d6db6751b6d79a6b4764b7c924b3979bb205..2495c55cc06562e3ca1c0c3002ab0b3c1473965a 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.cpp +++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp @@ -46,6 +46,8 @@ using android::binder::Status; using android::idmap2::BinaryStreamVisitor; using android::idmap2::FabricatedOverlayContainer; using android::idmap2::Idmap; +using android::idmap2::IdmapConstraint; +using android::idmap2::IdmapConstraints; using android::idmap2::IdmapHeader; using android::idmap2::OverlayResourceContainer; using android::idmap2::PrettyPrintVisitor; @@ -74,6 +76,18 @@ PolicyBitmask ConvertAidlArgToPolicyBitmask(int32_t arg) { return static_cast(arg); } +std::unique_ptr ConvertAidlConstraintsToIdmapConstraints( + const std::vector& constraints) { + auto idmapConstraints = std::make_unique(); + for (const auto& constraint : constraints) { + IdmapConstraint idmapConstraint{}; + idmapConstraint.constraint_type = constraint.type; + idmapConstraint.constraint_value = constraint.value; + idmapConstraints->constraints.insert(idmapConstraint); + } + return idmapConstraints; +} + } // namespace namespace android::os { @@ -113,6 +127,7 @@ Status Idmap2Service::removeIdmap(const std::string& overlay_path, int32_t user_ Status Idmap2Service::verifyIdmap(const std::string& target_path, const std::string& overlay_path, const std::string& overlay_name, int32_t fulfilled_policies, bool enforce_overlayable, int32_t user_id ATTRIBUTE_UNUSED, + const std::vector& constraints, bool* _aidl_return) { SYSTRACE << "Idmap2Service::verifyIdmap " << overlay_path; assert(_aidl_return); @@ -120,12 +135,19 @@ Status Idmap2Service::verifyIdmap(const std::string& target_path, const std::str const std::string idmap_path = Idmap::CanonicalIdmapPathFor(kIdmapCacheDir, overlay_path); std::ifstream fin(idmap_path); const std::unique_ptr header = IdmapHeader::FromBinaryStream(fin); + const std::unique_ptr oldConstraints = + IdmapConstraints::FromBinaryStream(fin); fin.close(); if (!header) { *_aidl_return = false; LOG(WARNING) << "failed to parse idmap header of '" << idmap_path << "'"; return ok(); } + if (!oldConstraints) { + *_aidl_return = false; + LOG(WARNING) << "failed to parse idmap constraints of '" << idmap_path << "'"; + return ok(); + } const auto target = GetTargetContainer(target_path); if (!target) { @@ -145,7 +167,10 @@ Status Idmap2Service::verifyIdmap(const std::string& target_path, const std::str header->IsUpToDate(*GetPointer(*target), **overlay, overlay_name, ConvertAidlArgToPolicyBitmask(fulfilled_policies), enforce_overlayable); - *_aidl_return = static_cast(up_to_date); + std::unique_ptr newConstraints = + ConvertAidlConstraintsToIdmapConstraints(constraints); + + *_aidl_return = static_cast(up_to_date && (*oldConstraints == *newConstraints)); if (!up_to_date) { LOG(WARNING) << "idmap '" << idmap_path << "' not up to date : " << up_to_date.GetErrorMessage(); @@ -156,6 +181,7 @@ Status Idmap2Service::verifyIdmap(const std::string& target_path, const std::str Status Idmap2Service::createIdmap(const std::string& target_path, const std::string& overlay_path, const std::string& overlay_name, int32_t fulfilled_policies, bool enforce_overlayable, int32_t user_id ATTRIBUTE_UNUSED, + const std::vector& constraints, std::optional* _aidl_return) { assert(_aidl_return); SYSTRACE << "Idmap2Service::createIdmap " << target_path << " " << overlay_path; @@ -186,8 +212,11 @@ Status Idmap2Service::createIdmap(const std::string& target_path, const std::str return error("failed to load apk overlay '%s'" + overlay_path); } + std::unique_ptr idmapConstraints = + ConvertAidlConstraintsToIdmapConstraints(constraints); const auto idmap = Idmap::FromContainers(*GetPointer(*target), **overlay, overlay_name, - policy_bitmask, enforce_overlayable); + policy_bitmask, enforce_overlayable, + std::move(idmapConstraints)); if (!idmap) { return error(idmap.GetErrorMessage()); } diff --git a/cmds/idmap2/idmap2d/Idmap2Service.h b/cmds/idmap2/idmap2d/Idmap2Service.h index 272ec6be3bacb9f0f6a104ab77dc4674b2a3b6a3..344a77f5581fc8be9f5a36d4a3abe5b4c1eed2c0 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.h +++ b/cmds/idmap2/idmap2d/Idmap2Service.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -49,11 +50,13 @@ class Idmap2Service : public BinderService, public BnIdmap2 { binder::Status verifyIdmap(const std::string& target_path, const std::string& overlay_path, const std::string& overlay_name, int32_t fulfilled_policies, bool enforce_overlayable, int32_t user_id, + const std::vector& constraints, bool* _aidl_return) override; binder::Status createIdmap(const std::string& target_path, const std::string& overlay_path, const std::string& overlay_name, int32_t fulfilled_policies, bool enforce_overlayable, int32_t user_id, + const std::vector& constraints, std::optional* _aidl_return) override; binder::Status createFabricatedOverlay( diff --git a/cmds/idmap2/idmap2d/aidl/core/android/os/OverlayConstraint.aidl b/cmds/idmap2/idmap2d/aidl/core/android/os/OverlayConstraint.aidl new file mode 100644 index 0000000000000000000000000000000000000000..8fce3d6567ab904bc178ca716b9d24939719947a --- /dev/null +++ b/cmds/idmap2/idmap2d/aidl/core/android/os/OverlayConstraint.aidl @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +/** + * @hide + */ +parcelable OverlayConstraint { + int type; + int value; +} \ No newline at end of file diff --git a/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl b/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl index 2bbfba97a6c6818c28c3a681705156954e5fa9b8..4f4f075a0e631efd82b9fa59c752d50f44b52825 100644 --- a/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl +++ b/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl @@ -18,6 +18,7 @@ package android.os; import android.os.FabricatedOverlayInfo; import android.os.FabricatedOverlayInternal; +import android.os.OverlayConstraint; /** * @hide @@ -30,13 +31,15 @@ interface IIdmap2 { @utf8InCpp String overlayName, int fulfilledPolicies, boolean enforceOverlayable, - int userId); + int userId, + in OverlayConstraint[] constraints); @nullable @utf8InCpp String createIdmap(@utf8InCpp String targetApkPath, @utf8InCpp String overlayApkPath, @utf8InCpp String overlayName, int fulfilledPolicies, boolean enforceOverlayable, - int userId); + int userId, + in OverlayConstraint[] constraints); @nullable FabricatedOverlayInfo createFabricatedOverlay(in FabricatedOverlayInternal overlay); boolean deleteFabricatedOverlay(@utf8InCpp String path); diff --git a/cmds/idmap2/include/idmap2/BinaryStreamVisitor.h b/cmds/idmap2/include/idmap2/BinaryStreamVisitor.h index 57af1b61c3002b88e1d65020c9844dd827a401a4..3009293bc4ab5ff3b601968585279e639907dc11 100644 --- a/cmds/idmap2/include/idmap2/BinaryStreamVisitor.h +++ b/cmds/idmap2/include/idmap2/BinaryStreamVisitor.h @@ -32,6 +32,7 @@ class BinaryStreamVisitor : public Visitor { ~BinaryStreamVisitor() override = default; void visit(const Idmap& idmap) override; void visit(const IdmapHeader& header) override; + void visit(const IdmapConstraints& constraints) override; void visit(const IdmapData& data) override; void visit(const IdmapData::Header& header) override; diff --git a/cmds/idmap2/include/idmap2/Idmap.h b/cmds/idmap2/include/idmap2/Idmap.h index b0ba01957ab6dfac7176fda7243f4874c5e73102..335dc97bf964edc1bba7c315965bb1946e992a17 100644 --- a/cmds/idmap2/include/idmap2/Idmap.h +++ b/cmds/idmap2/include/idmap2/Idmap.h @@ -17,10 +17,11 @@ /* * # idmap file format (current version) * - * idmap := header data* + * idmap := header constraints_count constraint* data* * header := magic version target_crc overlay_crc fulfilled_policies * enforce_overlayable target_path overlay_path overlay_name * debug_info + * constraints := constraint_type constraint_value * data := data_header target_entries target_inline_entries target_inline_entry_value* config* overlay_entries string_pool * data_header := target_entry_count target_inline_entry_count @@ -67,6 +68,9 @@ * value_type := * value_data := * version := + * constraints_count := + * constraint_type := + * constraint_value := */ #ifndef IDMAP2_INCLUDE_IDMAP2_IDMAP_H_ @@ -76,6 +80,7 @@ #include #include #include +#include #include #include "android-base/macros.h" @@ -171,6 +176,33 @@ class IdmapHeader { friend Idmap; DISALLOW_COPY_AND_ASSIGN(IdmapHeader); }; + +struct IdmapConstraint { + // Constraint type can be android::kOverlayConstraintTypeDisplayId or + // android::kOverlayConstraintTypeDeviceId + uint32_t constraint_type; + uint32_t constraint_value; + + bool operator==(const IdmapConstraint&) const = default; +}; + +struct IdmapConstraints { + static std::unique_ptr FromBinaryStream(std::istream& stream); + + struct Hash { + static std::size_t operator()(const IdmapConstraint& constraint) { + return std::hash()(constraint.constraint_type) * 31 + + std::hash()(constraint.constraint_value); + } + }; + + bool operator == (const IdmapConstraints& constraints) const = default; + + void accept(Visitor* v) const; + + std::unordered_set constraints; +}; + class IdmapData { public: class Header { @@ -286,12 +318,16 @@ class Idmap { static Result> FromContainers( const TargetResourceContainer& target, const OverlayResourceContainer& overlay, const std::string& overlay_name, const PolicyBitmask& fulfilled_policies, - bool enforce_overlayable); + bool enforce_overlayable, std::unique_ptr&& constraints); const std::unique_ptr& GetHeader() const { return header_; } + const std::unique_ptr& GetConstraints() const { + return constraints_; + } + const std::vector>& GetData() const { return data_; } @@ -302,6 +338,7 @@ class Idmap { Idmap() = default; std::unique_ptr header_; + std::unique_ptr constraints_; std::vector> data_; DISALLOW_COPY_AND_ASSIGN(Idmap); @@ -312,6 +349,7 @@ class Visitor { virtual ~Visitor() = default; virtual void visit(const Idmap& idmap) = 0; virtual void visit(const IdmapHeader& header) = 0; + virtual void visit(const IdmapConstraints& constraints) = 0; virtual void visit(const IdmapData& data) = 0; virtual void visit(const IdmapData::Header& header) = 0; }; diff --git a/cmds/idmap2/include/idmap2/PrettyPrintVisitor.h b/cmds/idmap2/include/idmap2/PrettyPrintVisitor.h index ed18d9cbf20f0a16baf9b9d78a8352f5a128f261..033ef85f513334b2be8784ad4216907aa7d0f0ab 100644 --- a/cmds/idmap2/include/idmap2/PrettyPrintVisitor.h +++ b/cmds/idmap2/include/idmap2/PrettyPrintVisitor.h @@ -36,6 +36,7 @@ class PrettyPrintVisitor : public Visitor { ~PrettyPrintVisitor() override = default; void visit(const Idmap& idmap) override; void visit(const IdmapHeader& header) override; + void visit(const IdmapConstraints& constraints) override; void visit(const IdmapData& data) override; void visit(const IdmapData::Header& header) override; diff --git a/cmds/idmap2/include/idmap2/RawPrintVisitor.h b/cmds/idmap2/include/idmap2/RawPrintVisitor.h index 849ba11aacffb5d149f32f5f4b1cb721e889d01a..bd27c0d62c0d0951abcd2c5dded994467eed5e01 100644 --- a/cmds/idmap2/include/idmap2/RawPrintVisitor.h +++ b/cmds/idmap2/include/idmap2/RawPrintVisitor.h @@ -37,6 +37,7 @@ class RawPrintVisitor : public Visitor { ~RawPrintVisitor() override = default; void visit(const Idmap& idmap) override; void visit(const IdmapHeader& header) override; + void visit(const IdmapConstraints& constraints) override; void visit(const IdmapData& data) override; void visit(const IdmapData::Header& header) override; diff --git a/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp b/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp index 00ef0c7f8cf0a6a9a7561bfe34eedd65c655b525..b029aea1a1bff9f49bfa150de58756926ff45fdd 100644 --- a/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp +++ b/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp @@ -63,6 +63,14 @@ void BinaryStreamVisitor::visit(const IdmapHeader& header) { WriteString(header.GetDebugInfo()); } +void BinaryStreamVisitor::visit(const IdmapConstraints& constraints) { + Write32(static_cast(constraints.constraints.size())); + for (const auto& constraint : constraints.constraints) { + Write32(constraint.constraint_type); + Write32(constraint.constraint_value); + } +} + void BinaryStreamVisitor::visit(const IdmapData& data) { for (const auto& target_entry : data.GetTargetEntries()) { Write32(target_entry.target_id); diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp index 7680109f1d541497435f68cbcaa6443709f7436e..556ca228e83d9e7efe1bb997fcdfeed75ac0d76b 100644 --- a/cmds/idmap2/libidmap2/Idmap.cpp +++ b/cmds/idmap2/libidmap2/Idmap.cpp @@ -182,6 +182,26 @@ Result IdmapHeader::IsUpToDate(const std::string& target_path, return Unit{}; } +std::unique_ptr IdmapConstraints::FromBinaryStream(std::istream& stream) { + auto idmap_constraints = std::make_unique(); + uint32_t count = 0; + if (!Read32(stream, &count)) { + return nullptr; + } + for (size_t i = 0; i < count; i++) { + IdmapConstraint constraint{}; + if (!Read32(stream, &constraint.constraint_type)) { + return nullptr; + } + if (!Read32(stream, &constraint.constraint_value)) { + return nullptr; + } + idmap_constraints->constraints.insert(constraint); + } + + return idmap_constraints; +} + std::unique_ptr IdmapData::Header::FromBinaryStream(std::istream& stream) { std::unique_ptr idmap_data_header(new IdmapData::Header()); if (!Read32(stream, &idmap_data_header->target_entry_count) || @@ -315,6 +335,10 @@ Result> Idmap::FromBinaryStream(std::istream& strea if (!idmap->header_) { return Error("failed to parse idmap header"); } + idmap->constraints_ = IdmapConstraints::FromBinaryStream(stream); + if (!idmap->constraints_) { + return Error("failed to parse idmap constraints"); + } // idmap version 0x01 does not specify the number of data blocks that follow // the idmap header; assume exactly one data block @@ -374,10 +398,9 @@ Result> IdmapData::FromResourceMapping( } Result> Idmap::FromContainers(const TargetResourceContainer& target, - const OverlayResourceContainer& overlay, - const std::string& overlay_name, - const PolicyBitmask& fulfilled_policies, - bool enforce_overlayable) { + const OverlayResourceContainer& overlay, const std::string& overlay_name, + const PolicyBitmask& fulfilled_policies, bool enforce_overlayable, + std::unique_ptr&& constraints) { SYSTRACE << "Idmap::FromApkAssets"; std::unique_ptr header(new IdmapHeader()); header->magic_ = kIdmapMagic; @@ -424,6 +447,11 @@ Result> Idmap::FromContainers(const TargetResourceC header->debug_info_ = log_info.GetString(); idmap->header_ = std::move(header); idmap->data_.push_back(std::move(*idmap_data)); + if (constraints == nullptr) { + idmap->constraints_ = std::make_unique(); + } else { + idmap->constraints_ = std::move(constraints); + } return {std::move(idmap)}; } @@ -433,6 +461,11 @@ void IdmapHeader::accept(Visitor* v) const { v->visit(*this); } +void IdmapConstraints::accept(Visitor* v) const { + assert(v != nullptr); + v->visit(*this); +} + void IdmapData::Header::accept(Visitor* v) const { assert(v != nullptr); v->visit(*this); @@ -447,6 +480,7 @@ void IdmapData::accept(Visitor* v) const { void Idmap::accept(Visitor* v) const { assert(v != nullptr); header_->accept(v); + constraints_->accept(v); v->visit(*this); auto end = data_.cend(); for (auto iter = data_.cbegin(); iter != end; ++iter) { diff --git a/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp b/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp index eb9458268dad63ba8be50c3b87e7c29bb1e9c59a..0ec31f4f63f6e7f0495f7f50f8dd610e354cff26 100644 --- a/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/PrettyPrintVisitor.cpp @@ -58,6 +58,19 @@ void PrettyPrintVisitor::visit(const IdmapHeader& header) { if (auto overlay = OverlayResourceContainer::FromPath(header.GetOverlayPath())) { overlay_ = std::move(*overlay); } +} + +void PrettyPrintVisitor::visit(const IdmapConstraints& constraints) { + stream_ << "Constraints:" << '\n'; + if (constraints.constraints.empty()) { + stream_ << TAB << "None\n"; + } else { + for (const IdmapConstraint& constraint : constraints.constraints) { + stream_ << TAB + << base::StringPrintf("Type: %d, Value: %d\n", constraint.constraint_type, + constraint.constraint_value); + } + } stream_ << "Mapping:" << '\n'; } diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp index 9d04a7f87400ab1189d784e654c07d8fa1ac8ada..41a3da39d872a31cd17a705afc5a191154e32586 100644 --- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp @@ -55,6 +55,14 @@ void RawPrintVisitor::visit(const IdmapHeader& header) { } } +void RawPrintVisitor::visit(const IdmapConstraints &idmapConstraints) { + print(static_cast(idmapConstraints.constraints.size()), "constraints count"); + for (const auto& constraint : idmapConstraints.constraints) { + print(constraint.constraint_type, "constraint type"); + print(constraint.constraint_value, "constraint value"); + } +} + void RawPrintVisitor::visit(const IdmapData& data ATTRIBUTE_UNUSED) { for (auto& target_entry : data.GetTargetEntries()) { Result target_name(Error("")); diff --git a/cmds/idmap2/self_targeting/SelfTargeting.cpp b/cmds/idmap2/self_targeting/SelfTargeting.cpp index 7f9c4686c55a2fb8c66e3b1aa52076083fd0c126..26888ab17d66650c20ababd487ad104c59ae4ccc 100644 --- a/cmds/idmap2/self_targeting/SelfTargeting.cpp +++ b/cmds/idmap2/self_targeting/SelfTargeting.cpp @@ -31,6 +31,7 @@ using PolicyBitmask = android::ResTable_overlayable_policy_header::PolicyBitmask using PolicyFlags = android::ResTable_overlayable_policy_header::PolicyFlags; using android::idmap2::BinaryStreamVisitor; using android::idmap2::Idmap; +using android::idmap2::IdmapConstraints; using android::idmap2::OverlayResourceContainer; namespace android::self_targeting { @@ -155,9 +156,10 @@ CreateIdmapFile(std::string& out_err, const std::string& targetPath, const std:: // Overlay self target process. Only allow self-targeting types. const auto fulfilled_policies = GetFulfilledPolicy(isSystem, isVendor, isProduct, isTargetSignature, isOdm, isOem); - + auto constraints = std::make_unique(); const auto idmap = Idmap::FromContainers(**target, **overlay, overlayName, - fulfilled_policies, true /* enforce_overlayable */); + fulfilled_policies, true /* enforce_overlayable */, + std::move(constraints)); if (!idmap) { out_err = base::StringPrintf("Failed to create idmap because of %s", idmap.GetErrorMessage().c_str()); diff --git a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp index f1eeab9c803b940edb204337185cca8658a39244..76cccb556ca2e8c7323edf9c3adcab19f1b48d03 100644 --- a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp +++ b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp @@ -58,6 +58,8 @@ TEST(BinaryStreamVisitorTests, CreateBinaryStreamViaBinaryStreamVisitor) { ASSERT_EQ(idmap1->GetData().size(), 1U); ASSERT_EQ(idmap1->GetData().size(), idmap2->GetData().size()); + ASSERT_EQ(idmap1->GetConstraints()->constraints, idmap2->GetConstraints()->constraints); + const std::vector>& data_blocks1 = idmap1->GetData(); ASSERT_EQ(data_blocks1.size(), 1U); const std::unique_ptr& data1 = data_blocks1[0]; diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp index 5a7fcd519cfd4a7c764dba623d8e8d4f829a0b2e..760bbb3f72ba43938c733fd79322375deb2aa265 100644 --- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp +++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp @@ -105,6 +105,7 @@ TEST_F(Idmap2BinaryTests, Create) { fin.close(); ASSERT_TRUE(idmap); + ASSERT_EQ((*idmap)->GetConstraints()->constraints.size(), 0); ASSERT_IDMAP(**idmap, GetTargetApkPath(), GetOverlayApkPath()); unlink(GetIdmapPath().c_str()); diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp index 7093614f40472811e7f9af1895c49eea562fc569..4de2a6b7c125c84827849d08c452261a3d5778bf 100644 --- a/cmds/idmap2/tests/IdmapTests.cpp +++ b/cmds/idmap2/tests/IdmapTests.cpp @@ -68,7 +68,7 @@ TEST(IdmapTests, CreateIdmapHeaderFromBinaryStream) { std::unique_ptr header = IdmapHeader::FromBinaryStream(stream); ASSERT_THAT(header, NotNull()); ASSERT_EQ(header->GetMagic(), 0x504d4449U); - ASSERT_EQ(header->GetVersion(), 10); + ASSERT_EQ(header->GetVersion(), 11); ASSERT_EQ(header->GetTargetCrc(), 0x1234U); ASSERT_EQ(header->GetOverlayCrc(), 0x5678U); ASSERT_EQ(header->GetFulfilledPolicies(), 0x11); @@ -96,6 +96,19 @@ TEST(IdmapTests, IdmapFailParsingDifferentMagic) { ASSERT_FALSE(Idmap::FromBinaryStream(stream)); } +TEST(IdmapTests, CreateIdmapConstraintsFromBinaryStream) { + std::string raw(reinterpret_cast(kIdmapRawData), kIdmapRawDataLen); + std::istringstream stream(raw); + std::unique_ptr header = IdmapHeader::FromBinaryStream(stream); + std::unique_ptr constraints = IdmapConstraints::FromBinaryStream(stream); + ASSERT_THAT(constraints, NotNull()); + ASSERT_EQ(constraints->constraints.size(), 2); + IdmapConstraint constraint1{.constraint_type = 0, .constraint_value = 1}; + IdmapConstraint constraint2{.constraint_type = 1, .constraint_value = 2}; + ASSERT_NE(constraints->constraints.find(constraint1), constraints->constraints.end()); + ASSERT_NE(constraints->constraints.find(constraint2), constraints->constraints.end()); +} + TEST(IdmapTests, CreateIdmapDataHeaderFromBinaryStream) { const size_t offset = kIdmapRawDataOffset; std::string raw(reinterpret_cast(kIdmapRawData + offset), kIdmapRawDataLen - offset); @@ -143,7 +156,7 @@ TEST(IdmapTests, CreateIdmapFromBinaryStream) { ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); - ASSERT_EQ(idmap->GetHeader()->GetVersion(), 10); + ASSERT_EQ(idmap->GetHeader()->GetVersion(), 11); ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0x1234U); ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), 0x5678U); ASSERT_EQ(idmap->GetHeader()->GetFulfilledPolicies(), kIdmapRawDataPolicies); @@ -195,16 +208,17 @@ TEST(IdmapTests, CreateIdmapHeaderFromApkAssets) { auto overlay = OverlayResourceContainer::FromPath(overlay_apk_path); ASSERT_TRUE(overlay); + auto constraints = std::make_unique(); auto idmap_result = Idmap::FromContainers( **target, **overlay, TestConstants::OVERLAY_NAME_ALL_POLICIES, PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + /* enforce_overlayable */ true, std::move(constraints)); ASSERT_TRUE(idmap_result) << idmap_result.GetErrorMessage(); auto& idmap = *idmap_result; ASSERT_THAT(idmap, NotNull()); ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); - ASSERT_EQ(idmap->GetHeader()->GetVersion(), 10); + ASSERT_EQ(idmap->GetHeader()->GetVersion(), 11); ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), android::idmap2::TestConstants::TARGET_CRC); ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), android::idmap2::TestConstants::OVERLAY_CRC); ASSERT_EQ(idmap->GetHeader()->GetFulfilledPolicies(), PolicyFlags::PUBLIC); @@ -238,9 +252,10 @@ TEST(IdmapTests, CreateIdmapDataFromApkAssets) { auto overlay = OverlayResourceContainer::FromPath(overlay_apk_path); ASSERT_TRUE(overlay); + auto constraints = std::make_unique(); auto idmap_result = Idmap::FromContainers( **target, **overlay, TestConstants::OVERLAY_NAME_DEFAULT, PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + /* enforce_overlayable */ true, std::move(constraints)); ASSERT_TRUE(idmap_result) << idmap_result.GetErrorMessage(); auto& idmap = *idmap_result; ASSERT_THAT(idmap, NotNull()); @@ -296,8 +311,9 @@ TEST(IdmapTests, FabricatedOverlay) { auto overlay = OverlayResourceContainer::FromPath(tf.path); ASSERT_TRUE(overlay); + auto constraints = std::make_unique(); auto idmap_result = Idmap::FromContainers(**target, **overlay, "SandTheme", PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + /* enforce_overlayable */ true, std::move(constraints)); ASSERT_TRUE(idmap_result) << idmap_result.GetErrorMessage(); auto& idmap = *idmap_result; ASSERT_THAT(idmap, NotNull()); @@ -341,13 +357,17 @@ TEST(IdmapTests, FailCreateIdmapInvalidName) { ASSERT_TRUE(overlay); { + auto constraints = std::make_unique(); auto idmap_result = Idmap::FromContainers(**target, **overlay, "", PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + /* enforce_overlayable */ true, + std::move(constraints)); ASSERT_FALSE(idmap_result); } { + auto constraints = std::make_unique(); auto idmap_result = Idmap::FromContainers(**target, **overlay, "unknown", PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + /* enforce_overlayable */ true, + std::move(constraints)); ASSERT_FALSE(idmap_result); } } @@ -362,9 +382,10 @@ TEST(IdmapTests, CreateIdmapDataFromApkAssetsSharedLibOverlay) { auto overlay = OverlayResourceContainer::FromPath(overlay_apk_path); ASSERT_TRUE(overlay); + auto constraints = std::make_unique(); auto idmap_result = Idmap::FromContainers( **target, **overlay, TestConstants::OVERLAY_NAME_DEFAULT, PolicyFlags::PUBLIC, - /* enforce_overlayable */ true); + /* enforce_overlayable */ true, std::move(constraints)); ASSERT_TRUE(idmap_result) << idmap_result.GetErrorMessage(); auto& idmap = *idmap_result; ASSERT_THAT(idmap, NotNull()); @@ -634,6 +655,10 @@ class TestVisitor : public Visitor { stream_ << "TestVisitor::visit(IdmapHeader)" << '\n'; } + void visit(const IdmapConstraints& idmap ATTRIBUTE_UNUSED) override { + stream_ << "TestVisitor::visit(IdmapConstraints)" << '\n'; + } + void visit(const IdmapData& idmap ATTRIBUTE_UNUSED) override { stream_ << "TestVisitor::visit(IdmapData)" << '\n'; } @@ -659,6 +684,7 @@ TEST(IdmapTests, TestVisitor) { ASSERT_EQ(test_stream.str(), "TestVisitor::visit(IdmapHeader)\n" + "TestVisitor::visit(IdmapConstraints)\n" "TestVisitor::visit(Idmap)\n" "TestVisitor::visit(IdmapData::Header)\n" "TestVisitor::visit(IdmapData)\n"); diff --git a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp index 3d3d82a8c7dd667d752db233ddfc72a5c7591a44..2f42f798f64a7309688e2168a9f2f3f6ec1ed60a 100644 --- a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp @@ -42,8 +42,10 @@ TEST(PrettyPrintVisitorTests, CreatePrettyPrintVisitor) { auto overlay = OverlayResourceContainer::FromPath(overlay_apk_path); ASSERT_TRUE(overlay); + auto constraints = std::make_unique(); const auto idmap = Idmap::FromContainers(**target, **overlay, TestConstants::OVERLAY_NAME_DEFAULT, - PolicyFlags::PUBLIC, /* enforce_overlayable */ true); + PolicyFlags::PUBLIC, /* enforce_overlayable */ true, + std::move(constraints)); ASSERT_TRUE(idmap); std::stringstream stream; diff --git a/cmds/idmap2/tests/RawPrintVisitorTests.cpp b/cmds/idmap2/tests/RawPrintVisitorTests.cpp index 7fae1c64f0143cffa978874972c7f880c7ffe8ad..d5aafe6b8d35c7512b43151d17f80b14a46d97f4 100644 --- a/cmds/idmap2/tests/RawPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/RawPrintVisitorTests.cpp @@ -55,8 +55,10 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { auto overlay = OverlayResourceContainer::FromPath(overlay_apk_path); ASSERT_TRUE(overlay); + auto constraints = std::make_unique(); const auto idmap = Idmap::FromContainers(**target, **overlay, TestConstants::OVERLAY_NAME_DEFAULT, - PolicyFlags::PUBLIC, /* enforce_overlayable */ true); + PolicyFlags::PUBLIC, /* enforce_overlayable */ true, + std::move(constraints)); ASSERT_TRUE(idmap); std::stringstream stream; @@ -64,7 +66,7 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { (*idmap)->accept(&visitor); ASSERT_CONTAINS_REGEX(ADDRESS "504d4449 magic\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "0000000a version\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "0000000b version\n", stream.str()); ASSERT_CONTAINS_REGEX( StringPrintf(ADDRESS "%s target crc\n", android::idmap2::TestConstants::TARGET_CRC_STRING), stream.str()); @@ -73,6 +75,7 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000001 fulfilled policies: public\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000001 enforce overlayable\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000000 constraints count\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000004 target entry count", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000000 target inline entry count", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000000 target inline entry value count", stream.str()); @@ -113,7 +116,7 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { (*idmap)->accept(&visitor); ASSERT_CONTAINS_REGEX(ADDRESS "504d4449 magic\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "0000000a version\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "0000000b version\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00001234 target crc\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00005678 overlay crc\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000011 fulfilled policies: public|signature\n", stream.str()); @@ -124,6 +127,11 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { ASSERT_CONTAINS_REGEX(ADDRESS "........ overlay path: overlayX.apk\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "0000000b overlay name size\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "........ overlay name: OverlayName\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000002 constraints count\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000000 constraint type\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000001 constraint value\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000001 constraint type\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000002 constraint value\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000003 target entry count\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000001 target inline entry count\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000001 target inline entry value count", stream.str()); diff --git a/cmds/idmap2/tests/TestHelpers.h b/cmds/idmap2/tests/TestHelpers.h index 2b4ebd1ae800352ada3a6145ae21d853bebcb462..6f645bd0122924870878e6ef59a70301add20015 100644 --- a/cmds/idmap2/tests/TestHelpers.h +++ b/cmds/idmap2/tests/TestHelpers.h @@ -34,7 +34,7 @@ const unsigned char kIdmapRawData[] = { 0x49, 0x44, 0x4d, 0x50, // 0x4: version - 0x0a, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, // 0x8: target crc 0x34, 0x12, 0x00, 0x00, @@ -73,131 +73,147 @@ const unsigned char kIdmapRawData[] = { // 0x4c string contents "debug\0\0\0" (padded to word alignment) 0x64, 0x65, 0x62, 0x75, 0x67, 0x00, 0x00, 0x00, + // CONSTRAINTS + // 0x54: constraints_count + 0x02, 0x00, 0x00, 0x00, + + // 0x58: constraint_type + 0x00, 0x00, 0x00, 0x00, + + // 0x5c: constraint_value + 0x01, 0x00, 0x00, 0x00, + + // 0x60: constraint_type + 0x01, 0x00, 0x00, 0x00, + + // 0x64: constraint_value + 0x02, 0x00, 0x00, 0x00, + // DATA HEADER - // 0x54: target_entry_count + // 0x68: target_entry_count 0x03, 0x00, 0x00, 0x00, - // 0x58: target_inline_entry_count + // 0x6c: target_inline_entry_count 0x01, 0x00, 0x00, 0x00, - // 0x5c: target_inline_entry_value_count + // 0x70: target_inline_entry_value_count 0x01, 0x00, 0x00, 0x00, // 0x60: config_count 0x01, 0x00, 0x00, 0x00, - // 0x64: overlay_entry_count + // 0x74: overlay_entry_count 0x03, 0x00, 0x00, 0x00, - // 0x68: string_pool_offset + // 0x78: string_pool_offset 0x00, 0x00, 0x00, 0x00, // TARGET ENTRIES - // 0x6c: target id (0x7f020000) + // 0x7c: target id (0x7f020000) 0x00, 0x00, 0x02, 0x7f, - // 0x70: target id (0x7f030000) + // 0x80: target id (0x7f030000) 0x00, 0x00, 0x03, 0x7f, - // 0x74: target id (0x7f030002) + // 0x84: target id (0x7f030002) 0x02, 0x00, 0x03, 0x7f, - // 0x78: overlay_id (0x7f020000) + // 0x88: overlay_id (0x7f020000) 0x00, 0x00, 0x02, 0x7f, - // 0x7c: overlay_id (0x7f030000) + // 0x8c: overlay_id (0x7f030000) 0x00, 0x00, 0x03, 0x7f, - // 0x80: overlay_id (0x7f030001) + // 0x90: overlay_id (0x7f030001) 0x01, 0x00, 0x03, 0x7f, // INLINE TARGET ENTRIES - // 0x84: target_id + // 0x94: target_id 0x00, 0x00, 0x04, 0x7f, - // 0x88: start value index + // 0x98: start value index 0x00, 0x00, 0x00, 0x00, - // 0x8c: value count + // 0x9c: value count 0x01, 0x00, 0x00, 0x00, // INLINE TARGET ENTRY VALUES - // 0x90: config index + // 0xa0: config index 0x00, 0x00, 0x00, 0x00, - // 0x94: Res_value::size (value ignored by idmap) + // 0xa4: Res_value::size (value ignored by idmap) 0x08, 0x00, - // 0x98: Res_value::res0 (value ignored by idmap) + // 0xa8: Res_value::res0 (value ignored by idmap) 0x00, - // 0x9c: Res_value::dataType (TYPE_INT_HEX) + // 0xac: Res_value::dataType (TYPE_INT_HEX) 0x11, - // 0xa0: Res_value::data + // 0xb0: Res_value::data 0x78, 0x56, 0x34, 0x12, // CONFIGURATIONS - // 0xa4: ConfigDescription + // 0xb4: ConfigDescription // size 0x40, 0x00, 0x00, 0x00, - // 0xa8: imsi + // 0xb8: imsi 0x00, 0x00, 0x00, 0x00, - // 0xac: locale + // 0xbc: locale 0x00, 0x00, 0x00, 0x00, - // 0xb0: screenType + // 0xc0: screenType 0x02, 0x00, 0xe0, 0x01, - // 0xb4: input + // 0xc4: input 0x00, 0x00, 0x00, 0x00, - // 0xb8: screenSize + // 0xc8: screenSize 0x00, 0x00, 0x00, 0x00, - // 0xbc: version + // 0xcc: version 0x07, 0x00, 0x00, 0x00, - // 0xc0: screenConfig + // 0xd0: screenConfig 0x00, 0x00, 0x00, 0x00, - // 0xc4: screenSizeDp + // 0xd4: screenSizeDp 0x00, 0x00, 0x00, 0x00, - // 0xc8: localeScript + // 0xd8: localeScript 0x00, 0x00, 0x00, 0x00, - // 0xcc: localVariant(1) + // 0xdc: localVariant(1) 0x00, 0x00, 0x00, 0x00, - // 0xd0: localVariant(2) + // 0xe0: localVariant(2) 0x00, 0x00, 0x00, 0x00, - // 0xd4: screenConfig2 + // 0xe4: screenConfig2 0x00, 0x00, 0x00, 0x00, - // 0xd8: localeScriptWasComputed + // 0xe8: localeScriptWasComputed 0x00, - // 0xd9: localeNumberingSystem(1) + // 0xe9: localeNumberingSystem(1) 0x00, 0x00, 0x00, 0x00, - // 0xdd: localeNumberingSystem(2) + // 0xed: localeNumberingSystem(2) 0x00, 0x00, 0x00, 0x00, - // 0xe1: padding + // 0xf1: padding 0x00, 0x00, 0x00, // OVERLAY ENTRIES - // 0xe4: 0x7f020000 -> ... + // 0xf4: 0x7f020000 -> ... 0x00, 0x00, 0x02, 0x7f, - // 0xe8: 0x7f030000 -> ... + // 0xf8: 0x7f030000 -> ... 0x00, 0x00, 0x03, 0x7f, - // 0xec: 0x7f030001 -> ... + // 0xfc: 0x7f030001 -> ... 0x01, 0x00, 0x03, 0x7f, - // 0xf0: ... -> 0x7f020000 + // 0x100: ... -> 0x7f020000 0x00, 0x00, 0x02, 0x7f, - // 0xf4: ... -> 0x7f030000 + // 0x104: ... -> 0x7f030000 0x00, 0x00, 0x03, 0x7f, - // 0xf8: ... -> 0x7f030002 + // 0x108: ... -> 0x7f030002 0x02, 0x00, 0x03, 0x7f, - // 0xfc: string pool + // 0x10c: string pool // string length, 0x04, 0x00, 0x00, 0x00, - // 0x100 string contents "test" + // 0x110 string contents "test" 0x74, 0x65, 0x73, 0x74}; constexpr unsigned int kIdmapRawDataLen = std::size(kIdmapRawData); -const unsigned int kIdmapRawDataOffset = 0x54; +const unsigned int kIdmapRawDataOffset = 0x68; const unsigned int kIdmapRawDataTargetCrc = 0x1234; const unsigned int kIdmapRawOverlayCrc = 0x5678; const unsigned int kIdmapRawDataPolicies = 0x11; diff --git a/core/api/current.txt b/core/api/current.txt index 9ebb5068bf19b3b6b1722517ae5afbe798229a33..4862236a35e325b2c1d345e4109fc40982a6f38f 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -53802,8 +53802,8 @@ package android.view { method @FlaggedApi("com.android.graphics.hwui.flags.limited_hdr") public void setDesiredHdrHeadroom(@FloatRange(from=0.0f, to=10000.0) float); method public void setSecure(boolean); method public void setSurfaceLifecycle(int); - method public void setZOrderMediaOverlay(boolean); - method public void setZOrderOnTop(boolean); + method @Deprecated @FlaggedApi("android.view.flags.deprecate_surface_view_z_order_apis") public void setZOrderMediaOverlay(boolean); + method @Deprecated @FlaggedApi("android.view.flags.deprecate_surface_view_z_order_apis") public void setZOrderOnTop(boolean); field public static final int SURFACE_LIFECYCLE_DEFAULT = 0; // 0x0 field public static final int SURFACE_LIFECYCLE_FOLLOWS_ATTACHMENT = 2; // 0x2 field public static final int SURFACE_LIFECYCLE_FOLLOWS_VISIBILITY = 1; // 0x1 diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index 40069aa001065379f7697662e623c438a17abcbf..526a213a60032524d7476b18748afb8d70641ddb 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -165,6 +165,16 @@ package android.hardware.usb { package android.media { + public class AudioDeviceVolumeManager { + method @FlaggedApi("android.media.audio.unify_absolute_volume_management") @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.BLUETOOTH_STACK}) public void setDeviceAbsoluteMultiVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, @NonNull java.util.List, @NonNull java.util.concurrent.Executor, @NonNull android.media.AudioDeviceVolumeManager.OnAudioDeviceVolumeChangedListener); + method @FlaggedApi("android.media.audio.unify_absolute_volume_management") @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.BLUETOOTH_STACK}) public void setDeviceAbsoluteVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, @NonNull android.media.VolumeInfo, @NonNull java.util.concurrent.Executor, @NonNull android.media.AudioDeviceVolumeManager.OnAudioDeviceVolumeChangedListener); + } + + @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static interface AudioDeviceVolumeManager.OnAudioDeviceVolumeChangedListener { + method public void onAudioDeviceVolumeAdjusted(@NonNull android.media.AudioDeviceAttributes, @NonNull android.media.VolumeInfo, int, int); + method public void onAudioDeviceVolumeChanged(@NonNull android.media.AudioDeviceAttributes, @NonNull android.media.VolumeInfo); + } + public class AudioManager { method public void adjustStreamVolumeForUid(int, int, int, @NonNull String, int, int, int); method public void adjustSuggestedStreamVolumeForUid(int, int, int, @NonNull String, int, int, int); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 4222c7c64672b861f91118d0332d89d284e81860..514a58244aa2cfb8bd97d5cad888fa8a64487e19 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2586,7 +2586,7 @@ package android.os { } public class UserManager { - method @FlaggedApi("android.os.allow_private_profile") @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}, conditional=true) public boolean canAddPrivateProfile(); + method @FlaggedApi("android.os.allow_private_profile") @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean canAddPrivateProfile(); method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.content.pm.UserInfo createProfileForUser(@Nullable String, @NonNull String, int, int, @Nullable String[]); method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.content.pm.UserInfo createRestrictedProfile(@Nullable String); method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.content.pm.UserInfo createUser(@Nullable String, @NonNull String, int); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index ee9c64f973820770c5b3af5e7c9c06ec7d28c862..b4f653354e07fb072c74d91b0cd018f34f426d04 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -7684,16 +7684,19 @@ public class Activity extends ContextThemeWrapper /** * Change the desired orientation of this activity. If the activity is currently in the * foreground or otherwise impacting the screen orientation, the screen is immediately changed - * (possibly causing the activity to be restarted). Otherwise, the requested orientation is used - * the next time the activity is visible. + * (possibly causing the activity to be restarted). Otherwise, the new orientation is used the + * next time the activity is visible. * *