mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-27 06:17:27 +00:00
Merge branch 'ubilabs--tracking_app--bugfix--Bug_2680' into ubilabs--tracking_app--develop
This commit is contained in:
commit
e8f2ee9bae
15 files changed
+234
-69
No files matched your search
@@ -18,4 +18,9 @@
|
||||
android:id="@+id/options_menu_add_team_image"
|
||||
android:title="@string/options_add_team_photo"
|
||||
app:showAsAction=""/>
|
||||
|
||||
<item
|
||||
android:id="@+id/options_menu_refresh"
|
||||
android:title="@string/options_refresh"
|
||||
app:showAsAction=""/>
|
||||
</menu>
|
||||
@@ -9,6 +9,7 @@
|
||||
<string name="options_menu_checkout">Checkout</string>
|
||||
<string name="options_add_team_photo">Team Foto hinzufügen</string>
|
||||
<string name="options_replace_team_photo">Team Foto ersetzen</string>
|
||||
<string name="options_refresh">Aktualisieren</string>
|
||||
<string name="settings_category_other">Andere Einstellungen</string>
|
||||
<string name="scan_hint">Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung</string>
|
||||
<string name="device_identifier">Geräte-ID</string>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<string name="options_menu_checkout">Checkout</string>
|
||||
<string name="options_add_team_photo">Add Team Photo</string>
|
||||
<string name="options_replace_team_photo">Replace Team Photo</string>
|
||||
<string name="options_refresh">Refresh</string>
|
||||
<string name="settings_category_other">Other Settings</string>
|
||||
<string name="device_identifier">Device Identifier</string>
|
||||
<string name="tracker_started">SAP Sailing Tracker started</string>
|
||||
|
||||
+25
@@ -30,6 +30,11 @@ public class AnalyticsContract {
|
||||
String EVENT_CHECKIN_DIGEST = "event_checkin_digest";
|
||||
}
|
||||
|
||||
interface CheckinUriColumns{
|
||||
String CHECKIN_URI_VALUE = "uri_value";
|
||||
String CHECKIN_URI_CHECKIN_DIGEST = "uri_checkin_digest";
|
||||
}
|
||||
|
||||
public static final String CONTENT_AUTHORITY = "com.sap.sailing.android.tracking.app.provider.db";
|
||||
|
||||
public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
|
||||
@@ -37,6 +42,7 @@ public class AnalyticsContract {
|
||||
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 class LeaderboardsEventsJoined {
|
||||
public final static Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
|
||||
@@ -118,6 +124,25 @@ 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 final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
|
||||
+ "/vnd.sap_sailing_analytics.uri";
|
||||
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
|
||||
+ "/vnd.sap_sailing_analytics.uri";
|
||||
public static final String DEFAULT_SORT = BaseColumns._ID + " ASC ";
|
||||
|
||||
public static Uri builCheckInUri(String checkinUriId) {
|
||||
return CONTENT_URI.buildUpon().appendPath(checkinUriId).build();
|
||||
}
|
||||
|
||||
public static String getCheckinUriId(Uri uri) {
|
||||
return uri.getPathSegments().get(1);
|
||||
}
|
||||
}
|
||||
|
||||
private AnalyticsContract() {
|
||||
|
||||
}
|
||||
|
||||
+10
-2
@@ -12,6 +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;
|
||||
|
||||
public class AnalyticsDatabase extends SQLiteOpenHelper {
|
||||
|
||||
@@ -29,6 +30,7 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
|
||||
String EVENTS = "events";
|
||||
String EVENTS_COMPETITORS = "events_competitors";
|
||||
String LEADERBOARDS = "leaderboards";
|
||||
String CHECKIN_URIS= "checkin_uris";
|
||||
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 + ") " +
|
||||
@@ -50,7 +52,12 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
|
||||
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||
+ LeaderboardColumns.LEADERBOARD_CHECKIN_DIGEST + " TEXT, "
|
||||
+ 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 );");
|
||||
|
||||
db.execSQL("CREATE TABLE " + Tables.COMPETITORS + " ("
|
||||
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||
+ CompetitorColumns.COMPETITOR_ID + " TEXT, "
|
||||
@@ -83,7 +90,8 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
|
||||
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;
|
||||
}
|
||||
|
||||
+26
-4
@@ -17,6 +17,7 @@ import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Competito
|
||||
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;
|
||||
@@ -40,7 +41,10 @@ public class AnalyticsProvider extends ContentProvider {
|
||||
|
||||
private static final int MESSAGE = 400;
|
||||
private static final int MESSAGE_ID = 401;
|
||||
|
||||
|
||||
private static final int CHECKIN_URI = 500;
|
||||
private static final int CHECKIN_URI_ID = 501;
|
||||
|
||||
private static final int EVENT_LEADERBOARD_COMPETITOR_JOINED = 600;
|
||||
|
||||
private static final int EVENT_GPS_FIXES_JOINED = 700;
|
||||
@@ -57,6 +61,9 @@ public class AnalyticsProvider extends ContentProvider {
|
||||
matcher.addURI(authority, "leaderboards", LEADERBOARD);
|
||||
matcher.addURI(authority, "leaderboards/*", LEADERBOARD_ID);
|
||||
|
||||
matcher.addURI(authority, "checkin_uris", CHECKIN_URI);
|
||||
matcher.addURI(authority, "checkin_uris/*", CHECKIN_URI_ID);
|
||||
|
||||
matcher.addURI(authority, "events", EVENT);
|
||||
matcher.addURI(authority, "events/*", EVENT_ID);
|
||||
|
||||
@@ -147,7 +154,10 @@ public class AnalyticsProvider extends ContentProvider {
|
||||
|
||||
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);
|
||||
}
|
||||
@@ -177,7 +187,10 @@ public class AnalyticsProvider extends ContentProvider {
|
||||
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);
|
||||
}
|
||||
@@ -209,7 +222,10 @@ public class AnalyticsProvider extends ContentProvider {
|
||||
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);
|
||||
}
|
||||
@@ -263,6 +279,12 @@ public class AnalyticsProvider extends ContentProvider {
|
||||
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);
|
||||
|
||||
default:
|
||||
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
||||
|
||||
+23
@@ -1,5 +1,9 @@
|
||||
package com.sap.sailing.android.tracking.app.ui.activities;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
|
||||
import com.sap.sailing.android.tracking.app.R;
|
||||
import com.sap.sailing.android.tracking.app.utils.CheckinManager;
|
||||
import com.sap.sailing.android.tracking.app.valueobjects.CheckinData;
|
||||
|
||||
@@ -7,4 +11,23 @@ public abstract class CheckinDataActivity extends BaseActivity implements Checki
|
||||
|
||||
@Override
|
||||
public abstract void onCheckinDataAvailable(CheckinData data);
|
||||
|
||||
/**
|
||||
* Shows a pop-up-dialog that informs the user than an DB-operation has failed.
|
||||
*/
|
||||
public void displayDatabaseError() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setMessage(getString(R.string.notify_user_db_operation_failed));
|
||||
builder.setCancelable(true);
|
||||
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
dialog.cancel();
|
||||
}
|
||||
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
alert.show();
|
||||
}
|
||||
}
|
||||
+66
-29
@@ -23,6 +23,7 @@ import com.sap.sailing.android.shared.logging.ExLog;
|
||||
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;
|
||||
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.utils.NetworkHelper;
|
||||
import com.sap.sailing.android.tracking.app.utils.NetworkHelper.NetworkHelperError;
|
||||
@@ -30,6 +31,7 @@ import com.sap.sailing.android.tracking.app.utils.NetworkHelper.NetworkHelperFai
|
||||
import com.sap.sailing.android.tracking.app.utils.NetworkHelper.NetworkHelperSuccessListener;
|
||||
import com.sap.sailing.android.tracking.app.utils.UniqueDeviceUuid;
|
||||
import com.sap.sailing.android.tracking.app.valueobjects.CheckinData;
|
||||
import com.sap.sailing.android.tracking.app.valueobjects.CheckinUrlInfo;
|
||||
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.LeaderboardInfo;
|
||||
@@ -51,7 +53,7 @@ import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Locale;
|
||||
|
||||
public class RegattaActivity extends CheckinDataActivity {
|
||||
public class RegattaActivity extends CheckinDataActivity implements RegattaFragment.FragmentWatcher {
|
||||
|
||||
private final static String TAG = RegattaActivity.class.getName();
|
||||
private final static String LEADERBOARD_IMAGE_FILENAME_PREFIX = "leaderboardImage_";
|
||||
@@ -60,8 +62,11 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
public EventInfo event;
|
||||
public CompetitorInfo competitor;
|
||||
public LeaderboardInfo leaderboard;
|
||||
public CheckinUrlInfo checkinUrl;
|
||||
|
||||
private boolean hasPicture;
|
||||
private String checkinDigest;
|
||||
private CheckinManager manager;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -73,7 +78,10 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
competitor = new CompetitorInfo();
|
||||
leaderboard = new LeaderboardInfo();
|
||||
|
||||
String checkinDigest = intent.getStringExtra(getString(R.string.checkin_digest));
|
||||
checkinDigest = intent.getStringExtra(getString(R.string.checkin_digest));
|
||||
|
||||
checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest);
|
||||
manager = new CheckinManager(checkinUrl.urlString, this);
|
||||
|
||||
competitor = DatabaseHelper.getInstance().getCompetitor(this, checkinDigest);
|
||||
event = DatabaseHelper.getInstance().getEventInfo(this, checkinDigest);
|
||||
@@ -93,7 +101,9 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
getSupportActionBar().setTitle(leaderboard.name);
|
||||
getSupportActionBar().setSubtitle(event.name);
|
||||
}
|
||||
replaceFragment(R.id.content_frame, new RegattaFragment());
|
||||
RegattaFragment regattaFragment = new RegattaFragment();
|
||||
regattaFragment.setFragmentWatcher(this);
|
||||
replaceFragment(R.id.content_frame, regattaFragment);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -115,12 +125,9 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
MenuItem teamPhotoItem = menu.findItem(R.id.options_menu_add_team_image);
|
||||
if(hasPicture)
|
||||
{
|
||||
if (hasPicture) {
|
||||
teamPhotoItem.setTitle(getString(R.string.options_replace_team_photo));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
teamPhotoItem.setTitle(getString(R.string.options_add_team_photo));
|
||||
}
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
@@ -129,20 +136,23 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
@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.");
|
||||
checkout();
|
||||
return true;
|
||||
case R.id.options_menu_add_team_image:
|
||||
ExLog.i(this, TAG, "Clicked ADD TEAM IMAGE");
|
||||
getRegattaFragment().showChooseExistingPictureOrTakeNewPhotoAlert();
|
||||
return true;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
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.");
|
||||
checkout();
|
||||
return true;
|
||||
case R.id.options_menu_add_team_image:
|
||||
ExLog.i(this, TAG, "Clicked ADD TEAM IMAGE");
|
||||
getRegattaFragment().showChooseExistingPictureOrTakeNewPhotoAlert();
|
||||
return true;
|
||||
case R.id.options_menu_refresh:
|
||||
manager.callServerAndGenerateCheckinData();
|
||||
return true;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,6 +185,15 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
setUpView();
|
||||
RegattaFragment regattaFragment = getRegattaFragment();
|
||||
if (regattaFragment != null) {
|
||||
regattaFragment.setFragmentWatcher(this);
|
||||
}
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
private void setUpView() {
|
||||
TextView competitorNameTextView = (TextView) findViewById(R.id.competitor_name);
|
||||
competitorNameTextView.setText(competitor.name);
|
||||
|
||||
@@ -208,7 +227,6 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
imageView.setImageBitmap(storedImage);
|
||||
userImageUpdated();
|
||||
}
|
||||
|
||||
|
||||
|
||||
ImageView flagImageView = (ImageView) findViewById(R.id.flag_image);
|
||||
@@ -221,11 +239,9 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
} else {
|
||||
flagImageView.setImageBitmap(storedFlagImage);
|
||||
}
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param bitmap
|
||||
*/
|
||||
public void updateLeaderboardPictureChosenByUser(final Bitmap bitmap) {
|
||||
@@ -242,7 +258,7 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
|
||||
/**
|
||||
* Store image for quicker retrieval later and trigger upload to server.
|
||||
*
|
||||
*
|
||||
* @param images
|
||||
*/
|
||||
private void storeImageAndSendToServer(Bitmap image, String fileName, boolean sendToServer) {
|
||||
@@ -267,7 +283,7 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
|
||||
/**
|
||||
* Get stored image if there's one saved.
|
||||
*
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private Bitmap getStoredImage(String fileName) {
|
||||
@@ -284,7 +300,7 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
|
||||
/**
|
||||
* Silently send the team image to the server.
|
||||
*
|
||||
*
|
||||
* @param imageFile
|
||||
*/
|
||||
private void sendTeamImageToServer(File imageFile) {
|
||||
@@ -298,7 +314,7 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
|
||||
/**
|
||||
* Get Path for cached leaderbaord image.
|
||||
*
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public File getImageFile(String fileName) {
|
||||
@@ -342,7 +358,28 @@ public class RegattaActivity extends CheckinDataActivity {
|
||||
|
||||
@Override
|
||||
public void onCheckinDataAvailable(CheckinData data) {
|
||||
if (data != null) {
|
||||
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);
|
||||
} catch (DatabaseHelper.GeneralDatabaseHelperException e) {
|
||||
ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage());
|
||||
displayDatabaseError();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated() {
|
||||
setUpView();
|
||||
}
|
||||
|
||||
private class UploadTeamImageTask extends AsyncTask<String, Void, String> {
|
||||
|
||||
+4
-1
@@ -111,6 +111,9 @@ public class StartActivity extends CheckinDataActivity {
|
||||
|
||||
@Override
|
||||
public void onCheckinDataAvailable(CheckinData data) {
|
||||
getHomeFragment().displayUserConfirmationScreen(data);
|
||||
if(data != null)
|
||||
{
|
||||
getHomeFragment().displayUserConfirmationScreen(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-23
@@ -60,8 +60,6 @@ public class HomeFragment extends BaseFragment implements LoaderCallbacks<Cursor
|
||||
private int requestCodeQRCode = 442;
|
||||
private RegattaAdapter adapter;
|
||||
|
||||
private CheckinData checkinData;
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
@@ -208,12 +206,12 @@ public class HomeFragment extends BaseFragment implements LoaderCallbacks<Cursor
|
||||
checkinData.checkinDigest)) {
|
||||
try {
|
||||
DatabaseHelper.getInstance().storeCheckinRow(getActivity(), checkinData.getEvent(),
|
||||
checkinData.getCompetitor(), checkinData.getLeaderboard());
|
||||
checkinData.getCompetitor(), checkinData.getLeaderboard(), checkinData.getCheckinUrl());
|
||||
|
||||
adapter.notifyDataSetChanged();
|
||||
} catch (GeneralDatabaseHelperException e) {
|
||||
ExLog.e(getActivity(), TAG, "Batch insert failed: " + e.getMessage());
|
||||
displayDatabaseError();
|
||||
((StartActivity) getActivity()).displayDatabaseError();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -273,25 +271,6 @@ public class HomeFragment extends BaseFragment implements LoaderCallbacks<Cursor
|
||||
alert.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows a pop-up-dialog that informs the user than an DB-operation has failed.
|
||||
*/
|
||||
private void displayDatabaseError() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
builder.setMessage(getString(R.string.notify_user_db_operation_failed));
|
||||
builder.setCancelable(true);
|
||||
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
dialog.cancel();
|
||||
}
|
||||
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
alert.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start regatta activity.
|
||||
*
|
||||
|
||||
+15
@@ -47,6 +47,8 @@ public class RegattaFragment extends BaseFragment implements OnClickListener {
|
||||
|
||||
private TimerRunnable timer;
|
||||
|
||||
private FragmentWatcher watcher;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
super.onCreateView(inflater, container, savedInstanceState);
|
||||
@@ -132,6 +134,10 @@ public class RegattaFragment extends BaseFragment implements OnClickListener {
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
if(watcher != null)
|
||||
{
|
||||
watcher.onViewCreated();
|
||||
}
|
||||
timer = new TimerRunnable();
|
||||
timer.start();
|
||||
checkAndSwitchToThankYouScreenIfRegattaOver();
|
||||
@@ -362,6 +368,10 @@ public class RegattaFragment extends BaseFragment implements OnClickListener {
|
||||
}
|
||||
}
|
||||
|
||||
public void setFragmentWatcher(FragmentWatcher fWatcher){
|
||||
watcher = fWatcher;
|
||||
}
|
||||
|
||||
private class TimerRunnable implements Runnable {
|
||||
|
||||
public Thread t;
|
||||
@@ -395,6 +405,11 @@ public class RegattaFragment extends BaseFragment implements OnClickListener {
|
||||
public void stop() {
|
||||
running = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public interface FragmentWatcher{
|
||||
public void onViewCreated();
|
||||
}
|
||||
|
||||
}
|
||||
+5
-9
@@ -51,6 +51,7 @@ public class CheckinManager {
|
||||
final URLData urlData = extractRequestParametersFromUri(uri, scheme);
|
||||
if (urlData == null)
|
||||
{
|
||||
setCheckinData(null);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -199,7 +200,6 @@ public class CheckinManager {
|
||||
"Failed to get leaderboard from API: " + e.getMessage());
|
||||
activity.dismissProgressDialog();
|
||||
displayAPIErrorRecommendRetry();
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -243,7 +243,6 @@ public class CheckinManager {
|
||||
+ e.getMessage());
|
||||
activity.dismissProgressDialog();
|
||||
displayAPIErrorRecommendRetry();
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -265,6 +264,7 @@ public class CheckinManager {
|
||||
data.leaderboardName = leaderboardName;
|
||||
data.deviceUid = urlData.deviceUuid
|
||||
.getStringRepresentation();
|
||||
data.uriString = urlData.uriStr;
|
||||
try {
|
||||
data.setCheckinDigestFromString(urlData.uriStr);
|
||||
setCheckinData(data);
|
||||
@@ -276,7 +276,6 @@ public class CheckinManager {
|
||||
+ e.getMessage());
|
||||
activity.dismissProgressDialog();
|
||||
displayAPIErrorRecommendRetry();
|
||||
return;
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
ExLog.e(activity,
|
||||
TAG,
|
||||
@@ -285,16 +284,12 @@ public class CheckinManager {
|
||||
+ e.getMessage());
|
||||
activity.dismissProgressDialog();
|
||||
displayAPIErrorRecommendRetry();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public void setCheckinData(CheckinData data){
|
||||
if(data != null)
|
||||
{
|
||||
checkinData = data;
|
||||
activity.onCheckinDataAvailable(getCheckinData());
|
||||
}
|
||||
checkinData = data;
|
||||
activity.onCheckinDataAvailable(getCheckinData());
|
||||
}
|
||||
|
||||
public CheckinData getCheckinData(){
|
||||
@@ -318,6 +313,7 @@ public class CheckinManager {
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
alert.show();
|
||||
setCheckinData(null);
|
||||
}
|
||||
|
||||
public interface CheckinDataHandler{
|
||||
|
||||
+33
-1
@@ -16,6 +16,8 @@ import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Competito
|
||||
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.valueobjects.CheckinUrlInfo;
|
||||
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.LeaderboardInfo;
|
||||
@@ -196,6 +198,22 @@ public class DatabaseHelper {
|
||||
return leaderboard;
|
||||
}
|
||||
|
||||
public CheckinUrlInfo getCheckinUrl(Context context, String checkinDigest){
|
||||
CheckinUrlInfo checkinUrlInfo = new CheckinUrlInfo();
|
||||
checkinUrlInfo.checkinDigest = checkinDigest;
|
||||
|
||||
Cursor uc = context.getContentResolver().query(CheckinUri.CONTENT_URI, null,
|
||||
CheckinUri.CHECKIN_URI_CHECKIN_DIGEST + " = \"" + checkinDigest + "\"", null, null);
|
||||
if (uc.moveToFirst()) {
|
||||
checkinUrlInfo.rowId = uc.getInt(uc.getColumnIndex(BaseColumns._ID));
|
||||
checkinUrlInfo.urlString = uc.getString(uc.getColumnIndex(CheckinUri.CHECKIN_URI_VALUE));
|
||||
}
|
||||
|
||||
uc.close();
|
||||
|
||||
return checkinUrlInfo;
|
||||
}
|
||||
|
||||
// public void deleteRegattaFromDatabase(Context context, String eventId, String competitorId, String
|
||||
// leaderboardName)
|
||||
// {
|
||||
@@ -222,11 +240,14 @@ public class DatabaseHelper {
|
||||
+ "\"", null);
|
||||
int d3 = cr.delete(Leaderboard.CONTENT_URI, Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = \"" + checkinDigest
|
||||
+ "\"", null);
|
||||
int d4 = cr.delete(CheckinUri.CONTENT_URI, CheckinUri.CHECKIN_URI_CHECKIN_DIGEST + " = \"" + checkinDigest
|
||||
+ "\"", null);
|
||||
|
||||
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 checkinurls deleted: " + d4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,7 +263,8 @@ public class DatabaseHelper {
|
||||
* @throws OperationApplicationException
|
||||
* @throws RemoteException
|
||||
*/
|
||||
public void storeCheckinRow(Context context, EventInfo event, CompetitorInfo competitor, LeaderboardInfo leaderboard)
|
||||
public void storeCheckinRow(Context context, EventInfo event, CompetitorInfo competitor,
|
||||
LeaderboardInfo leaderboard, CheckinUrlInfo checkinURL)
|
||||
throws GeneralDatabaseHelperException {
|
||||
|
||||
// inserting leaderboard first
|
||||
@@ -282,6 +304,16 @@ public class DatabaseHelper {
|
||||
|
||||
opList.add(ContentProviderOperation.newInsert(Competitor.CONTENT_URI).withValues(ccv).build());
|
||||
|
||||
// checkin url
|
||||
|
||||
ContentValues ccuv = new ContentValues();
|
||||
|
||||
ccuv.put(CheckinUri.CHECKIN_URI_VALUE, checkinURL.urlString);
|
||||
ccuv.put(CheckinUri.CHECKIN_URI_CHECKIN_DIGEST, checkinURL.checkinDigest);
|
||||
cr.insert(CheckinUri.CONTENT_URI, ccuv);
|
||||
|
||||
opList.add(ContentProviderOperation.newInsert(CheckinUri.CONTENT_URI).withValues(ccuv).build());
|
||||
|
||||
try {
|
||||
cr.applyBatch(AnalyticsContract.CONTENT_AUTHORITY, opList);
|
||||
} catch (RemoteException e) {
|
||||
|
||||
+8
@@ -20,6 +20,7 @@ public class CheckinData {
|
||||
public String competitorNationality;
|
||||
public String competitorCountryCode;
|
||||
public String deviceUid;
|
||||
public String uriString;
|
||||
public String checkinDigest;
|
||||
|
||||
public void setCheckinDigestFromString(String checkinString) throws UnsupportedEncodingException,
|
||||
@@ -63,4 +64,11 @@ public class CheckinData {
|
||||
competitor.checkinDigest = checkinDigest;
|
||||
return competitor;
|
||||
}
|
||||
|
||||
public CheckinUrlInfo getCheckinUrl(){
|
||||
CheckinUrlInfo checkinUrlInfo = new CheckinUrlInfo();
|
||||
checkinUrlInfo.urlString = uriString;
|
||||
checkinUrlInfo.checkinDigest = checkinDigest;
|
||||
return checkinUrlInfo;
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
package com.sap.sailing.android.tracking.app.valueobjects;
|
||||
|
||||
/**
|
||||
* Created by brunsen on 11.03.15.
|
||||
*/
|
||||
public class CheckinUrlInfo {
|
||||
public String urlString;
|
||||
public String checkinDigest;
|
||||
public int rowId;
|
||||
}
|
||||
Reference in new issue
Block a user