diff --git a/.gitignore b/.gitignore index d1b424dd245..deadb797fb8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ gen/ out/ .gradle local.properties +git.xml diff --git a/java/com.sap.sailing.gwt.ui/images/flags°af.png b/java/com.sap.sailing.gwt.ui/images/flags°af.png deleted file mode 100644 index a4742e299f5..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/flags°af.png and /dev/null differ diff --git a/mobile/com.sap.sailing.android.shared/.classpath b/mobile/com.sap.sailing.android.shared/.classpath old mode 100644 new mode 100755 diff --git a/mobile/com.sap.sailing.android.shared/build.gradle b/mobile/com.sap.sailing.android.shared/build.gradle index ae54969700f..64eda8d78f1 100644 --- a/mobile/com.sap.sailing.android.shared/build.gradle +++ b/mobile/com.sap.sailing.android.shared/build.gradle @@ -34,8 +34,6 @@ android { } dependencies { - compile "net.hockeyapp.android:HockeySDK:3.5.0" - /* support libraries */ compile 'com.android.support:appcompat-v7:22.0.0' diff --git a/mobile/com.sap.sailing.android.shared/res/layout/fragment_container.xml b/mobile/com.sap.sailing.android.shared/res/layout/fragment_container.xml index bf374a68b02..0501147ba99 100644 --- a/mobile/com.sap.sailing.android.shared/res/layout/fragment_container.xml +++ b/mobile/com.sap.sailing.android.shared/res/layout/fragment_container.xml @@ -18,7 +18,7 @@ android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_gravity="center|start" android:lines="1" android:singleLine="true" android:textSize="16sp"/> @@ -27,7 +27,7 @@ android:id="@+id/toolbar_subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_gravity="center|start" android:lines="1" android:singleLine="true" android:textSize="12sp" /> diff --git a/mobile/com.sap.sailing.android.shared/res/layout/fragment_home.xml b/mobile/com.sap.sailing.android.shared/res/layout/fragment_home.xml index aa16f58a387..d0182c9b70d 100644 --- a/mobile/com.sap.sailing.android.shared/res/layout/fragment_home.xml +++ b/mobile/com.sap.sailing.android.shared/res/layout/fragment_home.xml @@ -2,7 +2,7 @@ + android:layout_height="match_parent"> - + + android:layout_alignParentStart="true" + android:background="@color/black_transparent"> - + android:textSize="18sp" + android:textStyle="bold" /> + + android:textSize="18sp" /> + android:dividerHeight="1dp"> diff --git a/mobile/com.sap.sailing.android.shared/res/layout/ragatta_listview_row.xml b/mobile/com.sap.sailing.android.shared/res/layout/ragatta_listview_row.xml index 5ab7a7d5c20..5796aed5cb6 100644 --- a/mobile/com.sap.sailing.android.shared/res/layout/ragatta_listview_row.xml +++ b/mobile/com.sap.sailing.android.shared/res/layout/ragatta_listview_row.xml @@ -18,8 +18,8 @@ android:src="@drawable/yellow_arrow_right" android:layout_marginTop="13dp" android:layout_marginBottom="10dp" - android:layout_marginRight="10dp" - android:layout_marginEnd="10dp" + android:layout_marginRight="14dp" + android:layout_marginEnd="14dp" android:textColor="@color/white" /> diff --git a/mobile/com.sap.sailing.android.shared/res/layout/regatta_listview_header.xml b/mobile/com.sap.sailing.android.shared/res/layout/regatta_listview_header.xml index f43cf46f706..c875409096a 100644 --- a/mobile/com.sap.sailing.android.shared/res/layout/regatta_listview_header.xml +++ b/mobile/com.sap.sailing.android.shared/res/layout/regatta_listview_header.xml @@ -17,8 +17,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/top_bar" - android:padding="14dp" - android:textSize="18sp" + android:padding="16dp" + android:textSize="16sp" android:background="@color/colorPrimary" android:textColor="@color/white" android:text="@string/your_regattas" /> diff --git a/mobile/com.sap.sailing.android.shared/res/values-de/strings.xml b/mobile/com.sap.sailing.android.shared/res/values-de/strings.xml index 957bdb631f6..4f96f94f5a0 100644 --- a/mobile/com.sap.sailing.android.shared/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.android.shared/res/values-de/strings.xml @@ -29,5 +29,6 @@ Ihre Regattas: + Aktualisieren \ No newline at end of file diff --git a/mobile/com.sap.sailing.android.shared/res/values/colors.xml b/mobile/com.sap.sailing.android.shared/res/values/colors.xml index 3aa12e453e6..1decd2548a9 100644 --- a/mobile/com.sap.sailing.android.shared/res/values/colors.xml +++ b/mobile/com.sap.sailing.android.shared/res/values/colors.xml @@ -37,6 +37,7 @@ #000000 #55000000 + #D8000000 #FFFFFF #CCFFFFFF #8AB54E diff --git a/mobile/com.sap.sailing.android.shared/res/values/strings.xml b/mobile/com.sap.sailing.android.shared/res/values/strings.xml index 78f182936ce..9103d8ead67 100644 --- a/mobile/com.sap.sailing.android.shared/res/values/strings.xml +++ b/mobile/com.sap.sailing.android.shared/res/values/strings.xml @@ -30,6 +30,7 @@ Your Regattas: + Refresh Error: Database operation has failed. diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/activities/AbstractStartActivity.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/activities/AbstractStartActivity.java old mode 100644 new mode 100755 diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/customviews/OpenSansToolbar.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/customviews/OpenSansToolbar.java index 237494781fc..9501b30af20 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/customviews/OpenSansToolbar.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/customviews/OpenSansToolbar.java @@ -3,6 +3,8 @@ package com.sap.sailing.android.shared.ui.customviews; import android.content.Context; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; import android.widget.TextView; import com.sap.sailing.android.shared.R; @@ -44,4 +46,17 @@ public class OpenSansToolbar extends Toolbar { TextView subtitleTextView = (TextView)findViewById(R.id.toolbar_subtitle); subtitleTextView.setText(arg0); } + + public void hideSubtitle(){ + TextView titleTextView = (TextView)findViewById(R.id.toolbar_title); + titleTextView.setPadding(0,6,0,0); + TextView subtitleTextView = (TextView)findViewById(R.id.toolbar_subtitle); + subtitleTextView.setVisibility(View.GONE); + } + + public void setTitleSize(float size){ + TextView titleTextView = (TextView)findViewById(R.id.toolbar_title); + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); + titleTextView.setTextColor(getResources().getColor(R.color.white)); + } } diff --git a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml index 9a8706e2347..9b9aa4d2a77 100644 --- a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml +++ b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml @@ -6,7 +6,7 @@ + android:targetSdkVersion="22" /> - Checkout Team Foto hinzufügen Team Foto ersetzen - Aktualisieren Andere Einstellungen Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung Geräte-ID diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml index 659ac82bb1d..cc1455d3a9e 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml @@ -7,7 +7,6 @@ Checkout Add Team Photo Replace Team Photo - Refresh Other Settings Device Identifier SAP Sailing Tracker started diff --git a/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml b/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml index 9d08f21e615..0ec6eec9dbd 100644 --- a/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml +++ b/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml @@ -1,23 +1,25 @@ + android:versionName="1.0"> - - + + - - + + + android:theme="@style/AppTheme"> - + android:value="AIzaSyDH-Dwy5yFlyBa2-VUgiZ3qGGUO8M_0MPY" /> + + android:screenOrientation="portrait"> @@ -60,22 +62,22 @@ android:scheme="http" /> - + - + android:screenOrientation="portrait"> + - + - + android:screenOrientation="portrait"> + - + + android:exported="false"> diff --git a/mobile/com.sap.sailing.buoy.positioning/build.gradle b/mobile/com.sap.sailing.buoy.positioning/build.gradle index e7080104887..835cb782ab5 100644 --- a/mobile/com.sap.sailing.buoy.positioning/build.gradle +++ b/mobile/com.sap.sailing.buoy.positioning/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.android.application" +apply from: "../git.gradle" def packageName = "com.sap.sailing.android.buoy.positioning.app" def verCode = 1 diff --git a/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_detail.xml b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_detail.xml index 370387bcdf1..a852febf720 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_detail.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_detail.xml @@ -5,29 +5,49 @@ android:background="@color/black" android:orientation="vertical" android:paddingLeft="0dp" - android:paddingRight="0dp" > + android:paddingRight="0dp"> - + - + android:layout_weight="1" + android:background="@color/white"> + + + + + + + + + @@ -35,17 +55,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingBottom="15dp" - android:paddingLeft="10dp" - android:paddingRight="7dp" - android:paddingTop="15dp" > + android:paddingBottom="12dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingTop="12dp"> + android:textSize="20sp" /> @@ -58,10 +78,15 @@ android:id="@+id/marker_gps_accuracy" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="" + android:layout_marginRight="5dp" android:textColor="@color/white" - android:textSize="16sp" + android:textSize="20sp" android:textStyle="bold" /> + + @@ -70,51 +95,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingBottom="15dp" - android:paddingLeft="10dp" - android:paddingRight="7dp" - android:paddingTop="15dp" > - - - - - - - - - - - - - + android:paddingBottom="12dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingTop="12dp"> + android:textSize="20sp" /> @@ -127,9 +118,41 @@ android:id="@+id/marker_gps_latitude" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="" android:textColor="@color/white" - android:textSize="16sp" /> + android:textSize="20sp" /> + + + + + + + + + + + + + @@ -137,13 +160,13 @@ \ No newline at end of file diff --git a/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_overview.xml b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_overview.xml index 66cf97d8a84..b4654a2aa3f 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_overview.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_overview.xml @@ -3,29 +3,42 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black_transparent" - android:orientation="vertical" - android:paddingLeft="10dp" - android:paddingRight="10dp"> + android:orientation="vertical"> - + + + android:orientation="vertical" + android:paddingLeft="16dp" + android:paddingRight="16dp"> + - + + + - + - \ No newline at end of file + android:layout_height="wrap_content" /> + + diff --git a/mobile/com.sap.sailing.buoy.positioning/res/layout/mark_listview_row.xml b/mobile/com.sap.sailing.buoy.positioning/res/layout/mark_listview_row.xml index 2dd18afc4dc..bc45739f7d5 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/layout/mark_listview_row.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/layout/mark_listview_row.xml @@ -9,8 +9,8 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_marginBottom="10dp" - android:layout_marginEnd="10dp" - android:layout_marginRight="10dp" + android:layout_marginEnd="14dp" + android:layout_marginRight="14dp" android:layout_centerVertical="true" android:contentDescription="@string/empty" android:src="@drawable/yellow_arrow_right" @@ -23,8 +23,9 @@ android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="15dp" - android:paddingLeft="15dp" - android:paddingRight="15dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:textSize="20sp" android:singleLine="true" android:textColor="@color/white" /> @@ -35,10 +36,11 @@ android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/mark_name" - android:layout_marginTop="10dp" + android:layout_marginTop="2dp" android:layout_marginBottom="15dp" - android:paddingLeft="15dp" - android:paddingRight="15dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:textSize="14sp" android:singleLine="true" android:textColor="@color/white" /> diff --git a/mobile/com.sap.sailing.buoy.positioning/res/menu/empty_menu.xml b/mobile/com.sap.sailing.buoy.positioning/res/menu/empty_menu.xml new file mode 100644 index 00000000000..fe187c0cf47 --- /dev/null +++ b/mobile/com.sap.sailing.buoy.positioning/res/menu/empty_menu.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.buoy.positioning/res/menu/regatta_menu.xml b/mobile/com.sap.sailing.buoy.positioning/res/menu/regatta_menu.xml new file mode 100644 index 00000000000..539eb7da2bf --- /dev/null +++ b/mobile/com.sap.sailing.buoy.positioning/res/menu/regatta_menu.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml b/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml index 6a4db05f13b..a186481f91d 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml @@ -4,12 +4,10 @@ Markierungs Position setzen Kurstyp Kursmarkierungen - Breitengrad - Längengrad Position setzen Position zurücksetzen Empfangen der Markierungen.. - gesetzt - nicht gesetzt + Gesetzt + Nicht gesetzt \ No newline at end of file diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/colors.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/colors.xml index 891c613302b..409851cf238 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/values/colors.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/values/colors.xml @@ -1,4 +1,4 @@ - + #FFFFFF #55FFFFFF diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml index 0144df93890..000c8812703 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml @@ -5,8 +5,8 @@ Set Mark Position Course Type Marks - Longitude - Latitude + Lng + Lat Set Position Reset Position Getting race marks.. diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java index 969bcdd83f2..410d05bac28 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java @@ -1,8 +1,6 @@ package com.sap.sailing.android.buoy.positioning.app.adapter; -import java.util.List; - import android.content.Context; import android.database.Cursor; import android.support.v4.widget.ResourceCursorAdapter; @@ -14,6 +12,8 @@ import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract; import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper; import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo; +import java.util.List; + public class MarkAdapter extends ResourceCursorAdapter { @@ -34,7 +34,7 @@ public class MarkAdapter extends ResourceCursorAdapter { } else{ setText = context.getString(R.string.set); - String accuracy = " (" + markPings.get(0).getAccuracy() + ")"; + String accuracy = " (~ " + markPings.get(0).getAccuracy() + ")"; setText += accuracy; } markName.setText(name); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/provider/AnalyticsProvider.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/provider/AnalyticsProvider.java index c20c0198cab..9abd14d4bd9 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/provider/AnalyticsProvider.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/provider/AnalyticsProvider.java @@ -1,7 +1,5 @@ package com.sap.sailing.android.buoy.positioning.app.provider; -import java.util.Arrays; - import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; @@ -22,6 +20,8 @@ import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences; import com.sap.sailing.android.shared.logging.ExLog; import com.sap.sailing.android.shared.util.SelectionBuilder; +import java.util.Arrays; + public class AnalyticsProvider extends ContentProvider { private static final String TAG = AnalyticsProvider.class.getName(); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/BaseActivity.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/BaseActivity.java index fc61948b3aa..8c2012f3170 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/BaseActivity.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/BaseActivity.java @@ -2,8 +2,10 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities; import android.os.Bundle; import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; +import com.sap.sailing.android.buoy.positioning.app.R; import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences; import com.sap.sailing.android.shared.ui.activities.AbstractBaseActivity; @@ -19,8 +21,8 @@ public class BaseActivity extends AbstractBaseActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - //MenuInflater inflater = getMenuInflater(); - //inflater.inflate(R.menu.options_menu, menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.empty_menu, menu); return true; } @@ -34,6 +36,6 @@ public class BaseActivity extends AbstractBaseActivity { @Override protected int getOptionsMenuResId() { - return 0; + return R.menu.empty_menu; } } diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/PositioningActivity.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/PositioningActivity.java index 18ff2e3a29f..871c611293c 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/PositioningActivity.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/PositioningActivity.java @@ -4,7 +4,9 @@ import java.util.List; import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.Toolbar; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import com.sap.sailing.android.buoy.positioning.app.R; import com.sap.sailing.android.buoy.positioning.app.ui.fragments.BuoyFragment; @@ -13,6 +15,7 @@ import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper; import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo; import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo; import com.sap.sailing.android.shared.data.LeaderboardInfo; +import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar; public class PositioningActivity extends BaseActivity implements pingListener { @@ -31,11 +34,11 @@ public class PositioningActivity extends BaseActivity implements pingListener { getString(R.string.checkin_digest)); List marks = DatabaseHelper.getInstance().getMarks(this, checkinDigest); - leaderBoard = DatabaseHelper.getInstance().getLeaderboard(this, - checkinDigest); + setLeaderBoard(DatabaseHelper.getInstance().getLeaderboard(this, + checkinDigest)); for (MarkInfo mark : marks) { if (mark.getId().equals(markerID)) { - markInfo = mark; + setMarkInfo(mark); break; } } @@ -43,8 +46,10 @@ public class PositioningActivity extends BaseActivity implements pingListener { setPingFromDatabase(markerID); } - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar); if (toolbar != null) { + toolbar.hideSubtitle(); + toolbar.setTitleSize(20); setSupportActionBar(toolbar); toolbar.setBackgroundColor(getResources().getColor( R.color.colorPrimary)); @@ -63,6 +68,26 @@ public class PositioningActivity extends BaseActivity implements pingListener { } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.empty_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + protected int getOptionsMenuResId() { + return R.menu.empty_menu; + } + public void setPingFromDatabase(String markerID) { List markPings = DatabaseHelper.getInstance() .getMarkPings(this, markerID); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java index 5df88ebefa6..7a08610993b 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java @@ -1,28 +1,43 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.IBinder; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +import com.sap.sailing.android.buoy.positioning.app.BuildConfig; +import com.sap.sailing.android.buoy.positioning.app.R; +import com.sap.sailing.android.buoy.positioning.app.ui.fragments.RegattaFragment; +import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences; +import com.sap.sailing.android.buoy.positioning.app.util.CheckinManager; +import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper; +import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData; +import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo; +import com.sap.sailing.android.shared.data.AbstractCheckinData; +import com.sap.sailing.android.shared.logging.ExLog; +import com.sap.sailing.android.shared.services.sending.MessageSendingService; +import com.sap.sailing.android.shared.ui.activities.AbstractRegattaActivity; +import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar; + import java.util.ArrayList; import java.util.List; -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.widget.Toolbar; +public class RegattaActivity extends AbstractRegattaActivity { -import com.sap.sailing.android.buoy.positioning.app.R; -import com.sap.sailing.android.buoy.positioning.app.ui.fragments.RegattaFragment; -import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences; -import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper; -import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo; -import com.sap.sailing.android.shared.data.AbstractCheckinData; -import com.sap.sailing.android.shared.ui.activities.AbstractRegattaActivity; + private String leaderboardName; + private String checkinDigest; + private List marks; + private final String TAG = RegattaActivity.class.getName(); + private String checkinUrl; -public class RegattaActivity extends AbstractRegattaActivity{ - - private String leaderboardName; - private String checkinDigest; - private List marks; - // private CheckinUrlInfo checkinUrl; - - private AppPreferences prefs; + private AppPreferences prefs; + private MessageSendingService messageSendingService; + private boolean messageSendingServiceBound; @Override protected void onCreate(Bundle savedInstanceState) { @@ -36,14 +51,15 @@ public class RegattaActivity extends AbstractRegattaActivity{ checkinDigest = intent.getStringExtra(getString(R.string.checkin_digest)); leaderboardName = intent.getStringExtra(getString(R.string.leaderboard_name)); - // checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest); - // manager = new CheckinManager(checkinUrl.urlString, this); + checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest).urlString; setMarks(DatabaseHelper.getInstance().getMarks(this, checkinDigest)); setContentView(R.layout.fragment_container); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar); if (toolbar != null) { + toolbar.hideSubtitle(); + toolbar.setTitleSize(20); setSupportActionBar(toolbar); toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); } @@ -52,40 +68,127 @@ public class RegattaActivity extends AbstractRegattaActivity{ getSupportActionBar().setHomeButtonEnabled(true); toolbar.setNavigationIcon(R.drawable.sap_logo_64_sq); toolbar.setPadding(20, 0, 0, 0); + toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); getSupportActionBar().setTitle(leaderboardName); } RegattaFragment regattaFragment = new RegattaFragment(); replaceFragment(R.id.content_frame, regattaFragment); } - - @Override - public void onCheckinDataAvailable(AbstractCheckinData arg0) { - // TODO Auto-generated method stub - - } + @Override + protected void onResume() { + super.onResume(); + leaderboardName = (String) getIntent().getExtras().get(getString(R.string.leaderboard_name)); + setTitle(leaderboardName); + } - @Override - protected int getOptionsMenuResId() { - // TODO Auto-generated method stub - return 0; - } - - @Override - protected void onResume() { - super.onResume(); - leaderboardName = (String) getIntent().getExtras().get(getString(R.string.leaderboard_name)); - setTitle(leaderboardName); - } + @Override + public void onStart() { + super.onStart(); + Intent messageSendingServiceIntent = new Intent(this, MessageSendingService.class); + bindService(messageSendingServiceIntent, messageSendingServiceConnection, Context.BIND_AUTO_CREATE); + } + + @Override + public void onStop() { + super.onStop(); + if (messageSendingServiceBound) { + messageSendingService.unregisterAPIConnectivityListener(); + unbindService(messageSendingServiceConnection); + + messageSendingServiceBound = false; + + if (BuildConfig.DEBUG) { + ExLog.i(this, TAG, "Unbound transmitting Service"); + } + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.regatta_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.refresh: + ExLog.i(this, TAG, "Clicked REFRESH."); + CheckinManager manager = new CheckinManager(checkinUrl, this); + manager.callServerAndGenerateCheckinData(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + protected int getOptionsMenuResId() { + return R.menu.regatta_menu; + } - public List getMarks() { - return marks; - } + @Override + public void onCheckinDataAvailable(AbstractCheckinData checkinData) { + CheckinData data = (CheckinData) checkinData; + try { + DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, data.checkinDigest); + DatabaseHelper.getInstance().storeCheckinRow(this, + data.marks, data.getLeaderboard(), + data.getCheckinUrl(), data.pings); + getRegattaFragment().getAdapter().notifyDataSetChanged(); + } catch (DatabaseHelper.GeneralDatabaseHelperException e) { + ExLog.e(this, TAG, + "Batch insert failed: " + e.getMessage()); + displayDatabaseError(); + return; + } + + if (BuildConfig.DEBUG) { + ExLog.i(this, TAG, + "Batch-insert of checkinData completed."); + } + } + + public String getCheckinDigest(){ + return checkinDigest; + } + + public RegattaFragment getRegattaFragment() { + return (RegattaFragment) getSupportFragmentManager().findFragmentById(R.id.content_frame); + } - public void setMarks(List marks) { - this.marks = marks; - } + public List getMarks() { + return marks; + } + + + public void setMarks(List marks) { + this.marks = marks; + } + + /** Defines callbacks for service binding, passed to bindService() */ + private ServiceConnection messageSendingServiceConnection = new ServiceConnection() { + + @Override + public void onServiceConnected(ComponentName className, IBinder service) { + // We've bound to LocalService, cast the IBinder and get + // LocalService instance + MessageSendingService.MessageSendingBinder binder = (MessageSendingService.MessageSendingBinder) service; + messageSendingService = binder.getService(); + messageSendingServiceBound = true; + if (BuildConfig.DEBUG) { + ExLog.i(RegattaActivity.this, TAG, "connected to message sending service"); + } + } + + @Override + public void onServiceDisconnected(ComponentName arg0) { + messageSendingServiceBound = false; + } + }; } diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/StartActivity.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/StartActivity.java index 50ba55ac1f2..5661efb28ec 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/StartActivity.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/StartActivity.java @@ -2,10 +2,14 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities; import android.content.Intent; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import com.sap.sailing.android.buoy.positioning.app.R; import com.sap.sailing.android.buoy.positioning.app.ui.fragments.HomeFragment; import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity; +import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar; import com.sap.sailing.android.ui.fragments.AbstractHomeFragment; @@ -16,15 +20,34 @@ public class StartActivity extends AbstractStartActivity { super.onCreate(savedInstanceState); if (getSupportActionBar() != null) { getSupportActionBar().setTitle(getString(R.string.title_activity_start)); + OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar); + toolbar.hideSubtitle(); + toolbar.setTitleSize(20); + getSupportActionBar().setTitle(getString(R.string.title_activity_start)); getSupportActionBar().setHomeButtonEnabled(false); } replaceFragment(R.id.content_frame, new HomeFragment()); } - - @Override - protected int getOptionsMenuResId() { - return 0; - } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.empty_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + protected int getOptionsMenuResId() { + return R.menu.empty_menu; + } public AbstractHomeFragment getHomeFragment() { HomeFragment homeFragment = (HomeFragment) getSupportFragmentManager() diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java index fdeb9303471..051af77ad3e 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java @@ -1,7 +1,6 @@ package com.sap.sailing.android.buoy.positioning.app.ui.fragments; import android.content.Context; -import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; @@ -12,7 +11,11 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Toast; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; import com.sap.sailing.android.buoy.positioning.app.R; import com.sap.sailing.android.buoy.positioning.app.ui.activities.PositioningActivity; import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper.GeneralDatabaseHelperException; @@ -22,143 +25,241 @@ import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo; import com.sap.sailing.android.shared.data.LeaderboardInfo; import com.sap.sailing.android.shared.ui.customviews.OpenSansButton; import com.sap.sailing.android.shared.ui.customviews.OpenSansTextView; +import com.sap.sailing.android.shared.ui.customviews.SignalQualityIndicatorView; import com.sap.sailing.android.ui.fragments.BaseFragment; public class BuoyFragment extends BaseFragment implements LocationListener { - private OpenSansTextView markHeaderTextView; - private OpenSansTextView lattitudeTextView; - private OpenSansTextView longitudeTextView; - private OpenSansTextView accuracyTextView; - private OpenSansButton setPositionButton; - private OpenSansButton resetPostionButton; - private MapFragment mapFragment; - private Location lastKnownLocation; - private LocationManager locationManager; - private String locationProvider; - private pingListener pingListener; + private OpenSansTextView markHeaderTextView; + private OpenSansTextView latitudeTextView; + private OpenSansTextView longitudeTextView; + private OpenSansTextView accuracyTextView; + private OpenSansButton setPositionButton; + private OpenSansButton resetPositionButton; + private MapFragment mapFragment; + private Location lastKnownLocation; + private LatLng savedPosition; + private LocationManager locationManager; + private pingListener pingListener; + private SignalQualityIndicatorView signalQualityIndicatorView; - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - View view = inflater.inflate(R.layout.fragment_buoy_postion_detail, - container, false); + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + View view = inflater.inflate(R.layout.fragment_buoy_postion_detail, + container, false); - mapFragment = (MapFragment) getActivity().getFragmentManager() - .findFragmentById(R.id.map); + markHeaderTextView = (OpenSansTextView) view + .findViewById(R.id.mark_header); + latitudeTextView = (OpenSansTextView) view + .findViewById(R.id.marker_gps_latitude); + longitudeTextView = (OpenSansTextView) view + .findViewById(R.id.marker_gps_longitude); + accuracyTextView = (OpenSansTextView) view + .findViewById(R.id.marker_gps_accuracy); + ClickListener clickListener = new ClickListener(); - markHeaderTextView = (OpenSansTextView) view - .findViewById(R.id.mark_header); - lattitudeTextView = (OpenSansTextView) view - .findViewById(R.id.marker_gps_latitude); - longitudeTextView = (OpenSansTextView) view - .findViewById(R.id.marker_gps_longitude); - accuracyTextView = (OpenSansTextView) view - .findViewById(R.id.marker_gps_accuracy); - Clicklistener clicklistener = new Clicklistener(); + setPositionButton = (OpenSansButton) view + .findViewById(R.id.marker_set_position_button); + setPositionButton.setVisibility(View.GONE); + setPositionButton.setOnClickListener(clickListener); - setPositionButton = (OpenSansButton) view - .findViewById(R.id.marker_set_position_button); - setPositionButton.setOnClickListener(clicklistener); + resetPositionButton = (OpenSansButton) view + .findViewById(R.id.marker_reset_position_button); + resetPositionButton.setOnClickListener(clickListener); + resetPositionButton.setVisibility(View.GONE); - resetPostionButton = (OpenSansButton) view - .findViewById(R.id.marker_reset_position_button); - resetPostionButton.setOnClickListener(clicklistener); - resetPostionButton.setVisibility(View.GONE); - return view; - } + signalQualityIndicatorView = (SignalQualityIndicatorView) view.findViewById(R.id.signal_quality_indicator); + signalQualityIndicatorView.setSignalQuality(GPSQuality.noSignal.toInt()); + return view; + } - @Override - public void onResume() { - super.onResume(); - initLocationProvider(); - MarkInfo mark = ((PositioningActivity) getActivity()).getMarkInfo(); - if (mark != null) { - markHeaderTextView.setText(mark.getName()); - setUpPingUI(); - } - } + @Override + public void onResume() { + super.onResume(); + initLocationProvider(); + lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + MarkInfo mark = ((PositioningActivity) getActivity()).getMarkInfo(); + if (mark != null) { + markHeaderTextView.setText(mark.getName()); + setUpTextUI(lastKnownLocation); + setUpMap(); + } + if (lastKnownLocation != null) { + LatLng lastKnownLatLng = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()); + mapFragment.getMap().animateCamera(CameraUpdateFactory.newLatLngZoom(lastKnownLatLng, 15)); + setPositionButton.setVisibility(View.VISIBLE); + reportGPSQuality(lastKnownLocation.getAccuracy()); + } + } - public void setUpPingUI() { - MarkPingInfo markPing = ((PositioningActivity) getActivity()) - .getMarkPing(); - if (markPing != null) { - lattitudeTextView.setText(markPing.getLattitude()); - longitudeTextView.setText(markPing.getLongitude()); - accuracyTextView.setText("~" + markPing.getAccuracy()); - } - } + @Override + public void onPause() { + super.onPause(); + // Unsubscribe location updates for power saving + locationManager.removeUpdates(this); + } - @Override - public void onLocationChanged(Location location) { - lastKnownLocation = location; - } + public void setUpTextUI(Location location) { + String longitudeText = ""; + String latitudeText = ""; + String accuracyText = ""; + if (location != null) { + latitudeText += location.getLatitude(); + longitudeText += location.getLongitude(); + accuracyText += "~" + location.getAccuracy(); + } else { + latitudeText += "n/a"; + longitudeText += "n/a"; + accuracyText += "n/a"; + } + MarkPingInfo markPing = ((PositioningActivity) getActivity()) + .getMarkPing(); + if (markPing != null) { + double savedLatitude = Double.parseDouble(markPing.getLatitude()); + double savedLongitude = Double.parseDouble(markPing.getLongitude()); + savedPosition = new LatLng(savedLatitude, savedLongitude); + latitudeText += " (" + markPing.getLatitude() + ")"; + longitudeText += " (" + markPing.getLongitude() + ")"; + accuracyText += " (" + "~" + markPing.getAccuracy() + ")"; + } + latitudeTextView.setText(latitudeText); + longitudeTextView.setText(longitudeText); + accuracyTextView.setText(accuracyText); + } - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - initLocationProvider(); - } + @Override + public void onLocationChanged(Location location) { + if (getActivity() instanceof PositioningActivity) { + lastKnownLocation = location; + reportGPSQuality(lastKnownLocation.getAccuracy()); + setPositionButton.setVisibility(View.VISIBLE); + setUpTextUI(lastKnownLocation); + setUpMap(); + } + } - @Override - public void onProviderEnabled(String provider) { - initLocationProvider(); - } + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + if (getActivity() instanceof PositioningActivity) { + initLocationProvider(); + } + } - @Override - public void onProviderDisabled(String provider) { - initLocationProvider(); - } + @Override + public void onProviderEnabled(String provider) { + if (getActivity() instanceof PositioningActivity) { + initLocationProvider(); + } + } - private void initLocationProvider() { - locationManager = (LocationManager) getActivity().getSystemService( - Context.LOCATION_SERVICE); - locationManager.removeUpdates(this); - locationProvider = locationManager - .getBestProvider(new Criteria(), true); - locationManager.requestLocationUpdates(locationProvider, 60000, 10, - this); - } + @Override + public void onProviderDisabled(String provider) { + if (getActivity() instanceof PositioningActivity) { + initLocationProvider(); + } + } - public void setPingListener(pingListener listener) { - pingListener = listener; - } + private void initLocationProvider() { + locationManager = (LocationManager) getActivity().getSystemService( + Context.LOCATION_SERVICE); + locationManager.removeUpdates(this); + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this); + } - public interface pingListener { - public void updatePing(); - } + public void setUpMap() { + mapFragment = (MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.map); + GoogleMap map = mapFragment.getMap(); + map.clear(); + map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); + map.getUiSettings().setZoomControlsEnabled(true); + map.setMyLocationEnabled(true); + map.setPadding(0, 50, 0, 0); + if (savedPosition != null) { + MarkerOptions savedLocactionOptions = new MarkerOptions(); + savedLocactionOptions.position(savedPosition); + savedLocactionOptions.visible(true); + map.addMarker(savedLocactionOptions); + } + if (lastKnownLocation != null) { + MarkerOptions mySelfOptions = new MarkerOptions(); + LatLng lastKnownLatLng = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()); + mySelfOptions.position(lastKnownLatLng); + mySelfOptions.visible(true); + map.addMarker(mySelfOptions); + } - private class Clicklistener implements OnClickListener { + } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.marker_set_position_button) { - PingHelper helper = new PingHelper(); - try { - if (lastKnownLocation != null) { - MarkInfo mark = ((PositioningActivity) getActivity()) - .getMarkInfo(); - LeaderboardInfo leaderboard = ((PositioningActivity) getActivity()) - .getLeaderBoard(); - helper.storePingInDatabase(getActivity(), - lastKnownLocation, mark); - helper.sendPingToServer(getActivity(), - lastKnownLocation, leaderboard, mark); - pingListener.updatePing(); - setUpPingUI(); - } - else{ - Toast.makeText(getActivity(), "Location is not available yet", Toast.LENGTH_LONG).show(); - } - } catch (GeneralDatabaseHelperException e) { - e.printStackTrace(); - } - } else if (id == R.id.marker_reset_position_button) { - // Reset position - } + public void reportGPSQuality(float gpsAccuracy) { + GPSQuality quality = GPSQuality.noSignal; - } + if (gpsAccuracy > 48) { + quality = GPSQuality.poor; + } else if (gpsAccuracy > 10) { + quality = GPSQuality.good; + } else if (gpsAccuracy <= 10) { + quality = GPSQuality.great; + } + signalQualityIndicatorView.setSignalQuality(quality.toInt()); - } + } + + public void setPingListener(pingListener listener) { + pingListener = listener; + } + + public enum GPSQuality { + noSignal(0), poor(2), good(3), great(4); + + private final int gpsQuality; + + GPSQuality(int quality) { + this.gpsQuality = quality; + } + + public int toInt() { + return this.gpsQuality; + } + } + + public interface pingListener { + public void updatePing(); + } + + private class ClickListener implements OnClickListener { + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.marker_set_position_button) { + PingHelper helper = new PingHelper(); + try { + if (lastKnownLocation != null) { + MarkInfo mark = ((PositioningActivity) getActivity()) + .getMarkInfo(); + LeaderboardInfo leaderBoard = ((PositioningActivity) getActivity()) + .getLeaderBoard(); + helper.storePingInDatabase(getActivity(), + lastKnownLocation, mark); + helper.sendPingToServer(getActivity(), + lastKnownLocation, leaderBoard, mark); + ((PositioningActivity) getActivity()).updatePing(); + savedPosition = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()); + pingListener.updatePing(); + setUpTextUI(lastKnownLocation); + } else { + Toast.makeText(getActivity(), "Location is not available yet", Toast.LENGTH_LONG).show(); + } + } catch (GeneralDatabaseHelperException e) { + e.printStackTrace(); + } + } else if (id == R.id.marker_reset_position_button) { + // Reset position + } + + } + + } } diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/HomeFragment.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/HomeFragment.java index f6ce8f4d337..c74e1c9c66b 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/HomeFragment.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/HomeFragment.java @@ -79,13 +79,13 @@ public class HomeFragment extends AbstractHomeFragment implements private void checkinWithApiAndStartRegattaActivity(CheckinData checkinData) { try { - if(DatabaseHelper.getInstance().markLeaderboardCombnationAvailable(getActivity(), checkinData.checkinDigest)) { - DatabaseHelper.getInstance().storeCheckinRow(getActivity(), - checkinData.marks, checkinData.getLeaderboard(), - checkinData.getCheckinUrl()); - adapter.notifyDataSetChanged(); + if(!DatabaseHelper.getInstance().markLeaderboardCombnationAvailable(getActivity(), checkinData.checkinDigest)) { + DatabaseHelper.getInstance().deleteRegattaFromDatabase(getActivity(),checkinData.checkinDigest); } - + DatabaseHelper.getInstance().storeCheckinRow(getActivity(), + checkinData.marks, checkinData.getLeaderboard(), + checkinData.getCheckinUrl(), checkinData.pings); + adapter.notifyDataSetChanged(); } catch (DatabaseHelper.GeneralDatabaseHelperException e) { ExLog.e(getActivity(), TAG, "Batch insert failed: " + e.getMessage()); @@ -113,7 +113,7 @@ public class HomeFragment extends AbstractHomeFragment implements * Start regatta activity. * * @param leaderboardName - * @param checkinDigest2 + * @param checkinDigest */ private void startRegatta(String leaderboardName, String checkinDigest) { Intent intent = new Intent(getActivity(), RegattaActivity.class); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/RegattaFragment.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/RegattaFragment.java index 8098b3e2c56..9f675a5a763 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/RegattaFragment.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/RegattaFragment.java @@ -18,12 +18,13 @@ import com.sap.sailing.android.buoy.positioning.app.R; import com.sap.sailing.android.buoy.positioning.app.adapter.MarkAdapter; import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract; import com.sap.sailing.android.buoy.positioning.app.ui.activities.PositioningActivity; +import com.sap.sailing.android.buoy.positioning.app.ui.activities.RegattaActivity; import com.sap.sailing.android.ui.fragments.BaseFragment; public class RegattaFragment extends BaseFragment implements LoaderCallbacks{ private static final int MARKER_LOADER = 1; private MarkAdapter adapter; - + @SuppressLint("InflateParams") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -46,12 +47,21 @@ public class RegattaFragment extends BaseFragment implements LoaderCallbacks onCreateLoader(int loaderId, Bundle bundle) { + String checkinDigest = ((RegattaActivity)getActivity()).getCheckinDigest(); switch (loaderId) { case MARKER_LOADER: - return new CursorLoader(getActivity(), AnalyticsContract.LeaderboardsMarksJoined.CONTENT_URI, - null, null, null, null); + return new CursorLoader(getActivity(), AnalyticsContract.MarksLeaderBoardsJoined.CONTENT_URI, + null, + AnalyticsContract.Mark.MARK_CHECKIN_DIGEST + " = ?", + new String[]{checkinDigest}, + null); default: return null; diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java index bd6cd7b0a3e..2d9892bcf2e 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java @@ -1,19 +1,5 @@ package com.sap.sailing.android.buoy.positioning.app.util; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLEncoder; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - import android.app.AlertDialog; import android.content.DialogInterface; import android.net.Uri; @@ -22,6 +8,7 @@ import android.widget.Toast; import com.sap.sailing.android.buoy.positioning.app.R; import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData; import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo; +import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo; import com.sap.sailing.android.shared.data.AbstractCheckinData; import com.sap.sailing.android.shared.data.http.HttpGetRequest; import com.sap.sailing.android.shared.logging.ExLog; @@ -33,6 +20,20 @@ import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + public class CheckinManager { private final static String TAG = CheckinManager.class.getName(); @@ -41,13 +42,13 @@ public class CheckinManager { private AppPreferences prefs; private String url; - public CheckinManager(String url, CheckinDataActivity activity){ + public CheckinManager(String url, CheckinDataActivity activity) { this.activity = activity; this.url = url; prefs = new AppPreferences(activity); } - public void callServerAndGenerateCheckinData(){ + public void callServerAndGenerateCheckinData() { Uri uri = Uri.parse(url); // TODO: assuming scheme is http, is this valid? @@ -57,8 +58,7 @@ public class CheckinManager { } final URLData urlData = extractRequestParametersFromUri(uri, scheme); - if (urlData == null) - { + if (urlData == null) { setCheckinData(null); return; } @@ -93,7 +93,7 @@ public class CheckinManager { Toast.makeText(activity, activity.getString(R.string.error_invalid_qr_code), Toast.LENGTH_LONG).show(); urlData = null; } - if(urlData != null) { + if (urlData != null) { urlData.leaderboardName = leaderboardNameFromQR; urlData.deviceUuid = new SmartphoneUUIDIdentifierImpl(UUID.fromString(UniqueDeviceUuid @@ -148,28 +148,42 @@ public class CheckinManager { } }); } - - private void getMarksFromServer(final String leaderboardName, - HttpGetRequest getMarksRequest, final URLData urlData) { - NetworkHelper.getInstance(activity).executeHttpJsonRequestAsnchronously(getMarksRequest, new NetworkHelperSuccessListener() { - - @Override - public void performAction(JSONObject response) { - try { + + private void getMarksFromServer(final String leaderboardName, + HttpGetRequest getMarksRequest, final URLData urlData) { + NetworkHelper.getInstance(activity).executeHttpJsonRequestAsnchronously(getMarksRequest, new NetworkHelperSuccessListener() { + + @Override + public void performAction(JSONObject response) { + try { JSONArray markArray = response.getJSONArray("marks"); String checkinDigest = generateCheckindigest(urlData.uriStr); List marks = new ArrayList(); - for(int i = 0; i< markArray.length(); i++){ - JSONObject jsonMark = (JSONObject) markArray.get(i); - MarkInfo mark = new MarkInfo(); - mark.setCheckinDigest(checkinDigest); - mark.setClassName(jsonMark.getString("@class")); - mark.setName(jsonMark.getString("name")); - mark.setId(jsonMark.getString("id")); - mark.setType(jsonMark.getString("type")); - marks.add(mark); + List pings = new ArrayList(); + for (int i = 0; i < markArray.length(); i++) { + JSONObject jsonMark = (JSONObject) markArray.get(i); + MarkInfo mark = new MarkInfo(); + mark.setCheckinDigest(checkinDigest); + mark.setClassName(jsonMark.getString("@class")); + mark.setName(jsonMark.getString("name")); + mark.setId(jsonMark.getString("id")); + if (jsonMark.has("position")) { + if (!jsonMark.get("position").equals(null)) { + JSONObject positionJson = jsonMark.getJSONObject("position"); + MarkPingInfo ping = new MarkPingInfo(); + ping.setLatitude(positionJson.getString("latitude")); + ping.setLongitude(positionJson.getString("longitude")); + ping.setTimestamp(positionJson.getInt("timestamp")); + ping.setAccuracy(positionJson.getDouble("accuracy")); + ping.setMarkId(mark.getId()); + pings.add(ping); + } + } + mark.setType(jsonMark.getString("type")); + marks.add(mark); } urlData.marks = marks; + urlData.pings = pings; saveCheckinDataAndNotifyListeners(urlData, leaderboardName); } catch (JSONException e) { @@ -179,24 +193,25 @@ public class CheckinManager { displayAPIErrorRecommendRetry(); return; } - - } - }, new NetworkHelper.NetworkHelperFailureListener() { - - @Override + + } + }, new NetworkHelper.NetworkHelperFailureListener() { + + @Override public void performAction(NetworkHelper.NetworkHelperError e) { ExLog.e(activity, TAG, "Failed to get marks from API: " + e.getMessage()); activity.dismissProgressDialog(); displayAPIErrorRecommendRetry(); } - }); - } + }); + } private void saveCheckinDataAndNotifyListeners(URLData urlData, String leaderboardName) { CheckinData data = new CheckinData(); data.serverWithPort = urlData.hostWithPort; data.leaderboardName = leaderboardName; data.marks = urlData.marks; + data.pings = urlData.pings; data.deviceUid = urlData.deviceUuid .getStringRepresentation(); data.uriString = urlData.uriStr; @@ -223,12 +238,12 @@ public class CheckinManager { } } - public void setCheckinData(AbstractCheckinData data){ + public void setCheckinData(AbstractCheckinData data) { checkinData = data; activity.onCheckinDataAvailable(getCheckinData()); } - public AbstractCheckinData getCheckinData(){ + public AbstractCheckinData getCheckinData() { return checkinData; } @@ -251,44 +266,45 @@ public class CheckinManager { alert.show(); setCheckinData(null); } - - private String generateCheckindigest(String url) - { - String checkinDigest = ""; - try { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - md.update(url.getBytes("UTF-8")); - byte[] digest = md.digest(); - StringBuffer buf = new StringBuffer(); - for (byte byt : digest) { - buf.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1)); - checkinDigest = buf.toString(); - } - } catch (UnsupportedEncodingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return checkinDigest; + + private String generateCheckindigest(String url) { + String checkinDigest = ""; + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + md.update(url.getBytes("UTF-8")); + byte[] digest = md.digest(); + StringBuffer buf = new StringBuffer(); + for (byte byt : digest) { + buf.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1)); + checkinDigest = buf.toString(); + } + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return checkinDigest; } - public interface CheckinDataHandler{ + public interface CheckinDataHandler { + public void onCheckinDataAvailable(CheckinData data); } - private class URLData{ + private class URLData { public String uriStr; public String server; public int port; public String hostWithPort; public List marks; + public List pings; public String leaderboardName; public DeviceIdentifier deviceUuid; public String getMarkUrl; public String getLeaderboardUrl; - public URLData(){ + public URLData() { } } diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/DatabaseHelper.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/DatabaseHelper.java index e4c20040c8a..42beb70db84 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/DatabaseHelper.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/DatabaseHelper.java @@ -1,8 +1,5 @@ package com.sap.sailing.android.buoy.positioning.app.util; -import java.util.ArrayList; -import java.util.List; - import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.ContentValues; @@ -24,6 +21,9 @@ import com.sap.sailing.android.shared.data.CheckinUrlInfo; import com.sap.sailing.android.shared.data.LeaderboardInfo; import com.sap.sailing.android.shared.logging.ExLog; +import java.util.ArrayList; +import java.util.List; + public class DatabaseHelper { private final static String TAG = DatabaseHelper.class.getName(); @@ -100,7 +100,7 @@ public class DatabaseHelper { markPingInfo.setMarkId(markID); markPingInfo.setTimestamp(mpc.getInt((mpc.getColumnIndex(MarkPing.MARK_PING_TIMESTAMP)))); markPingInfo.setLongitude(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LONGITUDE)))); - markPingInfo.setLattitude(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LATITUDE)))); + markPingInfo.setLatitude(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LATITUDE)))); markPingInfo.setAccuracy(mpc.getDouble((mpc.getColumnIndex(MarkPing.MARK_PING_ACCURACY)))); marks.add(markPingInfo); mpc.moveToNext(); @@ -114,14 +114,19 @@ public class DatabaseHelper { int d1 = cr.delete(MarkPing.CONTENT_URI, MarkPing.MARK_ID + " = \"" + markID + "\"", null); if (BuildConfig.DEBUG) { - ExLog.i(context, TAG, "Checkout, number of markpings deleted: " + d1); + ExLog.i(context, TAG, "Checkout, number of markpings for mark: " + markID + " deleted: " + d1); } } public void deleteRegattaFromDatabase(Context context, String checkinDigest) { ContentResolver cr = context.getContentResolver(); - // int d1 = cr.delete(Event.CONTENT_URI, Event.EVENT_CHECKIN_DIGEST + " = \"" + checkinDigest + "\"", null); + List marks = getMarks(context,checkinDigest); + + for(MarkInfo mark : marks){ + deletePingsFromDataBase(context, mark.getId()); + } + int d2 = cr.delete(Leaderboard.CONTENT_URI, Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = \"" + checkinDigest + "\"", null); int d3 = cr.delete(Mark.CONTENT_URI, Mark.MARK_CHECKIN_DIGEST + " = \"" + checkinDigest @@ -130,7 +135,6 @@ public class DatabaseHelper { + "\"", null); if (BuildConfig.DEBUG) { - // ExLog.i(context, TAG, "Checkout, number of events deleted: " + d1); ExLog.i(context, TAG, "Checkout, number of leaderbards deleted: " + d2); ExLog.i(context, TAG, "Checkout, number of marks deleted: " + d3); ExLog.i(context, TAG, "Checkout, number of checkinurls deleted: " + d4); @@ -141,8 +145,6 @@ public class DatabaseHelper { * When checking in, store info on the event, the competitor and the leaderboard in the database. * * @param context - * @param event - * @param competitor * @param leaderboard * @return success or failure * @throws GeneralDatabaseHelperException @@ -150,7 +152,7 @@ public class DatabaseHelper { * @throws RemoteException */ public void storeCheckinRow(Context context, List markList, - LeaderboardInfo leaderboard, CheckinUrlInfo checkinURL) + LeaderboardInfo leaderboard, CheckinUrlInfo checkinURL, List pings) throws GeneralDatabaseHelperException { // inserting leaderboard first @@ -179,6 +181,10 @@ public class DatabaseHelper { opList.add(ContentProviderOperation.newInsert(Mark.CONTENT_URI).withValues(cmv).build()); } + for(MarkPingInfo ping: pings){ + storeMarkPing(context, ping); + } + // checkin url ContentValues ccuv = new ContentValues(); @@ -199,13 +205,13 @@ public class DatabaseHelper { } - public void storeMarkPing(Context context, MarkInfo mark, MarkPingInfo markPing) throws GeneralDatabaseHelperException{ + public void storeMarkPing(Context context, MarkPingInfo markPing) throws GeneralDatabaseHelperException{ ContentResolver cr = context.getContentResolver(); - + deletePingsFromDataBase(context, markPing.getMarkId()); ArrayList opList = new ArrayList(); ContentValues mpcv = new ContentValues(); - mpcv.put(MarkPing.MARK_ID, mark.getId()); - mpcv.put(MarkPing.MARK_PING_LATITUDE, markPing.getLattitude()); + mpcv.put(MarkPing.MARK_ID, markPing.getMarkId()); + mpcv.put(MarkPing.MARK_PING_LATITUDE, markPing.getLatitude()); mpcv.put(MarkPing.MARK_PING_LONGITUDE, markPing.getLongitude()); mpcv.put(MarkPing.MARK_PING_ACCURACY, markPing.getAccuracy()); mpcv.put(MarkPing.MARK_PING_TIMESTAMP, markPing.getTimestamp()); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/PingHelper.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/PingHelper.java index ce0a535536d..54b4d868bc0 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/PingHelper.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/PingHelper.java @@ -1,24 +1,19 @@ package com.sap.sailing.android.buoy.positioning.app.util; -import java.net.MalformedURLException; -import java.net.URL; +import java.util.UUID; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.location.Location; -import android.widget.Toast; import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper.GeneralDatabaseHelperException; import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo; import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo; import com.sap.sailing.android.shared.data.LeaderboardInfo; -import com.sap.sailing.android.shared.data.http.HttpJsonPostRequest; import com.sap.sailing.android.shared.logging.ExLog; -import com.sap.sailing.android.shared.util.NetworkHelper; -import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperError; -import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperSuccessListener; +import com.sap.sailing.android.shared.services.sending.MessageSendingService; public class PingHelper { private static String TAG = PingHelper.class.getName(); @@ -36,37 +31,16 @@ public class PingHelper { String postUrlStr = leaderBoard.serverUrl + prefs.getServerMarkPingPath(leaderBoard.name, mark.getId()); - - HttpJsonPostRequest request = new HttpJsonPostRequest(new URL(postUrlStr), - fixJson.toString(), context); - NetworkHelper.getInstance(context) - .executeHttpJsonRequestAsnchronously(request, new NetworkHelperSuccessListener() { - - @Override - public void performAction(JSONObject arg0) { - Toast.makeText(context, "DATA SEND TO SERVER", Toast.LENGTH_LONG).show(); - - } - }, new NetworkHelper.NetworkHelperFailureListener() { - - @Override - public void performAction(NetworkHelperError arg0) { - Toast.makeText(context, "FAILURE SERVER WAS NOT NOTIFIED", Toast.LENGTH_LONG).show(); - - } - });; - //context.startService(MessageSendingService.createMessageIntent(context, - // postUrlStr, null, UUID.randomUUID(), fixJson.toString(), null)); + context.startService(MessageSendingService.createMessageIntent(context, postUrlStr, + null, UUID.randomUUID(), fixJson.toString(), null)); + } catch (JSONException ex) { ExLog.i(context, TAG, "Error while building ping json " + ex.getMessage()); } catch (GeneralDatabaseHelperException e) { e.printStackTrace(); - } catch (MalformedURLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); } } @@ -75,10 +49,10 @@ public class PingHelper { MarkInfo mark) throws GeneralDatabaseHelperException { MarkPingInfo pingInfo = new MarkPingInfo(); pingInfo.setMarkId(mark.getId()); - pingInfo.setLattitude(""+ location.getLatitude()); + pingInfo.setLatitude("" + location.getLatitude()); pingInfo.setLongitude("" + location.getLongitude()); pingInfo.setAccuracy(location.getAccuracy()); pingInfo.setTimestamp((int) location.getTime()); - DatabaseHelper.getInstance().storeMarkPing(context, mark, pingInfo); + DatabaseHelper.getInstance().storeMarkPing(context, pingInfo); } } diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/CheckinData.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/CheckinData.java index a13298b293b..f5bf8114827 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/CheckinData.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/CheckinData.java @@ -1,14 +1,14 @@ package com.sap.sailing.android.buoy.positioning.app.valueobjects; +import com.sap.sailing.android.shared.data.AbstractCheckinData; +import com.sap.sailing.android.shared.data.CheckinUrlInfo; +import com.sap.sailing.android.shared.data.LeaderboardInfo; + import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; -import com.sap.sailing.android.shared.data.AbstractCheckinData; -import com.sap.sailing.android.shared.data.CheckinUrlInfo; -import com.sap.sailing.android.shared.data.LeaderboardInfo; - public class CheckinData extends AbstractCheckinData{ public String leaderboardName; public String deviceUid; @@ -16,6 +16,7 @@ public class CheckinData extends AbstractCheckinData{ public String checkinDigest; public String serverWithPort; public List marks; + public List pings; public void setCheckinDigestFromString(String checkinString) throws UnsupportedEncodingException, NoSuchAlgorithmException { diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java index fa74950d0c5..bc432124e4f 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java @@ -3,7 +3,7 @@ package com.sap.sailing.android.buoy.positioning.app.valueobjects; public class MarkPingInfo { private String markId; private String longitude; - private String lattitude; + private String latitude; private double accuracy; private int timestamp; @@ -23,12 +23,12 @@ public class MarkPingInfo { this.longitude = longitude; } - public String getLattitude() { - return lattitude; + public String getLatitude() { + return latitude; } - public void setLattitude(String lattitude) { - this.lattitude = lattitude; + public void setLatitude(String latitude) { + this.latitude = latitude; } public double getAccuracy() { diff --git a/mobile/com.sap.sailing.racecommittee.app/.classpath b/mobile/com.sap.sailing.racecommittee.app/.classpath index 0d37914aebe..361be950b40 100644 --- a/mobile/com.sap.sailing.racecommittee.app/.classpath +++ b/mobile/com.sap.sailing.racecommittee.app/.classpath @@ -6,5 +6,6 @@ + diff --git a/mobile/com.sap.sailing.racecommittee.app/build.gradle b/mobile/com.sap.sailing.racecommittee.app/build.gradle index 0426e6eeee0..e6d4fd72c22 100644 --- a/mobile/com.sap.sailing.racecommittee.app/build.gradle +++ b/mobile/com.sap.sailing.racecommittee.app/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.android.application" +apply from: "../git.gradle" def packageName = "com.sap.sailing.racecommittee.app" def verCode = 6 diff --git a/mobile/git.gradle b/mobile/git.gradle new file mode 100644 index 00000000000..8e885cd9f95 --- /dev/null +++ b/mobile/git.gradle @@ -0,0 +1,30 @@ +/** + * returns current git hash + */ +def getGitHash = { -> + def stdout = new ByteArrayOutputStream() + exec { + commandLine "git", "log", "-n", "1", "--format='%h'" + standardOutput = stdout + } + return stdout.toString().trim().replace("'", "") +} + +/** + * set git hash into git.xml + */ +preBuild.doLast { + copy { + from ("../git.template.xml") + + into ("res/values") + + rename { + String fileName -> fileName.replace(".template", "") + } + + filter { + String line -> line.replaceAll("#GITHASH#", getGitHash()) + } + } +} \ No newline at end of file diff --git a/mobile/git.template.xml b/mobile/git.template.xml new file mode 100644 index 00000000000..4be58d9576f --- /dev/null +++ b/mobile/git.template.xml @@ -0,0 +1,6 @@ + + + + #GITHASH# + + \ No newline at end of file