diff --git a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml
index 22905108ea0..7d3bec6dfd3 100644
--- a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml
+++ b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml
@@ -77,6 +77,13 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.StartActivity"/>
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/res/menu/buoy_menu.xml b/mobile/com.sap.sailing.android.tracking.app/res/menu/buoy_menu.xml
new file mode 100644
index 00000000000..a374cc3c836
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/res/menu/buoy_menu.xml
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java
index dd22187ecbf..780515d5327 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/provider/AnalyticsDatabase.java
@@ -39,7 +39,7 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
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.COMPETITORS + " ON ("
+ + "." + 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
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/BuoyActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/BuoyActivity.java
new file mode 100644
index 00000000000..a8fec2c1dd5
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/BuoyActivity.java
@@ -0,0 +1,153 @@
+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.CheckinUrlInfo;
+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();
+
+ public EventInfo event;
+ public MarkInfo mark;
+ public LeaderboardInfo leaderboard;
+ public CheckinUrlInfo checkinUrl;
+ 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);
+ checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest);
+ 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);
+ }
+ }
+
+ public void startTrackingActivity(String checkinDigest) {
+ Intent intent = new Intent(this, TrackingActivity.class);
+ intent.putExtra(getString(R.string.tracking_activity_checkin_digest_parameter), checkinDigest);
+ startActivity(intent);
+ }
+
+ private void displayCheckoutConfirmationDialog() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(R.string.warning);
+ builder.setMessage(R.string.checkout_warning_message);
+ builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ checkout();
+ }
+ });
+ builder.setNegativeButton(R.string.no, null);
+ builder.show();
+ }
+
+ /**
+ * Check out from regatta;
+ */
+ public void checkout() {
+ CheckoutHelper checkoutHelper = new CheckoutHelper();
+ checkoutHelper.checkoutMark(this, leaderboard.name, event.server, mark.markId, new NetworkHelper.NetworkHelperSuccessListener() {
+ @Override
+ public void performAction(JSONObject response) {
+ DatabaseHelper.getInstance().deleteRegattaFromDatabase(BuoyActivity.this, event.checkinDigest);
+ dismissProgressDialog();
+ finish();
+ }
+ }, new NetworkHelper.NetworkHelperFailureListener() {
+ @Override
+ public void performAction(NetworkHelper.NetworkHelperError e) {
+ dismissProgressDialog();
+ showErrorPopup(R.string.error,
+ R.string.error_could_not_complete_operation_on_server_try_again);
+ }
+ });
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/BuoyFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/BuoyFragment.java
new file mode 100644
index 00000000000..7975203e321
--- /dev/null
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/BuoyFragment.java
@@ -0,0 +1,33 @@
+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.TextView;
+
+import com.sap.sailing.android.shared.util.ViewHelper;
+import com.sap.sailing.android.tracking.app.R;
+
+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));
+ return view;
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java
index 956d4ec284b..d5cfb662be9 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java
@@ -39,6 +39,7 @@ 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;
@@ -170,7 +171,7 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
}
HttpJsonPostRequest request = new HttpJsonPostRequest(getActivity(), new URL(checkinData.checkinURL), requestObject.toString());
NetworkHelper.getInstance(getActivity())
- .executeHttpJsonRequestAsync(request, new CheckinListener(checkinData.checkinDigest), new CheckinErrorListener(checkinData.checkinDigest));
+ .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();
@@ -227,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);
}
@@ -343,7 +349,8 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
Cursor cursor = (Cursor) adapter.getItem(position - 1);
String checkinDigest = cursor.getString(cursor.getColumnIndex(AnalyticsContract.Event.EVENT_CHECKIN_DIGEST));
- startRegatta(checkinDigest);
+ int type = cursor.getInt(cursor.getColumnIndex(AnalyticsContract.Checkin.CHECKIN_TYPE));
+ startRegatta(checkinDigest, type);
}
}
@@ -363,17 +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();
- // TODO: Start MarkActivity
- startRegatta(checkinDigest);
+ startRegatta(checkinDigest, type);
}
}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
index 9b763e84591..db91bb8eced 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
@@ -69,7 +69,7 @@ public class AppPreferences extends BaseAppPreferences {
public String getServerMarkPath(String leaderboardName, String markId) {
String path = context.getString(R.string.preferece_server_mark_path);
- return path.replace("{leaderboard_name}", leaderboardName).replace("{markId}", markId);
+ return path.replace("{leaderboardName}", leaderboardName).replace("{markId}", markId);
}
public int getGPSFixInterval() {