Newer
Older
mountainnavigation / app / src / main / java / de / apps4ics / mountainnavigation / MainActivity.java
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.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.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 ActionBarActivity {

    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 MapView mapView;
    private TileCache tileCache;
    private TileRendererLayer tileRendererLayer;

    private ActionBarDrawerToggle drawerToggle;
    private String[] springSizes;
    private String[] entries;
    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();

        springSizes = getResources().getStringArray(R.array.spring_size_dialog_options);
        entries = getResources().getStringArray(R.array.toggleEntries);
        final Integer[] entryImgs = {
                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
        };
        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(new ArrayAdapter<String>(this, R.layout.drawer_list_item, entries));
        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();
                }

                //TODO add to add dialog
                if(position == 0) {//water
                    MyDialogFragment dialogFragment = new MyDialogFragment();
                    dialogFragment.show(getFragmentManager(), "MyDialog");
                }
                /*cb.setChecked(!cb.isChecked());
                if(cb.isChecked()){
                    cb.setTypeface(null, Typeface.BOLD);
                    Toast.makeText(getApplicationContext(), "Selected " + entries[position], Toast.LENGTH_SHORT).show();
                } else {
                    cb.setTypeface(null, Typeface.NORMAL);
                    Toast.makeText(getApplicationContext(), "Deselected " + entries[position], Toast.LENGTH_SHORT).show();
                }*/
            }
        });

                drawerLayout.setDrawerListener(drawerToggle);
    }

    public class MyDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(R.string.spring_size_dialog_title)
                    .setItems(springSizes, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(getApplicationContext(), "You selected a " + springSizes[which] + " spring.", 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;
        getSupportActionBar().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() {
        File file = new File(Environment.getExternalStorageDirectory(), MAPFILE);
        return file;
    }

    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) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}