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