package com.boombuler.piraten.map;
import java.util.List;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Overlay;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.boombuler.piraten.map.data.PlakatOverlay;
import com.boombuler.piraten.map.data.PlakatOverlayItem;
import com.boombuler.piraten.map.data.PlakatOverlayItemFilter;
import com.boombuler.piraten.map.fragments.FilterFragment;
public class PirateMap extends FragmentActivity {
private MapView mMapView;
private CurrentPositionOverlay mMyPosOverlay;
protected PlakatOverlay plakatOverlay;
private PlakatOverlayItemFilter mFilter = new PlakatOverlayItemFilter();
static int INITIAL_ZOOM = 16;
private boolean initialMoveToLocationPerformed = false;
public MapView getMapView() {
return mMapView;
}
public CurrentPositionOverlay getMyPosOverlay() {
return mMyPosOverlay;
}
public void setMyPosOverlay(CurrentPositionOverlay mMyPosOverlay) {
this.mMyPosOverlay = mMyPosOverlay;
}
public PlakatOverlay getPlakatOverlay() {
return plakatOverlay;
}
public void setPlakatOverlay(PlakatOverlay plakatOverlay) {
this.plakatOverlay = plakatOverlay;
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources();
PlakatOverlayItem.InitResources(res.getDrawable(R.drawable.plakat_default),
res.getDrawable(R.drawable.plakat_ok),
res.getDrawable(R.drawable.plakat_dieb),
res.getDrawable(R.drawable.plakat_niceplace),
res.getDrawable(R.drawable.wand),
res.getDrawable(R.drawable.wand_ok),
res.getDrawable(R.drawable.plakat_wrecked),
res.getDrawable(R.drawable.plakat_a0));
mMapView = (MapView)findViewById(R.id.mapview);
mMapView.setBuiltInZoomControls(true);
mMapView.setMultiTouchControls(true);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.REQ_DETAILS && resultCode == RESULT_OK)
buildMap(mFilter); // Something changed so reload!
else if (requestCode == Constants.REQ_FILTER && resultCode == Constants.RES_FILTER) {
mFilter = data.getExtras().getParcelable(Constants.EXTRA_ITEMFILTER);
buildMap(mFilter); // Something changed so reload!
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_sync:
StartSync();
return true;
case R.id.menu_add:
addMarker();
return true;
case R.id.menu_my_location:
moveToMyLocation();
return true;
case R.id.menu_filter:
openfilterDialog();
return true;
case R.id.menu_settings:
startActivity(new Intent(PirateMap.this, SettingsActivity.class));
return true;
case android.R.id.home:
if (mMapView != null && mMyPosOverlay != null) {
GeoPoint location = mMyPosOverlay.getMyLocation();
if (location != null) {
mMapView.getController().animateTo(location);
}
return true;
}
return false;
case R.id.menu_about:
startActivity(new Intent(PirateMap.this, AboutActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.plakate_map, menu);
return true;
}
public void buildMap(PlakatOverlayItemFilter mFilter) {
final List<Overlay> overlays = mMapView.getOverlays();
overlays.clear();
new PlakatLoadingTask(this).execute(mFilter);
mMyPosOverlay = new CurrentPositionOverlay(PirateMap.this, mMapView);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean returnToMyLocation = initialMoveToLocationPerformed ? prefs.getBoolean(SettingsActivity.KEY_RETURN_TO_MY_LOCATION, true) : true;
mMyPosOverlay.moveToMyPosition(this, returnToMyLocation );
initialMoveToLocationPerformed = true; // couldn't think of a better way :/
mMyPosOverlay.enable();
mMapView.invalidate();
}
private void moveToMyLocation() {
GeoPoint location = mMyPosOverlay.getMyLocation();
if(mMyPosOverlay != null && location != null) {
mMapView.getController().animateTo(location);
}
}
@Override
protected void onResume() {
if (mMyPosOverlay == null)
buildMap(mFilter);
if (mMyPosOverlay != null)
mMyPosOverlay.enable();
super.onResume();
}
@Override
protected void onPause() {
if (mMyPosOverlay != null)
mMyPosOverlay.disable();
super.onPause();
}
private void openfilterDialog(){
// Create the fragment and show it as a dialog.
FragmentManager fragmentManager = getSupportFragmentManager();
FilterFragment newFragment = new FilterFragment();
newFragment.setFilter(mFilter);
newFragment.show(fragmentManager, "filterDialog");
}
private void addMarker() {
boolean hasSyncedBefore = PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(SettingsActivity.KEY_HAS_SYNCED, false);
if (!hasSyncedBefore) {
new AlertDialog.Builder(this)
.setTitle(android.R.string.dialog_alert_title)
.setIcon(android.R.drawable.ic_dialog_alert)
.setMessage(R.string.warn_sync_first)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
} else {
startActivityForResult(
new Intent(PirateMap.this, PlakatDetailsActivity.class)
.putExtra(PlakatDetailsActivity.EXTRA_NEW_PLAKAT, true),
Constants.REQ_DETAILS);
}
}
private void StartSync() {
SyncController sc = new SyncController(this);
sc.setOnCompleteListener(new Runnable() {
public void run() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(PirateMap.this);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(SettingsActivity.KEY_HAS_SYNCED, true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
editor.apply();
} else {
editor.commit();
}
buildMap(mFilter);
}
});
sc.synchronize();
}
}