docs: public synchronized void onDataReceived() {
      stopwatch.reset().start();
      // We do not cancel the ping future here. This avoids constantly scheduling and cancellation in
      // a busy transport. Instead, we update the status here and reschedule later. So we actually
      // keep one sendPing task always in flight when there're active rpcs.
      if (state == State.PING_SCHEDULED) {
        state = State.PING_DELAYED;
      } else if (state == State.PING_SENT || state == State.IDLE_AND_PING_SENT) {
        // Ping acked or effectively ping acked. Cancel shutdown, and then if not idle,
        // schedule a new keep-alive ping.
        if (shutdownFuture != null) {
          shutdownFuture.cancel(false);
        }
        if (state == State.IDLE_AND_PING_SENT) {
          // not to schedule new pings until onTransportActive
          state = State.IDLE;
          return;
        }
        // schedule a new ping
        state = State.PING_SCHEDULED;
        checkState(pingFuture == null, "There should be no outstanding pingFuture");
        pingFuture = scheduler.schedule(sendPing, keepAliveTimeInNanos, TimeUnit.NANOSECONDS);
      }
    }