Java tutorial
/* * #%L * Wheelmap - App * %% * Copyright (C) 2011 - 2012 Michal Harakal - Michael Kroez - Sozialhelden e.V. * %% * Wheelmap App based on the Wheelmap Service by Sozialhelden e.V. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS-IS" BASIS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.wheelmap.android.fragment; import org.mapsforge.android.maps.GeoPoint; import org.osmdroid.api.IGeoPoint; import org.osmdroid.api.IMapController; import org.osmdroid.events.MapListener; import org.osmdroid.events.ScrollEvent; import org.osmdroid.events.ZoomEvent; import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase; import org.osmdroid.tileprovider.tilesource.XYTileSource; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.mylocation.IMyLocationConsumer; import org.osmdroid.views.overlay.mylocation.IMyLocationProvider; import org.wheelmap.android.model.Extra; import org.wheelmap.android.online.BuildConfig; import org.wheelmap.android.online.R; import org.wheelmap.android.osmdroid.MyLocationNewOverlayFixed; import org.wheelmap.android.utils.MyLocationProvider; import org.wheelmap.android.utils.ParceableBoundingBox; import org.wheelmap.android.utils.UtilsMisc; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.location.Location; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import java.util.Locale; import de.akquinet.android.androlog.Log; import de.greenrobot.event.EventBus; public class EditPositionFragment extends Fragment implements DisplayFragment, MapListener { public static final String TAG = EditPositionFragment.class.getSimpleName(); private IMapController mMapController; private static String baseUrl = "http://a.tiles.mapbox.com/v3/%s/"; private static String tileUrl; private static final byte ZOOMLEVEL_MIN = 16; private OnlineTileSourceBase mMapBoxTileSource; private static final float SPAN_ENLARGEMENT_FAKTOR = 1.3f; private MapView mMapView; private IGeoPoint mLastRequestedPosition; private EventBus mBus; private WorkerFragment mWorkerFragment; private DisplayFragmentListener mDisplayFramentListener; private LinearLayout text_move_map; private TextView text_position; private double mCrrLatitude; private double mCrrLongitude; private final static int VERTICAL_DELTA = 20; private int mVerticalDelta; private ImageButton positionSave; private OnEditPositionListener mListener; MyLocationProvider myLocationProvider = new MyLocationProvider(); MyLocationNewOverlayFixed myLocationOverlay; @Override public void onUpdate(WorkerFragment fragment) { if (mDisplayFramentListener != null) { mDisplayFramentListener.onRefreshing(fragment.isRefreshing()); } } @Override public void markItem(ContentValues values, boolean centerToItem) { } @Override public void onRefreshStarted() { } public interface OnEditPositionListener { public void onEditPosition(double latitude, double longitude); } public static EditPositionFragment newInstance(double latitude, double longitude) { Bundle b = new Bundle(); b.putDouble(Extra.LATITUDE, latitude); b.putDouble(Extra.LONGITUDE, longitude); EditPositionFragment f = new EditPositionFragment(); f.setArguments(b); return f; } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof OnEditPositionListener) { mListener = (OnEditPositionListener) activity; } if (activity instanceof DisplayFragmentListener) { mDisplayFramentListener = (DisplayFragmentListener) activity; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); if (savedInstanceState != null) { executeState(savedInstanceState); } else if (getArguments() != null) { executeState(getArguments()); } tileUrl = String.format(Locale.US, baseUrl, BuildConfig.MAPBOX_API_KEY); mMapBoxTileSource = new XYTileSource("Mapbox", 3, 21, 256, ".png", new String[] { tileUrl }); mBus = EventBus.getDefault(); mVerticalDelta = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) VERTICAL_DELTA, getResources().getDisplayMetrics()); attachWorkerFragment(); myLocationProvider.register(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_position_edit, container, false); text_position = (TextView) v.findViewById(R.id.position_edit_text); text_move_map = (LinearLayout) v.findViewById(R.id.position_move_map); mMapView = (MapView) v.findViewById(R.id.map); mMapView.setTileSource(mMapBoxTileSource); mMapView.setBuiltInZoomControls(true); mMapView.setMultiTouchControls(true); myLocationOverlay = new MyLocationNewOverlayFixed(myLocationProvider, mMapView); myLocationOverlay.disableFollowLocation(); myLocationOverlay.enableMyLocation(); mMapView.getOverlays().add(myLocationOverlay); mMapController = mMapView.getController(); mMapView.setBuiltInZoomControls(true); mMapController = mMapView.getController(); mMapController.setZoom(18); mMapController .setCenter(new org.osmdroid.mapsforge.wrapper.GeoPoint(new GeoPoint(mCrrLatitude, mCrrLongitude))); v.findViewById(R.id.map_btn_locate).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Location location = myLocationProvider.getLastKnownLocation(); if (location == null) { return; } org.osmdroid.util.GeoPoint geoPoint = new org.osmdroid.util.GeoPoint(location.getLatitude(), location.getLongitude()); if (mMapView != null) { mMapController.animateTo(geoPoint); } } }); mMapView.setMapListener(this); positionSave = (ImageButton) v.findViewById(R.id.position_save); positionSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { save(); } }); return v; } public void save() { Bundle b = new Bundle(); b.putDouble(Extra.LATITUDE, mCrrLatitude); b.putDouble(Extra.LONGITUDE, mCrrLongitude); Intent intent = getActivity().getIntent().putExtras(b); getActivity().setResult(Activity.RESULT_OK, intent); getActivity().finish(); } @Override public void onSaveInstanceState(Bundle outState) { outState.putDouble(Extra.LATITUDE, mCrrLatitude); outState.putDouble(Extra.LONGITUDE, mCrrLongitude); super.onSaveInstanceState(outState); } private void executeState(Bundle state) { if (state == null) { return; } mCrrLatitude = state.getDouble(Extra.LATITUDE); mCrrLongitude = state.getDouble(Extra.LONGITUDE); } @Override public void onStop() { super.onStop(); myLocationProvider.unregister(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.ab_positionedit_fragment, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); return false; } @Override public boolean onScroll(ScrollEvent event) { try { getResources(); } catch (Exception e) { //not attached return false; } Log.d(TAG, "onMove"); text_move_map.setVisibility(View.GONE); IGeoPoint centerLocation = mMapView.getMapCenter(); int minimalLatitudeSpan = mMapView.getLatitudeSpan() / 3; int minimalLongitudeSpan = mMapView.getLongitudeSpan() / 3; String positionText = String.format("%s: (%.6f:%.6f)", getResources().getString(R.string.position_geopoint), centerLocation.getLatitude(), centerLocation.getLongitude()); text_position.setText(positionText); mCrrLatitude = centerLocation.getLatitude(); mCrrLongitude = centerLocation.getLongitude(); if (mLastRequestedPosition != null && (Math.abs(mLastRequestedPosition.getLatitudeE6() - centerLocation.getLatitudeE6()) < minimalLatitudeSpan) && (Math.abs(mLastRequestedPosition.getLongitudeE6() - centerLocation.getLongitudeE6()) < minimalLongitudeSpan)) { return false; } if (mMapView.getZoomLevel() < ZOOMLEVEL_MIN) { return false; } requestUpdate(); return false; } @Override public boolean onZoom(ZoomEvent event) { return false; } private void requestUpdate() { if (true) { return; } Bundle extras = fillExtrasWithBoundingRect(); mWorkerFragment.requestUpdate(extras); } private Bundle fillExtrasWithBoundingRect() { Bundle bundle = new Bundle(); int latSpan = (int) (mMapView.getLatitudeSpan() * SPAN_ENLARGEMENT_FAKTOR); int lonSpan = (int) (mMapView.getLongitudeSpan() * SPAN_ENLARGEMENT_FAKTOR); IGeoPoint center = mMapView.getMapCenter(); mLastRequestedPosition = center; ParceableBoundingBox boundingBox = new ParceableBoundingBox(center.getLatitudeE6() + (latSpan / 2), center.getLongitudeE6() + (lonSpan / 2), center.getLatitudeE6() - (latSpan / 2), center.getLongitudeE6() - (lonSpan / 2)); bundle.putSerializable(Extra.BOUNDING_BOX, boundingBox); return bundle; } private void attachWorkerFragment() { Fragment fragment = null; if (getArguments() == null || getArguments().getBoolean(Extra.CREATE_WORKER_FRAGMENT, true)) { //mHeightFull = true; FragmentManager fm = getActivity().getSupportFragmentManager(); fragment = (Fragment) fm.findFragmentByTag(POIsMapWorkerFragment.TAG); Log.d(TAG, "Looking for Worker Fragment:" + fragment); if (fragment == null) { fragment = new POIsMapWorkerFragment(); fm.beginTransaction().add(fragment, POIsMapWorkerFragment.TAG).commit(); } } else if (!getArguments().getBoolean(Extra.CREATE_WORKER_FRAGMENT, false)) { Log.d(TAG, "Connecting to Combined Worker Fragment"); FragmentManager fm = getActivity().getSupportFragmentManager(); fragment = (Fragment) fm.findFragmentByTag(CombinedWorkerFragment.TAG); } mWorkerFragment = (WorkerFragment) fragment; mWorkerFragment.registerDisplayFragment(this); Log.d(TAG, "result mWorkerFragment = " + mWorkerFragment); } }