diff --git a/include/mbgl/storage/default_file_source.hpp b/include/mbgl/storage/default_file_source.hpp index effc60745e3..9262e0a1bc8 100644 --- a/include/mbgl/storage/default_file_source.hpp +++ b/include/mbgl/storage/default_file_source.hpp @@ -115,7 +115,23 @@ class DefaultFileSource : public FileSource { */ void setOfflineMapboxTileCountLimit(uint64_t) const; + /* + * Pause file request activity. + * + * If pause is called then no revalidation or network request activity + * will occur. + * + * Note: Calling pause and then calling getAPIBaseURL or getAccessToken + * will lock the thread that those calls are made on. + */ void pause(); + + /* + * Resume file request activity. + * + * Calling resume will unpause the file source and process any tasks that + * expired while the file source was paused. + */ void resume(); // For testing only. @@ -127,6 +143,8 @@ class DefaultFileSource : public FileSource { const std::unique_ptr> thread; const std::unique_ptr assetFileSource; const std::unique_ptr localFileSource; + std::string cachedBaseURL = mbgl::util::API_BASE_URL; + std::string cachedAccessToken; }; } // namespace mbgl diff --git a/platform/darwin/src/MGLOfflineStorage.mm b/platform/darwin/src/MGLOfflineStorage.mm index 64f9111f142..9cb472ce5d0 100644 --- a/platform/darwin/src/MGLOfflineStorage.mm +++ b/platform/darwin/src/MGLOfflineStorage.mm @@ -40,12 +40,26 @@ + (instancetype)sharedOfflineStorage { static MGLOfflineStorage *sharedOfflineStorage; dispatch_once(&onceToken, ^{ sharedOfflineStorage = [[self alloc] init]; +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR + [[NSNotificationCenter defaultCenter] addObserver:sharedOfflineStorage selector:@selector(unpauseFileSource:) name:UIApplicationWillEnterForegroundNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:sharedOfflineStorage selector:@selector(pauseFileSource:) name:UIApplicationDidEnterBackgroundNotification object:nil]; +#endif [sharedOfflineStorage reloadPacks]; }); return sharedOfflineStorage; } +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR +- (void)pauseFileSource:(__unused NSNotification *)notification { + _mbglFileSource->pause(); +} + +- (void)unpauseFileSource:(__unused NSNotification *)notification { + _mbglFileSource->resume(); +} +#endif + - (void)setDelegate:(id)newValue { _delegate = newValue; if ([self.delegate respondsToSelector:@selector(offlineStorage:URLForResourceOfKind:withURL:)]) { @@ -203,6 +217,7 @@ + (NSString *)bundleIdentifier { } - (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; [[MGLNetworkConfiguration sharedManager] removeObserver:self forKeyPath:@"apiBaseURL"]; [[MGLAccountManager sharedManager] removeObserver:self forKeyPath:@"accessToken"]; diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp index 46178dbb8a0..20a3eadc8bf 100644 --- a/platform/default/default_file_source.cpp +++ b/platform/default/default_file_source.cpp @@ -176,19 +176,21 @@ DefaultFileSource::DefaultFileSource(const std::string& cachePath, DefaultFileSource::~DefaultFileSource() = default; void DefaultFileSource::setAPIBaseURL(const std::string& baseURL) { - thread->invokeSync(&Impl::setAPIBaseURL, baseURL); + thread->invoke(&Impl::setAPIBaseURL, baseURL); + cachedBaseURL = baseURL; } std::string DefaultFileSource::getAPIBaseURL() const { - return thread->invokeSync(&Impl::getAPIBaseURL); + return cachedBaseURL; } void DefaultFileSource::setAccessToken(const std::string& accessToken) { - thread->invokeSync(&Impl::setAccessToken, accessToken); + thread->invoke(&Impl::setAccessToken, accessToken); + cachedAccessToken = accessToken; } std::string DefaultFileSource::getAccessToken() const { - return thread->invokeSync(&Impl::getAccessToken); + return cachedAccessToken; } void DefaultFileSource::setResourceTransform(std::function transform) { diff --git a/test/storage/default_file_source.test.cpp b/test/storage/default_file_source.test.cpp index ffbeea10961..03f10765591 100644 --- a/test/storage/default_file_source.test.cpp +++ b/test/storage/default_file_source.test.cpp @@ -267,6 +267,22 @@ TEST(DefaultFileSource, OptionalExpired) { loop.run(); } +TEST(DefaultFileSource, GetBaseURLAndAccessTokenWhilePaused) { + util::RunLoop loop; + DefaultFileSource fs(":memory:", "."); + + fs.pause(); + + auto baseURL = "http://url"; + auto accessToken = "access_token"; + + fs.setAPIBaseURL(baseURL); + fs.setAccessToken(accessToken); + + EXPECT_EQ(fs.getAPIBaseURL(), baseURL); + EXPECT_EQ(fs.getAccessToken(), accessToken); +} + TEST(DefaultFileSource, OptionalNotFound) { util::RunLoop loop; DefaultFileSource fs(":memory:", ".");