From 57160e427bece9a99dce9293023030093280ae4f Mon Sep 17 00:00:00 2001 From: Lukas Zielinski Date: Wed, 26 Nov 2014 14:08:01 +0100 Subject: [PATCH] TRACKING APP: Unique device id --- .../AndroidManifest.xml | 1 + .../res/values-de/strings.xml | 2 +- .../res/values/preferences.xml | 2 +- .../res/values/strings.xml | 2 +- .../res/xml/preference_general.xml | 17 +------- .../app/services/TrackingService.java | 4 +- .../app/services/TransmittingService.java | 3 +- .../app/ui/activities/RegattaActivity.java | 3 +- .../app/ui/fragments/HomeFragment.java | 9 ++++- .../preference/GeneralPreferenceFragment.java | 26 +++++++++++-- .../tracking/app/utils/AppPreferences.java | 9 ++++- .../tracking/app/utils/UniqueDeviceUuid.java | 39 +++++++++++++++++++ 12 files changed, 89 insertions(+), 28 deletions(-) create mode 100644 mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/UniqueDeviceUuid.java diff --git a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml index b42fd500b2f..34390ae2114 100644 --- a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml +++ b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml @@ -17,6 +17,7 @@ + diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml b/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml index 132c995d6a3..89082985253 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml @@ -8,7 +8,7 @@ Einstellungen Checkout General - Verbindung + Andere Einstellungen Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung Server Geräte-ID diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml index 92f1a381dcd..be7d612f471 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml @@ -1,7 +1,7 @@ deviceIdentifier - 147d8230-4db0-11e4-916c-0800200c9a66 + tracking diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml index cbebb878075..430af7cb180 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml @@ -9,7 +9,7 @@ Settings General Checkout - Connection + Other Settings Server Device Identifier Google Play services is available diff --git a/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml b/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml index 0cc132abe6d..d3b518f23d9 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml @@ -14,25 +14,12 @@ - + - - - + android:title="@string/device_identifier" android:selectable="false"/> \ No newline at end of file diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java index b75c481299f..fbdf9b7ca45 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java @@ -34,6 +34,7 @@ import com.sap.sailing.android.tracking.app.R; import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.SensorGps; import com.sap.sailing.android.tracking.app.ui.activities.RegattaActivity; import com.sap.sailing.android.tracking.app.utils.AppPreferences; +import com.sap.sailing.android.tracking.app.utils.UniqueDeviceUuid; import com.sap.sailing.server.gateway.deserialization.impl.FlatSmartphoneUuidAndGPSFixMovingJsonDeserializer; public class TrackingService extends Service implements ConnectionCallbacks, OnConnectionFailedListener, @@ -159,8 +160,7 @@ public class TrackingService extends Service implements ConnectionCallbacks, OnC JSONObject json = new JSONObject(); try { - json.put(FlatSmartphoneUuidAndGPSFixMovingJsonDeserializer.DEVICE_UUID, - prefs.getDeviceIdentifier()); + json.put(FlatSmartphoneUuidAndGPSFixMovingJsonDeserializer.DEVICE_UUID, UniqueDeviceUuid.getUniqueId(this)); JSONArray fixes = new JSONArray(); JSONObject fix = new JSONObject(); fix.put(FlatSmartphoneUuidAndGPSFixMovingJsonDeserializer.LAT_DEG, location.getLatitude()); diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TransmittingService.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TransmittingService.java index 869bbfe08fe..442c5d68d75 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TransmittingService.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TransmittingService.java @@ -35,6 +35,7 @@ import com.sap.sailing.android.tracking.app.services.TrackingService.GPSQualityL import com.sap.sailing.android.tracking.app.services.TrackingService.TrackingBinder; import com.sap.sailing.android.tracking.app.services.sending.ConnectivityChangedReceiver; import com.sap.sailing.android.tracking.app.utils.AppPreferences; +import com.sap.sailing.android.tracking.app.utils.UniqueDeviceUuid; import com.sap.sailing.android.tracking.app.utils.VolleyHelper; /** @@ -299,7 +300,7 @@ public class TransmittingService extends Service { try { requestObject.put("fixes", jsonArray); - requestObject.put("deviceUuid", prefs.getDeviceIdentifier()); + requestObject.put("deviceUuid", UniqueDeviceUuid.getUniqueId(this)); } catch (JSONException e) { e.printStackTrace(); } diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java index 4a44ce74036..2228d7be3f6 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java @@ -47,6 +47,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.ui.fragments.RegattaFragment; +import com.sap.sailing.android.tracking.app.utils.UniqueDeviceUuid; import com.sap.sailing.android.tracking.app.utils.VolleyHelper; public class RegattaActivity extends BaseActivity { @@ -348,7 +349,7 @@ public class RegattaActivity extends BaseActivity { JSONObject checkoutData = new JSONObject(); try { checkoutData.put("competitorId", competitorId); - checkoutData.put("deviceUuid", prefs.getDeviceIdentifier()); + checkoutData.put("deviceUuid", UniqueDeviceUuid.getUniqueId(this)); checkoutData.put("toMillis", String.valueOf(System.currentTimeMillis())); } catch (JSONException e) { showErrorPopup( 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 b8d9f9444ce..f6b675c35c3 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 @@ -56,6 +56,7 @@ 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.UniqueDeviceUuid; import com.sap.sailing.android.tracking.app.utils.VolleyHelper; import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.domain.racelog.tracking.impl.SmartphoneUUIDIdentifierImpl; @@ -192,7 +193,7 @@ public class HomeFragment extends BaseFragment implements final String leaderboardName = leaderboardNameFromQR; final DeviceIdentifier deviceUuid = new SmartphoneUUIDIdentifierImpl( - UUID.fromString(prefs.getDeviceIdentifier())); + UUID.fromString(UniqueDeviceUuid.getUniqueId(this.getActivity()))); // There are 5 Stages after the QR-Code scan is complete: // 1. Get Event @@ -227,6 +228,7 @@ public class HomeFragment extends BaseFragment implements "Error getting data from call on URL: " + getLeaderboardUrl + ", Error: " + e.getMessage()); + startActivity.dismissProgressDialog(); displayAPIErrorRecommendRetry(); return; } @@ -346,7 +348,9 @@ public class HomeFragment extends BaseFragment implements TAG, "Failed to get competitor from API: " + error.getMessage()); + startActivity.dismissProgressDialog(); displayAPIErrorRecommendRetry(); + return; } }); @@ -361,7 +365,9 @@ public class HomeFragment extends BaseFragment implements ExLog.e(getActivity(), TAG, "Failed to get leaderboard from API: " + error.getMessage()); + startActivity.dismissProgressDialog(); displayAPIErrorRecommendRetry(); + return; } }); @@ -375,6 +381,7 @@ public class HomeFragment extends BaseFragment implements TAG, "Failed to get event from API: " + error.getMessage()); + startActivity.dismissProgressDialog(); displayAPIErrorRecommendRetry(); } }); diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java index 8036339364d..9635fadfc94 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java @@ -2,18 +2,36 @@ package com.sap.sailing.android.tracking.app.ui.fragments.preference; import android.os.Bundle; +import android.preference.Preference; import com.sap.sailing.android.shared.ui.fragments.preference.BasePreferenceFragment; import com.sap.sailing.android.tracking.app.R; +import com.sap.sailing.android.tracking.app.utils.AppPreferences; +import com.sap.sailing.android.tracking.app.utils.UniqueDeviceUuid; public class GeneralPreferenceFragment extends BasePreferenceFragment { - + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference_general); - bindPreferenceSummaryToValue(findPreference(R.string.preference_device_identifier_key)); - bindPreferenceSummaryToValue(findPreference(R.string.preference_server_url_key)); - bindPreferenceSummaryToValue(findPreference(R.string.preference_gps_fix_interval_ms_key)); + + AppPreferences prefs = new AppPreferences(getActivity()); + String currentDeviceId = prefs.getDeviceIdentifier(); + + Preference deviceIdPreference = (Preference) findPreference(getString(R.string.preference_device_identifier_key)); + + if (currentDeviceId != null && currentDeviceId.length() > 0) + { + deviceIdPreference.setSummary(currentDeviceId); + } + else + { + // this would, in most caes, be set elsewhere, but since we don't want to show an empty summary, + // we can just set it here. (UniqueDeviceUuid.getUniqueId sets it in prefs.) + String newDeviceId = UniqueDeviceUuid.getUniqueId(getActivity()); + deviceIdPreference.setSummary(newDeviceId); + } } + } 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 74816326327..398ece6fc45 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 @@ -18,10 +18,17 @@ public class AppPreferences { this.context = context; this.preferences = PreferenceManager.getDefaultSharedPreferences(context); } + + public void setDeviceIdentifier(String deviceId) + { + preferences.edit().putString(context.getString(R.string.preference_device_identifier_key), deviceId).commit(); + } public String getDeviceIdentifier() { - return PrefUtils.getString(context, R.string.preference_device_identifier_key, + String DeviceIdentifier = PrefUtils.getString(context, R.string.preference_device_identifier_key, R.string.preference_device_identifier_default); + System.out.println("Get DEVice Identifier: " + DeviceIdentifier); + return DeviceIdentifier; } public String getServerURL() { diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/UniqueDeviceUuid.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/UniqueDeviceUuid.java new file mode 100644 index 00000000000..3c7df0474a4 --- /dev/null +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/UniqueDeviceUuid.java @@ -0,0 +1,39 @@ +package com.sap.sailing.android.tracking.app.utils; + +import java.util.UUID; + +import android.content.Context; +import android.telephony.TelephonyManager; + +/** + * I'm picking a device id based on this reply on Stack Overflow: http://stackoverflow.com/a/2853253/3589281 + * @author lukas + * + */ +public class UniqueDeviceUuid { + + public static String getUniqueId(Context context) + { + AppPreferences prefs = new AppPreferences(context); + String existingDeviceIdentifier = prefs.getDeviceIdentifier(); + + if (existingDeviceIdentifier != null && existingDeviceIdentifier.length() > 0) + { + return existingDeviceIdentifier; + } + + final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + + final String tmDevice, tmSerial, androidId; + tmDevice = "" + tm.getDeviceId(); + tmSerial = "" + tm.getSimSerialNumber(); + androidId = "" + android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); + + UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); + String deviceId = deviceUuid.toString(); + + prefs.setDeviceIdentifier(deviceId); + + return deviceId; + } +}