File indexing completed on 2024-04-28 04:41:42

0001 /*
0002     SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #ifndef KPUBLICTRANSPORT_ONBOARDSTATUSMANAGER_H
0007 #define KPUBLICTRANSPORT_ONBOARDSTATUSMANAGER_H
0008 
0009 #include "onboardstatus.h"
0010 #include "positiondata_p.h"
0011 #include "wifimonitor_p.h"
0012 
0013 #include <KPublicTransport/Journey>
0014 
0015 #include <QObject>
0016 #include <QTimer>
0017 
0018 #include <memory>
0019 
0020 class OnboardStatusTest;
0021 class QNetworkAccessManager;
0022 
0023 namespace KPublicTransport {
0024 
0025 class AbstractOnboardBackend;
0026 
0027 /** Singular backend for the OnbardStatus frontend objects.
0028  *  @internal
0029  */
0030 class OnboardStatusManager : public QObject
0031 {
0032     Q_OBJECT
0033 public:
0034     ~OnboardStatusManager();
0035     static OnboardStatusManager* instance();
0036 
0037     OnboardStatus::Status status() const;
0038     PositionData currentPosition() const;
0039     bool supportsPosition() const;
0040     Journey currentJourney() const;
0041     bool supportsJourney() const;
0042 
0043     void registerFrontend(const OnboardStatus *status);
0044     void unregisterFrontend(const OnboardStatus *status);
0045 
0046     void requestPosition();
0047     void requestJourney();
0048 
0049     void requestPermissions();
0050 
0051 Q_SIGNALS:
0052     void statusChanged();
0053     void positionChanged();
0054     void supportsPositionChanged();
0055     void journeyChanged();
0056     void supportsJourneyChanged();
0057 
0058 private:
0059     friend class ::OnboardStatusTest;
0060 
0061     explicit OnboardStatusManager(QObject *parent = nullptr);
0062     void loadAccessPointData();
0063     void loadBackend(const QString &id);
0064     void wifiChanged();
0065     void setStatus(OnboardStatus::Status status);
0066     void positionUpdated(const PositionData &pos);
0067     void journeyUpdated(const Journey &jny);
0068 
0069     void requestUpdate();
0070     void requestForceUpdate();
0071     void scheduleUpdate(bool force);
0072 
0073     QNetworkAccessManager* nam();
0074 
0075     /** @internal exported for unit tests only */
0076     KPUBLICTRANSPORTONBOARD_EXPORT static std::unique_ptr<AbstractOnboardBackend> createBackend(const QString &id);
0077 
0078     WifiMonitor m_wifiMonitor;
0079 
0080     struct AccessPointInfo {
0081         QString ssid;
0082         QString backendId;
0083 
0084         inline bool operator<(const AccessPointInfo &other) const { return ssid < other.ssid; }
0085         inline bool operator<(const QString &otherSsid) const { return ssid < otherSsid; }
0086     };
0087     std::vector<AccessPointInfo> m_accessPointData;
0088 
0089     OnboardStatus::Status m_status = OnboardStatus::NotConnected;
0090     PositionData m_currentPos;
0091     PositionData m_previousPos;
0092     Journey m_journey;
0093 
0094     QNetworkAccessManager *m_nam = nullptr;
0095     std::unique_ptr<AbstractOnboardBackend> m_backend;
0096 
0097     std::vector<const OnboardStatus*> m_frontends;
0098     QTimer m_positionUpdateTimer;
0099     QTimer m_journeyUpdateTimer;
0100     bool m_pendingPositionUpdate = false;
0101     bool m_pendingJourneyUpdate = false;
0102 };
0103 
0104 }
0105 
0106 #endif // KPUBLICTRANSPORT_ONBOARDSTATUSMANAGER_H