code: private void executeHideShowCycle(final ContentScene contentScene) {
          // When there is no ongoing show-hide execution chain, create a new one
          if (nextContentScene == null) {
              nextContentScene = contentScene;
              new ExecutionChain(mGvrContext).runOnMainThread(new Runnable() {
                  @Override
                  public void run() {
                      ContentScene localNextContentScene = null;
  
                      // Recursively execute hide-show cycle until stablized
                      while (nextContentScene != localNextContentScene) {
                          localNextContentScene = nextContentScene;
  
                          if (curContentScene == localNextContentScene) {
                              Log.d(TAG,
                                      "skip the same scene to show %s",
                                      curContentScene.getName());
                              break;
                          }
  
                          // Hide current contentScene
                          if (curContentScene != null) {
                              Log.d(TAG,
                                      "executeHideShowCycle(): hiding %s",
                                      curContentScene.getName());
                              curContentScene.hide();
                              WidgetLib.getTouchManager().setFlingHandler(null);
                          }
  
                          // Show next contentScene
                          if (localNextContentScene != null) {
                              Log.d(TAG,
                                      "executeHideShowCycle(): showing %s",
                                      localNextContentScene.getName());
                              localNextContentScene.show();
                              WidgetLib.getTouchManager().setFlingHandler(
                                      localNextContentScene.getFlingHandler());
  
                              curContentScene = localNextContentScene;
                          }
                      }
  
                      nextContentScene = null;
                  }
              }).execute();
          } else {
              nextContentScene = contentScene;
          }
      }
docs: Execute a task in the {@linkplain MainThread#runOnMainThread(Runnable)
  main thread} and {@link ContentScene#hide() hide()} has been called on
  the {@link ContentScene} at the top of the view stack (if there is one).
  <p>
  The task's {@link Runnable#run() run()} method may freely manipulate the
  {@code ContentScene} view stack.
  <p>
  After the task has been run, if there is a {@code ContentScene} on the
  view stack, {@code drawFrameListener} will be re-registered and
  {@link ContentScene#show() show()} will be called on the
  {@code ContentScene}.
  
  @param contentScene
  The {@link Runnable} to execute.