Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
Cherry picks to release branch (#9230)
Browse files Browse the repository at this point in the history
* [ios][macos] test remove source in use

* [android] test remove source in use

* [core] check source usage before remove

* [core] ensure layer::accept works with non-void return values on gcc

* [android] - remove upgrade runtime exceptions (#9191)
  • Loading branch information
tobrun authored Jun 9, 2017
1 parent fa972fa commit 6ec5e4f
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 16 deletions.
7 changes: 7 additions & 0 deletions include/mbgl/style/layer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
#include <mbgl/style/layer_type.hpp>
#include <mbgl/style/types.hpp>

#include <cassert>
#include <memory>
#include <string>
#include <stdexcept>

namespace mbgl {
namespace style {
Expand Down Expand Up @@ -96,6 +98,11 @@ class Layer : public mbgl::util::noncopyable {
case LayerType::FillExtrusion:
return visitor(*as<FillExtrusionLayer>());
}


// Not reachable, but placate GCC.
assert(false);
throw new std::runtime_error("unknown layer type");
}

const std::string& getID() const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ public class MapView extends FrameLayout {

private MapboxMap mapboxMap;
private MapCallback mapCallback;
private boolean onStartCalled;
private boolean onStopCalled;

private MapGestureDetector mapGestureDetector;
private MapKeyListener mapKeyListener;
Expand Down Expand Up @@ -233,7 +231,6 @@ public void onSaveInstanceState(@NonNull Bundle outState) {
*/
@UiThread
public void onStart() {
onStartCalled = true;
mapboxMap.onStart();
ConnectivityReceiver.instance(getContext()).activate();
}
Expand All @@ -243,27 +240,22 @@ public void onStart() {
*/
@UiThread
public void onResume() {
if (!onStartCalled) {
// TODO: 26/10/16, can be removed after 5.0.0 release
throw new IllegalStateException("MapView#onStart() was not called. "
+ "You must call this method from the parent's {@link Activity#onStart()} or {@link Fragment#onStart()}.");
}
// replaced by onStart in v5.0.0
}

/**
* You must call this method from the parent's {@link Activity#onPause()} or {@link Fragment#onPause()}.
*/
@UiThread
public void onPause() {
// replaced by onStop in v5.0.0, keep around for future development
// replaced by onStop in v5.0.0
}

/**
* You must call this method from the parent's {@link Activity#onStop()} or {@link Fragment#onStop()}.
*/
@UiThread
public void onStop() {
onStopCalled = true;
mapboxMap.onStop();
ConnectivityReceiver.instance(getContext()).deactivate();
}
Expand All @@ -273,12 +265,6 @@ public void onStop() {
*/
@UiThread
public void onDestroy() {
if (!onStopCalled) {
// TODO: 26/10/16, can be removed after 5.0.0 release
throw new IllegalStateException("MapView#onStop() was not called. "
+ "You must call this method from the parent's {@link Activity#onStop()} or {@link Fragment#onStop()}.");
}

destroyed = true;
nativeMapView.terminateContext();
nativeMapView.terminateDisplay();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.mapbox.mapboxsdk.style.layers.CircleLayer;
import com.mapbox.mapboxsdk.style.layers.FillLayer;
import com.mapbox.mapboxsdk.style.layers.Layer;
import com.mapbox.mapboxsdk.style.layers.LineLayer;
import com.mapbox.mapboxsdk.style.layers.Property;
import com.mapbox.mapboxsdk.style.layers.PropertyFactory;
import com.mapbox.mapboxsdk.style.sources.CannotAddSourceException;
Expand Down Expand Up @@ -223,6 +224,23 @@ public void testGeoJsonSourceUrlGetter() throws MalformedURLException {
assertEquals("http://mapbox.com/my-file.json", source.getUrl());
}

@Test
public void testRemoveSourceInUse() {
validateTestSetup();

onView(withId(R.id.mapView)).perform(new BaseViewAction() {

@Override
public void perform(UiController uiController, View view) {
mapboxMap.addSource(new VectorSource("my-source", "mapbox://mapbox.mapbox-terrain-v2"));
mapboxMap.addLayer(new LineLayer("my-layer", "my-source"));
mapboxMap.removeSource("my-source");
assertNotNull(mapboxMap.getSource("my-source"));
}

});
}

/**
* https://github.com/mapbox/mapbox-gl-native/issues/7973
*/
Expand Down
16 changes: 16 additions & 0 deletions platform/darwin/test/MGLStyleTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,22 @@ - (void)testAddingSourceOfTypeABeforeSourceOfTypeBWithSameIdentifier {
XCTAssertTrue([[self.style sourceWithIdentifier:shapeSource.identifier] isMemberOfClass:[MGLVectorSource class]]);
}

- (void)testRemovingSourceInUse {
// Add a raster source
MGLRasterSource *rasterSource = [[MGLRasterSource alloc] initWithIdentifier:@"some-identifier" tileURLTemplates:@[] options:nil];
[self.style addSource:rasterSource];

// Add a layer using it
MGLFillStyleLayer *fillLayer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"fillLayer" source:rasterSource];
[self.style addLayer:fillLayer];

// Attempt to remove the raster source
[self.style removeSource:rasterSource];

// Ensure it is still there
XCTAssertTrue([[self.style sourceWithIdentifier:rasterSource.identifier] isMemberOfClass:[MGLRasterSource class]]);
}

- (void)testLayers {
NSArray<MGLStyleLayer *> *initialLayers = self.style.layers;
if ([initialLayers.firstObject.identifier isEqualToString:@"com.mapbox.annotations.points"]) {
Expand Down
23 changes: 23 additions & 0 deletions src/mbgl/style/style.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,30 @@ void Style::addSource(std::unique_ptr<Source> source) {
sources.emplace_back(std::move(source));
}

struct SourceIdUsageEvaluator {
const std::string& sourceId;

bool operator()(BackgroundLayer&) { return false; }
bool operator()(CustomLayer&) { return false; }

template <class LayerType>
bool operator()(LayerType& layer) {
return layer.getSourceID() == sourceId;
}
};

std::unique_ptr<Source> Style::removeSource(const std::string& id) {
// Check if source is in use
SourceIdUsageEvaluator sourceIdEvaluator {id};
auto layerIt = std::find_if(layers.begin(), layers.end(), [&](const auto& layer) {
return layer->accept(sourceIdEvaluator);
});

if (layerIt != layers.end()) {
Log::Warning(Event::General, "Source '%s' is in use, cannot remove", id.c_str());
return nullptr;
}

auto it = std::find_if(sources.begin(), sources.end(), [&](const auto& source) {
return source->getID() == id;
});
Expand Down
32 changes: 32 additions & 0 deletions test/style/style.test.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
#include <mbgl/test/util.hpp>
#include <mbgl/test/stub_file_source.hpp>
#include <mbgl/test/fixture_log_observer.hpp>

#include <mbgl/style/style.hpp>
#include <mbgl/style/source_impl.hpp>
#include <mbgl/style/sources/vector_source.hpp>
#include <mbgl/style/layer.hpp>
#include <mbgl/style/layers/line_layer.hpp>
#include <mbgl/util/io.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/default_thread_pool.hpp>
Expand Down Expand Up @@ -67,3 +69,33 @@ TEST(Style, DuplicateSource) {
// Expected
}
}

TEST(Style, RemoveSourceInUse) {
util::RunLoop loop;

auto log = new FixtureLogObserver();
Log::setObserver(std::unique_ptr<Log::Observer>(log));

ThreadPool threadPool{ 1 };
StubFileSource fileSource;
Style style { threadPool, fileSource, 1.0 };

style.setJSON(util::read_file("test/fixtures/resources/style-unused-sources.json"));

style.addSource(std::make_unique<VectorSource>("sourceId", "mapbox://mapbox.mapbox-terrain-v2"));
style.addLayer(std::make_unique<LineLayer>("layerId", "sourceId"));

// Should not remove the source
auto removed = style.removeSource("sourceId");
ASSERT_EQ(nullptr, removed);
ASSERT_NE(nullptr, style.getSource("sourceId"));

const FixtureLogObserver::LogMessage logMessage {
EventSeverity::Warning,
Event::General,
int64_t(-1),
"Source 'sourceId' is in use, cannot remove",
};

EXPECT_EQ(log->count(logMessage), 1u);
}

0 comments on commit 6ec5e4f

Please sign in to comment.