/* * Copyright 2010, 2011, 2012 mapsforge.org * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package org.mapsforge.android.maps; import java.io.File; import java.util.ArrayList; import java.util.List; import org.mapsforge.android.maps.mapgenerator.MapGenerator; import org.mapsforge.core.model.GeoPoint; import org.mapsforge.core.model.MapPosition; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.support.v7.app.AppCompatActivity; /** * MapActivity is the abstract base class which must be extended in order to use a {@link MapView}. There are no * abstract methods in this implementation which subclasses need to override and no API key or registration is required. * <p> * A subclass may create a MapView either via one of the MapView constructors or by inflating an XML layout file. It is * possible to use more than one MapView at the same time. * <p> * When the MapActivity is shut down, the current center position, zoom level and map file of the MapView are saved in a * preferences file and restored in the next startup process. */ public abstract class MapActivity extends AppCompatActivity { private static final String KEY_LATITUDE = "latitude"; private static final String KEY_LONGITUDE = "longitude"; private static final String KEY_MAP_FILE = "mapFile"; private static final String KEY_ZOOM_LEVEL = "zoomLevel"; private static final String PREFERENCES_FILE = "MapActivity"; private static boolean containsMapViewPosition(SharedPreferences sharedPreferences) { return sharedPreferences.contains(KEY_LATITUDE) && sharedPreferences.contains(KEY_LONGITUDE) && sharedPreferences.contains(KEY_ZOOM_LEVEL); } /** * Counter to store the last ID given to a MapView. */ private int lastMapViewId; /** * Internal list which contains references to all running MapView objects. */ private final List<MapView> mapViews = new ArrayList<>(2); private void destroyMapViews() { while (!this.mapViews.isEmpty()) { MapView mapView = this.mapViews.remove(0); mapView.destroy(); } } private void restoreMapView(MapView mapView) { SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCES_FILE, MODE_PRIVATE); if (containsMapViewPosition(sharedPreferences)) { MapGenerator mapGenerator = mapView.getMapGenerator(); if (!mapGenerator.requiresInternetConnection() && sharedPreferences.contains(KEY_MAP_FILE)) { // get and set the map file mapView.setMapFile(new File(sharedPreferences.getString(KEY_MAP_FILE, null))); } // get and set the map position and zoom level int latitudeE6 = sharedPreferences.getInt(KEY_LATITUDE, 0); int longitudeE6 = sharedPreferences.getInt(KEY_LONGITUDE, 0); int zoomLevel = sharedPreferences.getInt(KEY_ZOOM_LEVEL, -1); GeoPoint geoPoint = new GeoPoint(latitudeE6, longitudeE6); MapPosition mapPosition = new MapPosition(geoPoint, (byte) zoomLevel); mapView.setCenterAndZoom(mapPosition); } } @Override protected void onDestroy() { super.onDestroy(); destroyMapViews(); } @Override protected void onPause() { super.onPause(); if (this.mapViews.isEmpty()) { return; } for (int i = 0, n = this.mapViews.size(); i < n; ++i) { this.mapViews.get(i).onPause(); } Editor editor = getSharedPreferences(PREFERENCES_FILE, MODE_PRIVATE).edit(); editor.clear(); MapView mapView = this.mapViews.get(0); // save the map position and zoom level MapPosition mapPosition = mapView.getMapPosition().getMapPosition(); if (mapPosition != null) { GeoPoint geoPoint = mapPosition.geoPoint; editor.putInt(KEY_LATITUDE, geoPoint.latitudeE6); editor.putInt(KEY_LONGITUDE, geoPoint.longitudeE6); editor.putInt(KEY_ZOOM_LEVEL, mapPosition.zoomLevel); } if (!mapView.getMapGenerator().requiresInternetConnection() && mapView.getMapFile() != null) { // save the map file editor.putString(KEY_MAP_FILE, mapView.getMapFile().getAbsolutePath()); } editor.apply(); } @Override protected void onResume() { super.onResume(); for (int i = 0, n = this.mapViews.size(); i < n; ++i) { this.mapViews.get(i).onResume(); } } /** * @return a unique MapView ID on each call. */ final int getMapViewId() { return ++this.lastMapViewId; } /** * This method is called once by each MapView during its setup process. * * @param mapView * the calling MapView. */ final void registerMapView(MapView mapView) { this.mapViews.add(mapView); restoreMapView(mapView); } }