core: Add error reporting for corrupted symbols (#4458)
This commit is contained in:
@@ -54,6 +54,10 @@ public:
|
||||
delegate.invoke(&RendererObserver::onRemoveUnusedStyleImages, ids);
|
||||
}
|
||||
|
||||
void onSymbolError(const std::string& message) override {
|
||||
delegate.invoke(&RendererObserver::onSymbolError, message);
|
||||
}
|
||||
|
||||
void onPreCompileShader(mbgl::shaders::BuiltIn id,
|
||||
mbgl::gfx::Backend::Type type,
|
||||
const std::string& additionalDefines) override {
|
||||
|
||||
@@ -1737,5 +1737,17 @@ void NativeMapView::onRenderError(std::exception_ptr) {
|
||||
}
|
||||
}
|
||||
|
||||
void NativeMapView::onSymbolError(const std::string& message) {
|
||||
assert(vm != nullptr);
|
||||
|
||||
android::UniqueEnv _env = android::AttachEnv();
|
||||
static auto& javaClass = jni::Class<NativeMapView>::Singleton(*_env);
|
||||
static auto onSymbolError = javaClass.GetMethod<void(jni::String)>(*_env, "onSymbolError");
|
||||
auto weakReference = javaPeer.get(*_env);
|
||||
if (weakReference) {
|
||||
weakReference.Call(*_env, onSymbolError, jni::Make<jni::String>(*_env, message));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -367,6 +367,8 @@ public:
|
||||
// Renderer
|
||||
void onRenderError(std::exception_ptr) override;
|
||||
|
||||
void onSymbolError(const std::string&) override;
|
||||
|
||||
private:
|
||||
std::shared_ptr<AndroidRendererFrontend> rendererFrontend;
|
||||
|
||||
|
||||
@@ -60,6 +60,8 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
|
||||
= new CopyOnWriteArrayList<>();
|
||||
private final List<MapView.OnRenderErrorListener> onRenderErrorList
|
||||
= new CopyOnWriteArrayList<>();
|
||||
private final List<MapView.OnSymbolErrorListener> onSymbolErrorList
|
||||
= new CopyOnWriteArrayList<>();
|
||||
|
||||
@Override
|
||||
public void onCameraWillChange(boolean animated) {
|
||||
@@ -440,6 +442,17 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSymbolError(String message) {
|
||||
try {
|
||||
for (MapView.OnSymbolErrorListener listener : onSymbolErrorList) {
|
||||
listener.onSymbolError(message);
|
||||
}
|
||||
} catch (Throwable err) {
|
||||
Logger.e(TAG, "Exception in onSymbolError", err);
|
||||
}
|
||||
}
|
||||
|
||||
void addOnCameraWillChangeListener(MapView.OnCameraWillChangeListener listener) {
|
||||
onCameraWillChangeListenerList.add(listener);
|
||||
}
|
||||
@@ -612,6 +625,10 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
|
||||
onRenderErrorList.add(callback);
|
||||
}
|
||||
|
||||
public void addOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
|
||||
onSymbolErrorList.add(callback);
|
||||
}
|
||||
|
||||
public void removeOnPreCompileShaderListener(MapView.OnPreCompileShaderListener callback) {
|
||||
onPreCompileShaderList.remove(callback);
|
||||
}
|
||||
@@ -656,6 +673,10 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
|
||||
onRenderErrorList.remove(callback);
|
||||
}
|
||||
|
||||
public void removeOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
|
||||
onSymbolErrorList.remove(callback);
|
||||
}
|
||||
|
||||
void clear() {
|
||||
onCameraWillChangeListenerList.clear();
|
||||
onCameraIsChangingListenerList.clear();
|
||||
@@ -683,5 +704,6 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
|
||||
onSpriteErrorList.clear();
|
||||
onSpriteRequestedList.clear();
|
||||
onRenderErrorList.clear();
|
||||
onSymbolErrorList.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1121,6 +1121,19 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
|
||||
mapChangeReceiver.removeOnRenderErrorListener(callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a callback that's invoked after a corrupted symbol is detected
|
||||
*
|
||||
* @param listener The callback that's invoked
|
||||
*/
|
||||
public void addOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
|
||||
mapChangeReceiver.addOnSymbolErrorListener(callback);
|
||||
}
|
||||
|
||||
public void removeOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
|
||||
mapChangeReceiver.removeOnSymbolErrorListener(callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface definition for a callback to be invoked when the camera will change.
|
||||
* <p>
|
||||
@@ -1549,6 +1562,19 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
|
||||
void onRenderError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface definition for a callback to be invoked after a corrupted symbol is detected
|
||||
* <p>
|
||||
* {@link MapView#addOnSymbolErrorListener(OnSymbolErrorListener)}
|
||||
* </p>
|
||||
*/
|
||||
public interface OnSymbolErrorListener {
|
||||
/**
|
||||
* Called when a corrupted symbol is detected.
|
||||
*/
|
||||
void onSymbolError(@NonNull String message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a callback object which will be triggered when the {@link MapLibreMap} instance is ready to be used.
|
||||
*
|
||||
|
||||
@@ -1430,6 +1430,13 @@ final class NativeMapView implements NativeMap {
|
||||
}
|
||||
}
|
||||
|
||||
@Keep
|
||||
private void onSymbolError(String message) {
|
||||
if (stateCallback != null) {
|
||||
stateCallback.onSymbolError(message);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// JNI methods
|
||||
//
|
||||
@@ -1938,5 +1945,7 @@ final class NativeMapView implements NativeMap {
|
||||
void onSpriteRequested(String id, String url);
|
||||
|
||||
void onRenderError();
|
||||
|
||||
void onSymbolError(String message);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user