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 @@