protected FullScreenReadController getFullScreenReadController() {
    final TalkBackService service = TalkBackService.getInstance();
    if (service == null) {
      LogUtils.log(Log.ERROR, "Failed to get TalkBackService instance.");
      return null;
    }

    return service.getFullScreenReadController();
  }
  /** Interrupts the speech controller. */
  private void interrupt() {
    final TalkBackService service = TalkBackService.getInstance();
    if (service == null) {
      LogUtils.log(Log.ERROR, "Failed to get TalkBackService instance.");
      return;
    }

    final SpeechController speechController = service.getSpeechController();
    speechController.interrupt();
  }
  /**
   * Sends the instruction text to the speech controller for queuing.
   *
   * @param resId The resource value of the instruction string.
   * @param formatArgs Optional formatting arguments.
   * @see String#format(String, Object...)
   */
  private void speakInternal(int resId, Object... formatArgs) {
    final TalkBackService service = TalkBackService.getInstance();
    if (service == null) {
      LogUtils.log(Log.ERROR, "Failed to get TalkBackService instance.");
      return;
    }

    final SpeechController speechController = service.getSpeechController();
    final String text = getString(resId, formatArgs);
    speechController.speak(text, null, null, 0, 0, null, null, mUtteranceCompleteRunnable);
  }
  private void show(int which) {
    if ((which < 0) || (which >= mViewAnimator.getChildCount())) {
      LogUtils.log(this, Log.WARN, "Tried to show a module with an index out of bounds.");
      return;
    }

    if (which != mViewAnimator.getDisplayedChild()) {
      // Interrupt speech and stop the previous module.
      mAccessibilityManager.interrupt();
      interrupt();
      stopRepeating();
      mViewAnimator.setOnKeyListener(null);
      getCurrentModule().onPause();
      getCurrentModule().onStop();
    }

    mViewAnimator.setDisplayedChild(which);
  }