package com.robert.maps.applib.preference; import org.andnav.osm.util.GeoPoint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.robert.maps.applib.R; import com.robert.maps.applib.kml.PoiManager; import com.robert.maps.applib.overlays.MyLocationOverlay; import com.robert.maps.applib.overlays.PoiOverlay; import com.robert.maps.applib.overlays.TrackOverlay; import com.robert.maps.applib.tileprovider.TileSource; import com.robert.maps.applib.tileprovider.TileSourceBase; import com.robert.maps.applib.utils.Ut; import com.robert.maps.applib.view.IMoveListener; import com.robert.maps.applib.view.MapView; public class OffsetActivity extends Activity { private static final String OFFSET_TEXT = "%s: %d m, %d m"; private MapView mMap; private TileSource mTileSource; private MyLocationOverlay mMyLocationOverlay; private PoiOverlay mPoiOverlay; private TrackOverlay mTrackOverlay; private PoiManager mPoiManager; private Handler mCallbackHandler = new MainActivityCallbackHandler(); private MoveListener mMoveListener = new MoveListener(); private double mOffsetLat, mOffsetLon; private CharSequence mGpsStatusName; private GeoPoint mGeo0 = new GeoPoint(0, 0); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.offsetactivity); mPoiManager = new PoiManager(this); mMap = (MapView) findViewById(R.id.map); mMap.setMoveListener(mMoveListener); mMap.getTileView().setOffsetMode(true); this.mTrackOverlay = new TrackOverlay(null, mPoiManager, mCallbackHandler); this.mMap.getOverlays().add(mTrackOverlay); this.mPoiOverlay = new PoiOverlay(this, mPoiManager, null, false); this.mMap.getOverlays().add(mPoiOverlay); mMyLocationOverlay = new MyLocationOverlay(this); mMap.getOverlays().add(mMyLocationOverlay); mLocationListener = new SampleLocationListener(); findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(OffsetActivity.this); Editor editor = pref.edit(); editor.putFloat(mTileSource.ID+TileSourceBase.OFFSETLAT_, (float)mOffsetLat); editor.putFloat(mTileSource.ID+TileSourceBase.OFFSETLON_, (float)mOffsetLon); editor.commit(); finish(); } }); } @Override protected void onResume() { Intent intent = getIntent(); if (intent != null) { if (mTileSource != null) mTileSource.Free(); try { mTileSource = new TileSource(this, intent.getStringExtra("MAPID")); } catch (Exception e) { } mMap.setTileSource(mTileSource); SharedPreferences uiState = getSharedPreferences("MapName", Activity.MODE_PRIVATE); mMap.getController().setZoom(uiState.getInt("ZoomLevel", 0)); mMap.getController().setCenter(new GeoPoint(uiState.getInt("Latitude", 0), uiState.getInt("Longitude", 0))); setTitle(); mOffsetLat = mTileSource.OFFSET_LAT; mOffsetLon = mTileSource.OFFSET_LON; setOffsetText(); } mLocationListener.getBestProvider(); super.onResume(); } @Override protected void onPause() { mLocationListener.getLocationManager().removeUpdates(mLocationListener); if(mTileSource != null) mTileSource.Free(); mPoiManager.FreeDatabases(); super.onPause(); } @Override protected void onDestroy() { mMap.setMoveListener(null); super.onDestroy(); } private void setOffsetText() { final int lat = (mOffsetLat < 0 ? -1 : 1) * mGeo0.distanceTo(new GeoPoint((int) (1E6 * mOffsetLat), 0)); final int lon = (mOffsetLon < 0 ? -1 : 1) * mGeo0.distanceTo(new GeoPoint(0, (int) (1E6 * mOffsetLon))); ((TextView) findViewById(R.id.textOffset)).setText(String.format(OFFSET_TEXT, getResources().getString(R.string.offset_text), lat, lon)); } private class MoveListener implements IMoveListener { public void onMoveDetected() { final double[] offset = mMap.getTileView().getCurrentOffset(); mOffsetLat = offset[0]; mOffsetLon = offset[1]; setOffsetText(); } public void onZoomDetected() { setTitle(); } @Override public void onCenterDetected() { } } private class MainActivityCallbackHandler extends Handler { @Override public void handleMessage(final Message msg) { final int what = msg.what; if (what == Ut.MAPTILEFSLOADER_SUCCESS_ID) { mMap.invalidate(); //postInvalidate(); } else if (what == R.id.user_moved_map) { // setAutoFollow(false); } else if (what == R.id.set_title) { setTitle(); } else if (what == R.id.add_yandex_bookmark) { showDialog(R.id.add_yandex_bookmark); } else if (what == Ut.ERROR_MESSAGE) { if (msg.obj != null) Toast.makeText(OffsetActivity.this, msg.obj.toString(), Toast.LENGTH_LONG).show(); } } } private void setTitle(){ try { final TextView leftText = (TextView) findViewById(R.id.left_text); if(leftText != null) leftText.setText(mMap.getTileSource().NAME); final TextView gpsText = (TextView) findViewById(R.id.gps_text); if(gpsText != null){ gpsText.setText(mGpsStatusName); } final TextView rightText = (TextView) findViewById(R.id.right_text); if(rightText != null){ final double zoom = mMap.getZoomLevelScaled(); if(zoom > mMap.getTileSource().ZOOM_MAXLEVEL) rightText.setText(""+(mMap.getTileSource().ZOOM_MAXLEVEL+1)+"+"); else rightText.setText(""+(1 + Math.round(zoom))); } } catch (Exception e) { } } private SampleLocationListener mLocationListener; private class SampleLocationListener implements LocationListener { public static final String GPS = "gps"; public static final String NETWORK = "network"; public static final String OFF = "off"; public void onLocationChanged(Location loc) { mMyLocationOverlay.setLocation(loc); mGpsStatusName = loc.getProvider(); // + " 2 " + (cnt >= 0 ? cnt : 0); mMap.invalidate(); setTitle(); } public void onProviderDisabled(String provider) { getBestProvider(); } public void onProviderEnabled(String provider) { getBestProvider(); } public void onStatusChanged(String provider, int status, Bundle extras) { mGpsStatusName = provider; setTitle(); } private LocationManager getLocationManager() { return (LocationManager) getSystemService(Context.LOCATION_SERVICE); } private void getBestProvider() { int minTime = 0; int minDistance = 0; getLocationManager().removeUpdates(mLocationListener); if (getLocationManager().isProviderEnabled(GPS)) { getLocationManager().requestLocationUpdates(GPS, minTime, minDistance, mLocationListener); mGpsStatusName = GPS; } else { mGpsStatusName = OFF; } setTitle(); } } }