From 5c79cedc04a2ac9f94889636e447cb1c1a147dc8 Mon Sep 17 00:00:00 2001 From: xvega Date: Fri, 2 Dec 2016 14:37:13 -0600 Subject: [PATCH 1/2] trazador --- trazador | 1 + 1 file changed, 1 insertion(+) create mode 160000 trazador diff --git a/trazador b/trazador new file mode 160000 index 0000000..d520818 --- /dev/null +++ b/trazador @@ -0,0 +1 @@ +Subproject commit d5208185830ae937e0c82a2bb6d95ab2992de82b From c17231dccf3c1f19d29c10ac51c137410ba58e81 Mon Sep 17 00:00:00 2001 From: xvega Date: Fri, 2 Dec 2016 16:53:45 -0600 Subject: [PATCH 2/2] trazador --- trazador | 1 - trazador/.gitignore | 8 + trazador/.idea/compiler.xml | 22 + .../.idea/copyright/profiles_settings.xml | 3 + trazador/.idea/encodings.xml | 6 + trazador/.idea/gradle.xml | 24 + trazador/.idea/misc.xml | 46 ++ trazador/.idea/modules.xml | 9 + trazador/.idea/runConfigurations.xml | 12 + trazador/.idea/vcs.xml | 6 + trazador/README.md | 31 ++ trazador/app/.gitignore | 1 + trazador/app/build.gradle | 54 ++ trazador/app/proguard-rules.pro | 17 + .../xavi/trazador_v10/ApplicationTest.java | 13 + trazador/app/src/main/AndroidManifest.xml | 47 ++ .../app/src/main/btn_savemetadata-web.png | Bin 0 -> 15418 bytes trazador/app/src/main/ic_launcher-web.png | Bin 0 -> 17889 bytes .../example/xavi/trazador_v10/Finalize.java | 64 +++ .../xavi/trazador_v10/GPS_Service.java | 142 ++++++ .../xavi/trazador_v10/MainActivity.java | 305 +++++++++++ .../trazador_v10/NoticeDialogFragment.java | 37 ++ .../example/xavi/trazador_v10/metadata.java | 66 +++ "trazador/app/src/main/java/org/Icon\r" | 0 .../app/src/main/java/org/labexp/Icon\r" | 0 .../java/org/labexp/traces/ApiConnector.java | 481 ++++++++++++++++++ .../main/java/org/labexp/traces/MapPoint.java | 68 +++ .../main/java/org/labexp/traces/Metadata.java | 76 +++ .../src/main/java/org/labexp/traces/Put.java | 56 ++ .../main/java/org/labexp/traces/Trace.java | 162 ++++++ .../src/main/java/org/labexp/traces/post.java | 56 ++ .../main/res/drawable-hdpi/ic_action_info.png | Bin 0 -> 590 bytes .../main/res/drawable-hdpi/ic_action_stop.png | Bin 0 -> 649 bytes .../main/res/drawable-mdpi/ic_action_info.png | Bin 0 -> 355 bytes .../main/res/drawable-mdpi/ic_action_stop.png | Bin 0 -> 399 bytes .../res/drawable-xhdpi/ic_action_info.png | Bin 0 -> 794 bytes .../res/drawable-xhdpi/ic_action_stop.png | Bin 0 -> 881 bytes .../res/drawable-xxhdpi/ic_action_info.png | Bin 0 -> 1436 bytes .../res/drawable-xxhdpi/ic_action_stop.png | Bin 0 -> 1641 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 4596 bytes .../drawable-xxhdpi/ic_menu_mylocation.png | Bin 0 -> 5307 bytes .../app/src/main/res/drawable/btn_iniciar.png | Bin 0 -> 2739 bytes .../app/src/main/res/drawable/btn_parada.png | Bin 0 -> 2477 bytes .../src/main/res/drawable/ic_center_map.png | Bin 0 -> 4264 bytes .../src/main/res/drawable/ic_follow_me.png | Bin 0 -> 4434 bytes .../src/main/res/drawable/ic_follow_me_on.png | Bin 0 -> 6649 bytes .../main/res/drawable/ic_info_black_24dp.xml | 9 + .../drawable/ic_notifications_black_24dp.xml | 9 + .../main/res/drawable/ic_sync_black_24dp.xml | 9 + trazador/app/src/main/res/drawable/info.png | Bin 0 -> 1256 bytes .../src/main/res/layout/activity_finalize.xml | 26 + .../app/src/main/res/layout/activity_main.xml | 72 +++ .../src/main/res/layout/activity_metadata.xml | 26 + .../src/main/res/layout/content_finalize.xml | 58 +++ .../src/main/res/layout/content_metadata.xml | 67 +++ .../main/res/mipmap-hdpi/btn_savemetadata.png | Bin 0 -> 1396 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4596 bytes .../main/res/mipmap-mdpi/btn_savemetadata.png | Bin 0 -> 1004 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2477 bytes .../res/mipmap-xhdpi/btn_savemetadata.png | Bin 0 -> 1899 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7208 bytes .../res/mipmap-xxhdpi/btn_savemetadata.png | Bin 0 -> 3023 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9178 bytes .../res/mipmap-xxxhdpi/btn_savemetadata.png | Bin 0 -> 4247 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9492 bytes .../app/src/main/res/values-v21/styles.xml | 9 + .../app/src/main/res/values-w820dp/dimens.xml | 6 + trazador/app/src/main/res/values/colors.xml | 6 + trazador/app/src/main/res/values/dimens.xml | 6 + trazador/app/src/main/res/values/strings.xml | 80 +++ trazador/app/src/main/res/values/styles.xml | 20 + .../xavi/trazador_v10/ExampleUnitTest.java | 15 + trazador/build.gradle | 25 + trazador/gradle.properties | 18 + trazador/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + trazador/gradlew | 160 ++++++ trazador/gradlew.bat | 90 ++++ trazador/settings.gradle | 1 + 79 files changed, 2530 insertions(+), 1 deletion(-) delete mode 160000 trazador create mode 100644 trazador/.gitignore create mode 100644 trazador/.idea/compiler.xml create mode 100644 trazador/.idea/copyright/profiles_settings.xml create mode 100644 trazador/.idea/encodings.xml create mode 100644 trazador/.idea/gradle.xml create mode 100644 trazador/.idea/misc.xml create mode 100644 trazador/.idea/modules.xml create mode 100644 trazador/.idea/runConfigurations.xml create mode 100644 trazador/.idea/vcs.xml create mode 100644 trazador/README.md create mode 100644 trazador/app/.gitignore create mode 100644 trazador/app/build.gradle create mode 100644 trazador/app/proguard-rules.pro create mode 100644 trazador/app/src/androidTest/java/com/example/xavi/trazador_v10/ApplicationTest.java create mode 100644 trazador/app/src/main/AndroidManifest.xml create mode 100644 trazador/app/src/main/btn_savemetadata-web.png create mode 100644 trazador/app/src/main/ic_launcher-web.png create mode 100644 trazador/app/src/main/java/com/example/xavi/trazador_v10/Finalize.java create mode 100644 trazador/app/src/main/java/com/example/xavi/trazador_v10/GPS_Service.java create mode 100644 trazador/app/src/main/java/com/example/xavi/trazador_v10/MainActivity.java create mode 100644 trazador/app/src/main/java/com/example/xavi/trazador_v10/NoticeDialogFragment.java create mode 100644 trazador/app/src/main/java/com/example/xavi/trazador_v10/metadata.java create mode 100644 "trazador/app/src/main/java/org/Icon\r" create mode 100644 "trazador/app/src/main/java/org/labexp/Icon\r" create mode 100644 trazador/app/src/main/java/org/labexp/traces/ApiConnector.java create mode 100644 trazador/app/src/main/java/org/labexp/traces/MapPoint.java create mode 100644 trazador/app/src/main/java/org/labexp/traces/Metadata.java create mode 100644 trazador/app/src/main/java/org/labexp/traces/Put.java create mode 100644 trazador/app/src/main/java/org/labexp/traces/Trace.java create mode 100644 trazador/app/src/main/java/org/labexp/traces/post.java create mode 100644 trazador/app/src/main/res/drawable-hdpi/ic_action_info.png create mode 100644 trazador/app/src/main/res/drawable-hdpi/ic_action_stop.png create mode 100644 trazador/app/src/main/res/drawable-mdpi/ic_action_info.png create mode 100644 trazador/app/src/main/res/drawable-mdpi/ic_action_stop.png create mode 100644 trazador/app/src/main/res/drawable-xhdpi/ic_action_info.png create mode 100644 trazador/app/src/main/res/drawable-xhdpi/ic_action_stop.png create mode 100644 trazador/app/src/main/res/drawable-xxhdpi/ic_action_info.png create mode 100644 trazador/app/src/main/res/drawable-xxhdpi/ic_action_stop.png create mode 100644 trazador/app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 trazador/app/src/main/res/drawable-xxhdpi/ic_menu_mylocation.png create mode 100644 trazador/app/src/main/res/drawable/btn_iniciar.png create mode 100644 trazador/app/src/main/res/drawable/btn_parada.png create mode 100644 trazador/app/src/main/res/drawable/ic_center_map.png create mode 100644 trazador/app/src/main/res/drawable/ic_follow_me.png create mode 100644 trazador/app/src/main/res/drawable/ic_follow_me_on.png create mode 100644 trazador/app/src/main/res/drawable/ic_info_black_24dp.xml create mode 100644 trazador/app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 trazador/app/src/main/res/drawable/ic_sync_black_24dp.xml create mode 100644 trazador/app/src/main/res/drawable/info.png create mode 100644 trazador/app/src/main/res/layout/activity_finalize.xml create mode 100644 trazador/app/src/main/res/layout/activity_main.xml create mode 100644 trazador/app/src/main/res/layout/activity_metadata.xml create mode 100644 trazador/app/src/main/res/layout/content_finalize.xml create mode 100644 trazador/app/src/main/res/layout/content_metadata.xml create mode 100644 trazador/app/src/main/res/mipmap-hdpi/btn_savemetadata.png create mode 100644 trazador/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 trazador/app/src/main/res/mipmap-mdpi/btn_savemetadata.png create mode 100644 trazador/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 trazador/app/src/main/res/mipmap-xhdpi/btn_savemetadata.png create mode 100644 trazador/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 trazador/app/src/main/res/mipmap-xxhdpi/btn_savemetadata.png create mode 100644 trazador/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 trazador/app/src/main/res/mipmap-xxxhdpi/btn_savemetadata.png create mode 100644 trazador/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 trazador/app/src/main/res/values-v21/styles.xml create mode 100644 trazador/app/src/main/res/values-w820dp/dimens.xml create mode 100644 trazador/app/src/main/res/values/colors.xml create mode 100644 trazador/app/src/main/res/values/dimens.xml create mode 100644 trazador/app/src/main/res/values/strings.xml create mode 100644 trazador/app/src/main/res/values/styles.xml create mode 100644 trazador/app/src/test/java/com/example/xavi/trazador_v10/ExampleUnitTest.java create mode 100644 trazador/build.gradle create mode 100644 trazador/gradle.properties create mode 100644 trazador/gradle/wrapper/gradle-wrapper.jar create mode 100644 trazador/gradle/wrapper/gradle-wrapper.properties create mode 100755 trazador/gradlew create mode 100644 trazador/gradlew.bat create mode 100644 trazador/settings.gradle diff --git a/trazador b/trazador deleted file mode 160000 index d520818..0000000 --- a/trazador +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d5208185830ae937e0c82a2bb6d95ab2992de82b diff --git a/trazador/.gitignore b/trazador/.gitignore new file mode 100644 index 0000000..c6cbe56 --- /dev/null +++ b/trazador/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/trazador/.idea/compiler.xml b/trazador/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/trazador/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trazador/.idea/copyright/profiles_settings.xml b/trazador/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/trazador/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/trazador/.idea/encodings.xml b/trazador/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/trazador/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/trazador/.idea/gradle.xml b/trazador/.idea/gradle.xml new file mode 100644 index 0000000..cd2ead8 --- /dev/null +++ b/trazador/.idea/gradle.xml @@ -0,0 +1,24 @@ + + + + + + \ No newline at end of file diff --git a/trazador/.idea/misc.xml b/trazador/.idea/misc.xml new file mode 100644 index 0000000..5d19981 --- /dev/null +++ b/trazador/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trazador/.idea/modules.xml b/trazador/.idea/modules.xml new file mode 100644 index 0000000..67de8c2 --- /dev/null +++ b/trazador/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/trazador/.idea/runConfigurations.xml b/trazador/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/trazador/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/trazador/.idea/vcs.xml b/trazador/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/trazador/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/trazador/README.md b/trazador/README.md new file mode 100644 index 0000000..7e7f9d4 --- /dev/null +++ b/trazador/README.md @@ -0,0 +1,31 @@ +# Trazador + +![](http://s.pictub.club/2016/11/29/NcrRi.png) + +## Generar el APK + +Correr el comando + +``` +gradle assemble +``` + +Esto generará el APK en el folder /build/apk/ + +## Características del app + + +1. Grabar una ruta con puntos y paradas +2. Descartas o finalizar un ruta +3. Agregar metadatos a la ruta + + +## Por hacer + + +1. Prevenir problemas de pérdida de datos de ubicación debido a una pérdida de coneccion con el servidor. +2. Separar el SDK para conectarse al servidor del App para poder utilizarlo en otros proyectos. +3. Refactorizar codigo para adaptarlo a estándares adecuados. +6. Dibujar al trazado de ruta sobre el mapa + + diff --git a/trazador/app/.gitignore b/trazador/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/trazador/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/trazador/app/build.gradle b/trazador/app/build.gradle new file mode 100644 index 0000000..e9f05f1 --- /dev/null +++ b/trazador/app/build.gradle @@ -0,0 +1,54 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 24 + buildToolsVersion "24.0.2" + defaultConfig { + applicationId "com.example.xavi.trazador_v10" + minSdkVersion 16 + targetSdkVersion 24 + versionCode 1 + versionName "1.0" + vectorDrawables.useSupportLibrary = true + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + productFlavors { + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + + compile 'com.google.code.gson:gson:2.6.2' + compile 'com.squareup.okhttp3:okhttp:3.4.2' + compile 'com.android.support:appcompat-v7:24.2.1' + compile 'com.jakewharton.threetenabp:threetenabp:1.0.4' + + compile 'com.android.support:appcompat-v7:24.2.0' + + compile 'com.android.support:design:24.2.0' + + compile 'org.osmdroid:osmdroid-android:5.5:release@aar' + + compile 'com.github.MKergall:osmbonuspack:6.0' + + compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:4.2.0-beta.4@aar'){ + transitive=true + } + + + +} + + + + + + + diff --git a/trazador/app/proguard-rules.pro b/trazador/app/proguard-rules.pro new file mode 100644 index 0000000..28c9d78 --- /dev/null +++ b/trazador/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/xavi/Android/Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/trazador/app/src/androidTest/java/com/example/xavi/trazador_v10/ApplicationTest.java b/trazador/app/src/androidTest/java/com/example/xavi/trazador_v10/ApplicationTest.java new file mode 100644 index 0000000..6a6ed82 --- /dev/null +++ b/trazador/app/src/androidTest/java/com/example/xavi/trazador_v10/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.example.xavi.trazador_v10; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/trazador/app/src/main/AndroidManifest.xml b/trazador/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4ed4fe4 --- /dev/null +++ b/trazador/app/src/main/AndroidManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trazador/app/src/main/btn_savemetadata-web.png b/trazador/app/src/main/btn_savemetadata-web.png new file mode 100644 index 0000000000000000000000000000000000000000..e46a8a0434e0a571e0e5f57ced6d0e5201a13b45 GIT binary patch literal 15418 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 literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/java/com/example/xavi/trazador_v10/Finalize.java b/trazador/app/src/main/java/com/example/xavi/trazador_v10/Finalize.java new file mode 100644 index 0000000..2e479fb --- /dev/null +++ b/trazador/app/src/main/java/com/example/xavi/trazador_v10/Finalize.java @@ -0,0 +1,64 @@ +package com.example.xavi.trazador_v10; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.widget.Toast; + +public class Finalize extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_finalize); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + FloatingActionButton guardar = (FloatingActionButton) findViewById(R.id.btn_guardar); + FloatingActionButton cancelar = (FloatingActionButton) findViewById(R.id.btn_cancelar); + + + + guardar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MainActivity.state = 0; + Toast.makeText(getBaseContext(), "Fin de ruta", Toast.LENGTH_SHORT).show(); + MainActivity.btnInicio.setBackgroundResource(R.drawable.btn_iniciar); + + MainActivity.trace.finished(); + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + clearMapMarks(); + finish(); + + } + }); + cancelar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MainActivity.state = 0; + Toast.makeText(getBaseContext(), "Fin de ruta", Toast.LENGTH_SHORT).show(); + MainActivity.btnInicio.setBackgroundResource(R.drawable.btn_iniciar); + clearMapMarks(); + MainActivity.trace.discarded(); + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + + } + }); + } + + private void clearMapMarks() { + for (int x = 0; x< MainActivity.points.size() ; x++ ){ + MainActivity.map.getOverlays().remove(MainActivity.points.get(x)); + } + MainActivity.points.clear(); + } + +} diff --git a/trazador/app/src/main/java/com/example/xavi/trazador_v10/GPS_Service.java b/trazador/app/src/main/java/com/example/xavi/trazador_v10/GPS_Service.java new file mode 100644 index 0000000..230b40a --- /dev/null +++ b/trazador/app/src/main/java/com/example/xavi/trazador_v10/GPS_Service.java @@ -0,0 +1,142 @@ +package com.example.xavi.trazador_v10; + + +import android.Manifest; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; +import android.os.IBinder; +import android.provider.Settings; +import android.support.annotation.Nullable; + +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.res.ResourcesCompat; +import android.widget.Toast; + +import com.mapbox.mapboxsdk.geometry.LatLng; + +import org.osmdroid.util.GeoPoint; +import org.osmdroid.views.overlay.Marker; + +/** + * Created by xavi on 29/09/16. + */ +public class GPS_Service extends Service { + + private LocationListener listener; + private LocationManager locationManager; + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + + @Override + public void onCreate() { + + + listener = new LocationListener() { + @Override + public void onLocationChanged(Location location) { + Intent i = new Intent("location_update"); + //i.putExtra("coordinates",location.getLongitude() + " " + location.getLatitude()); + + double latitude = location.getLatitude(); + double longitude = location.getLongitude(); + LatLng newPosition = new LatLng(latitude, longitude); + + i.putExtra("latitude", latitude); + i.putExtra("longitude", longitude); + i.putExtra("coordinates", location.getLongitude() + " " + location.getLatitude()); + i.putExtra("newPosition", newPosition); + + sendBroadcast(i); + if (MainActivity.state == 1) { + + MainActivity.trace.addPoint(location.getLatitude(), location.getLongitude()); + GeoPoint position = new GeoPoint(location.getLatitude(), location.getLongitude()); + String nombre = "punto"; + addPoint(position, nombre, R.drawable.ic_menu_mylocation); + + + } else if (MainActivity.state == 2) { + //Toast.makeText(getBaseContext(), "Agrega posicion como parada", Toast.LENGTH_SHORT).show(); + MainActivity.trace.addStop(location.getLatitude(), location.getLongitude()); + GeoPoint position = new GeoPoint(location.getLatitude(), location.getLongitude()); + String nombre = "parada"; + addPoint(position, nombre, R.drawable.ic_launcher); + MainActivity.state = 1; + } + + + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + + } + + @Override + public void onProviderEnabled(String provider) { + + } + + @Override + public void onProviderDisabled(String provider) { + Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(i); + } + }; + + locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); + //noinspection MissingPermission + + + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, listener); + + + + + } + + private void addPoint(GeoPoint position, String nombre, int drawable ) { + Marker point; + point = new Marker(MainActivity.map); + point.setPosition(position); + point.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM); + + Drawable myIcon = ResourcesCompat.getDrawable(getResources(), drawable, null); + point.setIcon(myIcon); + MainActivity.map.getOverlays().add(point); + point.setTitle(nombre); + MainActivity.points.add(point); + MainActivity.map.invalidate(); + + } + + @Override + public void onTaskRemoved (Intent rootIntent){ + MainActivity.trace.discarded(); + super.onTaskRemoved (rootIntent); + } + @Override + public void onDestroy() { + + + super.onDestroy(); + if(locationManager != null) + //noinspection MissingPermission + locationManager.removeUpdates(listener); + } + +} diff --git a/trazador/app/src/main/java/com/example/xavi/trazador_v10/MainActivity.java b/trazador/app/src/main/java/com/example/xavi/trazador_v10/MainActivity.java new file mode 100644 index 0000000..d288d80 --- /dev/null +++ b/trazador/app/src/main/java/com/example/xavi/trazador_v10/MainActivity.java @@ -0,0 +1,305 @@ +package com.example.xavi.trazador_v10; + +import android.Manifest; +import android.app.Activity; +import android.app.Dialog; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.location.SettingInjectorService; +import android.os.Build; +import android.provider.Settings; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.res.ResourcesCompat; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.util.SortedList; +import android.telephony.TelephonyManager; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +import com.jakewharton.threetenabp.AndroidThreeTen; + +import org.labexp.traces.Trace; +import org.osmdroid.tileprovider.constants.OpenStreetMapTileProviderConstants; +import org.osmdroid.tileprovider.tilesource.TileSourceFactory; +import org.osmdroid.util.GeoPoint; +import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.ItemizedIconOverlay; +import org.osmdroid.views.overlay.ItemizedOverlay; +import org.osmdroid.views.overlay.ItemizedOverlayWithFocus; +import org.osmdroid.views.overlay.OverlayItem; +import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; +import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.UUID; + + +import org.osmdroid.api.IMapController; +import org.osmdroid.bonuspack.routing.OSRMRoadManager; +import org.osmdroid.bonuspack.routing.Road; +import org.osmdroid.bonuspack.routing.RoadManager; +import org.osmdroid.views.overlay.Marker; +import com.mapbox.mapboxsdk.geometry.LatLng; +import org.osmdroid.views.overlay.PathOverlay; +import org.osmdroid.views.overlay.Polyline; +import org.osmdroid.views.overlay.mylocation.IMyLocationProvider; + + + + +public class MainActivity extends FragmentActivity implements NoticeDialogFragment.NoticeDialogListener{ + + public static Button btnInicio; + private FloatingActionButton btnStop; + private FloatingActionButton btnInfo; + + + public static Trace trace; + + private Button btnParada; + boolean isPressed = false; + + private BroadcastReceiver broadcastReceiver; + + Location location; + + private LocationManager locationManager; + private LocationListener locationListener; + + + + + private double latitud = 0.0; + private double longitud = 0.0; + + + + static MapView map; + static Marker actualPositionMarker; + + static ArrayList points = new ArrayList<>(); + + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + //important! set your user agent to prevent getting banned from the osm servers + OpenStreetMapTileProviderConstants.setUserAgentValue(BuildConfig.APPLICATION_ID); + + + Intent i = new Intent(getApplicationContext(),GPS_Service.class); + startService(i); + + btnInicio = (Button) findViewById(R.id.btn_iniciar); + btnStop = (FloatingActionButton) findViewById(R.id.btn_stop); + btnInfo = (FloatingActionButton) findViewById(R.id.btn_info); + + + + map = (MapView) findViewById(R.id.map); + + map.setTileSource(TileSourceFactory.MAPNIK); + map.setBuiltInZoomControls(true); + map.setMultiTouchControls(true); + map.getController().setZoom(18); + + + + if(!runtime_permissions()) { + enable_buttons(); + } + AndroidThreeTen.init(this); + + + + + } + @Override + protected void onResume() { + super.onResume(); + if(broadcastReceiver == null){ + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + /*Toast.makeText(getApplicationContext(), "Lat: " + intent.getExtras().get("latitude") + "Long: " + + intent.getExtras().get("longitude"), + Toast.LENGTH_LONG).show();*/ + + latitud = Double.parseDouble(intent.getExtras().get("latitude").toString()); + longitud = Double.parseDouble(intent.getExtras().get("longitude").toString()); + + GeoPoint position = new GeoPoint(latitud,longitud); + map.getController().setCenter(position); + + + + marketCurrentPosition(position); + + } + }; + } + + registerReceiver(broadcastReceiver, new IntentFilter("location_update")); + } + + private void marketCurrentPosition(GeoPoint position) { + map.getOverlays().remove(actualPositionMarker); + actualPositionMarker = new Marker(map); + actualPositionMarker.setPosition(position); + actualPositionMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM); + Drawable myIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_follow_me, null); + actualPositionMarker.setIcon(myIcon); + map.getOverlays().add(actualPositionMarker); + map.invalidate(); + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(broadcastReceiver != null){ + unregisterReceiver(broadcastReceiver); + } + } + + static int state = 0; + private void enable_buttons(){ + + + btnInicio.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (v == btnInicio && state == 0) { + final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); + final String tmDevice, tmSerial, androidId; + tmDevice = "" + tm.getDeviceId(); + tmSerial = "" + tm.getSimSerialNumber(); + androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); + UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); + String deviceId = deviceUuid.toString(); + MainActivity.trace = new Trace(deviceId); + + try { + MainActivity.trace.start("http://buses.tec.siua.ac.cr"); + } catch (IOException e) { + e.printStackTrace(); + } + state = 1; + //Toast.makeText(getBaseContext(), "Inicio de ruta", Toast.LENGTH_SHORT).show(); + btnInicio.setBackgroundResource( R.drawable.btn_parada); + GeoPoint parada = new GeoPoint(latitud, longitud); + marketCurrentPosition(parada); + } + else if (v == btnInicio && state == 1){ + state = 2; + } + } + }); + + btnStop.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick (View v){ + if (state != 0) { + Intent myIntent = new Intent(getApplicationContext(), Finalize.class); + startActivityForResult(myIntent, 0); + } + + } + + }); + + btnInfo.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick (View v){ + + Intent myIntent = new Intent(getApplicationContext(), metadata.class); + startActivityForResult(myIntent, 0); + + } + + }); + + + + } + + + private boolean runtime_permissions(){ + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ContextCompat.checkSelfPermission(this,Manifest.permission + .ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED + && ContextCompat.checkSelfPermission(this, + Manifest.permission.READ_PHONE_STATE ) != PackageManager.PERMISSION_GRANTED){ + requestPermissions(new String[]{ + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_NETWORK_STATE, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.INTERNET}, 100); + + return true; + } + return false; + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if(requestCode == 100){ + + if(grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager + .PERMISSION_GRANTED){ + enable_buttons(); + }else { + runtime_permissions(); + } + + + } + } + + public void showNoticeDialog() { + // Create an instance of the dialog fragment and show it + DialogFragment dialog = new NoticeDialogFragment(); + dialog.show(getSupportFragmentManager(), "NoticeDialogFragment"); + + + + } + + + @Override + public void onDialogPositiveClick(DialogFragment dialog) { + + Toast.makeText(getBaseContext(),"Aceptar",Toast.LENGTH_SHORT).show(); + + } + + @Override + public void onDialogNegativeClick(DialogFragment dialog) { + + Toast.makeText(getBaseContext(),"Cancelar",Toast.LENGTH_SHORT).show(); + + } +} + diff --git a/trazador/app/src/main/java/com/example/xavi/trazador_v10/NoticeDialogFragment.java b/trazador/app/src/main/java/com/example/xavi/trazador_v10/NoticeDialogFragment.java new file mode 100644 index 0000000..0ce0073 --- /dev/null +++ b/trazador/app/src/main/java/com/example/xavi/trazador_v10/NoticeDialogFragment.java @@ -0,0 +1,37 @@ +package com.example.xavi.trazador_v10; + +import android.app.Activity; +import android.support.v4.app.DialogFragment; + +/** + * Created by xavi on 06/10/16. + */ +public class NoticeDialogFragment extends DialogFragment { + + /* The activity that creates an instance of this dialog fragment must + * implement this interface in order to receive event callbacks. + * Each method passes the DialogFragment in case the host needs to query it. */ + public interface NoticeDialogListener { + public void onDialogPositiveClick(DialogFragment dialog); + public void onDialogNegativeClick(DialogFragment dialog); + } + + // Use this instance of the interface to deliver action events + NoticeDialogListener mListener; + + // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + // Verify that the host activity implements the callback interface + try { + // Instantiate the NoticeDialogListener so we can send events to the host + mListener = (NoticeDialogListener) activity; + } catch (ClassCastException e) { + // The activity doesn't implement the interface, throw exception + throw new ClassCastException(activity.toString() + + " must implement NoticeDialogListener"); + } + } + +} diff --git a/trazador/app/src/main/java/com/example/xavi/trazador_v10/metadata.java b/trazador/app/src/main/java/com/example/xavi/trazador_v10/metadata.java new file mode 100644 index 0000000..ac0af5f --- /dev/null +++ b/trazador/app/src/main/java/com/example/xavi/trazador_v10/metadata.java @@ -0,0 +1,66 @@ +package com.example.xavi.trazador_v10; + +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.design.widget.TextInputEditText; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.content.Intent; +import android.widget.EditText; + +public class metadata extends AppCompatActivity { + + EditText Codigo; + EditText Nombre; + EditText Costo; + + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_metadata); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + FloatingActionButton btnGuardar; + FloatingActionButton btnCancelar; + Codigo = (EditText) findViewById(R.id.editText); + Nombre = (EditText) findViewById(R.id.editText2); + Costo = (EditText) findViewById(R.id.editText3); + + btnGuardar = (FloatingActionButton) findViewById(R.id.btn_guardar); + btnCancelar = (FloatingActionButton) findViewById(R.id.btn_cancelar); + + btnGuardar.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick (View v){ + String textCodigo = Codigo.getText().toString(); + String textNombre = Nombre.getText().toString(); + String textCosto = Costo.getText().toString(); + MainActivity.trace.setMetadata(textCodigo, textNombre, textCosto); + + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + } + }); + + btnCancelar.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick (View v){ + + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + + + } + + }); + + } + +} diff --git "a/trazador/app/src/main/java/org/Icon\r" "b/trazador/app/src/main/java/org/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git "a/trazador/app/src/main/java/org/labexp/Icon\r" "b/trazador/app/src/main/java/org/labexp/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/trazador/app/src/main/java/org/labexp/traces/ApiConnector.java b/trazador/app/src/main/java/org/labexp/traces/ApiConnector.java new file mode 100644 index 0000000..15d4556 --- /dev/null +++ b/trazador/app/src/main/java/org/labexp/traces/ApiConnector.java @@ -0,0 +1,481 @@ +package org.labexp.traces; + +/* +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; + +import com.sun.jersey.api.client.config.DefaultClientConfig; + +import com.sun.jersey.api.json.JSONConfiguration; +import com.sun.jersey.json.impl.provider.entity.JSONListElementProvider; +import com.sun.jersey.api.client.config.ClientConfig; + + + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +*/ +import android.os.Build; +import android.support.annotation.RequiresApi; + +import okhttp3.MediaType; +import okhttp3.OkHttpClient; + + +import java.io.IOException; +import java.util.ArrayList; +import java.util.concurrent.ExecutionException; + +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONArray; +import org.threeten.bp.Instant; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZonedDateTime; +import org.threeten.bp.format.DateTimeFormatter; + +/** + * This class is a direct connection to the API server . + */ +public class ApiConnector { + /** + * jersey client to connect the server. + */ + private static OkHttpClient client; + /*private static Client client; + /** + * Server url. + */ + private static String apiBaseUrl ; + /** + * Format to save date on the server. + */ + private static final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss"; + /** + * sub-url to Post trace start. + */ + private static final String POST_START_TRACE = "/buses/v0.1/trace"; + /** + * sub-url to Post a list of points. + */ + private static final String POST_POINTS = "/buses/v0.1/trace//points"; + /** + * sub-url to Post a stop point. + */ + private static final String POST_STOP = "/buses/v0.1/trace//stop"; + /** + * sub-url to put metadata + */ + private static final String PUT_METADATA = "/buses/v0.1/trace//metadata"; + /** + * sub-url to finalize trace. + */ + private static final String PUT_FINALIZE = "/buses/v0.1/trace/"; + /** + * server response ok. + */ + private static final int OK_RESPONSE = 200; + + public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + + public static String localtraceId = ""; + + + /** + * Starts Jersey client. + */ + public static void createClient(String url) { + apiBaseUrl = url; + + + /* + ClientConfig clientConfig = new DefaultClientConfig(); + clientConfig.getFeatures().put( + JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); + client = Client.create(clientConfig); + */ + } + /** + * Starts trace on server. + * @param deviceId A unique identificator for the client device. + * @return unique trace identificator + */ + public static String startTrace(final String deviceId) throws java.io.IOException{ + /* + // Creates a webResource with the API + WebResource webResource = client.resource(apiBaseUrl + POST_START_TRACE); + */ + // Building the Post content + String jsonInput = ""; + try { + jsonInput = new JSONObject() + .put("deviceId", deviceId) + .put("timestamp", getDate()) + .toString(); + } catch (JSONException e) { + e.printStackTrace(); + } + + Post async = new Post(); + try { + async.execute(apiBaseUrl + POST_START_TRACE, jsonInput, "Post").get(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + + + + /* + // POST method + ClientResponse response = webResource + .accept("application/json") + .type("application/json") + .Post(ClientResponse.class, jsonInput); + + // Check response status code + if (response.getStatus() != OK_RESPONSE) { + throw new RuntimeException( + "Failed : HTTP error code : " + response.getStatus()); + } + + // Reads response + String output = response.getEntity(String.class); + String traceId = ""; + + try { + JSONObject result = new JSONObject(output); + traceId = result.getString("traceId"); + } catch (JSONException e) { + e.printStackTrace(); + } + + return traceId; +*/ + return ""; + } + + /** + * @param deviceId unique device id + * @param traceId unique trace id + * @param points list of points to be add + * @return server response + * @throws RuntimeException server connection error + */ + public static boolean addPoints( + final String deviceId, + final String traceId, + final ArrayList points)throws RuntimeException { + + /* + // Creates a webResource with the API url to Post start a trace + WebResource webResource = client.resource( + apiBaseUrl + POST_POINTS.replaceFirst("\\{traceId\\}", traceId)); + */ + // Building the Post content + + String url = apiBaseUrl + POST_POINTS.replaceFirst("", localtraceId); + String jsonInput = ""; + try { + + JSONArray jsonPointList = new JSONArray(); + for (MapPoint point : points){ + JSONObject pointElement = new JSONObject() + .put("latitude", point.getX()+"") + .put("longitude", point.getY()+""); + jsonPointList.put(pointElement); + } + + jsonInput = new JSONObject() + .put("deviceId", deviceId) + .put("timestamp", getDate()) + .put("points", jsonPointList) + .toString(); + System.out.println(jsonInput); + post(url, jsonInput); + + } catch (JSONException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + + /* + // POST method + ClientResponse response = webResource + .accept("application/json") + .type("application/json") + .Post(ClientResponse.class, jsonInput); + + // Check response status code + if (response.getStatus() != OK_RESPONSE) { + throw new RuntimeException( + "Failed : HTTP error code : " + response.getStatus()); + } + else{ + return true; + } + */ + return true; + + } + + + /** + * @param deviceId unique device id + * @param traceId unique trace id + * @param stop stop position + * @return server response + * @throws RuntimeException server connection error + */ + public static boolean addStop( + final String deviceId, + final String traceId, + final MapPoint stop)throws RuntimeException { +/* + // Creates a webResource with the API url + WebResource webResource = client.resource( + apiBaseUrl + POST_STOP.replaceFirst("\\{traceId\\}", traceId)); +*/ + // Building the Post content + String url = apiBaseUrl + POST_STOP.replaceFirst("", localtraceId); + String jsonInput = ""; + try { + + + JSONObject pointElement = + new JSONObject() + .put("latitude", stop.getX()+"") + .put("longitude", stop.getY()+""); + + jsonInput = new JSONObject() + .put("deviceId", deviceId) + .put("timestamp", getDate()) + .put("stop", pointElement) + .toString(); + System.out.println(jsonInput); + post(url, jsonInput); + + } catch (JSONException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + /* + // POST method + ClientResponse response = webResource + .accept("application/json") + .type("application/json") + .Post(ClientResponse.class, jsonInput); + + // Check response status code + if (response.getStatus() != OK_RESPONSE) { + throw new RuntimeException( + "Failed : HTTP error code : " + response.getStatus()); + } + else{ + return true; + } + */ + return true; + + } + + /** + * @param deviceId unique device id + * @param traceId unique trace id + * @param metadata information about the trace + * @return server response + * @throws RuntimeException server connection error + */ + public static boolean setMetadata( + final String deviceId, + final String traceId, + final Metadata metadata)throws RuntimeException { +/* + // Creates a webResource with the API url + WebResource webResource = client.resource( + apiBaseUrl + PUT_METADATA.replaceFirst("\\{traceId\\}", traceId)); +*/ + String url = apiBaseUrl + PUT_METADATA.replaceFirst("", localtraceId); + // Building the put content + String jsonInput = ""; + try { + + jsonInput = new JSONObject() + .put("deviceId", deviceId) + .put("timestamp", getDate()) + .put("routeCode", metadata.getRouteCode()) + .put("routeName", metadata.getRouteName()) + .put("routePrice", metadata.getRoutePrice()) + .toString(); + put(url, jsonInput); + + } catch (JSONException e) { + + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + /* + // Put method + ClientResponse response = webResource + .accept("application/json") + .type("application/json") + .put(ClientResponse.class, jsonInput); + + // Check response status code + if (response.getStatus() != OK_RESPONSE) { + throw new RuntimeException( + "Failed : HTTP error code : " + response.getStatus()); + } + else{ + return true; + } + */ + return true; + + } + + /** + * @param traceId unique trace id + * @return server response + * @throws RuntimeException server connection error + */ + public static boolean finished( + final String traceId)throws RuntimeException { +/* + // Creates a webResource with the API url + WebResource webResource = client.resource( + apiBaseUrl + PUT_FINALIZE.replaceFirst("\\{traceId\\}", traceId)); +*/ + String url = apiBaseUrl + PUT_FINALIZE.replaceFirst("", localtraceId); + // Building the Post content + String jsonInput = ""; + try { + + jsonInput = new JSONObject() + .put("status", "finished") + .toString(); + put(url, jsonInput); + + } catch (JSONException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + /* + // PUT method + ClientResponse response = webResource + .accept("application/json") + .type("application/json") + .put(ClientResponse.class, jsonInput); + + // Check response status code + if (response.getStatus() != OK_RESPONSE) { + throw new RuntimeException( + "Failed : HTTP error code : " + response.getStatus()); + } + else{ + return true; + } + */ + return true; + + } + + /** + * @param traceId unique trace id + * @return server response + * @throws RuntimeException server connection error + */ + public static boolean discarded( + final String traceId)throws RuntimeException { + + /* + // Creates a webResource with the API url + WebResource webResource = client.resource( + apiBaseUrl + PUT_FINALIZE.replaceFirst("\\{traceId\\}", traceId)); +*/ + String url = apiBaseUrl + PUT_FINALIZE.replaceFirst("", localtraceId); + // Building the Post content + String jsonInput = ""; + try { + + jsonInput = new JSONObject() + .put("status", "discarded") + .toString(); + + put(url, jsonInput); + + } catch (JSONException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + /* + // PUT method + ClientResponse response = webResource + .accept("application/json") + .type("application/json") + .put(ClientResponse.class, jsonInput); + + // Check response status code + if (response.getStatus() != OK_RESPONSE) { + throw new RuntimeException( + "Failed : HTTP error code : " + response.getStatus()); + } + else{ + return true; + } + */ + return true; + + } + + /** + * Calculates timeZone and formats date into a string. + * @return Date with the format of @DATE_FORMAT. + */ + private static String getDate() { + + Instant instant = Instant.now(); + ZoneId zoneId = ZoneId.of( "America/Costa_Rica" ); + ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); + DateTimeFormatter dtfOut = DateTimeFormatter.ofPattern(DATE_FORMAT); + return zdt.format(dtfOut).toString(); + + + + } + + public Instant now() { + return Instant.now(); + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + + static String post(String url, String json) throws java.io.IOException { + Post async = new Post(); + async.execute(url, json); + return ""; + + + } + + static String put(String url, String json) throws java.io.IOException { + Put async = new Put(); + async.execute(url, json); + return ""; + + + } + + +} diff --git a/trazador/app/src/main/java/org/labexp/traces/MapPoint.java b/trazador/app/src/main/java/org/labexp/traces/MapPoint.java new file mode 100644 index 0000000..b18faf8 --- /dev/null +++ b/trazador/app/src/main/java/org/labexp/traces/MapPoint.java @@ -0,0 +1,68 @@ + +package org.labexp.traces; + +/** + * @author Leo + * + */ +public class MapPoint { + /* + * Represents position over latitude. + */ + private double x; + /* + * Represents position over longitude. + */ + private double y; + + /** + * New MapPoint based on latitude and longitude values. + * @param x Latitude. + * @param y Longitude. + */ + public MapPoint(final double x, final double y) { + this.x = x; + this.y = y; + } + /** + * Get Latitude. + * @return latitude + */ + public double getX() { + return x; + } + + /** + * Set Latitude. + * @param x latitude + */ + public void setX(final double x) { + this.x = x; + } + + /** + * Get Longitude. + * @return longitude + */ + public double getY() { + return y; + } + + /** + * Set longitude. + * @param y longitude + */ + public void setY(final double y) { + this.y = y; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "MapPoint [latitude=" + x + ", longitude=" + y + "]"; + } + + + +} diff --git a/trazador/app/src/main/java/org/labexp/traces/Metadata.java b/trazador/app/src/main/java/org/labexp/traces/Metadata.java new file mode 100644 index 0000000..c80751b --- /dev/null +++ b/trazador/app/src/main/java/org/labexp/traces/Metadata.java @@ -0,0 +1,76 @@ +package org.labexp.traces; + +/** + * Used to save the metadata related to a trace + * @author Leo + * + */ +public class Metadata { + /** + * The code of the route. + */ + private String routeCode; + /** + * The name of the route. + */ + private String routeName; + /** + * The price of the route. + */ + private String routePrice; + /** + * @return the route code + */ + public String getRouteCode() { + return routeCode; + } + /** + * @param routeCode the route code to set + */ + public void setRouteCode(final String routeCode) { + this.routeCode = routeCode; + } + /** + * @return the route name + */ + public String getRouteName() { + return routeName; + } + /** + * @param routeName the route name to set + */ + public void setRouteName(final String routeName) { + this.routeName = routeName; + } + /** + * @return the route price + */ + public String getRoutePrice() { + return routePrice; + } + /** + * @param routePrice the route price to set + */ + public void setRoutePrice(final String routePrice) { + this.routePrice = routePrice; + } + /** + * @param routeCode code + * @param routeName name + * @param routePrice price + */ + public Metadata(final String routeCode, final String routeName, final String routePrice) { + super(); + this.routeCode = routeCode; + this.routeName = routeName; + this.routePrice = routePrice; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Metadata [Code=" + routeCode + ", Name=" + routeName + ", Price=" + routePrice + "]"; + } + +} diff --git a/trazador/app/src/main/java/org/labexp/traces/Put.java b/trazador/app/src/main/java/org/labexp/traces/Put.java new file mode 100644 index 0000000..236e15d --- /dev/null +++ b/trazador/app/src/main/java/org/labexp/traces/Put.java @@ -0,0 +1,56 @@ +package org.labexp.traces; + +import android.os.AsyncTask; + +import org.json.JSONException; +import org.json.JSONObject; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +import static org.labexp.traces.ApiConnector.JSON; + + +class Put extends AsyncTask { + + + private static OkHttpClient client; + + String response; + + protected String doInBackground(String... params) { + if (client == null){ + client = new OkHttpClient(); + } + String sb = params[1]; + RequestBody body = RequestBody.create(JSON, sb); + + + Request request = new Request.Builder() + .url(params[0]) + .put(body) + .build(); + + + try (Response response = client.newCall( request).execute()) { + if (params.length >2 ) + if (params[2].equals("Post")){ + JSONObject jsonObj = new JSONObject(ApiConnector.localtraceId = response.body().string()); + ApiConnector.localtraceId = jsonObj.getString("traceId"); + + } + } + catch (java.io.IOException x) { + return "null"; + + } catch (JSONException e) { + e.printStackTrace(); + } + return ""; + + + } + +} diff --git a/trazador/app/src/main/java/org/labexp/traces/Trace.java b/trazador/app/src/main/java/org/labexp/traces/Trace.java new file mode 100644 index 0000000..7eb3745 --- /dev/null +++ b/trazador/app/src/main/java/org/labexp/traces/Trace.java @@ -0,0 +1,162 @@ +/** + * + */ +package org.labexp.traces; + +import java.util.ArrayList; + +/** + * @author Leo + * + */ +public class Trace { + /* + * Trace identifier (provide by the server) + */ + private String traceId; + /* + * Device identifier (provide by the user) + */ + private String deviceId; + /* + * The url of the Api server + */ + private String apiBaseUrl; + /** + * @return the trace id + */ + public final String getTraceId() { + return traceId; + } + /** + * @return the device id + */ + public final String getDeviceId() { + return deviceId; + } + + + /** + * @return the apiBaseUrl + */ + public String getApiBaseUrl() { + return apiBaseUrl; + } + + /** + * Creates a trace using a unique device identificator. + * @param deviceId + */ + public Trace(String deviceId) { + super(); + this.deviceId = deviceId; + } + + /** + * Starts the trace on the server. + * @param apiBaseUrl the base url of the API Server: + * example: "http://10.173.1.153" + * @return a unique trace id and this is saved on traceId + * + */ + public void start(String apiBaseUrl) throws java.io.IOException{ + this.apiBaseUrl = apiBaseUrl; + ApiConnector.createClient(apiBaseUrl); + this.traceId = ApiConnector.startTrace (deviceId); + } + + /** + * @param routeCode code + * @param routeName name + * @param routePrice prices + * @return transaction success + */ + public boolean setMetadata( + final String routeCode, + final String routeName, + final String routePrice) { + Metadata metadata = new Metadata(routeCode, routeName, routePrice); + setMetadata(metadata); + return true; + } + + /** + * @param metadata trace metadata + * @return transaction success + */ + public boolean setMetadata(final Metadata metadata) { + return ApiConnector.setMetadata(deviceId, traceId, metadata); + + } + + /** + * @param points List of points to add + * @return transaction success + */ + public boolean addPoints(final ArrayList points) { + return ApiConnector.addPoints(deviceId, traceId, points); + } + + /** + * @param x latitude. + * @param y longitude. + * @return transaction success + */ + public boolean addPoint(final double x, final double y) { + MapPoint point = new MapPoint(x, y); + ArrayList points = new ArrayList(); + points.add(point); + addPoints (points); + return true; + } + + /** + * @param point position + * @return transaction success + */ + public boolean addPoint(final MapPoint point) { + ArrayList points = new ArrayList(); + points.add(point); + addPoints (points); + return true; + } + + /** + * @param stop stop position + * @return transaction success + */ + public boolean addStop(final MapPoint stop) { + return ApiConnector.addStop(deviceId, traceId, stop); + } + + /** + * @param x latitude. + * @param y longitude. + * @return transaction success + */ + public boolean addStop(final double x, final double y) { + MapPoint point = new MapPoint(x, y); + return addStop(point); + } + + + + /** + * Mark trace as finished on the server + * @return transaction success + */ + public boolean finished() { + ApiConnector.finished(traceId); + return true; + } + + /** + * Mark trace as finished on the server + * @return transaction success + */ + public boolean discarded() { + ApiConnector.discarded(traceId); + return true; + } + +} diff --git a/trazador/app/src/main/java/org/labexp/traces/post.java b/trazador/app/src/main/java/org/labexp/traces/post.java new file mode 100644 index 0000000..e89bb89 --- /dev/null +++ b/trazador/app/src/main/java/org/labexp/traces/post.java @@ -0,0 +1,56 @@ +package org.labexp.traces; + +import android.os.AsyncTask; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONArray; + +import static org.labexp.traces.ApiConnector.JSON; + + +class Post extends AsyncTask { + + + private static OkHttpClient client; + + String response; + + protected String doInBackground(String... params) { + if (client == null){ + client = new OkHttpClient(); + } + String sb = params[1]; + RequestBody body = RequestBody.create(JSON, sb); + + + Request request = new Request.Builder() + .url(params[0]) + .post(body) + .build(); + + + try (Response response = client.newCall( request).execute()) { + if (params.length >2 ) + if (params[2].equals("Post")){ + JSONObject jsonObj = new JSONObject(ApiConnector.localtraceId = response.body().string()); + ApiConnector.localtraceId = jsonObj.getString("traceId"); + + } + } + catch (java.io.IOException x) { + return "null"; + + } catch (JSONException e) { + e.printStackTrace(); + } + return ""; + + + } + +} diff --git a/trazador/app/src/main/res/drawable-hdpi/ic_action_info.png b/trazador/app/src/main/res/drawable-hdpi/ic_action_info.png new file mode 100644 index 0000000000000000000000000000000000000000..eef197e6793a75ff2b3619186219e6985bc87ad2 GIT binary patch literal 590 zcmV-U0qx_zCg9_WGC<~3}NkN<0h++ zfe&Sqnam`U`HAN_a^%R7BS(%r?|eSz2~UI}VNN&@j=%xm2AGq-CB;jGSHcd;{zl-4 zxn04Vw(>88t%A~*Ab4A8DE>hBkd!$Q76hMAAruK2ponii=A0zn5g}(&`7fq~_+1ei zVoZ_02_7zEYQ+fbJm0}F;ZZ|Q0lfSKM>c$(AN`wfkt^g0_v%S9TPCB;mhIN~Kjmqx zOlSk;2qQk(scwx#CxpsimsU}31I2^+Z3TB)v-uqpNovP-zoEdRYyjpr*(vN2O?Jqh zL6TZ1MjIs;lA_asCA)f(1`OG5`UZnUpRF@UQt+G!t{60+!q%B3Dfqwy7ZrJ8xe$wV z!8-dS4d6vuMv*7hC1xQt;Q6^n1G1(J&~YIh1B|&)>`Sa^K-JVG9>fi!ng$pPqdJK! zZYCCqY{?Q?&15OjG+@B9u~GsHbfsdha5u%Ag>rhrl;5aEIvpcgQuEPEprP@tG&F3{ zQAkT!&}=CuQcL-6qbJUx0p|_*8uh$tQ!g&;x1{{k=F3D5ClU6n(nnQUf{SGFzlyPC z$g|4On(`rc;+lu8O)3vtAa784*&oF07*qoM6N<$f`7UN8vp=i1ZH7K6L;C& zWEC>-*d>`vW|GOwB&n1kLxv0)GGr)~I-k#3z!RVcm;(-gBjSK}85s@}EQr z_FVxgtS{jBDvqHtrdo`^m8UB>20Vn2lf$ue2VEULPq+S!xkvrMu1KFY-~FrPeT%&79`n~<20a0w$}*|ojfBfgv<2}Br-Z= zo^G55%!%Nlgh!<4JA$_LMJ|Riie#QyoCX|-;QR$XTVMpQyzLX|ym|I<8bFJ*v=6Vv zt-7cDNVf7^NcG12+@b-NDg)wjAvY-(3VVo0h=0*ZBBP}05O)KF(V-~XNDLe54x>R5 zS)C-ZzE2{nOA^_VB(g`9r9@RhDee+$);*_82e3{7LPKcgWI#^W} z&_yi#FJa$O@T}6)ro7-xM0wcSB=WE&h)%5#Pm4`u(I!H&D`VL)W5pP&C=q*XV||ZT j^|))ukRd~c3?)f_AR?_>muOCnW1LnWUP2jcRCJ(0LfJSNsG!IqGOASOVqmqf+<3Ki=@ zfKGlS7DUkF8$jGqi*WJVb@KR)xR{AZY#L72e9_@^``sPiB1 zj&mpD_^urLk3UErG-iq;s_uyf>;`|5dGq$Sb_FXLu+5vQ;cEZ@002ovPDHLkV1m{7 BnIr%J literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/res/drawable-mdpi/ic_action_stop.png b/trazador/app/src/main/res/drawable-mdpi/ic_action_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6a7edda95d08241e66f0b8bf3f92a4e85515b6 GIT binary patch literal 399 zcmV;A0dW3_P)>muqUu6c&GR;{9A@?Y<1lPDm(DO zGMUNzWM+5M>v{9$?FOssIs{{|1Qj?Ewa!7RV%jSH3O>Q<4|X7NS@;ROivk}Y12O0m zwVr}P#4S{=3jw?{A>C*EF5vId@Cb%Mt^Q2pki`t_+`P3SeNpvFgE71 z%0|GE$^C|BQbc2M#tr!V@Gk{i(}I$G&%}imY;6SOOrBmC!m{llOqpC5+i=*`HVk=) z{Md?}97KFcVtEw5fUmobV)3$t5RqMZ8R_D4SJ&~I*m4DjE9N#Ea6L1w+tz={ym@nv_}8{002ovPDHLkV1jxHw449{ literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/res/drawable-xhdpi/ic_action_info.png b/trazador/app/src/main/res/drawable-xhdpi/ic_action_info.png new file mode 100644 index 0000000000000000000000000000000000000000..310caaa5fc3cd903f5f24d75e0a17b85d0db27df GIT binary patch literal 794 zcmV+#1LgdQP)6<7MD6@LvSSDUFPlk(m|eKLh&-I8NCER$X?y z06YzFz^wB#;5KjtID@&ta2B`o32y!9^0LRyej5{j_C_L5C3a==TgG#^$V#~S>#d}2Q zncy~jL2UVALus2R-4+Z$o!IithSF=IbVV=#Ys8jcHk1yC(wT^IVkJS8F-PR|Z3JLM zl;#8jkRx(N?=1jR5&@t~VD`N&0h$C?1p^?G1nD+d6AS>|1}`NFp>x3ih!jE_MCmX} zDV)GrK&%wb;iW~aYA}HS)I|vJ{sJ&x=&`g0whi_BYWV3tD4tNC1qO`Lb*a+J*0Nx-%C z1D39JJjBdlQ8k61*YLLsrowyk*gG@x0g17f(hCxsUKW5EyM+ZxT*r-!qs+V_Ljtj2 zN>r@V!#aM4W9PlB1K0XG@T+NEo5ls+EKgpO>*IHq=17bG&Hih03WY+UP$(1%g~D09 Y0w~Ev0IAHV?*IS*07*qoM6N<$f`M9RBLDyZ literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/res/drawable-xhdpi/ic_action_stop.png b/trazador/app/src/main/res/drawable-xhdpi/ic_action_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..8eca25a5d58057de52564c4b95cc9d643156409a GIT binary patch literal 881 zcmV-%1CIQOP)i}UCpEL8t@o6jUb#-*l>i+yoi4e948>0as+Id zEW8Z-;2}V)^Db}?xDH&vy+LphxB;|*C%|hDJ7Q*)O%wkJ_(d_`@4#JPC4{{S2I^8_ z^9)!u>64d<{|!6AbD+_GoA~|%T+tbTcao#7 z z314hzB`E3ZaKWb#JILfZ>`@SDYxMs@QV?0zT@`Z3AVis}uEFn9NlEM|tD@+L3}ldI zff9XQ8Br9)0ksrm@mfmaze@b=SXn|+9d>6zJ>hA8CGq1}Sp#?EGs)m?v3gsIY5S$( zY3y?x+ertZstCdzR&VVvkC|xCRy>Ef;>~y*C7;%NkDJ~NCPe#qiCMy=s)#>t;{SS* z4DZ3TH|CS~*ceACeL-T!$^&r6b}&JSD_qz(%FS0~NFY{3ii&x9Sm8tLyKLnhxYoCT zuSMxv6fW>(*{uqX@o%T%N{emt|1~)VgTY`h7z_r3VJ!Xvfs(%T%1=B<00000NkvXX Hu0mjfL#vxv literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/res/drawable-xxhdpi/ic_action_info.png b/trazador/app/src/main/res/drawable-xxhdpi/ic_action_info.png new file mode 100644 index 0000000000000000000000000000000000000000..f130249841cd4e4d4f347f003d4b0e358d1df302 GIT binary patch literal 1436 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¨k*3;C-Z7Hb;z1QqSYb#6X8a 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 literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/res/drawable/btn_parada.png b/trazador/app/src/main/res/drawable/btn_parada.png new file mode 100644 index 0000000000000000000000000000000000000000..667b46a396ac2a40d173406b2f7da26ad9f47374 GIT binary patch literal 2477 zcmV;e2~zfnP)I2)_GU^{~Ky01S zszq!BE!vhyXIi09K%x;f1w~o4Bn==05)&X0vgEzl?Bn#0O>TCR?3!%uvdZjdCNt;! z?z!jtyZ5&z=iGD7y^;`u!D5x9B;a;nHjoXB2ZjTNL01-KAUJ?VpbGc`C;|3cglHXX zMbbb6Zj~enSPDD@%md`XibYWs2T%;W3>>fwFpvWZxK)xC0M7zbhvH$Bu<<$YutkVN zUso__z^#%L4-^7-tLIykFtQbR#3DpTpaKB{Zk41-z#d?7czlZzCO!r3v@!lfY{58Zj#{!2r{Rew*#75@I9;87_Is9$h>%Bpco;zLS_qk^R;`^C z6@0R48Gqfo#m|1BzLpn@p60!>gXqSOCwAE~Qg`h_dg(c}q$7&s=uwh3zR0;FrIB_e z5KF9*WRUT$da1S$;%RQi^!7m#);;BCw>4kp-CeJ8;=%hV+3~VspRn>i{=4qS41Ue- zo5!RpE|M-bMcR!(!~!?Vc$YX;#pDuXo$tGH7w_<}@Jt7jUn=smXWo_1`(v+-l~v(# zMcRd6OxNOF&%UZSYy78qGe&3f^f&|azH)dCIvwU!t1#Vm8~Us)mFcM-Xf)rx7IFY&8_#NPfAv7hH2A? z+43?U&zi<}FF6OT(@pZGO~kEOq2$jsT|_r0hs5_wuowH6?M*jO+nmmd>_$SGCEf0F_p=hc| zqD%y~CB@|B`Q`T?-o@xvw~}utDB!}S8iWv(pZ$=a_kqaFsMiI}<5NqF)}#rAPoDQ}f*XJw5;v9)a5#=Gwov3HV*dXvn& zD_sL2p8=845JR;&u=`(rRY6sKHP3z8!bp1y<+so0;j~N0ZEdVBYY$n+Fnzj`uBkgq zTU#@CeAyM`_I6yyPoT@bA)sGsT-y+EYVq!k3VSP`nvug;^Ks%MjiY&LV}5Aw;s`DV1~>1YxXkW40Iqu;_0omwfNUd_d7#x=Vc+2$QD7>|6$ zlP5H!wz@I8L)X!!rYh;njrELbbu-M>^HAxzP#1I2q&M~CL)DQ?CMDhJbTGWbe+EG~9KBB&vZjjIw7^$fg@9jaZs73V zB9@%CGsP)b-tJ*SlS>J7HzPJ~RBnjV)yaLoTTVx94YyQvkdQearVL!Ocin2}2)i9= z*f795PSAP$MI^mmbxjpHrp3F@IqW|z0CT5@?^OqG0RYC_TqRvudy4u?wLDkaM6%sO zvc?qT%)t?=j=Qc7IU@sr#P}p!vj4wcO-hRDnkw>zjCWJ}HwTSINjf?^NNaYJZ1?uV zx+y9)fe>{ZpMS2T$BmqTBR*EiO9lh_U_M^0YYWUF8Q70^;HD~4uR(}GZwyeP`c}0lM3k3x?qSDqT*=)v`mq%QFKE|0nJw<$60*x&;vM?jb zGM+0}`aR!SRi!-Z>U9QY&0j{+y{j|d4JyyzJaZ-_O_eCJ2(i0+1H=NnEq%xsb8<-Cw=Za!FSl-@etiL> z+WJnh0@&{PAu&IHgbAq=ak*WTm4C#x*VfbO?%>T=t#~)+cq!e!nVf|y&?N-kXs|DD z8WWG7N84)H%4%{He7}U9_ArDdTWBJ2-LTD6hZyEERR9_{RfVNxI2@ z#d&9L7E@2w(Y!K5&7m{ZB1DDno;E8mJ@`2T<7A?i^?C6@%Pc-+=kDX}0goRUrRU!h zjhu_qqV))}E<3rmydAw;@Y4ke;B#XZpR#jsoPkz-;8otu2W$*?^c}VjR;Sx%5Ab%n zkq^cixHwFM-Yv+qx%koXcE+~2`F&0tWhwq6_QJPq#C3|0HHW|fix3OIe-mRa@E;&7 zPyA6LMkjE+MTnE&v+=|G29y$s zb@C``auS$r5u(A@*k_c}_158ByzeGO`F3&=nAbbl5Mc9S*IS1=K4fLVC^`E1~NAd%>&yTU>D rC%bIGF}%y!?*pG&gm4EruV4NT=7(>5lGyg)H(vML@AdsX&*%BPKi?RXz9u~lf(C*hdTlLrBk->EZ%|W$SJTyUO$dUa zwbfNk{L@#{gHXoiUmL%EFB)fhD{Ri4^bDG2Qk6l)tEs@qs?6w6g(&{14#{Mr&;6rP z_H<(Amw3X*OIR;ip>wV2O({Q5W)^8tGiJeTq}XlvT2*e}Bg@2TZmD+RLmNGWZ+XHa z{O4<2ADy&yPP(3TPr9yG?kYeVhzpdF@{AB~Q3Y2?&IeR}FbfNd8Zzk~Iiyljp;VGK zQkywsm&Fmn7dh&rbndMl}zxH!M& znN6uzuUs_0uiT*P)!{Y1f3umSwt)uHmX5XTtH61lH z+8c^0CJ2Iblr299gsY=XP1DV}dTG_nG!LgVuD3t-iXSbb^~)MWff_U%!4GYPskkW?A)Q zY;JvO3KOo*UpYHFyK{E9ToMrz6LXI`qB?h>wY7D^Hsl~DRU?ZO-|6@+G11sYUH#d- zPTYWSIPZ6UUS3|B$R-n1fyv_P*w?YjdqvtRHo5nTs&YSl(uq$_9$K86YoDwS4rOUKJ!gPrcbq_i|E zeO+B$bZ~I+b|G201>U+iOjq#b)8JrZUg|FvkH!CqMgTrUAS}0!lsnZ32?^=#O6cT# zN$8lV-1M)N#cH%zMZEvhx46S?V9@iYx>|0GC2D4MRgdPvg~x@3g;raiAC!;SLl6ZN z<|utBv|#mQXTab|NJvQS#s;Q@B|NfYW)CI&h8u4^Y4_^y19ue|g~uI!CS@e@6S1d9 zVj-!S4@Mn&S6e$Ff6yfn*IWousKWL(XF5nVzN<@{+uLIYI$&w#binm{XUDq;Pg#~8 z#!LO@bhCqpBqb$vU!8w*^1du8L`g3fN=nM5A3uIP1Izwb#oqo8ELPM;Dy@wMTd zj<;xNX^kx{Es2dPbOn`_mEzLUo)!7|`Q`;CvTsKlP{On5kuQJOChLNJrLlA;T-H1t z92=|oSXnukT_AxYaCmxp9{wt_+G7)TmI;&vf0ns=)wT4)hYz?m`xpz+vM${BLJ+2O0meMaxt?e)66e47m?em~Ip zvy?(c@os<4-3*Q!?&<$gRl84oOa1xt=XBZ)^evOZLDGMty)Ko02TyOEwZ>em1NVlz zQ$;p8kGNG?_|ujffQuaCi$8ra+0=jrEN`|-T5ukRaBv1+MZ)$H8d z4{qfUw=c?ug@d&pKYp~Kqs)pL)6>>AjE#+Dzn-R{p|La>FrQHcgi&*)3CKA@h1dFG zjJgKB4l+rWf{LneT6JX{?^RJ)xEx+!$6BZ>IAbjQhN(IjoP1f|P7k?s1}CTa^1EcS zU;~42oknyU<^;fZt zbn0<(Us!rZMh|V2TI*P#hesK8*U_`%*wNyqu)dwoM|{(O&Wr zZ=S}ydC4a6A|By4`<+Q7MLCWAqUItgaP8!1kEeHWr+#>Nc)GDs#njI315#GjH$^{h zZ=xaeEZn9r)Pnv`Y}wY9~nvs+nqvB+tyutbcy)fnR(>*^-#MoHZn zH;HCuX65b8;e$VZxa@-Olt=#_t>qv!j{|{FV?NKR;H?FR!|nHbpKD~5qkq?9or&cm zZhR0Fc(nSpgI=j{&;@^bdWtljZd_VlFOl}{k(H5YwE})b2SG>)3C)U;^jpE-2!n&9 z;K(pHH@EJpiV9xO-uI!WcxDK?A|!N`PRYvBa^#zdTq!7~3b7<1DT$(o!aTja9%{9F zl9mRmuDcE~pMykgWrKFz#;ePMFc_HO3NsH+2?VKlD+D+8mM<PxG2Mm-B3Jdy=K0&LtaT=qpt*zY;6y=2Ib(T>~)or)U->^c8 zh)AVe<%h>O%#o=Jz&q$jxU{q}PzW_eGjke|RpRG77k}E@xBDX_BSt`hd40}$!ptr_ zbkXWLMy>*I?P~zhpbn*bMZ35*`VIfuDz;0v*ZK zMB!XY4WH!-;vMe2i@W>W{Ol|pMvk-Z>4m9lKCi2RuYZ}En(CXJv{A1ars8?J!2v-4 zBM9l8mFAsgqwDhW0llbDfP)hV5|)x;N=S5fcJ`l|n-i2ZIdnQ`=RlXPgD4_Ar5L!g z0Lc0xHde;pUQA4ERg&!kcwpS2B1i=54QHn?=zHYQ)|O{D7OQtim;!T4zkW4n@Le6f z=DHJb*utpn4N2nSZ!kw=hd&(Uh9kwnwv%(@@A0IAq=s-0AfMjK5 z#h#9AYh!~NAXW1X1}qdkW&yK3rx$5;QtA3@R8&;dhP{r%h?e%Hkd_Ug)!sfUD{G*G z8nz{x(GNZGjl~HDi&9g~%g*L~(FWk^{<}VyISg--m+3?bJTd-l_u|pRhos9f3voQk zlT=XHcgHVH+wjk2Wo6eXryJqy>=v1Q&ams&CMG}W8^@z~U*D7f@<_|b5DT#6b}lQn zsXNs6^{rCR>idasu`M$Dg|DvGC4+cbUq%TlUsqJ@YMI91VC452LQb@^?-+s=3aX2Y zjAVsoJ>qOiN<;uP_jYzZ}c)IJ*po9^n7ArE4 zmp0N^f+jCF_Y)Yfhth1zU0rlIwajCNMr-%+=h?wUB_-?htr)wJ(g!WLujtrN zKiJVd#-q)B6u9;Pg_SmnkTL2;9L9?tKpf#2851IjKzu4F6pZi6l^jA!jYy8s$in*i z8M6@pt+%i5& zYc9-8F92VBd;lPMa2uKQwn(zPpkOh?!eV$}3)kD*>)~*ByZ&T%jDeZP$4wgpLA>JP z-Qsd`)!I2mg9wMl@87k^R}vwpw;juI9jrs0gM))0t{H^X)4nXt99dae1GI*bv2irE zU?Bya_fCa(1I&1mOh*kt;}a7XZ=LKIXC)&ji1O~TX<{}OOmj<13IQNjgoLYXsN@Yy zT>se)5^``r0A5l=Wbp>*7k0id0S4=eG!3{^jz4?$EX2UTV0%dKro24M{klMw&8h}e zlFq}+kxlFvZ|`F&#YWRYv&Fi)x{lqoiJRUl!)4rpi6fo%W$K{Z3=lHwctVdiXP!T& zWOlMsxvikb=zO{7-@%wj`R4y0<$;r#((UY~7y(1%! zJ&UA2gUC94NLv1AoTpC`5)?#6Mnt@udjYK8#M5(2605NcPS-arahwFc0T7x>TwGjF z0N&|iIn@Yoe;Hgse?9S?=&b-`V&}djuY-QGRz+4;R$oVlW^BjINiqwAC=(Nt6dxa7 zuv#Xj6YYyXXKHS)JY4ZOak#DR%0^OS_}>Y?-xI0=@S85Ku0*5B8qTm{+lI-Aj+yg> zQzpX8Rw9vpePzXZn|R|lHC9Zf4wykj8B_{m9acLrey(*PRn(4f>Xy?HJ&D)wp$JM7|s3ZhUrjwnJdx zsOV`6I~PEylGj}9FoE#WKmdN({B4I<+t^r;5(1mMK3tYn_~naHDW~evcJe^dRdWR` z0i(Q{nxpyD)YPG?#HJ7a0RhvTTwDgx(a|r(ZEE*XnW&T#<7Xf*f4ko79Lk<(Gm5RT&eC(6h`>jDEe0|Y@Av=N%d;EedY)6s&X$y%ir z1YP9P*1U`K%UsKJMLryR`XxDcNf{jGiTzmNT`a>6J{>GHyMJBq^4td&$%W0 z?J6E`EW$)EjY7uRzesYCkE9{QhlQC@3JQhAt3mX^@t1RS7?b|9*l(8PS7R4aYLo6c z#BQA>WPQnAsouA7EhD0Wa&99KLcc|+?>==WZ{24IRtsaHqvoIuEeaAq7>;k%IZNs4 z>HS9miO^6|@P(^8K2^%Ot-XCmS()L9l*I)ohZQnPd;9ihNnzna@!DtnyPzP*0SERh>MQy3i|l**+(oE+fF8Hv9qvzLp^;etR}!>TWUp=>ThdvVq=Q1e79C3 z`)+P-F1)I$%I5z4`&@f_dzz}MjXn8VSOzI+=?q<6-4(F8KC-lghpP(`YHMo~$g?;e zZtnMvj*fV^Sy_1;pVBY~D{GT=rIUUI4%f%Y#KctQryLkuMJ}isF16eb#^D~&a>sfg z5QxPZ%voUb=B5M}q?R5X5fK4jpQzO`)YF@L_41`DHxEx?O>OPR;XQdj091Q!|}-im#- zzkW$7?WVV!cyu_MNqqloZbTy1MwWUz?c;iHV$#9zBBjy?Rw`YGN|fcuV4; z^@9g@_jh*Y(s3Cfd>1m=&|TJY;r! za+2zDDK0dWYHVnTQ1R(gLYX^Q%F61;;_9m2WVu~vsp*utg~j2~;o(-ex?OUWU0r*3 zcQ=8bpI;A!TEN=Cd6krEBg@MrzI^*;R8S@Ob#8s#V;S`}VEEVSYTY5>v!t~2HX}3h zvnyO&X`U+EB(Y?jqRGk0QepOGj4T7WukWAcy|rpgykyT|mwW|d6s0MpTZBxwqU`tWJS0HC<7GDelob;@++yA|X;--&dM&m@ zvE`kfo<6D(08fqW|HL#Z%gdWzF_qui+B%z^no@f#aoOcuF;b-CpMTCBJ)0nP6VcQ5 zD4kADYj<}_QX}TGT0lTRKCVyau z3C0r#EqN(Q!(dhW9f>zgf`ji$5v>eV0*`AV5kiuUhp>}rO?eSc4vybbl+=&_pQ0CH zYHp65nvs{2latJ+u7I6sS3_1M|pzl~&Mg4D=8J-0p*iA3(Qsq}R7^P+O<$8#NtAA*8D2TxDi z>DbQ{W!L&*>`+fKS27v2w6r*X5Iw7D4Aj620s~dL1_x!V#nj^B;%wexP8CY3Z$m*| zzvpiDWhq_nCK6xN?d(+YUB$ikS?ICGhN;_S)z{B1YO2-xtfjDmRx7JuuPpTDpD=FOWLodRPAg;e!i0rv?Kp?hG!a~@75B`bTU%f7;8ib+S9 zeVB%ZhIwv&o&bhGTS}^jz{!5x!bnda5Jt9jx5YoLFy8g+etX7o@Vg6{`wpUj5Ed2| zyliZVR3E9&MKlYlYiMwx&s}4UTBf85rH$0IXXD@z?Cv0T)Cc_WfzwuMJ^v#YTiz2S8-9K+u3#~X%;m_)$cVT8zoQ09CHEO`K-U?$9Ntf#O4tcQV#J60|#Hr73Sw#B#z@APNS$imr~OG!@7 zATup$;b*Ncw$g!YumpN3)1)}QcWQC*>)VUQ=*_*m`lT)a0K6+-jySow)y;#Ry$y{S(@}9{Ij1b!NtWZU$yhIvnRhKB(R#he6_QC1$whTSL1Ai>{PilG$i{K zFa!Oee_(ytdI$>r9w`Esl{Jy)%W)s~kJ$99Q`1_o)y1f(O+i@(s3!Ww;*Sk8kIc>e z<*wzlMspTQUp`N`@f5UQRP()kDhOfjrg=6sC6KHpJY&<4*>Qt4O7v3D;$px|p&5EC zcKP(=&-K~a+2n?Xz|h3hv&NhGdFT^=l`ARHX&D(^{(si0do@^O&K!NQ8y`%H{qEek zF5fc**IENaSJ1=YqJec5kwb58`JAel=+orQ)sd_fQZ zpiCBeZ5L%EC9`CTR#wCx&i(pTl(nVmx0xddCU13m`T=w|e$>;=NEmrPFfeetCre4m zQ7Ub$-~w&vsNY=s#p#0sdB@&t3Htv-fStR$*tI(+N#d!V-ssV6c7`I?YJXB%xoBbkvlJ zP>z(8RD!CUoR94U+ho0Ervm2GzZN0%Av!8*jRuO(%R{r`5J*q3>Lh)u#5%wR$03nf z=hQ#r)${{p?*Zq;l$UR62`6p0Pt-1_YSdWWx(s2u<6BxZ)AeA*qm?K_6b92c=E)M>Y9E8e zCR$or@*Eu<6;nV$w4q->qWt}gwude~U1{@p<7$s9PC`A}cE^+OhF**`q3aSzOx>0^|1LukH+g2wEav@q8gpiT9IK z9~~Ib7?2TQ2v@Jf_OiXCTi&Ih$w`R#mz&-{*@VvC3Eu}2d{z>wV zZt&ZhY3JI`neR%~`ZYf<+rXp-)Jy^xz~#_$vxVKk$Ts^5V}0`T>85ZeK*Aeb6rFng7Lio0m_m-5kGAtO{sF)^r_wITN2^ zi)E!#x94H6=kM+90Y*l~P)BjOEJj9*N9*jz-^n`HuS-ekfPN;D@-T1dTDrPc_KS)i z-J{WVxF-!k9U~*D^4EBiRgO0`nn3+aD6AR-^G!sOO|5Itx%uxGuXO*NjK33|pP!F( za7fhN&Dm%?YiRE5eCalWDl`ZvtLQH_7lmb{r8)L+$2T;bE+i)>mk--qy_PQo#&E7V zf=%;0ZGLd8y=2@K)yb31>1I+9cJMDowYLj*wDf*^T5YFKAtEaJ1XMlJg6dO6#o^q} z(!d&;Mgr)F6EBn@6XQ5M;P^mtw=I^(eWc8KHaR7QphulstaJq}pV{`~hw^DlFXt_P zt&W9lS!0Rl=xEn_0xT(&v`Lwn$0-pJ=PYieHnVJPZM zNe^K-#D~z(&~va5wD&z`I6K30Lqlfw4%QZ1Hmsx5spn7H!nYi2m~2_zO>$SUVQWYFbv6oB%WJH=ng*kx@4>-uf#l-~$TAMGrbq@dx4u?At6SI1x zr)Tw36VgptJdu@=*%6ICJ6e%WB;837w-v;Il(+>@J||}4y;n?MW3jzI0?*ldc%1TO z8JOKDhHXs7z8D-IxAa^dEXw|~zj3=_)UB-{;Lo2hbwT%~{*H|=?_gmv+_4JY#0ZB4 zmFXGT%iP@A*=)RYAvsu;qxM^(q9rCp$etnO{EkG9{0QeoB zkdW}2NL_)!#QfXsG|>CD@f$ADGZ79bTH&z&DqhJ#*CI)nQe&Y${PTy0R8#ZqiPR`OSxr$%X$kQA43M6k@$r1v zz_XM6PN1o*t34)Wo}f_G`n>qKo@hn~aP5(GFmbre2>}N+JR`_LC+y?nBRgK@ZdoGt zH&R#EmCsb?nCklTO^uD4>ircG#n~C0KfJlh!EaPp@Uj$;qj_&B#z%fsc%iY6DTD@8IB&l$VFW z18dpZ+A0Q$n3XxqoRv8LPN=a$6AbB}+ zm!Lt2Gqbb1?rv_KOJ1ZgF-eB-JSjL_mj%ez%;eorwOpe*F9RInKUr<0` z!&beP0Qa7Gcm!Sn66^6f>bopY+}zwwCSPp~dCK#Ce~ue*WQ{_iJUk3E^7}ZrgYy%B zU3{mXAxEGOSC1V=O?f?h_>hpFe{H0*v(q9UjePFwyYJ)e?T)G(eRiCMw6QU$tgc>2 z&&a?WJeqosckD`u6=wesg%EP7%TX}{x?B!;n<3X@Em84=f`WqNq9W(k0^L+|v}}6w zG!A#MAE^2l!^6YOKr?+MP-p-pP9j)MOd)wO=H$ZSDEz@Xs zR8OX}n6U6;kT54%*Y)k^PH}-c2RaEj>8{0LqwN(XLhN^ULgLFDk z0E(Rf{t=wd-V^S4@+rNr6fM5ad2GnW5Z-CzO$6-UpW}Q)eKt@K@#V1y5E-uam??~` i#bV)^$YyNc85KwGLBp13+z;@t1k%1|pjoE=IOKnZj;fyk literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/res/drawable/ic_follow_me_on.png b/trazador/app/src/main/res/drawable/ic_follow_me_on.png new file mode 100644 index 0000000000000000000000000000000000000000..7df8c6094ce3d4fde68950961055bcd31c23eeec GIT binary patch literal 6649 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 + + diff --git a/trazador/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/trazador/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..e3400cf --- /dev/null +++ b/trazador/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/trazador/app/src/main/res/drawable/ic_sync_black_24dp.xml b/trazador/app/src/main/res/drawable/ic_sync_black_24dp.xml new file mode 100644 index 0000000..5a283aa --- /dev/null +++ b/trazador/app/src/main/res/drawable/ic_sync_black_24dp.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/trazador/app/src/main/res/drawable/info.png b/trazador/app/src/main/res/drawable/info.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e2a03a4bc540419ce1165d5dedd8d5345fdec2 GIT binary patch literal 1256 zcmVP)W$LQv#I8j8T_{yf~=m$~;IXzu5?eh%l+bI*O5LnIQ3L?S-g zNEKIT<0XBJGshx}%rQL6n2^)65BytPpur(aAq3mzkx5L*!vp z0a@Ola>x)hq%a~$J)clM5drmH23z#q<|xU<0`*qKPGo7Si~n z%wqBU&0hSlj{%E?RDuuU7MJcXB=Jj%b`&x_e(Xp;ExUAT@Y|(jm(qjWZ(B;_Uor&Y z6!R#Nv*chaGsx+GPf(5^TbQOC&z>U}Plh0!MlPf-JUW9CsUc{WQ6klNkmN0L=W$Hb zI`=E``6_{H*O2>uGL!}iknh%)aH)U^vHJHyC=I|j;!5~HKCWcN1R5Z;2B2BgU%-W! zczBp#L#PcDi)Yo>;Taa!Y@Ptv;<}7l4r)8NeQGlwNF& zYb9ky8`z|cGKQ@=tt4)=frR*F&DNq;5;NLBOdDlk)i+CZzQKZh$R zK8n3)UuX^N7uDk=aj8xWGC(Sn1_~Jx)mdCiFf4{?52b-lQTv8C9#o@5E)leAD3OzR z)Fn^Gaf%@QAdedG1kbj}b8XCXgrFSb3rcL@n*sbhFEP*Qfd2Kr_;5}_cz_aF;&K3M ze+ebhM9$XHgOZ`06n-hB6D318YwImEMS(?`<%O>vfHEvXL&vNpLe#!|zDLp9b&_k9T z*x5;~c-Pf0-68_APCn*}yr+}vWZ1(d62yp+WD|SHaD&H;+SWI+mO!0l8Wm6`sU`&F zbfE&s6E+i?YKBohW{8u7EWu?ypnS+US>hOx&jq=;y2>EuNMckT2YAG1l*`QUkZ)PT z3X$L_jr@gjkUknXOq>;|goD)5%rkl!W0nOLm}QJ!o^qco2Ph^Ii9{k1-~0zqnGDmx SqDLYC0000 literal 0 HcmV?d00001 diff --git a/trazador/app/src/main/res/layout/activity_finalize.xml b/trazador/app/src/main/res/layout/activity_finalize.xml new file mode 100644 index 0000000..4152b1d --- /dev/null +++ b/trazador/app/src/main/res/layout/activity_finalize.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/trazador/app/src/main/res/layout/activity_main.xml b/trazador/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..f1fdf64 --- /dev/null +++ b/trazador/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,72 @@ + + + + + + + + + +