package de.apps4ics.mountainnavigation;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Environment;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.view.GravityCompat;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import org.mapsforge.core.model.LatLong;
import org.mapsforge.map.android.graphics.AndroidGraphicFactory;
import org.mapsforge.map.android.util.AndroidUtil;
import org.mapsforge.map.android.view.MapView;
import org.mapsforge.map.layer.cache.TileCache;
import org.mapsforge.map.layer.renderer.TileRendererLayer;
import org.mapsforge.map.reader.MapDataStore;
import org.mapsforge.map.reader.MapFile;
import org.mapsforge.map.rendertheme.InternalRenderTheme;
import java.io.File;
import java.lang.reflect.Type;
import java.util.List;
import static android.app.PendingIntent.getActivity;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MountainNavigation";
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
private CharSequence mDrawerTitle;
// name of the map file in the external storage
private static final String MAPFILE = "greece.map";
private FloatingActionButton fab;
private MapView mapView;
private TileCache tileCache;
private TileRendererLayer tileRendererLayer;
private ActionBarDrawerToggle drawerToggle;
private String[] fountainSizes;
private String[] entries;
private Integer[] entryImgs;
private Integer[] fountainImgs;
private DrawerLayout drawerLayout;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.container);
AndroidGraphicFactory.createInstance(this.getApplication());
mapView = new MapView(this);
frameLayout.addView(mapView);
mapView.setClickable(true);
mapView.getMapScaleBar().setVisible(true);
mapView.setBuiltInZoomControls(true);
mapView.getMapZoomControls().setZoomLevelMin((byte) 10);
mapView.getMapZoomControls().setZoomLevelMax((byte) 20);
// create a tile cache of suitable size
tileCache = AndroidUtil.createTileCache(this, "mapcache",
mapView.getModel().displayModel.getTileSize(), 1f,
mapView.getModel().frameBufferModel.getOverdrawFactor());
mTitle = mDrawerTitle = getTitle();
fountainSizes = getResources().getStringArray(R.array.fountain_size_dialog_options);
fountainImgs = new Integer[]{
R.drawable.fountain_size_small,
R.drawable.fountain_size_medium,
R.drawable.fountain_size_big,
};
entries = getResources().getStringArray(R.array.toggleEntries);
entryImgs = new Integer[]{
R.drawable.water,
R.drawable.path,
R.drawable.break_point,
R.drawable.trash,
R.drawable.image_upload,
R.drawable.cell_reception,
R.drawable.wifi,
R.drawable.lift
};
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//TODO check if gps position is != null, toast and return if not
AddPoiDialog addPoiDialog = new AddPoiDialog();
addPoiDialog.show(getFragmentManager(), "Add POI Dialog");
}
});
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
listView = (ListView) findViewById(R.id.navigation_drawer);
drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
listView.setItemsCanFocus(false);
ImageListAdapter adapter = new ImageListAdapter(MainActivity.this, entries, entryImgs);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TableLayout layout = (TableLayout) view;
TableRow tr = (TableRow) layout.getChildAt(0); //TODO is tablerow?
TextView tv = null;
ImageView iv = null;
for(int i=0; i<tr.getChildCount(); ++i){
View v = tr.getChildAt(i);
try {
tv = (TextView) v;
} catch(ClassCastException cce){
}
try {
iv = (ImageView) v;
} catch(ClassCastException cce){
}
}
if(tv == null || iv == null) Log.e(TAG, "Neither TextView nor ImageView can be null!");
if(iv.getTag() != "disabled"){
iv.setColorFilter(Color.argb(200, 185, 185, 185));
iv.setTag("disabled");
tv.setTypeface(null, Typeface.NORMAL);
Toast.makeText(getApplicationContext(), "You disabled " + entries[position], Toast.LENGTH_SHORT).show();
} else {
iv.setColorFilter(null);
iv.setTag("");
tv.setTypeface(null, Typeface.BOLD);
Toast.makeText(getApplicationContext(), "You enabled " + entries[position], Toast.LENGTH_SHORT).show();
}
}
});
drawerLayout.setDrawerListener(drawerToggle);
}
public class AddPoiDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.add_poi_dialog_title)
.setAdapter(new ImageListAdapter(MainActivity.this, entries, entryImgs), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
AddFountainDialog addSpringDialog = new AddFountainDialog();
addSpringDialog.show(getFragmentManager(), "Add fountain POI Dialog");
break;
}
}
});
return builder.create();
}
}
public class AddFountainDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.fountain_size_dialog_title)
.setAdapter(new ImageListAdapter(MainActivity.this, fountainSizes, fountainImgs), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//TODO save Spring in DB
Toast.makeText(getApplicationContext(), "This " + fountainSizes[which] + " fountain should be stored in a DB!", Toast.LENGTH_SHORT).show();
}
});
return builder.create();
}
}
private class ImageListAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] texts;
private final Integer[] imgs;
public ImageListAdapter(Activity context, String[] texts, Integer[] imgs) {
super(context, R.layout.drawer_list_item, texts);
this.context = context;
this.texts = texts;
this.imgs = imgs;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView= inflater.inflate(R.layout.drawer_list_item, null, true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.toggleEntryDesc);
ImageView imageView = (ImageView) rowView.findViewById(R.id.toggleEntryImg);
txtTitle.setText(texts[position]);
imageView.setImageResource(imgs[position]);
return rowView;
}
}
@Override
public void setTitle(CharSequence title){
mTitle = title;
ActionBar actionBar = getSupportActionBar();
if(actionBar != null) actionBar.setTitle(mTitle);
}
@Override
protected void onStart() {
super.onStart();
mapView.getModel().mapViewPosition.setCenter(new LatLong(37.9777, 23.7277));
mapView.getModel().mapViewPosition.setZoomLevel((byte) 12);
// tile renderer layer using internal render theme
MapDataStore mapDataStore = new MapFile(getMapFile());
tileRendererLayer = new TileRendererLayer(tileCache, mapDataStore,
mapView.getModel().mapViewPosition, false, true, AndroidGraphicFactory.INSTANCE);
tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.OSMARENDER);
// only once a layer is associated with a mapView the rendering starts
mapView.getLayerManager().getLayers().add(tileRendererLayer);
}
@Override
protected void onDestroy() {
super.onDestroy();
this.mapView.destroyAll();
}
private File getMapFile() {
return new File(Environment.getExternalStorageDirectory(), MAPFILE);
}
public void restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
}
}