Skip to content

Commit

Permalink
Merge pull request santiago-hollmann#53 from santiago-hollmann/develop
Browse files Browse the repository at this point in the history
Merge develop into master
  • Loading branch information
santiago-hollmann committed Mar 21, 2017
2 parents 68ebcd6 + 38a31b9 commit c88bc82
Show file tree
Hide file tree
Showing 35 changed files with 1,183 additions and 131 deletions.
26 changes: 12 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,37 @@
<img src="http://i.imgur.com/K8P2El4.png" height="25%" width="25%"">
#IGC Parser Project
<img src="http://i.imgur.com/K8P2El4.png" height="25%" width="25%">

# IGC Parser Project
This is an open source project that includes:
- An Android library to parse IGC files.
- An Android app to friendly view IGC files.
* An Android library to parse IGC files.
* An Android app (IGC Viewer) to friendly view IGC files.

You are more than welcome to contribute to the project. Below you can find some way to contribute to.

<b>Disclosure</b>: the project is not approbed by the <a href="http://www.fai.org/">FAI</a> so, don't use it to get offical FAI statistics and records.
<b>Disclosure</b>: the project is not approved by the <a href="http://www.fai.org/">FAI</a> so, don't use it to get offical FAI statistics and records.

##IGC Viewer Screenshots
<img src="http://i.imgur.com/YG7SRqH.png" height="32%" width="32%">
<img src="http://i.imgur.com/q6lTaZc.png" height="32%" width="32%">
<img src="http://i.imgur.com/6oeLqBM.png" height="32%" width="32%">
## IGC Viewer Screenshots
<img src="http://i.imgur.com/YG7SRqH.png" height="32%" width="32%">|<img src="http://i.imgur.com/q6lTaZc.png" height="32%" width="32%">|<img src="http://i.imgur.com/6oeLqBM.png" height="32%" width="32%">

##Contact
## Contact
Feel free to contact me with requests, ideas, issues or any kind of feedback.
* Twitter: <a href="http://www.twitter.com/santihollmann">@santihollmann</a>
* Instagram: <a href="https://www.instagram.com/santihollmann">@santihollmann</a>
* Email: [email protected]

##Ways of Contribution
## Ways of Contribution
Here you can find some ways for contribution. If you are insterested in, please contact me.

