package org.osmdroid.samplefragments;
import org.osmdroid.api.IGeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.CopyrightOverlay;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
public abstract class BaseSampleFragment extends Fragment {
private static int MENU_LAST_ID = Menu.FIRST; // Always set to last unused id
public static final String TAG = "osmBaseFrag";
public abstract String getSampleTitle();
// ===========================================================
// Fields
// ===========================================================
protected MapView mMapView;
public MapView getmMapView(){
return mMapView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
Log.d(TAG, "onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mMapView = new MapView(inflater.getContext());
if (Build.VERSION.SDK_INT >= 12) {
mMapView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
/**
* mouse wheel zooming ftw
* http://stackoverflow.com/questions/11024809/how-can-my-view-respond-to-a-mousewheel
* @param v
* @param event
* @return
*/
@Override
public boolean onGenericMotion(View v, MotionEvent event) {
if (0 != (event.getSource() & InputDevice.SOURCE_CLASS_POINTER)) {
switch (event.getAction()) {
case MotionEvent.ACTION_SCROLL:
if (event.getAxisValue(MotionEvent.AXIS_VSCROLL) < 0.0f)
mMapView.getController().zoomOut();
else {
mMapView.getController().zoomIn();
}
return true;
}
}
return false;
}
});
}
Log.d(TAG, "onCreateView");
return mMapView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
addOverlays();
if (mMapView!=null) {
final Context context = this.getActivity();
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
CopyrightOverlay copyrightOverlay = new CopyrightOverlay(getActivity());
//i hate this very much, but it seems as if certain versions of android and/or
//device types handle screen offsets differently
if (Build.VERSION.SDK_INT <= 10)
copyrightOverlay.setOffset(0,(int)(55*dm.density));
mMapView.getOverlays().add(copyrightOverlay);
mMapView.setBuiltInZoomControls(true);
mMapView.setMultiTouchControls(true);
mMapView.setTilesScaledToDpi(true);
}
}
@Override
public void onDestroyView(){
super.onDestroyView();
Log.d(TAG, "onDetach");
if (mMapView!=null)
mMapView.onDetach();
mMapView=null;
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem add = menu.add("Run Tests");
MENU_LAST_ID++;
// Put overlay items first
try {
mMapView.getOverlayManager().onCreateOptionsMenu(menu, MENU_LAST_ID, mMapView);
}catch (NullPointerException npe){
//can happen during CI tests and very rapid fragment switching
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
try{
mMapView.getOverlayManager().onPrepareOptionsMenu(menu, MENU_LAST_ID, mMapView);
}catch (NullPointerException npe){
//can happen during CI tests and very rapid fragment switching
}
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getTitle().toString().equals("Run Tests")){
new Thread(new Runnable() {
@Override
public void run() {
try {
runTestProcedures();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
return true;
}
else if (mMapView.getOverlayManager().onOptionsItemSelected(item, MENU_LAST_ID, mMapView)) {
return true;
}
return false;
}
/**
* An appropriate place to override and add overlays.
*/
protected void addOverlays() {
//
}
public boolean skipOnCiTests(){
return false;
}
/**
* optional place to put automated test procedures, used during the connectCheck tests
* this is called OFF of the UI thread. block this method call util the test is done
*/
public void runTestProcedures() throws Exception{
}
}