diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_transparent.xml b/mobile/com.sap.sailing.android.shared/res/drawable/rounded_btn_transparent.xml
similarity index 100%
rename from mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_transparent.xml
rename to mobile/com.sap.sailing.android.shared/res/drawable/rounded_btn_transparent.xml
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/yellow_arrow_right.png b/mobile/com.sap.sailing.android.shared/res/drawable/yellow_arrow_right.png
similarity index 100%
rename from mobile/com.sap.sailing.android.tracking.app/res/drawable/yellow_arrow_right.png
rename to mobile/com.sap.sailing.android.shared/res/drawable/yellow_arrow_right.png
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/ragatta_listview_row.xml b/mobile/com.sap.sailing.android.shared/res/layout/ragatta_listview_row.xml
similarity index 100%
rename from mobile/com.sap.sailing.android.tracking.app/res/layout/ragatta_listview_row.xml
rename to mobile/com.sap.sailing.android.shared/res/layout/ragatta_listview_row.xml
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/regatta_listview_header.xml b/mobile/com.sap.sailing.android.shared/res/layout/regatta_listview_header.xml
similarity index 100%
rename from mobile/com.sap.sailing.android.tracking.app/res/layout/regatta_listview_header.xml
rename to mobile/com.sap.sailing.android.shared/res/layout/regatta_listview_header.xml
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 473eac71fdb..957bdb631f6 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
@@ -24,5 +24,10 @@
Scan abgebrochen
Fehler beim Scannen des QR-Codes {result-code}
Bei der Kommunikation mit dem Server ist ein Fehler aufgetreten. Bitte versuchen Sie es noch einmal.
-
+ Bitte warten
+ Ungültiger QR-Code
+
+
+ Ihre Regattas:
+
\ 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 1d9bd14ba07..3aa12e453e6 100644
--- a/mobile/com.sap.sailing.android.shared/res/values/colors.xml
+++ b/mobile/com.sap.sailing.android.shared/res/values/colors.xml
@@ -36,6 +36,7 @@
#ff0000ff
#000000
+ #55000000
#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 612008f9102..53d4c1e697b 100644
--- a/mobile/com.sap.sailing.android.shared/res/values/strings.xml
+++ b/mobile/com.sap.sailing.android.shared/res/values/strings.xml
@@ -19,6 +19,8 @@
Error
+
+
GPS Accuracy
poor
good
@@ -26,6 +28,9 @@
no signal
OK
+
+ Your Regattas:
+
Error: Database operation has failed.
No QR-Code?
@@ -34,4 +39,7 @@
Scanning cancelled
Error scanning QR-Code {result-code}
An error occurred while contacting the server. Please try again.
+ Please wait
+ Invalid QR-Code
+ CheckinDigest
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_white.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_white.xml
deleted file mode 100644
index 4ca5d0ad3b4..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_white.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_yellow.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_yellow.xml
deleted file mode 100644
index c012d9f485b..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_yellow.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_container.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_container.xml
deleted file mode 100644
index bf374a68b02..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_container.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_home.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_home.xml
deleted file mode 100644
index aa16f58a387..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_home.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_hud_container.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_hud_container.xml
deleted file mode 100644
index e93db488893..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_hud_container.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml b/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml
index cd69c5f4285..84d57a7f5c1 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml
@@ -37,7 +37,6 @@
Auswählen
Foto aufnehmen
Foto
- Bitte warten
Checke ein..
Checke aus..
Hole Event-Daten..
@@ -53,12 +52,9 @@
Tage
Stunde
Tag
- Breitengrad
- Längengrad
Bitte achten Sie auf die Durchsagen
Sie haben keinen QR-Code?
QR-Code scannen
- Ihre Regattas:
Schließen
Vielen Dank, Sie haben erfolgreich an der Regatta teilgenommen.\n\nIhr SAP Sailing Team
Tracke:
@@ -71,15 +67,10 @@
Leaderboard
Benutzerdefiniertes Bild für Regatta
Foto hinzufügen Button
- Ungültiger QR-Code
Fehler beim Empfang vom Server
Bereits für diese Regatta eingecheckt
Warnung
GPS ist nicht aktiviert. Bitte aktivieren Sie den Standortzugriff (GPS) in Ihren Android-Einstellungen!
- Position setzen
- Position zurücksetzen
Knoten
Einstellungen
- Kurstyp
- Kursmarkierungen
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/colors.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/colors.xml
index 4a57025308d..891c613302b 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values/colors.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values/colors.xml
@@ -3,7 +3,6 @@
#FFFFFF
#55FFFFFF
#CCFFFFFF
- #55000000
#00FF00
#333333
#242424
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 2375c174d0e..659ac82bb1d 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
@@ -18,13 +18,11 @@
Tracking
Please confirm
Do you really want to stop tracking?
- CheckinDigest
Add Team Photo
Do you want to use an existing image or take a new one?
Existing
Take Photo
Photo
- Please wait
Checking in..
Checking out..
Getting event informatiopn..
@@ -40,10 +38,7 @@
Hour
Minute
Day
- Longitude
- Latitude
Please listen to the announcements
- Your Regattas:
Close
Thank you, you have successfully taken part in the regatta.\n\nYour SAP Sailing Team
Tracking:
@@ -53,17 +48,12 @@
Speed over Ground
None
Leader board
- Invalid QR-Code
Error while receiving server data
Already checked in to this regatta
Warning
GPS is turned off. Please turn on location access (GPS) in your Android Settings!
- Set Position
- Reset Position
knots
Preferences
- Course Type
- Marks
00:00:00
-
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__styles.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__styles.xml
index 46b85a80ded..72d05aa4abb 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__styles.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__styles.xml
@@ -45,10 +45,4 @@
- 6dp
-
-
diff --git a/mobile/com.sap.sailing.buoy.positioning/.classpath b/mobile/com.sap.sailing.buoy.positioning/.classpath
index 7bc01d9a9c6..7a4fe976c87 100644
--- a/mobile/com.sap.sailing.buoy.positioning/.classpath
+++ b/mobile/com.sap.sailing.buoy.positioning/.classpath
@@ -5,5 +5,6 @@
+
diff --git a/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml b/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml
index 7b171bdf6ae..dad55c357a9 100644
--- a/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml
@@ -7,11 +7,62 @@
android:minSdkVersion="14"
android:targetSdkVersion="22" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/ic_launcher-web.png b/mobile/com.sap.sailing.buoy.positioning/ic_launcher-web.png
deleted file mode 100644
index a18cbb48c43..00000000000
Binary files a/mobile/com.sap.sailing.buoy.positioning/ic_launcher-web.png and /dev/null differ
diff --git a/mobile/com.sap.sailing.buoy.positioning/pom.xml b/mobile/com.sap.sailing.buoy.positioning/pom.xml
new file mode 100644
index 00000000000..1d001e40448
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/pom.xml
@@ -0,0 +1,123 @@
+
+
+ 4.0.0
+
+
+ com.sap.sailing
+ mobile
+ 1.0.0-SNAPSHOT
+
+
+ com.sap.sailing
+ com.sap.sailing.android.buoy.positioning.app
+ apk
+
+
+
+ com.sap.sailing.android.buoy.positioning.app.version
+
+ ${buoy.positioning-app-version}
+
+
+
+
+ android
+ android
+
+
+
+
+
+ com.android.support
+ support-v4
+ 21.0.3
+ aar
+
+
+
+ com.android.support
+ appcompat-v7
+ 21.0.3
+ aar
+
+
+
+ com.google.android.gms
+ play-services
+ 6.5.87
+ aar
+
+
+
+ com.sap.sailing
+ com.sap.sailing.android.shared
+ 1.0.0-SNAPSHOT
+ apklib
+
+
+
+
+ ${project.artifactId}
+ src
+
+
+ com.jayway.maven.plugins.android.generation2
+ android-maven-plugin
+
+ true
+ true
+
+ 21
+
+ true
+
+
+ true
+ proguard-project.txt
+
+ ${env.ANDROID_HOME}/tools/proguard/proguard-android.txt
+
+
+
+ false
+
+
+
+
+
+ apk
+
+
+
+
+ ^com\.sap\..*.jar$
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ maven-clean-plugin
+
+
+
+
+
diff --git a/mobile/com.sap.sailing.buoy.positioning/project.properties b/mobile/com.sap.sailing.buoy.positioning/project.properties
index 00cf62bacc1..b5c315ef4ec 100644
--- a/mobile/com.sap.sailing.buoy.positioning/project.properties
+++ b/mobile/com.sap.sailing.buoy.positioning/project.properties
@@ -11,4 +11,6 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-22
+target=Google Inc.:Google APIs:22
+android.library.reference.1=../com.sap.sailing.android.shared
+android.library.reference.2=../google-play-services_lib
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy_postion_detail.xml b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_detail.xml
similarity index 85%
rename from mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy_postion_detail.xml
rename to mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_detail.xml
index 8cb9519d520..613d5d7f406 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy_postion_detail.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_detail.xml
@@ -5,9 +5,9 @@
android:background="@color/black"
android:orientation="vertical"
android:paddingLeft="0dp"
- android:paddingRight="0dp">
+ android:paddingRight="0dp" >
-
-
+ android:paddingTop="15dp" >
-
+
-
+ android:paddingTop="15dp" >
-
+
-
+ android:paddingTop="15dp" >
-
+
-
-
-
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy_postion_overview.xml b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_overview.xml
similarity index 87%
rename from mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy_postion_overview.xml
rename to mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_overview.xml
index 5f2c966cd93..ab70a1f596f 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy_postion_overview.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/layout/fragment_buoy_postion_overview.xml
@@ -7,7 +7,7 @@
android:paddingLeft="10dp"
android:paddingRight="10dp">
-
-
-
-
+
+
+ Kurstyp
+ Kursmarkierungen
+ Breitengrad
+ Längengrad
+ Position setzen
+ Position zurücksetzen
+ Empfangen der Markierungen..
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/api_endpoints.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/api_endpoints.xml
new file mode 100644
index 00000000000..4bac2c2c624
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values/api_endpoints.xml
@@ -0,0 +1,6 @@
+
+
+ /sailingserver/api/v1/leaderboards/{leaderboard-name}/marks/{mark-id}/gps_fixes
+ /sailingserver/api/v1/leaderboards/{leaderboard-name}/marks?
+ /sailingserver/api/v1/leaderboards/{leaderboard_name}
+
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 8d7bb543cd1..51916255459 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml
@@ -1,5 +1,13 @@
- Buoy Positioning App
+ SAP Buoy Positioning App
+ Buoy Positioning App
+ Course Type
+ Marks
+ Longitude
+ Latitude
+ Set Position
+ Reset Position
+ Getting race marks..
-
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/styles.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/styles.xml
index 6ce89c7ba43..e0c10426a12 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/values/styles.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values/styles.xml
@@ -17,4 +17,10 @@
-
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/adapter/MarkAdapter.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java
similarity index 83%
rename from mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/adapter/MarkAdapter.java
rename to mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java
index 3598d16d8fc..36b78e14029 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/adapter/MarkAdapter.java
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java
@@ -1,4 +1,7 @@
-package com.sap.sailing.android.tracking.app.adapter;
+package com.sap.sailing.android.buoy.positioning.app.adapter;
+
+
+import com.sap.sailing.android.buoy.positioning.app.R;
import android.content.Context;
import android.database.Cursor;
@@ -6,7 +9,6 @@ import android.support.v4.widget.ResourceCursorAdapter;
import android.view.View;
import android.widget.TextView;
-import com.sap.sailing.android.tracking.app.R;
public class MarkAdapter extends ResourceCursorAdapter {
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/RegattaAdapter.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/RegattaAdapter.java
new file mode 100644
index 00000000000..35bcc1de47c
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/RegattaAdapter.java
@@ -0,0 +1,26 @@
+package com.sap.sailing.android.buoy.positioning.app.adapter;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.view.View;
+import android.widget.TextView;
+
+import com.sap.sailing.android.buoy.positioning.app.R;
+import com.sap.sailing.android.shared.ui.adapters.AbstractRegattaAdapter;
+
+public class RegattaAdapter extends AbstractRegattaAdapter {
+
+ public RegattaAdapter(Context context, int layout, Cursor cursor, int flags) {
+ super(context, layout, cursor, flags);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ TextView name = (TextView) view.findViewById(R.id.regattaName);
+ if (name != null) {
+ //String text = cursor.getString(cursor.getColumnIndex(AnalyticsContract.Event.EVENT_NAME));
+ //text += " (" + cursor.getString(cursor.getColumnIndex(AnalyticsContract.Competitor.COMPETITOR_DISPLAY_NAME)) + ")";
+ //name.setText(text);
+ }
+ }
+}
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
new file mode 100644
index 00000000000..fc61948b3aa
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/BaseActivity.java
@@ -0,0 +1,39 @@
+package com.sap.sailing.android.buoy.positioning.app.ui.activities;
+
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences;
+import com.sap.sailing.android.shared.ui.activities.AbstractBaseActivity;
+
+public class BaseActivity extends AbstractBaseActivity {
+
+ protected AppPreferences prefs;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ prefs = new AppPreferences(this);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ //MenuInflater inflater = getMenuInflater();
+ //inflater.inflate(R.menu.options_menu, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ @Override
+ protected int getOptionsMenuResId() {
+ return 0;
+ }
+}
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
new file mode 100644
index 00000000000..51f4cc333fe
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java
@@ -0,0 +1,20 @@
+package com.sap.sailing.android.buoy.positioning.app.ui.activities;
+
+import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.ui.activities.AbstractRegattaActivity;
+
+public class RegattaActivity extends AbstractRegattaActivity{
+
+ @Override
+ public void onCheckinDataAvailable(AbstractCheckinData arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected int getOptionsMenuResId() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+}
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
new file mode 100644
index 00000000000..44f003b05ef
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/StartActivity.java
@@ -0,0 +1,40 @@
+package com.sap.sailing.android.buoy.positioning.app.ui.activities;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+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.AbstractBaseActivity;
+import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
+
+
+public class StartActivity extends AbstractBaseActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setTitle(getString(R.string.title_activity_start));
+ getSupportActionBar().setHomeButtonEnabled(false);
+ }
+ replaceFragment(R.id.content_frame, new HomeFragment());
+ }
+
+ @Override
+ protected int getOptionsMenuResId() {
+ return 0;
+ }
+
+ public AbstractHomeFragment getHomeFragment() {
+ HomeFragment homeFragment = (HomeFragment) getSupportFragmentManager()
+ .findFragmentById(R.id.content_frame);
+ return homeFragment;
+ }
+
+ public void startRegatta(String checkinDigest) {
+ Intent intent = new Intent(this, RegattaActivity.class);
+ intent.putExtra(getString(R.string.checkin_digest), checkinDigest);
+ startActivity(intent);
+ }
+}
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
new file mode 100644
index 00000000000..58ac162aa6a
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/HomeFragment.java
@@ -0,0 +1,153 @@
+package com.sap.sailing.android.buoy.positioning.app.ui.fragments;
+
+import org.json.JSONObject;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.LoaderManager.LoaderCallbacks;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.sap.sailing.android.buoy.positioning.app.R;
+import com.sap.sailing.android.buoy.positioning.app.adapter.RegattaAdapter;
+import com.sap.sailing.android.buoy.positioning.app.ui.activities.RegattaActivity;
+import com.sap.sailing.android.buoy.positioning.app.ui.activities.StartActivity;
+import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences;
+import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperError;
+import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperFailureListener;
+import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperSuccessListener;
+import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
+
+public class HomeFragment extends AbstractHomeFragment implements LoaderCallbacks {
+
+ private final static String TAG = HomeFragment.class.getName();
+
+ @SuppressLint("InflateParams")
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = super.onCreateView(inflater, container, savedInstanceState);
+
+ prefs = new AppPreferences(getActivity());
+
+ ListView listView = (ListView) view.findViewById(R.id.listRegatta);
+ if (listView != null) {
+ listView.addHeaderView(inflater.inflate(
+ R.layout.regatta_listview_header, null));
+
+ adapter = new RegattaAdapter(getActivity(),
+ R.layout.ragatta_listview_row, null, 0);
+ listView.setAdapter(adapter);
+ listView.setOnItemClickListener(new ItemClickListener());
+ }
+
+ getLoaderManager().initLoader(REGATTA_LOADER, null, this);
+
+ return view;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ getLoaderManager().restartLoader(REGATTA_LOADER, null, this);
+
+ String lastQRCode = prefs.getLastScannedQRCode();
+ if (lastQRCode != null) {
+ handleQRCode(lastQRCode);
+ }
+ }
+
+ @Override
+ public void displayUserConfirmationScreen(AbstractCheckinData data) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void handleScannedOrUrlMatchedUri(Uri uri) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * Start regatta activity.
+ *
+ * @param checkinDigest
+ */
+ private void startRegatta(String checkinDigest) {
+ Intent intent = new Intent(getActivity(), RegattaActivity.class);
+ intent.putExtra(getString(R.string.checkin_digest), checkinDigest);
+ getActivity().startActivity(intent);
+ }
+
+ @Override
+ public Loader onCreateLoader(int loaderId, Bundle bundle) {
+ switch (loaderId) {
+ case REGATTA_LOADER:
+ String[] projection = new String[] { "events.event_checkin_digest", "events.event_id", "events._id",
+ "events.event_name", "events.event_server", "competitors.competitor_display_name",
+ "competitors.competitor_id", "leaderboards.leaderboard_name",
+ "competitors.competitor_country_code", "competitors.competitor_sail_id" };
+ return new CursorLoader(getActivity(), AnalyticsContract.EventLeaderboardCompetitorJoined.CONTENT_URI,
+ projection, null, null, null);
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public void onLoadFinished(Loader loader, Cursor cursor) {
+ switch (loader.getId()) {
+ case REGATTA_LOADER:
+ adapter.changeCursor(cursor);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void onLoaderReset(Loader loader) {
+ switch (loader.getId()) {
+ case REGATTA_LOADER:
+ adapter.changeCursor(null);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ private class ItemClickListener implements OnItemClickListener {
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+
+ if (position < 1) // tapped header
+ {
+ return;
+ }
+
+ // -1, because there's a header row
+ Cursor cursor = (Cursor) adapter.getItem(position - 1);
+
+ String checkinDigest = cursor.getString(cursor.getColumnIndex("event_checkin_digest"));
+ startRegatta(checkinDigest);
+ }
+ }
+
+}
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/AppPreferences.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/AppPreferences.java
new file mode 100644
index 00000000000..7c6f4ff8404
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/AppPreferences.java
@@ -0,0 +1,17 @@
+package com.sap.sailing.android.buoy.positioning.app.util;
+
+import android.content.Context;
+
+import com.sap.sailing.android.buoy.positioning.app.R;
+import com.sap.sailing.android.shared.util.BaseAppPreferences;
+
+public class AppPreferences extends BaseAppPreferences{
+
+ public AppPreferences(Context context) {
+ super(context);
+ }
+
+ public String getServerLeaderboardPath(String leaderboardName) {
+ return context.getString(R.string.preference_server_leaderboard_path, "/leaderboards").replace("{leaderboard_name}", leaderboardName);
+ }
+}
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
new file mode 100644
index 00000000000..8cb183895cc
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java
@@ -0,0 +1,228 @@
+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.NoSuchAlgorithmException;
+import java.util.UUID;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.net.Uri;
+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.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.http.HttpGetRequest;
+import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.android.shared.ui.activities.CheckinDataActivity;
+import com.sap.sailing.android.shared.util.NetworkHelper;
+import com.sap.sailing.android.shared.util.UniqueDeviceUuid;
+import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
+import com.sap.sailing.domain.racelogtracking.DeviceIdentifier;
+import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl;
+
+public class CheckinManager {
+
+ private final static String TAG = CheckinManager.class.getName();
+ private AbstractCheckinData checkinData;
+ private CheckinDataActivity activity;
+ private AppPreferences prefs;
+ private String url;
+
+ public CheckinManager(String url, CheckinDataActivity activity){
+ this.activity = activity;
+ this.url = url;
+ prefs = new AppPreferences(activity);
+ }
+
+ public void callServerAndGenerateCheckinData(){
+ Uri uri = Uri.parse(url);
+
+ // TODO: assuming scheme is http, is this valid?
+ String scheme = uri.getScheme();
+ if (scheme != "http" && scheme != "https") {
+ scheme = "http";
+ }
+
+ final URLData urlData = extractRequestParametersFromUri(uri, scheme);
+ if (urlData == null)
+ {
+ setCheckinData(null);
+ return;
+ }
+
+ activity.showProgressDialog(R.string.please_wait, R.string.getting_marks);
+
+ try {
+ HttpGetRequest getLeaderboardRequest = new HttpGetRequest(new URL(urlData.getLeaderboardUrl), activity);
+ getLeaderBoardFromServer(urlData, getLeaderboardRequest);
+
+ } catch (MalformedURLException e) {
+ ExLog.e(activity, TAG,
+ "Error: Failed to perform checking due to a MalformedURLException: " + e.getMessage());
+ }
+ }
+
+ private URLData extractRequestParametersFromUri(Uri uri, String scheme) {
+ URLData urlData = new URLData();
+ urlData.uriStr = uri.toString();
+ urlData.server = scheme + "://" + uri.getHost();
+ urlData.port = (uri.getPort() == -1) ? 80 : uri.getPort();
+ urlData.hostWithPort = urlData.server + ":" + urlData.port;
+
+ String leaderboardNameFromQR = "";
+ try {
+ leaderboardNameFromQR = URLEncoder.encode(uri.getQueryParameter(DeviceMappingConstants.URL_LEADERBOARD_NAME), "UTF-8")
+ .replace("+", "%20");
+ } catch (UnsupportedEncodingException e) {
+ ExLog.e(activity, TAG, "Failed to encode leaderboard name: " + e.getMessage());
+ } catch (NullPointerException e) {
+ ExLog.e(activity, TAG, "Invalid Barcode (no leaderboard-name set): " + e.getMessage());
+ Toast.makeText(activity, activity.getString(R.string.error_invalid_qr_code), Toast.LENGTH_LONG).show();
+ urlData = null;
+ }
+ if(urlData != null) {
+ urlData.leaderboardName = leaderboardNameFromQR;
+
+ urlData.deviceUuid = new SmartphoneUUIDIdentifierImpl(UUID.fromString(UniqueDeviceUuid
+ .getUniqueId(activity)));
+
+ urlData.getLeaderboardUrl = urlData.hostWithPort + prefs.getServerLeaderboardPath(urlData.leaderboardName);
+ }
+ return urlData;
+ }
+
+ private void getLeaderBoardFromServer(final URLData urlData, HttpGetRequest getLeaderboardRequest) {
+ NetworkHelper.getInstance(activity).executeHttpJsonRequestAsnchronously(getLeaderboardRequest,
+ new NetworkHelper.NetworkHelperSuccessListener() {
+
+ @Override
+ public void performAction(JSONObject response) {
+ // TODO Auto-generated method stub
+
+
+ final String leaderboardName;
+
+ try {
+ leaderboardName = response.getString("name");
+ } catch (JSONException e) {
+ ExLog.e(activity, TAG, "Error getting data from call on URL: " + urlData.getLeaderboardUrl
+ + ", Error: " + e.getMessage());
+ activity.dismissProgressDialog();
+ displayAPIErrorRecommendRetry();
+ return;
+ }
+
+ HttpGetRequest getMarksRequest;
+ try {
+ getMarksRequest = new HttpGetRequest(new URL(urlData.getMarkUrl), activity);
+ getMarksFromServer(leaderboardName, getMarksRequest, urlData);
+ } catch (MalformedURLException e1) {
+ ExLog.e(activity,
+ TAG,
+ "Error: Failed to perform checking due to a MalformedURLException: "
+ + e1.getMessage());
+ }
+ }
+
+ }, new NetworkHelper.NetworkHelperFailureListener() {
+
+ @Override
+ public void performAction(NetworkHelper.NetworkHelperError e) {
+ ExLog.e(activity, TAG, "Failed to get event from API: " + e.getMessage());
+ activity.dismissProgressDialog();
+ displayAPIErrorRecommendRetry();
+ }
+ });
+ }
+
+ private void getMarksFromServer(String leaderboardName,
+ HttpGetRequest getMarksRequest, URLData urlData) {
+ // TODO Auto-generated method stub
+
+ }
+
+ private void saveCheckinDataAndNotifyListeners(URLData urlData, String leaderboardName) {
+ CheckinData data = new CheckinData();
+ data.leaderboardName = leaderboardName;
+ data.deviceUid = urlData.deviceUuid
+ .getStringRepresentation();
+ data.uriString = urlData.uriStr;
+ try {
+ data.setCheckinDigestFromString(urlData.uriStr);
+ activity.dismissProgressDialog();
+ setCheckinData(data);
+ } catch (UnsupportedEncodingException e) {
+ ExLog.e(activity,
+ TAG,
+ "Failed to get generate digest of qr-code string ("
+ + urlData.uriStr + "). "
+ + e.getMessage());
+ activity.dismissProgressDialog();
+ displayAPIErrorRecommendRetry();
+ } catch (NoSuchAlgorithmException e) {
+ ExLog.e(activity,
+ TAG,
+ "Failed to get generate digest of qr-code string ("
+ + urlData.uriStr + "). "
+ + e.getMessage());
+ activity.dismissProgressDialog();
+ displayAPIErrorRecommendRetry();
+ }
+ }
+
+ public void setCheckinData(AbstractCheckinData data){
+ checkinData = data;
+ activity.onCheckinDataAvailable(getCheckinData());
+ }
+
+ public AbstractCheckinData getCheckinData(){
+ return checkinData;
+ }
+
+ /**
+ * Shows a pop-up-dialog that informs the user than an API-call has failed and recommends a retry.
+ */
+ private void displayAPIErrorRecommendRetry() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ builder.setMessage(activity.getString(R.string.notify_user_api_call_failed));
+ builder.setCancelable(true);
+ builder.setPositiveButton(activity.getString(R.string.ok), new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.cancel();
+ }
+
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ setCheckinData(null);
+ }
+
+ public interface CheckinDataHandler{
+ }
+
+ private class URLData{
+ public String uriStr;
+ public String server;
+ public int port;
+ public String hostWithPort;
+ public String checkinURLStr;
+ public String eventId;
+ public String leaderboardName;
+ public DeviceIdentifier deviceUuid;
+ public String getMarkUrl;
+ public String getLeaderboardUrl;
+
+ public URLData(){
+
+ }
+ }
+}
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
new file mode 100644
index 00000000000..4266d197380
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/CheckinData.java
@@ -0,0 +1,34 @@
+package com.sap.sailing.android.buoy.positioning.app.valueobjects;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.LeaderboardInfo;
+
+public class CheckinData extends AbstractCheckinData{
+ public String leaderboardName;
+ public String deviceUid;
+ public String uriString;
+ public String checkinDigest;
+
+ public void setCheckinDigestFromString(String checkinString)
+ throws UnsupportedEncodingException, NoSuchAlgorithmException {
+ MessageDigest md = MessageDigest.getInstance("SHA-256");
+ md.update(checkinString.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();
+ }
+
+ public LeaderboardInfo getLeaderboard() {
+ LeaderboardInfo leaderboard = new LeaderboardInfo();
+ leaderboard.name = leaderboardName;
+ leaderboard.checkinDigest = checkinDigest;
+ return leaderboard;
+ }
+}
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/Mark.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/Mark.java
new file mode 100644
index 00000000000..6f4f5df86de
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/Mark.java
@@ -0,0 +1,49 @@
+package com.sap.sailing.android.buoy.positioning.app.valueobjects;
+
+public class Mark {
+
+ private int id;
+ private String name;
+ private String type;
+ private String className;
+
+ public Mark(int id, String name, String type, String className){
+ setId(id);
+ setName(name);
+ setType(type);
+ setClassName(className);
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public void setClassName(String className) {
+ this.className = className;
+ }
+
+}
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPing.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPing.java
new file mode 100644
index 00000000000..790a45c3902
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPing.java
@@ -0,0 +1,47 @@
+package com.sap.sailing.android.buoy.positioning.app.valueobjects;
+
+public class MarkPing {
+ private String type;
+ private String longitude;
+ private String lattitude;
+ private int unixType;
+
+ public MarkPing(String type, String longitude, String lattitude, int unixType){
+ setType(type);
+ setLongitude(longitude);
+ setLattitude(lattitude);
+ setUnixType(unixType);
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(String longitude) {
+ this.longitude = longitude;
+ }
+
+ public String getLattitude() {
+ return lattitude;
+ }
+
+ public void setLattitude(String lattitude) {
+ this.lattitude = lattitude;
+ }
+
+ public int getUnixType() {
+ return unixType;
+ }
+
+ public void setUnixType(int unixType) {
+ this.unixType = unixType;
+ }
+}
diff --git a/mobile/pom.xml b/mobile/pom.xml
index dceb689ef19..069aa8e6d97 100644
--- a/mobile/pom.xml
+++ b/mobile/pom.xml
@@ -16,6 +16,7 @@