code: @Override
      public void end() {
          mTerminated = true;
          if (isStarted()) {
              if (mSortedNodes.size() != mNodes.size()) {
                  // hasn't been started yet - sort the nodes now, then end them
                  sortNodes();
                  for (Node node : mSortedNodes) {
                      if (mSetListener == null) {
                          mSetListener = new AnimatorSetListener(this);
                      }
                      node.animation.addListener(mSetListener);
                  }
              }
              if (mDelayAnim != null) {
                  mDelayAnim.cancel();
              }
              if (mSortedNodes.size() > 0) {
                  for (Node node : mSortedNodes) {
                      node.animation.end();
                  }
              }
              if (mListeners != null) {
                  ArrayList<AnimatorListener> tmpListeners =
                          (ArrayList<AnimatorListener>) mListeners.clone();
                  for (AnimatorListener listener : tmpListeners) {
                      listener.onAnimationEnd(this);
                  }
              }
              mStarted = false;
          }
      }
docs: {@inheritDoc}
  
  <p>Note that ending a <code>AnimatorSet</code> also ends all of the animations that it is
  responsible for.</p>