public void onSessionStarted(DialogStateEvent<BaseSipMessage> event) { super.onSessionStarted(event); BaseSipMessage mes = event.getTriggeringMessage(); if (mes.getSessionExpires() != null) { Refresher refresher = getStackContext().getConfig().getRefresher(); long refreshTime = getStackContext().getConfig().getSessionExpiresTime() / 2; final Dialog dialog = event.getDialog(); // TODO it's recommended in RFC to divide this time by 2. Check. if (mes.getSessionExpires().getRefresher() != null) { refresher = mes.getSessionExpires().getRefresher(); refreshTime = mes.getSessionExpires().getExpiresValue() / 2; } if ((event.getDialog().getInitiateParty() == InitiateParty.LOCAL && refresher == Refresher.UAC) || (event.getDialog().getInitiateParty() == InitiateParty.REMOTE && refresher == Refresher.UAS)) { // we are responsible for handling invite refresh TimeoutTimer.getInstance() .startTimer( new TimeoutListener() { public void onTimeout() { Logger.log(TAG, "listenerForInviteRefresh.onTimeout()"); try { reInvite(dialog); } catch (DialogStateException e) { e.printStackTrace(); assert false : "exception during invite refresh " + dialog + " " + e.toString(); } } }, 32000 /*refreshTime*/); } } }