diff --git a/mobile/com.sap.sailing.android.shared/res/drawable-hdpi/white_arrow_right.png b/mobile/com.sap.sailing.android.shared/res/drawable-hdpi/white_arrow_right.png
new file mode 100755
index 00000000000..c331f4cd6fe
Binary files /dev/null and b/mobile/com.sap.sailing.android.shared/res/drawable-hdpi/white_arrow_right.png differ
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable-mdpi/white_arrow_right.png b/mobile/com.sap.sailing.android.shared/res/drawable-mdpi/white_arrow_right.png
new file mode 100755
index 00000000000..27624e12415
Binary files /dev/null and b/mobile/com.sap.sailing.android.shared/res/drawable-mdpi/white_arrow_right.png differ
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable-xhdpi/white_arrow_right.png b/mobile/com.sap.sailing.android.shared/res/drawable-xhdpi/white_arrow_right.png
new file mode 100755
index 00000000000..902278fdf8c
Binary files /dev/null and b/mobile/com.sap.sailing.android.shared/res/drawable-xhdpi/white_arrow_right.png differ
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable-xxhdpi/white_arrow_right.png b/mobile/com.sap.sailing.android.shared/res/drawable-xxhdpi/white_arrow_right.png
new file mode 100755
index 00000000000..3ed1a96c355
Binary files /dev/null and b/mobile/com.sap.sailing.android.shared/res/drawable-xxhdpi/white_arrow_right.png differ
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/blue_button.xml b/mobile/com.sap.sailing.android.shared/res/drawable/blue_button.xml
new file mode 100644
index 00000000000..44aebc9d21e
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/drawable/blue_button.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/fiori_main_background.xml b/mobile/com.sap.sailing.android.shared/res/drawable/fiori_main_background.xml
new file mode 100644
index 00000000000..62df1bf05c1
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/drawable/fiori_main_background.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/normal_btn_blue.xml b/mobile/com.sap.sailing.android.shared/res/drawable/normal_btn_blue.xml
new file mode 100644
index 00000000000..123d392f145
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/drawable/normal_btn_blue.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/normal_btn_white.xml b/mobile/com.sap.sailing.android.shared/res/drawable/normal_btn_white.xml
new file mode 100644
index 00000000000..e4977ef4436
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/drawable/normal_btn_white.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/pressed_btn_blue.xml b/mobile/com.sap.sailing.android.shared/res/drawable/pressed_btn_blue.xml
new file mode 100644
index 00000000000..0ca776f1a61
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/drawable/pressed_btn_blue.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/pressed_btn_white.xml b/mobile/com.sap.sailing.android.shared/res/drawable/pressed_btn_white.xml
new file mode 100644
index 00000000000..f7feec47003
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/drawable/pressed_btn_white.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/white_button.xml b/mobile/com.sap.sailing.android.shared/res/drawable/white_button.xml
new file mode 100644
index 00000000000..1a294b29d77
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/drawable/white_button.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/drawable/yellow_arrow_right.png b/mobile/com.sap.sailing.android.shared/res/drawable/yellow_arrow_right.png
deleted file mode 100644
index 174bb8d7fcd..00000000000
Binary files a/mobile/com.sap.sailing.android.shared/res/drawable/yellow_arrow_right.png and /dev/null differ
diff --git a/mobile/com.sap.sailing.android.shared/res/layout-land/fragment_home.xml b/mobile/com.sap.sailing.android.shared/res/layout-land/fragment_home.xml
index ab2790cff58..6d1436f151d 100644
--- a/mobile/com.sap.sailing.android.shared/res/layout-land/fragment_home.xml
+++ b/mobile/com.sap.sailing.android.shared/res/layout-land/fragment_home.xml
@@ -1,80 +1,64 @@
-
-
+ android:layout_height="match_parent"
+ android:background="@drawable/fiori_main_background">
-
-
-
+
-
+ android:text="@string/no_qr_code"
+ android:textColor="@color/fiori_text_color"/>
-
+ android:textStyle="bold"/>
@@ -85,8 +69,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/two_buttons_layout"
- android:layout_below="@id/toolbar_separator"
- android:divider="@android:color/white"
+ android:layout_alignParentTop="true"
+ android:divider="@color/separator_color"
android:dividerHeight="1dp"
>
diff --git a/mobile/com.sap.sailing.android.shared/res/layout/fragment_about.xml b/mobile/com.sap.sailing.android.shared/res/layout/fragment_about.xml
index 103aecf424b..ed8ba99ce01 100644
--- a/mobile/com.sap.sailing.android.shared/res/layout/fragment_about.xml
+++ b/mobile/com.sap.sailing.android.shared/res/layout/fragment_about.xml
@@ -1,11 +1,8 @@
-
+ android:layout_height="match_parent"
+ android:background="@drawable/fiori_main_background">
-
-
-
+ android:layout_marginLeft="@dimen/about_button_side_margin"
+ android:text="@string/application_version"
+ android:textColor="@color/fiori_text_color"/>
-
+ android:layout_marginBottom="@dimen/about_button_top_bottom_margin"
+ android:layout_marginLeft="@dimen/about_button_side_margin"
+ android:textColor="@color/fiori_text_color"/>
\ No newline at end of file
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 0a01deb6ed3..c9bf7d6a47c 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
@@ -1,46 +1,57 @@
-
+
+ android:layout_height="@dimen/toolbar_height"
+ android:minHeight="@dimen/toolbar_height"
+ android:theme="@style/AppTheme.Toolbar">
-
-
+
+
+
+ android:layout_height="match_parent"/>
-
\ No newline at end of file
+
\ No newline at end of file
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 ab50020f89d..2369c05d749 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
@@ -1,21 +1,14 @@
-
-
+ android:layout_height="match_parent"
+ android:background="@drawable/fiori_main_background">
@@ -23,60 +16,58 @@
+ android:layout_marginLeft="@dimen/fragment_side_margin"
+ android:layout_marginRight="@dimen/fragment_side_margin">
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:textSize="@dimen/highlight_text_size"/>
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/button_text_size"/>
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/layout/pref_with_actionbar.xml b/mobile/com.sap.sailing.android.shared/res/layout/pref_with_actionbar.xml
index d76da025774..f941de48b4a 100644
--- a/mobile/com.sap.sailing.android.shared/res/layout/pref_with_actionbar.xml
+++ b/mobile/com.sap.sailing.android.shared/res/layout/pref_with_actionbar.xml
@@ -18,7 +18,7 @@
android:layout_height="match_parent"
android:padding="10dp">
-
-
-
+ android:background="@color/separator_color"/>
-
+ android:layout_height="@dimen/list_row_height"
+ android:background="@color/list_item_background_color"
+ tools:ignore="Overdraw" >
+ android:src="@drawable/white_arrow_right"
+ android:paddingTop="15dp"
+ android:layout_marginRight="@dimen/list_arrow_right_margin"
+ android:layout_marginEnd="@dimen/list_arrow_right_margin" />
-
+ android:textColor="@color/fiori_text_color" />
\ No newline at end of file
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 d0349337319..94ddd2b6a71 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
@@ -1,18 +1,23 @@
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/list_header_background_color">
-
+
+
+ android:paddingLeft="@dimen/fragment_side_margin"
+ android:layout_gravity="center_vertical"
+ android:textSize="@dimen/list_header_text_size"
+ android:textColor="@color/fiori_text_color"
+ android:text="@string/your_regattas" />
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/values-land/dimens.xml b/mobile/com.sap.sailing.android.shared/res/values-land/dimens.xml
new file mode 100644
index 00000000000..f26f249b4e6
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/values-land/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 80dp
+ 50dp
+ 10dp
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/values/api_endpoints.xml b/mobile/com.sap.sailing.android.shared/res/values/api_endpoints.xml
new file mode 100644
index 00000000000..3205445caf2
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/res/values/api_endpoints.xml
@@ -0,0 +1,5 @@
+
+
+ /sailingserver/api/v1/leaderboards/{leaderboard_name}/marks?
+ /sailingserver/api/v1/leaderboards/{leaderboard_name}
+
\ 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 8bcad890f7f..b8b85ffe5ec 100644
--- a/mobile/com.sap.sailing.android.shared/res/values/colors.xml
+++ b/mobile/com.sap.sailing.android.shared/res/values/colors.xml
@@ -47,5 +47,20 @@
#333333
@color/gray
#D6B363
- #7fEEAA29
+
+ @color/black
+ @color/white
+
+ #d1d3d4
+ #def1f1
+ #f6fbfb
+
+ #009de0
+ @color/black
+
+ @color/fiori_primary_color
+ #007aad
+
+ #f3f3f3
+ #bfbfbf
diff --git a/mobile/com.sap.sailing.android.shared/res/values/dimens.xml b/mobile/com.sap.sailing.android.shared/res/values/dimens.xml
index bd4cc6a9626..14e742df84d 100644
--- a/mobile/com.sap.sailing.android.shared/res/values/dimens.xml
+++ b/mobile/com.sap.sailing.android.shared/res/values/dimens.xml
@@ -21,16 +21,35 @@
3dp
36sp
6sp
+
16dp
- 4dp
+
+
+ 20dp
+
+
+ 1dp
+ @dimen/fragment_side_margin
+ 60dp
+
+
+ 50dp
+ 80dp
+ 10dp
10dp
16dp
80dp
18sp
- 80dp
- 50dp
+ 50dp
+ 3dp
+ @dimen/default_text_size
+
+
+ 16sp
+ 21sp
+ 18sp
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/res/values/styles.xml b/mobile/com.sap.sailing.android.shared/res/values/styles.xml
index 61e159eff19..c8b8bb8ae82 100644
--- a/mobile/com.sap.sailing.android.shared/res/values/styles.xml
+++ b/mobile/com.sap.sailing.android.shared/res/values/styles.xml
@@ -343,4 +343,9 @@
- @color/welter_light_gray
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/AbstractCheckinData.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/BaseCheckinData.java
similarity index 52%
rename from mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/AbstractCheckinData.java
rename to mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/BaseCheckinData.java
index 99d5e78054a..5e35cf2370e 100644
--- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/AbstractCheckinData.java
+++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/BaseCheckinData.java
@@ -1,5 +1,5 @@
package com.sap.sailing.android.shared.data;
-public abstract class AbstractCheckinData {
+public abstract class BaseCheckinData {
}
diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/CheckinUrlInfo.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/CheckinUrlInfo.java
index f2498c25f26..23981b6b5f9 100644
--- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/CheckinUrlInfo.java
+++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/CheckinUrlInfo.java
@@ -1,7 +1,12 @@
package com.sap.sailing.android.shared.data;
public class CheckinUrlInfo {
+
+ public static int TYPE_COMPETITOR = 0;
+ public static int TYPE_MARK = 1;
+
public String urlString;
public String checkinDigest;
+ public int type;
public int rowId;
}
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
index f45be118535..89018a460ba 100755
--- 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
@@ -16,12 +16,13 @@ import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
public abstract class AbstractStartActivity extends CheckinDataActivity {
private final static String TAG = AbstractStartActivity.class.getName();
+ protected OpenSansToolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_container);
- OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar);
+ toolbar = (OpenSansToolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
toolbar.hideSubtitle();
diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/activities/CheckinDataActivity.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/activities/CheckinDataActivity.java
index e9ae6ade12b..4583375c905 100644
--- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/activities/CheckinDataActivity.java
+++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/activities/CheckinDataActivity.java
@@ -4,13 +4,13 @@ import android.app.AlertDialog;
import android.content.DialogInterface;
import com.sap.sailing.android.shared.R;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.util.CheckinDataHandler;
public abstract class CheckinDataActivity extends AbstractBaseActivity implements CheckinDataHandler {
@Override
- public abstract void onCheckinDataAvailable(AbstractCheckinData data);
+ public abstract void onCheckinDataAvailable(BaseCheckinData data);
/**
* Shows a pop-up-dialog that informs the user than an DB-operation has failed.
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 8eff6f98c16..b3d4aa5f1b4 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
@@ -48,8 +48,6 @@ public class OpenSansToolbar extends Toolbar {
}
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);
}
@@ -57,6 +55,6 @@ public class OpenSansToolbar extends Toolbar {
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));
+ titleTextView.setTextColor(getResources().getColor(R.color.toolbar_text_color));
}
}
diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/CheckinDataHandler.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/CheckinDataHandler.java
index 8fb8384600d..81fd59edcd0 100644
--- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/CheckinDataHandler.java
+++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/CheckinDataHandler.java
@@ -1,7 +1,7 @@
package com.sap.sailing.android.shared.util;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
public interface CheckinDataHandler {
- public void onCheckinDataAvailable(AbstractCheckinData data);
+ public void onCheckinDataAvailable(BaseCheckinData data);
}
diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java
index a0f2e4c7bcf..2a1fc69c22f 100644
--- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java
+++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java
@@ -19,7 +19,7 @@ import android.widget.Button;
import android.widget.Toast;
import com.sap.sailing.android.shared.R;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.ui.adapters.AbstractRegattaAdapter;
@@ -108,7 +108,7 @@ public abstract class AbstractHomeFragment extends BaseFragment {
*
* @param checkinData
*/
- public abstract void displayUserConfirmationScreen(final AbstractCheckinData data);
+ public abstract void displayUserConfirmationScreen(final BaseCheckinData data);
protected void clearScannedQRCodeInPrefs() {
prefs.setLastScannedQRCode(null);
diff --git a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml
index 22905108ea0..7d3bec6dfd3 100644
--- a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml
@@ -77,6 +77,13 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.StartActivity"/>
+
+
+
+ android:drawable="@drawable/fiori_main_background"/>
- -
+
-
+ -
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/normal_btn_green.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/normal_btn_green.xml
new file mode 100644
index 00000000000..e1addd2f76f
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/drawable/normal_btn_green.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/normal_btn_red.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/normal_btn_red.xml
new file mode 100644
index 00000000000..333db8be982
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/drawable/normal_btn_red.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/pressed_btn_green.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/pressed_btn_green.xml
new file mode 100644
index 00000000000..86ee4bd8589
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/drawable/pressed_btn_green.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/pressed_btn_red.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/pressed_btn_red.xml
new file mode 100644
index 00000000000..40e09030152
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/drawable/pressed_btn_red.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_green.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_green.xml
deleted file mode 100644
index c68db18282c..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/drawable/rounded_btn_green.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
\ 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/start_tracking_button.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/start_tracking_button.xml
new file mode 100644
index 00000000000..88a50506fc3
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/drawable/start_tracking_button.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/stift.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable/stift.png
deleted file mode 100644
index f3f5138726b..00000000000
Binary files a/mobile/com.sap.sailing.android.tracking.app/res/drawable/stift.png and /dev/null differ
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/stop_tracking_button.xml b/mobile/com.sap.sailing.android.tracking.app/res/drawable/stop_tracking_button.xml
new file mode 100644
index 00000000000..c9ab42c40b8
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/drawable/stop_tracking_button.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/yellow_arrow_right.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable/yellow_arrow_right.png
deleted file mode 100644
index 174bb8d7fcd..00000000000
Binary files a/mobile/com.sap.sailing.android.tracking.app/res/drawable/yellow_arrow_right.png and /dev/null differ
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_home.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_home.xml
index d0eb0149237..ad7c8e7c972 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_home.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_home.xml
@@ -64,7 +64,7 @@
android:layout_marginRight="10dp"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
- android:background="@drawable/rounded_btn_white"
+ android:background="@drawable/normal_btn_white"
android:textColor="@color/black"
android:text="@string/no_qr_code"/>
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml
index 82902c7cfaf..50e25da203f 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml
@@ -5,7 +5,7 @@
android:layout_height="match_parent">
@@ -201,7 +201,7 @@
android:id="@+id/change_photo_button"
android:layout_width="35dp"
android:layout_height="35dp"
- android:background="@drawable/stift"/>
+ android:background="@drawable/edit_pencil"/>
@@ -381,8 +381,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/regatta_button_margin"
- android:layout_marginLeft="@dimen/regatta_button_side_margin"
- android:layout_marginRight="@dimen/regatta_button_side_margin"
+ android:layout_marginLeft="@dimen/fragment_side_margin"
+ android:layout_marginRight="@dimen/fragment_side_margin"
android:padding="@dimen/regatta_button_padding"
android:text="@string/show_event"
android:background="@drawable/rounded_btn_blue"
@@ -429,8 +429,8 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="@dimen/regatta_button_margin"
- android:layout_marginLeft="@dimen/regatta_button_side_margin"
- android:layout_marginRight="@dimen/regatta_button_side_margin"
+ android:layout_marginLeft="@dimen/fragment_side_margin"
+ android:layout_marginRight="@dimen/fragment_side_margin"
android:layout_weight="0.50"
android:background="@drawable/rounded_btn_yellow"
android:padding="@dimen/regatta_button_padding"
@@ -443,10 +443,10 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="@dimen/regatta_button_margin"
- android:layout_marginLeft="@dimen/regatta_button_side_margin"
- android:layout_marginRight="@dimen/regatta_button_side_margin"
+ android:layout_marginLeft="@dimen/fragment_side_margin"
+ android:layout_marginRight="@dimen/fragment_side_margin"
android:layout_weight="0.50"
- android:background="@drawable/rounded_btn_green"
+ android:background="@drawable/normal_btn_green"
android:padding="@dimen/regatta_button_padding"
android:text="@string/start_tracking"
android:textAllCaps="true"
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/activity_tracking.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/activity_tracking.xml
index 6fa3211f563..d87bf0fba8c 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/activity_tracking.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/activity_tracking.xml
@@ -1,12 +1,13 @@
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/fiori_main_background">
+ android:theme="@style/AppTheme.Toolbar">
+ android:textColor="@color/toolbar_text_color"
+ android:textSize="16sp"/>
+ android:textColor="@color/toolbar_text_color"
+ android:textSize="12sp"/>
+
+
+ android:padding="0dp"/>
+ android:layout_weight="1"/>
-
+ android:textSize="@dimen/highlight_text_size"/>
+ android:layout_marginBottom="10dp"/>
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_about.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_about.xml
index 62b96832385..05b89421203 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_about.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_about.xml
@@ -3,13 +3,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
-
-
-
-
-
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy.xml
new file mode 100644
index 00000000000..05887b6d3f9
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_buoy.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_compass.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_compass.xml
index 52b9ffc4da1..8dbef24653a 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_compass.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_compass.xml
@@ -1,8 +1,5 @@
@@ -10,22 +7,24 @@
android:id="@+id/compass_bearing_header_text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:paddingLeft="10dp"
- android:paddingRight="10dp"
android:layout_alignParentTop="true"
- android:text="@string/course_over_ground"
- android:textColor="@android:color/darker_gray"
- android:textSize="15sp"
+ android:paddingLeft="@dimen/fragment_side_margin"
+ android:paddingRight="10dp"
android:paddingTop="15dp"
+ android:text="@string/course_over_ground"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"
/>
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_regatta.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_regatta.xml
index 0802d4440a4..bc6493076c8 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_regatta.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_regatta.xml
@@ -2,7 +2,9 @@
+ android:layout_height="match_parent"
+ xmlns:Tools="http://schemas.android.com/apk/res-auto"
+ android:background="@drawable/fiori_main_background">
-
+ android:textColor="@color/fiori_text_color"/>
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
+
+
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
+ android:paddingBottom="10dp"
+ android:paddingTop="10dp">
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"
+ android:textStyle="bold"/>
+ android:paddingRight="5dp"
+ android:paddingTop="3dp">
+ android:contentDescription="@string/content_description_flag_icon"
+ android:scaleType="fitXY"
+ android:textColor="@color/fiori_text_color"/>
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"
+ android:textStyle="bold"/>
+ android:layout_width="50dp"
+ android:layout_height="50dp"
+ android:background="@drawable/edit_pencil"/>
+ android:background="@color/separator_color"/>
-
@@ -218,6 +226,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
+
+ android:paddingTop="10dp"
+ android:visibility="gone">
-
+ android:orientation="horizontal">
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
+ tools:visibility="gone">
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/highlight_text_size"/>
-
+ android:text="@string/days"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
+
+
+
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/highlight_text_size"/>
-
+ android:text="@string/hours"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
+
+
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/highlight_text_size"/>
-
+ android:text="@string/minutes"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
-
-
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/regatta_button_layout_height"
+ android:layout_above="@+id/bottom_announcement">
-
-
+ android:textSize="@dimen/button_text_size"/>
+ android:layout_height="@dimen/tracking_button_height"
+ android:layout_alignParentBottom="true"
+ android:layout_marginTop="@dimen/regatta_button_margin">
-
+ android:textSize="@dimen/tracking_button_text_size"/>
-
-
-
-
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/regatta_button_margin"
+ android:layout_marginTop="@dimen/regatta_button_margin"
+ android:text="@string/please_listen_to_announcements"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_speed.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_speed.xml
index 3f25a6505c6..9b4fafe7e15 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_speed.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_speed.xml
@@ -1,8 +1,6 @@
@@ -10,12 +8,12 @@
android:id="@+id/speed_header_text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:text="@string/speed_over_ground"
- android:textColor="@android:color/darker_gray"
- android:textSize="14sp"
- android:paddingLeft="10dp"
+ android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="10dp"
- android:paddingTop="15dp"/>
+ android:paddingTop="15dp"
+ android:text="@string/speed_over_ground"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_time.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_time.xml
index 787379cdb5e..b32edfc5319 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_time.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_time.xml
@@ -1,21 +1,23 @@
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:baselineAligned="false"
+ android:paddingTop="15dp">
-
+ android:text="@string/tracking_time"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:text="@string/waiting_for_gps"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
+ tools:ignore="InconsistentLayout"/>
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_tracking.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_tracking.xml
index 70ed9276306..a8fe31aea31 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_tracking.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/fragment_tracking.xml
@@ -1,9 +1,8 @@
+ android:background="@color/tracking_status_row_color">
-
+ android:text="@string/tracking_mode"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:text="@string/tracking_unsent_fixes"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:paddingRight="@dimen/fragment_side_margin"
+ android:text="@string/none"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:text="@string/tracking_status"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:text=""
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
+ android:text="@string/tracking_gps_accuracy"
+ android:textColor="@color/fiori_text_color"
+ android:textSize="@dimen/default_text_size"/>
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/pref_with_actionbar.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/pref_with_actionbar.xml
index d1860418685..7b035454a68 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/pref_with_actionbar.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/layout/pref_with_actionbar.xml
@@ -1,21 +1,20 @@
+ android:layout_height="match_parent"
+ android:orientation="vertical">
@@ -41,10 +42,10 @@
+ android:id="@+id/toolbar_separator"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/toolbar_separator_height"
+ android:background="@color/separator_color"/>
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout/regatta_listview_header.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout/regatta_listview_header.xml
deleted file mode 100644
index b5dfa6a4d96..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/layout/regatta_listview_header.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/menu/buoy_menu.xml b/mobile/com.sap.sailing.android.tracking.app/res/menu/buoy_menu.xml
new file mode 100644
index 00000000000..a374cc3c836
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/menu/buoy_menu.xml
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values-h600dp/dimens.xml b/mobile/com.sap.sailing.android.tracking.app/res/values-h600dp/dimens.xml
new file mode 100644
index 00000000000..9cd4a5bd9f0
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values-h600dp/dimens.xml
@@ -0,0 +1,8 @@
+
+
+
+ 190dp
+ 10dp
+ 10dp
+ 120dp
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values-v21/theme.xml b/mobile/com.sap.sailing.android.tracking.app/res/values-v21/theme.xml
index 778bacdfcec..8a970c5fc95 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values-v21/theme.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values-v21/theme.xml
@@ -3,6 +3,16 @@
+
+
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/api_endpoints.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/api_endpoints.xml
index 611ab135e08..f00f1a97148 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values/api_endpoints.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values/api_endpoints.xml
@@ -5,8 +5,8 @@
/sailingserver/api/v1/leaderboards/{leaderboard-name}/device_mappings/end
/sailingserver/api/v1/events/{event_id}
/gwt/Home.html?navigationTab=Regattas#EventPlace:eventId=%s
- /sailingserver/api/v1/leaderboards/{leaderboard_name}
/sailingserver/api/v1/competitors/{competitor_id}
/sailingserver/api/v1/competitors/{competitor_id}/team
/sailingserver/api/v1/competitors/{competitor_id}/team/image
+ /sailingserver/api/v1/leaderboards/{leaderboardName}/marks/{markId}
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 5bb74510c02..6bbe18aa2e2 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
@@ -2,13 +2,24 @@
#FFFFFF
#55FFFFFF
- #CCFFFFFF
+ #f3f3f3
#00FF00
#333333
#242424
+ #55000000
@color/gray
@color/colorPrimary
- @color/sap_yellow
+ @color/fiori_primary_color
+
+ #0e7733
+ #08451e
+
+ #cd201b
+ #991814
+
+ #B3f3f3f3
+
+ #f6fbfb
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/dimens.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/dimens.xml
index db6d6dd12d2..a5028938f55 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values/dimens.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values/dimens.xml
@@ -5,9 +5,14 @@
- 90dp
- 4dp
+ 140dp
+ @dimen/no_qr_code_button_height
10dp
10dp
+ 80dp
+ @dimen/highlight_text_size
+ 22dp
+ 35dp
+ 2dp
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/dimens_fragment.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/dimens_fragment.xml
deleted file mode 100644
index 89954c708d5..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/res/values/dimens_fragment.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/theme.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/theme.xml
index fd18c73706a..6a50c136930 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values/theme.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values/theme.xml
@@ -4,7 +4,7 @@
-
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__defaults.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__defaults.xml
index e4d44cbffb3..fff6af0a215 100644
--- a/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__defaults.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/res/values/vpi__defaults.xml
@@ -16,18 +16,18 @@
true
- #FFFFFFFF
- #00000000
+ @color/fiori_primary_color
+ #999999
0
3dp
false
#FFDDDDDD
- 1dp
+ 0dp
12dp
4dp
1dp
- #FF33B5E5
+ @color/fiori_primary_color
#FFBBBBBB
true
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/customviews/OpenSansToolbar.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/customviews/OpenSansToolbar.java
deleted file mode 100644
index 6ab900bd4d3..00000000000
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/customviews/OpenSansToolbar.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.sap.sailing.android.tracking.app.customviews;
-
-import android.content.Context;
-import android.support.v7.widget.Toolbar;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-import com.sap.sailing.android.tracking.app.R;
-
-public class OpenSansToolbar extends Toolbar {
-
- public OpenSansToolbar(Context context) {
- super(context);
- }
-
- public OpenSansToolbar(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public OpenSansToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- @Override
- public void setTitle(int resId) {
- TextView titleTextView = (TextView)findViewById(R.id.toolbar_title);
- titleTextView.setText(resId);
- }
-
- @Override
- public void setSubtitle(int resId) {
- TextView subtitleTextView = (TextView)findViewById(R.id.toolbar_subtitle);
- subtitleTextView.setText(resId);
- }
-
- @Override
- public void setTitle(CharSequence arg0) {
- TextView titleTextView = (TextView)findViewById(R.id.toolbar_title);
- titleTextView.setText(arg0);
- }
-
- @Override
- public void setSubtitle(CharSequence arg0) {
- TextView subtitleTextView = (TextView)findViewById(R.id.toolbar_subtitle);
- subtitleTextView.setText(arg0);
- }
-}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsContract.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsContract.java
index 86a912f6a52..fb9cc9a129f 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsContract.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsContract.java
@@ -30,9 +30,16 @@ public class AnalyticsContract {
String EVENT_CHECKIN_DIGEST = "event_checkin_digest";
}
- interface CheckinUriColumns {
+ interface markColums {
+ String MARK_ID = "mark_id";
+ String MARK_NAME = "mark_name";
+ String MARK_CHECKIN_DIGEST = "mark_checkin_digest";
+ }
+
+ interface CheckinColumns {
String CHECKIN_URI_VALUE = "uri_value";
String CHECKIN_URI_CHECKIN_DIGEST = "uri_checkin_digest";
+ String CHECKIN_TYPE = "checkin_type";
}
public static final String CONTENT_AUTHORITY = "com.sap.sailing.android.tracking.app.provider.db";
@@ -40,9 +47,10 @@ public class AnalyticsContract {
public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
private static final String PATH_COMPETITOR = "competitors";
- private static final String PATH_EVENT = "events";
- private static final String PATH_LEADERBOARD = "leaderboards";
- private static final String PATH_CHECKIN_URI = "checkin_uris";
+ public static final String PATH_EVENT = "events";
+ public static final String PATH_LEADERBOARD = "leaderboards";
+ public static final String PATH_CHECKIN = "checkin_uris";
+ private static final String PATH_MARK = "marks";
public static class LeaderboardsEventsJoined {
public final static Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath("leaderboards_events_joined")
@@ -54,6 +62,11 @@ public class AnalyticsContract {
.appendPath("event_leaderboard_competitor_joined").build();
}
+ public static class EventLeaderboardMarkJoined {
+ public final static Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
+ .appendPath("event_leaderboard_mark_joined").build();
+ }
+
public static class Competitor implements CompetitorColumns, BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_COMPETITOR).build();
@@ -116,8 +129,8 @@ public class AnalyticsContract {
}
}
- public static class CheckinUri implements CheckinUriColumns, BaseColumns {
- public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_CHECKIN_URI).build();
+ public static class Checkin implements CheckinColumns, BaseColumns {
+ public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_CHECKIN).build();
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ "/vnd.sap_sailing_analytics.uri";
@@ -134,6 +147,23 @@ public class AnalyticsContract {
}
}
+ public static class Mark implements markColums, BaseColumns {
+ public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_MARK).build();
+ public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ + "/vnd.sap_sailing_analytics.Mark";
+ public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
+ + "/vnd.sap_sailing_analytics.Mark";
+ public static final String DEFAULT_SORT = BaseColumns._ID + " ASC ";
+
+ public static Uri buildMarkUri(String leaderboardId) {
+ return CONTENT_URI.buildUpon().appendPath(leaderboardId).build();
+ }
+
+ public static String getMarkId(Uri uri) {
+ return uri.getPathSegments().get(1);
+ }
+ }
+
private AnalyticsContract() {
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java
index fb6c14fa4f9..780515d5327 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java
@@ -12,7 +12,7 @@ import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Event;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.EventColumns;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Leaderboard;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.LeaderboardColumns;
-import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.CheckinUriColumns;
+import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.CheckinColumns;
public class AnalyticsDatabase extends SQLiteOpenHelper {
@@ -20,8 +20,13 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "sap_sailing_analytics.db";
- private static final int VER_2014_RELEASE_1 = 1;
- private static final int CUR_DATABASE_VERSION = VER_2014_RELEASE_1;
+ private static final int VER_2016_RELEASE_1 = 2;
+ private static final int CUR_DATABASE_VERSION = VER_2016_RELEASE_1;
+
+ private static final String createMarkTable = "CREATE TABLE " + Tables.MARKS + " (" + BaseColumns._ID
+ + " INTEGER PRIMARY KEY AUTOINCREMENT, " + AnalyticsContract.Mark.MARK_ID + " TEXT, "
+ + AnalyticsContract.Mark.MARK_NAME + " TEXT, "
+ + AnalyticsContract.Mark.MARK_CHECKIN_DIGEST + " TEXT );" ;
private final Context mContext;
@@ -31,15 +36,23 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
String EVENTS_COMPETITORS = "events_competitors";
String LEADERBOARDS = "leaderboards";
String CHECKIN_URIS = "checkin_uris";
+ String MARKS = "marks";
+ String EVENTS_JOIN_LEADERBOARDS_JOIN_MARKS = Tables.LEADERBOARDS + " INNER JOIN " + Tables.EVENTS
+ + " ON (" + Tables.LEADERBOARDS + "." + Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = " + Tables.EVENTS
+ + "." + Event.EVENT_CHECKIN_DIGEST + ") " + " INNER JOIN " + Tables.MARKS + " ON ("
+ + Tables.LEADERBOARDS + "." + Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = " + Tables.MARKS + "."
+ + AnalyticsContract.Mark.MARK_CHECKIN_DIGEST + ") ";
String EVENTS_JOIN_LEADERBOARDS_JOIN_COMPETITORS = Tables.LEADERBOARDS + " INNER JOIN " + Tables.EVENTS
+ " ON (" + Tables.LEADERBOARDS + "." + Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = " + Tables.EVENTS
+ "." + Event.EVENT_CHECKIN_DIGEST + ") " + " INNER JOIN " + Tables.COMPETITORS + " ON ("
+ Tables.LEADERBOARDS + "." + Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = " + Tables.COMPETITORS + "."
+ Competitor.COMPETITOR_CHECKIN_DIGEST + ") ";
- String LEADERBOARDS_JOIN_EVENTS = "events LEFT JOIN leaderboards ON " + Tables.EVENTS + "."
- + Event.EVENT_CHECKIN_DIGEST + " = " + Tables.LEADERBOARDS + "."
- + Leaderboard.LEADERBOARD_CHECKIN_DIGEST;
+ String LEADERBOARDS_JOIN_EVENTS = Tables.LEADERBOARDS + " INNER JOIN " + Tables.EVENTS
+ + " ON (" + Tables.LEADERBOARDS + "." + Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = " + Tables.EVENTS
+ + "." + Event.EVENT_CHECKIN_DIGEST + ") " + " INNER JOIN " + Tables.CHECKIN_URIS + " ON ("
+ + Tables.LEADERBOARDS + "." + Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = " + Tables.CHECKIN_URIS + "."
+ + AnalyticsContract.Checkin.CHECKIN_URI_CHECKIN_DIGEST + ") ";
}
public AnalyticsDatabase(Context context) {
@@ -54,8 +67,9 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
+ LeaderboardColumns.LEADERBOARD_NAME + " TEXT );");
db.execSQL("CREATE TABLE " + Tables.CHECKIN_URIS + " (" + BaseColumns._ID
- + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CheckinUriColumns.CHECKIN_URI_CHECKIN_DIGEST + " TEXT, "
- + CheckinUriColumns.CHECKIN_URI_VALUE + " TEXT );");
+ + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CheckinColumns.CHECKIN_URI_CHECKIN_DIGEST + " TEXT, "
+ + CheckinColumns.CHECKIN_URI_VALUE + " TEXT, "
+ + CheckinColumns.CHECKIN_TYPE + " INTEGER );");
db.execSQL("CREATE TABLE " + Tables.COMPETITORS + " (" + BaseColumns._ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + CompetitorColumns.COMPETITOR_ID + " TEXT, "
@@ -69,24 +83,16 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
+ EventColumns.EVENT_DATE_START + " INTEGER, " + EventColumns.EVENT_DATE_END + " INTEGER, "
+ EventColumns.EVENT_SERVER + " TEXT, " + EventColumns.EVENT_IMAGE_URL + " TEXT, "
+ EventColumns.EVENT_CHECKIN_DIGEST + " TEXT )");
+
+ db.execSQL(createMarkTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
ExLog.i(mContext, TAG, "onUpgrade() from " + oldVersion + " to " + newVersion);
-
- int version = oldVersion;
-
- if (version != CUR_DATABASE_VERSION) {
- ExLog.i(mContext, TAG, "Upgrade unsuccessful - destroying old data during upgrade");
-
- db.execSQL("DROP TABLE IF EXISTS " + Tables.COMPETITORS);
- db.execSQL("DROP TABLE IF EXISTS " + Tables.EVENTS);
- db.execSQL("DROP TABLE IF EXISTS " + Tables.LEADERBOARDS);
- db.execSQL("DROP TABLE IF EXISTS " + Tables.CHECKIN_URIS);
-
- onCreate(db);
- version = CUR_DATABASE_VERSION;
+ if (oldVersion == 1 && newVersion == 2) {
+ db.execSQL(createMarkTable);
+ db.execSQL("ALTER TABLE " + Tables.CHECKIN_URIS + " ADD COLUMN " + AnalyticsContract.Checkin.CHECKIN_TYPE + " INTEGER DEFAULT 0");
}
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsProvider.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsProvider.java
index ce52e4022db..244a88aca08 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsProvider.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsProvider.java
@@ -1,5 +1,7 @@
package com.sap.sailing.android.tracking.app.provider;
+import java.util.Arrays;
+
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
@@ -13,15 +15,13 @@ import android.provider.BaseColumns;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.SelectionBuilder;
import com.sap.sailing.android.tracking.app.BuildConfig;
+import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Checkin;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Competitor;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Event;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Leaderboard;
import com.sap.sailing.android.tracking.app.provider.AnalyticsDatabase.Tables;
-import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.CheckinUri;
import com.sap.sailing.android.tracking.app.utils.AppPreferences;
-import java.util.Arrays;
-
public class AnalyticsProvider extends ContentProvider {
private static final String TAG = AnalyticsProvider.class.getName();
@@ -46,11 +46,15 @@ public class AnalyticsProvider extends ContentProvider {
private static final int CHECKIN_URI_ID = 501;
private static final int EVENT_LEADERBOARD_COMPETITOR_JOINED = 600;
+ private static final int EVENT_LEADERBOARD_MARK_JOINED = 601;
private static final int EVENT_GPS_FIXES_JOINED = 700;
private static final int LEADERBOARDS_EVENTS_JOINED = 800;
+ private static final int MARK = 900;
+ private static final int MARK_ID = 901;
+
private static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = AnalyticsContract.CONTENT_AUTHORITY;
@@ -71,11 +75,15 @@ public class AnalyticsProvider extends ContentProvider {
matcher.addURI(authority, "messages/#", MESSAGE_ID);
matcher.addURI(authority, "event_leaderboard_competitor_joined", EVENT_LEADERBOARD_COMPETITOR_JOINED);
+ matcher.addURI(authority, "event_leaderboard_mark_joined", EVENT_LEADERBOARD_MARK_JOINED);
matcher.addURI(authority, "event_gps_fix_joined", EVENT_GPS_FIXES_JOINED);
matcher.addURI(authority, "leaderboards_events_joined", LEADERBOARDS_EVENTS_JOINED);
+ matcher.addURI(authority, "marks", MARK);
+ matcher.addURI(authority, "marks/*", MARK_ID);
+
return matcher;
}
@@ -95,8 +103,8 @@ public class AnalyticsProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
if (BuildConfig.DEBUG && AppPreferences.getPrintDatabaseOperationDebugMessages()) {
- String message = "query: uri=" + uri + " projection=" + Arrays.toString(projection) + " selection=["
- + selection + "] args=" + Arrays.toString(selectionArgs) + " order=[" + sortOrder + "]";
+ String message = "query: uri=" + uri + " projection=" + Arrays.toString(projection) + " selection=[" + selection + "] args=" + Arrays
+ .toString(selectionArgs) + " order=[" + sortOrder + "]";
ExLog.i(getContext(), TAG, message);
}
@@ -106,58 +114,67 @@ public class AnalyticsProvider extends ContentProvider {
switch (sUriMatcher.match(uri)) {
- case EVENT_LEADERBOARD_COMPETITOR_JOINED:
- SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
- qb.setTables(Tables.EVENTS_JOIN_LEADERBOARDS_JOIN_COMPETITORS);
- cursor = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
- return cursor;
+ case EVENT_LEADERBOARD_MARK_JOINED:
+ SQLiteQueryBuilder mqb = new SQLiteQueryBuilder();
+ mqb.setTables(Tables.EVENTS_JOIN_LEADERBOARDS_JOIN_MARKS);
+ cursor = mqb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
+ return cursor;
+ case EVENT_LEADERBOARD_COMPETITOR_JOINED:
+ SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+ qb.setTables(Tables.EVENTS_JOIN_LEADERBOARDS_JOIN_COMPETITORS);
+ cursor = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
+ return cursor;
- case LEADERBOARDS_EVENTS_JOINED:
- SQLiteQueryBuilder el = new SQLiteQueryBuilder();
- el.setTables(Tables.LEADERBOARDS_JOIN_EVENTS);
- cursor = el.query(db, projection, selection, selectionArgs, null, null, sortOrder);
- return cursor;
+ case LEADERBOARDS_EVENTS_JOINED:
+ SQLiteQueryBuilder el = new SQLiteQueryBuilder();
+ el.setTables(Tables.LEADERBOARDS_JOIN_EVENTS);
+ cursor = el.query(db, projection, selection, selectionArgs, null, null, sortOrder);
+ return cursor;
- default:
- final SelectionBuilder builder = buildExpandedSelection(uri);
+ default:
+ final SelectionBuilder builder = buildExpandedSelection(uri);
- cursor = builder.where(selection, selectionArgs).query(db, false, projection, sortOrder, null);
+ cursor = builder.where(selection, selectionArgs).query(db, false, projection, sortOrder, null);
- Context context = getContext();
- if (context != null) {
- cursor.setNotificationUri(context.getContentResolver(), uri);
- }
+ Context context = getContext();
+ if (context != null) {
+ cursor.setNotificationUri(context.getContentResolver(), uri);
+ }
- return cursor;
+ return cursor;
}
}
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
- case COMPETITOR:
- return Competitor.CONTENT_TYPE;
+ case COMPETITOR:
+ return Competitor.CONTENT_TYPE;
- case COMPETITOR_ID:
- return Competitor.CONTENT_ITEM_TYPE;
+ case COMPETITOR_ID:
+ return Competitor.CONTENT_ITEM_TYPE;
- case EVENT:
- return Event.CONTENT_TYPE;
+ case EVENT:
+ return Event.CONTENT_TYPE;
- case EVENT_ID:
- return Event.CONTENT_ITEM_TYPE;
+ case EVENT_ID:
+ return Event.CONTENT_ITEM_TYPE;
- case LEADERBOARD:
- return Leaderboard.CONTENT_TYPE;
+ case LEADERBOARD:
+ return Leaderboard.CONTENT_TYPE;
- case LEADERBOARD_ID:
- return Leaderboard.CONTENT_ITEM_TYPE;
- case CHECKIN_URI:
- return CheckinUri.CONTENT_TYPE;
- case CHECKIN_URI_ID:
- return CheckinUri.CONTENT_ITEM_TYPE;
- default:
- throw new UnsupportedOperationException("Unknown uri: " + uri);
+ case LEADERBOARD_ID:
+ return Leaderboard.CONTENT_ITEM_TYPE;
+ case CHECKIN_URI:
+ return Checkin.CONTENT_TYPE;
+ case CHECKIN_URI_ID:
+ return Checkin.CONTENT_ITEM_TYPE;
+ case MARK:
+ return AnalyticsContract.Mark.CONTENT_TYPE;
+ case MARK_ID:
+ return AnalyticsContract.Mark.CONTENT_ITEM_TYPE;
+ default:
+ throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
@@ -171,34 +188,40 @@ public class AnalyticsProvider extends ContentProvider {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch (sUriMatcher.match(uri)) {
- case COMPETITOR:
- long competitorId = db.insertOrThrow(Tables.COMPETITORS, null, values);
- notifyChange(uri);
- return Competitor.buildCompetitorUri(String.valueOf(competitorId));
+ case COMPETITOR:
+ long competitorId = db.insertOrThrow(Tables.COMPETITORS, null, values);
+ notifyChange(uri);
+ return Competitor.buildCompetitorUri(String.valueOf(competitorId));
- case EVENT:
- long eventId = db.insertOrThrow(Tables.EVENTS, null, values);
- notifyChange(uri);
- return Event.buildEventUri(String.valueOf(eventId));
+ case EVENT:
+ long eventId = db.insertOrThrow(Tables.EVENTS, null, values);
+ notifyChange(uri);
+ return Event.buildEventUri(String.valueOf(eventId));
- case LEADERBOARD:
- long leaderboardId = db.insertOrThrow(Tables.LEADERBOARDS, null, values);
- notifyChange(uri);
- return Leaderboard.buildLeaderboardUri(String.valueOf(leaderboardId));
- case CHECKIN_URI:
- long checkinUriID = db.insertOrThrow(Tables.CHECKIN_URIS, null, values);
- notifyChange(uri);
- return CheckinUri.builCheckInUri(String.valueOf(checkinUriID));
- default:
- throw new UnsupportedOperationException("Unknown uri: " + uri);
+ case LEADERBOARD:
+ long leaderboardId = db.insertOrThrow(Tables.LEADERBOARDS, null, values);
+ notifyChange(uri);
+ return Leaderboard.buildLeaderboardUri(String.valueOf(leaderboardId));
+
+ case CHECKIN_URI:
+ long checkinUriID = db.insertOrThrow(Tables.CHECKIN_URIS, null, values);
+ notifyChange(uri);
+ return Checkin.builCheckInUri(String.valueOf(checkinUriID));
+
+ case MARK:
+ long markUriID = db.insertOrThrow(Tables.MARKS, null, values);
+ notifyChange(uri);
+ return AnalyticsContract.Mark.buildMarkUri(String.valueOf(markUriID));
+
+ default:
+ throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
if (BuildConfig.DEBUG && AppPreferences.getPrintDatabaseOperationDebugMessages()) {
- String message = "delete: uri=" + uri + " selection=[" + selection + "] args="
- + Arrays.toString(selectionArgs);
+ String message = "delete: uri=" + uri + " selection=[" + selection + "] args=" + Arrays.toString(selectionArgs);
ExLog.i(getContext(), TAG, message);
}
@@ -206,42 +229,47 @@ public class AnalyticsProvider extends ContentProvider {
switch (sUriMatcher.match(uri)) {
- case COMPETITOR:
- int numCompetitorRowsDeleted = db.delete(Tables.COMPETITORS, selection, selectionArgs);
- notifyChange(uri);
- return numCompetitorRowsDeleted;
+ case COMPETITOR:
+ int numCompetitorRowsDeleted = db.delete(Tables.COMPETITORS, selection, selectionArgs);
+ notifyChange(uri);
+ return numCompetitorRowsDeleted;
- case EVENT:
- int numEventRowsDeleted = db.delete(Tables.EVENTS, selection, selectionArgs);
- notifyChange(uri);
- return numEventRowsDeleted;
+ case EVENT:
+ int numEventRowsDeleted = db.delete(Tables.EVENTS, selection, selectionArgs);
+ notifyChange(uri);
+ return numEventRowsDeleted;
- case LEADERBOARD:
- int numLeaderboardRowsDeleted = db.delete(Tables.LEADERBOARDS, selection, selectionArgs);
- notifyChange(uri);
- return numLeaderboardRowsDeleted;
- case CHECKIN_URI:
- int numCheckinUriRowsDeleted = db.delete(Tables.CHECKIN_URIS, selection, selectionArgs);
- notifyChange(uri);
- return numCheckinUriRowsDeleted;
- default:
- throw new UnsupportedOperationException("Unknown uri: " + uri);
+ case LEADERBOARD:
+ int numLeaderboardRowsDeleted = db.delete(Tables.LEADERBOARDS, selection, selectionArgs);
+ notifyChange(uri);
+ return numLeaderboardRowsDeleted;
+ case CHECKIN_URI:
+ int numCheckinUriRowsDeleted = db.delete(Tables.CHECKIN_URIS, selection, selectionArgs);
+ notifyChange(uri);
+ return numCheckinUriRowsDeleted;
+ case MARK:
+ int numMarkRowsDeleted = db.delete(Tables.MARKS, selection, selectionArgs);
+ notifyChange(uri);
+ return numMarkRowsDeleted;
+ default:
+ throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
if (BuildConfig.DEBUG && AppPreferences.getPrintDatabaseOperationDebugMessages()) {
- String message = "update: uri=" + uri + " values=[" + values == null ? "null" : values.toString()
- + "] selection=[" + selection + "]" + " args=" + Arrays.toString(selectionArgs);
+ String message = "update: uri=" + uri + " values=[" + values == null ?
+ "null" :
+ values.toString() + "] selection=[" + selection + "]" + " args=" + Arrays.toString(selectionArgs);
ExLog.i(getContext(), TAG, message);
}
// final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch (sUriMatcher.match(uri)) {
- default:
- throw new UnsupportedOperationException("Unknown uri: " + uri);
+ default:
+ throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
@@ -253,34 +281,39 @@ public class AnalyticsProvider extends ContentProvider {
final SelectionBuilder builder = new SelectionBuilder(getContext());
switch (sUriMatcher.match(uri)) {
- case COMPETITOR:
- return builder.table(Tables.COMPETITORS);
+ case COMPETITOR:
+ return builder.table(Tables.COMPETITORS);
- case COMPETITOR_ID:
- final String competitor_id = Competitor.getCompetitorId(uri);
- return builder.table(Tables.COMPETITORS).where(Competitor.COMPETITOR_ID + " = ?", competitor_id);
+ case COMPETITOR_ID:
+ final String competitor_id = Competitor.getCompetitorId(uri);
+ return builder.table(Tables.COMPETITORS).where(Competitor.COMPETITOR_ID + " = ?", competitor_id);
- case LEADERBOARD:
- return builder.table(Tables.LEADERBOARDS);
+ case LEADERBOARD:
+ return builder.table(Tables.LEADERBOARDS);
- case LEADERBOARD_ID:
- final String leaderboard_id = Leaderboard.getLeaderboardId(uri);
- return builder.table(Tables.LEADERBOARDS).where(BaseColumns._ID + " = ?", leaderboard_id);
+ case LEADERBOARD_ID:
+ final String leaderboard_id = Leaderboard.getLeaderboardId(uri);
+ return builder.table(Tables.LEADERBOARDS).where(BaseColumns._ID + " = ?", leaderboard_id);
- case EVENT:
- return builder.table(Tables.EVENTS);
+ case EVENT:
+ return builder.table(Tables.EVENTS);
- case EVENT_ID:
- final String event_id = Event.getEventId(uri);
- return builder.table(Tables.EVENTS).where(Event.EVENT_ID + " = ?", event_id);
- case CHECKIN_URI:
- return builder.table(Tables.CHECKIN_URIS);
- case CHECKIN_URI_ID:
- final String checkinUriId = AnalyticsContract.CheckinUri.getCheckinUriId(uri);
- return builder.table(Tables.CHECKIN_URIS).where(BaseColumns._ID + " = ?", checkinUriId);
+ case EVENT_ID:
+ final String event_id = Event.getEventId(uri);
+ return builder.table(Tables.EVENTS).where(Event.EVENT_ID + " = ?", event_id);
+ case CHECKIN_URI:
+ return builder.table(Tables.CHECKIN_URIS);
+ case CHECKIN_URI_ID:
+ final String checkinUriId = Checkin.getCheckinUriId(uri);
+ return builder.table(Tables.CHECKIN_URIS).where(BaseColumns._ID + " = ?", checkinUriId);
+ case MARK:
+ return builder.table(Tables.MARKS);
+ case MARK_ID:
+ final String mark_id = AnalyticsContract.Mark.getMarkId(uri);
+ return builder.table(Tables.MARKS).where(BaseColumns._ID + " = ?", mark_id);
- default:
- throw new UnsupportedOperationException("Unknown uri: " + uri);
+ default:
+ throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/AboutActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/AboutActivity.java
index 54598595a68..c5d6710cd66 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/AboutActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/AboutActivity.java
@@ -1,5 +1,6 @@
package com.sap.sailing.android.tracking.app.ui.activities;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
@@ -19,14 +20,15 @@ public class AboutActivity extends BaseActivity {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
setSupportActionBar(toolbar);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
getSupportActionBar().setTitle(R.string.about_this_app);
}
replaceFragment(R.id.content_frame, AboutFragment.newInstance());
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/BuoyActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/BuoyActivity.java
new file mode 100644
index 00000000000..56a18e6c17a
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/BuoyActivity.java
@@ -0,0 +1,156 @@
+package com.sap.sailing.android.tracking.app.ui.activities;
+
+import org.json.JSONObject;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
+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.shared.data.LeaderboardInfo;
+import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.android.shared.ui.activities.AbstractBaseActivity;
+import com.sap.sailing.android.shared.util.NetworkHelper;
+import com.sap.sailing.android.tracking.app.R;
+import com.sap.sailing.android.tracking.app.ui.fragments.BuoyFragment;
+import com.sap.sailing.android.tracking.app.utils.AboutHelper;
+import com.sap.sailing.android.tracking.app.utils.AppPreferences;
+import com.sap.sailing.android.tracking.app.utils.CheckoutHelper;
+import com.sap.sailing.android.tracking.app.utils.DatabaseHelper;
+import com.sap.sailing.android.tracking.app.valueobjects.EventInfo;
+import com.sap.sailing.android.tracking.app.valueobjects.MarkInfo;
+
+public class BuoyActivity extends AbstractBaseActivity {
+
+ private static String TAG = BuoyActivity.class.getName();
+
+ private EventInfo event;
+ private MarkInfo mark;
+ private LeaderboardInfo leaderboard;
+ private String checkinDigest;
+
+ private AppPreferences prefs;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent intent = getIntent();
+ checkinDigest = intent.getStringExtra(getString(R.string.checkin_digest));
+
+ prefs = new AppPreferences(this);
+ mark = DatabaseHelper.getInstance().getMarkInfo(this, checkinDigest);
+ event = DatabaseHelper.getInstance().getEventInfo(this, checkinDigest);
+ leaderboard = DatabaseHelper.getInstance().getLeaderboard(this, checkinDigest);
+
+ setContentView(R.layout.fragment_container);
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ if (toolbar != null) {
+ setSupportActionBar(toolbar);
+ }
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setHomeButtonEnabled(true);
+ toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
+ getSupportActionBar().setTitle(leaderboard.name);
+ getSupportActionBar().setSubtitle(event.name);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
+ }
+ replaceFragment(R.id.content_frame, BuoyFragment.newInstance(mark.markName));
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if (prefs != null && prefs.getTrackerIsTracking()) {
+ String checkinDigest = prefs.getTrackerIsTrackingCheckinDigest();
+ startTrackingActivity(checkinDigest);
+ }
+ }
+
+ @Override
+ protected int getOptionsMenuResId() {
+ return 0;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.buoy_menu, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.options_menu_settings:
+ ExLog.i(this, TAG, "Clicked SETTINGS.");
+ startActivity(new Intent(this, SettingsActivity.class));
+ return true;
+ case R.id.options_menu_checkout:
+ ExLog.i(this, TAG, "Clicked CHECKOUT.");
+ displayCheckoutConfirmationDialog();
+ return true;
+ case R.id.options_menu_info:
+ AboutHelper.showInfoActivity(this);
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void startTrackingActivity(String checkinDigest) {
+ Intent intent = new Intent(this, TrackingActivity.class);
+ intent.putExtra(getString(R.string.tracking_activity_checkin_digest_parameter), checkinDigest);
+ startActivity(intent);
+ }
+
+ public void startTrackingActivity() {
+ Intent intent = new Intent(this, TrackingActivity.class);
+ intent.putExtra(getString(R.string.tracking_activity_checkin_digest_parameter), checkinDigest);
+ startActivity(intent);
+ }
+
+ private void displayCheckoutConfirmationDialog() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(R.string.warning);
+ builder.setMessage(R.string.checkout_warning_message);
+ builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ checkout();
+ }
+ });
+ builder.setNegativeButton(R.string.no, null);
+ builder.show();
+ }
+
+ /**
+ * Check out from regatta;
+ */
+ public void checkout() {
+ CheckoutHelper checkoutHelper = new CheckoutHelper();
+ checkoutHelper.checkoutMark(this, leaderboard.name, event.server, mark.markId, new NetworkHelper.NetworkHelperSuccessListener() {
+ @Override
+ public void performAction(JSONObject response) {
+ DatabaseHelper.getInstance().deleteRegattaFromDatabase(BuoyActivity.this, event.checkinDigest);
+ dismissProgressDialog();
+ finish();
+ }
+ }, new NetworkHelper.NetworkHelperFailureListener() {
+ @Override
+ public void performAction(NetworkHelper.NetworkHelperError e) {
+ dismissProgressDialog();
+ showErrorPopup(R.string.error,
+ R.string.error_could_not_complete_operation_on_server_try_again);
+ }
+ });
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LeaderboardWebViewActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LeaderboardWebViewActivity.java
index 7adfcd0e5c5..26fcc50eb88 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LeaderboardWebViewActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LeaderboardWebViewActivity.java
@@ -1,6 +1,7 @@
package com.sap.sailing.android.tracking.app.ui.activities;
import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
@@ -30,14 +31,16 @@ public class LeaderboardWebViewActivity extends BaseActivity {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
getSupportActionBar().setTitle(getString(R.string.title_activity_leaderboard));
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
}
replaceFragment(R.id.content_frame, new LeaderboardFragment());
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java
index 533eee2d5bf..3ebb26141c8 100755
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java
@@ -19,7 +19,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.net.Uri;
+import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
@@ -35,11 +35,10 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.data.CheckinUrlInfo;
import com.sap.sailing.android.shared.data.LeaderboardInfo;
import com.sap.sailing.android.shared.data.http.HttpGetRequest;
-import com.sap.sailing.android.shared.data.http.HttpJsonPostRequest;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.AbstractRegattaActivity;
import com.sap.sailing.android.shared.util.BitmapHelper;
@@ -47,7 +46,6 @@ 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.NetworkHelperFailureListener;
import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperSuccessListener;
-import com.sap.sailing.android.shared.util.UniqueDeviceUuid;
import com.sap.sailing.android.tracking.app.BuildConfig;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.ui.fragments.RegattaFragment;
@@ -57,8 +55,10 @@ import com.sap.sailing.android.tracking.app.upload.UploadTeamImageTask;
import com.sap.sailing.android.tracking.app.utils.AboutHelper;
import com.sap.sailing.android.tracking.app.utils.AppPreferences;
import com.sap.sailing.android.tracking.app.utils.CheckinManager;
+import com.sap.sailing.android.tracking.app.utils.CheckoutHelper;
import com.sap.sailing.android.tracking.app.utils.DatabaseHelper;
import com.sap.sailing.android.tracking.app.valueobjects.CheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.CompetitorCheckinData;
import com.sap.sailing.android.tracking.app.valueobjects.CompetitorInfo;
import com.sap.sailing.android.tracking.app.valueobjects.EventInfo;
@@ -104,15 +104,17 @@ public class RegattaActivity extends AbstractRegattaActivity
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
getSupportActionBar().setTitle(leaderboard.name);
getSupportActionBar().setSubtitle(event.name);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
}
RegattaFragment regattaFragment = new RegattaFragment();
regattaFragment.setFragmentWatcher(this);
@@ -410,19 +412,23 @@ public class RegattaActivity extends AbstractRegattaActivity
}
@Override
- public void onCheckinDataAvailable(AbstractCheckinData checkinData) {
+ public void onCheckinDataAvailable(BaseCheckinData checkinData) {
if (checkinData != null) {
CheckinData data = (CheckinData) checkinData;
try {
- DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, checkinDigest);
- DatabaseHelper.getInstance().storeCheckinRow(this, data.getEvent(), data.getCompetitor(), data.getLeaderboard(), data.getCheckinUrl());
- competitor = DatabaseHelper.getInstance().getCompetitor(this, checkinDigest);
- event = DatabaseHelper.getInstance().getEventInfo(this, checkinDigest);
- leaderboard = DatabaseHelper.getInstance().getLeaderboard(this, checkinDigest);
- checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest);
- RegattaFragment regattaFragment = new RegattaFragment();
- regattaFragment.setFragmentWatcher(this);
- replaceFragment(R.id.content_frame, regattaFragment);
+ if (data instanceof CompetitorCheckinData) {
+ CompetitorCheckinData competitorCheckinData = (CompetitorCheckinData) data;
+ DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, checkinDigest);
+ DatabaseHelper.getInstance().storeCompetitorCheckinRow(this, competitorCheckinData.getEvent(), competitorCheckinData.getCompetitor(),
+ competitorCheckinData.getLeaderboard(), competitorCheckinData.getCheckinUrl());
+ competitor = DatabaseHelper.getInstance().getCompetitor(this, checkinDigest);
+ event = DatabaseHelper.getInstance().getEventInfo(this, checkinDigest);
+ leaderboard = DatabaseHelper.getInstance().getLeaderboard(this, checkinDigest);
+ checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest);
+ RegattaFragment regattaFragment = new RegattaFragment();
+ regattaFragment.setFragmentWatcher(this);
+ replaceFragment(R.id.content_frame, regattaFragment);
+ }
} catch (DatabaseHelper.GeneralDatabaseHelperException e) {
ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage());
displayDatabaseError();
@@ -461,48 +467,23 @@ public class RegattaActivity extends AbstractRegattaActivity
* Check out from regatta;
*/
public void checkout() {
- final String checkoutURLStr = event.server
- + prefs.getServerCheckoutPath().replace("{leaderboard-name}", Uri.encode(leaderboard.name));
-
- showProgressDialog(R.string.please_wait, R.string.checking_out);
-
- JSONObject checkoutData = new JSONObject();
- try {
- checkoutData.put("competitorId", competitor.id);
- checkoutData.put("deviceUuid", UniqueDeviceUuid.getUniqueId(this));
- checkoutData.put("toMillis", System.currentTimeMillis());
- } catch (JSONException e) {
- showErrorPopup(R.string.error, R.string.error_could_not_complete_operation_on_server_try_again);
- ExLog.e(this, TAG, "Error populating checkout-data: " + e.getMessage());
- return;
- }
-
- try {
- HttpJsonPostRequest request = new HttpJsonPostRequest(this, new URL(checkoutURLStr), checkoutData.toString());
- NetworkHelper.getInstance(this).executeHttpJsonRequestAsync(request,
- new NetworkHelperSuccessListener() {
-
- @Override
- public void performAction(JSONObject response) {
- DatabaseHelper.getInstance().deleteRegattaFromDatabase(RegattaActivity.this,
- event.checkinDigest);
- deleteImageFile(getLeaderboardImageFileName(leaderboard.name));
- dismissProgressDialog();
- finish();
- }
- }, new NetworkHelperFailureListener() {
-
- @Override
- public void performAction(NetworkHelperError e) {
- dismissProgressDialog();
- showErrorPopup(R.string.error,
- R.string.error_could_not_complete_operation_on_server_try_again);
- }
- });
-
- } catch (MalformedURLException e) {
- ExLog.w(this, TAG, "Error, can't check out, MalformedURLException: " + e.getMessage());
- }
+ CheckoutHelper checkoutHelper = new CheckoutHelper();
+ checkoutHelper.checkoutCompetitor(this, leaderboard.name, event.server, competitor.id, new NetworkHelperSuccessListener() {
+ @Override
+ public void performAction(JSONObject response) {
+ DatabaseHelper.getInstance().deleteRegattaFromDatabase(RegattaActivity.this, event.checkinDigest);
+ deleteImageFile(getLeaderboardImageFileName(leaderboard.name));
+ dismissProgressDialog();
+ finish();
+ }
+ }, new NetworkHelperFailureListener() {
+ @Override
+ public void performAction(NetworkHelperError e) {
+ dismissProgressDialog();
+ showErrorPopup(R.string.error,
+ R.string.error_could_not_complete_operation_on_server_try_again);
+ }
+ });
}
@Override
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/SettingsActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/SettingsActivity.java
index 3b0228ee13c..53507f7ea5b 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/SettingsActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/SettingsActivity.java
@@ -1,10 +1,11 @@
package com.sap.sailing.android.tracking.app.ui.activities;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
import android.view.View;
+import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.ui.fragments.preference.GeneralPreferenceFragment;
@@ -15,9 +16,10 @@ public class SettingsActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.pref_with_actionbar);
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
+ toolbar.hideSubtitle();
toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
@@ -31,8 +33,11 @@ public class SettingsActivity extends AppCompatActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle(R.string.preferences);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
getFragmentManager().beginTransaction().replace(R.id.content_frame, new GeneralPreferenceFragment()).commit();
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java
index 72a8b780e39..99ae1ea2b1c 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java
@@ -3,12 +3,13 @@ package com.sap.sailing.android.tracking.app.ui.activities;
import java.util.List;
import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.util.EulaHelper;
@@ -19,6 +20,8 @@ import com.sap.sailing.android.tracking.app.utils.AppPreferences;
import com.sap.sailing.android.tracking.app.utils.CheckinManager;
import com.sap.sailing.android.tracking.app.utils.DatabaseHelper;
import com.sap.sailing.android.tracking.app.valueobjects.CheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.CompetitorCheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.MarkCheckinData;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
public class StartActivity extends AbstractStartActivity {
@@ -34,6 +37,10 @@ public class StartActivity extends AbstractStartActivity {
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(getString(R.string.title_activity_start));
getSupportActionBar().setHomeButtonEnabled(false);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
replaceFragment(R.id.content_frame, new HomeFragment());
refreshDatabase();
@@ -49,6 +56,7 @@ public class StartActivity extends AbstractStartActivity {
if (prefs.getTrackerIsTracking()) {
String checkinDigest = prefs.getTrackerIsTrackingCheckinDigest();
+ // TODO: Type in preferences write / read
startRegatta(checkinDigest);
}
}
@@ -60,6 +68,7 @@ public class StartActivity extends AbstractStartActivity {
}
private void startRegatta(String checkinDigest) {
+ // TODO: Check which activity to be called
Intent intent = new Intent(this, RegattaActivity.class);
intent.putExtra(getString(R.string.checkin_digest), checkinDigest);
startActivity(intent);
@@ -93,7 +102,7 @@ public class StartActivity extends AbstractStartActivity {
}
@Override
- public void onCheckinDataAvailable(AbstractCheckinData data) {
+ public void onCheckinDataAvailable(BaseCheckinData data) {
if (data != null && data instanceof CheckinData) {
CheckinData checkinData = (CheckinData) data;
if (!checkinData.isUpdate()) {
@@ -104,16 +113,29 @@ public class StartActivity extends AbstractStartActivity {
}
}
- private void updateRegatta(AbstractCheckinData data) {
- if (data instanceof CheckinData)
- {
+ private void updateRegatta(BaseCheckinData data) {
+ if (data instanceof CheckinData) {
CheckinData checkinData = (CheckinData) data;
- try {
- DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, checkinData.getCheckinUrl().checkinDigest);
- DatabaseHelper.getInstance().storeCheckinRow(this, checkinData.getEvent(), checkinData.getCompetitor(), checkinData.getLeaderboard(), checkinData.getCheckinUrl());
- } catch (DatabaseHelper.GeneralDatabaseHelperException e) {
- ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage());
- displayDatabaseError();
+ if (checkinData instanceof CompetitorCheckinData) {
+ CompetitorCheckinData competitorCheckinData = (CompetitorCheckinData) checkinData;
+ try {
+ DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, checkinData.getCheckinUrl().checkinDigest);
+ DatabaseHelper.getInstance()
+ .storeCompetitorCheckinRow(this, checkinData.getEvent(), competitorCheckinData.getCompetitor(), checkinData.getLeaderboard(), checkinData.getCheckinUrl());
+ } catch (DatabaseHelper.GeneralDatabaseHelperException e) {
+ ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage());
+ displayDatabaseError();
+ }
+ } else if (checkinData instanceof MarkCheckinData) {
+ MarkCheckinData markCheckinData = (MarkCheckinData) checkinData;
+ try {
+ DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, checkinData.getCheckinUrl().checkinDigest);
+ DatabaseHelper.getInstance()
+ .storeMarkCheckinRow(this, checkinData.getEvent(), markCheckinData.getMark(), checkinData.getLeaderboard(), checkinData.getCheckinUrl());
+ } catch (DatabaseHelper.GeneralDatabaseHelperException e) {
+ ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage());
+ displayDatabaseError();
+ }
}
}
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/TrackingActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/TrackingActivity.java
index bb9c8de4c3b..870b61b6ba3 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/TrackingActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/TrackingActivity.java
@@ -6,6 +6,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.graphics.drawable.ColorDrawable;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
@@ -19,6 +20,7 @@ import android.view.View;
import android.widget.Button;
import android.widget.TextView;
+import com.sap.sailing.android.shared.data.LeaderboardInfo;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.services.sending.MessageSendingService;
import com.sap.sailing.android.shared.services.sending.MessageSendingService.APIConnectivity;
@@ -100,15 +102,18 @@ public class TrackingActivity extends BaseActivity implements GPSQualityListener
}
if (getSupportActionBar() != null) {
- EventInfo eventInfo = DatabaseHelper.getInstance().getEventInfoWithLeaderboardAndCompetitor(this, checkinDigest);
+ EventInfo eventInfo = DatabaseHelper.getInstance().getEventInfo(this, checkinDigest);
+ LeaderboardInfo leaderboardInfo = DatabaseHelper.getInstance().getLeaderboard(this, checkinDigest);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
- getSupportActionBar().setTitle(eventInfo.leaderboardName);
+ getSupportActionBar().setTitle(leaderboardInfo.name);
getSupportActionBar().setSubtitle(getString(R.string.tracking_colon) + " " + eventInfo.name);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
if (toolbar != null) {
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/AboutFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/AboutFragment.java
index e4d95177fbd..10ff09a28db 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/AboutFragment.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/AboutFragment.java
@@ -13,7 +13,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.sap.sailing.android.shared.ui.customviews.OpenSansTextView;
import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.shared.util.LicenseHelper;
@@ -48,7 +47,7 @@ public class AboutFragment extends com.sap.sailing.android.ui.fragments.BaseFrag
EulaHelper.with(getActivity()).openEulaPage();
}
});
- OpenSansTextView versionTextView = (OpenSansTextView) view.findViewById(R.id.system_information_application_version);
+ TextView versionTextView = (TextView) view.findViewById(R.id.system_information_application_version);
versionTextView.setText(AppUtils.with(getActivity()).getBuildInfo());
return view;
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/BuoyFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/BuoyFragment.java
new file mode 100644
index 00000000000..f9b15afbb3f
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/BuoyFragment.java
@@ -0,0 +1,48 @@
+package com.sap.sailing.android.tracking.app.ui.fragments;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.sap.sailing.android.shared.util.LocationHelper;
+import com.sap.sailing.android.shared.util.ViewHelper;
+import com.sap.sailing.android.tracking.app.R;
+import com.sap.sailing.android.tracking.app.ui.activities.BuoyActivity;
+
+public class BuoyFragment extends BaseFragment {
+
+ private static String EXTRA_MARK_NAME = "mark_name";
+
+ public static BuoyFragment newInstance(String markName) {
+ BuoyFragment fragment = new BuoyFragment();
+ Bundle args = new Bundle();
+ args.putString(EXTRA_MARK_NAME, markName);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @SuppressLint("InflateParams")
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_buoy, container, false);
+ TextView markNameText = ViewHelper.get(view, R.id.buoy_Name);
+ markNameText.setText(getArguments().getString(EXTRA_MARK_NAME));
+ Button startTrackingButton = ViewHelper.get(view, R.id.start_tracking);
+ startTrackingButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (LocationHelper.isGPSEnabled(getActivity())) {
+ BuoyActivity buoyActivity = (BuoyActivity) getActivity();
+ buoyActivity.startTrackingActivity();
+ } else {
+ LocationHelper.showNoGPSError(getActivity(), getString(R.string.enable_gps));
+ }
+ }
+ });
+ return view;
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java
index 15425a241cc..d5cfb662be9 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java
@@ -4,7 +4,6 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
-import android.widget.AdapterView;
import org.json.JSONException;
import org.json.JSONObject;
@@ -21,12 +20,15 @@ import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.Toast;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
+import com.sap.sailing.android.shared.data.CheckinUrlInfo;
+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;
@@ -37,14 +39,21 @@ import com.sap.sailing.android.tracking.app.BuildConfig;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.adapter.RegattaAdapter;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract;
+import com.sap.sailing.android.tracking.app.ui.activities.BuoyActivity;
import com.sap.sailing.android.tracking.app.ui.activities.RegattaActivity;
import com.sap.sailing.android.tracking.app.ui.activities.StartActivity;
import com.sap.sailing.android.tracking.app.utils.AppPreferences;
import com.sap.sailing.android.tracking.app.utils.CheckinHelper;
import com.sap.sailing.android.tracking.app.utils.CheckinManager;
+import com.sap.sailing.android.tracking.app.utils.CheckoutHelper;
import com.sap.sailing.android.tracking.app.utils.DatabaseHelper;
import com.sap.sailing.android.tracking.app.utils.DatabaseHelper.GeneralDatabaseHelperException;
import com.sap.sailing.android.tracking.app.valueobjects.CheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.CompetitorCheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.CompetitorInfo;
+import com.sap.sailing.android.tracking.app.valueobjects.EventInfo;
+import com.sap.sailing.android.tracking.app.valueobjects.MarkCheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.MarkInfo;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
public class HomeFragment extends AbstractHomeFragment implements LoaderCallbacks {
@@ -86,18 +95,21 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
/**
* Perform a checkin request and launch RegattaAcitivity afterwards
- *
- * TODO: Google Cloud Messaging token?
- *
- * @param deviceMappingData
*/
private void checkInWithAPIAndDisplayTrackingActivity(CheckinData checkinData) {
- if (DatabaseHelper.getInstance().eventLeaderboardCompetitorCombinationAvailable(getActivity(),
- checkinData.checkinDigest)) {
- try {
- DatabaseHelper.getInstance().storeCheckinRow(getActivity(), checkinData.getEvent(),
- checkinData.getCompetitor(), checkinData.getLeaderboard(), checkinData.getCheckinUrl());
+ if (checkinData instanceof CompetitorCheckinData) {
+ storeCompetitorCheckinData((CompetitorCheckinData) checkinData);
+ } else if (checkinData instanceof MarkCheckinData) {
+ storeMarkCheckinData((MarkCheckinData) checkinData);
+ }
+ performAPICheckin(checkinData);
+ }
+ private void storeCompetitorCheckinData(CompetitorCheckinData checkinData) {
+ if (DatabaseHelper.getInstance().eventLeaderboardCompetitorCombinationAvailable(getActivity(), checkinData.checkinDigest)) {
+ try {
+ DatabaseHelper.getInstance().storeCompetitorCheckinRow(getActivity(), checkinData.getEvent(), checkinData.getCompetitor(), checkinData
+ .getLeaderboard(), checkinData.getCheckinUrl());
adapter.notifyDataSetChanged();
} catch (GeneralDatabaseHelperException e) {
ExLog.e(getActivity(), TAG, "Batch insert failed: " + e.getMessage());
@@ -110,10 +122,29 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
}
} else {
ExLog.w(getActivity(), TAG, "Combination of eventId, leaderboardName and competitorId already exists!");
- Toast.makeText(getActivity(), getString(R.string.info_already_checked_in_this_qr_code), Toast.LENGTH_LONG)
- .show();
+ Toast.makeText(getActivity(), getString(R.string.info_already_checked_in_this_qr_code), Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private void storeMarkCheckinData(MarkCheckinData checkinData) {
+ if (DatabaseHelper.getInstance().eventLeaderboardMarkCombinationAvailable(getActivity(), checkinData.checkinDigest)) {
+ try {
+ DatabaseHelper.getInstance().storeMarkCheckinRow(getActivity(), checkinData.getEvent(), checkinData.getMark(), checkinData
+ .getLeaderboard(), checkinData.getCheckinUrl());
+ adapter.notifyDataSetChanged();
+ } catch (GeneralDatabaseHelperException e) {
+ ExLog.e(getActivity(), TAG, "Batch insert failed: " + e.getMessage());
+ ((StartActivity) getActivity()).displayDatabaseError();
+ return;
+ }
+
+ if (BuildConfig.DEBUG) {
+ ExLog.i(getActivity(), TAG, "Batch-insert of checkinData completed.");
+ }
+ } else {
+ ExLog.w(getActivity(), TAG, "Combination of eventId, leaderboardName and markID already exists!");
+ Toast.makeText(getActivity(), getString(R.string.info_already_checked_in_this_qr_code), Toast.LENGTH_LONG).show();
}
- performAPICheckin(checkinData);
}
/**
@@ -126,14 +157,22 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
StartActivity startActivity = (StartActivity) getActivity();
startActivity.showProgressDialog(R.string.please_wait, R.string.checking_in);
try {
- JSONObject requestObject = CheckinHelper.getCheckinJson(checkinData.competitorId, checkinData.deviceUid,
- "TODO push device ID!!", date.getTime());
- HttpJsonPostRequest request = new HttpJsonPostRequest(getActivity(), new URL(checkinData.checkinURL),
- requestObject.toString());
+ JSONObject requestObject = null;
+ if (checkinData instanceof CompetitorCheckinData) {
+ CompetitorCheckinData competitorCheckinData = (CompetitorCheckinData) checkinData;
+ requestObject = CheckinHelper
+ .getCompetitorCheckinJson(competitorCheckinData.competitorId, competitorCheckinData.deviceUid, "TODO push device ID!!", date
+ .getTime());
+ } else if (checkinData instanceof MarkCheckinData) {
+ MarkCheckinData markCheckinData = (MarkCheckinData) checkinData;
+ requestObject = CheckinHelper
+ .getMarkCheckinJson(markCheckinData.getMark().getId().toString(), markCheckinData.deviceUid, "TODO push device ID!!", date
+ .getTime());
+ }
+ HttpJsonPostRequest request = new HttpJsonPostRequest(getActivity(), new URL(checkinData.checkinURL), requestObject.toString());
NetworkHelper.getInstance(getActivity())
- .executeHttpJsonRequestAsync(request, new CheckinListener(checkinData.checkinDigest),
- new CheckinErrorListener(checkinData.checkinDigest));
- } catch (JSONException e) {
+ .executeHttpJsonRequestAsync(request, new CheckinListener(checkinData.checkinDigest, checkinData.getCheckinType()), new CheckinErrorListener(checkinData.checkinDigest));
+ } catch (JSONException|NullPointerException e) {
ExLog.e(getActivity(), TAG, "Failed to generate checkin JSON: " + e.getMessage());
displayAPIErrorRecommendRetry();
} catch (MalformedURLException e) {
@@ -151,35 +190,37 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
/**
* Display a confirmation-dialog in which the user confirms his full name and sail-id.
- *
- * @param checkinData
*/
@Override
- public void displayUserConfirmationScreen(final AbstractCheckinData data) {
- final CheckinData checkinData = (CheckinData) data;
- String message1 = getString(R.string.confirm_data_hello_name)
- .replace("{full_name}", checkinData.competitorName);
- String message2 = getString(R.string.confirm_data_you_are_signed_in_as_sail_id).replace("{sail_id}",
- checkinData.competitorSailId);
+ public void displayUserConfirmationScreen(final BaseCheckinData data) {
+ if (data instanceof CompetitorCheckinData) {
+ final CompetitorCheckinData checkinData = (CompetitorCheckinData) data;
+ String message1 = getString(R.string.confirm_data_hello_name).replace("{full_name}", checkinData.competitorName);
+ String message2 = getString(R.string.confirm_data_you_are_signed_in_as_sail_id).replace("{sail_id}", checkinData.competitorSailId);
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setMessage(message1 + "\n\n" + message2);
- builder.setCancelable(true);
- builder.setPositiveButton(getString(R.string.confirm_data_is_correct), new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- clearScannedQRCodeInPrefs();
- checkInWithAPIAndDisplayTrackingActivity(checkinData);
- }
- }).setNegativeButton(R.string.decline_data_is_incorrect, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- clearScannedQRCodeInPrefs();
- dialog.cancel();
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setMessage(message1 + "\n\n" + message2);
+ builder.setCancelable(true);
+ builder.setPositiveButton(getString(R.string.confirm_data_is_correct), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ clearScannedQRCodeInPrefs();
+ checkInWithAPIAndDisplayTrackingActivity(checkinData);
+ }
+ }).setNegativeButton(R.string.decline_data_is_incorrect, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ clearScannedQRCodeInPrefs();
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ } else if (data instanceof MarkCheckinData) {
+ MarkCheckinData checkinData = (MarkCheckinData) data;
+ clearScannedQRCodeInPrefs();
+ checkInWithAPIAndDisplayTrackingActivity(checkinData);
+ }
}
/**
@@ -187,8 +228,13 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
*
* @param checkinDigest
*/
- private void startRegatta(String checkinDigest) {
- Intent intent = new Intent(getActivity(), RegattaActivity.class);
+ private void startRegatta(String checkinDigest, int type) {
+ Intent intent = new Intent();
+ if (type == CheckinUrlInfo.TYPE_COMPETITOR) {
+ intent.setClass(getActivity(), RegattaActivity.class);
+ } else if (type == CheckinUrlInfo.TYPE_MARK) {
+ intent.setClass(getActivity(), BuoyActivity.class);
+ }
intent.putExtra(getString(R.string.checkin_digest), checkinDigest);
getActivity().startActivity(intent);
}
@@ -196,47 +242,49 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
@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);
+ case REGATTA_LOADER:
+ String[] projection = new String[] { AnalyticsContract.PATH_EVENT + "." + AnalyticsContract.Event.EVENT_CHECKIN_DIGEST,
+ AnalyticsContract.PATH_EVENT + "." + AnalyticsContract.Event._ID,
+ AnalyticsContract.PATH_EVENT + "." + AnalyticsContract.Event.EVENT_NAME,
+ AnalyticsContract.PATH_EVENT + "." + AnalyticsContract.Event.EVENT_SERVER,
+ AnalyticsContract.PATH_LEADERBOARD + "." + AnalyticsContract.Leaderboard.LEADERBOARD_NAME,
+ AnalyticsContract.PATH_CHECKIN + "." + AnalyticsContract.Checkin.CHECKIN_TYPE};
+ return new CursorLoader(getActivity(), AnalyticsContract.LeaderboardsEventsJoined.CONTENT_URI, projection, null, null, null);
- default:
- return null;
+ default:
+ return null;
}
}
@Override
public void onLoadFinished(Loader loader, Cursor cursor) {
switch (loader.getId()) {
- case REGATTA_LOADER:
- adapter.changeCursor(cursor);
- break;
+ case REGATTA_LOADER:
+ adapter.changeCursor(cursor);
+ break;
- default:
- break;
+ default:
+ break;
}
}
@Override
public void onLoaderReset(Loader loader) {
switch (loader.getId()) {
- case REGATTA_LOADER:
- adapter.changeCursor(null);
- break;
+ case REGATTA_LOADER:
+ adapter.changeCursor(null);
+ break;
- default:
- break;
+ default:
+ break;
}
}
private boolean showDeleteConfirmationDialog(int position) {
// -1, because there's a header row
Cursor cursor = (Cursor) adapter.getItem(position - 1);
- final String checkinDigest = cursor.getString(cursor.getColumnIndex("event_checkin_digest"));
+ final String checkinDigest = cursor.getString(cursor.getColumnIndex(AnalyticsContract.Event.EVENT_CHECKIN_DIGEST));
+ final int type = cursor.getInt(cursor.getColumnIndex(AnalyticsContract.Checkin.CHECKIN_TYPE));
DatabaseHelper.getInstance().getEventInfo(getActivity(), checkinDigest);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Base_Theme_AppCompat_Dialog_Alert);
builder.setMessage(getString(R.string.confirm_delete_checkin));
@@ -245,7 +293,7 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
builder.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- deleteRegatta(checkinDigest);
+ deleteRegatta(checkinDigest, type);
}
});
builder.show();
@@ -253,10 +301,38 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
return true;
}
- private void deleteRegatta(String checkinDigest) {
- DatabaseHelper.getInstance().deleteRegattaFromDatabase(getActivity(), checkinDigest);
- adapter.swapCursor(null);
- adapter.notifyDataSetInvalidated();
+ private void deleteRegatta(final String checkinDigest, final int type) {
+ NetworkHelperSuccessListener successListener = new NetworkHelperSuccessListener() {
+ @Override
+ public void performAction(JSONObject response) {
+ StartActivity startActivity = (StartActivity) getActivity();
+ startActivity.dismissProgressDialog();
+ DatabaseHelper.getInstance().deleteRegattaFromDatabase(getActivity(), checkinDigest);
+ adapter.swapCursor(null);
+ adapter.notifyDataSetInvalidated();
+ }
+ };
+ NetworkHelperFailureListener failureListener = new NetworkHelperFailureListener() {
+ @Override
+ public void performAction(NetworkHelperError e) {
+ StartActivity startActivity = (StartActivity) getActivity();
+ startActivity.dismissProgressDialog();
+ startActivity.showErrorPopup(R.string.error,
+ R.string.error_could_not_complete_operation_on_server_try_again);
+ }
+ };
+ CheckoutHelper checkoutHelper = new CheckoutHelper();
+ LeaderboardInfo leaderboardInfo = DatabaseHelper.getInstance().getLeaderboard(getActivity(), checkinDigest);
+ EventInfo eventInfo = DatabaseHelper.getInstance().getEventInfo(getActivity(), checkinDigest);
+ if (type == CheckinUrlInfo.TYPE_COMPETITOR) {
+ CompetitorInfo competitorInfo = DatabaseHelper.getInstance().getCompetitor(getActivity(), checkinDigest);
+ checkoutHelper.checkoutCompetitor((StartActivity) getActivity(), leaderboardInfo.name, eventInfo.server, competitorInfo.id,
+ successListener, failureListener);
+ } else if (type == CheckinUrlInfo.TYPE_MARK) {
+ MarkInfo markInfo = DatabaseHelper.getInstance().getMarkInfo(getActivity(), checkinDigest);
+ checkoutHelper.checkoutMark((StartActivity) getActivity(), leaderboardInfo.name, eventInfo.server, markInfo.markId,
+ successListener, failureListener);
+ }
}
private class ItemClickListener implements OnItemClickListener {
@@ -272,8 +348,9 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
// -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);
+ String checkinDigest = cursor.getString(cursor.getColumnIndex(AnalyticsContract.Event.EVENT_CHECKIN_DIGEST));
+ int type = cursor.getInt(cursor.getColumnIndex(AnalyticsContract.Checkin.CHECKIN_TYPE));
+ startRegatta(checkinDigest, type);
}
}
@@ -293,16 +370,18 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
private class CheckinListener implements NetworkHelperSuccessListener {
public String checkinDigest;
+ public int type;
- public CheckinListener(String checkinDigest) {
+ public CheckinListener(String checkinDigest, int type) {
this.checkinDigest = checkinDigest;
+ this.type = type;
}
@Override
public void performAction(JSONObject response) {
StartActivity startActivity = (StartActivity) getActivity();
startActivity.dismissProgressDialog();
- startRegatta(checkinDigest);
+ startRegatta(checkinDigest, type);
}
}
@@ -324,12 +403,10 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
StartActivity startActivity = (StartActivity) getActivity();
startActivity.dismissProgressDialog();
- startActivity.showErrorPopup(R.string.error,
- R.string.error_could_not_complete_operation_on_server_try_again);
+ startActivity.showErrorPopup(R.string.error, R.string.error_could_not_complete_operation_on_server_try_again);
DatabaseHelper.getInstance().deleteRegattaFromDatabase(getActivity(), checkinDigest);
- Toast.makeText(getActivity(), getString(R.string.error_while_receiving_server_data), Toast.LENGTH_LONG)
- .show();
+ Toast.makeText(getActivity(), getString(R.string.error_while_receiving_server_data), Toast.LENGTH_LONG).show();
}
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/RegattaFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/RegattaFragment.java
index 1e9f4c7e442..b716a263265 100755
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/RegattaFragment.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/RegattaFragment.java
@@ -11,7 +11,6 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
@@ -77,8 +76,6 @@ public class RegattaFragment extends BaseFragment implements OnClickListener {
TextView addPhotoText = (TextView) view.findViewById(R.id.add_photo_text);
addPhotoText.setOnClickListener(this);
- setLeaderboardImageHeight(view);
-
return view;
}
@@ -93,17 +90,6 @@ public class RegattaFragment extends BaseFragment implements OnClickListener {
}
}
- private void setLeaderboardImageHeight(View view){
- if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
- RelativeLayout imageLayout = (RelativeLayout) view.findViewById(R.id.image);
- ViewGroup.LayoutParams layoutParams = imageLayout.getLayoutParams();
- int displayHeight = getResources().getDisplayMetrics().heightPixels;
- // calculate 1/3 of display height
- layoutParams.height = displayHeight / 3;
- imageLayout.setLayoutParams(layoutParams);
- }
- }
-
/**
* If the regatta started, don't display the countdown any more.
*/
@@ -117,13 +103,21 @@ public class RegattaFragment extends BaseFragment implements OnClickListener {
if (System.currentTimeMillis() > regattaStart) {
textView.setText(getString(R.string.regatta_in_progress));
- threeBoxesLayout.setVisibility(View.INVISIBLE);
+ threeBoxesLayout.setVisibility(View.GONE);
+ centerViewInParent(textView);
} else {
textView.setText(getString(R.string.regatta_starts_in));
threeBoxesLayout.setVisibility(View.VISIBLE);
}
}
+ private void centerViewInParent(View view) {
+ RelativeLayout.LayoutParams layoutParams =
+ (RelativeLayout.LayoutParams) view.getLayoutParams();
+ layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
+ view.setLayoutParams(layoutParams);
+ }
+
public boolean isShowingBigCheckoutButton() {
return showingThankYouNote;
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java
index b7fcab8fe3a..c832b8825d6 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java
@@ -117,7 +117,7 @@ public class TrackingFragment extends BaseFragment {
textView.setTextColor(getResources().getColor(R.color.sap_red));
} else {
textView.setText(getString(R.string.tracking_status_tracking));
- textView.setTextColor(getResources().getColor(R.color.sap_green));
+ textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
}
}
}
@@ -137,21 +137,21 @@ public class TrackingFragment extends BaseFragment {
if (apiConnectivity == APIConnectivity.transmissionSuccess) {
if (prefs.getEnergySavingEnabledByUser()) {
textView.setText(getString(R.string.tracking_mode_battery_saving));
- textView.setTextColor(getResources().getColor(R.color.sap_yellow));
+ textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
} else {
textView.setText(getString(R.string.tracking_mode_live));
- textView.setTextColor(getResources().getColor(R.color.sap_green));
+ textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
}
} else if (apiConnectivity == APIConnectivity.noAttempt) {
textView.setText(getString(R.string.tracking_mode_offline));
- textView.setTextColor(getResources().getColor(R.color.sap_green));
+ textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
} else if (apiConnectivity == APIConnectivity.transmissionError) {
textView.setText(getString(R.string.tracking_mode_api_error));
textView.setTextColor(getResources().getColor(R.color.sap_red));
} else {
textView.setText(getString(R.string.tracking_mode_caching));
- textView.setTextColor(getResources().getColor(R.color.sap_green));
+ textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
}
}
});
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingTimeFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingTimeFragment.java
index e21e2d93809..86db635153a 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingTimeFragment.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingTimeFragment.java
@@ -6,21 +6,32 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import com.sap.sailing.android.shared.util.LocationHelper;
import com.sap.sailing.android.tracking.app.R;
public class TrackingTimeFragment extends BaseFragment {
private final static String SIS_TRACKING_TIMER = "savedInstanceTrackingTimer";
private TextView timerView;
+ private TextView noGPSView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
ViewGroup view = (ViewGroup) inflater.inflate(R.layout.fragment_time, container, false);
timerView = (TextView) view.findViewById(R.id.tracking_time_label);
+ noGPSView = (TextView) view.findViewById(R.id.wait_for_gps);
return view;
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (LocationHelper.isGPSEnabled(getActivity())) {
+ noGPSView.setVisibility(View.GONE);
+ }
+ }
+
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java
index fd6338a7357..9131438e7ae 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java
@@ -19,7 +19,7 @@ public class GeneralPreferenceFragment extends BasePreferenceFragment {
AppPreferences prefs = new AppPreferences(getActivity());
String currentDeviceId = prefs.getDeviceIdentifier();
- Preference deviceIdPreference = (Preference) findPreference(getString(R.string.preference_device_identifier_key));
+ Preference deviceIdPreference = findPreference(getString(R.string.preference_device_identifier_key));
if (currentDeviceId != null && currentDeviceId.length() > 0) {
deviceIdPreference.setSummary(currentDeviceId);
@@ -35,8 +35,8 @@ public class GeneralPreferenceFragment extends BasePreferenceFragment {
public void onPause() {
super.onPause();
- SwitchPreference prefEnergy = (SwitchPreference) findPreference(R.string.preference_energy_saving_enabled_key);
- SwitchPreference prefDeclination = (SwitchPreference) findPreference(R.string.preference_heading_with_declination_subtracted_key);
+ SwitchPreference prefEnergy = findPreference(R.string.preference_energy_saving_enabled_key);
+ SwitchPreference prefDeclination = findPreference(R.string.preference_heading_with_declination_subtracted_key);
AppPreferences prefs = new AppPreferences(getActivity());
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
index 389a5eebb55..db91bb8eced 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
@@ -1,15 +1,14 @@
package com.sap.sailing.android.tracking.app.utils;
-import android.content.Context;
-import android.content.SharedPreferences;
-
-import com.sap.sailing.android.shared.util.PrefUtils;
-import com.sap.sailing.android.tracking.app.R;
-
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
+import android.content.Context;
+import android.content.SharedPreferences;
+
import com.sap.sailing.android.shared.util.BaseAppPreferences;
+import com.sap.sailing.android.shared.util.PrefUtils;
+import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl;
@@ -68,6 +67,11 @@ public class AppPreferences extends BaseAppPreferences {
competitorId);
}
+ public String getServerMarkPath(String leaderboardName, String markId) {
+ String path = context.getString(R.string.preferece_server_mark_path);
+ return path.replace("{leaderboardName}", leaderboardName).replace("{markId}", markId);
+ }
+
public int getGPSFixInterval() {
// EditTextPreference saves value as string, even if android:inputType="number" is set
String value = PrefUtils.getString(context, R.string.preference_gps_fix_interval_ms_key,
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinHelper.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinHelper.java
index c7097feafd2..43a0d7aa3f3 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinHelper.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinHelper.java
@@ -3,18 +3,32 @@ package com.sap.sailing.android.tracking.app.utils;
import org.json.JSONException;
import org.json.JSONObject;
+import android.support.annotation.NonNull;
+
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
public class CheckinHelper {
- public static JSONObject getCheckinJson(String competitorId, String deviceUuid, String pushDeviceId, long fromMillis)
+ public static JSONObject getCompetitorCheckinJson(String competitorId, String deviceUuid, String pushDeviceId, long fromMillis)
throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitorId);
- // TODO alternatively map device to a mark, providing a mark_id; see also LeaderboardsResource.postCheckin
+ return getBaseCheckinJsom(deviceUuid, pushDeviceId, fromMillis, jsonObject);
+ }
+
+ @NonNull
+ private static JSONObject getBaseCheckinJsom(String deviceUuid, String pushDeviceId, long fromMillis, JSONObject jsonObject)
+ throws JSONException {
jsonObject.put(DeviceMappingConstants.JSON_DEVICE_TYPE, "android");
jsonObject.put(DeviceMappingConstants.JSON_DEVICE_UUID, deviceUuid);
jsonObject.put(DeviceMappingConstants.JSON_PUSH_DEVICE_ID, pushDeviceId);
jsonObject.put(DeviceMappingConstants.JSON_FROM_MILLIS, fromMillis);
return jsonObject;
}
+
+ public static JSONObject getMarkCheckinJson(String markId, String deviceUuid, String pushDeviceId, long fromMillis)
+ throws JSONException {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put(DeviceMappingConstants.JSON_MARK_ID_AS_STRING, markId);
+ return getBaseCheckinJsom(deviceUuid, pushDeviceId, fromMillis, jsonObject);
+ }
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinManager.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinManager.java
index 385e722c20c..a432d26e845 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinManager.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckinManager.java
@@ -5,6 +5,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.NoSuchAlgorithmException;
+import java.util.Set;
import java.util.UUID;
import org.json.JSONException;
@@ -17,24 +18,31 @@ import android.content.DialogInterface;
import android.net.Uri;
import android.widget.Toast;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
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.JsonHelper;
import com.sap.sailing.android.shared.util.NetworkHelper;
import com.sap.sailing.android.shared.util.UniqueDeviceUuid;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.valueobjects.CheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.CompetitorCheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.CompetitorUrlData;
+import com.sap.sailing.android.tracking.app.valueobjects.MarkCheckinData;
+import com.sap.sailing.android.tracking.app.valueobjects.MarkUrlData;
+import com.sap.sailing.android.tracking.app.valueobjects.UrlData;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.base.EventBase;
+import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.impl.SharedDomainFactoryImpl;
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants;
-import com.sap.sailing.domain.racelogtracking.DeviceIdentifier;
import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
+import com.sap.sailing.server.gateway.deserialization.coursedata.impl.MarkDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CourseAreaJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.EventBaseJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.LeaderboardGroupBaseJsonDeserializer;
@@ -45,7 +53,7 @@ import com.sap.sse.shared.media.ImageDescriptor;
public class CheckinManager {
private final static String TAG = CheckinManager.class.getName();
- private AbstractCheckinData checkinData;
+ private BaseCheckinData checkinData;
private CheckinDataActivity activity;
private AppPreferences prefs;
private String url;
@@ -62,7 +70,7 @@ public class CheckinManager {
Uri uri = Uri.parse(url);
String scheme = uri.getScheme();
- final URLData urlData = extractRequestParametersFromUri(uri, scheme);
+ final UrlData urlData = extractRequestParametersFromUri(uri, scheme);
if (urlData == null) {
setCheckinData(null);
return;
@@ -80,25 +88,37 @@ public class CheckinManager {
}
}
- private URLData extractRequestParametersFromUri(Uri uri, String scheme) {
- URLData urlData = new URLData();
- urlData.uriStr = uri.toString();
- urlData.server = scheme + "://" + uri.getHost();
- urlData.port = uri.getPort();
- urlData.hostWithPort = urlData.server + (urlData.port == -1 ? "" : (":" + urlData.port));
+ private UrlData extractRequestParametersFromUri(Uri uri, String scheme) {
+ UrlData urlData = null;
+ String server = scheme + "://" + uri.getHost();
+ int port = uri.getPort();
Exception exception = null;
try {
String leaderboardNameFromQR = URLEncoder.encode(uri.getQueryParameter(DeviceMappingConstants.URL_LEADERBOARD_NAME), "UTF-8")
.replace("+", "%20");
- urlData.competitorId = uri.getQueryParameter(DeviceMappingConstants.URL_COMPETITOR_ID_AS_STRING);
- // TODO alternatively consider a mark_id
+ Set parameterNames = uri.getQueryParameterNames();
+ if (parameterNames.contains(DeviceMappingConstants.URL_COMPETITOR_ID_AS_STRING)) {
+ CompetitorUrlData competitorUrlData = new CompetitorUrlData(server, port);
+ competitorUrlData.competitorId = uri.getQueryParameter(DeviceMappingConstants.URL_COMPETITOR_ID_AS_STRING);
+ competitorUrlData.competitorUrl = competitorUrlData.hostWithPort + prefs.getServerCompetitorPath(competitorUrlData.competitorId);
+ urlData = competitorUrlData;
+ } else if (parameterNames.contains(DeviceMappingConstants.URL_MARK_ID_AS_STRING)) {
+ MarkUrlData markUrlData = new MarkUrlData(server, port);
+ markUrlData.setMarkId(uri.getQueryParameter(DeviceMappingConstants.URL_MARK_ID_AS_STRING));
+ markUrlData.setMarkUrl(markUrlData.hostWithPort + prefs.getServerMarkPath(leaderboardNameFromQR, markUrlData.getMarkId()));
+ urlData = markUrlData;
+ } else {
+ ExLog.e(activity, TAG, "Neither mark nor competitor checkin");
+ exception = new Exception();
+ }
+ urlData.uriStr = uri.toString();
urlData.checkinURLStr = urlData.hostWithPort + prefs.getServerCheckinPath().replace("{leaderboard-name}", leaderboardNameFromQR);
urlData.eventId = uri.getQueryParameter(DeviceMappingConstants.URL_EVENT_ID);
urlData.leaderboardName = leaderboardNameFromQR;
urlData.deviceUuid = new SmartphoneUUIDIdentifierImpl(UUID.fromString(UniqueDeviceUuid.getUniqueId(activity)));
urlData.eventUrl = urlData.hostWithPort + prefs.getServerEventPath(urlData.eventId);
urlData.leaderboardUrl = urlData.hostWithPort + prefs.getServerLeaderboardPath(urlData.leaderboardName);
- urlData.competitorUrl = urlData.hostWithPort + prefs.getServerCompetitorPath(urlData.competitorId);
+
} catch (UnsupportedEncodingException e) {
ExLog.e(activity, TAG, "Failed to encode leaderboard name: " + e.getMessage());
exception = e;
@@ -114,16 +134,15 @@ public class CheckinManager {
return urlData;
}
- private void getLeaderBoardFromServer(final URLData urlData, HttpGetRequest getLeaderboardRequest) {
+ private void getLeaderBoardFromServer(final UrlData urlData, HttpGetRequest getLeaderboardRequest) {
NetworkHelper.getInstance(activity)
.executeHttpJsonRequestAsync(getLeaderboardRequest, new NetworkHelper.NetworkHelperSuccessListener() {
@Override
public void performAction(JSONObject response) {
- final String leaderboardName;
-
try {
- leaderboardName = response.getString("name");
+ // Check if call to leaderboard returned valid response
+ response.getString("name");
} catch (JSONException e) {
ExLog.e(activity, TAG, "Error getting data from call on URL: " + urlData.leaderboardUrl + ", Error: " + e.getMessage());
handleApiError();
@@ -133,7 +152,7 @@ public class CheckinManager {
HttpGetRequest getEventRequest;
try {
getEventRequest = new HttpGetRequest(new URL(urlData.eventUrl), activity);
- getEventFromServer(leaderboardName, getEventRequest, urlData);
+ getEventFromServer(getEventRequest, urlData);
} catch (MalformedURLException e1) {
ExLog.e(activity, TAG, "Error: Failed to perform checking due to a MalformedURLException: " + e1.getMessage());
handleApiError();
@@ -149,7 +168,7 @@ public class CheckinManager {
});
}
- private void getEventFromServer(final String leaderboardName, HttpGetRequest getEventRequest, final URLData urlData) {
+ private void getEventFromServer(HttpGetRequest getEventRequest, final UrlData urlData) {
NetworkHelper.getInstance(activity).executeHttpJsonRequestAsync(getEventRequest, new NetworkHelper.NetworkHelperSuccessListener() {
@Override
@@ -179,15 +198,27 @@ public class CheckinManager {
handleApiError();
return;
}
- HttpGetRequest getCompetitorRequest;
- try {
- getCompetitorRequest = new HttpGetRequest(new URL(urlData.competitorUrl), activity);
- getCompetitorFromServer(getCompetitorRequest, urlData, leaderboardName);
+ if (urlData instanceof CompetitorUrlData) {
+ CompetitorUrlData competitorUrlData = (CompetitorUrlData) urlData;
+ try {
+ HttpGetRequest getCompetitorRequest = new HttpGetRequest(new URL(competitorUrlData.competitorUrl), activity);
+ getCompetitorFromServer(getCompetitorRequest, competitorUrlData);
- } catch (MalformedURLException e2) {
- ExLog.e(activity, TAG, "Error: Failed to perform checking due to a MalformedURLException: " + e2.getMessage());
- handleApiError();
+ } catch (MalformedURLException e2) {
+ ExLog.e(activity, TAG, "Error: Failed to perform checking due to a MalformedURLException: " + e2.getMessage());
+ handleApiError();
+ }
+ } else if (urlData instanceof MarkUrlData) {
+ MarkUrlData markUrlData = (MarkUrlData) urlData;
+ try {
+ HttpGetRequest getMarkRequest = new HttpGetRequest(new URL(markUrlData.getMarkUrl()), activity);
+ getMarkFromServer(getMarkRequest, markUrlData);
+ } catch (MalformedURLException exception) {
+ ExLog.e(activity, TAG, "Error: Failed to perform checking due to a MalformedURLException: " + exception.getMessage());
+ handleApiError();
+ }
}
+
}
}, new NetworkHelper.NetworkHelperFailureListener() {
@@ -199,7 +230,7 @@ public class CheckinManager {
});
}
- private void getCompetitorFromServer(HttpGetRequest getCompetitorRequest, final URLData urlData, final String leaderboardName) {
+ private void getCompetitorFromServer(HttpGetRequest getCompetitorRequest, final CompetitorUrlData urlData) {
NetworkHelper.getInstance(activity)
.executeHttpJsonRequestAsync(getCompetitorRequest, new NetworkHelper.NetworkHelperSuccessListener() {
@Override
@@ -217,7 +248,7 @@ public class CheckinManager {
handleApiError();
return;
}
- saveCheckinDataAndNotifyListeners(urlData, leaderboardName);
+ saveCheckinDataAndNotifyListeners(urlData);
}
}, new NetworkHelper.NetworkHelperFailureListener() {
@Override
@@ -228,43 +259,65 @@ public class CheckinManager {
});
}
- private void saveCheckinDataAndNotifyListeners(URLData urlData, String leaderboardName) {
- CheckinData data = new CheckinData();
+ private void getMarkFromServer(HttpGetRequest getMarkRequest, final MarkUrlData urlData) {
+ NetworkHelper.getInstance(activity)
+ .executeHttpJsonRequestAsync(getMarkRequest, new NetworkHelper.NetworkHelperSuccessListener() {
+ @Override
+ public void performAction(JSONObject response) {
+ try {
+ org.json.simple.JSONObject simpleMark;
+ simpleMark = JsonHelper.convertToSimple(response);
+ MarkDeserializer markDeserializer = new MarkDeserializer(new SharedDomainFactoryImpl(null));
+ Mark mark = markDeserializer.deserialize(simpleMark);
+ urlData.setMark(mark);
+ } catch (ParseException|JsonDeserializationException e) {
+ ExLog.e(activity, TAG, "Failed to deserialize mark");
+ if (activity != null) {
+ activity.dismissProgressDialog();
+ displayAPIErrorRecommendRetry();
+ }
+ return;
+ }
+ saveCheckinDataAndNotifyListeners(urlData);
+ }
+ }, new NetworkHelper.NetworkHelperFailureListener() {
+ @Override
+ public void performAction(NetworkHelper.NetworkHelperError e) {
+ ExLog.e(activity, TAG, "Failed to get mark from server: " + e.getMessage());
+ if (activity != null) {
+ activity.dismissProgressDialog();
+ displayAPIErrorRecommendRetry();
+ }
+ }
+ });
+ }
+
+ private void saveCheckinDataAndNotifyListeners(UrlData urlData) {
+ CheckinData data;
+ if (urlData instanceof CompetitorUrlData) {
+ CompetitorUrlData competitorUrlData = (CompetitorUrlData) urlData;
+ data = new CompetitorCheckinData(competitorUrlData);
+ } else {
+ MarkUrlData markUrlData = (MarkUrlData) urlData;
+ data = new MarkCheckinData(markUrlData);
+ }
data.setUpdate(update);
- data.competitorName = urlData.competitorName;
- data.competitorId = urlData.competitorId;
- data.competitorSailId = urlData.competitorSailId;
- data.competitorNationality = urlData.competitorNationality;
- data.competitorCountryCode = urlData.competitorCountryCode;
- data.eventId = urlData.eventId;
- data.eventName = urlData.eventName;
- data.eventStartDateStr = urlData.eventStartDateStr;
- data.eventEndDateStr = urlData.eventEndDateStr;
- data.eventFirstImageUrl = urlData.eventFirstImageUrl;
- data.eventServerUrl = urlData.hostWithPort;
- data.checkinURL = urlData.checkinURLStr;
- 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());
- handleApiError();
- } catch (NoSuchAlgorithmException e) {
+ } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
ExLog.e(activity, TAG, "Failed to get generate digest of qr-code string (" + urlData.uriStr + "). " + e.getMessage());
handleApiError();
}
}
- public void setCheckinData(AbstractCheckinData data) {
+ public void setCheckinData(CheckinData data) {
checkinData = data;
activity.onCheckinDataAvailable(getCheckinData());
}
- public AbstractCheckinData getCheckinData() {
+ public BaseCheckinData getCheckinData() {
return checkinData;
}
@@ -295,30 +348,4 @@ public class CheckinManager {
setCheckinData(null);
}
- private class URLData {
- public String uriStr;
- public String server;
- public int port;
- public String hostWithPort;
- public String competitorId;
- public String checkinURLStr;
- public String eventId;
- public String leaderboardName;
- public DeviceIdentifier deviceUuid;
- public String eventUrl;
- public String leaderboardUrl;
- public String competitorUrl;
- public String competitorName;
- public String eventName;
- public String competitorSailId;
- public String eventStartDateStr;
- public String eventEndDateStr;
- public String eventFirstImageUrl;
- public String competitorNationality;
- public String competitorCountryCode;
-
- public URLData() {
-
- }
- }
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckoutHelper.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckoutHelper.java
new file mode 100644
index 00000000000..068b9491e0c
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/CheckoutHelper.java
@@ -0,0 +1,81 @@
+package com.sap.sailing.android.tracking.app.utils;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.net.Uri;
+
+import com.sap.sailing.android.shared.data.http.HttpJsonPostRequest;
+import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.android.shared.ui.activities.AbstractBaseActivity;
+import com.sap.sailing.android.shared.util.NetworkHelper;
+import com.sap.sailing.android.shared.util.UniqueDeviceUuid;
+import com.sap.sailing.android.tracking.app.R;
+import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
+
+public class CheckoutHelper {
+ private static String TAG = CheckoutHelper.class.getName();
+
+ public void checkoutCompetitor(AbstractBaseActivity activity, String leaderboardName, String eventServer, String competitorId,
+ NetworkHelper.NetworkHelperSuccessListener successListener, NetworkHelper.NetworkHelperFailureListener failureListener) {
+ AppPreferences prefs = new AppPreferences(activity);
+ final String checkoutURLStr = eventServer
+ + prefs.getServerCheckoutPath().replace("{leaderboard-name}", Uri.encode(leaderboardName));
+
+ activity.showProgressDialog(R.string.please_wait, R.string.checking_out);
+
+ JSONObject checkoutData = new JSONObject();
+ try {
+ checkoutData.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitorId);
+ checkoutData.put(DeviceMappingConstants.JSON_DEVICE_UUID, UniqueDeviceUuid.getUniqueId(activity));
+ checkoutData.put(DeviceMappingConstants.JSON_TO_MILLIS, System.currentTimeMillis());
+ } catch (JSONException e) {
+ activity.dismissProgressDialog();
+ activity.showErrorPopup(R.string.error, R.string.error_could_not_complete_operation_on_server_try_again);
+ ExLog.e(activity, TAG, "Error populating checkout-data: " + e.getMessage());
+ return;
+ }
+
+ try {
+ HttpJsonPostRequest request = new HttpJsonPostRequest(activity, new URL(checkoutURLStr), checkoutData.toString());
+ com.sap.sailing.android.shared.util.NetworkHelper.getInstance(activity).executeHttpJsonRequestAsync(request,
+ successListener, failureListener);
+
+ } catch (MalformedURLException e) {
+ ExLog.w(activity, TAG, "Error, can't check out, MalformedURLException: " + e.getMessage());
+ }
+ }
+
+ public void checkoutMark(AbstractBaseActivity activity, String leaderboardName, String eventServer, String markId,
+ NetworkHelper.NetworkHelperSuccessListener successListener, NetworkHelper.NetworkHelperFailureListener failureListener) {
+ AppPreferences prefs = new AppPreferences(activity);
+ final String checkoutURLStr = eventServer
+ + prefs.getServerCheckoutPath().replace("{leaderboard-name}", Uri.encode(leaderboardName));
+
+ activity.showProgressDialog(R.string.please_wait, R.string.checking_out);
+
+ JSONObject checkoutData = new JSONObject();
+ try {
+ checkoutData.put(DeviceMappingConstants.JSON_MARK_ID_AS_STRING, markId);
+ checkoutData.put(DeviceMappingConstants.JSON_DEVICE_UUID, UniqueDeviceUuid.getUniqueId(activity));
+ checkoutData.put(DeviceMappingConstants.JSON_TO_MILLIS, System.currentTimeMillis());
+ } catch (JSONException e) {
+ activity.dismissProgressDialog();
+ activity.showErrorPopup(R.string.error, R.string.error_could_not_complete_operation_on_server_try_again);
+ ExLog.e(activity, TAG, "Error populating checkout-data: " + e.getMessage());
+ return;
+ }
+
+ try {
+ HttpJsonPostRequest request = new HttpJsonPostRequest(activity, new URL(checkoutURLStr), checkoutData.toString());
+ com.sap.sailing.android.shared.util.NetworkHelper.getInstance(activity).executeHttpJsonRequestAsync(request,
+ successListener, failureListener);
+
+ } catch (MalformedURLException e) {
+ ExLog.w(activity, TAG, "Error, can't check out, MalformedURLException: " + e.getMessage());
+ }
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/DatabaseHelper.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/DatabaseHelper.java
index b712058348b..0a3bdda5c76 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/DatabaseHelper.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/DatabaseHelper.java
@@ -1,5 +1,8 @@
package com.sap.sailing.android.tracking.app.utils;
+import java.util.ArrayList;
+import java.util.List;
+
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -9,22 +12,21 @@ import android.database.Cursor;
import android.os.RemoteException;
import android.provider.BaseColumns;
+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 com.sap.sailing.android.tracking.app.BuildConfig;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract;
+import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Checkin;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Competitor;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Event;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.EventLeaderboardCompetitorJoined;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Leaderboard;
-import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.CheckinUri;
import com.sap.sailing.android.tracking.app.provider.AnalyticsDatabase;
import com.sap.sailing.android.tracking.app.valueobjects.CompetitorInfo;
import com.sap.sailing.android.tracking.app.valueobjects.EventInfo;
-import com.sap.sailing.android.shared.data.CheckinUrlInfo;
-import com.sap.sailing.android.shared.data.LeaderboardInfo;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.sap.sailing.android.tracking.app.valueobjects.MarkInfo;
+import com.sap.sailing.domain.base.Mark;
public class DatabaseHelper {
@@ -43,11 +45,11 @@ public class DatabaseHelper {
public List getCheckinUrls(Context context) {
List checkinUrls = new ArrayList<>();
ContentResolver cr = context.getContentResolver();
- Cursor cursor = cr.query(CheckinUri.CONTENT_URI, null, null, null, null);
+ Cursor cursor = cr.query(Checkin.CONTENT_URI, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
- String checkinUrl = cursor.getString(cursor.getColumnIndex(CheckinUri.CHECKIN_URI_VALUE));
+ String checkinUrl = cursor.getString(cursor.getColumnIndex(Checkin.CHECKIN_URI_VALUE));
if (!checkinUrls.contains(checkinUrl)) {
checkinUrls.add(checkinUrl);
}
@@ -161,12 +163,13 @@ public class DatabaseHelper {
CheckinUrlInfo checkinUrlInfo = new CheckinUrlInfo();
checkinUrlInfo.checkinDigest = checkinDigest;
- Cursor uc = context.getContentResolver().query(CheckinUri.CONTENT_URI, null,
- CheckinUri.CHECKIN_URI_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest }, null);
+ Cursor uc = context.getContentResolver().query(Checkin.CONTENT_URI, null,
+ Checkin.CHECKIN_URI_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest }, null);
if (uc != null) {
if (uc.moveToFirst()) {
checkinUrlInfo.rowId = uc.getInt(uc.getColumnIndex(BaseColumns._ID));
- checkinUrlInfo.urlString = uc.getString(uc.getColumnIndex(CheckinUri.CHECKIN_URI_VALUE));
+ checkinUrlInfo.urlString = uc.getString(uc.getColumnIndex(Checkin.CHECKIN_URI_VALUE));
+ checkinUrlInfo.type = uc.getInt(uc.getColumnIndex(Checkin.CHECKIN_TYPE));
}
uc.close();
@@ -175,19 +178,37 @@ public class DatabaseHelper {
return checkinUrlInfo;
}
+ public MarkInfo getMarkInfo(Context context, String checkinDigest) {
+ MarkInfo markInfo = new MarkInfo();
+ markInfo.checkinDigest = checkinDigest;
+ Cursor markCursor = context.getContentResolver().query(AnalyticsContract.Mark.CONTENT_URI, null,
+ AnalyticsContract.Mark.MARK_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest }, null);
+ if (markCursor != null) {
+ if (markCursor.moveToFirst()) {
+ markInfo.markId = markCursor.getString(markCursor.getColumnIndex(AnalyticsContract.Mark.MARK_ID));
+ markInfo.markName = markCursor.getString(markCursor.getColumnIndex(AnalyticsContract.Mark.MARK_NAME));
+ }
+
+ markCursor.close();
+ }
+ return markInfo;
+ }
+
public void deleteRegattaFromDatabase(Context context, String checkinDigest) {
ContentResolver cr = context.getContentResolver();
int d1 = cr.delete(Event.CONTENT_URI, Event.EVENT_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest });
int d2 = cr.delete(Competitor.CONTENT_URI, Competitor.COMPETITOR_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest });
int d3 = cr.delete(Leaderboard.CONTENT_URI, Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest });
- int d4 = cr.delete(CheckinUri.CONTENT_URI, CheckinUri.CHECKIN_URI_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest });
+ int d4 = cr.delete(Checkin.CONTENT_URI, Checkin.CHECKIN_URI_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest });
+ int d5 = cr.delete(AnalyticsContract.Mark.CONTENT_URI, AnalyticsContract.Mark.MARK_CHECKIN_DIGEST + " = ?", new String[] { checkinDigest });
if (BuildConfig.DEBUG) {
ExLog.i(context, TAG, "Checkout, number of events deleted: " + d1);
ExLog.i(context, TAG, "Checkout, number of competitors deleted: " + d2);
- ExLog.i(context, TAG, "Checkout, number of leaderbards deleted: " + d3);
+ ExLog.i(context, TAG, "Checkout, number of leaderboards deleted: " + d3);
ExLog.i(context, TAG, "Checkout, number of checkinurls deleted: " + d4);
+ ExLog.i(context, TAG, "Checkout, number of marks deleted: " + d5);
}
}
@@ -201,33 +222,12 @@ public class DatabaseHelper {
* @return success or failure
* @throws GeneralDatabaseHelperException
*/
- public void storeCheckinRow(Context context, EventInfo event, CompetitorInfo competitor,
+ public void storeCompetitorCheckinRow(Context context, EventInfo event, CompetitorInfo competitor,
LeaderboardInfo leaderboard, CheckinUrlInfo checkinURL) throws GeneralDatabaseHelperException {
- // inserting leaderboard first
-
- ContentResolver cr = context.getContentResolver();
-
- ContentValues clv = new ContentValues();
- clv.put(Leaderboard.LEADERBOARD_NAME, leaderboard.name);
- clv.put(Leaderboard.LEADERBOARD_CHECKIN_DIGEST, leaderboard.checkinDigest);
- cr.insert(Leaderboard.CONTENT_URI, clv);
-
- // now insert event
-
+ ContentResolver contentResolver = context.getContentResolver();
ArrayList opList = new ArrayList<>();
- ContentValues cev = new ContentValues();
- cev.put(Event.EVENT_ID, event.id);
- cev.put(Event.EVENT_NAME, event.name);
- cev.put(Event.EVENT_DATE_START, event.startMillis);
- cev.put(Event.EVENT_DATE_END, event.endMillis);
- cev.put(Event.EVENT_SERVER, event.server);
- cev.put(Event.EVENT_IMAGE_URL, event.imageUrl);
- cev.put(Event.EVENT_CHECKIN_DIGEST, event.checkinDigest);
-
- opList.add(ContentProviderOperation.newInsert(Event.CONTENT_URI).withValues(cev).build());
-
// competitor
ContentValues ccv = new ContentValues();
@@ -240,23 +240,68 @@ public class DatabaseHelper {
ccv.put(Competitor.COMPETITOR_CHECKIN_DIGEST, competitor.checkinDigest);
opList.add(ContentProviderOperation.newInsert(Competitor.CONTENT_URI).withValues(ccv).build());
+ storeBasicInformation(leaderboard, event, checkinURL, opList, contentResolver);
+
+ try {
+ contentResolver.applyBatch(AnalyticsContract.CONTENT_AUTHORITY, opList);
+ } catch (RemoteException| OperationApplicationException e) {
+ throw new GeneralDatabaseHelperException(e.getMessage());
+ }
+ }
+
+ public void storeMarkCheckinRow(Context context, EventInfo event, Mark mark,
+ LeaderboardInfo leaderboard, CheckinUrlInfo checkinURL) throws GeneralDatabaseHelperException {
+
+ // Store Mark information
+ ContentResolver contentResolver = context.getContentResolver();
+ ArrayList opList = new ArrayList<>();
+ ContentValues markValues = new ContentValues();
+ markValues.put(AnalyticsContract.Mark.MARK_ID, mark.getId().toString());
+ markValues.put(AnalyticsContract.Mark.MARK_NAME, mark.getName());
+ markValues.put(AnalyticsContract.Mark.MARK_CHECKIN_DIGEST, checkinURL.checkinDigest);
+ opList.add(ContentProviderOperation.newInsert(AnalyticsContract.Mark.CONTENT_URI).withValues(markValues).build());
+
+ storeBasicInformation(leaderboard, event, checkinURL, opList, contentResolver);
+
+ try {
+ contentResolver.applyBatch(AnalyticsContract.CONTENT_AUTHORITY, opList);
+ } catch (RemoteException| OperationApplicationException e) {
+ throw new GeneralDatabaseHelperException(e.getMessage());
+ }
+ }
+
+ private void storeBasicInformation(LeaderboardInfo leaderboard, EventInfo event, CheckinUrlInfo checkinURL,
+ ArrayList opList, ContentResolver contentResolver) {
+
+ // inserting leaderboard first
+
+ ContentValues clv = new ContentValues();
+ clv.put(Leaderboard.LEADERBOARD_NAME, leaderboard.name);
+ clv.put(Leaderboard.LEADERBOARD_CHECKIN_DIGEST, leaderboard.checkinDigest);
+ contentResolver.insert(Leaderboard.CONTENT_URI, clv);
+
+ // now insert event
+
+ ContentValues cev = new ContentValues();
+ cev.put(Event.EVENT_ID, event.id);
+ cev.put(Event.EVENT_NAME, event.name);
+ cev.put(Event.EVENT_DATE_START, event.startMillis);
+ cev.put(Event.EVENT_DATE_END, event.endMillis);
+ cev.put(Event.EVENT_SERVER, event.server);
+ cev.put(Event.EVENT_IMAGE_URL, event.imageUrl);
+ cev.put(Event.EVENT_CHECKIN_DIGEST, event.checkinDigest);
+
+ opList.add(ContentProviderOperation.newInsert(Event.CONTENT_URI).withValues(cev).build());
// checkin url
ContentValues ccuv = new ContentValues();
- ccuv.put(CheckinUri.CHECKIN_URI_VALUE, checkinURL.urlString);
- ccuv.put(CheckinUri.CHECKIN_URI_CHECKIN_DIGEST, checkinURL.checkinDigest);
+ ccuv.put(Checkin.CHECKIN_URI_VALUE, checkinURL.urlString);
+ ccuv.put(Checkin.CHECKIN_URI_CHECKIN_DIGEST, checkinURL.checkinDigest);
+ ccuv.put(Checkin.CHECKIN_TYPE, checkinURL.type);
- opList.add(ContentProviderOperation.newInsert(CheckinUri.CONTENT_URI).withValues(ccuv).build());
-
- try {
- cr.applyBatch(AnalyticsContract.CONTENT_AUTHORITY, opList);
- } catch (RemoteException e) {
- throw new GeneralDatabaseHelperException(e.getMessage());
- } catch (OperationApplicationException e) {
- throw new GeneralDatabaseHelperException(e.getMessage());
- }
+ opList.add(ContentProviderOperation.newInsert(Checkin.CONTENT_URI).withValues(ccuv).build());
}
/**
@@ -282,6 +327,29 @@ public class DatabaseHelper {
return count == 0;
}
+ /**
+ * Return true if the combination of event, leaderboard and mark does not exist in the DB. (based on the
+ * digest of the checkin- url obtained from the QR-code.)
+ *
+ * @param checkinDigest
+ * SHA-256 digest of QR-code string
+ * @return combination available or not
+ */
+ public boolean eventLeaderboardMarkCombinationAvailable(Context context, String checkinDigest) {
+ ContentResolver cr = context.getContentResolver();
+ String sel = AnalyticsDatabase.Tables.LEADERBOARDS + "." + Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = ? "
+ + "AND " + AnalyticsDatabase.Tables.MARKS + "." + AnalyticsContract.Mark.MARK_CHECKIN_DIGEST + " = ? "
+ + "AND " + AnalyticsDatabase.Tables.EVENTS + "." + Event.EVENT_CHECKIN_DIGEST + " = ?";
+ Cursor cursor = cr.query(AnalyticsContract.EventLeaderboardMarkJoined.CONTENT_URI, null, sel, new String[] { checkinDigest,
+ checkinDigest, checkinDigest }, null);
+ int count = 0;
+ if (cursor != null) {
+ count = cursor.getCount();
+ cursor.close();
+ }
+ return count == 0;
+ }
+
public class GeneralDatabaseHelperException extends Exception {
private static final long serialVersionUID = 4333494334720305541L;
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CheckinData.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CheckinData.java
index cc03862f3b5..f4568749545 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CheckinData.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CheckinData.java
@@ -1,33 +1,41 @@
package com.sap.sailing.android.tracking.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;
-public class CheckinData extends AbstractCheckinData {
+import com.sap.sailing.android.shared.data.BaseCheckinData;
+import com.sap.sailing.android.shared.data.CheckinUrlInfo;
+import com.sap.sailing.android.shared.data.LeaderboardInfo;
+
+public abstract class CheckinData extends BaseCheckinData {
// public String gcmId;
- public String leaderboardName;
- public String eventId;
- public String eventName;
- public String eventStartDateStr;
- public String eventEndDateStr;
- public String eventFirstImageUrl;
- public String eventServerUrl;
+ private String leaderboardName;
+ private String eventId;
+ private String eventName;
+ private String eventStartDateStr;
+ private String eventEndDateStr;
+ private String eventFirstImageUrl;
+ private String eventServerUrl;
public String checkinURL;
- public String competitorName;
- public String competitorId;
- public String competitorSailId;
- public String competitorNationality;
- public String competitorCountryCode;
public String deviceUid;
- public String uriString;
+ private String uriString;
public String checkinDigest;
private boolean update;
+ public CheckinData(UrlData data) {
+ leaderboardName = data.leaderboardName.replace("%20", " ");
+ deviceUid = data.deviceUuid.getStringRepresentation();
+ eventId = data.eventId;
+ eventName = data.eventName;
+ eventStartDateStr = data.eventStartDateStr;
+ eventEndDateStr = data.eventEndDateStr;
+ eventFirstImageUrl = data.eventFirstImageUrl;
+ eventServerUrl = data.hostWithPort;
+ checkinURL = data.checkinURLStr;
+ uriString = data.uriStr;
+ }
+
public void setCheckinDigestFromString(String checkinString) throws UnsupportedEncodingException,
NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
@@ -59,24 +67,16 @@ public class CheckinData extends AbstractCheckinData {
return leaderboard;
}
- public CompetitorInfo getCompetitor() {
- CompetitorInfo competitor = new CompetitorInfo();
- competitor.name = competitorName;
- competitor.id = competitorId;
- competitor.sailId = competitorSailId;
- competitor.nationality = competitorNationality;
- competitor.countryCode = competitorCountryCode;
- competitor.checkinDigest = checkinDigest;
- return competitor;
- }
-
public CheckinUrlInfo getCheckinUrl() {
CheckinUrlInfo checkinUrlInfo = new CheckinUrlInfo();
checkinUrlInfo.urlString = uriString;
checkinUrlInfo.checkinDigest = checkinDigest;
+ checkinUrlInfo.type = getCheckinType();
return checkinUrlInfo;
}
+ public abstract int getCheckinType();
+
public boolean isUpdate() {
return update;
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CompetitorCheckinData.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CompetitorCheckinData.java
new file mode 100644
index 00000000000..0ad96571df5
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CompetitorCheckinData.java
@@ -0,0 +1,40 @@
+package com.sap.sailing.android.tracking.app.valueobjects;
+
+import com.sap.sailing.android.shared.data.CheckinUrlInfo;
+
+public class CompetitorCheckinData extends CheckinData {
+
+
+ public String competitorName;
+ public String competitorId;
+ public String competitorUrl;
+ public String competitorSailId;
+ public String competitorNationality;
+ public String competitorCountryCode;
+
+ public CompetitorCheckinData(CompetitorUrlData urlData) {
+ super(urlData);
+ competitorName = urlData.competitorName;
+ competitorId = urlData.competitorId;
+ competitorUrl = urlData.competitorUrl;
+ competitorSailId = urlData.competitorSailId;
+ competitorNationality = urlData.competitorNationality;
+ competitorCountryCode = urlData.competitorCountryCode;
+ }
+
+ public CompetitorInfo getCompetitor() {
+ CompetitorInfo competitor = new CompetitorInfo();
+ competitor.name = competitorName;
+ competitor.id = competitorId;
+ competitor.sailId = competitorSailId;
+ competitor.nationality = competitorNationality;
+ competitor.countryCode = competitorCountryCode;
+ competitor.checkinDigest = checkinDigest;
+ return competitor;
+ }
+
+ @Override
+ public int getCheckinType() {
+ return CheckinUrlInfo.TYPE_COMPETITOR;
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CompetitorUrlData.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CompetitorUrlData.java
new file mode 100644
index 00000000000..c79517e10f8
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/CompetitorUrlData.java
@@ -0,0 +1,15 @@
+package com.sap.sailing.android.tracking.app.valueobjects;
+
+public class CompetitorUrlData extends UrlData {
+
+ public String competitorId;
+ public String competitorUrl;
+ public String competitorName;
+ public String competitorSailId;
+ public String competitorNationality;
+ public String competitorCountryCode;
+
+ public CompetitorUrlData(String server, int port) {
+ super(server, port);
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkCheckinData.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkCheckinData.java
new file mode 100644
index 00000000000..3b8cf18e7e5
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkCheckinData.java
@@ -0,0 +1,23 @@
+package com.sap.sailing.android.tracking.app.valueobjects;
+
+import com.sap.sailing.android.shared.data.CheckinUrlInfo;
+import com.sap.sailing.domain.base.Mark;
+
+public class MarkCheckinData extends CheckinData {
+
+ public Mark mark;
+
+ public MarkCheckinData(MarkUrlData markUrlData) {
+ super(markUrlData);
+ mark = markUrlData.getMark();
+ }
+
+ public Mark getMark() {
+ return mark;
+ }
+
+ @Override
+ public int getCheckinType() {
+ return CheckinUrlInfo.TYPE_MARK;
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkInfo.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkInfo.java
new file mode 100644
index 00000000000..2bb3e5cbaa8
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkInfo.java
@@ -0,0 +1,8 @@
+package com.sap.sailing.android.tracking.app.valueobjects;
+
+public class MarkInfo {
+
+ public String markId;
+ public String markName;
+ public String checkinDigest;
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkUrlData.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkUrlData.java
new file mode 100644
index 00000000000..baec9a1a90a
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/MarkUrlData.java
@@ -0,0 +1,39 @@
+package com.sap.sailing.android.tracking.app.valueobjects;
+
+import com.sap.sailing.domain.base.Mark;
+
+public class MarkUrlData extends UrlData {
+
+ private String markId;
+ private String markUrl;
+ private Mark mark;
+
+ public MarkUrlData(String server, int port) {
+ super(server, port);
+ }
+
+ public String getMarkId() {
+ return markId;
+ }
+
+ public void setMarkId(String markId) {
+ this.markId = markId;
+ }
+
+ public String getMarkUrl() {
+ return markUrl;
+ }
+
+ public void setMarkUrl(String markUrl) {
+ this.markUrl = markUrl;
+ }
+
+ public Mark getMark() {
+ return mark;
+ }
+
+ public void setMark(Mark mark) {
+ this.mark = mark;
+ }
+
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/UrlData.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/UrlData.java
new file mode 100644
index 00000000000..eb004517aee
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/valueobjects/UrlData.java
@@ -0,0 +1,28 @@
+package com.sap.sailing.android.tracking.app.valueobjects;
+
+import com.sap.sailing.domain.racelogtracking.DeviceIdentifier;
+
+public abstract 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 eventUrl;
+ public String leaderboardUrl;
+ public String eventName;
+ public String eventStartDateStr;
+ public String eventEndDateStr;
+ public String eventFirstImageUrl;
+ public String checkinURL;
+ public String uriString;
+
+ public UrlData(String server, int port) {
+ this.server = server;
+ this.port = port;
+ hostWithPort = server + (port == -1 ? "" : (":" + port));
+ }
+}
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/drawable/button_text_colors.xml b/mobile/com.sap.sailing.buoy.positioning/res/drawable/button_text_colors.xml
new file mode 100644
index 00000000000..b431d7c5fef
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/res/drawable/button_text_colors.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/drawable/disabled_btn_blue.xml b/mobile/com.sap.sailing.buoy.positioning/res/drawable/disabled_btn_blue.xml
new file mode 100644
index 00000000000..6b1874df8fe
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/res/drawable/disabled_btn_blue.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button.xml b/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button.xml
index dded0f8fa3f..fae430a2e59 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
-
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button_disabled.xml b/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button_disabled.xml
deleted file mode 100644
index ee41d6642d4..00000000000
--- a/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button_disabled.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button_pressed.xml b/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button_pressed.xml
deleted file mode 100644
index 7e1809a06e4..00000000000
--- a/mobile/com.sap.sailing.buoy.positioning/res/drawable/position_send_button_pressed.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/layout-land/fragment_buoy_postion_detail.xml b/mobile/com.sap.sailing.buoy.positioning/res/layout-land/fragment_buoy_postion_detail.xml
index 05a82c9ba03..3eb71db5e0f 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/layout-land/fragment_buoy_postion_detail.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/layout-land/fragment_buoy_postion_detail.xml
@@ -3,52 +3,23 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/black"
+ android:background="@drawable/fiori_main_background"
android:orientation="vertical"
android:paddingLeft="0dp"
android:paddingRight="0dp">
-
-
-
-
-
-
-
-
-
+ android:layout_weight="1"/>
@@ -58,47 +29,63 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
+
+ android:background="@color/list_item_background_color"
+ android:orientation="horizontal">
-
+ android:orientation="vertical"
+ android:paddingLeft="@dimen/fragment_side_margin"
+ android:paddingTop="12dp">
-
+
+
+
+
+
+
+
+
-
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="@dimen/signal_quality_indicator_left_margin"
+ android:layout_marginStart="@dimen/signal_quality_indicator_left_margin"
+ android:layout_marginEnd="@dimen/fragment_side_margin"
+ android:layout_marginRight="@dimen/fragment_side_margin"/>
-
+
@@ -106,36 +93,50 @@
+ android:background="@color/list_item_background_color"
+ android:orientation="horizontal">
-
+ android:orientation="vertical"
+ android:paddingLeft="@dimen/fragment_side_margin"
+ android:paddingTop="12dp">
-
+
+
+
+
+
+
+
+
-
-
+
@@ -146,7 +147,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_weight="1"/>
@@ -55,96 +20,95 @@
+ android:orientation="vertical"
+ android:background="@color/list_item_background_color">
+
+
-
+
-
+
+
+
+
+
+
-
-
-
-
-
+ android:layout_height="@dimen/list_header_height"
+ android:orientation="vertical"
+ android:background="@color/list_item_background_color">
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
\ 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 1463a397ced..18cb5e7ef13 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
@@ -2,36 +2,39 @@
+
-
-
-
+
+
+ android:layout_height="wrap_content"
+ android:divider="@color/separator_color"
+ android:dividerHeight="1dp"/>
-
+ android:textSize="@dimen/buoy_overview_text_size"
+ android:textColor="@color/fiori_text_color"/>
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 04d4b1e1914..c7c2e979ad6 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
@@ -2,46 +2,52 @@
+
-
+
-
+
-
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values-de-land/strings.xml b/mobile/com.sap.sailing.buoy.positioning/res/values-de-land/strings.xml
new file mode 100644
index 00000000000..462ee311f19
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values-de-land/strings.xml
@@ -0,0 +1,7 @@
+
+
+ Genauigkeit
+ Entfernung
+ der GPS-Position
+ zur alten Boje
+
\ 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 600aadff5b6..24f35fa5273 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,17 +4,15 @@
Kurstyp
Kursmarkierungen
Position setzen
- POSITION SETZEN\nBitte GPS aktivieren
- POSITION SETZEN\nWarte auf GPS Verbindung
+ GPS aktivieren,\n um die Position zu setzen
+ Warte auf GPS Signal
Position zurücksetzen
Empfangen der Markierungen…
Gesetzt
Nicht gesetzt
(Genauigkeit ca. %1$sm)
- Genauigkeit
- Entfernung
- der GPS-Position
- zur alten Boje
+ GPS Genauigkeit
+ Entfernung zur alten Boje
Die Position wurde gesetzt
Keine Information
@string/settings
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values-land/strings.xml b/mobile/com.sap.sailing.buoy.positioning/res/values-land/strings.xml
new file mode 100644
index 00000000000..4052bfcb5ea
--- /dev/null
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values-land/strings.xml
@@ -0,0 +1,7 @@
+
+
+ Accuracy
+ Distance
+ of GPS position
+ to old buoy
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values-v21/theme.xml b/mobile/com.sap.sailing.buoy.positioning/res/values-v21/theme.xml
index 52ba22ea4de..905ac38f9ea 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/values-v21/theme.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values-v21/theme.xml
@@ -3,11 +3,22 @@
+
+
+
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
index 98153a144c8..5c7b8a4bd23 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/values/api_endpoints.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values/api_endpoints.xml
@@ -1,6 +1,4 @@
/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/colors.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/colors.xml
index 2a42ac97af9..70c1838cc4f 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/values/colors.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values/colors.xml
@@ -9,6 +9,8 @@
@color/gray
@color/colorPrimary
- @color/green
+ @color/fiori_primary_color
+
+ #83ceee
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/dimens.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/dimens.xml
index 385dbaea5d1..692d12be7cb 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/values/dimens.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values/dimens.xml
@@ -2,4 +2,5 @@
10dp
20sp
+ 10dp
\ No newline at end of file
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 e1666a31d72..61b336016b6 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 @@
Course Type
Marks
Set Position
- SET POSITION\nPlease activate GPS
- SET POSITION\nWaiting for GPS connection
+ Enable GPS\nto set Position
+ Waiting for GPS connection
Reset Position
Getting race marks…
set
@@ -14,10 +14,8 @@
(Accurary ca. %1$sm)
ca. %1$sm
%1$sm
- Accuracy
- Distance
- of GPS position
- to old buoy
+ GPS Accuracy
+ Distance to old buoy
The position has been set
No information
@string/settings
diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/theme.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/theme.xml
index b179ee91383..6a76cd45be1 100644
--- a/mobile/com.sap.sailing.buoy.positioning/res/values/theme.xml
+++ b/mobile/com.sap.sailing.buoy.positioning/res/values/theme.xml
@@ -4,7 +4,7 @@
-
+
+
\ No newline at end of file
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
index 14b85fcfdf8..0de525d2148 100644
--- 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
@@ -3,10 +3,11 @@ 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.buoy.positioning.app.provider.AnalyticsContract;
import com.sap.sailing.android.shared.ui.adapters.AbstractRegattaAdapter;
-import com.sap.sailing.android.shared.ui.customviews.OpenSansTextView;
public class RegattaAdapter extends AbstractRegattaAdapter {
@@ -16,7 +17,7 @@ public class RegattaAdapter extends AbstractRegattaAdapter {
@Override
public void bindView(View view, Context context, Cursor cursor) {
- OpenSansTextView name = (OpenSansTextView) view.findViewById(R.id.regattaName);
+ TextView name = (TextView) view.findViewById(R.id.regattaName);
if (name != null) {
String text = cursor.getString(cursor.getColumnIndex(AnalyticsContract.Leaderboard.LEADERBOARD_NAME));
name.setText(text);
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java
index a0bf73b9723..bb63e259c11 100644
--- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java
@@ -8,7 +8,7 @@ import com.sap.sailing.android.buoy.positioning.app.R;
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.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
public class MarkerService extends IntentService implements CheckinManager.DataChangedListner{
private static String TAG = MarkerService.class.getName();
@@ -26,7 +26,7 @@ public class MarkerService extends IntentService implements CheckinManager.Data
}
@Override
- public void handleData(AbstractCheckinData data) {
+ public void handleData(BaseCheckinData data) {
if (data != null) {
try {
CheckinData checkinData = (CheckinData) data;
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/AboutActivity.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/AboutActivity.java
index 4c361476d07..4ac4edbacb9 100644
--- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/AboutActivity.java
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/AboutActivity.java
@@ -1,5 +1,6 @@
package com.sap.sailing.android.buoy.positioning.app.ui.activities;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
@@ -18,14 +19,15 @@ public class AboutActivity extends BaseActivity {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
setSupportActionBar(toolbar);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
getSupportActionBar().setTitle(R.string.about_this_app);
}
replaceFragment(R.id.content_frame, AboutFragment.newInstance());
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 1fa2b99306e..123d8d269be 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
@@ -3,6 +3,7 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import java.util.List;
import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
@@ -41,14 +42,16 @@ public class PositioningActivity extends BaseActivity implements pingListener {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
setSupportActionBar(toolbar);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
- getSupportActionBar().setTitle(getString(R.string.set_position));
+ getSupportActionBar().setTitle(markInfo.getName());
}
BuoyFragment fragment = new BuoyFragment();
fragment.setPingListener(this);
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 a8625ff08c4..3f6434adb0f 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
@@ -6,6 +6,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
@@ -21,7 +22,7 @@ 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.util.MarkerUtils;
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.BaseCheckinData;
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;
@@ -56,14 +57,15 @@ public class RegattaActivity extends AbstractRegattaActivity {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
setSupportActionBar(toolbar);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
getSupportActionBar().setTitle(leaderboardName);
}
RegattaFragment regattaFragment = new RegattaFragment();
@@ -144,7 +146,7 @@ public class RegattaActivity extends AbstractRegattaActivity {
}
@Override
- public void onCheckinDataAvailable(AbstractCheckinData checkinData) {
+ public void onCheckinDataAvailable(BaseCheckinData checkinData) {
if (checkinData != null) {
CheckinData data = (CheckinData) checkinData;
try {
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/SettingActivity.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/SettingActivity.java
index 0911e033128..b5fcd86c88e 100644
--- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/SettingActivity.java
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/SettingActivity.java
@@ -1,5 +1,6 @@
package com.sap.sailing.android.buoy.positioning.app.ui.activities;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
@@ -25,7 +26,6 @@ public class SettingActivity extends AppCompatActivity {
if (toolbar != null) {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -33,13 +33,15 @@ public class SettingActivity extends AppCompatActivity {
}
});
setSupportActionBar(toolbar);
- toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
- toolbar.setPadding(20, 0, 0, 0);
getSupportActionBar().setTitle(getString(R.string.settings));
}
}
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 b66c8205299..31ff5921601 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
@@ -1,6 +1,7 @@
package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
@@ -9,7 +10,7 @@ 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.buoy.positioning.app.util.AboutHelper;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
@@ -22,6 +23,10 @@ public class StartActivity extends AbstractStartActivity {
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(getString(R.string.title_activity_start));
getSupportActionBar().setHomeButtonEnabled(false);
+ ColorDrawable backgroundDrawable = new ColorDrawable(getResources().getColor(R.color.toolbar_background));
+ getSupportActionBar().setBackgroundDrawable(backgroundDrawable);
+ int sidePadding = (int) getResources().getDimension(R.dimen.toolbar_left_padding);
+ toolbar.setPadding(sidePadding, 0, 0, 0);
}
replaceFragment(R.id.content_frame, new HomeFragment());
@@ -63,7 +68,7 @@ public class StartActivity extends AbstractStartActivity {
}
@Override
- public void onCheckinDataAvailable(AbstractCheckinData data) {
+ public void onCheckinDataAvailable(BaseCheckinData data) {
if (data != null) {
getHomeFragment().displayUserConfirmationScreen(data);
}
diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/AboutFragment.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/AboutFragment.java
index 25cc30fc0f0..993e7592434 100644
--- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/AboutFragment.java
+++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/AboutFragment.java
@@ -5,9 +5,9 @@ import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.TextView;
import com.sap.sailing.android.buoy.positioning.app.R;
-import com.sap.sailing.android.shared.ui.customviews.OpenSansTextView;
import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.shared.util.LicenseHelper;
@@ -41,7 +41,7 @@ public class AboutFragment extends BaseFragment {
EulaHelper.with(getActivity()).openEulaPage();
}
});
- OpenSansTextView versionTextView = (OpenSansTextView) view.findViewById(R.id.system_information_application_version);
+ TextView versionTextView = (TextView) view.findViewById(R.id.system_information_application_version);
versionTextView.setText(AppUtils.with(getActivity()).getBuildInfo());
return view;
}
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 8c3b5911b1c..481b5fb247e 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
@@ -16,14 +16,13 @@ import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
-import android.text.SpannableString;
-import android.text.Spanned;
-import android.text.style.AbsoluteSizeSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
@@ -39,8 +38,6 @@ 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.logging.ExLog;
-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.shared.util.LocationHelper;
import com.sap.sailing.android.shared.util.ViewHelper;
@@ -51,10 +48,9 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
private static final int GPS_MIN_DISTANCE = 1;
private static final int GPS_MIN_TIME = 1000;
private static final String N_A = "n/a";
- private OpenSansTextView markHeaderTextView;
- private OpenSansTextView accuracyTextView;
- private OpenSansTextView distanceTextView;
- private OpenSansButton setPositionButton;
+ private TextView accuracyTextView;
+ private TextView distanceTextView;
+ private Button setPositionButton;
private MapFragment mapFragment;
private Location lastKnownLocation;
private LatLng savedPosition;
@@ -72,7 +68,6 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
super.onCreateView(inflater, container, savedInstanceState);
View layout = inflater.inflate(R.layout.fragment_buoy_postion_detail, container, false);
- markHeaderTextView = ViewHelper.get(layout, R.id.mark_header);
accuracyTextView = ViewHelper.get(layout, R.id.marker_gps_accuracy);
distanceTextView = ViewHelper.get(layout, R.id.marker_gps_distance);
ClickListener clickListener = new ClickListener();
@@ -133,10 +128,7 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
boolean gpsEnabled = LocationHelper.isGPSEnabled(getActivity());
int buttonTextId = gpsEnabled ? R.string.set_position_no_gps_yet : R.string.set_position_disabled_gps;
String text = getString(buttonTextId);
- SpannableString disabledButtonText = new SpannableString(text);
- AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(10, true);
- disabledButtonText.setSpan(absoluteSizeSpan, text.indexOf("\n"), text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- setPositionButton.setText(disabledButtonText);
+ setPositionButton.setText(text);
}
private void checkGPS() {
@@ -173,8 +165,6 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
}
public void setUpTextUI(Location location) {
- MarkInfo mark = positioningActivity.getMarkInfo();
- markHeaderTextView.setText(mark.getName());
String accuracyText = N_A;
String distanceText = N_A;
DecimalFormat accuracyFormatter = new DecimalFormat("#.##");
@@ -226,8 +216,9 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
}
private void configureMap(GoogleMap map) {
- map.getUiSettings().setZoomControlsEnabled(true);
- map.setPadding(0, 50, 0, 0);
+ if (map != null) {
+ map.getUiSettings().setZoomControlsEnabled(true);
+ }
}
@Override
@@ -254,6 +245,7 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
private void initLocationProvider() {
locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
locationManager.removeUpdates(this);
+ locationManager.removeGpsStatusListener(mGpsListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_MIN_TIME, GPS_MIN_DISTANCE, this);
locationManager.addGpsStatusListener(mGpsListener);
@@ -346,7 +338,7 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d(TAG, "Action: " + action);
- if (action.equals(getString(R.string.database_changed))) {
+ if (action.equals(getString(R.string.database_changed)) && isAdded()) {
positioningActivity.loadDataFromDatabase();
setUpTextUI(lastKnownLocation);
updateMap();
@@ -364,12 +356,14 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
public void onGpsStatusChanged(int event) {
switch (event) {
case GpsStatus.GPS_EVENT_STOPPED: {
- disablePositionButton();
- distanceTextView.setText(N_A);
- accuracyTextView.setText(N_A);
- mapFragment.getMap().setMyLocationEnabled(false);
- reportGPSQuality(0);
- break;
+ if (isAdded()) {
+ disablePositionButton();
+ distanceTextView.setText(N_A);
+ accuracyTextView.setText(N_A);
+ mapFragment.getMap().setMyLocationEnabled(false);
+ reportGPSQuality(0);
+ break;
+ }
}
}
}
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 6051a9f3a06..9b7a60b6f0a 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
@@ -25,7 +25,7 @@ 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.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.CheckinDataActivity;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
@@ -66,7 +66,7 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
}
@Override
- public void displayUserConfirmationScreen(AbstractCheckinData data) {
+ public void displayUserConfirmationScreen(BaseCheckinData data) {
CheckinData chData = (CheckinData) data;
checkinWithApiAndStartRegattaActivity(chData);
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 5f3657101d8..9af0673f32a 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
@@ -19,7 +19,7 @@ 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.BaseCheckinData;
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;
@@ -49,7 +49,7 @@ import android.widget.Toast;
public class CheckinManager {
private final static String TAG = CheckinManager.class.getName();
- private AbstractCheckinData checkinData;
+ private BaseCheckinData checkinData;
private final CheckinDataActivity activity;
private final Context mContext;
private final AppPreferences prefs;
@@ -254,7 +254,7 @@ public class CheckinManager {
}
}
- public void setCheckinData(AbstractCheckinData data) {
+ public void setCheckinData(BaseCheckinData data) {
checkinData = data;
if (activity != null) {
activity.onCheckinDataAvailable(getCheckinData());
@@ -264,14 +264,14 @@ public class CheckinManager {
}
public interface DataChangedListner{
- void handleData(AbstractCheckinData data);
+ void handleData(BaseCheckinData data);
}
public void setDataChangedListner(DataChangedListner listner){
dataChangedListner = listner;
}
- public AbstractCheckinData getCheckinData() {
+ public BaseCheckinData getCheckinData() {
return checkinData;
}
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 8a6e1060c22..3d529937133 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,6 +1,6 @@
package com.sap.sailing.android.buoy.positioning.app.valueobjects;
-import com.sap.sailing.android.shared.data.AbstractCheckinData;
+import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.data.CheckinUrlInfo;
import com.sap.sailing.android.shared.data.LeaderboardInfo;
@@ -9,7 +9,7 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
-public class CheckinData extends AbstractCheckinData {
+public class CheckinData extends BaseCheckinData {
public String leaderboardName;
public String deviceUid;
public String uriString;