diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 766424ef4b..dc60f91db7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -304,17 +304,17 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // once the event loop has started, check and signal for an access token QMetaObject::invokeMethod(&accountManager, "checkAndSignalForAccessToken", Qt::QueuedConnection); - AddressManager& addressManager = AddressManager::getInstance(); + AddressManager* addressManager = DependencyManager::get(); // use our MyAvatar position and quat for address manager path - addressManager.setPositionGetter(getPositionForPath); - addressManager.setOrientationGetter(getOrientationForPath); + addressManager->setPositionGetter(getPositionForPath); + addressManager->setOrientationGetter(getOrientationForPath); // handle domain change signals from AddressManager - connect(&addressManager, &AddressManager::possibleDomainChangeRequiredToHostname, + connect(addressManager, &AddressManager::possibleDomainChangeRequiredToHostname, this, &Application::changeDomainHostname); - connect(&addressManager, &AddressManager::possibleDomainChangeRequiredViaICEForID, + connect(addressManager, &AddressManager::possibleDomainChangeRequiredViaICEForID, &domainHandler, &DomainHandler::setIceServerHostnameAndID); _settings = new QSettings(this); @@ -841,7 +841,7 @@ bool Application::event(QEvent* event) { QFileOpenEvent* fileEvent = static_cast(event); if (!fileEvent->url().isEmpty()) { - AddressManager::getInstance().handleLookupString(fileEvent->url().toString()); + DependencyManager::get()->handleLookupString(fileEvent->url().toString()); } return false; @@ -1953,22 +1953,13 @@ void Application::init() { // when --url in command line, teleport to location const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); + QString addressLookupString; if (urlIndex != -1) { - AddressManager::getInstance().handleLookupString(arguments().value(urlIndex + 1)); - } else { - // check if we have a URL in settings to load to jump back to - // we load this separate from the other settings so we don't double lookup a URL - QSettings* interfaceSettings = lockSettings(); - QVariant addressVariant = interfaceSettings->value(SETTINGS_ADDRESS_KEY); - - QString addressString = addressVariant.isNull() - ? DEFAULT_HIFI_ADDRESS : addressVariant.toUrl().toString(); - - unlockSettings(); - - AddressManager::getInstance().handleLookupString(addressString); + addressLookupString = arguments().value(urlIndex + 1); } + DependencyManager::get()->loadSettings(addressLookupString); + qDebug() << "Loaded settings"; #ifdef __APPLE__ @@ -3615,7 +3606,7 @@ void Application::updateWindowTitle(){ QString connectionStatus = nodeList->getDomainHandler().isConnected() ? "" : " (NOT CONNECTED) "; QString username = AccountManager::getInstance().getAccountInfo().getUsername(); QString title = QString() + (!username.isEmpty() ? username + " @ " : QString()) - + AddressManager::getInstance().getCurrentDomain() + connectionStatus + buildVersion; + + DependencyManager::get()->getCurrentDomain() + connectionStatus + buildVersion; AccountManager& accountManager = AccountManager::getInstance(); if (accountManager.getAccountInfo().hasBalance()) { @@ -3646,7 +3637,7 @@ void Application::updateLocationInServer() { QJsonObject locationObject; - QString pathString = AddressManager::getInstance().currentPath(); + QString pathString = DependencyManager::get()->currentPath(); const QString LOCATION_KEY_IN_ROOT = "location"; const QString PATH_KEY_IN_LOCATION = "path"; @@ -4189,7 +4180,7 @@ void Application::uploadAttachment() { void Application::openUrl(const QUrl& url) { if (!url.isEmpty()) { if (url.scheme() == HIFI_URL_SCHEME) { - AddressManager::getInstance().handleLookupString(url.toString()); + DependencyManager::get()->handleLookupString(url.toString()); } else { // address manager did not handle - ask QDesktopServices to handle QDesktopServices::openUrl(url); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 6c2c3966fc..eacd9ee419 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -155,9 +155,9 @@ Menu::Menu() : connect(&accountManager, &AccountManager::logoutComplete, this, &Menu::toggleLoginMenuItem); // connect to signal of account manager so we can tell user when the user/place they looked at is offline - AddressManager& addressManager = AddressManager::getInstance(); - connect(&addressManager, &AddressManager::lookupResultIsOffline, this, &Menu::displayAddressOfflineMessage); - connect(&addressManager, &AddressManager::lookupResultIsNotFound, this, &Menu::displayAddressNotFoundMessage); + AddressManager* addressManager = DependencyManager::get(); + connect(addressManager, &AddressManager::lookupResultIsOffline, this, &Menu::displayAddressOfflineMessage); + connect(addressManager, &AddressManager::lookupResultIsNotFound, this, &Menu::displayAddressNotFoundMessage); addDisabledActionAndSeparator(fileMenu, "Scripts"); addActionToQMenuAndActionHash(fileMenu, MenuOption::LoadScript, Qt::CTRL | Qt::Key_O, appInstance, SLOT(loadDialog())); @@ -763,8 +763,6 @@ void Menu::saveSettings(QSettings* settings) { scanMenuBar(&saveAction, settings); Application::getInstance()->getAvatar()->saveData(settings); - - settings->setValue(SETTINGS_ADDRESS_KEY, AddressManager::getInstance().currentAddress()); if (lockedSettings) { Application::getInstance()->unlockSettings(); @@ -1198,7 +1196,7 @@ void Menu::displayNameLocationResponse(const QString& errorString) { void Menu::toggleLocationList() { if (!_userLocationsDialog) { JavascriptObjectMap locationObjectMap; - locationObjectMap.insert("InterfaceLocation", &AddressManager::getInstance()); + locationObjectMap.insert("InterfaceLocation", DependencyManager::get()); _userLocationsDialog = DataWebDialog::dialogForPath("/user/locations", locationObjectMap); } @@ -1242,7 +1240,7 @@ void Menu::nameLocation() { if (!_newLocationDialog) { JavascriptObjectMap locationObjectMap; - locationObjectMap.insert("InterfaceLocation", &AddressManager::getInstance()); + locationObjectMap.insert("InterfaceLocation", DependencyManager::get()); _newLocationDialog = DataWebDialog::dialogForPath("/user/locations/new", locationObjectMap); } diff --git a/interface/src/Menu.h b/interface/src/Menu.h index e2c687fff1..6a89fbc92d 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -51,8 +51,6 @@ const float ADJUST_LOD_MAX_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE; const float MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 0.1f; const float MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 15.0f; -const QString SETTINGS_ADDRESS_KEY = "address"; - enum FrustumDrawMode { FRUSTUM_DRAW_MODE_ALL, FRUSTUM_DRAW_MODE_VECTORS, diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 057b1f1fc6..1534e9ea5a 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -102,7 +102,7 @@ MyAvatar::MyAvatar() : _skeletonModel.buildRagdoll(); // connect to AddressManager signal for location jumps - connect(&AddressManager::getInstance(), &AddressManager::locationChangeRequired, this, &MyAvatar::goToLocation); + connect(DependencyManager::get(), &AddressManager::locationChangeRequired, this, &MyAvatar::goToLocation); } MyAvatar::~MyAvatar() { diff --git a/interface/src/scripting/LocationScriptingInterface.cpp b/interface/src/scripting/LocationScriptingInterface.cpp index 5ead0100e2..cd732218a5 100644 --- a/interface/src/scripting/LocationScriptingInterface.cpp +++ b/interface/src/scripting/LocationScriptingInterface.cpp @@ -19,7 +19,7 @@ LocationScriptingInterface* LocationScriptingInterface::getInstance() { } QScriptValue LocationScriptingInterface::locationGetter(QScriptContext* context, QScriptEngine* engine) { - return engine->newQObject(&AddressManager::getInstance()); + return engine->newQObject(DependencyManager::get()); } QScriptValue LocationScriptingInterface::locationSetter(QScriptContext* context, QScriptEngine* engine) { @@ -28,11 +28,11 @@ QScriptValue LocationScriptingInterface::locationSetter(QScriptContext* context, if (argumentVariant.canConvert(QMetaType::QVariantMap)) { // this argument is a variant map, so we'll assume it's an address map - QMetaObject::invokeMethod(&AddressManager::getInstance(), "goToAddressFromObject", + QMetaObject::invokeMethod(DependencyManager::get(), "goToAddressFromObject", Q_ARG(const QVariantMap&, argumentVariant.toMap())); } else { // just try and convert the argument to a string, should be a hifi:// address - QMetaObject::invokeMethod(&AddressManager::getInstance(), "handleLookupString", + QMetaObject::invokeMethod(DependencyManager::get(), "handleLookupString", Q_ARG(const QString&, argumentVariant.toString())); } diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index dbc29be71a..6a53e4c76b 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -121,8 +121,8 @@ void AddressBarDialog::showEvent(QShowEvent* event) { void AddressBarDialog::accept() { if (!_addressLineEdit->text().isEmpty()) { _goButton->setIcon(QIcon(Application::resourcesPath() + ADDRESSBAR_GO_BUTTON_ACTIVE_ICON)); - AddressManager& addressManager = AddressManager::getInstance(); - connect(&addressManager, &AddressManager::lookupResultsFinished, this, &QDialog::hide); - addressManager.handleLookupString(_addressLineEdit->text()); + AddressManager* addressManager = DependencyManager::get(); + connect(addressManager, &AddressManager::lookupResultsFinished, this, &QDialog::hide); + addressManager->handleLookupString(_addressLineEdit->text()); } } \ No newline at end of file diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 747b4ae68d..14cc10ec35 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -171,7 +171,7 @@ bool ChatWindow::eventFilter(QObject* sender, QEvent* event) { } else if (event->type() == QEvent::MouseButtonRelease) { QVariant userVar = sender->property("user"); if (userVar.isValid()) { - AddressManager::getInstance().goToUser(userVar.toString()); + DependencyManager::get()->goToUser(userVar.toString()); return true; } } diff --git a/interface/src/ui/DataWebPage.cpp b/interface/src/ui/DataWebPage.cpp index b8b6649276..75c86cd617 100644 --- a/interface/src/ui/DataWebPage.cpp +++ b/interface/src/ui/DataWebPage.cpp @@ -36,7 +36,7 @@ bool DataWebPage::acceptNavigationRequest(QWebFrame* frame, const QNetworkReques return true; } else { // this is a hifi URL - have the AddressManager handle it - QMetaObject::invokeMethod(&AddressManager::getInstance(), "handleLookupString", + QMetaObject::invokeMethod(DependencyManager::get(), "handleLookupString", Qt::AutoConnection, Q_ARG(const QString&, request.url().toString())); return false; } diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 81b3a1328b..dc5f606333 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -21,11 +21,6 @@ #include "AddressManager.h" -AddressManager& AddressManager::getInstance() { - static AddressManager sharedInstance; - return sharedInstance; -} - AddressManager::AddressManager() : _currentDomain(), _positionGetter(NULL), @@ -48,6 +43,27 @@ const QUrl AddressManager::currentAddress() const { return hifiURL; } +const QString ADDRESS_MANAGER_SETTINGS_GROUP = "AddressManager"; +const QString SETTINGS_CURRENT_ADDRESS_KEY = "address"; + +void AddressManager::loadSettings(const QString& lookupString) { + if (lookupString.isEmpty()) { + QSettings settings; + settings.beginGroup(ADDRESS_MANAGER_SETTINGS_GROUP); + handleLookupString(settings.value(SETTINGS_CURRENT_ADDRESS_KEY).toString()); + } else { + handleLookupString(lookupString); + } +} + +void AddressManager::storeCurrentAddress() { + QSettings settings; + + settings.beginGroup(ADDRESS_MANAGER_SETTINGS_GROUP); + settings.setValue(SETTINGS_CURRENT_ADDRESS_KEY, currentAddress()); + settings.endGroup(); +} + const QString AddressManager::currentPath(bool withOrientation) const { if (_positionGetter) { diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index cfdaaa7d41..33939c6325 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -17,6 +17,8 @@ #include #include +#include + #include "AccountManager.h" const QString HIFI_URL_SCHEME = "hifi"; @@ -25,7 +27,7 @@ const QString DEFAULT_HIFI_ADDRESS = "hifi://sandbox"; typedef const glm::vec3& (*PositionGetter)(); typedef glm::quat (*OrientationGetter)(); -class AddressManager : public QObject { +class AddressManager : public QObject, public DependencyManager::Dependency { Q_OBJECT Q_PROPERTY(bool isConnected READ isConnected) Q_PROPERTY(QUrl href READ currentAddress) @@ -34,8 +36,6 @@ class AddressManager : public QObject { Q_PROPERTY(QString pathname READ currentPath) Q_PROPERTY(QString domainID READ getDomainID) public: - static AddressManager& getInstance(); - bool isConnected(); const QString& getProtocol() { return HIFI_URL_SCHEME; }; @@ -50,6 +50,10 @@ public: void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; } void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; } + void loadSettings(const QString& lookupString = QString()); + + friend class DependencyManager; + public slots: void handleLookupString(const QString& lookupString); void goToUser(const QString& username); @@ -64,12 +68,13 @@ signals: void locationChangeRequired(const glm::vec3& newPosition, bool hasOrientationChange, const glm::quat& newOrientation, bool shouldFaceLocation); +protected: + AddressManager(); private slots: void handleAPIResponse(QNetworkReply& requestReply); void handleAPIError(QNetworkReply& errorReply); + void storeCurrentAddress(); private: - AddressManager(); - void setDomainHostnameAndName(const QString& hostname, const QString& domainName = QString()); const JSONCallbackParameters& apiCallbackParameters();