diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/Features.java b/app/src/main/java/de/apps4ics/mountainnavigation/Features.java index e02287e..63dba21 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/Features.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/Features.java @@ -36,6 +36,9 @@ public static final int HUT_REFUGE = 0; public static final int HUT_SUPPORT = 1; public static final int HUT_CATERING = 2; + public static final int HIKE_FLOORING_STREET = 0; + public static final int HIKE_FLOORING_GRIT = 1; + public static final int HIKE_FLOORING_TRAIL = 2; //trash bins have no options //images might have no options //cell reception might has no options, (gets own DB table or predefined levels: level 0 => 0-20%, level 1 => 21-40%, ...) diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java index 928840b..e7f8fc7 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java @@ -52,12 +52,14 @@ import android.view.MenuItem; import android.view.View; import android.support.v4.widget.DrawerLayout; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; +import android.widget.Spinner; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; @@ -270,8 +272,30 @@ LayoutInflater inflater = getLayoutInflater(); View hikeDialog = inflater.inflate(R.layout.hike_dialog, null, true); final EditText input = (EditText) hikeDialog.findViewById(R.id.hike_name); + final Spinner flooring = (Spinner) hikeDialog.findViewById(R.id.hike_flooring_spinner); TextView lengthView = (TextView) hikeDialog.findViewById(R.id.hike_length); final TextView timeView = (TextView) hikeDialog.findViewById(R.id.hike_time); + final TextView heightUpView = (TextView) hikeDialog.findViewById(R.id.hike_height_up); + final TextView heightDownView = (TextView) hikeDialog.findViewById(R.id.hike_height_down); + + ArrayAdapter adapter = ArrayAdapter.createFromResource(MainActivity.this, + R.array.hike_floorings, android.R.layout.simple_spinner_item); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + flooring.setAdapter(adapter); + flooring.setSelection(Features.HIKE_FLOORING_TRAIL); + flooring.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String key = getResources().getStringArray(R.array.hike_floorings_keys)[position]; + if(key.equals(getString(R.string.hike_flooring_street_key))) { + } else if(key.equals(getString(R.string.hike_flooring_grit_key))) { + } else if(key.equals(getString(R.string.hike_flooring_trail_key))){ + } + } + @Override + public void onNothingSelected(AdapterView parent) { + } + }); int lengthRest = hikeHandler.getTime(); int hours = lengthRest / 3600; @@ -281,6 +305,8 @@ lengthView.setText(String.format(Locale.getDefault(), "Length so far: %.02fm", hikeHandler.getLength())); timeView.setText(String.format(Locale.getDefault(), "Time so far: %02d:%02d:%02d", hours, minutes, seconds)); + heightUpView.setText(String.format(Locale.getDefault(), "Up: %.02fm", hikeHandler.getUp())); + heightDownView.setText(String.format(Locale.getDefault(), "Down: %.02fm", hikeHandler.getDown())); AlertDialog.Builder saveHikeBuilder = new AlertDialog.Builder(MainActivity.this); saveHikeBuilder.setTitle(R.string.hike_save_title) @@ -292,8 +318,10 @@ if(!name.equals("")) { hikeHandler.stopRecording(); view.setText(hikeEntries[position]); + int floor = flooring.getSelectedItemPosition(); long time = System.currentTimeMillis(); - long hikeId = poiHandler.addPoi(new Hike(0, hikeHandler.getLength(), hikeHandler.getTime(), (int) (time % 3), name, "You", time, 0)); + long hikeId = poiHandler.addPoi(new Hike(0, hikeHandler.getLength(), hikeHandler.getTime(), (int) (time % 3), + name, "You", time, hikeHandler.getUp(), hikeHandler.getDown(), floor)); for(HikePoint hp : hikePoints) { poiHandler.addGp(new DbGeoPoint(hp.getLocation(), System.currentTimeMillis(), hikeId, Types.HIKE)); } @@ -373,12 +401,16 @@ TextView lengthView = (TextView) rowView.findViewById(R.id.hike_list_detail_length); TextView timeView = (TextView) rowView.findViewById(R.id.hike_list_detail_time); TextView difficultyView = (TextView) rowView.findViewById(R.id.hike_list_detail_difficulty); + TextView upView = (TextView) rowView.findViewById(R.id.hike_list_detail_up); + TextView downView = (TextView) rowView.findViewById(R.id.hike_list_detail_down); LinearLayout contentView = (LinearLayout) rowView.findViewById(R.id.hike_list_detail_inner); titleView.setText(hike.getName()); authorView.setText(String.format(Locale.getDefault(), res.getString(R.string.hike_list_author), hike.getAuthor())); lengthView.setText(String.format(Locale.getDefault(), "Length: %.02fm", hike.getLength())); timeView.setText(String.format(Locale.getDefault(), "Time: %ds", hike.getTime())); difficultyView.setText(res.getStringArray(R.array.hike_difficulties)[hike.getDifficulty()]); + upView.setText(String.format(Locale.getDefault(), "Up: %.02fm", hike.getHeightUp())); + downView.setText(String.format(Locale.getDefault(), "Down: %.02fm", hike.getHeightDown())); hikeMap.setTileSource(TileSourceFactory.MAPNIK); hikeMap.setBuiltInZoomControls(true); hikeMap.setMultiTouchControls(true); @@ -390,6 +422,11 @@ AlertDialog detailHikeDialog = new AlertDialog.Builder(MainActivity.this) .setTitle(String.format(Locale.getDefault(), res.getString(R.string.hike_detail_title), hike.getName())) .setView(rowView) + .setPositiveButton(R.string.hike_start_navigation, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }) .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/DatabaseHandler.java b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/DatabaseHandler.java index 8966946..c7ba5b1 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/DatabaseHandler.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/DatabaseHandler.java @@ -48,7 +48,7 @@ import de.apps4ics.mountainnavigation.pois.Wifi; public class DatabaseHandler extends SQLiteOpenHelper { - private static final int DATABASE_VERSION = 4; + private static final int DATABASE_VERSION = 6; private static final float MAX_POI_DISTANCE = 12.5f; private static final String DATABASE_NAME = "mountainNavigation.db"; @@ -105,7 +105,9 @@ private static final String KEY_HIKE_NAME = "_hike_name"; private static final String KEY_HIKE_AUTHOR = "_hike_author"; private static final String KEY_HIKE_TIMESTAMP = "_hike_timestamp"; - private static final String KEY_HIKE_HEIGHT = "_hike_height"; + private static final String KEY_HIKE_HEIGHT_UP = "_hike_height_up"; + private static final String KEY_HIKE_HEIGHT_DOWN = "_hike_height_down"; + private static final String KEY_HIKE_FLOORING = "_flooring"; public DatabaseHandler(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); @@ -197,7 +199,9 @@ + KEY_HIKE_NAME + " TEXT," + KEY_HIKE_AUTHOR + " TEXT," + KEY_HIKE_TIMESTAMP + " INTEGER," - + KEY_HIKE_HEIGHT + " INTEGER" + ")"; + + KEY_HIKE_HEIGHT_UP + " REAL," + + KEY_HIKE_HEIGHT_DOWN + " REAL," + + KEY_HIKE_FLOORING + " INTEGER" + ")"; db.execSQL(CREATE_HIKE_TABLE); } @@ -293,7 +297,9 @@ values.put(KEY_HIKE_NAME, hike.getName()); values.put(KEY_HIKE_AUTHOR, hike.getAuthor()); values.put(KEY_HIKE_TIMESTAMP, hike.getTimestamp()); - values.put(KEY_HIKE_HEIGHT, hike.getHeight()); + values.put(KEY_HIKE_HEIGHT_UP, hike.getHeightUp()); + values.put(KEY_HIKE_HEIGHT_DOWN, hike.getHeightDown()); + values.put(KEY_HIKE_FLOORING, hike.getFlooring()); break; } return values; @@ -346,13 +352,15 @@ String name = cursor.getString(4); String author = cursor.getString(5); long timestamp = cursor.getLong(6); - float height = cursor.getFloat(7); - return new Hike(id, length, time, difficulty, name, author, timestamp, height); + float heightUp = cursor.getFloat(7); + float heightDown = cursor.getFloat(8); + int flooring = cursor.getInt(9); + return new Hike(id, length, time, difficulty, name, author, timestamp, heightUp, heightDown, flooring); } private Hike getHike(SQLiteDatabase db, long id){ Cursor cursor = db.query(TABLE_HIKE, - new String[]{KEY_POI_ID, KEY_HIKE_LENGTH, KEY_HIKE_TIME, KEY_HIKE_DIFFICULTY, KEY_HIKE_NAME, KEY_HIKE_AUTHOR, KEY_HIKE_TIMESTAMP, KEY_HIKE_HEIGHT}, + new String[]{KEY_POI_ID, KEY_HIKE_LENGTH, KEY_HIKE_TIME, KEY_HIKE_DIFFICULTY, KEY_HIKE_NAME, KEY_HIKE_AUTHOR, KEY_HIKE_TIMESTAMP, KEY_HIKE_HEIGHT_UP, KEY_HIKE_HEIGHT_DOWN, KEY_HIKE_FLOORING}, KEY_POI_ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null); if (cursor != null) { diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/HikeHandler.java b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/HikeHandler.java index 80490fc..42fad15 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/HikeHandler.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/HikeHandler.java @@ -32,12 +32,17 @@ import de.apps4ics.mountainnavigation.HikePoint; public class HikeHandler { + private static final float MIN_ALTITUDE_DIFFERENCE = 20; + private boolean isRecording; private List timestamps; private List geopoints; private Polyline path; private int time; private float length; + private float up; + private float down; + private float lastAltitude; private boolean needsUpdate; public HikeHandler(Polyline path) { @@ -45,6 +50,11 @@ geopoints = new ArrayList<>(); this.path = path; needsUpdate = false; + time = 0; + length = 0; + up = 0; + down = 0; + lastAltitude = Integer.MIN_VALUE; } public boolean isRecording() { @@ -56,6 +66,8 @@ path.setPoints(new ArrayList()); time = 0; length = 0; + up = 0; + down = 0; timestamps = new ArrayList<>(); geopoints = new ArrayList<>(); } @@ -88,6 +100,12 @@ needsUpdate = true; geopoints.add(new GeoPoint(location.getLatitude(), location.getLongitude(), location.getAltitude())); timestamps.add(System.currentTimeMillis()); + float currentAltitude = (float) location.getAltitude(); + if(lastAltitude != Integer.MIN_VALUE && Math.abs(lastAltitude - currentAltitude) > MIN_ALTITUDE_DIFFERENCE){ + if(lastAltitude < currentAltitude) up += currentAltitude - lastAltitude; + else down += lastAltitude - currentAltitude; + } + lastAltitude = currentAltitude; path.setPoints(geopoints); } @@ -113,4 +131,12 @@ public Polyline getPath() { return path; } + + public float getUp() { + return up; + } + + public float getDown() { + return down; + } } diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/pois/Hike.java b/app/src/main/java/de/apps4ics/mountainnavigation/pois/Hike.java index 6d9265b..a19dc31 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/pois/Hike.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/pois/Hike.java @@ -28,7 +28,9 @@ private String name; private String author; private long timestamp; - private float height; + private float heightUp; + private float heightDown; + private int flooring; public Hike(long _id) { super(_id, Types.HIKE); @@ -36,7 +38,7 @@ public Hike(){ super(Types.HIKE); } - public Hike(long _id, float length, long time, int difficulty, String name, String author, long timestamp, float height){ + public Hike(long _id, float length, long time, int difficulty, String name, String author, long timestamp, float heightUp, float heightDown, int flooring){ super(_id, Types.HIKE); this.length = length; this.time = time; @@ -44,7 +46,9 @@ this.name = name; this.author = author; this.timestamp = timestamp; - this.height = height; + this.heightUp = heightUp; + this.heightDown = heightDown; + this.flooring = flooring; } public long getTimestamp() { @@ -71,12 +75,20 @@ this.difficulty = difficulty; } - public float getHeight() { - return height; + public float getHeightUp() { + return heightUp; } - public void setHeight(float height) { - this.height = height; + public void setHeightUp(float heightUp) { + this.heightUp = heightUp; + } + + public float getHeightDown() { + return heightDown; + } + + public void setHeightDown(float heightDown) { + this.heightDown = heightDown; } public float getLength() { @@ -102,4 +114,12 @@ public void setTime(long time) { this.time = time; } + + public int getFlooring() { + return flooring; + } + + public void setFlooring(int flooring) { + this.flooring = flooring; + } } diff --git a/app/src/main/res/layout/hike_dialog.xml b/app/src/main/res/layout/hike_dialog.xml index 91d53bf..9e662b1 100644 --- a/app/src/main/res/layout/hike_dialog.xml +++ b/app/src/main/res/layout/hike_dialog.xml @@ -43,6 +43,15 @@ android:layout_marginEnd="16dp" android:inputType="text"/> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/hike_list_detail.xml b/app/src/main/res/layout/hike_list_detail.xml index c07cbc1..8738dde 100644 --- a/app/src/main/res/layout/hike_list_detail.xml +++ b/app/src/main/res/layout/hike_list_detail.xml @@ -82,6 +82,33 @@ android:textColor="@color/text_color_light" android:fontFamily="sans-serif-light" android:layout_gravity="center_vertical" - android:gravity="center_vertical" - android:paddingBottom="16dp"/> + android:gravity="center_vertical"/> + + + + \ No newline at end of file diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 293d1e4..0cdff54 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -87,6 +87,7 @@ Eigenschaften von %1$s Wanderungen in deiner Nähe von %1$s + Starte Navigation de H:m @@ -141,6 +142,11 @@ Mittel Schwer + + Straße + Kies + Wanderweg + Herunterladen Einstellungen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9f7ae6..6faee34 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,6 +89,7 @@ Details of %1$s Hikes around you from %1$s + Start navigation en h:m a @@ -143,6 +144,9 @@ forecastDaily forecastHour current + hikeStreet + hikeGrit + hikeTrail 5 20 @@ -168,6 +172,11 @@ Medium Hard + + Street + Grit + Trail + Download Settings @@ -232,6 +241,11 @@ @string/download_forecast_hour_key @string/download_current_key + + @string/hike_flooring_street_key + @string/hike_flooring_grit_key + @string/hike_flooring_trail_key + %1$s day %1$s days