final void notifyHandshakeCompletedListeners() {
        List<HandshakeCompletedListener> listenersCopy = new ArrayList<>(listeners);
        if (!listenersCopy.isEmpty()) {
            // notify the listeners
            HandshakeCompletedEvent event = new HandshakeCompletedEvent(this, getActiveSession());
            for (HandshakeCompletedListener listener : listenersCopy) {
                try {
                    listener.handshakeCompleted(event);
                } catch (RuntimeException e) {
                    // The RI runs the handlers in a separate thread,
                    // which we do not. But we try to preserve their
                    // behavior of logging a problem and not killing
                    // the handshaking thread just because a listener
                    // has a problem.
                    Thread thread = Thread.currentThread();
                    thread.getUncaughtExceptionHandler().uncaughtException(thread, e);
                }
            }
        }
    }
Called by {@link #notifyHandshakeCompletedListeners()} to get the currently active session.
Unlike {@link #getSession()}, this method must not block.
common/src/main/java/org/conscrypt/AbstractConscryptSocket.java