xref: /aosp_15_r20/frameworks/base/cmds/incidentd/src/Broadcaster.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker #pragma once
17*d57664e9SAndroid Build Coastguard Worker 
18*d57664e9SAndroid Build Coastguard Worker #include "WorkDirectory.h"
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <android/os/BnIncidentAuthListener.h>
21*d57664e9SAndroid Build Coastguard Worker #include <android/os/IIncidentCompanion.h>
22*d57664e9SAndroid Build Coastguard Worker #include <frameworks/base/cmds/incidentd/src/report_file.pb.h>
23*d57664e9SAndroid Build Coastguard Worker 
24*d57664e9SAndroid Build Coastguard Worker namespace android {
25*d57664e9SAndroid Build Coastguard Worker namespace os {
26*d57664e9SAndroid Build Coastguard Worker namespace incidentd {
27*d57664e9SAndroid Build Coastguard Worker 
28*d57664e9SAndroid Build Coastguard Worker using android::binder::Status;
29*d57664e9SAndroid Build Coastguard Worker using android::os::BnIncidentAuthListener;
30*d57664e9SAndroid Build Coastguard Worker using android::os::IIncidentCompanion;
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker class ReportHandler;
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker class Broadcaster : public virtual RefBase {
35*d57664e9SAndroid Build Coastguard Worker public:
36*d57664e9SAndroid Build Coastguard Worker     enum broadcast_status_t {
37*d57664e9SAndroid Build Coastguard Worker         BROADCASTS_FINISHED = 0,
38*d57664e9SAndroid Build Coastguard Worker         BROADCASTS_REPEAT = 1,
39*d57664e9SAndroid Build Coastguard Worker         BROADCASTS_BACKOFF = 2
40*d57664e9SAndroid Build Coastguard Worker     };
41*d57664e9SAndroid Build Coastguard Worker 
42*d57664e9SAndroid Build Coastguard Worker     Broadcaster(const sp<WorkDirectory>& workDirectory);
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker     void setHandler(const sp<ReportHandler>& handler);
45*d57664e9SAndroid Build Coastguard Worker 
46*d57664e9SAndroid Build Coastguard Worker     /**
47*d57664e9SAndroid Build Coastguard Worker      * Reset the beginning timestamp for broadcasts.  Call this when
48*d57664e9SAndroid Build Coastguard Worker      * the system_server restarts.
49*d57664e9SAndroid Build Coastguard Worker      */
50*d57664e9SAndroid Build Coastguard Worker     void reset();
51*d57664e9SAndroid Build Coastguard Worker 
52*d57664e9SAndroid Build Coastguard Worker     /**
53*d57664e9SAndroid Build Coastguard Worker      * Remove the history record for the broadcasts, including pending authorizations
54*d57664e9SAndroid Build Coastguard Worker      * if necessary.
55*d57664e9SAndroid Build Coastguard Worker      */
56*d57664e9SAndroid Build Coastguard Worker     void clearBroadcasts(const string& pkg, const string& cls, const string& id);
57*d57664e9SAndroid Build Coastguard Worker     void clearPackageBroadcasts(const string& pkg);
58*d57664e9SAndroid Build Coastguard Worker 
59*d57664e9SAndroid Build Coastguard Worker     /**
60*d57664e9SAndroid Build Coastguard Worker      * Send whichever broadcasts have been pending.
61*d57664e9SAndroid Build Coastguard Worker      */
62*d57664e9SAndroid Build Coastguard Worker     broadcast_status_t sendBroadcasts();
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker private:
65*d57664e9SAndroid Build Coastguard Worker     struct ReportId {
66*d57664e9SAndroid Build Coastguard Worker         ReportId();
67*d57664e9SAndroid Build Coastguard Worker         ReportId(const ReportId& that);
68*d57664e9SAndroid Build Coastguard Worker         ReportId(const string& i, const string& p, const string& c);
69*d57664e9SAndroid Build Coastguard Worker         ~ReportId();
70*d57664e9SAndroid Build Coastguard Worker 
71*d57664e9SAndroid Build Coastguard Worker         bool operator<(const ReportId& that) const;
72*d57664e9SAndroid Build Coastguard Worker 
73*d57664e9SAndroid Build Coastguard Worker         string id;
74*d57664e9SAndroid Build Coastguard Worker         string pkg;
75*d57664e9SAndroid Build Coastguard Worker         string cls;
76*d57664e9SAndroid Build Coastguard Worker     };
77*d57664e9SAndroid Build Coastguard Worker 
78*d57664e9SAndroid Build Coastguard Worker     class ConsentListener : public BnIncidentAuthListener {
79*d57664e9SAndroid Build Coastguard Worker       public:
80*d57664e9SAndroid Build Coastguard Worker         ConsentListener(const sp<Broadcaster>& broadcaster, const ReportId& reportId);
81*d57664e9SAndroid Build Coastguard Worker         virtual ~ConsentListener();
82*d57664e9SAndroid Build Coastguard Worker         virtual Status onReportApproved();
83*d57664e9SAndroid Build Coastguard Worker         virtual Status onReportDenied();
84*d57664e9SAndroid Build Coastguard Worker       private:
85*d57664e9SAndroid Build Coastguard Worker         sp<Broadcaster> mBroadcaster;
86*d57664e9SAndroid Build Coastguard Worker         ReportId mId;
87*d57664e9SAndroid Build Coastguard Worker     };
88*d57664e9SAndroid Build Coastguard Worker 
89*d57664e9SAndroid Build Coastguard Worker     struct ReportStatus {
90*d57664e9SAndroid Build Coastguard Worker         ReportStatus();
91*d57664e9SAndroid Build Coastguard Worker         ReportStatus(const ReportStatus& that);
92*d57664e9SAndroid Build Coastguard Worker         ~ReportStatus();
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker         bool approval_sent;
95*d57664e9SAndroid Build Coastguard Worker         bool ready_sent;
96*d57664e9SAndroid Build Coastguard Worker         sp<ConsentListener> listener;
97*d57664e9SAndroid Build Coastguard Worker     };
98*d57664e9SAndroid Build Coastguard Worker 
99*d57664e9SAndroid Build Coastguard Worker     sp<ReportHandler> mReportHandler;
100*d57664e9SAndroid Build Coastguard Worker     sp<WorkDirectory> mWorkDirectory;
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker     // protected by mLock
103*d57664e9SAndroid Build Coastguard Worker     mutex mLock;
104*d57664e9SAndroid Build Coastguard Worker     map<ReportId,ReportStatus> mHistory; // what we sent so we don't send it again
105*d57664e9SAndroid Build Coastguard Worker     int64_t mLastSent;
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker     void set_last_sent(int64_t timestamp);
108*d57664e9SAndroid Build Coastguard Worker     int64_t get_last_sent();
109*d57664e9SAndroid Build Coastguard Worker     void print_report_statuses() const;
110*d57664e9SAndroid Build Coastguard Worker     status_t send_approval_broadcasts(const string& id, const string& pkg, const string& cls);
111*d57664e9SAndroid Build Coastguard Worker     void report_approved(const ReportId& reportId);
112*d57664e9SAndroid Build Coastguard Worker     void report_denied(const ReportId& reportId);
113*d57664e9SAndroid Build Coastguard Worker     status_t send_report_ready_broadcasts(const string& id, const string& pkg, const string& cls);
114*d57664e9SAndroid Build Coastguard Worker     status_t send_to_dropbox(const sp<ReportFile>& file, const IncidentReportArgs& args);
115*d57664e9SAndroid Build Coastguard Worker     bool was_approval_sent(const string& id, const string& pkg, const string& cls);
116*d57664e9SAndroid Build Coastguard Worker     void set_approval_sent(const string& id, const string& pkg, const string& cls,
117*d57664e9SAndroid Build Coastguard Worker             const sp<ConsentListener>& listener);
118*d57664e9SAndroid Build Coastguard Worker     bool was_ready_sent(const string& id, const string& pkg, const string& cls);
119*d57664e9SAndroid Build Coastguard Worker     void set_ready_sent(const string& id, const string& pkg, const string& cls);
120*d57664e9SAndroid Build Coastguard Worker     sp<IIncidentCompanion> get_incident_companion();
121*d57664e9SAndroid Build Coastguard Worker };
122*d57664e9SAndroid Build Coastguard Worker 
123*d57664e9SAndroid Build Coastguard Worker 
124*d57664e9SAndroid Build Coastguard Worker }  // namespace incidentd
125*d57664e9SAndroid Build Coastguard Worker }  // namespace os
126*d57664e9SAndroid Build Coastguard Worker }  // namespace android
127*d57664e9SAndroid Build Coastguard Worker 
128