Merge branch 'ubilabs--tracking_app--bug-2688'

This commit is contained in:
Axel Uhl committed 2016-07-14 21:58:28 +02:00
commit 37f1ff20e1
134 files changed
+2279 -1428

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/pressed_btn_blue" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/normal_btn_blue" />
</selector>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="90"
android:endColor="#def1f1"
android:startColor="#dce3eb"
android:type="linear"/>
<corners
android:radius="0dp"/>
</shape>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/blue_button_normal"/>
</shape>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/normal_button" />
<stroke
android:width="1dp"
android:color="@color/separator_color" />
</shape>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/blue_button_pressed"/>
</shape>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/normal_button_pressed"/>
<stroke
android:width="1dp"
android:color="@color/separator_color" />
</shape>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/pressed_btn_white" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/normal_btn_white" />
</selector>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,80 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/toolbar_separator"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:layout_alignParentTop="true"
android:background="@color/sap_yellow"/>
android:layout_height="match_parent"
android:background="@drawable/fiori_main_background">
<ImageView
android:id="@+id/homeBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_above="@+id/two_buttons_layout"
android:layout_alignParentTop="true"
android:contentDescription="@string/empty"
android:layout_below="@id/toolbar_separator"
android:scaleType="centerCrop"
android:src="@drawable/working_title"/>
<RelativeLayout
android:id="@+id/bottomLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/qr_code_label_height"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/black_transparent"
>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/scan_hint"
android:textColor="@color/white"/>
</RelativeLayout>
<TextView
android:id="@+id/scan_hint_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/home_land_margin"
android:text="@string/scan_hint"
android:textColor="@color/fiori_text_color"/>
<LinearLayout
android:id="@+id/two_buttons_layout"
android:orientation="horizontal"
android:layout_above="@+id/bottomLayout"
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_above="@+id/scan_hint_text"
android:layout_marginBottom="@dimen/home_land_margin"
android:layout_marginTop="@dimen/home_land_margin"
android:orientation="horizontal"
>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/noQrCode"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="@dimen/home_button_height"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="@dimen/home_land_margin"
android:layout_marginRight="@dimen/home_land_margin"
android:layout_weight="0.4"
android:background="@drawable/white_button"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:background="@drawable/rounded_btn_white"
android:textColor="@color/black"
android:text="@string/no_qr_code"/>
android:text="@string/no_qr_code"
android:textColor="@color/fiori_text_color"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/scanQr"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="@dimen/home_button_height"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/rounded_btn_yellow"
android:layout_marginLeft="@dimen/home_land_margin"
android:layout_marginRight="@dimen/home_land_margin"
android:layout_weight="0.6"
android:background="@drawable/blue_button"
android:text="@string/scan_qr"
android:textAllCaps="true"
android:textStyle="bold"
android:text="@string/scan_qr"/>
android:textStyle="bold"/>
</LinearLayout>
@@ -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"
>
</ListView>
@@ -1,11 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:background="@color/sap_yellow"/>
android:layout_height="match_parent"
android:background="@drawable/fiori_main_background">
<View
android:id="@+id/center_anchor"
@@ -14,7 +11,7 @@
android:layout_centerInParent="true"
/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/license_button"
android:layout_width="match_parent"
android:layout_height="@dimen/about_button_height"
@@ -24,13 +21,13 @@
android:layout_marginLeft="@dimen/about_button_side_margin"
android:layout_marginRight="@dimen/about_button_side_margin"
android:layout_marginTop="@dimen/about_button_top_bottom_margin"
android:background="@drawable/rounded_btn_yellow"
android:background="@drawable/blue_button"
android:text="@string/license_information"
android:textAllCaps="false"
android:textSize="@dimen/about_button_text_size"
android:textStyle="bold"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/eula_button"
android:layout_width="match_parent"
android:layout_height="@dimen/about_button_height"
@@ -40,29 +37,32 @@
android:layout_marginLeft="@dimen/about_button_side_margin"
android:layout_marginRight="@dimen/about_button_side_margin"
android:layout_marginTop="@dimen/about_button_top_bottom_margin"
android:background="@drawable/rounded_btn_yellow"
android:background="@drawable/blue_button"
android:text="@string/eula"
android:textAllCaps="false"
android:textSize="@dimen/about_button_text_size"
android:textStyle="bold"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/system_information_application_version_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/application_version"
android:layout_marginLeft="@dimen/about_button_side_margin"
android:layout_above="@+id/system_information_application_version"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/eula_button"/>
android:layout_marginLeft="@dimen/about_button_side_margin"
android:text="@string/application_version"
android:textColor="@color/fiori_text_color"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/system_information_application_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/about_button_side_margin"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/system_information_application_version_header"/>
android:layout_marginBottom="@dimen/about_button_top_bottom_margin"
android:layout_marginLeft="@dimen/about_button_side_margin"
android:textColor="@color/fiori_text_color"/>
</RelativeLayout>
@@ -1,46 +1,57 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
android:layout_height="@dimen/toolbar_height"
android:minHeight="@dimen/toolbar_height"
android:theme="@style/AppTheme.Toolbar">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_vertical"
android:padding="10dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:lines="1"
android:singleLine="true"
android:textColor="@color/toolbar_text_color"
android:textSize="16sp"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/toolbar_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:lines="1"
android:singleLine="true"
android:textColor="@color/toolbar_text_color"
android:textSize="12sp"/>
</LinearLayout>
</com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar>
<View
android:id="@+id/toolbar_separator"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:background="@color/separator_color"/>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar"/>
android:layout_height="match_parent"/>
</RelativeLayout>
</LinearLayout>
@@ -1,21 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/toolbar_separator"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:layout_alignParentTop="true"
android:background="@color/sap_yellow"/>
android:layout_height="match_parent"
android:background="@drawable/fiori_main_background">
<ImageView
android:id="@+id/homeBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_below="@id/toolbar_separator"
android:layout_above="@+id/scanQr"
android:contentDescription="@string/empty"
android:scaleType="centerCrop"
android:src="@drawable/working_title"/>
@@ -23,60 +16,58 @@
<RelativeLayout
android:id="@+id/bottomLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/qr_code_label_height"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/black_transparent">
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_marginRight="@dimen/fragment_side_margin">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/scan_hint"
android:textColor="@color/white"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
</RelativeLayout>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/scanQr"
android:layout_width="match_parent"
android:layout_height="@dimen/home_button_height"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:layout_above="@+id/noQrCode"
android:layout_marginBottom="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="10dp"
android:background="@drawable/qr_button"
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_marginRight="@dimen/fragment_side_margin"
android:layout_marginTop="20dp"
android:background="@drawable/blue_button"
android:text="@string/scan_qr"
android:textAllCaps="true"
android:textSize="18sp"
android:textStyle="bold"/>
android:textSize="@dimen/highlight_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/noQrCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="@dimen/no_qr_code_button_height"
android:layout_above="@+id/bottomLayout"
android:layout_marginBottom="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:background="@drawable/rounded_btn_white"
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_marginRight="@dimen/fragment_side_margin"
android:background="@drawable/white_button"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:text="@string/no_qr_code"
android:textAllCaps="true"
android:textColor="@color/black"
android:textSize="18sp"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/button_text_size"/>
<ListView
android:id="@+id/listRegatta"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/scanQr"
android:layout_below="@id/toolbar_separator"
android:divider="@android:color/white"
android:layout_alignParentTop="true"
android:divider="@color/separator_color"
android:dividerHeight="1dp"/>
</RelativeLayout>
@@ -18,7 +18,7 @@
android:layout_height="match_parent"
android:padding="10dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -27,7 +27,7 @@
android:singleLine="true"
android:textSize="16sp"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/toolbar_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -39,12 +39,11 @@
</LinearLayout>
</com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar>
<View
android:id="@+id/top_bar"
android:id="@+id/toolbar_separator"
android:layout_width="fill_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:background="@color/sap_yellow"/>
android:background="@color/separator_color"/>
<FrameLayout
android:id="@+id/content_frame"
@@ -1,39 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/colorPrimary"
tools:ignore="Overdraw">
android:layout_height="@dimen/list_row_height"
android:background="@color/list_item_background_color"
tools:ignore="Overdraw" >
<ImageView
android:id="@+id/nextPage"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:baselineAlignBottom="@+id/regattaName"
android:contentDescription="@string/empty"
android:src="@drawable/yellow_arrow_right"
android:layout_marginTop="13dp"
android:layout_marginBottom="10dp"
android:layout_marginRight="14dp"
android:layout_marginEnd="14dp"
android:textColor="@color/white"/>
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" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/regattaName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/nextPage"
android:layout_toStartOf="@+id/nextPage"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textSize="18sp"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="15dp"
android:singleLine="true"
android:textColor="@color/white"/>
android:textColor="@color/fiori_text_color" />
</RelativeLayout>
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
tools:ignore="Overdraw">
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/list_header_background_color">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/list_header_height">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:textSize="16sp"
android:background="@color/colorPrimary"
android:textColor="@color/white"
android:text="@string/your_regattas"/>
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" />
</LinearLayout>
</RelativeLayout>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="home_button_height">80dp</dimen>
<dimen name="qr_code_label_height">50dp</dimen>
<dimen name="home_land_margin">10dp</dimen>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="preference_server_marks_path" translatable="false">/sailingserver/api/v1/leaderboards/{leaderboard_name}/marks?</string>
<string name="preference_server_leaderboard_path" translatable="false">/sailingserver/api/v1/leaderboards/{leaderboard_name}</string>
</resources>
@@ -47,5 +47,20 @@
<color name="gray">#333333</color>
<color name="colorPrimary">@color/gray</color>
<color name="yellow_button_pressed">#D6B363</color>
<color name="yellow_button_disabled">#7fEEAA29</color>
<color name="toolbar_text_color">@color/black</color>
<color name="toolbar_background">@color/white</color>
<color name="separator_color">#d1d3d4</color>
<color name="list_header_background_color">#def1f1</color>
<color name="list_item_background_color">#f6fbfb</color>
<color name="fiori_primary_color">#009de0</color>
<color name="fiori_text_color">@color/black</color>
<color name="blue_button_normal">@color/fiori_primary_color</color>
<color name="blue_button_pressed">#007aad</color>
<color name="normal_button">#f3f3f3</color>
<color name="normal_button_pressed">#bfbfbf</color>
</resources>
@@ -21,16 +21,35 @@
<dimen name="tab_space_plus1">3dp</dimen>
<dimen name="tab_space_bottom_line">36sp</dimen>
<dimen name="tab_space_unselected_top">6sp</dimen>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="toolbar_separator_height">4dp</dimen>
<!-- Fragment -->
<dimen name="fragment_side_margin">20dp</dimen>
<!-- Toolbar -->
<dimen name="toolbar_separator_height">1dp</dimen>
<dimen name="toolbar_left_padding">@dimen/fragment_side_margin</dimen>
<dimen name="toolbar_height">60dp</dimen>
<!-- List -->
<dimen name="list_header_height">50dp</dimen>
<dimen name="list_row_height">80dp</dimen>
<dimen name="list_arrow_right_margin">10dp</dimen>
<!-- Values for buttons -->
<dimen name="about_button_top_bottom_margin">10dp</dimen>
<dimen name="about_button_side_margin">16dp</dimen>
<dimen name="about_button_height">80dp</dimen>
<dimen name="about_button_text_size">18sp</dimen>
<dimen name="home_button_height">80dp</dimen>
<dimen name="qr_code_label_height">50dp</dimen>
<dimen name="no_qr_code_button_height">50dp</dimen>
<dimen name="button_radius">3dp</dimen>
<dimen name="button_text_size">@dimen/default_text_size</dimen>
<!-- Values for text -->
<dimen name="default_text_size">16sp</dimen>
<dimen name="highlight_text_size">21sp</dimen>
<dimen name="list_header_text_size">18sp</dimen>
</resources>
@@ -343,4 +343,9 @@
<item name="android:textColor">@color/welter_light_gray</item>
</style>
<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
<item name="android:textColorPrimary">@color/toolbar_text_color</item>
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
</style>
</resources>
@@ -1,5 +1,5 @@
package com.sap.sailing.android.shared.data;
public abstract class AbstractCheckinData {
public abstract class BaseCheckinData {
}
@@ -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;
}
@@ -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();
@@ -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.
@@ -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));
}
}
@@ -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);
}
@@ -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);
@@ -77,6 +77,13 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.StartActivity"/>
</activity>
<activity
android:name=".ui.activities.BuoyActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.StartActivity"/>
</activity>
<activity
android:name=".ui.activities.TrackingActivity"
android:label="@string/title_activity_tracking"
Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

