Home | History | Annotate | Download | only in src
      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