Merge branch 'bug3959'

This commit is contained in:
Peter Siegmund committed 2016-12-05 11:03:51 +01:00
commit 98dac9d982
18 files changed
+154 -182

No files matched your search

@@ -4,6 +4,11 @@
<div id="mainContent">
<h4 class="articleHeadline">What's New - SAP Sailing Buoy Pinger</h4>
<div class="innerContent">
<h5 class="articleSubheadline">November 2016</h5>
<ul class="bulletList">
<li>Obtain existing mark positions from server if already set</li>
</ul>
<h5 class="articleSubheadline">October 2016</h5>
<ul class="bulletList">
<li>Improved pinging accuracy by using a more controllable API:
@@ -1,5 +1,7 @@
package com.sap.sailing.android.shared.ui.activities;
public abstract class AbstractRegattaActivity extends CheckinDataActivity {
import com.sap.sailing.android.shared.data.BaseCheckinData;
public abstract class AbstractRegattaActivity<C extends BaseCheckinData> extends CheckinDataActivity<C> {
}
@@ -1,19 +1,20 @@
package com.sap.sailing.android.shared.ui.activities;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.sap.sailing.android.shared.BuildConfig;
import com.sap.sailing.android.shared.R;
import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
import android.app.Dialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.sap.sailing.android.shared.BuildConfig;
import com.sap.sailing.android.shared.R;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
public abstract class AbstractStartActivity extends CheckinDataActivity {
public abstract class AbstractStartActivity<C extends BaseCheckinData> extends CheckinDataActivity<C> {
private final static String TAG = AbstractStartActivity.class.getName();
protected OpenSansToolbar toolbar;
@@ -1,16 +1,13 @@
package com.sap.sailing.android.shared.ui.activities;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import com.sap.sailing.android.shared.R;
import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.util.CheckinDataHandler;
public abstract class CheckinDataActivity extends AbstractBaseActivity implements CheckinDataHandler {
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
@Override
public abstract void onCheckinDataAvailable(BaseCheckinData data);
public abstract class CheckinDataActivity<C extends BaseCheckinData> extends AbstractBaseActivity implements CheckinDataHandler<C> {
/**
* Shows a pop-up-dialog that informs the user than an DB-operation has failed.
@@ -2,6 +2,6 @@ package com.sap.sailing.android.shared.util;
import com.sap.sailing.android.shared.data.BaseCheckinData;
public interface CheckinDataHandler {
public void onCheckinDataAvailable(BaseCheckinData data);
public interface CheckinDataHandler<C extends BaseCheckinData> {
public void onCheckinDataAvailable(C data);
}
@@ -53,7 +53,7 @@ public abstract class AbstractHomeFragment extends BaseFragment {
}
private void showNoQRCodeMessage() {
((AbstractStartActivity) getActivity()).showErrorPopup(R.string.no_qr_code_popup_title,
((AbstractStartActivity<?>) getActivity()).showErrorPopup(R.string.no_qr_code_popup_title,
R.string.no_qr_code_popup_message);
}
@@ -13,31 +13,6 @@ import java.util.Locale;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.internal.view.ContextThemeWrapper;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
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;
@@ -65,7 +40,31 @@ 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;
public class RegattaActivity extends AbstractRegattaActivity
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.internal.view.ContextThemeWrapper;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class RegattaActivity extends AbstractRegattaActivity<CheckinData>
implements RegattaFragment.FragmentWatcher, UploadResponseHandler {
private final static String TAG = RegattaActivity.class.getName();
@@ -419,12 +418,11 @@ public class RegattaActivity extends AbstractRegattaActivity
}
@Override
public void onCheckinDataAvailable(BaseCheckinData checkinData) {
public void onCheckinDataAvailable(CheckinData checkinData) {
if (checkinData != null) {
CheckinData data = (CheckinData) checkinData;
try {
if (data instanceof CompetitorCheckinData) {
CompetitorCheckinData competitorCheckinData = (CompetitorCheckinData) data;
if (checkinData instanceof CompetitorCheckinData) {
CompetitorCheckinData competitorCheckinData = (CompetitorCheckinData) checkinData;
DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, checkinDigest);
DatabaseHelper.getInstance().storeCompetitorCheckinRow(this, competitorCheckinData.getEvent(), competitorCheckinData.getCompetitor(),
competitorCheckinData.getLeaderboard(), competitorCheckinData.getCheckinUrl());
@@ -24,7 +24,7 @@ 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 {
public class StartActivity extends AbstractStartActivity<CheckinData> {
private AppPreferences prefs;
private final String TAG = StartActivity.class.getName();
@@ -102,12 +102,11 @@ public class StartActivity extends AbstractStartActivity {
}
@Override
public void onCheckinDataAvailable(BaseCheckinData data) {
if (data != null && data instanceof CheckinData) {
CheckinData checkinData = (CheckinData) data;
if (!checkinData.isUpdate()) {
public void onCheckinDataAvailable(CheckinData data) {
if (data != null) {
if (!data.isUpdate()) {
getHomeFragment().displayUserConfirmationScreen(data);
} else if (checkinData.isUpdate()) {
} else if (data.isUpdate()) {
updateRegatta(data);
}
}
@@ -13,12 +13,6 @@ import org.json.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import android.content.DialogInterface;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
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;
@@ -50,16 +44,21 @@ import com.sap.sailing.server.gateway.deserialization.impl.VenueJsonDeserializer
import com.sap.sse.common.Util;
import com.sap.sse.shared.media.ImageDescriptor;
import android.content.DialogInterface;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
public class CheckinManager {
private final static String TAG = CheckinManager.class.getName();
private BaseCheckinData checkinData;
private CheckinDataActivity activity;
private CheckinData checkinData;
private CheckinDataActivity<CheckinData> activity;
private AppPreferences prefs;
private String url;
private boolean update;
public CheckinManager(String url, CheckinDataActivity activity, boolean update) {
public CheckinManager(String url, CheckinDataActivity<CheckinData> activity, boolean update) {
this.activity = activity;
this.url = url;
prefs = new AppPreferences(activity);
@@ -317,7 +316,7 @@ public class CheckinManager {
activity.onCheckinDataAvailable(getCheckinData());
}
public BaseCheckinData getCheckinData() {
public CheckinData getCheckinData() {
return checkinData;
}
@@ -14,7 +14,7 @@
<string name="set">set</string>
<string name="unknown">n/a</string>
<string name="not_set">not set</string>
<string name="mark_list_accuracy">(Accurary ca. %1$sm)</string>
<string name="mark_list_accuracy">(Accuracy ca. %1$sm)</string>
<string name="buoy_detail_accuracy_ca" translatable="false">ca. %1$.02fm</string>
<string name="buoy_detail_distance" translatable="false">%1$.02fm</string>
<string name="accuracy">GPS Accuracy</string>
@@ -39,8 +39,7 @@ public class MarkAdapter extends ResourceCursorAdapter {
if (accuracy == FlatGPSFixJsonSerializer.NOT_AVAILABLE_THROUGH_SERVER) {
accuracyString = context.getString(R.string.set);
} else {
accuracyString = context.getString(R.string.set) + " " +
String.format(context.getString(R.string.mark_list_accuracy), df.format(accuracy));
accuracyString = context.getString(R.string.set) + " " + context.getString(R.string.mark_list_accuracy, df.format(accuracy));
}
setText = accuracyString;
}
@@ -8,7 +8,6 @@ import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.util.CheckinManager;
import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData;
import com.sap.sailing.android.shared.data.BaseCheckinData;
public class MarkerService extends IntentService implements CheckinManager.DataChangedListner{
private static String TAG = MarkerService.class.getName();
@@ -26,12 +25,11 @@ public class MarkerService extends IntentService implements CheckinManager.Data
}
@Override
public void handleData(BaseCheckinData data) {
public void handleData(CheckinData data) {
if (data != null) {
try {
CheckinData checkinData = (CheckinData) data;
DatabaseHelper helper = DatabaseHelper.getInstance();
helper.updateMarks(this, checkinData.marks, checkinData.getLeaderboard());
helper.updateMarks(this, data);
} catch (DatabaseHelper.GeneralDatabaseHelperException e) {
Log.e(TAG, "Error trying to analyze mark checkin data", e);
}
@@ -1,5 +1,19 @@
package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import com.sap.sailing.android.buoy.positioning.app.BuildConfig;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.ui.fragments.RegattaFragment;
import com.sap.sailing.android.buoy.positioning.app.util.AboutHelper;
import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences;
import com.sap.sailing.android.buoy.positioning.app.util.CheckinManager;
import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper;
import com.sap.sailing.android.buoy.positioning.app.util.MarkerUtils;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.services.sending.MessageSendingService;
import com.sap.sailing.android.shared.ui.activities.AbstractRegattaActivity;
import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
@@ -13,22 +27,7 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.sap.sailing.android.buoy.positioning.app.BuildConfig;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.ui.fragments.RegattaFragment;
import com.sap.sailing.android.buoy.positioning.app.util.AboutHelper;
import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences;
import com.sap.sailing.android.buoy.positioning.app.util.CheckinManager;
import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper;
import com.sap.sailing.android.buoy.positioning.app.util.MarkerUtils;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData;
import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.services.sending.MessageSendingService;
import com.sap.sailing.android.shared.ui.activities.AbstractRegattaActivity;
import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
public class RegattaActivity extends AbstractRegattaActivity {
public class RegattaActivity extends AbstractRegattaActivity<CheckinData> {
private String leaderboardName;
private String checkinDigest;
@@ -45,7 +44,6 @@ public class RegattaActivity extends AbstractRegattaActivity {
prefs.setLastScannedQRCode(null);
Intent intent = getIntent();
checkinDigest = intent.getStringExtra(getString(R.string.checkin_digest));
leaderboardName = intent.getStringExtra(getString(R.string.leaderboard_name));
@@ -68,8 +66,7 @@ public class RegattaActivity extends AbstractRegattaActivity {
toolbar.setNavigationIcon(R.drawable.sap_logo_64dp);
getSupportActionBar().setTitle(leaderboardName);
}
RegattaFragment regattaFragment = new RegattaFragment();
replaceFragment(R.id.content_frame, regattaFragment);
replaceFragment(R.id.content_frame, RegattaFragment.newInstance());
MarkerUtils.withContext(this).startMarkerService(checkinUrl);
}
@@ -146,12 +143,10 @@ public class RegattaActivity extends AbstractRegattaActivity {
}
@Override
public void onCheckinDataAvailable(BaseCheckinData checkinData) {
if (checkinData != null) {
CheckinData data = (CheckinData) checkinData;
public void onCheckinDataAvailable(CheckinData data) {
if (data != null) {
try {
DatabaseHelper.getInstance().updateMarks(this, data.marks, data.getLeaderboard());
getRegattaFragment().getAdapter().notifyDataSetChanged();
DatabaseHelper.getInstance().updateMarks(this, data);
} catch (DatabaseHelper.GeneralDatabaseHelperException e) {
ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage());
displayDatabaseError();
@@ -189,10 +184,6 @@ public class RegattaActivity extends AbstractRegattaActivity {
return checkinDigest;
}
public RegattaFragment getRegattaFragment() {
return (RegattaFragment) getSupportFragmentManager().findFragmentById(R.id.content_frame);
}
/**
* Defines callbacks for service binding, passed to bindService()
*/
@@ -1,5 +1,13 @@
package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.ui.fragments.HomeFragment;
import com.sap.sailing.android.buoy.positioning.app.util.AboutHelper;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
@@ -7,15 +15,7 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.ui.fragments.HomeFragment;
import com.sap.sailing.android.buoy.positioning.app.util.AboutHelper;
import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
public class StartActivity extends AbstractStartActivity {
public class StartActivity extends AbstractStartActivity<CheckinData> {
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -68,7 +68,7 @@ public class StartActivity extends AbstractStartActivity {
}
@Override
public void onCheckinDataAvailable(BaseCheckinData data) {
public void onCheckinDataAvailable(CheckinData data) {
if (data != null) {
getHomeFragment().displayUserConfirmationScreen(data);
}
@@ -91,12 +91,13 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback
}
startRegatta(checkinData.leaderboardName, checkinData.checkinDigest);
}
@Override
public void handleScannedOrUrlMatchedUri(Uri uri) {
CheckinManager manager = new CheckinManager(uri.toString(), (CheckinDataActivity) getActivity());
@SuppressWarnings("unchecked")
final CheckinDataActivity<CheckinData> activity = (CheckinDataActivity<CheckinData>) getActivity();
CheckinManager manager = new CheckinManager(uri.toString(), activity);
manager.callServerAndGenerateCheckinData();
}
/**
@@ -33,18 +33,26 @@ public class RegattaFragment extends BaseFragment implements LoaderCallbacks<Cur
private MarkAdapter adapter;
private IntentReceiver mReceiver;
public static RegattaFragment newInstance() {
Bundle args = new Bundle();
RegattaFragment fragment = new RegattaFragment();
fragment.setArguments(args);
return fragment;
}
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
mReceiver = new IntentReceiver();
View view = inflater.inflate(R.layout.fragment_buoy_postion_overview, container, false);
adapter = new MarkAdapter(getActivity(), R.layout.mark_listview_row, null, 0);
ListView markListView = (ListView) view.findViewById(R.id.listMarks);
markListView.setEmptyView(view.findViewById(R.id.no_marks));
markListView.setAdapter(adapter);
markListView.setOnItemClickListener(new ItemClickListener());
getLoaderManager().initLoader(MARKER_LOADER, null, this);
return view;
}
@@ -52,26 +60,28 @@ public class RegattaFragment extends BaseFragment implements LoaderCallbacks<Cur
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mReceiver = new IntentReceiver(this);
}
@Override
public void onResume() {
super.onResume();
getLoaderManager().restartLoader(MARKER_LOADER, null, this);
IntentFilter filter = new IntentFilter();
filter.addAction(getString(R.string.database_changed));
LocalBroadcastManager.getInstance(getActivity().getApplicationContext()).registerReceiver(mReceiver, filter);
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, filter);
loadData();
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getActivity().getApplicationContext()).unregisterReceiver(mReceiver);
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mReceiver);
}
public MarkAdapter getAdapter() {
return adapter;
public void loadData() {
getLoaderManager().restartLoader(MARKER_LOADER, null, this);
}
@Override
@@ -126,19 +136,12 @@ public class RegattaFragment extends BaseFragment implements LoaderCallbacks<Cur
// Broadcast receiver to update ui on data changed
private class IntentReceiver extends BroadcastReceiver {
private LoaderCallbacks<Cursor> loaderCallbacks;
public IntentReceiver(LoaderCallbacks<Cursor> callbacks) {
loaderCallbacks = callbacks;
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Adapter will be notified");
String action = intent.getAction();
if (action.equals(getString(R.string.database_changed))) {
getLoaderManager().restartLoader(MARKER_LOADER, null, loaderCallbacks);
adapter.notifyDataSetChanged();
loadData();
}
}
}
@@ -15,18 +15,10 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.json.simple.parser.ParseException;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.widget.Toast;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo;
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;
@@ -47,10 +39,16 @@ import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSeri
import com.sap.sailing.server.gateway.serialization.impl.FlatGPSFixJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.MarkJsonSerializerWithPosition;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.widget.Toast;
public class CheckinManager {
private final static String TAG = CheckinManager.class.getName();
private BaseCheckinData checkinData;
private final CheckinDataActivity activity;
private final CheckinDataActivity<CheckinData> activity;
private final Context mContext;
private final AppPreferences prefs;
private String url;
@@ -61,7 +59,7 @@ public class CheckinManager {
this(url, context, /* context is not necessarily a CheckinDataActivity */ null);
}
private CheckinManager(String url, Context context, CheckinDataActivity activity) {
private CheckinManager(String url, Context context, CheckinDataActivity<CheckinData> activity) {
sharedDomainFactory = new SharedDomainFactoryImpl(/* race log resolver not needed in this app */ null);
this.url = url;
mContext = context;
@@ -69,7 +67,7 @@ public class CheckinManager {
this.activity = activity;
}
public CheckinManager(String url, CheckinDataActivity activity) {
public CheckinManager(String url, CheckinDataActivity<CheckinData> activity) {
this(url, activity, activity);
}
@@ -263,25 +261,20 @@ public class CheckinManager {
}
}
public void setCheckinData(BaseCheckinData data) {
checkinData = data;
private void setCheckinData(CheckinData data) {
if (activity != null) {
activity.onCheckinDataAvailable(getCheckinData());
activity.onCheckinDataAvailable(data);
} else if (dataChangedListner != null){
dataChangedListner.handleData(data);
}
}
public interface DataChangedListner{
void handleData(BaseCheckinData data);
void handleData(CheckinData data);
}
public void setDataChangedListner(DataChangedListner listner){
dataChangedListner = listner;
}
public BaseCheckinData getCheckinData() {
return checkinData;
public void setDataChangedListner(DataChangedListner listener){
dataChangedListner = listener;
}
/**
@@ -11,6 +11,7 @@ import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract.C
import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract.Leaderboard;
import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract.Mark;
import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract.MarkPing;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.CheckinData;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo;
import com.sap.sailing.android.shared.data.CheckinUrlInfo;
@@ -109,9 +110,9 @@ public class DatabaseHelper {
if (mpc != null) {
mpc.moveToFirst();
while (!mpc.isAfterLast()) {
long timeStamp = Long.parseLong(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_TIMESTAMP))));
double longitude = Double.parseDouble(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LONGITUDE))));
double latitude = Double.parseDouble(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LATITUDE))));
long timeStamp = mpc.getLong(mpc.getColumnIndex(MarkPing.MARK_PING_TIMESTAMP));
double longitude = mpc.getDouble(mpc.getColumnIndex(MarkPing.MARK_PING_LONGITUDE));
double latitude = mpc.getDouble(mpc.getColumnIndex(MarkPing.MARK_PING_LATITUDE));
MarkPingInfo markPingInfo = new MarkPingInfo(markID, GPSFixImpl.create(longitude, latitude, timeStamp),
mpc.getDouble((mpc.getColumnIndex(MarkPing.MARK_PING_ACCURACY))));
marks.add(markPingInfo);
@@ -163,15 +164,11 @@ public class DatabaseHelper {
*/
public void storeCheckinRow(Context context, List<MarkInfo> markList, LeaderboardInfo leaderboard,
CheckinUrlInfo checkinURL, List<MarkPingInfo> pings) throws GeneralDatabaseHelperException {
if (BuildConfig.DEBUG) {
ExLog.i(context, TAG, "New data stored");
}
// inserting leaderboard first
ContentResolver cr = context.getContentResolver();
ContentValues clv = new ContentValues();
clv.put(Leaderboard.LEADERBOARD_NAME, leaderboard.name);
clv.put(Leaderboard.LEADERBOARD_SERVER_URL, leaderboard.serverUrl);
@@ -228,51 +225,40 @@ public class DatabaseHelper {
}
}
public void updateMarks(Context context, List<MarkInfo> markList, LeaderboardInfo leaderboard) throws GeneralDatabaseHelperException {
public void updateMarks(Context context, CheckinData data) throws GeneralDatabaseHelperException {
ContentResolver cr = context.getContentResolver();
// Update Leaderboard
LeaderboardInfo leaderboard = data.getLeaderboard();
ContentValues leaderboardValues = new ContentValues();
leaderboardValues.put(Leaderboard.LEADERBOARD_NAME, leaderboard.name);
leaderboardValues.put(Leaderboard.LEADERBOARD_SERVER_URL, leaderboard.serverUrl);
leaderboardValues.put(Leaderboard.LEADERBOARD_CHECKIN_DIGEST, leaderboard.checkinDigest);
cr.update(Leaderboard.CONTENT_URI, leaderboardValues, Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = ?", new String[] {leaderboard.checkinDigest});
// Delete all marks for this leaderboard
List<MarkInfo> currentMarks = getMarks(context, leaderboard.checkinDigest);
// Delete marks which where deleted on the server
for (MarkInfo currentMark : currentMarks){
if (!markList.contains(currentMark)) {
deleteMark(context, currentMark);
}
for (MarkInfo mark : currentMarks){
deleteMark(context, mark);
}
// Update marks
for (MarkInfo mark : markList) {
// insert marks from server into database
for (MarkInfo mark : data.marks) {
for (MarkPingInfo ping : data.pings) {
storeMarkPing(context, ping);
}
ContentValues cmv = new ContentValues();
cmv.put(Mark.MARK_CHECKIN_DIGEST, mark.getCheckinDigest());
cmv.put(Mark.MARK_ID, mark.getId().toString());
cmv.put(Mark.MARK_NAME, mark.getName());
cmv.put(Mark.MARK_TYPE, mark.getType().toString());
cmv.put(Mark.MARK_CLASS_NAME, mark.getClassName());
if (!dataBaseContainsMark(context, mark)) {
cr.insert(Mark.CONTENT_URI, cmv);
} else {
cr.update(Mark.CONTENT_URI, cmv, Mark.MARK_ID + " = ?", new String[] { mark.getId().toString() });
}
cr.insert(Mark.CONTENT_URI, cmv);
}
LocalBroadcastManager.getInstance(context.getApplicationContext()).sendBroadcast(new Intent(context.getString(R.string.database_changed)));
}
private boolean dataBaseContainsMark(Context context, MarkInfo mark) {
Cursor contentResolver = context.getContentResolver().query(Mark.CONTENT_URI, null, Mark.MARK_CHECKIN_DIGEST + " = ?" +
" AND " + Mark.MARK_ID + " = ? ", new String[] { mark.getCheckinDigest(), mark.getId().toString() }, "");
int count = 0;
if (contentResolver != null) {
count = contentResolver.getCount();
contentResolver.close();
}
return count != 0;
}
public void storeMarkPing(Context context, MarkPingInfo markPing) throws GeneralDatabaseHelperException {
ContentResolver cr = context.getContentResolver();
deletePingsFromDataBase(context, markPing.getMarkId().toString());