package de.blau.android.util; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.util.Log; import de.blau.android.App; import de.blau.android.Logic; import de.blau.android.Main; import de.blau.android.Map; import de.blau.android.Mode; import de.blau.android.exception.OsmException; import de.blau.android.filter.Filter; import de.blau.android.osm.BoundingBox; import de.blau.android.osm.Node; import de.blau.android.osm.Relation; import de.blau.android.osm.Way; import de.blau.android.resources.DataStyle; import de.blau.android.resources.TileLayerServer; import de.blau.android.tasks.Task; /** * Save the edit state accros pause / resume cycles * @author simon * */ public class EditState implements Serializable { private static final long serialVersionUID = 19L; private final boolean savedLocked; private final Mode savedMode; private final List<Node> savedNodes; private final List<Way> savedWays; private final List<Relation> savedRelations; private final Task savedBug; private final String savedTileServerID; private final Offset[] savedOffsets; private final int savedMinZoom; private final String savedImageFileName; private final BoundingBox savedBox; private final ArrayList<String> savedLastComments; private final ArrayList<String> savedLastSources; private final NotificationCache savedTaskNotifications; private final NotificationCache savedOsmDataNotifications; private final boolean savedFollowGPS; private final Filter savedFilter; public EditState(Context context, Logic logic, TileLayerServer osmts, String imageFileName, BoundingBox box, boolean followGPS) { savedLocked = logic.isLocked(); savedMode = logic.getMode(); savedNodes = logic.getSelectedNodes(); savedWays = logic.getSelectedWays(); savedRelations = logic.getSelectedRelations(); savedBug = logic.getSelectedBug(); savedTileServerID = osmts.getId(); savedOffsets = osmts.getOffsets(); savedMinZoom = osmts.getMinZoomLevel(); savedImageFileName = imageFileName; savedBox = box; savedLastComments = logic.getLastComments(); savedLastSources = logic.getLastSources(); savedTaskNotifications = App.getTaskNotifications(context); savedOsmDataNotifications = App.getOsmDataNotifications(context); savedFollowGPS = followGPS; savedFilter = logic.getFilter(); } public void setSelected(Main main, Logic logic) { logic.setLocked(savedLocked); logic.setMode(main, savedMode); Log.d("EditState","savedMode " + savedMode); if (savedNodes != null) { for (Node n:savedNodes) { Node nodeInStorage = (Node) App.getDelegator().getOsmElement(Node.NAME,n.getOsmId()); if (nodeInStorage != null) { logic.addSelectedNode(nodeInStorage); } } } if (savedWays != null) { for (Way w:savedWays) { Way wayInStorage = (Way) App.getDelegator().getOsmElement(Way.NAME,w.getOsmId()); if (wayInStorage != null) { logic.addSelectedWay(wayInStorage); } } } if (savedRelations != null) { for (Relation r:savedRelations) { Relation relationInStorage = (Relation) App.getDelegator().getOsmElement(Relation.NAME,r.getOsmId()); if (relationInStorage != null) { logic.addSelectedRelation(relationInStorage); } } } // logic.setSelectedBug(savedBug); } public void setMiscState(Main main, Logic logic) { main.setImageFileName(savedImageFileName); logic.setLastComments(savedLastComments); logic.setLastSources(savedLastSources); if (logic.getFilter() == null) { // only restore if we have to if (savedFilter != null) { // or else we might overwrite state savedFilter.init(main); // in the filter } logic.setFilter(savedFilter); } App.setTaskNotifications(main,savedTaskNotifications); App.setOsmDataNotifications(main,savedOsmDataNotifications); main.setFollowGPS(savedFollowGPS); } public void setViewBox(Logic logic, Map map) { logic.getViewBox().setBorders(map, savedBox); try { logic.getViewBox().setRatio(map, (float)map.getWidth() / (float)map.getHeight()); } catch (OsmException e) { // shouldn't happen since we would have only stored a legal BB } map.setViewBox(logic.getViewBox()); DataStyle.updateStrokes(Logic.STROKE_FACTOR / logic.getViewBox().getWidth()); map.invalidate(); } public void setOffset(TileLayerServer osmts) { Log.d("EditState","setOffset saved id " + savedTileServerID + " current id " + osmts.getId()); if (osmts.getId().equals(savedTileServerID)) { Log.d("EditState","restoring offset"); if (savedOffsets.length == osmts.getOffsets().length && savedMinZoom == osmts.getMinZoomLevel()) { // check for config change osmts.setOffsets(savedOffsets); } } } }