• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #ifndef INCIDENT_SERVICE_H
19 #define INCIDENT_SERVICE_H
20 
21 #include "Reporter.h"
22 
23 #include "Broadcaster.h"
24 #include "Throttler.h"
25 #include "WorkDirectory.h"
26 
27 #include <android/os/BnIncidentManager.h>
28 #include <utils/Looper.h>
29 
30 #include <vector>
31 #include <mutex>
32 
33 
34 namespace android {
35 namespace os {
36 namespace incidentd {
37 
38 using namespace android;
39 using namespace android::base;
40 using namespace android::binder;
41 using namespace android::os;
42 
43 // ================================================================================
44 class ReportHandler : public MessageHandler {
45 public:
46     ReportHandler(const sp<WorkDirectory>& workDirectory,
47             const sp<Broadcaster>& broadcaster, const sp<Looper>& handlerLooper,
48             const sp<Throttler>& throttler);
49     virtual ~ReportHandler();
50 
51     virtual void handleMessage(const Message& message);
52 
53     /**
54      * Schedule a report for the "main" report, where it will be delivered to
55      * the uploaders and/or dropbox.
56      */
57     void schedulePersistedReport(const IncidentReportArgs& args);
58 
59     /**
60      * Adds a ReportRequest to the queue for one that has a listener an and fd
61      */
62     void scheduleStreamingReport(const IncidentReportArgs& args,
63                                     const sp<IIncidentReportStatusListener>& listener,
64                                     int streamFd);
65 
66     /**
67      * Resets mBacklogDelay to the default and schedules sending
68      * the messages to dropbox.
69      */
70     void scheduleSendBacklog();
71 
72 private:
73     mutex mLock;
74 
75     sp<WorkDirectory> mWorkDirectory;
76     sp<Broadcaster> mBroadcaster;
77 
78     sp<Looper> mHandlerLooper;
79     nsecs_t mBacklogDelay;
80     sp<Throttler> mThrottler;
81 
82     sp<ReportBatch> mBatch;
83 
84     /**
85      * Runs all of the reports that have been queued.
86      */
87     void take_report();
88 
89     /**
90      * Schedules permission controller approve the reports.
91      */
92     void schedule_send_approvals_locked();
93 
94     /**
95      * Sends the approvals to the PermissionController
96      */
97     void send_approvals();
98 
99     /**
100      * Schedules the broadcasts that reports are complete mBacklogDelay nanoseconds from now.
101      * The delay is because typically when an incident report is taken, the system is not
102      * really in a happy state.  So we wait a bit before sending the report to let things
103      * quiet down if they can.  The urgency is in taking the report, not sharing the report.
104      * However, we don
105      */
106     void schedule_send_broadcasts_locked();
107 
108     /**
109      * Sends the broadcasts to the dropbox service.
110      */
111     void send_broadcasts();
112 };
113 
114 // ================================================================================
115 class IncidentService : public BnIncidentManager {
116 public:
117     explicit IncidentService(const sp<Looper>& handlerLooper);
118     virtual ~IncidentService();
119 
120     virtual Status reportIncident(const IncidentReportArgs& args);
121 
122     virtual Status reportIncidentToStream(const IncidentReportArgs& args,
123                                           const sp<IIncidentReportStatusListener>& listener,
124                                           const unique_fd& stream);
125 
126     virtual Status systemRunning();
127 
128     virtual Status getIncidentReportList(const String16& pkg, const String16& cls,
129             vector<String16>* result);
130 
131     virtual Status getIncidentReport(const String16& pkg, const String16& cls,
132             const String16& id, IncidentManager::IncidentReport* result);
133 
134     virtual Status deleteIncidentReports(const String16& pkg, const String16& cls,
135             const String16& id);
136 
137     virtual Status deleteAllIncidentReports(const String16& pkg);
138 
139     // Implement commands for debugging purpose.
140     virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply,
141                                 uint32_t flags) override;
142     virtual status_t command(FILE* in, FILE* out, FILE* err, Vector<String8>& args);
143     virtual status_t dump(int fd, const Vector<String16>& args);
144 
145 private:
146     sp<WorkDirectory> mWorkDirectory;
147     sp<Broadcaster> mBroadcaster;
148     sp<ReportHandler> mHandler;
149     sp<Throttler> mThrottler;
150 
151     /**
152      * Commands print out help.
153      */
154     status_t cmd_help(FILE* out);
155 
156     /**
157      * Commands related to privacy filtering.
158      */
159     status_t cmd_privacy(FILE* in, FILE* out, FILE* err, Vector<String8>& args);
160 };
161 
162 }  // namespace incidentd
163 }  // namespace os
164 }  // namespace android
165 
166 #endif  // INCIDENT_SERVICE_H
167