@@ -1,12 +1,18 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/background_material_dark"/>
android:drawable="@drawable/fiori_main_background"/>
<item>
<item android:bottom="60dp">
<bitmap
android:gravity="center"
android:src="@drawable/launch_screen_icon"/>
</item>
<item android:top="80dp">
<bitmap
android:src="@drawable/launch_screen_text"
android:gravity="center|clip_horizontal|clip_vertical"/>
</item>
</layer-list>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/start_tracking_button_normal"/>
</shape>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/stop_tracking_button_normal"/>
</shape>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/start_tracking_button_pressed"/>
</shape>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="@dimen/button_radius"/>
<solid android:color="@color/stop_tracking_button_pressed"/>
</shape>
@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/sap_green"/>
<corners
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip"
android:topLeftRadius="5dip"
android:topRightRadius="5dip"/>
</shape>
@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/white_less_transparent" />
<stroke
android:width="1dp"
android:color="@color/white" />
<corners
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip"
android:topLeftRadius="5dip"
android:topRightRadius="5dip" />
</shape>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/pressed_btn_green" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/normal_btn_green" />
</selector>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/pressed_btn_red" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/normal_btn_red" />
</selector>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

@@ -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"/>
@@ -5,7 +5,7 @@
android:layout_height="match_parent">
<View
android:id="@+id/top_bar"
android:id="@+id/toolbar_separator"
android:layout_width="fill_parent"
android:layout_height="4dp"
android:layout_alignParentLeft="true"
@@ -18,7 +18,7 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/start_tracking_box"
android:layout_below="@id/top_bar"
android:layout_below="@id/toolbar_separator"
android:baselineAligned="false"
android:orientation="horizontal">
@@ -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"/>
</LinearLayout>
</RelativeLayout>
@@ -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"
@@ -1,12 +1,13 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fiori_main_background">
<com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
android:theme="@style/AppTheme.Toolbar">
<LinearLayout
android:layout_width="match_parent"
@@ -21,7 +22,8 @@
android:layout_gravity="center"
android:lines="1"
android:singleLine="true"
android:textSize="16sp" />
android:textColor="@color/toolbar_text_color"
android:textSize="16sp"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:id="@+id/toolbar_subtitle"
@@ -30,53 +32,58 @@
android:layout_gravity="center"
android:lines="1"
android:singleLine="true"
android:textSize="12sp" />
android:textColor="@color/toolbar_text_color"
android:textSize="12sp"/>
</LinearLayout>
</com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar>
<View
android:id="@+id/toolbar_separator"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:layout_below="@id/toolbar"
android:background="@color/separator_color"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/stop_tracking"
android:layout_below="@id/toolbar"
android:layout_below="@id/toolbar_separator"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/tracking_linear_layout"
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="0dp" />
android:padding="0dp"/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
android:layout_weight="1"/>
</LinearLayout>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/stop_tracking"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_height="@dimen/tracking_button_height"
android:layout_above="@+id/title_page_indicator"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_marginRight="@dimen/fragment_side_margin"
android:layout_marginTop="0dp"
android:background="@drawable/rounded_btn_red"
android:background="@drawable/stop_tracking_button"
android:padding="0dp"
android:text="@string/stop_tracking"
android:textAllCaps="true"
android:textStyle="bold" />
android:textSize="@dimen/highlight_text_size"/>
<com.viewpagerindicator.CirclePageIndicator
android:id="@+id/title_page_indicator"
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@color/black"
android:paddingBottom="10dp"
android:paddingTop="10dp" />
android:layout_marginBottom="10dp"/>
</RelativeLayout>
@@ -3,13 +3,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/top_bar"
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_alignParentTop="true"
android:background="@color/sap_yellow"/>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
@@ -17,7 +10,7 @@
android:layout_alignParentBottom="true"
android:orientation="vertical">
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/license_button"
android:layout_width="match_parent"
android:layout_height="@dimen/about_button_height"
@@ -25,13 +18,12 @@
android:layout_marginLeft="@dimen/about_button_side_margin"
android:layout_marginRight="@dimen/about_button_side_margin"
android:layout_marginTop="@dimen/about_button_top_bottom_margin"
android:background="@drawable/rounded_btn_yellow"
android:background="@drawable/blue_button"
android:text="@string/license_information"
android:textAllCaps="false"
android:textSize="@dimen/about_button_text_size"
android:textStyle="bold"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/eula_button"
android:layout_width="match_parent"
android:layout_height="@dimen/about_button_height"
@@ -39,20 +31,19 @@
android:layout_marginLeft="@dimen/about_button_side_margin"
android:layout_marginRight="@dimen/about_button_side_margin"
android:layout_marginTop="@dimen/about_button_top_bottom_margin"
android:background="@drawable/rounded_btn_yellow"
android:background="@drawable/blue_button"
android:text="@string/eula"
android:textAllCaps="false"
android:textSize="@dimen/about_button_text_size"
android:textStyle="bold"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/system_information_application_version_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/about_button_side_margin"
android:text="@string/application_version"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/system_information_application_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -66,7 +57,6 @@
android:layout_above="@+id/linearLayout"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/top_bar"
android:layout_marginTop="@dimen/about_header_margin_top"
android:fillViewport="false">
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fiori_main_background">
<TextView
android:id="@+id/buoy_Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="@dimen/tracking_button_text_size"/>
<Button
android:id="@+id/start_tracking"
android:layout_width="match_parent"
android:layout_height="@dimen/tracking_button_height"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/regatta_button_margin"
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_marginRight="@dimen/fragment_side_margin"
android:background="@drawable/start_tracking_button"
android:padding="@dimen/regatta_button_padding"
android:text="@string/start_tracking"
android:textSize="@dimen/tracking_button_text_size"/>
</RelativeLayout>
@@ -1,8 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
@@ -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"
/>
<com.sap.sailing.android.shared.ui.customviews.AutoResizeLightTextView
android:id="@+id/compass_bearing_text_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text="@string/initial_hyphen_degrees"
android:layout_centerInParent="true"
android:gravity="center"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="@dimen/fragment_side_margin"
android:text="@string/initial_hyphen_degrees"
android:textSize="124sp"/>
</RelativeLayout>
@@ -2,7 +2,9 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
xmlns:Tools="http://schemas.android.com/apk/res-auto"
android:background="@drawable/fiori_main_background">
<RelativeLayout
android:id="@+id/image"
@@ -38,15 +40,15 @@
android:paddingRight="@dimen/activity_horizontal_margin"
android:src="@drawable/ic_menu_camera"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/add_photo_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:text="@string/add_team_photo"
android:textColor="@color/white"/>
android:textColor="@color/fiori_text_color"/>
</LinearLayout>
<LinearLayout
@@ -55,111 +57,126 @@
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@color/white_transparent"
android:background="@color/white_less_transparent"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="gone">
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyle"
android:indeterminate="true"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/upload_progress_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:text="@string/upload_in_progress"
android:textColor="@color/white"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
</LinearLayout>
<View
android:id="@+id/image_bottom"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_alignParentBottom="true"/>
<LinearLayout
android:id="@+id/retry_upload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/image_bottom"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@color/white_transparent"
android:orientation="horizontal"
android:visibility="gone"
android:layout_marginBottom="107dp"
android:background="@color/white_less_transparent"
android:clickable="true"
android:onClick="retryUpload"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="visible">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/retry_upload_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableLeft="@drawable/ic_action_navigation_refresh"
android:drawablePadding="8dp"
android:paddingRight="8dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="8dp"
android:text="@string/upload_retry"
android:textColor="@color/white"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
</LinearLayout>
<LinearLayout
android:id="@+id/competitor_info_layout"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:minHeight="40dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/black_transparent"
android:background="@color/competitor_background_color"
android:baselineAligned="false"
android:measureWithLargestChild="false"
android:orientation="horizontal"
android:padding="10dp">
android:paddingBottom="10dp"
android:paddingTop="10dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/competitor_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_weight="1"
android:gravity="start|center_vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:gravity="start"
android:text="@string/empty"
android:textColor="@color/white"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"
android:textStyle="bold"/>
<RelativeLayout
android:layout_width="10dp"
android:layout_height="fill_parent"
android:layout_weight="0.53"
android:cropToPadding="true"
android:paddingTop="3dp"
android:paddingBottom="3dp"
android:gravity="end"
android:paddingBottom="3dp"
android:paddingLeft="5dp"
android:paddingRight="5dp">
android:paddingRight="5dp"
android:paddingTop="3dp">
<ImageView
android:id="@+id/flag_image"
android:layout_width="20dp"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:contentDescription="@string/content_description_flag_icon"
android:adjustViewBounds="true"
android:textColor="@color/white"/>
android:contentDescription="@string/content_description_flag_icon"
android:scaleType="fitXY"
android:textColor="@color/fiori_text_color"/>
</RelativeLayout>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/sail_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/fragment_side_margin"
android:gravity="end|center_vertical"
android:padding="0dp"
android:text="@string/empty"
android:textColor="@color/white"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"
android:textStyle="bold"/>
</LinearLayout>
<LinearLayout
@@ -167,49 +184,40 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/competitor_info_layout"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="15dp"
android:layout_marginRight="15dp"
android:layout_marginEnd="15dp"
android:background="@drawable/background_transparent_box"
android:layout_marginRight="15dp"
android:background="@color/white_less_transparent"
android:orientation="horizontal"
android:padding="0dp">
<Button
android:id="@+id/change_photo_button"
android:layout_width="35dp"
android:layout_height="35dp"
android:background="@drawable/stift"/>
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/edit_pencil"/>
</LinearLayout>
<View
android:id="@+id/bottom_bar"
android:layout_width="fill_parent"
android:layout_height="4dp"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:layout_alignBottom="@+id/competitor_info_layout"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/sap_yellow"/>
android:background="@color/separator_color"/>
<View
android:id="@+id/top_bar"
android:layout_width="fill_parent"
android:layout_height="4dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@color/sap_yellow"/>
</RelativeLayout>
<ScrollView
android:id="@+id/scroll_view"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_above="@+id/start_tracking_box"
android:layout_below="@id/image"
android:layout_gravity="center"
android:background="@color/black"
android:isScrollContainer="true"
android:orientation="vertical"
android:scrollbars="vertical">
@@ -218,6 +226,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- deprecated layout -->
<RelativeLayout
android:id="@+id/thank_you_layout"
android:layout_width="match_parent"
@@ -225,244 +234,234 @@
android:baselineAligned="false"
android:measureWithLargestChild="false"
android:orientation="horizontal"
android:padding="10dp"
android:visibility="invisible">
android:paddingTop="10dp"
android:visibility="gone">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/thank_you_note"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:padding="0dp"
android:text="@string/thank_you_you_successfully_participated"
android:textColor="@color/white"
android:textColor="@color/fiori_text_color"
android:textStyle="bold"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/start_date_layout"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_height="match_parent"
android:measureWithLargestChild="false"
android:orientation="horizontal"
android:padding="10dp">
android:orientation="horizontal">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/regatta_starts_in"
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:gravity="center"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp"
android:text="@string/regatta_starts_in"
android:textColor="@color/white"
android:textStyle="bold"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<LinearLayout
android:id="@+id/three_boxes_regatta_starts"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/regatta_starts_in"
android:baselineAligned="false"
android:gravity="center"
android:gravity="center_horizontal"
android:measureWithLargestChild="false"
android:orientation="horizontal"
android:padding="10dp">
tools:visibility="gone">
<LinearLayout
android:id="@+id/three_boxes_days_box"
android:layout_width="80dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/background_box"
android:layout_marginLeft="@dimen/regatta_start_date_side_margin"
android:layout_marginRight="@dimen/regatta_start_date_side_margin"
android:baselineAligned="false"
android:gravity="center"
android:measureWithLargestChild="false"
android:orientation="vertical"
android:padding="0dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/starts_in_days"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="0dp"
android:textColor="@color/white"
android:textSize="40sp"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/highlight_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/starts_in_days_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="0dp"
android:text="@string/days"
android:singleLine="true"
android:layout_marginBottom="5dp"
android:textColor="@color/white"/>
android:text="@string/days"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
</LinearLayout>
<View
android:layout_width="@dimen/countdown_separator_width"
android:layout_height="@dimen/countdown_separator_height"
android:layout_gravity="center_vertical"
android:background="@color/separator_color"/>
<LinearLayout
android:id="@+id/three_boxes_hours_box"
android:layout_width="80dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/background_box"
android:layout_marginLeft="@dimen/regatta_start_date_side_margin"
android:layout_marginRight="@dimen/regatta_start_date_side_margin"
android:baselineAligned="false"
android:gravity="center"
android:measureWithLargestChild="false"
android:orientation="vertical"
android:padding="0dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/starts_in_hours"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="0dp"
android:textColor="@color/white"
android:textSize="40sp"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/highlight_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/starts_in_hours_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="0dp"
android:text="@string/hours"
android:singleLine="true"
android:layout_marginBottom="5dp"
android:textColor="@color/white"/>
android:text="@string/hours"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
</LinearLayout>
<View
android:layout_width="@dimen/countdown_separator_width"
android:layout_height="@dimen/countdown_separator_height"
android:layout_gravity="center_vertical"
android:background="@color/separator_color"/>
<LinearLayout
android:id="@+id/three_boxes_minutes_box"
android:layout_width="80dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/background_box"
android:layout_marginLeft="@dimen/regatta_start_date_side_margin"
android:layout_marginRight="@dimen/regatta_start_date_side_margin"
android:baselineAligned="false"
android:gravity="center"
android:measureWithLargestChild="false"
android:orientation="vertical"
android:padding="0dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/starts_in_minutes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="0dp"
android:textColor="@color/white"
android:textSize="40sp"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/highlight_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/starts_in_minutes_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="0dp"
android:text="@string/minutes"
android:singleLine="true"
android:layout_marginBottom="5dp"
android:textColor="@color/white"/>
android:text="@string/minutes"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
</ScrollView>
<RelativeLayout
android:id="@+id/start_tracking_box"
android:layout_width="fill_parent"
android:layout_height="200dp"
android:layout_above="@id/bottomLayout"
android:background="@color/black">
<View
android:id="@+id/white_bar"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@color/white_transparent"/>
android:layout_width="match_parent"
android:layout_height="@dimen/regatta_button_layout_height"
android:layout_above="@+id/bottom_announcement">
<LinearLayout
android:id="@+id/event_buttons"
android:layout_width="match_parent"
android:layout_height="@dimen/regatta_button_height"
android:layout_below="@id/white_bar"
android:layout_above="@+id/layout_start_tracking"
android:layout_marginBottom="@dimen/regatta_button_margin"
android:orientation="horizontal">
<com.sap.sailing.android.tracking.app.customviews.OpenSansButton
<Button
android:id="@+id/show_event_button"
android:layout_width="0dp"
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:padding="@dimen/regatta_button_padding"
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_weight="1"
android:background="@drawable/blue_button"
android:padding="@dimen/regatta_button_padding"
android:text="@string/show_event"
android:background="@drawable/rounded_btn_blue"
android:textAllCaps="true"
android:textStyle="bold"
android:textSize="@dimen/button_text_size"
tools:text="Show Event"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/show_leaderboards_button"
android:layout_width="0dp"
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:layout_weight="1"
android:background="@drawable/rounded_btn_yellow"
android:background="@drawable/blue_button"
android:padding="@dimen/regatta_button_padding"
android:text="@string/show_leaderboard"
android:textAllCaps="true"
android:textStyle="bold"/>
android:textSize="@dimen/button_text_size"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/layout_start_tracking"
android:layout_width="match_parent"
android:layout_height="@dimen/regatta_button_height"
android:layout_below="@+id/event_buttons">
android:layout_height="@dimen/tracking_button_height"
android:layout_alignParentBottom="true"
android:layout_marginTop="@dimen/regatta_button_margin">
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
<Button
android:id="@+id/start_tracking"
android:layout_width="fill_parent"
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:background="@drawable/rounded_btn_green"
android:layout_marginLeft="@dimen/fragment_side_margin"
android:layout_marginRight="@dimen/fragment_side_margin"
android:background="@drawable/start_tracking_button"
android:padding="@dimen/regatta_button_padding"
android:text="@string/start_tracking"
android:textAllCaps="true"
android:textStyle="bold"/>
android:textSize="@dimen/tracking_button_text_size"/>
</RelativeLayout>
</RelativeLayout>
<RelativeLayout
android:id="@+id/bottomLayout"
android:layout_width="match_parent"
android:layout_height="40dp"
<TextView
android:id="@+id/bottom_announcement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/darker_gray">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:id="@+id/bottom_announcement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/please_listen_to_announcements"
android:textColor="@color/white"/>
</RelativeLayout>
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"/>
</RelativeLayout>
@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
@@ -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"/>
<RelativeLayout
android:layout_width="fill_parent"
@@ -29,11 +27,12 @@
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:textColor="@color/white"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="@dimen/fragment_side_margin"
android:singleLine="true"
android:textSize="124sp"
android:textStyle="bold"
tools:text="13.556Kn"/>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
@@ -1,21 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:paddingTop="15dp">
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:paddingTop="15dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/tracking_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:paddingLeft="10dp"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="10dp"
android:text="@string/tracking_time" />
android:text="@string/tracking_time"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/wait_for_gps"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -24,7 +26,9 @@
android:layout_toRightOf="@+id/tracking_time"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="@string/waiting_for_gps" />
android:text="@string/waiting_for_gps"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.AutoResizeLightTextView
android:id="@+id/tracking_time_label"
@@ -33,10 +37,10 @@
android:layout_marginBottom="0dp"
android:gravity="center"
android:paddingBottom="0dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="@dimen/fragment_side_margin"
android:text="@string/initial_timer_text_zerozero"
android:textSize="100sp"
tools:ignore="InconsistentLayout" />
tools:ignore="InconsistentLayout"/>
</RelativeLayout>
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/scroll_view"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="402dp"
android:layout_gravity="center"
@@ -14,146 +13,155 @@
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black">
android:background="@color/tracking_status_row_color">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/mode_label"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/gps_quality"
android:layout_below="@+id/tracking_status_label"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="10dp"
android:text="@string/tracking_mode"/>
android:text="@string/tracking_mode"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/mode_label"
android:layout_alignBottom="@id/mode_label"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:paddingRight="10dp"
android:layout_alignParentRight="true"
android:paddingLeft="10dp"
android:paddingRight="@dimen/fragment_side_margin"
android:text="@string/tracking_mode_caching"
android:textColor="@color/sap_green"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/tracking_unsent_fixes_label"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_below="@+id/mode_label"
android:gravity="center_vertical"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:text="@string/tracking_unsent_fixes"/>
android:text="@string/tracking_unsent_fixes"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/tracking_unsent_fixes"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_alignBaseline="@id/tracking_unsent_fixes_label"
android:layout_alignBottom="@id/tracking_unsent_fixes_label"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:paddingRight="10dp"
android:layout_alignParentRight="true"
android:paddingLeft="10dp"
android:text="@string/none"/>
android:paddingRight="@dimen/fragment_side_margin"
android:text="@string/none"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/tracking_status_label"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_below="@+id/tracking_unsent_fixes_label"
android:layout_alignParentTop="true"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="10dp"
android:text="@string/tracking_status"/>
android:text="@string/tracking_status"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/tracking_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/tracking_status_label"
android:layout_alignBottom="@id/tracking_status_label"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:paddingRight="10dp"
android:layout_alignParentRight="true"
android:paddingLeft="10dp"
android:paddingRight="@dimen/fragment_side_margin"
android:text="@string/tracking_status_tracking"
android:textColor="@color/sap_green"/>
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<LinearLayout
android:id="@+id/gps_quality_info_layout"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_alignParentRight="true"
android:layout_alignBottom="@+id/gps_quality"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/gps_accuracy_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="9dp"
android:paddingLeft="9dp"
android:text=""/>
android:text=""
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<com.sap.sailing.android.shared.ui.customviews.SignalQualityIndicatorView
android:id="@+id/gps_quality_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/fragment_side_margin"
android:contentDescription="@string/signal_accuracy_indicator_view_description"
android:focusable="true"
android:paddingRight="10dp"
android:paddingLeft="10dp"
app:signalQuality="none"/>
</LinearLayout>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
<TextView
android:id="@+id/gps_quality"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_below="@+id/tracking_unsent_fixes_label"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingLeft="@dimen/fragment_side_margin"
android:paddingRight="10dp"
android:text="@string/tracking_gps_accuracy"/>
android:text="@string/tracking_gps_accuracy"
android:textColor="@color/fiori_text_color"
android:textSize="@dimen/default_text_size"/>
<!-- Separators -->
<View
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/mode_label"
android:background="@android:color/darker_gray"/>
<View
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/tracking_status_label"
android:background="@android:color/darker_gray"/>
<View
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/tracking_unsent_fixes_label"
android:background="@android:color/darker_gray"/>
<View
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/gps_quality"
android:background="@android:color/darker_gray"/>
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_below="@id/tracking_status_label"
android:background="@android:color/darker_gray"/>
</RelativeLayout>
</ScrollView>
@@ -1,21 +1,20 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
@@ -25,6 +24,7 @@
android:layout_gravity="center"
android:lines="1"
android:singleLine="true"
android:textColor="@color/toolbar_text_color"
android:textSize="16sp"/>
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
@@ -34,6 +34,7 @@
android:layout_gravity="center"
android:lines="1"
android:singleLine="true"
android:textColor="@color/toolbar_text_color"
android:textSize="12sp"/>
</LinearLayout>
@@ -41,10 +42,10 @@
</com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar>
<View
android:id="@+id/top_bar"
android:layout_width="fill_parent"
android:layout_height="4dp"
android:background="@color/sap_yellow"/>
android:id="@+id/toolbar_separator"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_separator_height"
android:background="@color/separator_color"/>
<FrameLayout
android:id="@+id/content_frame"
@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/colorPrimary"
tools:ignore="Overdraw" >
<ImageView
android:id="@+id/nextPage"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/empty"
android:src="@drawable/yellow_arrow_right"
android:layout_marginTop="13dp"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"
android:textColor="@color/white" />
<com.sap.sailing.android.tracking.app.customviews.OpenSansTextView
android:id="@+id/regattaName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/nextPage"
android:layout_toStartOf="@+id/nextPage"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:singleLine="true"
android:textColor="@color/white" />
</RelativeLayout>
@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
tools:ignore="Overdraw">
<com.sap.sailing.android.tracking.app.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="14dp"
android:textSize="18sp"
android:background="@color/colorPrimary"
android:textColor="@color/white"
android:text="@string/your_regattas" />
</RelativeLayout>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/options_menu_settings"
android:icon="@drawable/settings_grey"
android:title="@string/options_menu_settings"
app:showAsAction=""/>
<item
android:id="@+id/options_menu_checkout"
android:icon="@drawable/ic_menu_info_details"
android:title="@string/options_menu_checkout"
app:showAsAction=""/>
<item
android:id="@+id/options_menu_info"
android:title="@string/about"/>
</menu>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Values for regatta buttons-->
<dimen name="regatta_button_layout_height">190dp</dimen>
<dimen name="regatta_button_margin">10dp</dimen>
<dimen name="regatta_button_padding">10dp</dimen>
<dimen name="tracking_button_height">120dp</dimen>
</resources>
@@ -3,6 +3,16 @@
<style name="AppTheme" parent="AppTheme.Base">
<!-- Customize your theme using Material Design here. -->
<item name="buttonStyle">@style/shadowLessButtonStyle</item>
<item name="android:colorPrimaryDark">@color/fiori_primary_color</item>
</style>
<style name="shadowLessButtonStyle" parent="@android:style/Widget.Material.Button.Borderless">
<item name="android:textAppearance">@style/Base.TextAppearance.AppCompat.Button</item>
<item name="android:textAllCaps">false</item>
<item name="android:textColor">@color/white</item>
<item name="android:elevation">0dp</item>
<item name="android:stateListAnimator">@null</item>
</style>
</resources>
@@ -5,8 +5,8 @@
<string name="preference_server_checkout_path" translatable="false">/sailingserver/api/v1/leaderboards/{leaderboard-name}/device_mappings/end</string>
<string name="preference_server_event_path" translatable="false">/sailingserver/api/v1/events/{event_id}</string>
<string name="preference_server_event_url" translatable="false">/gwt/Home.html?navigationTab=Regattas#EventPlace:eventId=%s</string>
<string name="preference_server_leaderboard_path" translatable="false">/sailingserver/api/v1/leaderboards/{leaderboard_name}</string>
<string name="preference_server_competitor_path" translatable="false">/sailingserver/api/v1/competitors/{competitor_id}</string>
<string name="preference_server_team_info_path" translatable="false">/sailingserver/api/v1/competitors/{competitor_id}/team</string>
<string name="preference_server_team_image_upload_path" translatable="false">/sailingserver/api/v1/competitors/{competitor_id}/team/image</string>
<string name="preferece_server_mark_path" translatable="false">/sailingserver/api/v1/leaderboards/{leaderboardName}/marks/{markId}</string>
</resources>
@@ -2,13 +2,24 @@
<color name="white">#FFFFFF</color>
<color name="white_transparent">#55FFFFFF</color>
<color name="white_less_transparent">#CCFFFFFF</color>
<color name="white_less_transparent">#f3f3f3</color>
<color name="green">#00FF00</color>
<color name="gray">#333333</color>
<color name="darker_gray">#242424</color>
<color name="black_transparent">#55000000</color>
<color name="colorPrimary">@color/gray</color>
<color name="colorPrimaryDark">@color/colorPrimary</color>
<color name="colorAccent">@color/sap_yellow</color>
<color name="colorAccent">@color/fiori_primary_color</color>
<color name="start_tracking_button_normal">#0e7733</color>
<color name="start_tracking_button_pressed">#08451e</color>
<color name="stop_tracking_button_normal">#cd201b</color>
<color name="stop_tracking_button_pressed">#991814</color>
<color name="competitor_background_color">#B3f3f3f3</color>
<color name="tracking_status_row_color">#f6fbfb</color>
</resources>
@@ -5,9 +5,14 @@
<!-- <dimen name="activity_vertical_margin">16dp</dimen> -->
<!-- Values for regatta buttons-->
<dimen name="regatta_button_height">90dp</dimen>
<dimen name="regatta_button_side_margin">4dp</dimen>
<dimen name="regatta_button_layout_height">140dp</dimen>
<dimen name="regatta_button_height">@dimen/no_qr_code_button_height</dimen>
<dimen name="regatta_button_margin">10dp</dimen>
<dimen name="regatta_button_padding">10dp</dimen>
<dimen name="tracking_button_height">80dp</dimen>
<dimen name="tracking_button_text_size">@dimen/highlight_text_size</dimen>
<dimen name="regatta_start_date_side_margin">22dp</dimen>
<dimen name="countdown_separator_height">35dp</dimen>
<dimen name="countdown_separator_width">2dp</dimen>
</resources>
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- <dimen name="fragment_padding">10dp</dimen>
<dimen name="list_view_height">100dp</dimen>
<dimen name="team_picture_height">150dp</dimen>
<dimen name="team_picture_negative_margin">-25dp</dimen> -->
</resources>
@@ -4,7 +4,7 @@
<!-- Base application theme. -->
<style name="AppTheme" parent="AppTheme.Base"/>
<style name="AppTheme.Base" parent="Theme.AppCompat.NoActionBar">
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
@@ -20,10 +20,18 @@
<!-- You can also set colorControlNormal, colorControlActivated colorControlHighlight & colorSwitchThumbNormal. -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="buttonStyle">@style/buttonStyle</item>
</style>
<style name="launchScreenTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/launch_screen</item>
</style>
<style name="buttonStyle" parent="Base.Widget.AppCompat.Button">
<item name="android:textAllCaps">false</item>
<item name="android:textColor">@color/white</item>
</style>
</resources>
@@ -16,18 +16,18 @@
<resources>
<bool name="default_circle_indicator_centered">true</bool>
<color name="default_circle_indicator_fill_color">#FFFFFFFF</color>
<color name="default_circle_indicator_page_color">#00000000</color>
<color name="default_circle_indicator_fill_color">@color/fiori_primary_color</color>
<color name="default_circle_indicator_page_color">#999999</color>
<integer name="default_circle_indicator_orientation">0</integer>
<dimen name="default_circle_indicator_radius">3dp</dimen>
<bool name="default_circle_indicator_snap">false</bool>
<color name="default_circle_indicator_stroke_color">#FFDDDDDD</color>
<dimen name="default_circle_indicator_stroke_width">1dp</dimen>
<dimen name="default_circle_indicator_stroke_width">0dp</dimen>
<dimen name="default_line_indicator_line_width">12dp</dimen>
<dimen name="default_line_indicator_gap_width">4dp</dimen>
<dimen name="default_line_indicator_stroke_width">1dp</dimen>
<color name="default_line_indicator_selected_color">#FF33B5E5</color>
<color name="default_line_indicator_selected_color">@color/fiori_primary_color</color>
<color name="default_line_indicator_unselected_color">#FFBBBBBB</color>
<bool name="default_line_indicator_centered">true</bool>
@@ -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);
}
}
@@ -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() {
}
@@ -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");
}
}
@@ -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);
}
}
}
@@ -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());
@@ -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);
}
});
}
}
@@ -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());
@@ -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
@@ -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();
@@ -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();
}
}
}
}
@@ -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);
}
}
@@ -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;
}
@@ -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;
}
}
@@ -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<Cursor> {
@@ -86,18 +95,21 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
/**
* Perform a checkin request and launch RegattaAcitivity afterwards
* <p/>
* 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<Cursor> 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<Cursor> 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<Cursor> 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();
}
}
@@ -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;
}
@@ -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));
}
}
});
@@ -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);
@@ -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());
@@ -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,
@@ -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);
}
}
@@ -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<String> 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() {
}
}
}
@@ -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());
}
}
}
@@ -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<String> getCheckinUrls(Context context) {
List<String> 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<ContentProviderOperation> 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<ContentProviderOperation> 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<ContentProviderOperation> 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;
@@ -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;
}
@@ -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;
}
}
@@ -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);
}
}
Loaded 100 of 134 files, more files were not shown because too many files have changed in this diff. Show more