Merged ubilabs--tracking_app--bugfix--bug_2993

This commit is contained in:
Bennet Brunsen committed 2015-06-26 16:08:36 +02:00
commit 3da91c38cb
12 files changed
+141 -93

No files matched your search

@@ -1,28 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sap.sailing.android.buoy.positioning.app"
android:versionCode="1"
android:versionName="1.0" >
<manifest package="com.sap.sailing.android.buoy.positioning.app"
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
android:targetSdkVersion="22"/>
<!-- <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
android:required="true"/>
<application
@@ -31,69 +30,70 @@
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
android:value="@integer/google_play_services_version"/>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyDH-Dwy5yFlyBa2-VUgiZ3qGGUO8M_0MPY" />
android:value="AIzaSyDH-Dwy5yFlyBa2-VUgiZ3qGGUO8M_0MPY"/>
<activity
android:name=".ui.activities.StartActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:host="*"
android:pathPattern=".*buoy-tender/checkin.*"
android:scheme="http" />
android:scheme="http"/>
<data
android:host="*"
android:pathPattern=".*buoy-tender/checkin.*"
android:scheme="http" />
android:scheme="http"/>
</intent-filter>
</activity>
<activity
android:name=".ui.activities.RegattaActivity"
android:screenOrientation="portrait" >
</activity>
android:screenOrientation="portrait"/>
<activity
android:name=".ui.activities.PositioningActivity"
android:screenOrientation="portrait" >
</activity>
android:screenOrientation="portrait"/>
<activity
android:name=".ui.activities.SettingActivity"/>
<service
android:name="com.sap.sailing.android.shared.services.sending.MessageSendingService"
android:exported="false" >
android:exported="false">
<intent-filter>
<action android:name="com.sap.sailing.android.tracking.app.action.sendSavedIntents" />
<action android:name="com.sap.sailing.android.tracking.app.action.sendMessage" />
<action android:name="com.sap.sailing.android.tracking.app.action.sendSavedIntents"/>
<action android:name="com.sap.sailing.android.tracking.app.action.sendMessage"/>
</intent-filter>
</service>
<service
android:name=".service.MarkerService"
android:exported="false" />
android:exported="false"/>
<receiver android:name="com.sap.sailing.android.shared.services.sending.ConnectivityChangedReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<provider
android:name=".provider.AnalyticsProvider"
android:authorities="com.sap.sailing.android.buoy.positioning.app.provider.db"
android:exported="false" />
<activity
android:name=".ui.activities.SettingActivity" >
</activity>
android:exported="false"/>
</application>
</manifest>
@@ -82,6 +82,7 @@ dependencies {
testCompile "org.mockito:mockito-core:${rootProject.ext.mockito}"
/* UI testing with espresso */
androidTestCompile "com.android.support:support-annotations:${rootProject.ext.support}"
androidTestCompile "com.android.support.test:runner:${rootProject.ext.test}"
androidTestCompile "com.android.support.test:rules:${rootProject.ext.test}"
@@ -16,7 +16,7 @@
<string name="action_settings">Einstellungen</string>
<string name="settings">Einstellungen</string>
<string name="server">Server</string>
<string name="server_sync_settings">Server Synchronisations Intervall in Sekunden</string>
<string name="server">Polling Einstellungen</string>
<string name="server_sync_settings">Abfrage Intervall (Sekunden)</string>
</resources>
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="database_changed" translatable="false">database_changed</string>
<string name="ping_reached_server" translatable="false">ping_reached_server</string>
</resources>
@@ -21,7 +21,7 @@
<string name="action_settings">Settings</string>
<string name="settings">Settings</string>
<string name="server">Server</string>
<string name="server_sync_settings">Interval of server synchronisation in seconds</string>
<string name="server">Polling</string>
<string name="server_sync_settings">Polling Interval (seconds)</string>
</resources>
@@ -19,13 +19,6 @@ public class BaseActivity extends AbstractBaseActivity {
prefs = new AppPreferences(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.about_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
@@ -36,6 +29,6 @@ public class BaseActivity extends AbstractBaseActivity {
@Override
protected int getOptionsMenuResId() {
return R.menu.about_menu;
return 0;
}
}
@@ -74,7 +74,7 @@ public class PositioningActivity extends BaseActivity implements pingListener {
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.about_menu, menu);
return true;
return super.onCreateOptionsMenu(menu);
}
@Override
@@ -84,6 +84,9 @@ public class PositioningActivity extends BaseActivity implements pingListener {
AboutDialog aboutDialog = new AboutDialog(this);
aboutDialog.show();
return true;
case R.id.settings:
startActivity(new Intent(this, SettingActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
@@ -91,7 +94,8 @@ public class PositioningActivity extends BaseActivity implements pingListener {
@Override
protected int getOptionsMenuResId() {
return R.menu.about_menu;
// Set to 0 to avoid redundant menu inflation
return 0;
}
public void setPingFromDatabase(String markerID) {
@@ -117,6 +117,7 @@ public class RegattaActivity extends AbstractRegattaActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.regatta_menu, menu);
return true;
@@ -144,7 +145,8 @@ public class RegattaActivity extends AbstractRegattaActivity {
@Override
protected int getOptionsMenuResId() {
return R.menu.regatta_menu;
// Set to 0 to avoid redundant menu inflation
return 0;
}
@Override
@@ -2,12 +2,14 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.ui.fragments.GeneralPreferenceFragment;
import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
public class SettingActivity extends BaseActivity {
public class SettingActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -20,23 +22,26 @@ public class SettingActivity extends BaseActivity {
}
private void setupToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayHomeAsUpEnabled(true);
supportActionBar.setHomeButtonEnabled(true);
supportActionBar.setTitle(R.string.settings);
OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
setSupportActionBar(toolbar);
toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
}
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
toolbar.setNavigationIcon(R.drawable.sap_logo_64_sq);
toolbar.setPadding(20, 0, 0, 0);
getSupportActionBar().setTitle(getString(R.string.settings));
}
}
@@ -1,7 +1,5 @@
package com.sap.sailing.android.buoy.positioning.app.ui.fragments;
import java.text.DecimalFormat;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -17,7 +15,6 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
@@ -27,6 +24,7 @@ import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.ui.activities.PositioningActivity;
import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper.GeneralDatabaseHelperException;
import com.sap.sailing.android.buoy.positioning.app.util.PingHelper;
import com.sap.sailing.android.buoy.positioning.app.util.PingServerReplyCallback;
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.LeaderboardInfo;
@@ -34,9 +32,13 @@ import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.customviews.OpenSansButton;
import com.sap.sailing.android.shared.ui.customviews.OpenSansTextView;
import com.sap.sailing.android.shared.ui.customviews.SignalQualityIndicatorView;
import com.sap.sailing.android.shared.util.ViewHolder;
import com.sap.sailing.android.ui.fragments.BaseFragment;
import java.text.DecimalFormat;
public class BuoyFragment extends BaseFragment implements LocationListener {
private static final String TAG = BuoyFragment.class.getName();
private static final int GPS_MIN_DISTANCE = 1;
private static final int GPS_MIN_TIME = 1000;
private OpenSansTextView markHeaderTextView;
@@ -54,29 +56,33 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
private boolean initialLocationUpdate;
private IntentReceiver mReceiver;
private PositioningActivity positioningActivity;
private LocalBroadcastManager mBroadcastManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_buoy_postion_detail, container, false);
View layout = inflater.inflate(R.layout.fragment_buoy_postion_detail, container, false);
markHeaderTextView = (OpenSansTextView) view.findViewById(R.id.mark_header);
latitudeTextView = (OpenSansTextView) view.findViewById(R.id.marker_gps_latitude);
longitudeTextView = (OpenSansTextView) view.findViewById(R.id.marker_gps_longitude);
accuracyTextView = (OpenSansTextView) view.findViewById(R.id.marker_gps_accuracy);
markHeaderTextView = ViewHolder.get(layout, R.id.mark_header);
latitudeTextView = ViewHolder.get(layout, R.id.marker_gps_latitude);
longitudeTextView = ViewHolder.get(layout, R.id.marker_gps_longitude);
accuracyTextView = ViewHolder.get(layout, R.id.marker_gps_accuracy);
ClickListener clickListener = new ClickListener();
setPositionButton = (OpenSansButton) view.findViewById(R.id.marker_set_position_button);
setPositionButton = ViewHolder.get(layout, R.id.marker_set_position_button);
setPositionButton.setVisibility(View.GONE);
setPositionButton.setOnClickListener(clickListener);
resetPositionButton = (OpenSansButton) view.findViewById(R.id.marker_reset_position_button);
resetPositionButton = ViewHolder.get(layout, R.id.marker_reset_position_button);
resetPositionButton.setOnClickListener(clickListener);
resetPositionButton.setVisibility(View.GONE);
signalQualityIndicatorView = (SignalQualityIndicatorView) view.findViewById(R.id.signal_quality_indicator);
signalQualityIndicatorView = ViewHolder.get(layout, R.id.signal_quality_indicator);
signalQualityIndicatorView.setSignalQuality(GPSQuality.noSignal.toInt());
return view;
mReceiver = new IntentReceiver();
mBroadcastManager = LocalBroadcastManager.getInstance(inflater.getContext());
return layout;
}
@Override
@@ -103,10 +109,10 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
}
private void initMarkerReceiver() {
mReceiver = new IntentReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(getString(R.string.database_changed));
LocalBroadcastManager.getInstance(positioningActivity.getApplicationContext()).registerReceiver(mReceiver, filter);
filter.addAction(getString(R.string.ping_reached_server));
mBroadcastManager.registerReceiver(mReceiver, filter);
}
@Override
@@ -114,7 +120,7 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
super.onPause();
// Unsubscribe location updates for power saving
locationManager.removeUpdates(this);
LocalBroadcastManager.getInstance(positioningActivity.getApplicationContext()).unregisterReceiver(mReceiver);
mBroadcastManager.unregisterReceiver(mReceiver);
}
public void setUpTextUI(Location location) {
@@ -241,6 +247,10 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
}
public void handleSuccessfulResponse(){
Toast.makeText(getActivity(), getString(R.string.position_set), Toast.LENGTH_SHORT).show();
}
public void setPingListener(pingListener listener) {
pingListener = listener;
}
@@ -274,13 +284,13 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
MarkInfo mark = positioningActivity.getMarkInfo();
LeaderboardInfo leaderBoard = positioningActivity.getLeaderBoard();
helper.storePingInDatabase(getActivity(), lastKnownLocation, mark);
helper.sendPingToServer(getActivity(), lastKnownLocation, leaderBoard, mark);
helper.sendPingToServer(getActivity(), lastKnownLocation, leaderBoard, mark, PingServerReplyCallback.class);
//Toast.makeText(getActivity(), getString(R.string.position_set), Toast.LENGTH_SHORT).show();
((PositioningActivity) getActivity()).updatePing();
savedPosition = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude());
pingListener.updatePing();
setUpTextUI(lastKnownLocation);
updateMap();
Toast.makeText(getActivity(), getString(R.string.position_set), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "Location is not available yet", Toast.LENGTH_LONG).show();
}
@@ -297,13 +307,17 @@ public class BuoyFragment extends BaseFragment implements LocationListener {
private class IntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(this.getClass().getName(), "Ui will be updated");
String action = intent.getAction();
Log.d(TAG, "Action: " + action);
if(action.equals(getString(R.string.database_changed))) {
positioningActivity.loadDataFromDatabase();
setUpTextUI(lastKnownLocation);
updateMap();
}
if (action.equals(getString(R.string.ping_reached_server))){
Log.d(TAG, "Response reached Buoy Fragment");
handleSuccessfulResponse();
}
}
}
}
@@ -8,15 +8,17 @@ import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo;
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.ServerReplyCallback;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.InputStream;
import java.util.UUID;
public class PingHelper {
private static String TAG = PingHelper.class.getName();
public void sendPingToServer(final Context context, Location location, LeaderboardInfo leaderBoard, MarkInfo mark) {
public void sendPingToServer(final Context context, Location location, LeaderboardInfo leaderBoard, MarkInfo mark, Class<? extends ServerReplyCallback> callback) {
AppPreferences prefs = new AppPreferences(context);
try {
JSONObject fixJson = new JSONObject();
@@ -29,7 +31,7 @@ public class PingHelper {
String postUrlStr = leaderBoard.serverUrl + prefs.getServerMarkPingPath(leaderBoard.name, mark.getId());
context.startService(MessageSendingService.createMessageIntent(context, postUrlStr, null,
UUID.randomUUID(), fixJson.toString(), null));
UUID.randomUUID(), fixJson.toString(), callback));
} catch (JSONException ex) {
ExLog.i(context, TAG, "Error while building ping json " + ex.getMessage());
@@ -0,0 +1,26 @@
package com.sap.sailing.android.buoy.positioning.app.util;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.shared.services.sending.ServerReplyCallback;
import java.io.InputStream;
public class PingServerReplyCallback implements ServerReplyCallback {
private static final String TAG = PingServerReplyCallback.class.getName();
// Empty constructor for MessageSendingService
public PingServerReplyCallback() {
}
@Override
public void processResponse(Context context, InputStream inputStream, String callbackPayload) {
Log.d(TAG, "Context origin:");
LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(context.getString(R.string.ping_reached_server)));
}
}