blob: 933029709fb6b0caf86c8f488afe9865c6c3a895 [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "WorkDirectory.h"
#include <android/os/BnIncidentAuthListener.h>
#include <android/os/IIncidentCompanion.h>
#include <frameworks/base/cmds/incidentd/src/report_file.pb.h>
namespace android {
namespace os {
namespace incidentd {
using android::binder::Status;
using android::os::BnIncidentAuthListener;
using android::os::IIncidentCompanion;
class ReportHandler;
class Broadcaster : public virtual RefBase {
public:
enum broadcast_status_t {
BROADCASTS_FINISHED = 0,
BROADCASTS_REPEAT = 1,
BROADCASTS_BACKOFF = 2
};
Broadcaster(const sp<WorkDirectory>& workDirectory);
void setHandler(const sp<ReportHandler>& handler);
/**
* Reset the beginning timestamp for broadcasts. Call this when
* the system_server restarts.
*/
void reset();
/**
* Remove the history record for the broadcasts, including pending authorizations
* if necessary.
*/
void clearBroadcasts(const string& pkg, const string& cls, const string& id);
void clearPackageBroadcasts(const string& pkg);
/**
* Send whichever broadcasts have been pending.
*/
broadcast_status_t sendBroadcasts();
private:
struct ReportId {
ReportId();
ReportId(const ReportId& that);
ReportId(const string& i, const string& p, const string& c);
~ReportId();
bool operator<(const ReportId& that) const;
string id;
string pkg;
string cls;
};
class ConsentListener : public BnIncidentAuthListener {
public:
ConsentListener(const sp<Broadcaster>& broadcaster, const ReportId& reportId);
virtual ~ConsentListener();
virtual Status onReportApproved();
virtual Status onReportDenied();
private:
sp<Broadcaster> mBroadcaster;
ReportId mId;
};
struct ReportStatus {
ReportStatus();
ReportStatus(const ReportStatus& that);
~ReportStatus();
bool approval_sent;
bool ready_sent;
sp<ConsentListener> listener;
};
sp<ReportHandler> mReportHandler;
sp<WorkDirectory> mWorkDirectory;
// protected by mLock
mutex mLock;
map<ReportId,ReportStatus> mHistory; // what we sent so we don't send it again
int64_t mLastSent;
void set_last_sent(int64_t timestamp);
int64_t get_last_sent();
void print_report_statuses() const;
status_t send_approval_broadcasts(const string& id, const string& pkg, const string& cls);
void report_approved(const ReportId& reportId);
void report_denied(const ReportId& reportId);
status_t send_report_ready_broadcasts(const string& id, const string& pkg, const string& cls);
status_t send_to_dropbox(const sp<ReportFile>& file, const IncidentReportArgs& args);
bool was_approval_sent(const string& id, const string& pkg, const string& cls);
void set_approval_sent(const string& id, const string& pkg, const string& cls,
const sp<ConsentListener>& listener);
bool was_ready_sent(const string& id, const string& pkg, const string& cls);
void set_ready_sent(const string& id, const string& pkg, const string& cls);
sp<IIncidentCompanion> get_incident_companion();
};
} // namespace incidentd
} // namespace os
} // namespace android