diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java index aadd0f9..0c20a75 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java @@ -8,22 +8,13 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; -import android.media.ExifInterface; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.net.Uri; import android.net.wifi.WifiManager; -import android.os.Vibrator; -import android.provider.MediaStore; import android.provider.Settings; import android.support.design.widget.FloatingActionButton; import android.support.v4.view.GravityCompat; @@ -34,7 +25,6 @@ import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -63,19 +53,12 @@ import com.survivingwithandroid.weather.lib.request.WeatherRequest; import org.osmdroid.api.IMapController; -import org.osmdroid.bonuspack.overlays.MapEventsOverlay; -import org.osmdroid.bonuspack.overlays.MapEventsReceiver; import org.osmdroid.bonuspack.overlays.Marker; import org.osmdroid.tileprovider.tilesource.TileSourceFactory; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.OverlayItem; -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -85,22 +68,9 @@ import de.apps4ics.mountainnavigation.adapters.ImageListAdapter; import de.apps4ics.mountainnavigation.handlers.DatabaseHandler; import de.apps4ics.mountainnavigation.handlers.PoiHandler; -import de.apps4ics.mountainnavigation.overlays.ImageDialogItemizedIconOverlay; -import de.apps4ics.mountainnavigation.overlays.MapDialogItemizedIconOverlay; -import de.apps4ics.mountainnavigation.pois.AddBreakpointDialog; -import de.apps4ics.mountainnavigation.pois.AddFountainDialog; -import de.apps4ics.mountainnavigation.pois.AddHutDialog; -import de.apps4ics.mountainnavigation.pois.AddPathDialog; -import de.apps4ics.mountainnavigation.pois.AddPeakDialog; -import de.apps4ics.mountainnavigation.pois.CellReception; import de.apps4ics.mountainnavigation.pois.DbGeoPoint; import de.apps4ics.mountainnavigation.pois.Fountain; -import de.apps4ics.mountainnavigation.pois.Image; -import de.apps4ics.mountainnavigation.pois.Lift; -import de.apps4ics.mountainnavigation.pois.Poi; -import de.apps4ics.mountainnavigation.pois.TrashBin; import de.apps4ics.mountainnavigation.pois.Types; -import de.apps4ics.mountainnavigation.pois.Wifi; public class MainActivity extends AppCompatActivity implements LocationListener { @@ -119,9 +89,7 @@ private static WifiManager wm; private static NetworkInfo activeNetwork; private static int networkStrength; - private static final int MAX_WIFI_LEVELS = 5; - public static final long VIB_LENGTH = 50; - public final static int SELECT_POI_PHOTO = 1; + public static final int MAX_WIFI_LEVELS = 5; public static SimpleDateFormat df_hm; public static SimpleDateFormat df_full; @@ -144,9 +112,9 @@ private DatabaseHandler dbHandler; private PoiHandler poiHandler; - private MapView mapView; + private static MapView mapView; private IMapController mapController; - private int ZOOM_LEVEL; + public static int ZOOM_LEVEL; private ActionBarDrawerToggle drawerToggle; private DrawerLayout drawerLayout; @@ -159,7 +127,7 @@ private static Location mLocation; private LocationManager locationManager; - private List foundLocations; + private static List foundLocations; @Override protected void onCreate(Bundle savedInstanceState) { @@ -274,7 +242,7 @@ informDialog.show(getFragmentManager(), "Inform Dialog"); return; } - AddPoiDialog addPoiDialog = new AddPoiDialog(); + PoiHandler.AddPoiDialog addPoiDialog = poiHandler.createAddPoiDialog(); addPoiDialog.show(getFragmentManager(), "Add POI Dialog"); } }); @@ -291,6 +259,7 @@ public void onItemClick(AdapterView parent, View view, int position, long id) { TableLayout layout = (TableLayout) view; toggleDrawerItems(layout, position); + //drawerLayout.closeDrawers(); //TODO close drawer on click? } }); @@ -347,6 +316,10 @@ } } + public static List getFoundLocations() { + return foundLocations; + } + public static int getPos(int type){ int pos; switch(type){ @@ -488,9 +461,18 @@ else Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); } + public static void Toaster(String text, Context context){ + Toaster(text, false, context); + } + + public static void Toaster(String text, boolean longDuration, Context context) { + if(longDuration) Toast.makeText(context, text, Toast.LENGTH_LONG).show(); + else Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); + } + public static Location getLocation() { return mLocation; } - public MapView getMapView(){ + public static MapView getMapView(){ return mapView; } @@ -498,11 +480,11 @@ return dbHandler; } - public ArrayList getPathMarkers(){ + public static ArrayList getPathMarkers(){ return pathMarkers; } - public void setPathMarkers(ArrayList al){ + public static void setPathMarkers(ArrayList al){ pathMarkers = al; } @@ -514,6 +496,10 @@ networkStrength = strength; } + public static int getNetworkStrength() { + return networkStrength; + } + private void addSimpleMarker(GeoPoint gp){ Marker positionMarker = new Marker(mapView); positionMarker.setPosition(gp); @@ -748,201 +734,16 @@ } } - 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) - //.setIcon(res.getDrawable(R.mipmap.ic_add_poi)) - .setAdapter(new ImageListAdapter(MainActivity.this, PoiHandler.getEntries(), PoiHandler.getEntryImgs(), true), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - int type = getType(which); - switch (type) { - case Types.FOUNTAIN: - addFountain(); - break; - case Types.PATH: - addPathMap(); - break; - case Types.HUT: - addHut(); - break; - case Types.PEAK: - addPeak(); - break; - case Types.BREAK_POINT: - addBreakpoint(); - break; - case Types.TRASH_BIN: - addPoi(new TrashBin()); - break; - case Types.PIC: - addImageMap(); - break; - case Types.CELL_RECEPTION: - addCellReceptionPoi(); - break; - case Types.WIFI: - addWifiPoi(); - break; - case Types.LIFT: - //TODO as in path, choose two markers - addPoi(new Lift()); - break; - } - } - }); - return builder.create(); - } + public static NetworkInfo getActiveNetwork() { + return activeNetwork; } - public void addFountain(){ - AddFountainDialog addFountainDialog = new AddFountainDialog(this); - addFountainDialog.show(getFragmentManager(), "Add fountain POI Dialog"); + public static WifiManager getWifiManager() { + return wm; } - public void addBreakpoint(){ - AddBreakpointDialog addBreakpointDialog = new AddBreakpointDialog(this); - addBreakpointDialog.show(getFragmentManager(), "Add Break point POI Dialog"); - } - - public void addHut(){ - AddHutDialog addHutDialog = new AddHutDialog(this); - addHutDialog.show(getFragmentManager(), "Add Hut POI Dialog"); - } - - public void addPeak(){ - AddPeakDialog addPeakDialog = new AddPeakDialog(this); - addPeakDialog.show(getFragmentManager(), "Add Peak POI Dialog"); - } - - public void addPathMap() { - final MapView popupMapView = new MapView(getApplicationContext()); - popupMapView.setTileSource(TileSourceFactory.MAPNIK); - popupMapView.setBuiltInZoomControls(false); - popupMapView.setMultiTouchControls(true); - IMapController popupMapController = popupMapView.getController(); - popupMapController.setZoom(ZOOM_LEVEL); - popupMapController.setCenter(new GeoPoint(mLocation.getLatitude(), mLocation.getLongitude())); - - List overlayItemList = new ArrayList<>(); - for(Location l : foundLocations){ - OverlayItem oI = new OverlayItem(String.valueOf(l.getTime()), null, null, new GeoPoint(l.getLatitude(), l.getLongitude(), l.getAltitude())); - oI.setMarker(res.getDrawable(R.mipmap.ic_poi_red)); - overlayItemList.add(oI); - } - - List poiMarker = dbHandler.getAllPois(); - for(Poi p : poiMarker){ - DbGeoPoint dbgp = p.getGp(); - GeoPoint gp = new GeoPoint(dbgp.getLat(), dbgp.getLon(), dbgp.getAlt()); - OverlayItem oI = new OverlayItem(String.valueOf(dbgp.getTime()), String.valueOf(p.getId()), String.valueOf(p.getType()), gp); - Drawable[] iconLayer = new Drawable[2]; - iconLayer[0] = res.getDrawable(R.mipmap.ic_poi); - BitmapDrawable bd = (BitmapDrawable) res.getDrawable(PoiHandler.getEntryImgs()[getPos(p.getType())]); - if(bd == null) continue; - Bitmap b = bd.getBitmap(); - Bitmap bResized = Bitmap.createScaledBitmap(b, b.getWidth()/2, b.getHeight()/2, false); - bd = new BitmapDrawable(res, bResized); - bd.setGravity(Gravity.CENTER_HORIZONTAL); - iconLayer[1] = bd; - LayerDrawable icon = new LayerDrawable(iconLayer); - oI.setMarker(icon); - overlayItemList.add(oI); - } - - AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); - builder.setView(popupMapView) - .setTitle(R.string.path_map_dialog_title) - .setPositiveButton(R.string.continue_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - AddPathDialog addPathDialog = new AddPathDialog(MainActivity.this); - addPathDialog.show(getFragmentManager(), "Add Path POI Dialog"); - } - }) - .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }); - AlertDialog pathMapDialog = builder.create(); - pathMapDialog.show(); - pathMapDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); - final MapDialogItemizedIconOverlay overlay = new MapDialogItemizedIconOverlay(this, overlayItemList, pathMapDialog, popupMapView); - - MapEventsReceiver eventsReceiver = new MapEventsReceiver() { - @Override - public boolean singleTapConfirmedHelper(GeoPoint geoPoint) { - return false; - } - - @Override - public boolean longPressHelper(GeoPoint geoPoint) { - Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); - v.vibrate(VIB_LENGTH); - OverlayItem oI = new OverlayItem("", null, null, geoPoint); - oI.setMarker(getApplicationContext().getResources().getDrawable(R.mipmap.ic_poi_red)); - overlay.addItem(oI); - popupMapView.invalidate(); - return true; - } - }; - - popupMapView.getOverlays().add(new MapEventsOverlay(getApplicationContext(), eventsReceiver)); - popupMapView.getOverlays().add(overlay); - } - - public void addImageMap() { - final MapView popupMapView = new MapView(getApplicationContext()); - popupMapView.setTileSource(TileSourceFactory.MAPNIK); - popupMapView.setBuiltInZoomControls(false); - popupMapView.setMultiTouchControls(true); - IMapController popupMapController = popupMapView.getController(); - popupMapController.setZoom(ZOOM_LEVEL); - popupMapController.setCenter(new GeoPoint(mLocation.getLatitude(), mLocation.getLongitude())); - - List overlayItemList = new ArrayList<>(); - List poiMarker = dbHandler.getAllPois(); - for(Poi p : poiMarker){ - DbGeoPoint dbgp = p.getGp(); - GeoPoint gp = new GeoPoint(dbgp.getLat(), dbgp.getLon(), dbgp.getAlt()); - OverlayItem oI = new OverlayItem(String.valueOf(dbgp.getTime()), String.valueOf(p.getId()), String.valueOf(p.getType()), gp); - Drawable[] iconLayer = new Drawable[2]; - iconLayer[0] = res.getDrawable(R.mipmap.ic_poi); - BitmapDrawable bd = (BitmapDrawable) res.getDrawable(PoiHandler.getEntryImgs()[getPos(p.getType())]); - if(bd == null) continue; - Bitmap b = bd.getBitmap(); - Bitmap bResized = Bitmap.createScaledBitmap(b, b.getWidth()/2, b.getHeight()/2, false); - bd = new BitmapDrawable(res, bResized); - bd.setGravity(Gravity.CENTER_HORIZONTAL); - iconLayer[1] = bd; - LayerDrawable icon = new LayerDrawable(iconLayer); - oI.setMarker(icon); - overlayItemList.add(oI); - } - - AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); - builder.setView(popupMapView) - .setTitle(R.string.image_map_dialog_title) //TODO title - .setPositiveButton(R.string.continue_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - startActivityForResult(galleryIntent, SELECT_POI_PHOTO); - } - }) - .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }); - AlertDialog pathMapDialog = builder.create(); - pathMapDialog.show(); - pathMapDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); - final ImageDialogItemizedIconOverlay overlay = new ImageDialogItemizedIconOverlay(this, overlayItemList, pathMapDialog, popupMapView); - popupMapView.getOverlays().add(overlay); + public static TelephonyManager getTelephonyManager() { + return tm; } public static boolean hasInternet() { @@ -950,143 +751,6 @@ return activeNetwork != null && activeNetwork.isConnected(); } - private void addCellReceptionPoi(){ - if(hasInternet()){ - if(tm != null && networkStrength != -1){ - String opName = tm.getNetworkOperatorName(); - String opCountry = tm.getNetworkCountryIso(); - String nwType = activeNetwork.getSubtypeName(); - int roaming = (tm.isNetworkRoaming()) ? 1 : 0; - int strength = networkStrength; - addPoi(new CellReception(0, strength, opName, opCountry, roaming, nwType, null)); - } else { - Log.d(TAG, "You are not connected to a phone network"); - } - } else { - Log.d(TAG, "You are not connected to any network"); - } - } - - private void addWifiPoi(){ - if(!wm.isWifiEnabled()){ - AlertDialog.Builder wifiIntentDialogBuilder = new AlertDialog.Builder(MainActivity.this); - wifiIntentDialogBuilder - .setTitle(R.string.wifi_disabled_title) - .setMessage(R.string.wifi_disabled_text) - .setPositiveButton(R.string.enable_wifi_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); - startActivity(intent); - } - }) - .setNegativeButton(R.string.dont_enable_wifi_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }); - AlertDialog wifiIntentDialog = wifiIntentDialogBuilder.create(); - wifiIntentDialog.show(); - } else { - if(hasInternet()){ - if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { - String ssid = wm.getConnectionInfo().getSSID(); - int rssi = wm.getConnectionInfo().getRssi(); - int levels = WifiManager.calculateSignalLevel(rssi, MAX_WIFI_LEVELS); - Log.d(TAG, "You are currently connected to '" + ssid + "' with " + levels + " (" + rssi + ")"); - addPoi(new Wifi(0, ssid, levels, null)); - } else { - Log.d(TAG, "Wifi network not available/connected"); - } - } else { - Log.d(TAG, "You are not connected to any network"); - } - } - } - - private void addImagePoi(Uri data){ - byte[] imgData = createImage(data); - if(imgData == null || imageMarker == null) Log.d(TAG, "image data or marker is null..."); - String file = getFilePath(data); - - int type = Integer.parseInt(imageMarker.getSnippet()); //Long.parseLong(uidParts[1]); - DbGeoPoint dbgp = null; - ExifInterface exifInterface = null; - try { - exifInterface = new ExifInterface(file); - } catch(IOException e){ - Log.e(TAG, "File " + file + " not found!"); - } - float[] exifLatLon = new float[2]; - if(exifInterface != null && exifInterface.getLatLong(exifLatLon)){ - double alt = exifInterface.getAltitude(0); - - SimpleDateFormat timestampFormat = new SimpleDateFormat("yyyy:M:d H:m:s"); - String timestamp = exifInterface.getAttribute(ExifInterface.TAG_DATETIME); - long time = 0; - if(timestamp != null){ - try { - time = timestampFormat.parse(timestamp).getTime() / 1000; - } catch(ParseException pe) { - pe.printStackTrace(); - } - } - - dbgp = new DbGeoPoint(exifLatLon[0], exifLatLon[1], alt, time); - long rowId = addGp(dbgp); - dbgp.setId(rowId); - } else { - long id = Long.parseLong(imageMarker.getTitle()); - dbgp = dbHandler.getPoi(id, type).getGp(); - } - - addPoi(new Image(0, imgData, type, dbgp)); - } - - public long addGp(DbGeoPoint dbgp){ - return dbHandler.addPoi(dbgp); - } - - public long addPoi(Poi poi){ - DbGeoPoint dbgp = poi.getGp(); - if(dbgp == null){ - double _lat = mLocation.getLatitude(); - double _lon = mLocation.getLongitude(); - double _alt = mLocation.getAltitude(); - long _time = System.currentTimeMillis() / 1000; - - dbgp = new DbGeoPoint(_lat, _lon, _alt, _time); - long gp_id = dbHandler.addPoi(dbgp); - dbgp.setId(gp_id); - - poi.setGp(dbgp); - } - long rowId = dbHandler.addPoi(poi); - if(rowId >= 0) Toaster(getString(R.string.add_poi_success), true); - return rowId; - } - - private byte[] createImage(Uri uri) { - try { - InputStream inputStream = getContentResolver().openInputStream(uri); - ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); - - int bufferSize = 1024; - byte[] buffer = new byte[bufferSize]; - - int len = 0; - while ((len = inputStream.read(buffer)) != -1) { - byteBuffer.write(buffer, 0, len); - } - return byteBuffer.toByteArray(); - } catch (FileNotFoundException e) { - Log.e(TAG, "The file at Uri " + uri.toString() + " does not exist!"); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - private class WarningListAdapter extends ArrayAdapter { private final Activity context; @@ -1117,9 +781,9 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode){ - case SELECT_POI_PHOTO: + case PoiHandler.SELECT_POI_PHOTO: if(resultCode == RESULT_OK){ - addImagePoi(data.getData()); + poiHandler.addImagePoi(data.getData()); } break; } @@ -1153,16 +817,4 @@ protected void onDestroy() { super.onDestroy(); } - - private String getFilePath(Uri uri){ - String[] filePathColumn = { MediaStore.Images.Media.DATA }; - Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); - String filePath = null; - if(cursor.moveToFirst()){ - int columnIndex = cursor.getColumnIndex(filePathColumn[0]); - filePath = cursor.getString(columnIndex); - } - cursor.close(); - return filePath; - } } diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/PoiHandler.java b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/PoiHandler.java index 89be2af..e30d4d6 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/PoiHandler.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/PoiHandler.java @@ -1,22 +1,51 @@ package de.apps4ics.mountainnavigation.handlers; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.FragmentManager; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.content.res.Resources; +import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.location.Location; +import android.media.ExifInterface; +import android.net.ConnectivityManager; +import android.net.Uri; +import android.net.wifi.WifiManager; import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Vibrator; +import android.provider.MediaStore; +import android.provider.Settings; +import android.telephony.TelephonyManager; import android.util.Log; import android.view.Gravity; +import org.osmdroid.api.IMapController; import org.osmdroid.bonuspack.location.NominatimPOIProvider; import org.osmdroid.bonuspack.location.POI; +import org.osmdroid.bonuspack.overlays.MapEventsOverlay; +import org.osmdroid.bonuspack.overlays.MapEventsReceiver; import org.osmdroid.bonuspack.overlays.Marker; +import org.osmdroid.tileprovider.tilesource.TileSourceFactory; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.Overlay; +import org.osmdroid.views.overlay.OverlayItem; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -26,12 +55,25 @@ import de.apps4ics.mountainnavigation.MainActivity; import de.apps4ics.mountainnavigation.R; +import de.apps4ics.mountainnavigation.adapters.ImageListAdapter; +import de.apps4ics.mountainnavigation.overlays.ImageDialogItemizedIconOverlay; +import de.apps4ics.mountainnavigation.overlays.MapDialogItemizedIconOverlay; +import de.apps4ics.mountainnavigation.pois.AddBreakpointDialog; +import de.apps4ics.mountainnavigation.pois.AddFountainDialog; +import de.apps4ics.mountainnavigation.pois.AddHutDialog; +import de.apps4ics.mountainnavigation.pois.AddPathDialog; +import de.apps4ics.mountainnavigation.pois.AddPeakDialog; +import de.apps4ics.mountainnavigation.pois.CellReception; import de.apps4ics.mountainnavigation.pois.DbGeoPoint; import de.apps4ics.mountainnavigation.pois.Fountain; +import de.apps4ics.mountainnavigation.pois.Image; +import de.apps4ics.mountainnavigation.pois.Lift; import de.apps4ics.mountainnavigation.pois.Options; import de.apps4ics.mountainnavigation.pois.Path; import de.apps4ics.mountainnavigation.pois.Poi; +import de.apps4ics.mountainnavigation.pois.TrashBin; import de.apps4ics.mountainnavigation.pois.Types; +import de.apps4ics.mountainnavigation.pois.Wifi; /** * Created by Vinz on 06.03.2016. @@ -43,6 +85,11 @@ private MapView mapView; private DatabaseHandler dbHandler; private Context context; + private Activity activity; + private FragmentManager fragmentManager; + + public static final long VIB_LENGTH = 50; + public final static int SELECT_POI_PHOTO = 1; private static String[] fountainSizes; private static String[] pathOptions; @@ -65,6 +112,14 @@ this.res = res; this.mapView = mapView; + try { + activity = (Activity) context; + fragmentManager = activity.getFragmentManager(); + } catch(ClassCastException e) { + Log.e(MainActivity.TAG, "Could not get fragment manager!"); + //TODO close app? + } + fountainSizes = res.getStringArray(R.array.fountain_size_dialog_options); fountainImgs = new Integer[]{ R.drawable.fountain_size_small, @@ -103,6 +158,10 @@ }; } + public Context getContext() { + return context; + } + public static String[] getFountainSizes() { return fountainSizes; } @@ -234,6 +293,362 @@ poiMarkers[type] = new ArrayList<>(); } + public AddPoiDialog createAddPoiDialog() { + return new AddPoiDialog(); + } + + 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) + //.setIcon(res.getDrawable(R.mipmap.ic_add_poi)) + .setAdapter(new ImageListAdapter(activity, PoiHandler.getEntries(), PoiHandler.getEntryImgs(), true), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int type = MainActivity.getType(which); + switch (type) { + case Types.FOUNTAIN: + addFountain(); + break; + case Types.PATH: + addPathMap(); + break; + case Types.HUT: + addHut(); + break; + case Types.PEAK: + addPeak(); + break; + case Types.BREAK_POINT: + addBreakpoint(); + break; + case Types.TRASH_BIN: + addPoi(new TrashBin()); + break; + case Types.PIC: + addImageMap(); + break; + case Types.CELL_RECEPTION: + addCellReceptionPoi(); + break; + case Types.WIFI: + addWifiPoi(); + break; + case Types.LIFT: + //TODO as in path, choose two markers + addPoi(new Lift()); + break; + } + } + }); + return builder.create(); + } + } + + public void addFountain(){ + AddFountainDialog addFountainDialog = new AddFountainDialog(this); + addFountainDialog.show(fragmentManager, "Add fountain POI Dialog"); + } + + public void addBreakpoint(){ + AddBreakpointDialog addBreakpointDialog = new AddBreakpointDialog(this); + addBreakpointDialog.show(fragmentManager, "Add Break point POI Dialog"); + } + + public void addHut(){ + AddHutDialog addHutDialog = new AddHutDialog(this); + addHutDialog.show(fragmentManager, "Add Hut POI Dialog"); + } + + public void addPeak(){ + AddPeakDialog addPeakDialog = new AddPeakDialog(this); + addPeakDialog.show(fragmentManager, "Add Peak POI Dialog"); + } + + public void addPathMap() { + final MapView popupMapView = new MapView(context); + popupMapView.setTileSource(TileSourceFactory.MAPNIK); + popupMapView.setBuiltInZoomControls(false); + popupMapView.setMultiTouchControls(true); + IMapController popupMapController = popupMapView.getController(); + popupMapController.setZoom(MainActivity.ZOOM_LEVEL); + Location mLocation = MainActivity.getLocation(); + popupMapController.setCenter(new GeoPoint(mLocation.getLatitude(), mLocation.getLongitude())); + + List overlayItemList = new ArrayList<>(); + for(Location l : MainActivity.getFoundLocations()){ + OverlayItem oI = new OverlayItem(String.valueOf(l.getTime()), null, null, new GeoPoint(l.getLatitude(), l.getLongitude(), l.getAltitude())); + oI.setMarker(res.getDrawable(R.mipmap.ic_poi_red)); + overlayItemList.add(oI); + } + + List poiMarker = dbHandler.getAllPois(); + for(Poi p : poiMarker){ + DbGeoPoint dbgp = p.getGp(); + GeoPoint gp = new GeoPoint(dbgp.getLat(), dbgp.getLon(), dbgp.getAlt()); + OverlayItem oI = new OverlayItem(String.valueOf(dbgp.getTime()), String.valueOf(p.getId()), String.valueOf(p.getType()), gp); + Drawable[] iconLayer = new Drawable[2]; + iconLayer[0] = res.getDrawable(R.mipmap.ic_poi); + BitmapDrawable bd = (BitmapDrawable) res.getDrawable(PoiHandler.getEntryImgs()[MainActivity.getPos(p.getType())]); + if(bd == null) continue; + Bitmap b = bd.getBitmap(); + Bitmap bResized = Bitmap.createScaledBitmap(b, b.getWidth()/2, b.getHeight()/2, false); + bd = new BitmapDrawable(res, bResized); + bd.setGravity(Gravity.CENTER_HORIZONTAL); + iconLayer[1] = bd; + LayerDrawable icon = new LayerDrawable(iconLayer); + oI.setMarker(icon); + overlayItemList.add(oI); + } + + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setView(popupMapView) + .setTitle(R.string.path_map_dialog_title) + .setPositiveButton(R.string.continue_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + AddPathDialog addPathDialog = new AddPathDialog(PoiHandler.this); + addPathDialog.show(fragmentManager, "Add Path POI Dialog"); + } + }) + .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + AlertDialog pathMapDialog = builder.create(); + pathMapDialog.show(); + pathMapDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + final MapDialogItemizedIconOverlay overlay = new MapDialogItemizedIconOverlay(context, overlayItemList, pathMapDialog, popupMapView); + + MapEventsReceiver eventsReceiver = new MapEventsReceiver() { + @Override + public boolean singleTapConfirmedHelper(GeoPoint geoPoint) { + return false; + } + + @Override + public boolean longPressHelper(GeoPoint geoPoint) { + Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + v.vibrate(VIB_LENGTH); + OverlayItem oI = new OverlayItem("", null, null, geoPoint); + oI.setMarker(context.getResources().getDrawable(R.mipmap.ic_poi_red)); + overlay.addItem(oI); + popupMapView.invalidate(); + return true; + } + }; + + popupMapView.getOverlays().add(new MapEventsOverlay(context, eventsReceiver)); + popupMapView.getOverlays().add(overlay); + } + + public void addImageMap() { + final MapView popupMapView = new MapView(context); + popupMapView.setTileSource(TileSourceFactory.MAPNIK); + popupMapView.setBuiltInZoomControls(false); + popupMapView.setMultiTouchControls(true); + IMapController popupMapController = popupMapView.getController(); + popupMapController.setZoom(MainActivity.ZOOM_LEVEL); + Location mLocation = MainActivity.getLocation(); + popupMapController.setCenter(new GeoPoint(mLocation.getLatitude(), mLocation.getLongitude())); + + List overlayItemList = new ArrayList<>(); + List poiMarker = dbHandler.getAllPois(); + for(Poi p : poiMarker){ + DbGeoPoint dbgp = p.getGp(); + GeoPoint gp = new GeoPoint(dbgp.getLat(), dbgp.getLon(), dbgp.getAlt()); + OverlayItem oI = new OverlayItem(String.valueOf(dbgp.getTime()), String.valueOf(p.getId()), String.valueOf(p.getType()), gp); + Drawable[] iconLayer = new Drawable[2]; + iconLayer[0] = res.getDrawable(R.mipmap.ic_poi); + BitmapDrawable bd = (BitmapDrawable) res.getDrawable(PoiHandler.getEntryImgs()[MainActivity.getPos(p.getType())]); + if(bd == null) continue; + Bitmap b = bd.getBitmap(); + Bitmap bResized = Bitmap.createScaledBitmap(b, b.getWidth()/2, b.getHeight()/2, false); + bd = new BitmapDrawable(res, bResized); + bd.setGravity(Gravity.CENTER_HORIZONTAL); + iconLayer[1] = bd; + LayerDrawable icon = new LayerDrawable(iconLayer); + oI.setMarker(icon); + overlayItemList.add(oI); + } + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setView(popupMapView) + .setTitle(R.string.image_map_dialog_title) //TODO title + .setPositiveButton(R.string.continue_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + activity.startActivityForResult(galleryIntent, SELECT_POI_PHOTO); + } + }) + .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + AlertDialog pathMapDialog = builder.create(); + pathMapDialog.show(); + pathMapDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + final ImageDialogItemizedIconOverlay overlay = new ImageDialogItemizedIconOverlay(context, overlayItemList, pathMapDialog, popupMapView); + popupMapView.getOverlays().add(overlay); + } + + private void addCellReceptionPoi(){ + if(MainActivity.hasInternet()){ + TelephonyManager tm = MainActivity.getTelephonyManager(); + int networkStrength = MainActivity.getNetworkStrength(); + if(tm != null && networkStrength != -1){ + String opName = tm.getNetworkOperatorName(); + String opCountry = tm.getNetworkCountryIso(); + String nwType = MainActivity.getActiveNetwork().getSubtypeName(); + int roaming = (tm.isNetworkRoaming()) ? 1 : 0; + int strength = networkStrength; + addPoi(new CellReception(0, strength, opName, opCountry, roaming, nwType, null)); + } else { + Log.d(MainActivity.TAG, "You are not connected to a phone network"); + } + } else { + Log.d(MainActivity.TAG, "You are not connected to any network"); + } + } + + private void addWifiPoi(){ + if(!MainActivity.getWifiManager().isWifiEnabled()){ + AlertDialog.Builder wifiIntentDialogBuilder = new AlertDialog.Builder(context); + wifiIntentDialogBuilder + .setTitle(R.string.wifi_disabled_title) + .setMessage(R.string.wifi_disabled_text) + .setPositiveButton(R.string.enable_wifi_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); + context.startActivity(intent); + } + }) + .setNegativeButton(R.string.dont_enable_wifi_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + AlertDialog wifiIntentDialog = wifiIntentDialogBuilder.create(); + wifiIntentDialog.show(); + } else { + if(MainActivity.hasInternet()){ + if (MainActivity.getActiveNetwork().getType() == ConnectivityManager.TYPE_WIFI) { + WifiManager wm = MainActivity.getWifiManager(); + String ssid = wm.getConnectionInfo().getSSID(); + int rssi = wm.getConnectionInfo().getRssi(); + int levels = WifiManager.calculateSignalLevel(rssi, MainActivity.MAX_WIFI_LEVELS); + Log.d(MainActivity.TAG, "You are currently connected to '" + ssid + "' with " + levels + " (" + rssi + ")"); + addPoi(new Wifi(0, ssid, levels, null)); + } else { + Log.d(MainActivity.TAG, "Wifi network not available/connected"); + } + } else { + Log.d(MainActivity.TAG, "You are not connected to any network"); + } + } + } + + public void addImagePoi(Uri data){ + byte[] imgData = createImage(data); + if(imgData == null || MainActivity.imageMarker == null) Log.d(MainActivity.TAG, "image data or marker is null..."); + String file = getFilePath(data); + + int type = Integer.parseInt(MainActivity.imageMarker.getSnippet()); //Long.parseLong(uidParts[1]); + DbGeoPoint dbgp = null; + ExifInterface exifInterface = null; + try { + exifInterface = new ExifInterface(file); + } catch(IOException e){ + Log.e(MainActivity.TAG, "File " + file + " not found!"); + } + float[] exifLatLon = new float[2]; + if(exifInterface != null && exifInterface.getLatLong(exifLatLon)){ + double alt = exifInterface.getAltitude(0); + + SimpleDateFormat timestampFormat = new SimpleDateFormat("yyyy:M:d H:m:s"); + String timestamp = exifInterface.getAttribute(ExifInterface.TAG_DATETIME); + long time = 0; + if(timestamp != null){ + try { + time = timestampFormat.parse(timestamp).getTime() / 1000; + } catch(ParseException pe) { + pe.printStackTrace(); + } + } + + dbgp = new DbGeoPoint(exifLatLon[0], exifLatLon[1], alt, time); + long rowId = addGp(dbgp); + dbgp.setId(rowId); + } else { + long id = Long.parseLong(MainActivity.imageMarker.getTitle()); + dbgp = dbHandler.getPoi(id, type).getGp(); + } + + addPoi(new Image(0, imgData, type, dbgp)); + } + + public long addGp(DbGeoPoint dbgp){ + return dbHandler.addPoi(dbgp); + } + + public long addPoi(Poi poi){ + DbGeoPoint dbgp = poi.getGp(); + if(dbgp == null){ + Location mLocation = MainActivity.getLocation(); + double _lat = mLocation.getLatitude(); + double _lon = mLocation.getLongitude(); + double _alt = mLocation.getAltitude(); + long _time = System.currentTimeMillis() / 1000; + + dbgp = new DbGeoPoint(_lat, _lon, _alt, _time); + long gp_id = dbHandler.addPoi(dbgp); + dbgp.setId(gp_id); + + poi.setGp(dbgp); + } + long rowId = dbHandler.addPoi(poi); + if(rowId >= 0) MainActivity.Toaster(context.getString(R.string.add_poi_success), true, context); + return rowId; + } + + public byte[] createImage(Uri uri) { + try { + InputStream inputStream = context.getContentResolver().openInputStream(uri); + ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); + + int bufferSize = 1024; + byte[] buffer = new byte[bufferSize]; + + int len = 0; + while ((len = inputStream.read(buffer)) != -1) { + byteBuffer.write(buffer, 0, len); + } + return byteBuffer.toByteArray(); + } catch (FileNotFoundException e) { + Log.e(MainActivity.TAG, "The file at Uri " + uri.toString() + " does not exist!"); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public String getFilePath(Uri uri){ + String[] filePathColumn = { MediaStore.Images.Media.DATA }; + Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null); + String filePath = null; + if(cursor.moveToFirst()){ + int columnIndex = cursor.getColumnIndex(filePathColumn[0]); + filePath = cursor.getString(columnIndex); + } + cursor.close(); + return filePath; + } + class GetPoiFromOsm extends AsyncTask { protected ArrayList doInBackground(String... params) { try { diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBreakpointDialog.java b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBreakpointDialog.java index 6107478..d8b7f38 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBreakpointDialog.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBreakpointDialog.java @@ -16,12 +16,10 @@ * Created by Vinz on 03.11.2015. */ public class AddBreakpointDialog extends DialogFragment { - MainActivity ma; + PoiHandler poiHandler; - public AddBreakpointDialog(){} - - public AddBreakpointDialog(MainActivity ma){ - this.ma = ma; + public AddBreakpointDialog(PoiHandler poiHandler){ + this.poiHandler = poiHandler; } @Override @@ -58,7 +56,7 @@ break; } } - ma.addPoi(new BreakPoint(0, stone, bench, table, roofed, null)); + poiHandler.addPoi(new BreakPoint(0, stone, bench, table, roofed, null)); } }) .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddFountainDialog.java b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddFountainDialog.java index 5875862..791d064 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddFountainDialog.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddFountainDialog.java @@ -17,10 +17,10 @@ * Created by Vinz on 03.11.2015. */ public class AddFountainDialog extends DialogFragment { - MainActivity ma; + PoiHandler poiHandler; - public AddFountainDialog(MainActivity ma){ - this.ma = ma; + public AddFountainDialog(PoiHandler poiHandler){ + this.poiHandler = poiHandler; } @Override @@ -45,7 +45,7 @@ default: Log.e(MainActivity.TAG, "Wrong fountain size " + which); } - ma.addPoi(new Fountain(0, size, null)); + poiHandler.addPoi(new Fountain(0, size, null)); } }); return builder.create(); diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddHutDialog.java b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddHutDialog.java index 44fa2d2..91d7580 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddHutDialog.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddHutDialog.java @@ -14,16 +14,17 @@ import de.apps4ics.mountainnavigation.Features; import de.apps4ics.mountainnavigation.MainActivity; import de.apps4ics.mountainnavigation.R; +import de.apps4ics.mountainnavigation.handlers.PoiHandler; /** * Created by Vinz on 03.11.2015. */ //TODO beautify public class AddHutDialog extends DialogFragment { - MainActivity ma; + PoiHandler poiHandler; - public AddHutDialog(MainActivity ma){ - this.ma = ma; + public AddHutDialog(PoiHandler poiHandler){ + this.poiHandler = poiHandler; } @Override @@ -55,7 +56,7 @@ type = Features.HUT_CATERING; break; } - ma.addPoi(new Hut(0, type, winterroom, name, null)); + poiHandler.addPoi(new Hut(0, type, winterroom, name, null)); } } }) diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPathDialog.java b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPathDialog.java index 8467b3f..76bd634 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPathDialog.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPathDialog.java @@ -26,10 +26,10 @@ * Created by Vinz on 03.11.2015. */ public class AddPathDialog extends DialogFragment { - MainActivity ma; + PoiHandler poiHandler; - public AddPathDialog(MainActivity ma){ - this.ma = ma; + public AddPathDialog(PoiHandler poiHandler){ + this.poiHandler = poiHandler; } @Override @@ -65,13 +65,13 @@ break; } } - ArrayList pathMarkers = ma.getPathMarkers(); + ArrayList pathMarkers = MainActivity.getPathMarkers(); if(pathMarkers.size() < 2){ Log.e(MainActivity.TAG, "One of the path markers in addPathDialog is null!"); } - RoadManager roadManager = new OSRMRoadManager(ma.getApplicationContext()); + RoadManager roadManager = new OSRMRoadManager(poiHandler.getContext()); ArrayList waypoints = new ArrayList<>(); DbGeoPoint current = null; DbGeoPoint last = null; @@ -91,20 +91,20 @@ current = new DbGeoPoint(gp.getLatitude(), gp.getLongitude(), gp.getAltitude(), time); if(pathMarkers.get(i).getTitle() == null){ - rowId = ma.addGp(current); + rowId = poiHandler.addGp(current); } current.setId(rowId); if(current != null && last != null){ - long poiId = ma.addPoi(new Path(0, 0, exposed, diffWet, giddiness, climbing, last, current)); + long poiId = poiHandler.addPoi(new Path(0, 0, exposed, diffWet, giddiness, climbing, last, current)); } last = current; } Road road = roadManager.getRoad(waypoints); - Polyline line = RoadManager.buildRoadOverlay(road, ma.getApplicationContext()); - ma.getMapView().getOverlays().add(line); - ma.getMapView().invalidate(); - ma.setPathMarkers(new ArrayList()); + Polyline line = RoadManager.buildRoadOverlay(road, poiHandler.getContext()); + MainActivity.getMapView().getOverlays().add(line); + MainActivity.getMapView().invalidate(); + MainActivity.setPathMarkers(new ArrayList()); } }) .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPeakDialog.java b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPeakDialog.java index f911f4b..8953abe 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPeakDialog.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddPeakDialog.java @@ -9,21 +9,22 @@ import de.apps4ics.mountainnavigation.MainActivity; import de.apps4ics.mountainnavigation.R; +import de.apps4ics.mountainnavigation.handlers.PoiHandler; /** * Created by Vinz on 03.11.2015. */ public class AddPeakDialog extends DialogFragment { - MainActivity ma; + PoiHandler poiHandler; - public AddPeakDialog(MainActivity ma){ - this.ma = ma; + public AddPeakDialog(PoiHandler poiHandler){ + this.poiHandler = poiHandler; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - final EditText input = new EditText(ma.getApplicationContext()); + final EditText input = new EditText(poiHandler.getContext()); builder.setTitle(R.string.peak_dialog_title) .setMessage(R.string.peak_dialog_msg) .setView(input) @@ -32,7 +33,7 @@ public void onClick(DialogInterface dialog, int which) { String name = input.getText().toString().trim(); if (name != null && !name.equals("")) { - ma.addPoi(new Peak(0, name, null)); + poiHandler.addPoi(new Peak(0, name, null)); } } })