package net.unverschaemt.pinfever; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.osmdroid.DefaultResourceProxyImpl; import org.osmdroid.tileprovider.MapTileProviderBasic; import org.osmdroid.tileprovider.tilesource.ITileSource; import org.osmdroid.tileprovider.tilesource.XYTileSource; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; import org.osmdroid.views.Projection; import org.osmdroid.views.overlay.ItemizedIconOverlay; import org.osmdroid.views.overlay.Overlay; import org.osmdroid.views.overlay.OverlayItem; import org.osmdroid.views.overlay.PathOverlay; import org.osmdroid.views.overlay.TilesOverlay; import java.util.ArrayList; import java.util.List; public class Map extends Activity { public final static String GAME = "net.unverschaemt.pinfever.GAME"; public final static String QUESTION = "net.unverschaemt.pinfever.QUESTION"; private Game game = null; private Question question = null; private List<Question> questions = null; private boolean showingQuestion = false; MapView mapView; private GeoPoint guess = null; private int questionCounter = 0; private GameState gameState; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); game = (Game) getIntent().getSerializableExtra(GAME); question = (Question) getIntent().getSerializableExtra(QUESTION); gameState = GameState.COMPLETED; if (game != null) { this.gameState = game.getState(); this.questions = game.getActiveRound().getQuestions(); question = this.questions.get(questionCounter); } resetQuestionText(); initializeMap(); if (gameState == GameState.MATCH_ACTIVE) { setMapTouchable(); } else { Button submitButton = (Button) findViewById(R.id.Map_submit); submitButton.setText("Next"); submitButton.setVisibility(View.VISIBLE); showGuessesAndAnswer(); } } private void resetQuestionText() { final TextView questionTextView = (TextView) findViewById(R.id.Map_questionText); questionTextView.setText(question.getText()); showingQuestion = false; toggleQuestionVisibility(null); } private void resetMap() { clearOverlays(); if (gameState == GameState.MATCH_ACTIVE) { findViewById(R.id.Map_submit).setVisibility(View.GONE); } else { showGuessesAndAnswer(); } } private void initializeMap() { mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); mapView.setMultiTouchControls(true); mapView.setMinZoomLevel(2); mapView.setClickable(true); mapView.getController().setZoom(2); final MapTileProviderBasic tileProvider = new MapTileProviderBasic(getApplicationContext()); final ITileSource tileSource = new XYTileSource("watercolor", null, 2, 17, 256, ".jpg", new String[]{"http://tile.stamen.com/watercolor/"}); tileProvider.setTileSource(tileSource); mapView.setTileSource(tileSource); final TilesOverlay tilesOverlay = new TilesOverlay(tileProvider, this.getBaseContext()); tilesOverlay.setLoadingBackgroundColor(Color.WHITE); mapView.getOverlays().add(tilesOverlay); } private void setMapTouchable() { mapView.getOverlays().add(new TouchableOverlay(this)); } private class TouchableOverlay extends Overlay { public TouchableOverlay(Context ctx) { super(ctx); } @Override protected void draw(Canvas c, MapView osmv, boolean shadow) { } @Override public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView) { Projection proj = mapView.getProjection(); GeoPoint point = (GeoPoint) proj.fromPixels((int) event.getX(), (int) event.getY()); guess = point; setGuessMarker(point); return true; } } private void showGuessesAndAnswer() { GeoPoint answerPoint = new GeoPoint(question.getAnswerLat(), question.getAnswerLong()); addMarker(answerPoint); for (java.util.Map.Entry<String, Turninformation> turninfo : question.getTurninformation().entrySet()) { GeoPoint guessPoint = showGuess(turninfo.getValue()); PathOverlay myPath = new PathOverlay(Color.RED, this); myPath.addPoint(answerPoint); myPath.addPoint(guessPoint); mapView.getOverlays().add(myPath); } mapView.invalidate(); } private GeoPoint showGuess(Turninformation turnInformation) { GeoPoint answerPoint = new GeoPoint(turnInformation.getAnswerLat(), turnInformation.getAnswerLong()); addMarker(answerPoint); return answerPoint; } public void submitGuess(View view) { if (gameState == GameState.MATCH_ACTIVE) { GeoPoint guess = this.guess; //TODO: send guess to server } question = getNextQuestion(); if (question != null) { resetQuestionText(); resetMap(); } else { startActivity(new Intent(this, Home.class)); } } private void setGuessMarker(GeoPoint point) { clearOverlays(); addMarker(point); findViewById(R.id.Map_submit).setVisibility(View.VISIBLE); } private void clearOverlays() { mapView.getOverlays().clear(); if (gameState == GameState.MATCH_ACTIVE) { mapView.getOverlays().add(new TouchableOverlay(this)); } mapView.invalidate(); } private void addMarker(GeoPoint point) { ArrayList<OverlayItem> overlaysItems = new ArrayList<OverlayItem>(); overlaysItems.add(new OverlayItem("Marker", "Marker", point)); DefaultResourceProxyImpl resourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); ItemizedIconOverlay myLocationOverlay = new ItemizedIconOverlay<OverlayItem>(overlaysItems, null, resourceProxy); List<Overlay> overlays = mapView.getOverlays(); overlays.add(myLocationOverlay); this.mapView.invalidate(); } private Question getNextQuestion() { Question question = null; questionCounter++; if (questions != null && questions.size() > questionCounter) { question = questions.get(questionCounter); } return question; } public void toggleQuestionVisibility(View view) { int visibility; if (showingQuestion) { showingQuestion = false; visibility = View.GONE; } else { showingQuestion = true; visibility = View.VISIBLE; } findViewById(R.id.Map_questionFrame).setVisibility(visibility); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_map, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }