Merge "Get Radio Hal Capabilities in VTS"
diff --git a/compatibility_matrices/compatibility_matrix.5.xml b/compatibility_matrices/compatibility_matrix.5.xml
index 96a3692..8e175f0 100644
--- a/compatibility_matrices/compatibility_matrix.5.xml
+++ b/compatibility_matrices/compatibility_matrix.5.xml
@@ -256,6 +256,13 @@
</hal>
<hal format="aidl" optional="true">
<name>android.hardware.identity</name>
+ <!--
+ b/178458001: identity V2 is introduced in R, but Android R VINTF does not support AIDL
+ versions. Hence, we only specify identity V2 in compatibility_matrix.5.xml in Android S+
+ branches. In Android R branches, the matrix implicitly specifies V1.
+ SingleManifestTest.ManifestAidlHalsServed has an exemption for this.
+ -->
+ <version>1-2</version>
<interface>
<name>IIdentityCredentialStore</name>
<instance>default</instance>
diff --git a/current.txt b/current.txt
index c90c7dd..8d1ca88 100644
--- a/current.txt
+++ b/current.txt
@@ -776,8 +776,8 @@
dabe23dde7c9e3ad65c61def7392f186d7efe7f4216f9b6f9cf0863745b1a9f4 android.hardware.keymaster@4.1::IKeymasterDevice
cd84ab19c590e0e73dd2307b591a3093ee18147ef95e6d5418644463a6620076 android.hardware.neuralnetworks@1.2::IDevice
f729ee6a5f136b25d79ea6895d24700fce413df555baaecf2c39e4440d15d043 android.hardware.neuralnetworks@1.0::types
-ba84f3a750b1cc43ac51074e8b8e22df924f3e6d9068fac50d95bcf57b2b1d61 android.hardware.neuralnetworks@1.2::types
-9fe5a4093043c2b5da4e9491aed1646c388a5d3059b8fd77d5b6a9807e6d3a3e android.hardware.neuralnetworks@1.3::types
+a84f8dac7a9b75de1cc2936a9b429b9b62b32a31ea88ca52c29f98f5ddc0fa95 android.hardware.neuralnetworks@1.2::types
+cd331b92312d16ab89f475c39296abbf539efc4114a8c5c2b136ad99b904ef33 android.hardware.neuralnetworks@1.3::types
e8c86c69c438da8d1549856c1bb3e2d1b8da52722f8235ff49a30f2cce91742c android.hardware.soundtrigger@2.1::ISoundTriggerHwCallback
b9fbb6e2e061ed0960939d48b785e9700210add1f13ed32ecd688d0f1ca20ef7 android.hardware.renderscript@1.0::types
0f53d70e1eadf8d987766db4bf6ae2048004682168f4cab118da576787def3fa android.hardware.radio@1.0::types
diff --git a/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp b/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp
index 5f81394..e0d60fc 100644
--- a/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp
+++ b/keymaster/4.0/vts/functional/keymaster_hidl_hal_test.cpp
@@ -136,48 +136,53 @@
return retval;
}
-string rsa_2048_key =
- hex2str("308204a50201000282010100caa620db7bbadfd351153a804e05a3115a0"
- "eea067316c7d6ae010086cc4d636edcc50b725c495027e79d7c6d65ec50"
- "5ab84107b0ca9f8389d0d812d42df3af0c1c50f1083b1eedd18921283e3"
- "9ebe95bd56795c9ba129afc63d60fb020b300c44861a73845508a992c54"
- "7cf4ce7694955c684bc130fe9a0478285d686da954989a7be3cd970de7e"
- "5eca8574c0617fed74717f7035655f65af7b5f9b982feca8eed643b96d8"
- "f1c4e6dcd96a9ccfcca3366d8f1c95f83a83ab785f997b78918ceca567d"
- "91cf2ea85c340c0d4462f31f8a31e648cd26e1116a97d17dcfec51e4336"
- "fa0725ff49216005911966748f94789c055795da023362091c977bdc0bd"
- "8e31902030100010282010100ca562da0785e1275d013be21b5c5731834"
- "2f8803808e52624bc2bc5fdb45b9ee4b8882f160abe2d8b52e4dba7d760"
- "295523bbc0e0d824fb81f4a5f2273ef47ec73a96dc0a6272f9573b22398"
- "5e04eb2fc25876fac04b2b6cadd2623f9da69d315e84028ef0c6865c822"
- "2a9d15504993eb8d17a321f55573af72e76757a690408c36909eb44a555"
- "4b571007edde150b47952287d942559e7f8cbcb2c47086aa291515f55c4"
- "deba6d1ebde0cca5ee899b3b0c4c21123bbf92feac53db515fe02d03b83"
- "2154e31122abcbb6fc80b49e1c8fc5528605935f8f6ead1237b16e83d23"
- "ad73e82ee008c3ff7b4666f4c137c20f52ae6fea5b54ed104c1c1bf75fc"
- "3c020102818100efa6b29bb0f6b81c8fecf3e73c3e5a59b71ffd31075c4"
- "0282269ee245367c2e54f0244301dad0b90dcce73f25c1caca2f4ef1774"
- "42a5d9e98a354bcd5ddae129bea2c0771d1ad51341f44ddf0c5c0f22252"
- "414e2de7af6c67754dba610ee2743f21789a89829ad91efc02c7c5588fe"
- "84b64df12dc5cee90df2e7dd4a1ca2886902818100d87937f039df50054"
- "7c7d5435ec8e89789b36a0e5c4004d4612a6ef2dce39ee4f24fb5d2da38"
- "dbf5f3d639681a11fc416618554b1ff51a8215446b676363f6a5e91ea6c"
- "957483e0a47ae36582bde9fba45c00e6e3fadc651cc87c170171d7fef6d"
- "0dc1f0ddb6eca2674064925b78542b32f2821605c29b6d0b65485081f5a"
- "f3102818100ee21453ee153f6d422cb7ffc586758dde6d239835b5df63e"
- "2b1bf94f4d35407b1ccc12b780f56f15ade2d36192d7c74f5174b66886c"
- "5484800563f113cde7e783d7e7922a2e003b3d4088ecc40fac4ead7df07"
- "85fb2e524219574fbeaefa063844b9d0c69f1462ed2d3f56b4e145742aa"
- "8ffbfd40cc731daf37023fa3d83df6902818055dc2e8dbfc68d2caafddd"
- "deacd7af397bca87c44e5eae0bb6c667df3831a83252d1bee274df9c8ef"
- "f39f6e70d8018b7afd0f2f3ab27426e5a151b2c94c56f6cfafbc75790a0"
- "fcca8307dc5238844282556c09cd3cc0a62a879f48e036aae2b58a61ac8"
- "ce6c3c933d914374fbdac0a665ffcc4100c14d624f82221fe9cad5fe102"
- "818100964193ee55581c9a82fe03f8eb018cdce8965f30745cc6e68154c"
- "b6618ef3cc57ae4798ff2a509306a135f7cf705ceb215fda6939c7a6353"
- "0c86a5ba02f491a64f6079e62b1b00b86859899febf3ed300edcc0b8b35"
- "1855a90d9d39a279be963f0972a256084a3c46575f796ad27dc801f67a3"
- "7a59e62e076b996f025a9c9042");
+/*
+ * DER-encoded PKCS#8 format RSA key. Generated using:
+ *
+ * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
+ */
+string rsa_2048_key = hex2str(
+ "308204BD020100300D06092A864886F70D0101010500048204A7308204A3"
+ "0201000282010100BEBC342B56D443B1299F9A6A7056E80A897E318476A5"
+ "A18029E63B2ED739A61791D339F58DC763D9D14911F2EDEC383DEE11F631"
+ "9B44510E7A3ECD9B79B97382E49500ACF8117DC89CAF0E621F77756554A2"
+ "FD4664BFE7AB8B59AB48340DBFA27B93B5A81F6ECDEB02D0759307128DF3"
+ "E3BAD4055C8B840216DFAA5700670E6C5126F0962FCB70FF308F25049164"
+ "CCF76CC2DA66A7DD9A81A714C2809D69186133D29D84568E892B6FFBF319"
+ "9BDB14383EE224407F190358F111A949552ABA6714227D1BD7F6B20DD0CB"
+ "88F9467B719339F33BFF35B3870B3F62204E4286B0948EA348B524544B5F"
+ "9838F29EE643B079EEF8A713B220D7806924CDF7295070C5020301000102"
+ "82010069F377F35F2F584EF075353CCD1CA99738DB3DBC7C7FF35F9366CE"
+ "176DFD1B135AB10030344ABF5FBECF1D4659FDEF1C0FC430834BE1BE3911"
+ "951377BB3D563A2EA9CA8F4AD9C48A8CE6FD516A735C662686C7B4B3C09A"
+ "7B8354133E6F93F790D59EAEB92E84C9A4339302CCE28FDF04CCCAFA7DE3"
+ "F3A827D4F6F7D38E68B0EC6AB706645BF074A4E4090D06FB163124365FD5"
+ "EE7A20D350E9958CC30D91326E1B292E9EF5DB408EC42DAF737D20149704"
+ "D0A678A0FB5B5446863B099228A352D604BA8091A164D01D5AB05397C71E"
+ "AD20BE2A08FC528FE442817809C787FEE4AB97F97B9130D022153EDC6EB6"
+ "CBE7B0F8E3473F2E901209B5DB10F93604DB0102818100E83C0998214941"
+ "EA4F9293F1B77E2E99E6CF305FAF358238E126124FEAF2EB9724B2EA7B78"
+ "E6032343821A80E55D1D88FB12D220C3F41A56142FEC85796D1917F1E8C7"
+ "74F142B67D3D6E7B7E6B4383E94DB5929089DBB346D5BDAB40CC2D96EE04"
+ "09475E175C63BF78CFD744136740838127EA723FF3FE7FA368C1311B4A4E"
+ "0502818100D240FCC0F5D7715CDE21CB2DC86EA146132EA3B06F61FF2AF5"
+ "4BF38473F59DADCCE32B5F4CC32DD0BA6F509347B4B5B1B58C39F95E4798"
+ "CCBB43E83D0119ACF532F359CA743C85199F0286610E200997D731291717"
+ "9AC9B67558773212EC961E8BCE7A3CC809BC5486A96E4B0E6AF394D94E06"
+ "6A0900B7B70E82A44FB30053C102818100AD15DA1CBD6A492B66851BA8C3"
+ "16D38AB700E2CFDDD926A658003513C54BAA152B30021D667D20078F500F"
+ "8AD3E7F3945D74A891ED1A28EAD0FEEAEC8C14A8E834CF46A13D1378C99D"
+ "18940823CFDD27EC5810D59339E0C34198AC638E09C87CBB1B634A9864AE"
+ "9F4D5EB2D53514F67B4CAEC048C8AB849A02E397618F3271350281801FA2"
+ "C1A5331880A92D8F3E281C617108BF38244F16E352E69ED417C7153F9EC3"
+ "18F211839C643DCF8B4DD67CE2AC312E95178D5D952F06B1BF779F491692"
+ "4B70F582A23F11304E02A5E7565AE22A35E74FECC8B6FDC93F92A1A37703"
+ "E4CF0E63783BD02EB716A7ECBBFA606B10B74D01579522E7EF84D91FC522"
+ "292108D902C1028180796FE3825F9DCC85DF22D58690065D93898ACD65C0"
+ "87BEA8DA3A63BF4549B795E2CD0E3BE08CDEBD9FCF1720D9CDC5070D74F4"
+ "0DED8E1102C52152A31B6165F83A6722AECFCC35A493D7634664B888A08D"
+ "3EB034F12EA28BFEE346E205D334827F778B16ED40872BD29FCB36536B6E"
+ "93FFB06778696B4A9D81BB0A9423E63DE5");
string rsa_key = hex2str(
"30820275020100300d06092a864886f70d01010105000482025f3082025b"
diff --git a/neuralnetworks/1.2/types.hal b/neuralnetworks/1.2/types.hal
index e3cee93..03aed86 100644
--- a/neuralnetworks/1.2/types.hal
+++ b/neuralnetworks/1.2/types.hal
@@ -4895,25 +4895,25 @@
* Additional parameters specific to a particular operand type.
*/
safe_union ExtraParams {
- /**
- * No additional parameters.
- */
- Monostate none;
+ /**
+ * No additional parameters.
+ */
+ Monostate none;
- /**
- * Symmetric per-channel quantization parameters.
- *
- * Only applicable to operands of type TENSOR_QUANT8_SYMM_PER_CHANNEL.
- */
- SymmPerChannelQuantParams channelQuant;
+ /**
+ * Symmetric per-channel quantization parameters.
+ *
+ * Only applicable to operands of type TENSOR_QUANT8_SYMM_PER_CHANNEL.
+ */
+ SymmPerChannelQuantParams channelQuant;
- /**
- * Extension operand parameters.
- *
- * The framework treats this as an opaque data blob.
- * The format is up to individual extensions.
- */
- vec<uint8_t> extension;
+ /**
+ * Extension operand parameters.
+ *
+ * The framework treats this as an opaque data blob.
+ * The format is up to individual extensions.
+ */
+ vec<uint8_t> extension;
} extraParams;
};
diff --git a/neuralnetworks/1.2/types.t b/neuralnetworks/1.2/types.t
index 054d516..4c9fd02 100644
--- a/neuralnetworks/1.2/types.t
+++ b/neuralnetworks/1.2/types.t
@@ -291,25 +291,25 @@
* Additional parameters specific to a particular operand type.
*/
safe_union ExtraParams {
- /**
- * No additional parameters.
- */
- Monostate none;
+ /**
+ * No additional parameters.
+ */
+ Monostate none;
- /**
- * Symmetric per-channel quantization parameters.
- *
- * Only applicable to operands of type TENSOR_QUANT8_SYMM_PER_CHANNEL.
- */
- SymmPerChannelQuantParams channelQuant;
+ /**
+ * Symmetric per-channel quantization parameters.
+ *
+ * Only applicable to operands of type TENSOR_QUANT8_SYMM_PER_CHANNEL.
+ */
+ SymmPerChannelQuantParams channelQuant;
- /**
- * Extension operand parameters.
- *
- * The framework treats this as an opaque data blob.
- * The format is up to individual extensions.
- */
- vec<uint8_t> extension;
+ /**
+ * Extension operand parameters.
+ *
+ * The framework treats this as an opaque data blob.
+ * The format is up to individual extensions.
+ */
+ vec<uint8_t> extension;
} extraParams;
};
diff --git a/neuralnetworks/1.3/types.hal b/neuralnetworks/1.3/types.hal
index 51837fe..a5dbd5e 100644
--- a/neuralnetworks/1.3/types.hal
+++ b/neuralnetworks/1.3/types.hal
@@ -5340,7 +5340,6 @@
HIGH,
};
-
/**
* The capabilities of a driver.
*
diff --git a/neuralnetworks/1.3/types.t b/neuralnetworks/1.3/types.t
index 2901d18..9f69c9e 100644
--- a/neuralnetworks/1.3/types.t
+++ b/neuralnetworks/1.3/types.t
@@ -99,7 +99,6 @@
HIGH,
};
-
/**
* The capabilities of a driver.
*
diff --git a/power/stats/aidl/default/FakeEnergyConsumer.h b/power/stats/aidl/default/FakeEnergyConsumer.h
new file mode 100644
index 0000000..f41aa6e
--- /dev/null
+++ b/power/stats/aidl/default/FakeEnergyConsumer.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <PowerStats.h>
+
+#include <android-base/chrono_utils.h>
+
+#include <chrono>
+#include <random>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace power {
+namespace stats {
+
+class FakeEnergyConsumer : public PowerStats::IEnergyConsumer {
+ public:
+ FakeEnergyConsumer(EnergyConsumerType type, std::string name) : mType(type), mName(name) {
+ mResult.timestampMs = 0;
+ mResult.energyUWs = 0;
+ mResult.attribution = {};
+ }
+
+ ~FakeEnergyConsumer() = default;
+
+ std::string getName() override { return mName; }
+
+ EnergyConsumerType getType() override { return mType; }
+
+ std::optional<EnergyConsumerResult> getEnergyConsumed() override {
+ mFakeEnergyConsumerResult.update(&mResult);
+ return mResult;
+ }
+
+ private:
+ class FakeEnergyConsumerResult {
+ public:
+ FakeEnergyConsumerResult() : mDistribution(1, 100) {}
+ void update(EnergyConsumerResult* result) {
+ // generates number in the range 1..100
+ auto randNum = std::bind(mDistribution, mGenerator);
+
+ // Get current time since boot in milliseconds
+ uint64_t now = std::chrono::time_point_cast<std::chrono::milliseconds>(
+ ::android::base::boot_clock::now())
+ .time_since_epoch()
+ .count();
+ result->timestampMs = now;
+ result->energyUWs += randNum() * 100;
+ }
+
+ private:
+ std::default_random_engine mGenerator;
+ std::uniform_int_distribution<int> mDistribution;
+ };
+
+ EnergyConsumerType mType;
+ std::string mName;
+ FakeEnergyConsumerResult mFakeEnergyConsumerResult;
+ EnergyConsumerResult mResult;
+};
+
+} // namespace stats
+} // namespace power
+} // namespace hardware
+} // namespace android
+} // namespace aidl
\ No newline at end of file
diff --git a/power/stats/aidl/default/FakeEnergyMeter.h b/power/stats/aidl/default/FakeEnergyMeter.h
new file mode 100644
index 0000000..f0d4ee7
--- /dev/null
+++ b/power/stats/aidl/default/FakeEnergyMeter.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <PowerStats.h>
+
+#include <android-base/chrono_utils.h>
+
+#include <chrono>
+#include <random>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace power {
+namespace stats {
+
+class FakeEnergyMeter : public PowerStats::IEnergyMeter {
+ public:
+ FakeEnergyMeter(std::vector<std::pair<std::string, std::string>> channelNames) {
+ int32_t channelId = 0;
+ for (const auto& [name, subsystem] : channelNames) {
+ Channel c;
+ c.id = channelId++;
+ c.name = name;
+ c.subsystem = subsystem;
+
+ EnergyMeasurement m;
+ m.id = c.id;
+ m.timestampMs = 0;
+ m.durationMs = 0;
+ m.energyUWs = 0;
+
+ mChannels.push_back(c);
+ mEnergyMeasurements.push_back(m);
+ }
+ }
+ ~FakeEnergyMeter() = default;
+ ndk::ScopedAStatus readEnergyMeter(const std::vector<int32_t>& in_channelIds,
+ std::vector<EnergyMeasurement>* _aidl_return) override {
+ for (auto& measurement : mEnergyMeasurements) {
+ mFakeEnergyMeasurement.update(&measurement);
+ }
+
+ if (in_channelIds.empty()) {
+ *_aidl_return = mEnergyMeasurements;
+ } else {
+ for (int32_t id : in_channelIds) {
+ if (id >= 0 && id < mEnergyMeasurements.size()) {
+ _aidl_return->push_back(mEnergyMeasurements[id]);
+ }
+ }
+ }
+
+ return ndk::ScopedAStatus::ok();
+ }
+
+ ndk::ScopedAStatus getEnergyMeterInfo(std::vector<Channel>* _aidl_return) override {
+ *_aidl_return = mChannels;
+ return ndk::ScopedAStatus::ok();
+ }
+
+ private:
+ class FakeEnergyMeasurement {
+ public:
+ FakeEnergyMeasurement() : mDistribution(1, 100) {}
+ void update(EnergyMeasurement* measurement) {
+ // generates number in the range 1..100
+ auto randNum = std::bind(mDistribution, mGenerator);
+
+ // Get current time since boot in milliseconds
+ uint64_t now = std::chrono::time_point_cast<std::chrono::milliseconds>(
+ ::android::base::boot_clock::now())
+ .time_since_epoch()
+ .count();
+ measurement->timestampMs = now;
+ measurement->durationMs = now;
+ measurement->energyUWs += randNum() * 100;
+ }
+
+ private:
+ std::default_random_engine mGenerator;
+ std::uniform_int_distribution<int> mDistribution;
+ };
+
+ std::vector<Channel> mChannels;
+ FakeEnergyMeasurement mFakeEnergyMeasurement;
+ std::vector<EnergyMeasurement> mEnergyMeasurements;
+};
+
+} // namespace stats
+} // namespace power
+} // namespace hardware
+} // namespace android
+} // namespace aidl
\ No newline at end of file
diff --git a/power/stats/aidl/default/FakeStateResidencyDataProvider.h b/power/stats/aidl/default/FakeStateResidencyDataProvider.h
new file mode 100644
index 0000000..2eeab61
--- /dev/null
+++ b/power/stats/aidl/default/FakeStateResidencyDataProvider.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <PowerStats.h>
+
+#include <random>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace power {
+namespace stats {
+
+class FakeStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
+ public:
+ FakeStateResidencyDataProvider(const std::string& name, std::vector<State> states)
+ : mName(name), mStates(states) {
+ for (const auto& state : mStates) {
+ StateResidency r;
+ r.id = state.id;
+ r.totalTimeInStateMs = 0;
+ r.totalStateEntryCount = 0;
+ r.lastEntryTimestampMs = 0;
+ mResidencies.push_back(r);
+ }
+ }
+ ~FakeStateResidencyDataProvider() = default;
+
+ // Methods from PowerStats::IStateResidencyDataProvider
+ bool getStateResidencies(
+ std::unordered_map<std::string, std::vector<StateResidency>>* residencies) override {
+ for (auto& residency : mResidencies) {
+ mFakeStateResidency.update(&residency);
+ }
+
+ residencies->emplace(mName, mResidencies);
+ return true;
+ }
+
+ std::unordered_map<std::string, std::vector<State>> getInfo() override {
+ return {{mName, mStates}};
+ }
+
+ private:
+ class FakeStateResidency {
+ public:
+ FakeStateResidency() : mDistribution(1, 100) {}
+ void update(StateResidency* residency) {
+ // generates number in the range 1..100
+ auto randNum = std::bind(mDistribution, mGenerator);
+
+ residency->totalTimeInStateMs += randNum() * 100;
+ residency->totalStateEntryCount += randNum();
+ residency->lastEntryTimestampMs += randNum() * 100;
+ }
+
+ private:
+ std::default_random_engine mGenerator;
+ std::uniform_int_distribution<int> mDistribution;
+ };
+
+ const std::string mName;
+ const std::vector<State> mStates;
+ FakeStateResidency mFakeStateResidency;
+ std::vector<StateResidency> mResidencies;
+};
+
+} // namespace stats
+} // namespace power
+} // namespace hardware
+} // namespace android
+} // namespace aidl
\ No newline at end of file
diff --git a/power/stats/aidl/default/PowerStats.cpp b/power/stats/aidl/default/PowerStats.cpp
index 0ffbd08..1373502 100644
--- a/power/stats/aidl/default/PowerStats.cpp
+++ b/power/stats/aidl/default/PowerStats.cpp
@@ -18,46 +18,157 @@
#include <android-base/logging.h>
+#include <numeric>
+
namespace aidl {
namespace android {
namespace hardware {
namespace power {
namespace stats {
+void PowerStats::addStateResidencyDataProvider(std::unique_ptr<IStateResidencyDataProvider> p) {
+ if (!p) {
+ return;
+ }
+
+ int32_t id = mPowerEntityInfos.size();
+
+ for (const auto& [entityName, states] : p->getInfo()) {
+ PowerEntity i = {
+ .id = id++,
+ .name = entityName,
+ .states = states,
+ };
+ mPowerEntityInfos.emplace_back(i);
+ mStateResidencyDataProviders.emplace_back(std::move(p));
+ }
+}
+
+void PowerStats::addEnergyConsumer(std::unique_ptr<IEnergyConsumer> p) {
+ if (!p) {
+ return;
+ }
+
+ EnergyConsumerType type = p->getType();
+ std::string name = p->getName();
+ int32_t count = count_if(mEnergyConsumerInfos.begin(), mEnergyConsumerInfos.end(),
+ [&type](const EnergyConsumer& c) { return type == c.type; });
+ int32_t id = mEnergyConsumers.size();
+ mEnergyConsumerInfos.emplace_back(
+ EnergyConsumer{.id = id, .ordinal = count, .type = type, .name = name});
+ mEnergyConsumers.emplace_back(std::move(p));
+}
+
+void PowerStats::setEnergyMeter(std::unique_ptr<IEnergyMeter> p) {
+ mEnergyMeter = std::move(p);
+}
+
ndk::ScopedAStatus PowerStats::getPowerEntityInfo(std::vector<PowerEntity>* _aidl_return) {
- (void)_aidl_return;
+ *_aidl_return = mPowerEntityInfos;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus PowerStats::getStateResidency(const std::vector<int32_t>& in_powerEntityIds,
std::vector<StateResidencyResult>* _aidl_return) {
- (void)in_powerEntityIds;
- (void)_aidl_return;
- return ndk::ScopedAStatus::ok();
+ if (mPowerEntityInfos.empty()) {
+ return ndk::ScopedAStatus::ok();
+ }
+
+ // If in_powerEntityIds is empty then return data for all supported entities
+ if (in_powerEntityIds.empty()) {
+ std::vector<int32_t> v(mPowerEntityInfos.size());
+ std::iota(std::begin(v), std::end(v), 0);
+ return getStateResidency(v, _aidl_return);
+ }
+
+ binder_status_t err = STATUS_OK;
+
+ std::unordered_map<std::string, std::vector<StateResidency>> stateResidencies;
+
+ for (const int32_t id : in_powerEntityIds) {
+ // skip any invalid ids
+ if (id < 0 || id >= mPowerEntityInfos.size()) {
+ continue;
+ }
+
+ // Check to see if we already have data for the given id
+ std::string powerEntityName = mPowerEntityInfos[id].name;
+ if (stateResidencies.find(powerEntityName) == stateResidencies.end()) {
+ mStateResidencyDataProviders[id]->getStateResidencies(&stateResidencies);
+ }
+
+ // Append results if we have them
+ auto stateResidency = stateResidencies.find(powerEntityName);
+ if (stateResidency != stateResidencies.end()) {
+ StateResidencyResult res = {
+ .id = id,
+ .stateResidencyData = stateResidency->second,
+ };
+ _aidl_return->emplace_back(res);
+ } else {
+ // Failed to retrieve results for the given id.
+ err = STATUS_FAILED_TRANSACTION;
+ }
+ }
+
+ return ndk::ScopedAStatus::fromStatus(err);
}
ndk::ScopedAStatus PowerStats::getEnergyConsumerInfo(std::vector<EnergyConsumer>* _aidl_return) {
- (void)_aidl_return;
+ *_aidl_return = mEnergyConsumerInfos;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus PowerStats::getEnergyConsumed(const std::vector<int32_t>& in_energyConsumerIds,
std::vector<EnergyConsumerResult>* _aidl_return) {
- (void)in_energyConsumerIds;
- (void)_aidl_return;
- return ndk::ScopedAStatus::ok();
+ if (mEnergyConsumers.empty()) {
+ return ndk::ScopedAStatus::ok();
+ }
+
+ // If in_powerEntityIds is empty then return data for all supported energy consumers
+ if (in_energyConsumerIds.empty()) {
+ std::vector<int32_t> v(mEnergyConsumerInfos.size());
+ std::iota(std::begin(v), std::end(v), 0);
+ return getEnergyConsumed(v, _aidl_return);
+ }
+
+ binder_status_t err = STATUS_OK;
+
+ for (const auto id : in_energyConsumerIds) {
+ // skip any invalid ids
+ if (id < 0 || id >= mEnergyConsumers.size()) {
+ continue;
+ }
+
+ auto optionalResult = mEnergyConsumers[id]->getEnergyConsumed();
+ if (optionalResult) {
+ EnergyConsumerResult result = optionalResult.value();
+ result.id = id;
+ _aidl_return->emplace_back(result);
+ } else {
+ // Failed to retrieve results for the given id.
+ err = STATUS_FAILED_TRANSACTION;
+ }
+ }
+
+ return ndk::ScopedAStatus::fromStatus(err);
}
ndk::ScopedAStatus PowerStats::getEnergyMeterInfo(std::vector<Channel>* _aidl_return) {
- (void)_aidl_return;
- return ndk::ScopedAStatus::ok();
+ if (!mEnergyMeter) {
+ return ndk::ScopedAStatus::ok();
+ }
+
+ return mEnergyMeter->getEnergyMeterInfo(_aidl_return);
}
ndk::ScopedAStatus PowerStats::readEnergyMeter(const std::vector<int32_t>& in_channelIds,
std::vector<EnergyMeasurement>* _aidl_return) {
- (void)in_channelIds;
- (void)_aidl_return;
- return ndk::ScopedAStatus::ok();
+ if (!mEnergyMeter) {
+ return ndk::ScopedAStatus::ok();
+ }
+
+ return mEnergyMeter->readEnergyMeter(in_channelIds, _aidl_return);
}
} // namespace stats
diff --git a/power/stats/aidl/default/PowerStats.h b/power/stats/aidl/default/PowerStats.h
index cb98e55..f4c5e69 100644
--- a/power/stats/aidl/default/PowerStats.h
+++ b/power/stats/aidl/default/PowerStats.h
@@ -18,6 +18,8 @@
#include <aidl/android/hardware/power/stats/BnPowerStats.h>
+#include <unordered_map>
+
namespace aidl {
namespace android {
namespace hardware {
@@ -26,7 +28,37 @@
class PowerStats : public BnPowerStats {
public:
+ class IStateResidencyDataProvider {
+ public:
+ virtual ~IStateResidencyDataProvider() = default;
+ virtual bool getStateResidencies(
+ std::unordered_map<std::string, std::vector<StateResidency>>* residencies) = 0;
+ virtual std::unordered_map<std::string, std::vector<State>> getInfo() = 0;
+ };
+
+ class IEnergyConsumer {
+ public:
+ virtual ~IEnergyConsumer() = default;
+ virtual std::string getName() = 0;
+ virtual EnergyConsumerType getType() = 0;
+ virtual std::optional<EnergyConsumerResult> getEnergyConsumed() = 0;
+ };
+
+ class IEnergyMeter {
+ public:
+ virtual ~IEnergyMeter() = default;
+ virtual ndk::ScopedAStatus readEnergyMeter(
+ const std::vector<int32_t>& in_channelIds,
+ std::vector<EnergyMeasurement>* _aidl_return) = 0;
+ virtual ndk::ScopedAStatus getEnergyMeterInfo(std::vector<Channel>* _aidl_return) = 0;
+ };
+
PowerStats() = default;
+
+ void addStateResidencyDataProvider(std::unique_ptr<IStateResidencyDataProvider> p);
+ void addEnergyConsumer(std::unique_ptr<IEnergyConsumer> p);
+ void setEnergyMeter(std::unique_ptr<IEnergyMeter> p);
+
// Methods from aidl::android::hardware::power::stats::IPowerStats
ndk::ScopedAStatus getPowerEntityInfo(std::vector<PowerEntity>* _aidl_return) override;
ndk::ScopedAStatus getStateResidency(const std::vector<int32_t>& in_powerEntityIds,
@@ -37,6 +69,15 @@
ndk::ScopedAStatus getEnergyMeterInfo(std::vector<Channel>* _aidl_return) override;
ndk::ScopedAStatus readEnergyMeter(const std::vector<int32_t>& in_channelIds,
std::vector<EnergyMeasurement>* _aidl_return) override;
+
+ private:
+ std::vector<std::unique_ptr<IStateResidencyDataProvider>> mStateResidencyDataProviders;
+ std::vector<PowerEntity> mPowerEntityInfos;
+
+ std::vector<std::unique_ptr<IEnergyConsumer>> mEnergyConsumers;
+ std::vector<EnergyConsumer> mEnergyConsumerInfos;
+
+ std::unique_ptr<IEnergyMeter> mEnergyMeter;
};
} // namespace stats
diff --git a/power/stats/aidl/default/main.cpp b/power/stats/aidl/default/main.cpp
index 0469b4c..2fe3d2e 100644
--- a/power/stats/aidl/default/main.cpp
+++ b/power/stats/aidl/default/main.cpp
@@ -16,16 +16,61 @@
#include "PowerStats.h"
+#include "FakeEnergyConsumer.h"
+#include "FakeEnergyMeter.h"
+#include "FakeStateResidencyDataProvider.h"
+
#include <android-base/logging.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
+using aidl::android::hardware::power::stats::EnergyConsumerType;
+using aidl::android::hardware::power::stats::FakeEnergyConsumer;
+using aidl::android::hardware::power::stats::FakeEnergyMeter;
+using aidl::android::hardware::power::stats::FakeStateResidencyDataProvider;
using aidl::android::hardware::power::stats::PowerStats;
+using aidl::android::hardware::power::stats::State;
+
+void setFakeEnergyMeter(std::shared_ptr<PowerStats> p) {
+ p->setEnergyMeter(
+ std::make_unique<FakeEnergyMeter>(std::vector<std::pair<std::string, std::string>>{
+ {"Rail1", "Display"},
+ {"Rail2", "CPU"},
+ {"Rail3", "Modem"},
+ }));
+}
+
+void addFakeStateResidencyDataProvider1(std::shared_ptr<PowerStats> p) {
+ p->addStateResidencyDataProvider(std::make_unique<FakeStateResidencyDataProvider>(
+ "CPU", std::vector<State>{{0, "Idle"}, {1, "Active"}}));
+}
+
+void addFakeStateResidencyDataProvider2(std::shared_ptr<PowerStats> p) {
+ p->addStateResidencyDataProvider(std::make_unique<FakeStateResidencyDataProvider>(
+ "Display", std::vector<State>{{0, "Off"}, {1, "On"}}));
+}
+
+void addFakeEnergyConsumer1(std::shared_ptr<PowerStats> p) {
+ p->addEnergyConsumer(std::make_unique<FakeEnergyConsumer>(EnergyConsumerType::OTHER, "GPU"));
+}
+
+void addFakeEnergyConsumer2(std::shared_ptr<PowerStats> p) {
+ p->addEnergyConsumer(
+ std::make_unique<FakeEnergyConsumer>(EnergyConsumerType::MOBILE_RADIO, "MODEM"));
+}
int main() {
ABinderProcess_setThreadPoolMaxThreadCount(0);
std::shared_ptr<PowerStats> p = ndk::SharedRefBase::make<PowerStats>();
+ setFakeEnergyMeter(p);
+
+ addFakeStateResidencyDataProvider1(p);
+ addFakeStateResidencyDataProvider2(p);
+
+ addFakeEnergyConsumer1(p);
+ addFakeEnergyConsumer2(p);
+
const std::string instance = std::string() + PowerStats::descriptor + "/default";
binder_status_t status = AServiceManager_addService(p->asBinder().get(), instance.c_str());
CHECK(status == STATUS_OK);
diff --git a/radio/1.6/IRadio.hal b/radio/1.6/IRadio.hal
index 411a09e..d201332 100644
--- a/radio/1.6/IRadio.hal
+++ b/radio/1.6/IRadio.hal
@@ -347,8 +347,9 @@
/**
* Requests to set the network type for searching and registering.
*
- * Instruct the radio to *only* accept the types of network provided. This
- * is stronger than setPreferredNetworkType which is a suggestion.
+ * Instruct the radio to *only* accept the types of network provided.
+ * setPreferredNetworkType, setPreferredNetworkTypesBitmap will not be called anymore
+ * except for IRadio v1.5 or older devices.
*
* In case of an emergency call, the modem is authorized to bypass this
* restriction.
@@ -356,24 +357,22 @@
* @param serial Serial number of request.
* @param networkTypeBitmap a 32-bit bearer bitmap of RadioAccessFamily
*
- * Response callback is IRadioResponse.setNetworkTypeBitmapResponse()
+ * Response callback is IRadioResponse.setAllowedNetworkTypesBitmapResponse()
*/
- oneway setAllowedNetworkTypeBitmap(
+ oneway setAllowedNetworkTypesBitmap(
uint32_t serial, bitfield<RadioAccessFamily> networkTypeBitmap);
/**
* Requests bitmap representing the currently allowed network types.
*
- * Requests the bitmap set by the corresponding method
- * setAllowedNetworkTypeBitmap, which sets a strict set of RATs for the
- * radio to use. Differs from getPreferredNetworkType and getPreferredNetworkTypeBitmap
- * in that those request *preferences*.
+ * getPreferredNetworkType, getPreferredNetworkTypesBitmap will not be called anymore
+ * except for IRadio v1.5 or older devices.
*
* @param serial Serial number of request.
*
- * Response callback is IRadioResponse.getNetworkTypeBitmapResponse()
+ * Response callback is IRadioResponse.getAllowedNetworkTypesBitmapResponse()
*/
- oneway getAllowedNetworkTypeBitmap(uint32_t serial);
+ oneway getAllowedNetworkTypesBitmap(uint32_t serial);
/**
* Control data throttling at modem.
diff --git a/radio/1.6/IRadioResponse.hal b/radio/1.6/IRadioResponse.hal
index a4744e1..56ce809 100644
--- a/radio/1.6/IRadioResponse.hal
+++ b/radio/1.6/IRadioResponse.hal
@@ -298,7 +298,7 @@
oneway cancelHandoverResponse(RadioResponseInfo info);
/**
- * Callback of IRadio.setAllowedNetworkTypeBitmap(int, bitfield<RadioAccessFamily>)
+ * Callback of IRadio.setAllowedNetworkTypesBitmap(int, bitfield<RadioAccessFamily>)
*
* Valid errors returned:
* RadioError:NONE
@@ -311,10 +311,12 @@
* RadioError:REQUEST_NOT_SUPPORTED
* RadioError:NO_RESOURCES
*/
- oneway setAllowedNetworkTypeBitmapResponse(RadioResponseInfo info);
+ oneway setAllowedNetworkTypesBitmapResponse(RadioResponseInfo info);
/**
- * Callback of IRadio.getAllowedNetworkTypeBitmap(int, bitfield<RadioAccessFamily>)
+ * Callback of IRadio.getAllowedNetworkTypesBitmap(int, bitfield<RadioAccessFamily>)
+ * @param info Response info struct containing response type, serial no. and error
+ * @param networkTypeBitmap a 32-bit bitmap of RadioAccessFamily.
*
* Valid errors returned:
* RadioError:NONE
@@ -327,7 +329,7 @@
* RadioError:REQUEST_NOT_SUPPORTED
* RadioError:NO_RESOURCES
*/
- oneway getAllowedNetworkTypeBitmapResponse(
+ oneway getAllowedNetworkTypesBitmapResponse(
RadioResponseInfo info, bitfield<RadioAccessFamily> networkTypeBitmap);
/**
diff --git a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h
index 7bf8cc5..23378b5 100644
--- a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h
+++ b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h
@@ -789,10 +789,10 @@
Return<void> cancelHandoverResponse(
const ::android::hardware::radio::V1_6::RadioResponseInfo& info);
- Return<void> setAllowedNetworkTypeBitmapResponse(
+ Return<void> setAllowedNetworkTypesBitmapResponse(
const ::android::hardware::radio::V1_6::RadioResponseInfo& info);
- Return<void> getAllowedNetworkTypeBitmapResponse(
+ Return<void> getAllowedNetworkTypesBitmapResponse(
const ::android::hardware::radio::V1_6::RadioResponseInfo& info,
const ::android::hardware::hidl_bitfield<
::android::hardware::radio::V1_4::RadioAccessFamily>
diff --git a/radio/1.6/vts/functional/radio_response.cpp b/radio/1.6/vts/functional/radio_response.cpp
index 6e17064..8034fd2 100644
--- a/radio/1.6/vts/functional/radio_response.cpp
+++ b/radio/1.6/vts/functional/radio_response.cpp
@@ -1155,14 +1155,14 @@
return Void();
}
-Return<void> RadioResponse_v1_6::setAllowedNetworkTypeBitmapResponse(
+Return<void> RadioResponse_v1_6::setAllowedNetworkTypesBitmapResponse(
const ::android::hardware::radio::V1_6::RadioResponseInfo& info) {
rspInfo = info;
parent_v1_6.notify(info.serial);
return Void();
}
-Return<void> RadioResponse_v1_6::getAllowedNetworkTypeBitmapResponse(
+Return<void> RadioResponse_v1_6::getAllowedNetworkTypesBitmapResponse(
const ::android::hardware::radio::V1_6::RadioResponseInfo& /*info*/,
const ::android::hardware::hidl_bitfield<
::android::hardware::radio::V1_4::RadioAccessFamily>