package adonai.diary_browser; import java.util.Deque; import java.util.LinkedList; public class BrowseHistory implements DiaryWebView.PositionTracker { private Deque<SavedPageInfo> savedPages = new LinkedList<>(); private boolean backRequested; public void add(String url) { try { // обновляем страницу, а не загружаем новую. Запись в историю не нужна // позицию устанавливаем в 0, т.к. нам не нужно пролистывание при обновлении if (!isEmpty() && !backRequested && getUrl().equals(url)) { savedPages.peek().position = 0; return; } // убеждаемся, что это не результат нажатия кнопки "назад" if (!backRequested) { savedPages.push(new SavedPageInfo(url)); } } finally { backRequested = false; } } public void moveBack() { backRequested = true; savedPages.pop(); } public boolean hasPrevious() { return savedPages.size() > 1; } public boolean isEmpty() { return savedPages.isEmpty(); } public String getUrl() { return savedPages.peek().url; } @Override public void savePosition(String url, int position) { for(SavedPageInfo pInfo : savedPages) { if(pInfo.url.equals(url)) { pInfo.position = position; return; } } } @Override public int restorePosition(String url) { for(SavedPageInfo pInfo : savedPages) { if(pInfo.url.equals(url)) { return pInfo.position; } } return 0; } private class SavedPageInfo { private String url; private Integer position = 0; public SavedPageInfo(String url) { this.url = url; } } }