* Translate the app to your language (it's super easy and quick).
* Add more flight data and statistics.
* Include new features to the app.
* Improve algorithms.
* Port the project to other languages and platforms.

##Special Thanks to
## Special Thanks to
* <a href="http://www.forsterlewis.com/">Ian Forster-Lewis</a> for his <a href="http://carrier.csi.cam.ac.uk/forsterlewis/soaring/igc_file_format/igc_format_2008.html#link_C/">IGC File Format Reference</a>
* <a href="http://www.maurogianzone.com">Mauro Gianzone</a> for contributing to app design.
* <a href="http://getliquid.co/nscalise/">Nicolás Scalise</a> for contributing to product definitions.

##Credits
## Credits
* <a href="https://thenounproject.com/search/?q=glider&i=5365">Glider</a> by Sergey Kashin from the Noun Project.
* <a href="https://github.com/PhilJay/MPAndroidChart">MPAndroidChart</a> created by Philipp Jahoda.
* <a href="https://github.com/greenrobot/EventBus">Event Bus</a> created by Green Robot.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ android {
applicationId "com.shollmann.igcparser"
minSdkVersion 16
targetSdkVersion 24
versionCode 10500
versionName "1.5.0"
versionCode 10702
versionName "1.7.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
Expand Down
12 changes: 8 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
android:theme="@style/AppTheme">

<activity
android:name=".ui.IGCFilesActivity"
android:name=".ui.activity.IGCFilesActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait">
<intent-filter>
Expand All @@ -24,7 +24,7 @@
</intent-filter>
</activity>
<activity
android:name=".ui.FlightPreviewActivity"
android:name=".ui.activity.FlightPreviewActivity"
android:screenOrientation="portrait">
<intent-filter
android:icon="@drawable/ic_launcher"
Expand Down Expand Up @@ -69,11 +69,15 @@
</intent-filter>
</activity>
<activity
android:name=".ui.AboutActivity"
android:name=".ui.activity.AboutActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name=".ui.FlightInformationActivity"
android:name=".ui.activity.FlightInformationActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name=".ui.activity.SettingsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore;
import com.shollmann.android.igcparser.model.IGCFile;
import com.shollmann.android.igcparser.model.TaskConfig;
import com.shollmann.igcparser.util.PreferencesHelper;

import io.fabric.sdk.android.Fabric;

Expand All @@ -42,8 +44,14 @@ public void onCreate() {
super.onCreate();
instance = this;
setupCrashlytics();
setupTaskConfig();

}

private void setupTaskConfig() {
TaskConfig.setAreaWidth(PreferencesHelper.getAreaWidth());
TaskConfig.setStartLength(PreferencesHelper.getStartLength());
TaskConfig.setFinishLength(PreferencesHelper.getFinishLength());
}

private void setupCrashlytics() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ public class TrackerHelper {
private static final String SHARE_APP = "Share app";
private static final String SHARE_FLIGHT = "Share flight";
private static final String OPEN_GMAIL_FLIGHT = "Open Gmail Flight";
private static final String OPEN_SETTINGS = "Open Settings";
private static final String SETTINGS_CHANGE_AREA = "Change Area";
private static final String SETTINGS_CHANGE_START = "Change Start";
private static final String SETTINGS_CHANGE_FINISH = "Change Finish";

public static void trackFlightDisplayed() {
AnswersHelper.trackEvent(FLIGHT_DISPLAYED);
Expand Down Expand Up @@ -144,4 +148,20 @@ public static void trackShareFlight() {
public static void trackOpenGmailFlight() {
AnswersHelper.trackEvent(OPEN_GMAIL_FLIGHT);
}

public static void trackSettings() {
AnswersHelper.trackEvent(OPEN_SETTINGS);
}

public static void trackChangeArea() {
AnswersHelper.trackEvent(SETTINGS_CHANGE_AREA);
}

public static void trackChangeStart() {
AnswersHelper.trackEvent(SETTINGS_CHANGE_START);
}

public static void trackChangeFinish() {
AnswersHelper.trackEvent(SETTINGS_CHANGE_FINISH);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* SOFTWARE.
*/

package com.shollmann.igcparser.ui;
package com.shollmann.igcparser.ui.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@
* SOFTWARE.
*/

package com.shollmann.igcparser.ui;
package com.shollmann.igcparser.ui.activity;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.MenuItem;
Expand Down Expand Up @@ -108,8 +109,8 @@ private void showInformation() {
insertField(R.drawable.ic_distance, R.string.distance, Utilities.getDistanceInKm(igcFile.getDistance(), getResources().getConfiguration().locale) + "km");
insertField(R.drawable.ic_min, R.string.min_altitude, Utilities.getFormattedNumber(igcFile.getMinAltitude(), getResources().getConfiguration().locale) + "m");
insertField(R.drawable.ic_max, R.string.max_altitude, Utilities.getFormattedNumber(igcFile.getMaxAltitude(), getResources().getConfiguration().locale) + "m");
insertField(R.drawable.ic_departure, R.string.take_off, Utilities.getTimeHHMM(igcFile.getTakeOffTime()) + " UTC");
insertField(R.drawable.ic_landing, R.string.landing, Utilities.getTimeHHMM(igcFile.getLandingTime()) + " UTC");
insertField(R.drawable.ic_departure, R.string.take_off, String.format(getString(R.string.time_and_altitude), Utilities.getTimeHHMM(igcFile.getTakeOffTime()), igcFile.getTakeOffAltitude()));
insertField(R.drawable.ic_landing, R.string.landing, String.format(getString(R.string.time_and_altitude), Utilities.getTimeHHMM(igcFile.getLandingTime()), igcFile.getLandingAltitude()));
if (!igcFile.getWaypoints().isEmpty() && !Utilities.isZero(igcFile.getTaskDistance())) {
layoutTaskContainer.setVisibility(View.VISIBLE);
populateTask();
Expand Down Expand Up @@ -195,17 +196,52 @@ private void setupGraphic(LineChart chart, List<Entry> entries, float axisMinimu
}

private void populateTask() {
for (ILatLonRecord waypoint : igcFile.getWaypoints()) {
CRecordWayPoint cRecord = (CRecordWayPoint) waypoint;
if (!TextUtils.isEmpty(cRecord.getDescription().trim())) {
layoutWayPointsContainer.addView(createTaskTextView(cRecord.getDescription()));
}
if (igcFile.getWaypoints().isEmpty()) {
layoutWayPointsContainer.setVisibility(View.GONE);
return;
}
displayWaypoints();
//Add empty string to separate waypoints from statistics
layoutWayPointsContainer.addView(createTaskTextView(Constants.EMPTY_STRING));
displayTaskDistance();

if (igcFile.isTaskCompleted()) {
displayTaskTraveledDistance();
layoutWayPointsContainer.addView(createTaskTextView(String.format(getResources().getString(R.string.task_duration), igcFile.getTaskDuration())));
displayTaskAverageSpeed();
}


layoutWayPointsContainer.addView(createTaskTextView(getString(igcFile.isTaskCompleted() ? R.string.task_completed : R.string.task_not_completed)));
}

private void displayTaskAverageSpeed() {
if (igcFile.getTaskAverageSpeed() > 0) {
final String taskAverageSpeed = String.format(getResources().getString(R.string.task_average_speed), igcFile.getTaskAverageSpeed() + "km/h");
layoutWayPointsContainer.addView(createTaskTextView(taskAverageSpeed));
}
}

private void displayTaskTraveledDistance() {
if (!Utilities.isZero(igcFile.getTraveledTaskDistance())) {
final String taskTraveledDistanceText = String.format(getResources().getString(R.string.task_made_distance), Utilities.getDistanceInKm(igcFile.getTraveledTaskDistance(), getResources().getConfiguration().locale));
layoutWayPointsContainer.addView(createTaskTextView(taskTraveledDistanceText));
}
}

private void displayTaskDistance() {
if (!Utilities.isZero(igcFile.getTaskDistance())) {
final String taskDistanceText = String.format(getResources().getString(R.string.task_distance), Utilities.getDistanceInKm(igcFile.getTaskDistance(), getResources().getConfiguration().locale));
layoutWayPointsContainer.addView(createTaskTextView(taskDistanceText));
} else {
layoutWayPointsContainer.setVisibility(View.GONE);
}
}

private void displayWaypoints() {
for (ILatLonRecord waypoint : igcFile.getWaypoints()) {
CRecordWayPoint cRecord = (CRecordWayPoint) waypoint;
if (!TextUtils.isEmpty(cRecord.getDescription().trim())) {
layoutWayPointsContainer.addView(createTaskTextView(getReadableCRecordType(cRecord) + cRecord.getDescription()));
}
}
}

Expand All @@ -215,7 +251,7 @@ private TextView createTaskTextView(String value) {
txtWaypoint.setEllipsize(TextUtils.TruncateAt.END);
txtWaypoint.setMaxLines(2);
txtWaypoint.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.material_text_subhead));
txtWaypoint.setText(value);
txtWaypoint.setText(Html.fromHtml(value));
return txtWaypoint;
}

Expand All @@ -229,10 +265,10 @@ private String getReadableCRecordType(CRecordWayPoint cRecord) {
stringId = R.string.start;
break;
case TAKEOFF:
stringId = R.string.take_off;
stringId = R.string.task_take_off;
break;
case LANDING:
stringId = R.string.landing;
stringId = R.string.task_landing;
break;
case TURN:
stringId = R.string.turn;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* MIT License
*
* Copyright (c) 2016 Santiago Hollmann
* Copyright (c) 2017 Santiago Hollmann
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
Expand All @@ -22,7 +22,7 @@
* SOFTWARE.
*/

package com.shollmann.igcparser.ui;
package com.shollmann.igcparser.ui.activity;

import android.content.Intent;
import android.graphics.Color;
Expand Down Expand Up @@ -67,9 +67,11 @@
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.maps.android.SphericalUtil;
import com.shollmann.android.igcparser.Parser;
import com.shollmann.android.igcparser.model.CRecordType;
import com.shollmann.android.igcparser.model.CRecordWayPoint;
import com.shollmann.android.igcparser.model.IGCFile;
import com.shollmann.android.igcparser.model.ILatLonRecord;
import com.shollmann.android.igcparser.model.TaskConfig;
import com.shollmann.android.igcparser.util.Logger;
import com.shollmann.android.igcparser.util.Utilities;
import com.shollmann.igcparser.IGCViewerApplication;
Expand Down Expand Up @@ -286,23 +288,31 @@ private void displayWayPoints() {
}

private void displayFinishStartLines(List<ILatLonRecord> waypoints) {
try {
googleMap.addPolyline(MapUtilities.getPerpendicularPolyline(waypoints.get(1), waypoints.get(2), Constants.Map.START_RADIUS));
googleMap.addPolyline(MapUtilities.getPerpendicularPolyline(waypoints.get(waypoints.size() - 2), waypoints.get(waypoints.size() - 3), Constants.Map.FINISH_RADIUS));
try {//TODO Move the logic to determine takeoff, start, etc points to WaypointsHelper
if (((CRecordWayPoint) waypoints.get(0)).getType() == CRecordType.START) {
googleMap.addPolyline(MapUtilities.getPerpendicularPolyline(waypoints.get(0), waypoints.get(1), TaskConfig.getStartLength()));
} else {
googleMap.addPolyline(MapUtilities.getPerpendicularPolyline(waypoints.get(1), waypoints.get(2), TaskConfig.getStartLength()));
}
if (((CRecordWayPoint) waypoints.get(waypoints.size() - 1)).getType() == CRecordType.FINISH) {
googleMap.addPolyline(MapUtilities.getPerpendicularPolyline(waypoints.get(waypoints.size() - 1), waypoints.get(waypoints.size() - 2), TaskConfig.getFinishLength()));
} else {
googleMap.addPolyline(MapUtilities.getPerpendicularPolyline(waypoints.get(waypoints.size() - 2), waypoints.get(waypoints.size() - 3), TaskConfig.getFinishLength()));
}
} catch (Throwable t) {
Logger.logError("Error trying to draw task lines: " + t.getMessage());
}
}

private void displayMarkers(List<ILatLonRecord> waypoints) {
try {
for (int i = 1; i < waypoints.size() - 2; i++) {
final ILatLonRecord wayPoint = waypoints.get(i);
if (!MapUtilities.isZeroCoordinate(wayPoint)) {
for (int i = 0; i < waypoints.size(); i++) {
final CRecordWayPoint wayPoint = (CRecordWayPoint) waypoints.get(i);
if (wayPoint.getType() == CRecordType.TURN || wayPoint.getType() == CRecordType.START) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(wayPoint.getLatLon().getLat(), wayPoint.getLatLon().getLon()))
.draggable(false)
.title(((CRecordWayPoint) wayPoint).getDescription()));
.title(wayPoint.getDescription()));
}
}
} catch (Throwable t) {
Expand All @@ -314,11 +324,15 @@ private void displayLinesAndAreas(List<ILatLonRecord> waypoints) {
try {
PolylineOptions polyline = new PolylineOptions().width(ResourcesHelper.getDimensionPixelSize(R.dimen.task_line_width)).color(getResources().getColor(R.color.task_line));

for (int i = 1; i < waypoints.size() - 1; i++) {
polyline.add(new LatLng(waypoints.get(i).getLatLon().getLat(), waypoints.get(i).getLatLon().getLon()));
if (i > 1 && i < waypoints.size() - 2) {
for (int i = 0; i < waypoints.size(); i++) {
CRecordWayPoint cRecordWayPoint = (CRecordWayPoint) waypoints.get(i);
if (cRecordWayPoint.getType() == CRecordType.START || cRecordWayPoint.getType() == CRecordType.TURN || cRecordWayPoint.getType() == CRecordType.FINISH) {
polyline.add(new LatLng(waypoints.get(i).getLatLon().getLat(), waypoints.get(i).getLatLon().getLon()));
}
if (cRecordWayPoint.getType() == CRecordType.TURN) {
googleMap.addCircle(new CircleOptions().center(new LatLng(waypoints.get(i).getLatLon().getLat(), waypoints.get(i).getLatLon().getLon()))
.radius(Constants.Map.TASK_RADIUS).strokeColor(Color.TRANSPARENT).strokeWidth(getResources().getDimensionPixelSize(R.dimen.task_line_width))
.radius(TaskConfig.getAreaWidth()).strokeColor(Color.TRANSPARENT)
.strokeWidth(getResources().getDimensionPixelSize(R.dimen.task_line_width))
.fillColor(getResources().getColor(R.color.task_fill_color)));
}
}
Expand Down
Loading

0 comments on commit c88bc82

Please sign in to comment.