Merge remote-tracking branch 'server/ubilabs--buoy_positioning_app--develop' into ubilabs--buoy_positioning_app--develop

Conflicts:
	mobile/com.sap.sailing.android.shared/.classpath
	mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/ui/activities/AbstractStartActivity.java
This commit is contained in:
Axel Uhl committed 2015-03-30 17:26:38 +02:00
commit 44def3c6c6
45 files changed
+833 -468

No files matched your search

View File
File mode changed.
@@ -34,8 +34,6 @@ android {
}
dependencies {
compile "net.hockeyapp.android:HockeySDK:3.5.0"
/* support libraries */
compile 'com.android.support:appcompat-v7:22.0.0'
@@ -18,7 +18,7 @@
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_gravity="center|start"
android:lines="1"
android:singleLine="true"
android:textSize="16sp"/>
@@ -27,7 +27,7 @@
android:id="@+id/toolbar_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_gravity="center|start"
android:lines="1"
android:singleLine="true"
android:textSize="12sp" />
@@ -2,7 +2,7 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:layout_height="match_parent">
<ImageView
android:id="@+id/homeBackground"
@@ -12,16 +12,16 @@
android:contentDescription="@string/empty"
android:scaleType="centerCrop"
android:src="@drawable/working_title" />
<RelativeLayout
android:id="@+id/bottomLayout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="@+color/black_transparent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
android:layout_alignParentStart="true"
android:background="@color/black_transparent">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
@@ -37,28 +37,30 @@
android:id="@+id/scanQr"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:layout_above="@+id/noQrCode"
android:layout_marginBottom="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="10dp"
android:background="@drawable/rounded_btn_yellow"
android:text="@string/scan_qr"
android:textAllCaps="true"
android:textStyle="bold"
android:text="@string/scan_qr" />
android:textSize="18sp"
android:textStyle="bold" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
android:id="@+id/noQrCode"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/bottomLayout"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:background="@drawable/rounded_btn_white"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:background="@drawable/rounded_btn_white"
android:text="@string/no_qr_code"
android:textColor="@color/black"
android:text="@string/no_qr_code" />
android:textSize="18sp" />
<ListView
android:id="@+id/listRegatta"
@@ -67,7 +69,7 @@
android:layout_above="@id/scanQr"
android:layout_alignParentTop="true"
android:divider="@android:color/white"
android:dividerHeight="1dp" >
android:dividerHeight="1dp">
</ListView>
@@ -18,8 +18,8 @@
android:src="@drawable/yellow_arrow_right"
android:layout_marginTop="13dp"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="14dp"
android:layout_marginEnd="14dp"
android:textColor="@color/white" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
@@ -31,8 +31,8 @@
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/nextPage"
android:layout_toStartOf="@+id/nextPage"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
android:textColor="@color/white" />
@@ -17,8 +17,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/top_bar"
android:padding="14dp"
android:textSize="18sp"
android:padding="16dp"
android:textSize="16sp"
android:background="@color/colorPrimary"
android:textColor="@color/white"
android:text="@string/your_regattas" />
@@ -29,5 +29,6 @@
<!-- Regatta -->
<string name="your_regattas">Ihre Regattas:</string>
<string name="options_refresh">Aktualisieren</string>
</resources>
@@ -37,6 +37,7 @@
<color name="black">#000000</color>
<color name="black_transparent">#55000000</color>
<color name="black_slightly_transparent">#D8000000</color>
<color name="white">#FFFFFF</color>
<color name="white_less_transparent">#CCFFFFFF</color>
<color name="sap_green">#8AB54E</color>
@@ -30,6 +30,7 @@
<!-- Regatta -->
<string name="your_regattas">Your Regattas:</string>
<string name="options_refresh">Refresh</string>
<!-- QR Code -->
<string name="notify_user_db_operation_failed">Error: Database operation has failed.</string>
@@ -3,6 +3,8 @@ package com.sap.sailing.android.shared.ui.customviews;
import android.content.Context;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
import com.sap.sailing.android.shared.R;
@@ -44,4 +46,17 @@ public class OpenSansToolbar extends Toolbar {
TextView subtitleTextView = (TextView)findViewById(R.id.toolbar_subtitle);
subtitleTextView.setText(arg0);
}
public void hideSubtitle(){
TextView titleTextView = (TextView)findViewById(R.id.toolbar_title);
titleTextView.setPadding(0,6,0,0);
TextView subtitleTextView = (TextView)findViewById(R.id.toolbar_subtitle);
subtitleTextView.setVisibility(View.GONE);
}
public void setTitleSize(float size){
TextView titleTextView = (TextView)findViewById(R.id.toolbar_title);
titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
titleTextView.setTextColor(getResources().getColor(R.color.white));
}
}
@@ -6,7 +6,7 @@
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
android:targetSdkVersion="22" />
<permission
android:name="com.sap.sailing.android.tracking.app.permission.C2D_MESSAGE"
@@ -85,7 +85,6 @@
<activity
android:name=".ui.activities.SettingsActivity"
android:screenOrientation="unspecified" />
<activity android:name="net.hockeyapp.android.UpdateActivity" />
<service
android:name=".services.TrackingService"
android:exported="false"
@@ -1,4 +1,5 @@
apply plugin: "com.android.application"
apply from: "../git.gradle"
def packageName = "com.sap.sailing.android.tracking.app"
def verCode = 1
@@ -9,7 +9,6 @@
<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,7 +7,6 @@
<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>
@@ -1,23 +1,25 @@
<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" >
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="14"
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_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="com.sap.sailing.android.tracking.app.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:name="com.sap.sailing.android.shared.application.LoggableApplication"
@@ -25,19 +27,19 @@
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" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/GoogleMapsKey"/>
android:value="AIzaSyDH-Dwy5yFlyBa2-VUgiZ3qGGUO8M_0MPY" />
<activity
android:name=".ui.activities.StartActivity"
android:label="@string/app_name"
android:screenOrientation="unspecified" >
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -60,22 +62,22 @@
android:scheme="http" />
</intent-filter>
</activity>
<activity
android:name=".ui.activities.RegattaActivity"
android:screenOrientation="unspecified">
android:screenOrientation="portrait">
</activity>
<activity
android:name=".ui.activities.PositioningActivity"
android:screenOrientation="unspecified">
android:screenOrientation="portrait">
</activity>
<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" />
@@ -1,4 +1,5 @@
apply plugin: "com.android.application"
apply from: "../git.gradle"
def packageName = "com.sap.sailing.android.buoy.positioning.app"
def verCode = 1
@@ -5,29 +5,49 @@
android:background="@color/black"
android:orientation="vertical"
android:paddingLeft="0dp"
android:paddingRight="0dp" >
android:paddingRight="0dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:id="@+id/mark_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="left"
android:background="@color/black_transparent"
android:gravity="center"
android:paddingBottom="7dp"
android:paddingLeft="10dp"
android:paddingTop="7dp"
android:textColor="@color/white"
android:textSize="10sp" />
<View
android:layout_width="fill_parent"
android:layout_height="4dp"
android:background="@color/sap_yellow" />
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
android:layout_weight="1"
android:background="@color/white">
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:id="@+id/mark_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="left"
android:background="@color/black_slightly_transparent"
android:gravity="left"
android:paddingBottom="7dp"
android:paddingLeft="16dp"
android:paddingTop="7dp"
android:textColor="@color/white"
android:textSize="14sp" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/white" />
<!-- Begin of detailed mark information -->
@@ -35,17 +55,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="15dp"
android:paddingLeft="10dp"
android:paddingRight="7dp"
android:paddingTop="15dp" >
android:paddingBottom="12dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="12dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/signal_accuracy_indicator_view_description"
android:textColor="@color/white"
android:textSize="16sp" />
android:textSize="20sp" />
<!-- Empty view to right align the following element -->
@@ -58,10 +78,15 @@
android:id="@+id/marker_gps_accuracy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:layout_marginRight="5dp"
android:textColor="@color/white"
android:textSize="16sp"
android:textSize="20sp"
android:textStyle="bold" />
<com.sap.sailing.android.shared.ui.customviews.SignalQualityIndicatorView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/signal_quality_indicator"/>
</LinearLayout>
<View style="@style/Divider" />
@@ -70,51 +95,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="15dp"
android:paddingLeft="10dp"
android:paddingRight="7dp"
android:paddingTop="15dp" >
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/longitude"
android:textColor="@color/white"
android:textSize="16sp" />
<!-- Empty view to right align the following element -->
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:id="@+id/marker_gps_longitude"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
<View style="@style/Divider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="15dp"
android:paddingLeft="10dp"
android:paddingRight="7dp"
android:paddingTop="15dp" >
android:paddingBottom="12dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="12dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/latitude"
android:textColor="@color/white"
android:textSize="16sp" />
android:textSize="20sp" />
<!-- Empty view to right align the following element -->
@@ -127,9 +118,41 @@
android:id="@+id/marker_gps_latitude"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="@color/white"
android:textSize="16sp" />
android:textSize="20sp" />
</LinearLayout>
<View style="@style/Divider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="12dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="12dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/longitude"
android:textColor="@color/white"
android:textSize="20sp" />
<!-- Empty view to right align the following element -->
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:id="@+id/marker_gps_longitude"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="20sp" />
</LinearLayout>
<View style="@style/Divider" />
@@ -137,13 +160,13 @@
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
android:id="@+id/marker_set_position_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_height="80dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="15dp"
android:background="@drawable/rounded_btn_yellow"
android:text="@string/set_position"
android:textSize="14sp"
android:textSize="18sp"
android:textStyle="bold" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansButton
@@ -151,12 +174,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="5dp"
android:background="@drawable/rounded_btn_transparent"
android:text="@string/reset_position"
android:textSize="14sp"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
@@ -3,29 +3,42 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black_transparent"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp">
android:orientation="vertical">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
<View
android:layout_width="fill_parent"
android:layout_height="4dp"
android:background="@color/sap_yellow" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:text="@string/course_type"
android:textSize="18sp" />
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:text="@string/course_type"
android:textSize="20sp" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="@string/marks"
android:textSize="18sp" />
<com.sap.sailing.android.shared.ui.customviews.OpenSansTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginBottom="7dp"
android:text="@string/marks"
android:textSize="20sp" />
</LinearLayout>
<View style="@style/Divider" />
<ListView
android:id="@+id/listMarks"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
android:layout_height="wrap_content" />
</LinearLayout>
@@ -9,8 +9,8 @@
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:layout_marginEnd="14dp"
android:layout_marginRight="14dp"
android:layout_centerVertical="true"
android:contentDescription="@string/empty"
android:src="@drawable/yellow_arrow_right"
@@ -23,8 +23,9 @@
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="15dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textSize="20sp"
android:singleLine="true"
android:textColor="@color/white" />
@@ -35,10 +36,11 @@
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/mark_name"
android:layout_marginTop="10dp"
android:layout_marginTop="2dp"
android:layout_marginBottom="15dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textSize="14sp"
android:singleLine="true"
android:textColor="@color/white" />
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
</menu>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/refresh"
android:title="@string/options_refresh" />
</menu>
@@ -4,12 +4,10 @@
<string name="title_activity_positioning">Markierungs Position setzen</string>
<string name="course_type">Kurstyp</string>
<string name="marks">Kursmarkierungen</string>
<string name="longitude">Breitengrad</string>
<string name="latitude">Längengrad</string>
<string name="set_position">Position setzen</string>
<string name="reset_position">Position zurücksetzen</string>
<string name="getting_marks">Empfangen der Markierungen..</string>
<string name="set">gesetzt</string>
<string name="not_set">nicht gesetzt</string>
<string name="set">Gesetzt</string>
<string name="not_set">Nicht gesetzt</string>
</resources>
@@ -1,4 +1,4 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<resources>
<color name="white">#FFFFFF</color>
<color name="white_transparent">#55FFFFFF</color>
@@ -5,8 +5,8 @@
<string name="title_activity_positioning">Set Mark Position</string>
<string name="course_type">Course Type</string>
<string name="marks">Marks</string>
<string name="longitude">Longitude</string>
<string name="latitude">Latitude</string>
<string name="longitude" translatable="false">Lng</string>
<string name="latitude" translatable="false">Lat</string>
<string name="set_position">Set Position</string>
<string name="reset_position">Reset Position</string>
<string name="getting_marks">Getting race marks..</string>
@@ -1,8 +1,6 @@
package com.sap.sailing.android.buoy.positioning.app.adapter;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.ResourceCursorAdapter;
@@ -14,6 +12,8 @@ import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract;
import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo;
import java.util.List;
public class MarkAdapter extends ResourceCursorAdapter {
@@ -34,7 +34,7 @@ public class MarkAdapter extends ResourceCursorAdapter {
}
else{
setText = context.getString(R.string.set);
String accuracy = " (" + markPings.get(0).getAccuracy() + ")";
String accuracy = " (~ " + markPings.get(0).getAccuracy() + ")";
setText += accuracy;
}
markName.setText(name);
@@ -1,7 +1,5 @@
package com.sap.sailing.android.buoy.positioning.app.provider;
import java.util.Arrays;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
@@ -22,6 +20,8 @@ import com.sap.sailing.android.buoy.positioning.app.util.AppPreferences;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.SelectionBuilder;
import java.util.Arrays;
public class AnalyticsProvider extends ContentProvider {
private static final String TAG = AnalyticsProvider.class.getName();
@@ -2,8 +2,10 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import android.os.Bundle;
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.util.AppPreferences;
import com.sap.sailing.android.shared.ui.activities.AbstractBaseActivity;
@@ -19,8 +21,8 @@ public class BaseActivity extends AbstractBaseActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//MenuInflater inflater = getMenuInflater();
//inflater.inflate(R.menu.options_menu, menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.empty_menu, menu);
return true;
}
@@ -34,6 +36,6 @@ public class BaseActivity extends AbstractBaseActivity {
@Override
protected int getOptionsMenuResId() {
return 0;
return R.menu.empty_menu;
}
}
@@ -4,7 +4,9 @@ import java.util.List;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.ui.fragments.BuoyFragment;
@@ -13,6 +15,7 @@ import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper;
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;
import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
public class PositioningActivity extends BaseActivity implements pingListener {
@@ -31,11 +34,11 @@ public class PositioningActivity extends BaseActivity implements pingListener {
getString(R.string.checkin_digest));
List<MarkInfo> marks = DatabaseHelper.getInstance().getMarks(this,
checkinDigest);
leaderBoard = DatabaseHelper.getInstance().getLeaderboard(this,
checkinDigest);
setLeaderBoard(DatabaseHelper.getInstance().getLeaderboard(this,
checkinDigest));
for (MarkInfo mark : marks) {
if (mark.getId().equals(markerID)) {
markInfo = mark;
setMarkInfo(mark);
break;
}
}
@@ -43,8 +46,10 @@ public class PositioningActivity extends BaseActivity implements pingListener {
setPingFromDatabase(markerID);
}
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
setSupportActionBar(toolbar);
toolbar.setBackgroundColor(getResources().getColor(
R.color.colorPrimary));
@@ -63,6 +68,26 @@ public class PositioningActivity extends BaseActivity implements pingListener {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.empty_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected int getOptionsMenuResId() {
return R.menu.empty_menu;
}
public void setPingFromDatabase(String markerID) {
List<MarkPingInfo> markPings = DatabaseHelper.getInstance()
.getMarkPings(this, markerID);
@@ -1,28 +1,43 @@
package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
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.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.valueobjects.CheckinData;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo;
import com.sap.sailing.android.shared.data.AbstractCheckinData;
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 java.util.ArrayList;
import java.util.List;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
public class RegattaActivity extends AbstractRegattaActivity {
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.AppPreferences;
import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper;
import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkInfo;
import com.sap.sailing.android.shared.data.AbstractCheckinData;
import com.sap.sailing.android.shared.ui.activities.AbstractRegattaActivity;
private String leaderboardName;
private String checkinDigest;
private List<MarkInfo> marks;
private final String TAG = RegattaActivity.class.getName();
private String checkinUrl;
public class RegattaActivity extends AbstractRegattaActivity{
private String leaderboardName;
private String checkinDigest;
private List<MarkInfo> marks;
// private CheckinUrlInfo checkinUrl;
private AppPreferences prefs;
private AppPreferences prefs;
private MessageSendingService messageSendingService;
private boolean messageSendingServiceBound;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -36,14 +51,15 @@ public class RegattaActivity extends AbstractRegattaActivity{
checkinDigest = intent.getStringExtra(getString(R.string.checkin_digest));
leaderboardName = intent.getStringExtra(getString(R.string.leaderboard_name));
// checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest);
// manager = new CheckinManager(checkinUrl.urlString, this);
checkinUrl = DatabaseHelper.getInstance().getCheckinUrl(this, checkinDigest).urlString;
setMarks(DatabaseHelper.getInstance().getMarks(this, checkinDigest));
setContentView(R.layout.fragment_container);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
setSupportActionBar(toolbar);
toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
}
@@ -52,40 +68,127 @@ public class RegattaActivity extends AbstractRegattaActivity{
getSupportActionBar().setHomeButtonEnabled(true);
toolbar.setNavigationIcon(R.drawable.sap_logo_64_sq);
toolbar.setPadding(20, 0, 0, 0);
toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
getSupportActionBar().setTitle(leaderboardName);
}
RegattaFragment regattaFragment = new RegattaFragment();
replaceFragment(R.id.content_frame, regattaFragment);
}
@Override
public void onCheckinDataAvailable(AbstractCheckinData arg0) {
// TODO Auto-generated method stub
}
@Override
protected void onResume() {
super.onResume();
leaderboardName = (String) getIntent().getExtras().get(getString(R.string.leaderboard_name));
setTitle(leaderboardName);
}
@Override
protected int getOptionsMenuResId() {
// TODO Auto-generated method stub
return 0;
}
@Override
protected void onResume() {
super.onResume();
leaderboardName = (String) getIntent().getExtras().get(getString(R.string.leaderboard_name));
setTitle(leaderboardName);
}
@Override
public void onStart() {
super.onStart();
Intent messageSendingServiceIntent = new Intent(this, MessageSendingService.class);
bindService(messageSendingServiceIntent, messageSendingServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
public void onStop() {
super.onStop();
if (messageSendingServiceBound) {
messageSendingService.unregisterAPIConnectivityListener();
unbindService(messageSendingServiceConnection);
messageSendingServiceBound = false;
if (BuildConfig.DEBUG) {
ExLog.i(this, TAG, "Unbound transmitting Service");
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.regatta_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh:
ExLog.i(this, TAG, "Clicked REFRESH.");
CheckinManager manager = new CheckinManager(checkinUrl, this);
manager.callServerAndGenerateCheckinData();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected int getOptionsMenuResId() {
return R.menu.regatta_menu;
}
public List<MarkInfo> getMarks() {
return marks;
}
@Override
public void onCheckinDataAvailable(AbstractCheckinData checkinData) {
CheckinData data = (CheckinData) checkinData;
try {
DatabaseHelper.getInstance().deleteRegattaFromDatabase(this, data.checkinDigest);
DatabaseHelper.getInstance().storeCheckinRow(this,
data.marks, data.getLeaderboard(),
data.getCheckinUrl(), data.pings);
getRegattaFragment().getAdapter().notifyDataSetChanged();
} catch (DatabaseHelper.GeneralDatabaseHelperException e) {
ExLog.e(this, TAG,
"Batch insert failed: " + e.getMessage());
displayDatabaseError();
return;
}
if (BuildConfig.DEBUG) {
ExLog.i(this, TAG,
"Batch-insert of checkinData completed.");
}
}
public String getCheckinDigest(){
return checkinDigest;
}
public RegattaFragment getRegattaFragment() {
return (RegattaFragment) getSupportFragmentManager().findFragmentById(R.id.content_frame);
}
public void setMarks(List<MarkInfo> marks) {
this.marks = marks;
}
public List<MarkInfo> getMarks() {
return marks;
}
public void setMarks(List<MarkInfo> marks) {
this.marks = marks;
}
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection messageSendingServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
// We've bound to LocalService, cast the IBinder and get
// LocalService instance
MessageSendingService.MessageSendingBinder binder = (MessageSendingService.MessageSendingBinder) service;
messageSendingService = binder.getService();
messageSendingServiceBound = true;
if (BuildConfig.DEBUG) {
ExLog.i(RegattaActivity.this, TAG, "connected to message sending service");
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
messageSendingServiceBound = false;
}
};
}
@@ -2,10 +2,14 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities;
import android.content.Intent;
import android.os.Bundle;
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.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.ui.customviews.OpenSansToolbar;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
@@ -16,15 +20,34 @@ public class StartActivity extends AbstractStartActivity {
super.onCreate(savedInstanceState);
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(getString(R.string.title_activity_start));
OpenSansToolbar toolbar = (OpenSansToolbar) findViewById(R.id.toolbar);
toolbar.hideSubtitle();
toolbar.setTitleSize(20);
getSupportActionBar().setTitle(getString(R.string.title_activity_start));
getSupportActionBar().setHomeButtonEnabled(false);
}
replaceFragment(R.id.content_frame, new HomeFragment());
}
@Override
protected int getOptionsMenuResId() {
return 0;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.empty_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected int getOptionsMenuResId() {
return R.menu.empty_menu;
}
public AbstractHomeFragment getHomeFragment() {
HomeFragment homeFragment = (HomeFragment) getSupportFragmentManager()
@@ -1,7 +1,6 @@
package com.sap.sailing.android.buoy.positioning.app.ui.fragments;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
@@ -12,7 +11,11 @@ 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;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
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;
@@ -22,143 +25,241 @@ import com.sap.sailing.android.buoy.positioning.app.valueobjects.MarkPingInfo;
import com.sap.sailing.android.shared.data.LeaderboardInfo;
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.ui.fragments.BaseFragment;
public class BuoyFragment extends BaseFragment implements LocationListener {
private OpenSansTextView markHeaderTextView;
private OpenSansTextView lattitudeTextView;
private OpenSansTextView longitudeTextView;
private OpenSansTextView accuracyTextView;
private OpenSansButton setPositionButton;
private OpenSansButton resetPostionButton;
private MapFragment mapFragment;
private Location lastKnownLocation;
private LocationManager locationManager;
private String locationProvider;
private pingListener pingListener;
private OpenSansTextView markHeaderTextView;
private OpenSansTextView latitudeTextView;
private OpenSansTextView longitudeTextView;
private OpenSansTextView accuracyTextView;
private OpenSansButton setPositionButton;
private OpenSansButton resetPositionButton;
private MapFragment mapFragment;
private Location lastKnownLocation;
private LatLng savedPosition;
private LocationManager locationManager;
private pingListener pingListener;
private SignalQualityIndicatorView signalQualityIndicatorView;
@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);
@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);
mapFragment = (MapFragment) getActivity().getFragmentManager()
.findFragmentById(R.id.map);
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);
ClickListener clickListener = new ClickListener();
markHeaderTextView = (OpenSansTextView) view
.findViewById(R.id.mark_header);
lattitudeTextView = (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);
Clicklistener clicklistener = new Clicklistener();
setPositionButton = (OpenSansButton) view
.findViewById(R.id.marker_set_position_button);
setPositionButton.setVisibility(View.GONE);
setPositionButton.setOnClickListener(clickListener);
setPositionButton = (OpenSansButton) view
.findViewById(R.id.marker_set_position_button);
setPositionButton.setOnClickListener(clicklistener);
resetPositionButton = (OpenSansButton) view
.findViewById(R.id.marker_reset_position_button);
resetPositionButton.setOnClickListener(clickListener);
resetPositionButton.setVisibility(View.GONE);
resetPostionButton = (OpenSansButton) view
.findViewById(R.id.marker_reset_position_button);
resetPostionButton.setOnClickListener(clicklistener);
resetPostionButton.setVisibility(View.GONE);
return view;
}
signalQualityIndicatorView = (SignalQualityIndicatorView) view.findViewById(R.id.signal_quality_indicator);
signalQualityIndicatorView.setSignalQuality(GPSQuality.noSignal.toInt());
return view;
}
@Override
public void onResume() {
super.onResume();
initLocationProvider();
MarkInfo mark = ((PositioningActivity) getActivity()).getMarkInfo();
if (mark != null) {
markHeaderTextView.setText(mark.getName());
setUpPingUI();
}
}
@Override
public void onResume() {
super.onResume();
initLocationProvider();
lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
MarkInfo mark = ((PositioningActivity) getActivity()).getMarkInfo();
if (mark != null) {
markHeaderTextView.setText(mark.getName());
setUpTextUI(lastKnownLocation);
setUpMap();
}
if (lastKnownLocation != null) {
LatLng lastKnownLatLng = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude());
mapFragment.getMap().animateCamera(CameraUpdateFactory.newLatLngZoom(lastKnownLatLng, 15));
setPositionButton.setVisibility(View.VISIBLE);
reportGPSQuality(lastKnownLocation.getAccuracy());
}
}
public void setUpPingUI() {
MarkPingInfo markPing = ((PositioningActivity) getActivity())
.getMarkPing();
if (markPing != null) {
lattitudeTextView.setText(markPing.getLattitude());
longitudeTextView.setText(markPing.getLongitude());
accuracyTextView.setText("~" + markPing.getAccuracy());
}
}
@Override
public void onPause() {
super.onPause();
// Unsubscribe location updates for power saving
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
lastKnownLocation = location;
}
public void setUpTextUI(Location location) {
String longitudeText = "";
String latitudeText = "";
String accuracyText = "";
if (location != null) {
latitudeText += location.getLatitude();
longitudeText += location.getLongitude();
accuracyText += "~" + location.getAccuracy();
} else {
latitudeText += "n/a";
longitudeText += "n/a";
accuracyText += "n/a";
}
MarkPingInfo markPing = ((PositioningActivity) getActivity())
.getMarkPing();
if (markPing != null) {
double savedLatitude = Double.parseDouble(markPing.getLatitude());
double savedLongitude = Double.parseDouble(markPing.getLongitude());
savedPosition = new LatLng(savedLatitude, savedLongitude);
latitudeText += " (" + markPing.getLatitude() + ")";
longitudeText += " (" + markPing.getLongitude() + ")";
accuracyText += " (" + "~" + markPing.getAccuracy() + ")";
}
latitudeTextView.setText(latitudeText);
longitudeTextView.setText(longitudeText);
accuracyTextView.setText(accuracyText);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
initLocationProvider();
}
@Override
public void onLocationChanged(Location location) {
if (getActivity() instanceof PositioningActivity) {
lastKnownLocation = location;
reportGPSQuality(lastKnownLocation.getAccuracy());
setPositionButton.setVisibility(View.VISIBLE);
setUpTextUI(lastKnownLocation);
setUpMap();
}
}
@Override
public void onProviderEnabled(String provider) {
initLocationProvider();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
if (getActivity() instanceof PositioningActivity) {
initLocationProvider();
}
}
@Override
public void onProviderDisabled(String provider) {
initLocationProvider();
}
@Override
public void onProviderEnabled(String provider) {
if (getActivity() instanceof PositioningActivity) {
initLocationProvider();
}
}
private void initLocationProvider() {
locationManager = (LocationManager) getActivity().getSystemService(
Context.LOCATION_SERVICE);
locationManager.removeUpdates(this);
locationProvider = locationManager
.getBestProvider(new Criteria(), true);
locationManager.requestLocationUpdates(locationProvider, 60000, 10,
this);
}
@Override
public void onProviderDisabled(String provider) {
if (getActivity() instanceof PositioningActivity) {
initLocationProvider();
}
}
public void setPingListener(pingListener listener) {
pingListener = listener;
}
private void initLocationProvider() {
locationManager = (LocationManager) getActivity().getSystemService(
Context.LOCATION_SERVICE);
locationManager.removeUpdates(this);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);
}
public interface pingListener {
public void updatePing();
}
public void setUpMap() {
mapFragment = (MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.map);
GoogleMap map = mapFragment.getMap();
map.clear();
map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
map.getUiSettings().setZoomControlsEnabled(true);
map.setMyLocationEnabled(true);
map.setPadding(0, 50, 0, 0);
if (savedPosition != null) {
MarkerOptions savedLocactionOptions = new MarkerOptions();
savedLocactionOptions.position(savedPosition);
savedLocactionOptions.visible(true);
map.addMarker(savedLocactionOptions);
}
if (lastKnownLocation != null) {
MarkerOptions mySelfOptions = new MarkerOptions();
LatLng lastKnownLatLng = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude());
mySelfOptions.position(lastKnownLatLng);
mySelfOptions.visible(true);
map.addMarker(mySelfOptions);
}
private class Clicklistener implements OnClickListener {
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.marker_set_position_button) {
PingHelper helper = new PingHelper();
try {
if (lastKnownLocation != null) {
MarkInfo mark = ((PositioningActivity) getActivity())
.getMarkInfo();
LeaderboardInfo leaderboard = ((PositioningActivity) getActivity())
.getLeaderBoard();
helper.storePingInDatabase(getActivity(),
lastKnownLocation, mark);
helper.sendPingToServer(getActivity(),
lastKnownLocation, leaderboard, mark);
pingListener.updatePing();
setUpPingUI();
}
else{
Toast.makeText(getActivity(), "Location is not available yet", Toast.LENGTH_LONG).show();
}
} catch (GeneralDatabaseHelperException e) {
e.printStackTrace();
}
} else if (id == R.id.marker_reset_position_button) {
// Reset position
}
public void reportGPSQuality(float gpsAccuracy) {
GPSQuality quality = GPSQuality.noSignal;
}
if (gpsAccuracy > 48) {
quality = GPSQuality.poor;
} else if (gpsAccuracy > 10) {
quality = GPSQuality.good;
} else if (gpsAccuracy <= 10) {
quality = GPSQuality.great;
}
signalQualityIndicatorView.setSignalQuality(quality.toInt());
}
}
public void setPingListener(pingListener listener) {
pingListener = listener;
}
public enum GPSQuality {
noSignal(0), poor(2), good(3), great(4);
private final int gpsQuality;
GPSQuality(int quality) {
this.gpsQuality = quality;
}
public int toInt() {
return this.gpsQuality;
}
}
public interface pingListener {
public void updatePing();
}
private class ClickListener implements OnClickListener {
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.marker_set_position_button) {
PingHelper helper = new PingHelper();
try {
if (lastKnownLocation != null) {
MarkInfo mark = ((PositioningActivity) getActivity())
.getMarkInfo();
LeaderboardInfo leaderBoard = ((PositioningActivity) getActivity())
.getLeaderBoard();
helper.storePingInDatabase(getActivity(),
lastKnownLocation, mark);
helper.sendPingToServer(getActivity(),
lastKnownLocation, leaderBoard, mark);
((PositioningActivity) getActivity()).updatePing();
savedPosition = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude());
pingListener.updatePing();
setUpTextUI(lastKnownLocation);
} else {
Toast.makeText(getActivity(), "Location is not available yet", Toast.LENGTH_LONG).show();
}
} catch (GeneralDatabaseHelperException e) {
e.printStackTrace();
}
} else if (id == R.id.marker_reset_position_button) {
// Reset position
}
}
}
}
@@ -79,13 +79,13 @@ public class HomeFragment extends AbstractHomeFragment implements
private void checkinWithApiAndStartRegattaActivity(CheckinData checkinData) {
try {
if(DatabaseHelper.getInstance().markLeaderboardCombnationAvailable(getActivity(), checkinData.checkinDigest)) {
DatabaseHelper.getInstance().storeCheckinRow(getActivity(),
checkinData.marks, checkinData.getLeaderboard(),
checkinData.getCheckinUrl());
adapter.notifyDataSetChanged();
if(!DatabaseHelper.getInstance().markLeaderboardCombnationAvailable(getActivity(), checkinData.checkinDigest)) {
DatabaseHelper.getInstance().deleteRegattaFromDatabase(getActivity(),checkinData.checkinDigest);
}
DatabaseHelper.getInstance().storeCheckinRow(getActivity(),
checkinData.marks, checkinData.getLeaderboard(),
checkinData.getCheckinUrl(), checkinData.pings);
adapter.notifyDataSetChanged();
} catch (DatabaseHelper.GeneralDatabaseHelperException e) {
ExLog.e(getActivity(), TAG,
"Batch insert failed: " + e.getMessage());
@@ -113,7 +113,7 @@ public class HomeFragment extends AbstractHomeFragment implements
* Start regatta activity.
*
* @param leaderboardName
* @param checkinDigest2
* @param checkinDigest
*/
private void startRegatta(String leaderboardName, String checkinDigest) {
Intent intent = new Intent(getActivity(), RegattaActivity.class);
@@ -18,12 +18,13 @@ import com.sap.sailing.android.buoy.positioning.app.R;
import com.sap.sailing.android.buoy.positioning.app.adapter.MarkAdapter;
import com.sap.sailing.android.buoy.positioning.app.provider.AnalyticsContract;
import com.sap.sailing.android.buoy.positioning.app.ui.activities.PositioningActivity;
import com.sap.sailing.android.buoy.positioning.app.ui.activities.RegattaActivity;
import com.sap.sailing.android.ui.fragments.BaseFragment;
public class RegattaFragment extends BaseFragment implements LoaderCallbacks<Cursor>{
private static final int MARKER_LOADER = 1;
private MarkAdapter adapter;
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -46,12 +47,21 @@ public class RegattaFragment extends BaseFragment implements LoaderCallbacks<Cur
getLoaderManager().restartLoader(MARKER_LOADER, null, this);
}
public MarkAdapter getAdapter()
{
return adapter;
}
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
String checkinDigest = ((RegattaActivity)getActivity()).getCheckinDigest();
switch (loaderId) {
case MARKER_LOADER:
return new CursorLoader(getActivity(), AnalyticsContract.LeaderboardsMarksJoined.CONTENT_URI,
null, null, null, null);
return new CursorLoader(getActivity(), AnalyticsContract.MarksLeaderBoardsJoined.CONTENT_URI,
null,
AnalyticsContract.Mark.MARK_CHECKIN_DIGEST + " = ?",
new String[]{checkinDigest},
null);
default:
return null;
@@ -1,19 +1,5 @@
package com.sap.sailing.android.buoy.positioning.app.util;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.net.Uri;
@@ -22,6 +8,7 @@ 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.AbstractCheckinData;
import com.sap.sailing.android.shared.data.http.HttpGetRequest;
import com.sap.sailing.android.shared.logging.ExLog;
@@ -33,6 +20,20 @@ import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
import com.sap.sailing.domain.racelogtracking.DeviceIdentifier;
import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class CheckinManager {
private final static String TAG = CheckinManager.class.getName();
@@ -41,13 +42,13 @@ public class CheckinManager {
private AppPreferences prefs;
private String url;
public CheckinManager(String url, CheckinDataActivity activity){
public CheckinManager(String url, CheckinDataActivity activity) {
this.activity = activity;
this.url = url;
prefs = new AppPreferences(activity);
}
public void callServerAndGenerateCheckinData(){
public void callServerAndGenerateCheckinData() {
Uri uri = Uri.parse(url);
// TODO: assuming scheme is http, is this valid?
@@ -57,8 +58,7 @@ public class CheckinManager {
}
final URLData urlData = extractRequestParametersFromUri(uri, scheme);
if (urlData == null)
{
if (urlData == null) {
setCheckinData(null);
return;
}
@@ -93,7 +93,7 @@ public class CheckinManager {
Toast.makeText(activity, activity.getString(R.string.error_invalid_qr_code), Toast.LENGTH_LONG).show();
urlData = null;
}
if(urlData != null) {
if (urlData != null) {
urlData.leaderboardName = leaderboardNameFromQR;
urlData.deviceUuid = new SmartphoneUUIDIdentifierImpl(UUID.fromString(UniqueDeviceUuid
@@ -148,28 +148,42 @@ public class CheckinManager {
}
});
}
private void getMarksFromServer(final String leaderboardName,
HttpGetRequest getMarksRequest, final URLData urlData) {
NetworkHelper.getInstance(activity).executeHttpJsonRequestAsnchronously(getMarksRequest, new NetworkHelperSuccessListener() {
@Override
public void performAction(JSONObject response) {
try {
private void getMarksFromServer(final String leaderboardName,
HttpGetRequest getMarksRequest, final URLData urlData) {
NetworkHelper.getInstance(activity).executeHttpJsonRequestAsnchronously(getMarksRequest, new NetworkHelperSuccessListener() {
@Override
public void performAction(JSONObject response) {
try {
JSONArray markArray = response.getJSONArray("marks");
String checkinDigest = generateCheckindigest(urlData.uriStr);
List<MarkInfo> marks = new ArrayList<MarkInfo>();
for(int i = 0; i< markArray.length(); i++){
JSONObject jsonMark = (JSONObject) markArray.get(i);
MarkInfo mark = new MarkInfo();
mark.setCheckinDigest(checkinDigest);
mark.setClassName(jsonMark.getString("@class"));
mark.setName(jsonMark.getString("name"));
mark.setId(jsonMark.getString("id"));
mark.setType(jsonMark.getString("type"));
marks.add(mark);
List<MarkPingInfo> pings = new ArrayList<MarkPingInfo>();
for (int i = 0; i < markArray.length(); i++) {
JSONObject jsonMark = (JSONObject) markArray.get(i);
MarkInfo mark = new MarkInfo();
mark.setCheckinDigest(checkinDigest);
mark.setClassName(jsonMark.getString("@class"));
mark.setName(jsonMark.getString("name"));
mark.setId(jsonMark.getString("id"));
if (jsonMark.has("position")) {
if (!jsonMark.get("position").equals(null)) {
JSONObject positionJson = jsonMark.getJSONObject("position");
MarkPingInfo ping = new MarkPingInfo();
ping.setLatitude(positionJson.getString("latitude"));
ping.setLongitude(positionJson.getString("longitude"));
ping.setTimestamp(positionJson.getInt("timestamp"));
ping.setAccuracy(positionJson.getDouble("accuracy"));
ping.setMarkId(mark.getId());
pings.add(ping);
}
}
mark.setType(jsonMark.getString("type"));
marks.add(mark);
}
urlData.marks = marks;
urlData.pings = pings;
saveCheckinDataAndNotifyListeners(urlData, leaderboardName);
} catch (JSONException e) {
@@ -179,24 +193,25 @@ public class CheckinManager {
displayAPIErrorRecommendRetry();
return;
}
}
}, new NetworkHelper.NetworkHelperFailureListener() {
@Override
}
}, new NetworkHelper.NetworkHelperFailureListener() {
@Override
public void performAction(NetworkHelper.NetworkHelperError e) {
ExLog.e(activity, TAG, "Failed to get marks from API: " + e.getMessage());
activity.dismissProgressDialog();
displayAPIErrorRecommendRetry();
}
});
}
});
}
private void saveCheckinDataAndNotifyListeners(URLData urlData, String leaderboardName) {
CheckinData data = new CheckinData();
data.serverWithPort = urlData.hostWithPort;
data.leaderboardName = leaderboardName;
data.marks = urlData.marks;
data.pings = urlData.pings;
data.deviceUid = urlData.deviceUuid
.getStringRepresentation();
data.uriString = urlData.uriStr;
@@ -223,12 +238,12 @@ public class CheckinManager {
}
}
public void setCheckinData(AbstractCheckinData data){
public void setCheckinData(AbstractCheckinData data) {
checkinData = data;
activity.onCheckinDataAvailable(getCheckinData());
}
public AbstractCheckinData getCheckinData(){
public AbstractCheckinData getCheckinData() {
return checkinData;
}
@@ -251,44 +266,45 @@ public class CheckinManager {
alert.show();
setCheckinData(null);
}
private String generateCheckindigest(String url)
{
String checkinDigest = "";
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(url.getBytes("UTF-8"));
byte[] digest = md.digest();
StringBuffer buf = new StringBuffer();
for (byte byt : digest) {
buf.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1));
checkinDigest = buf.toString();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return checkinDigest;
private String generateCheckindigest(String url) {
String checkinDigest = "";
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(url.getBytes("UTF-8"));
byte[] digest = md.digest();
StringBuffer buf = new StringBuffer();
for (byte byt : digest) {
buf.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1));
checkinDigest = buf.toString();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return checkinDigest;
}
public interface CheckinDataHandler{
public interface CheckinDataHandler {
public void onCheckinDataAvailable(CheckinData data);
}
private class URLData{
private class URLData {
public String uriStr;
public String server;
public int port;
public String hostWithPort;
public List<MarkInfo> marks;
public List<MarkPingInfo> pings;
public String leaderboardName;
public DeviceIdentifier deviceUuid;
public String getMarkUrl;
public String getLeaderboardUrl;
public URLData(){
public URLData() {
}
}
@@ -1,8 +1,5 @@
package com.sap.sailing.android.buoy.positioning.app.util;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -24,6 +21,9 @@ import com.sap.sailing.android.shared.data.CheckinUrlInfo;
import com.sap.sailing.android.shared.data.LeaderboardInfo;
import com.sap.sailing.android.shared.logging.ExLog;
import java.util.ArrayList;
import java.util.List;
public class DatabaseHelper {
private final static String TAG = DatabaseHelper.class.getName();
@@ -100,7 +100,7 @@ public class DatabaseHelper {
markPingInfo.setMarkId(markID);
markPingInfo.setTimestamp(mpc.getInt((mpc.getColumnIndex(MarkPing.MARK_PING_TIMESTAMP))));
markPingInfo.setLongitude(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LONGITUDE))));
markPingInfo.setLattitude(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LATITUDE))));
markPingInfo.setLatitude(mpc.getString((mpc.getColumnIndex(MarkPing.MARK_PING_LATITUDE))));
markPingInfo.setAccuracy(mpc.getDouble((mpc.getColumnIndex(MarkPing.MARK_PING_ACCURACY))));
marks.add(markPingInfo);
mpc.moveToNext();
@@ -114,14 +114,19 @@ public class DatabaseHelper {
int d1 = cr.delete(MarkPing.CONTENT_URI, MarkPing.MARK_ID + " = \"" + markID + "\"", null);
if (BuildConfig.DEBUG) {
ExLog.i(context, TAG, "Checkout, number of markpings deleted: " + d1);
ExLog.i(context, TAG, "Checkout, number of markpings for mark: " + markID + " deleted: " + d1);
}
}
public void deleteRegattaFromDatabase(Context context, String checkinDigest) {
ContentResolver cr = context.getContentResolver();
// int d1 = cr.delete(Event.CONTENT_URI, Event.EVENT_CHECKIN_DIGEST + " = \"" + checkinDigest + "\"", null);
List<MarkInfo> marks = getMarks(context,checkinDigest);
for(MarkInfo mark : marks){
deletePingsFromDataBase(context, mark.getId());
}
int d2 = cr.delete(Leaderboard.CONTENT_URI, Leaderboard.LEADERBOARD_CHECKIN_DIGEST + " = \"" + checkinDigest
+ "\"", null);
int d3 = cr.delete(Mark.CONTENT_URI, Mark.MARK_CHECKIN_DIGEST + " = \"" + checkinDigest
@@ -130,7 +135,6 @@ public class DatabaseHelper {
+ "\"", null);
if (BuildConfig.DEBUG) {
// ExLog.i(context, TAG, "Checkout, number of events deleted: " + d1);
ExLog.i(context, TAG, "Checkout, number of leaderbards deleted: " + d2);
ExLog.i(context, TAG, "Checkout, number of marks deleted: " + d3);
ExLog.i(context, TAG, "Checkout, number of checkinurls deleted: " + d4);
@@ -141,8 +145,6 @@ public class DatabaseHelper {
* When checking in, store info on the event, the competitor and the leaderboard in the database.
*
* @param context
* @param event
* @param competitor
* @param leaderboard
* @return success or failure
* @throws GeneralDatabaseHelperException
@@ -150,7 +152,7 @@ public class DatabaseHelper {
* @throws RemoteException
*/
public void storeCheckinRow(Context context, List<MarkInfo> markList,
LeaderboardInfo leaderboard, CheckinUrlInfo checkinURL)
LeaderboardInfo leaderboard, CheckinUrlInfo checkinURL, List<MarkPingInfo> pings)
throws GeneralDatabaseHelperException {
// inserting leaderboard first
@@ -179,6 +181,10 @@ public class DatabaseHelper {
opList.add(ContentProviderOperation.newInsert(Mark.CONTENT_URI).withValues(cmv).build());
}
for(MarkPingInfo ping: pings){
storeMarkPing(context, ping);
}
// checkin url
ContentValues ccuv = new ContentValues();
@@ -199,13 +205,13 @@ public class DatabaseHelper {
}
public void storeMarkPing(Context context, MarkInfo mark, MarkPingInfo markPing) throws GeneralDatabaseHelperException{
public void storeMarkPing(Context context, MarkPingInfo markPing) throws GeneralDatabaseHelperException{
ContentResolver cr = context.getContentResolver();
deletePingsFromDataBase(context, markPing.getMarkId());
ArrayList<ContentProviderOperation> opList = new ArrayList<ContentProviderOperation>();
ContentValues mpcv = new ContentValues();
mpcv.put(MarkPing.MARK_ID, mark.getId());
mpcv.put(MarkPing.MARK_PING_LATITUDE, markPing.getLattitude());
mpcv.put(MarkPing.MARK_ID, markPing.getMarkId());
mpcv.put(MarkPing.MARK_PING_LATITUDE, markPing.getLatitude());
mpcv.put(MarkPing.MARK_PING_LONGITUDE, markPing.getLongitude());
mpcv.put(MarkPing.MARK_PING_ACCURACY, markPing.getAccuracy());
mpcv.put(MarkPing.MARK_PING_TIMESTAMP, markPing.getTimestamp());
@@ -1,24 +1,19 @@
package com.sap.sailing.android.buoy.positioning.app.util;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.location.Location;
import android.widget.Toast;
import com.sap.sailing.android.buoy.positioning.app.util.DatabaseHelper.GeneralDatabaseHelperException;
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;
import com.sap.sailing.android.shared.data.http.HttpJsonPostRequest;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.NetworkHelper;
import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperError;
import com.sap.sailing.android.shared.util.NetworkHelper.NetworkHelperSuccessListener;
import com.sap.sailing.android.shared.services.sending.MessageSendingService;
public class PingHelper {
private static String TAG = PingHelper.class.getName();
@@ -36,37 +31,16 @@ public class PingHelper {
String postUrlStr = leaderBoard.serverUrl
+ prefs.getServerMarkPingPath(leaderBoard.name, mark.getId());
HttpJsonPostRequest request = new HttpJsonPostRequest(new URL(postUrlStr),
fixJson.toString(), context);
NetworkHelper.getInstance(context)
.executeHttpJsonRequestAsnchronously(request, new NetworkHelperSuccessListener() {
@Override
public void performAction(JSONObject arg0) {
Toast.makeText(context, "DATA SEND TO SERVER", Toast.LENGTH_LONG).show();
}
}, new NetworkHelper.NetworkHelperFailureListener() {
@Override
public void performAction(NetworkHelperError arg0) {
Toast.makeText(context, "FAILURE SERVER WAS NOT NOTIFIED", Toast.LENGTH_LONG).show();
}
});;
//context.startService(MessageSendingService.createMessageIntent(context,
// postUrlStr, null, UUID.randomUUID(), fixJson.toString(), null));
context.startService(MessageSendingService.createMessageIntent(context, postUrlStr,
null, UUID.randomUUID(), fixJson.toString(), null));
} catch (JSONException ex) {
ExLog.i(context, TAG,
"Error while building ping json " + ex.getMessage());
} catch (GeneralDatabaseHelperException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@@ -75,10 +49,10 @@ public class PingHelper {
MarkInfo mark) throws GeneralDatabaseHelperException {
MarkPingInfo pingInfo = new MarkPingInfo();
pingInfo.setMarkId(mark.getId());
pingInfo.setLattitude(""+ location.getLatitude());
pingInfo.setLatitude("" + location.getLatitude());
pingInfo.setLongitude("" + location.getLongitude());
pingInfo.setAccuracy(location.getAccuracy());
pingInfo.setTimestamp((int) location.getTime());
DatabaseHelper.getInstance().storeMarkPing(context, mark, pingInfo);
DatabaseHelper.getInstance().storeMarkPing(context, pingInfo);
}
}
@@ -1,14 +1,14 @@
package com.sap.sailing.android.buoy.positioning.app.valueobjects;
import com.sap.sailing.android.shared.data.AbstractCheckinData;
import com.sap.sailing.android.shared.data.CheckinUrlInfo;
import com.sap.sailing.android.shared.data.LeaderboardInfo;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import com.sap.sailing.android.shared.data.AbstractCheckinData;
import com.sap.sailing.android.shared.data.CheckinUrlInfo;
import com.sap.sailing.android.shared.data.LeaderboardInfo;
public class CheckinData extends AbstractCheckinData{
public String leaderboardName;
public String deviceUid;
@@ -16,6 +16,7 @@ public class CheckinData extends AbstractCheckinData{
public String checkinDigest;
public String serverWithPort;
public List<MarkInfo> marks;
public List<MarkPingInfo> pings;
public void setCheckinDigestFromString(String checkinString)
throws UnsupportedEncodingException, NoSuchAlgorithmException {
@@ -3,7 +3,7 @@ package com.sap.sailing.android.buoy.positioning.app.valueobjects;
public class MarkPingInfo {
private String markId;
private String longitude;
private String lattitude;
private String latitude;
private double accuracy;
private int timestamp;
@@ -23,12 +23,12 @@ public class MarkPingInfo {
this.longitude = longitude;
}
public String getLattitude() {
return lattitude;
public String getLatitude() {
return latitude;
}
public void setLattitude(String lattitude) {
this.lattitude = lattitude;
public void setLatitude(String latitude) {
this.latitude = latitude;
}
public double getAccuracy() {
@@ -6,5 +6,6 @@
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry exported="true" kind="lib" path="libs/drag-sort-listview-0.6.1-SNAPSHOT.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.json.simple"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
@@ -1,4 +1,5 @@
apply plugin: "com.android.application"
apply from: "../git.gradle"
def packageName = "com.sap.sailing.racecommittee.app"
def verCode = 6
+30
View File
@@ -0,0 +1,30 @@
/**
* returns current git hash
*/
def getGitHash = { ->
def stdout = new ByteArrayOutputStream()
exec {
commandLine "git", "log", "-n", "1", "--format='%h'"
standardOutput = stdout
}
return stdout.toString().trim().replace("'", "")
}
/**
* set git hash into git.xml
*/
preBuild.doLast {
copy {
from ("../git.template.xml")
into ("res/values")
rename {
String fileName -> fileName.replace(".template", "")
}
filter {
String line -> line.replaceAll("#GITHASH#", getGitHash())
}
}
}
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="git_hash" translatable="false">#GITHASH#</string>
</resources>