summaryrefslogtreecommitdiff
path: root/include/binder/app_launch_event.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/binder/app_launch_event.h')
-rw-r--r--include/binder/app_launch_event.h448
1 files changed, 0 insertions, 448 deletions
diff --git a/include/binder/app_launch_event.h b/include/binder/app_launch_event.h
deleted file mode 100644
index 0127e09..0000000
--- a/include/binder/app_launch_event.h
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef IORAP_BINDER_APP_LAUNCH_EVENT_H_
-#define IORAP_BINDER_APP_LAUNCH_EVENT_H_
-
-#include "binder/common.h"
-#include "common/introspection.h"
-#include "common/expected.h"
-
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
-#include <frameworks/base/core/proto/android/content/intent.pb.h> // IntentProto
-#include <frameworks/base/core/proto/android/server/activitymanagerservice.pb.h> // ActivityRecord
-
-namespace iorap {
-namespace binder {
-
-// These protos are part of the iorapd binder ABI, alias them for easier usage.
-using IntentProto = ::android::content::IntentProto;
-using ActivityRecordProto = ::com::android::server::wm::ActivityRecordProto;
-
-struct AppLaunchEvent : public ::android::Parcelable {
- // Index position matters: Keep up-to-date with AppLaunchEvent.java sTypes field.
- enum class Type : int32_t {
- kUninitialized = -1,
- kIntentStarted = 0,
- kIntentFailed = 1,
- kActivityLaunched = 2,
- kActivityLaunchFinished = 3,
- kActivityLaunchCancelled = 4,
- kReportFullyDrawn = 5,
- };
-
- enum class Temperature : int32_t {
- kUninitialized = -1,
- kCold = 1,
- kWarm = 2,
- kHot = 3,
- };
-
- Type type{Type::kUninitialized};
- int64_t sequence_id{-1};
- // kIntentStarted only.
- std::unique_ptr<IntentProto> intent_proto;
- // kActivityLaunched only.
- Temperature temperature{Temperature::kUninitialized};
- // kActivityLaunch*. Can be null in kActivityLaunchCancelled.
- std::unique_ptr<ActivityRecordProto> activity_record_proto;
- // kIntentStarted, kActivityLaunchFinished and kReportFullyDrawn only.
- int64_t timestamp_nanos{-1};
-
- AppLaunchEvent() = default;
- AppLaunchEvent(Type type,
- int64_t sequence_id,
- std::unique_ptr<IntentProto> intent_proto = nullptr,
- Temperature temperature = Temperature::kUninitialized,
- std::unique_ptr<ActivityRecordProto> activity_record_proto = nullptr,
- int64_t timestamp_nanos = -1)
- : type(type),
- sequence_id(sequence_id),
- intent_proto(std::move(intent_proto)),
- temperature(temperature),
- activity_record_proto(std::move(activity_record_proto)),
- timestamp_nanos(timestamp_nanos) {
- }
-
- AppLaunchEvent(const AppLaunchEvent& other) {
- *this = other;
- }
-
- AppLaunchEvent& operator=(const AppLaunchEvent& other) {
- if (&other == this) {
- return *this;
- }
-
- type = other.type;
- sequence_id = other.sequence_id;
- if (other.intent_proto != nullptr) {
- intent_proto.reset(new IntentProto(*other.intent_proto));
- }
- temperature = other.temperature;
- if (other.activity_record_proto != nullptr) {
- activity_record_proto.reset(new ActivityRecordProto(*other.activity_record_proto));
- }
- timestamp_nanos = other.timestamp_nanos;
-
- return *this;
- }
-
- ::android::status_t readFromParcel(const android::Parcel* parcel) override {
-
-# define PARCEL_READ_OR_RETURN(function, ...) \
- if (::android::status_t res = function(__VA_ARGS__); res != ::android::NO_ERROR) { \
- LOG(ERROR) << "AppLaunchEvent::readFromParcel failed"; \
- return res; \
- }
-
- int32_t type_int;
- PARCEL_READ_OR_RETURN(parcel->readInt32, &type_int);
- type = static_cast<Type>(type_int);
-
- LOG(VERBOSE) << "AppLaunchEvent::readFromParcel (type=" << type_int << ")";
-
- PARCEL_READ_OR_RETURN(parcel->readInt64, &sequence_id);
-
- switch (type) {
- case Type::kIntentStarted:
- PARCEL_READ_OR_RETURN(readIntent, parcel);
- PARCEL_READ_OR_RETURN(parcel->readInt64, &timestamp_nanos);
- break;
- case Type::kIntentFailed:
- // No extra arguments.
- break;
- case Type::kActivityLaunched: {
- PARCEL_READ_OR_RETURN(readActivityRecordProto, parcel);
- int32_t temperature_int;
- PARCEL_READ_OR_RETURN(parcel->readInt32, &temperature_int);
- temperature = static_cast<Temperature>(temperature_int);
- break;
- }
- case Type::kActivityLaunchFinished:
- PARCEL_READ_OR_RETURN(readActivityRecordProto, parcel);
- PARCEL_READ_OR_RETURN(parcel->readInt64, &timestamp_nanos);
- break;
- case Type::kActivityLaunchCancelled:
- PARCEL_READ_OR_RETURN(readActivityRecordProtoNullable, parcel);
- break;
- case Type::kReportFullyDrawn:
- PARCEL_READ_OR_RETURN(readActivityRecordProto, parcel);
- PARCEL_READ_OR_RETURN(parcel->readInt64, &timestamp_nanos);
- break;
- default:
- return android::BAD_VALUE;
- }
-# undef PARCEL_READ_OR_RETURN
-
- return ::android::NO_ERROR;
-
- // TODO: std::variant + protobuf implementation in AutoParcelable.
- }
-
-#define PARCEL_WRITE_OR_RETURN(function, ...) \
- if (::android::status_t res = function(__VA_ARGS__); res != ::android::NO_ERROR) { \
- return res; \
- }
-
- ::android::status_t writeToParcel(android::Parcel* parcel) const override {
- PARCEL_WRITE_OR_RETURN(parcel->writeInt32, static_cast<int32_t>(type));
- PARCEL_WRITE_OR_RETURN(parcel->writeInt64, sequence_id);
-
- switch (type) {
- case Type::kIntentStarted:
- PARCEL_WRITE_OR_RETURN(writeIntent, parcel);
- PARCEL_WRITE_OR_RETURN(parcel->writeInt64, timestamp_nanos);
- break;
- case Type::kIntentFailed:
- // No extra arguments.
- break;
- case Type::kActivityLaunched:
- PARCEL_WRITE_OR_RETURN(writeActivityRecordProto, parcel);
- PARCEL_WRITE_OR_RETURN(parcel->writeInt32, static_cast<int32_t>(temperature));
- break;
- case Type::kActivityLaunchFinished:
- PARCEL_WRITE_OR_RETURN(writeActivityRecordProto, parcel);
- PARCEL_WRITE_OR_RETURN(parcel->writeInt64, timestamp_nanos);
- break;
- case Type::kActivityLaunchCancelled:
- PARCEL_WRITE_OR_RETURN(writeActivityRecordProtoNullable, parcel);
- break;
- case Type::kReportFullyDrawn:
- PARCEL_WRITE_OR_RETURN(writeActivityRecordProtoNullable, parcel);
- PARCEL_WRITE_OR_RETURN(parcel->writeInt64, timestamp_nanos);
- break;
- default:
- DCHECK(false) << "attempted to write an uninitialized AppLaunchEvent to Parcel";
- return android::BAD_VALUE;
- }
-
-#undef PARCEL_WRITE_OR_RETURN
-
- return android::NO_ERROR;
- }
-
- private:
- // Using 'unique_ptr' here because protobufs don't have a move constructor. Is there
- // a better way that is cheap to pass them around?
- template <typename T>
- static expected<std::unique_ptr<T>, ::android::status_t>
- ReadProto(const android::Parcel* parcel) {
- DCHECK(parcel != nullptr);
-
- ::android::status_t res;
-
- std::vector<uint8_t> byte_vector;
- if ((res = parcel->readByteVector(/*out*/&byte_vector)) != ::android::NO_ERROR) {
- return unexpected(res);
- }
- // TODO: we may want to do this without an extra copy, by parsing
- // the protobuf directly out of the parcel.
-
- const uint8_t* data = byte_vector.data();
- const size_t size = byte_vector.size();
-
- std::unique_ptr<T> proto_ptr{new T{}};
-
- if (!proto_ptr) {
- return unexpected(::android::NO_MEMORY);
- }
-
- if (!proto_ptr->ParseFromArray(data, size)) {
- return unexpected(::android::BAD_VALUE);
- }
-
- return proto_ptr;
- }
-
- template <typename T>
- static expected<std::unique_ptr<T>, ::android::status_t>
- ReadNullableProto(const android::Parcel* parcel) {
- DCHECK(parcel != nullptr);
-
- bool value;
-
- ::android::status_t res;
- res = parcel->readBool(/*out*/&value);
-
- if (res != ::android::NO_ERROR) {
- return unexpected(res);
- }
-
- if (!value) {
- return std::unique_ptr<T>{nullptr};
- }
-
- return ReadProto<T>(parcel);
- }
-
- template <typename T>
- static ::android::status_t
- WriteProto(android::Parcel* parcel, const std::unique_ptr<T>& proto) {
- DCHECK(parcel != nullptr);
- DCHECK(proto != nullptr);
-
- std::vector<uint8_t> byte_vector;
- {
- const int serialized_size = proto->ByteSize();
- byte_vector.resize(serialized_size);
- if (!proto->SerializeToArray(byte_vector.data(), serialized_size)) {
- return ::android::BAD_VALUE;
- }
- }
-
- ::android::status_t res;
- if ((res = parcel->writeByteVector(/*in*/byte_vector)) != ::android::NO_ERROR) {
- return res;
- }
-
- return ::android::NO_ERROR;
- }
-
- template <typename T>
- static ::android::status_t
- WriteNullableProto(android::Parcel* parcel, const std::unique_ptr<T>& maybe_proto) {
- bool value = (maybe_proto != nullptr);
-
- ::android::status_t res;
- res = parcel->writeBool(value);
-
- if (res != ::android::NO_ERROR) {
- return res;
- }
-
- if (!value) {
- return ::android::NO_ERROR;
- }
-
- return WriteProto<T>(parcel, maybe_proto);
- }
-
- android::status_t readIntent(const android::Parcel* parcel) {
- expected<std::unique_ptr<IntentProto>, ::android::status_t> maybe_intent =
- ReadProto<IntentProto>(parcel);
-
- if (maybe_intent) {
- intent_proto = std::move(maybe_intent.value());
- return ::android::NO_ERROR;
- } else {
- return maybe_intent.error();
- }
- }
-
- android::status_t readActivityRecordProto(const android::Parcel* parcel) {
- expected<std::unique_ptr<ActivityRecordProto>, ::android::status_t> maybe_record =
- ReadProto<ActivityRecordProto>(parcel);
-
- if (maybe_record) {
- activity_record_proto = std::move(maybe_record.value());
- return ::android::NO_ERROR;
- } else {
- return maybe_record.error();
- }
- }
-
- android::status_t readActivityRecordProtoNullable(const android::Parcel* parcel) {
- expected<std::unique_ptr<ActivityRecordProto>, ::android::status_t> maybe_record =
- ReadNullableProto<ActivityRecordProto>(parcel);
-
- if (maybe_record) {
- activity_record_proto = std::move(maybe_record.value());
- return ::android::NO_ERROR;
- } else {
- return maybe_record.error();
- }
- }
-
- android::status_t writeIntent(android::Parcel* parcel) const {
- return WriteProto<IntentProto>(parcel, intent_proto);
- }
-
- android::status_t writeActivityRecordProto(android::Parcel* parcel) const {
- return WriteProto<ActivityRecordProto>(parcel, activity_record_proto);
- }
-
- android::status_t writeActivityRecordProtoNullable(android::Parcel* parcel) const {
- return WriteNullableProto<ActivityRecordProto>(parcel, activity_record_proto);
- }
-};
-
-inline std::ostream& operator<<(std::ostream& os, const AppLaunchEvent::Type& type) {
- switch (type) {
- case AppLaunchEvent::Type::kUninitialized:
- os << "kUninitialized";
- break;
- case AppLaunchEvent::Type::kIntentStarted:
- os << "kIntentStarted";
- break;
- case AppLaunchEvent::Type::kIntentFailed:
- os << "kIntentFailed";
- break;
- case AppLaunchEvent::Type::kActivityLaunched:
- os << "kActivityLaunched";
- break;
- case AppLaunchEvent::Type::kActivityLaunchCancelled:
- os << "kActivityLaunchCancelled";
- break;
- case AppLaunchEvent::Type::kActivityLaunchFinished:
- os << "kActivityLaunchFinished";
- break;
- case AppLaunchEvent::Type::kReportFullyDrawn:
- os << "kReportFullyDrawn";
- break;
- default:
- os << "(unknown)";
- }
- return os;
-}
-
-inline std::ostream& operator<<(std::ostream& os, const AppLaunchEvent::Temperature& type) {
- switch (type) {
- case AppLaunchEvent::Temperature::kUninitialized:
- os << "kUninitialized";
- break;
- case AppLaunchEvent::Temperature::kCold:
- os << "kCold";
- break;
- case AppLaunchEvent::Temperature::kWarm:
- os << "kWarm";
- break;
- case AppLaunchEvent::Temperature::kHot:
- os << "kHot";
- break;
- default:
- os << "(unknown)";
- }
- return os;
-}
-
-inline std::ostream& operator<<(std::ostream& os, const AppLaunchEvent& e) {
- os << "AppLaunchEvent{";
- os << "type=" << e.type << ",";
- os << "sequence_id=" << e.sequence_id << ",";
-
- os << "intent_proto=";
- if (e.intent_proto == nullptr) {
- os << "(nullptr)";
- } else {
- os << "(action=" << e.intent_proto->action() << ",";
- os << "component=";
- if (e.intent_proto->has_component()) {
- // $package/$class_name
- os << e.intent_proto->component().package_name() << "/"
- << e.intent_proto->component().class_name();
- } else {
- os << "(no component)";
- }
- os << ")";
- }
- os << ",";
-
- os << "temperature=" << e.temperature << ",";
- os << ",";
-
- os << "activity_record_proto=";
- if (e.activity_record_proto == nullptr) {
- os << "(nullptr)";
- } else {
- // title or component name.
- os << "'" << e.activity_record_proto->identifier().title() << "'";
- }
- os << ",";
-
- os << "timestamp_nanos=" << e.timestamp_nanos << ",";
- os << ",";
-
- os << "}";
-
- return os;
-}
-
-/*
-IORAP_INTROSPECT_ADAPT_STRUCT(AppLaunchEvent,
- type,
- sequence_id,
- intent_proto,
- temperature,
- activity_record_proto);
-*/
-
-} // namespace binder
-} // namespace iorap
-
-IORAP_JAVA_NAMESPACE_BINDER_TYPEDEF(AppLaunchEvent)
-
-#endif // IORAP_BINDER_APP_LAUNCH_EVENT_H_