private void fetch(Context context) {
            if (mARImageTarget != null) {
                return;
            }

            ImageDownloader downloader = new ImageDownloader(context);
            downloader.getImageAsync(mSource, new ImageDownloadListener() {
                @Override
                public boolean isValid() {
                    return true;
                }

                @Override
                public void completed(Bitmap result) {
                    mARImageTarget = new ARImageTarget(result, mOrientation, mPhysicalWidth);

                    synchronized(this) {
                        mReady = true;
                    }

                    for (ARTargetPromiseListener listener : mPromiseListeners) {
                        listener.onComplete(mKey, mARImageTarget);
                    }
                }

                @Override
                public void failed(String error) {
                    String errorMessage = "Failed to download source for target: [" + mKey
                            + "], error:\n" + error;
                    Log.e("ARTrackingTargetsModule", errorMessage);
                    for (ARTargetPromiseListener listener : mPromiseListeners) {
                        listener.onError(new IllegalStateException(errorMessage));
                    }
                    mPromiseListeners = new ArrayList<>();
                }
            });

            // fetch image, create ImageTarget and return if there was a listener.
        }
This method should be called only once and immediately after it is set.
android/viro_bridge/src/main/java/com/viromedia/bridge/module/ARTrackingTargetsModule.java