xref: /aosp_15_r20/frameworks/base/cmds/incidentd/src/IncidentService.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2016 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 #ifndef INCIDENT_SERVICE_H
19*d57664e9SAndroid Build Coastguard Worker #define INCIDENT_SERVICE_H
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include "Reporter.h"
22*d57664e9SAndroid Build Coastguard Worker 
23*d57664e9SAndroid Build Coastguard Worker #include "Broadcaster.h"
24*d57664e9SAndroid Build Coastguard Worker #include "Throttler.h"
25*d57664e9SAndroid Build Coastguard Worker #include "WorkDirectory.h"
26*d57664e9SAndroid Build Coastguard Worker 
27*d57664e9SAndroid Build Coastguard Worker #include <android/os/BnIncidentManager.h>
28*d57664e9SAndroid Build Coastguard Worker #include <utils/Looper.h>
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker #include <vector>
31*d57664e9SAndroid Build Coastguard Worker #include <mutex>
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker namespace android {
35*d57664e9SAndroid Build Coastguard Worker namespace os {
36*d57664e9SAndroid Build Coastguard Worker namespace incidentd {
37*d57664e9SAndroid Build Coastguard Worker 
38*d57664e9SAndroid Build Coastguard Worker using namespace android;
39*d57664e9SAndroid Build Coastguard Worker using namespace android::base;
40*d57664e9SAndroid Build Coastguard Worker using namespace android::binder;
41*d57664e9SAndroid Build Coastguard Worker using namespace android::os;
42*d57664e9SAndroid Build Coastguard Worker 
43*d57664e9SAndroid Build Coastguard Worker class BringYourOwnSection;
44*d57664e9SAndroid Build Coastguard Worker 
45*d57664e9SAndroid Build Coastguard Worker // ================================================================================
46*d57664e9SAndroid Build Coastguard Worker class ReportHandler : public MessageHandler {
47*d57664e9SAndroid Build Coastguard Worker public:
48*d57664e9SAndroid Build Coastguard Worker     ReportHandler(const sp<WorkDirectory>& workDirectory,
49*d57664e9SAndroid Build Coastguard Worker                   const sp<Broadcaster>& broadcaster,
50*d57664e9SAndroid Build Coastguard Worker                   const sp<Looper>& handlerLooper,
51*d57664e9SAndroid Build Coastguard Worker                   const sp<Throttler>& throttler,
52*d57664e9SAndroid Build Coastguard Worker                   const vector<BringYourOwnSection*>& registeredSections);
53*d57664e9SAndroid Build Coastguard Worker     virtual ~ReportHandler();
54*d57664e9SAndroid Build Coastguard Worker 
55*d57664e9SAndroid Build Coastguard Worker     virtual void handleMessage(const Message& message);
56*d57664e9SAndroid Build Coastguard Worker 
57*d57664e9SAndroid Build Coastguard Worker     /**
58*d57664e9SAndroid Build Coastguard Worker      * Schedule a report for the "main" report, where it will be delivered to
59*d57664e9SAndroid Build Coastguard Worker      * the uploaders and/or dropbox.
60*d57664e9SAndroid Build Coastguard Worker      */
61*d57664e9SAndroid Build Coastguard Worker     void schedulePersistedReport(const IncidentReportArgs& args);
62*d57664e9SAndroid Build Coastguard Worker 
63*d57664e9SAndroid Build Coastguard Worker     /**
64*d57664e9SAndroid Build Coastguard Worker      * Adds a ReportRequest to the queue for one that has a listener an and fd
65*d57664e9SAndroid Build Coastguard Worker      */
66*d57664e9SAndroid Build Coastguard Worker     void scheduleStreamingReport(const IncidentReportArgs& args,
67*d57664e9SAndroid Build Coastguard Worker                                     const sp<IIncidentReportStatusListener>& listener,
68*d57664e9SAndroid Build Coastguard Worker                                     int streamFd);
69*d57664e9SAndroid Build Coastguard Worker 
70*d57664e9SAndroid Build Coastguard Worker     /**
71*d57664e9SAndroid Build Coastguard Worker      * Resets mBacklogDelay to the default and schedules sending
72*d57664e9SAndroid Build Coastguard Worker      * the messages to dropbox.
73*d57664e9SAndroid Build Coastguard Worker      */
74*d57664e9SAndroid Build Coastguard Worker     void scheduleSendBacklog();
75*d57664e9SAndroid Build Coastguard Worker 
76*d57664e9SAndroid Build Coastguard Worker private:
77*d57664e9SAndroid Build Coastguard Worker     mutex mLock;
78*d57664e9SAndroid Build Coastguard Worker 
79*d57664e9SAndroid Build Coastguard Worker     sp<WorkDirectory> mWorkDirectory;
80*d57664e9SAndroid Build Coastguard Worker     sp<Broadcaster> mBroadcaster;
81*d57664e9SAndroid Build Coastguard Worker 
82*d57664e9SAndroid Build Coastguard Worker     sp<Looper> mHandlerLooper;
83*d57664e9SAndroid Build Coastguard Worker     nsecs_t mBacklogDelay;
84*d57664e9SAndroid Build Coastguard Worker     sp<Throttler> mThrottler;
85*d57664e9SAndroid Build Coastguard Worker 
86*d57664e9SAndroid Build Coastguard Worker     const vector<BringYourOwnSection*>& mRegisteredSections;
87*d57664e9SAndroid Build Coastguard Worker 
88*d57664e9SAndroid Build Coastguard Worker     sp<ReportBatch> mBatch;
89*d57664e9SAndroid Build Coastguard Worker 
90*d57664e9SAndroid Build Coastguard Worker     /**
91*d57664e9SAndroid Build Coastguard Worker      * Runs all of the reports that have been queued.
92*d57664e9SAndroid Build Coastguard Worker      */
93*d57664e9SAndroid Build Coastguard Worker     void take_report();
94*d57664e9SAndroid Build Coastguard Worker 
95*d57664e9SAndroid Build Coastguard Worker     /**
96*d57664e9SAndroid Build Coastguard Worker      * Schedules permission controller approve the reports.
97*d57664e9SAndroid Build Coastguard Worker      */
98*d57664e9SAndroid Build Coastguard Worker     void schedule_send_approvals_locked();
99*d57664e9SAndroid Build Coastguard Worker 
100*d57664e9SAndroid Build Coastguard Worker     /**
101*d57664e9SAndroid Build Coastguard Worker      * Sends the approvals to the PermissionController
102*d57664e9SAndroid Build Coastguard Worker      */
103*d57664e9SAndroid Build Coastguard Worker     void send_approvals();
104*d57664e9SAndroid Build Coastguard Worker 
105*d57664e9SAndroid Build Coastguard Worker     /**
106*d57664e9SAndroid Build Coastguard Worker      * Schedules the broadcasts that reports are complete mBacklogDelay nanoseconds from now.
107*d57664e9SAndroid Build Coastguard Worker      * The delay is because typically when an incident report is taken, the system is not
108*d57664e9SAndroid Build Coastguard Worker      * really in a happy state.  So we wait a bit before sending the report to let things
109*d57664e9SAndroid Build Coastguard Worker      * quiet down if they can.  The urgency is in taking the report, not sharing the report.
110*d57664e9SAndroid Build Coastguard Worker      * However, we don
111*d57664e9SAndroid Build Coastguard Worker      */
112*d57664e9SAndroid Build Coastguard Worker     void schedule_send_broadcasts_locked();
113*d57664e9SAndroid Build Coastguard Worker 
114*d57664e9SAndroid Build Coastguard Worker     /**
115*d57664e9SAndroid Build Coastguard Worker      * Sends the broadcasts to the dropbox service.
116*d57664e9SAndroid Build Coastguard Worker      */
117*d57664e9SAndroid Build Coastguard Worker     void send_broadcasts();
118*d57664e9SAndroid Build Coastguard Worker };
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker // ================================================================================
121*d57664e9SAndroid Build Coastguard Worker class IncidentService : public BnIncidentManager {
122*d57664e9SAndroid Build Coastguard Worker public:
123*d57664e9SAndroid Build Coastguard Worker     explicit IncidentService(const sp<Looper>& handlerLooper);
124*d57664e9SAndroid Build Coastguard Worker     virtual ~IncidentService();
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker     virtual Status reportIncident(const IncidentReportArgs& args);
127*d57664e9SAndroid Build Coastguard Worker 
128*d57664e9SAndroid Build Coastguard Worker     virtual Status reportIncidentToStream(const IncidentReportArgs& args,
129*d57664e9SAndroid Build Coastguard Worker                                           const sp<IIncidentReportStatusListener>& listener,
130*d57664e9SAndroid Build Coastguard Worker                                           unique_fd stream);
131*d57664e9SAndroid Build Coastguard Worker 
132*d57664e9SAndroid Build Coastguard Worker     virtual Status reportIncidentToDumpstate(unique_fd stream,
133*d57664e9SAndroid Build Coastguard Worker             const sp<IIncidentReportStatusListener>& listener);
134*d57664e9SAndroid Build Coastguard Worker 
135*d57664e9SAndroid Build Coastguard Worker     virtual Status registerSection(int id, const String16& name,
136*d57664e9SAndroid Build Coastguard Worker             const sp<IIncidentDumpCallback>& callback);
137*d57664e9SAndroid Build Coastguard Worker 
138*d57664e9SAndroid Build Coastguard Worker     virtual Status unregisterSection(int id);
139*d57664e9SAndroid Build Coastguard Worker 
140*d57664e9SAndroid Build Coastguard Worker     virtual Status systemRunning();
141*d57664e9SAndroid Build Coastguard Worker 
142*d57664e9SAndroid Build Coastguard Worker     virtual Status getIncidentReportList(const String16& pkg, const String16& cls,
143*d57664e9SAndroid Build Coastguard Worker             vector<String16>* result);
144*d57664e9SAndroid Build Coastguard Worker 
145*d57664e9SAndroid Build Coastguard Worker     virtual Status getIncidentReport(const String16& pkg, const String16& cls,
146*d57664e9SAndroid Build Coastguard Worker             const String16& id, IncidentManager::IncidentReport* result);
147*d57664e9SAndroid Build Coastguard Worker 
148*d57664e9SAndroid Build Coastguard Worker     virtual Status deleteIncidentReports(const String16& pkg, const String16& cls,
149*d57664e9SAndroid Build Coastguard Worker             const String16& id);
150*d57664e9SAndroid Build Coastguard Worker 
151*d57664e9SAndroid Build Coastguard Worker     virtual Status deleteAllIncidentReports(const String16& pkg);
152*d57664e9SAndroid Build Coastguard Worker 
153*d57664e9SAndroid Build Coastguard Worker     // Implement commands for debugging purpose.
154*d57664e9SAndroid Build Coastguard Worker     virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply,
155*d57664e9SAndroid Build Coastguard Worker                                 uint32_t flags) override;
156*d57664e9SAndroid Build Coastguard Worker     virtual status_t command(FILE* in, FILE* out, FILE* err, Vector<String8>& args);
157*d57664e9SAndroid Build Coastguard Worker 
158*d57664e9SAndroid Build Coastguard Worker private:
159*d57664e9SAndroid Build Coastguard Worker     sp<WorkDirectory> mWorkDirectory;
160*d57664e9SAndroid Build Coastguard Worker     sp<Broadcaster> mBroadcaster;
161*d57664e9SAndroid Build Coastguard Worker     sp<ReportHandler> mHandler;
162*d57664e9SAndroid Build Coastguard Worker     sp<Throttler> mThrottler;
163*d57664e9SAndroid Build Coastguard Worker     vector<BringYourOwnSection*> mRegisteredSections;
164*d57664e9SAndroid Build Coastguard Worker 
165*d57664e9SAndroid Build Coastguard Worker     /**
166*d57664e9SAndroid Build Coastguard Worker      * Commands print out help.
167*d57664e9SAndroid Build Coastguard Worker      */
168*d57664e9SAndroid Build Coastguard Worker     status_t cmd_help(FILE* out);
169*d57664e9SAndroid Build Coastguard Worker 
170*d57664e9SAndroid Build Coastguard Worker     /**
171*d57664e9SAndroid Build Coastguard Worker      * Commands related to privacy filtering.
172*d57664e9SAndroid Build Coastguard Worker      */
173*d57664e9SAndroid Build Coastguard Worker     status_t cmd_privacy(FILE* in, FILE* out, FILE* err, Vector<String8>& args);
174*d57664e9SAndroid Build Coastguard Worker };
175*d57664e9SAndroid Build Coastguard Worker 
176*d57664e9SAndroid Build Coastguard Worker }  // namespace incidentd
177*d57664e9SAndroid Build Coastguard Worker }  // namespace os
178*d57664e9SAndroid Build Coastguard Worker }  // namespace android
179*d57664e9SAndroid Build Coastguard Worker 
180*d57664e9SAndroid Build Coastguard Worker #endif  // INCIDENT_SERVICE_H
181