docs: public void subscribe(NavigationViewModel navigationViewModel) {
      this.navigationViewModel = navigationViewModel;
      LifecycleOwner owner = (LifecycleOwner) getContext();
      navigationViewModel.instructionModel.observe(owner, new Observer<InstructionModel>() {
        @Override
        public void onChanged(@Nullable InstructionModel model) {
          if (model != null) {
            updateDataFromInstruction(model);
          }
        }
      });
      navigationViewModel.bannerInstructionModel.observe(owner, new Observer<BannerInstructionModel>() {
        @Override
        public void onChanged(@Nullable BannerInstructionModel model) {
          if (model != null) {
            updateManeuverView(model.retrievePrimaryManeuverType(), model.retrieveSecondaryManeuverModifier(),
              model.retrievePrimaryRoundaboutAngle());
            updateDataFromBannerText(model.retrievePrimaryBannerText(), model.retrieveSecondaryBannerText());
            updateSubStep(model.retrieveSubBannerText(), model.retrievePrimaryManeuverType());
          }
        }
      });
      navigationViewModel.isOffRoute.observe(owner, new Observer<Boolean>() {
        @Override
        public void onChanged(@Nullable Boolean isOffRoute) {
          if (isOffRoute != null) {
            if (isOffRoute) {
              showRerouteState();
            } else if (isRerouting) {
              hideRerouteState();
              alertView.showReportProblem();
            }
            isRerouting = isOffRoute;
          }
        }
      });
      subscribeAlertView();
      initializeButtonListeners();
      showButtons();
    }