package net.nightwhistler.pageturner.view; import android.graphics.Color; import android.util.Log; import com.google.inject.Inject; import net.nightwhistler.pageturner.Configuration; import net.nightwhistler.pageturner.dto.HighLight; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * Manages highlights for a book. * * @author Alex Kuiper */ public class HighlightManager { private List<HighLight> currentHighlights = new ArrayList<>(); private String currentFileName; private static final HighlightComparator COMP = new HighlightComparator(); @Inject private Configuration config; private void updateBookFile( String fileName ) { if ( currentFileName != null && !currentFileName.equals(fileName) ) { saveHighLights(); } if ( fileName == null ) { this.currentHighlights = new ArrayList<>(); } else if ( ! fileName.equals(currentFileName) ) { this.currentHighlights = config.getHightLights(fileName); sort( this.currentHighlights ); } this.currentFileName = fileName; } public synchronized void registerHighlight( String bookFile, String displayText, int index, int start, int end ) { updateBookFile(bookFile); currentHighlights.add(new HighLight(displayText, index, start, end, Color.YELLOW)); saveHighLights(); } public synchronized void removeHighLight( HighLight highLight ) { currentHighlights.remove(highLight); saveHighLights(); } public synchronized List<HighLight> getHighLights(String bookFile) { updateBookFile(bookFile); return Collections.unmodifiableList( this.currentHighlights ); } public synchronized void saveHighLights() { if ( currentFileName != null && currentHighlights != null ) { Log.d("HighlightManager", "Storing highlights for file " + currentFileName + ": " + currentHighlights.size() + " items."); sort( this.currentHighlights ); config.storeHighlights(currentFileName, currentHighlights); } } private static void sort( List<HighLight> highLights ) { Collections.sort(highLights, COMP); } private static class HighlightComparator implements Comparator<HighLight> { @Override public int compare(HighLight lhs, HighLight rhs) { Integer left; Integer right; if ( lhs.getIndex() != rhs.getIndex() ) { left = lhs.getIndex(); right = rhs.getIndex(); } else { left = lhs.getStart(); right = rhs.getStart(); } return left.compareTo( right ); } } }