blob: d9cfa1904005941f29c665b4771ccecec38b850a [file] [log] [blame]
// Copyright 2016 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public License
// version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
#pragma once
#include "android/skin/qt/event-subscriber.h"
#include <QObject>
namespace android {
namespace qt {
class UserActionsCounter : public QObject {
Q_OBJECT
public:
UserActionsCounter(EventCapturer* eventCapturer);
public slots:
// Different window types are treated slightly differently.
// For UI widget containing windows, we are only interested in the button
// clicks and other widget related actions.
// On windows that represent the virtual device itself, all user clicks are
// significant.
void startCountingForMainWindow(QObject* target) {
startCountingAll(target);
}
void startCountingForOverlayWindow(QObject* target) {
startCountingAll(target);
}
void startCountingForToolWindow(QObject* target) {
startCountingMarked(target);
}
void startCountingForExtendedWindow(QObject* target) {
startCountingMarked(target);
}
private slots:
// Stops monitoring events from the given target's hierarchy. This method
// has no effect if the subscriber was not previously subscribed to the
// events from that target.
// This must be connected to a signal from the target. Calling it directly
// (as a function) has no effect.
void stopCountingForEmitter();
public:
// Reset the user action count. Does not stop listening for events on the
// registered objects.
void reset() { mCount = 0; }
uint64_t count() const { return mCount; }
private:
static const char kReportMetricsProperty[];
void startCountingAll(QObject* target);
void startCountingMarked(QObject* target);
bool isMarked(const QObject* target);
void processEvent(const QObject* target, const QEvent* event);
const EventCapturer::EventTypeSet mEventTypes;
EventCapturer* mEventCapturer;
std::unordered_map<QObject*, EventCapturer::SubscriberToken> mTokens;
uint64_t mCount = 0;
};
} // namespace qt
} // namespace android