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