Здравствуйте,
На самом деле, это очень сложный вопрос.
Начну с того, что гарантированно узнать, что вкладка была закрыта в веб-приложении нельзя. В связи с сетевыми нюансами, это можно понять только через длительный период неактивности. Веб-браузеры не позволяют выполнить AJAX запрос на закрытии вкладки приложения.
Отдельная сложность состоит в том, что при замещении пользователя, UI вкладки полностью перестраивается с нуля и поэтому слушатель будет выполняться в условиях, когда сессия уже обновлена, а UI перестроен.
Для определения своей глобальной логики после замещения пользователя вам может подойти событие приложения UserSessionSubstitutedEvent
, оно выбрасывается, когда замещение уже выполнено и все вкладки приложения обновлены.
Если событие замещения нужно обработать в UI контроллере, то можно добавить UserSubstitutionListener
для объекта Connection
, например в контроллере главного экрана:
import com.haulmont.cuba.web.Connection;
...
@Inject
protected Connection connection;
@Override
public void init(Map<String, Object> params) {
super.init(params);
connection.addUserSubstitutionListener(event -> {
showNotification("Substituted");
});
Важный момент, что эти слушатели удаляются после выполнения выхода из приложения.
Ну и последняя опция - расширить UI компонент UserIndicator
или даже разработать свой, ведь он устроен совсем не сложно. Механизм расширения UI компонентов в платформе позволяет переопределять стандартные компоненты своими наследниками.
Может быть вы поделитесь своей задачей? Я не уверен, что вполне понимаю ваш сценарий использования.