1932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac/*
2932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * Copyright (C) 2018 The Android Open Source Project
3932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac *
4932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * Licensed under the Apache License, Version 2.0 (the "License");
5932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * you may not use this file except in compliance with the License.
6932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * You may obtain a copy of the License at
7932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac *
8932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac *      http://www.apache.org/licenses/LICENSE-2.0
9932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac *
10932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * Unless required by applicable law or agreed to in writing, software
11932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * distributed under the License is distributed on an "AS IS" BASIS,
12932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * See the License for the specific language governing permissions and
14932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac * limitations under the License.
15932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac */
16932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
17754e29edd76e2d927619e83c660c0d93e98211c8Yangster-mac#define DEBUG false  // STOPSHIP if true
18932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "Log.h"
19932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
20932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include <android/os/IIncidentManager.h>
21932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include <android/os/IncidentReportArgs.h>
22932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include <binder/IServiceManager.h>
23932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
24932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "external/Perfetto.h"
25932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "frameworks/base/libs/incident/proto/android/os/header.pb.h"
26932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "subscriber/IncidentdReporter.h"
27932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "subscriber/SubscriberReporter.h"
28932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
29932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macnamespace android {
30932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macnamespace os {
31932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macnamespace statsd {
32932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
33932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macvoid triggerSubscribers(const int64_t rule_id,
34932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                        const MetricDimensionKey& dimensionKey,
35932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                        const ConfigKey& configKey,
36932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                        const std::vector<Subscription>& subscriptions) {
37932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    VLOG("informSubscribers called.");
38932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    if (subscriptions.empty()) {
39932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        VLOG("No Subscriptions were associated.");
40932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        return;
41932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    }
42932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
43932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    for (const Subscription& subscription : subscriptions) {
44932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        if (subscription.probability_of_informing() < 1
45932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                && ((float)rand() / RAND_MAX) >= subscription.probability_of_informing()) {
46932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            // Note that due to float imprecision, 0.0 and 1.0 might not truly mean never/always.
47932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            // The config writer was advised to use -0.1 and 1.1 for never/always.
48932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            ALOGI("Fate decided that a subscriber would not be informed.");
49932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            continue;
50932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
51932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        switch (subscription.subscriber_information_case()) {
52932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            case Subscription::SubscriberInformationCase::kIncidentdDetails:
53932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                if (!GenerateIncidentReport(subscription.incidentd_details(), rule_id, configKey)) {
54932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                    ALOGW("Failed to generate incident report.");
55932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                }
56932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                break;
57932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            case Subscription::SubscriberInformationCase::kPerfettoDetails:
58d0dd6c7cefb23e0f521aac533087281be2c30bddSami Kyostila                if (!CollectPerfettoTraceAndUploadToDropbox(subscription.perfetto_details(),
59d0dd6c7cefb23e0f521aac533087281be2c30bddSami Kyostila                                                            rule_id, configKey)) {
60d0dd6c7cefb23e0f521aac533087281be2c30bddSami Kyostila                    ALOGW("Failed to generate perfetto traces.");
61932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                }
62932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                break;
63932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            case Subscription::SubscriberInformationCase::kBroadcastSubscriberDetails:
64932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                SubscriberReporter::getInstance().alertBroadcastSubscriber(configKey, subscription,
65932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                                                                           dimensionKey);
66932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                break;
67932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            default:
68932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                break;
69932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
70932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    }
71932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac}
72932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
73932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
74932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac}  // namespace statsd
75932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac}  // namespace os
76932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac}  // namespace android
77