1package uo269509.favoritepath.activity;
3import android.annotation.SuppressLint;
4import android.content.Context;
5import android.content.Intent;
6import android.location.Location;
7import android.location.LocationManager;
9import android.os.Bundle;
10import android.os.Handler;
11import android.os.Looper;
12import android.widget.Button;
13import android.widget.CheckBox;
14import android.widget.EditText;
15import android.widget.Toast;
17import androidx.appcompat.app.AppCompatActivity;
18import androidx.viewpager.widget.ViewPager;
20import com.google.android.material.floatingactionbutton.FloatingActionButton;
21import com.google.firebase.auth.FirebaseAuth;
22import com.google.firebase.firestore.DocumentReference;
23import com.google.firebase.firestore.FirebaseFirestore;
24import com.google.firebase.firestore.GeoPoint;
25import com.google.firebase.storage.FirebaseStorage;
26import com.google.firebase.storage.StorageReference;
27import com.google.firebase.storage.UploadTask;
28import com.mapbox.mapboxsdk.Mapbox;
29import com.mapbox.mapboxsdk.annotations.MarkerOptions;
30import com.mapbox.mapboxsdk.camera.CameraPosition;
31import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
32import com.mapbox.mapboxsdk.geometry.LatLng;
33import com.mapbox.mapboxsdk.maps.MapView;
34import com.mapbox.mapboxsdk.maps.MapboxMap;
35import com.mapbox.mapboxsdk.maps.Style;
37import java.util.ArrayList;
38import java.util.HashMap;
42import java.util.concurrent.Executor;
43import java.util.concurrent.Executors;
45import uo269509.favoritepath.R;
46import uo269509.favoritepath.adapter.ImagePagerAdapter;
50 private static final int REQUEST_CODE_SELECT_IMAGE = 1;
53 FirebaseStorage storage;
54 DocumentReference reference;
55 FloatingActionButton saveBtn;
59 String nombreColeccion;
67 ArrayList<String> mImageUris =
new ArrayList<>();
68 List<String> imagenes =
new ArrayList<>();
71 ArrayList<GeoPoint> puntos =
new ArrayList<>();
80 if(rutaId ==
null && !imagenes.isEmpty()){
81 for (String url: imagenes) {
82 StorageReference fileRef = storage.getReferenceFromUrl(url);
86 super.onBackPressed();
97 super.onActivityResult(requestCode, resultCode, data);
98 if (requestCode == REQUEST_CODE_SELECT_IMAGE && resultCode == RESULT_OK) {
99 Uri selectedImageUri = data.getData();
100 StorageReference imageRef =
null;
101 if (rutaId !=
null) {
102 imageRef = storage.getReference().child(
"images").child(rutaId +
"_imagen" + imagenes.size() +
".jpg");
104 imageRef = storage.getReference().child(
"images").child(idAuxiliar +
"_imagen" + imagenes.size() +
".jpg");
106 UploadTask uploadTask = imageRef.putFile(selectedImageUri);
107 StorageReference finalImageRef = imageRef;
108 uploadTask.addOnSuccessListener(taskSnapshot -> {
109 finalImageRef.getDownloadUrl().addOnSuccessListener(uri -> {
110 String downloadUrl = uri.toString();
111 imagenes.add(downloadUrl);
112 mImageUris.add(downloadUrl);
114 viewPager.setAdapter(imagePagerAdapter);
115 imagePagerAdapter.notifyDataSetChanged();
116 Toast.makeText(
this,
"Imagen cargada, deslice para ver todas las imágenes.", Toast.LENGTH_SHORT).show();
128 protected void onCreate(Bundle savedInstanceState) {
129 super.onCreate(savedInstanceState);
130 Mapbox.getInstance(
this, getString(R.string.mapbox_access_token));
131 setContentView(R.layout.activity_ruta);
136 initMapa(savedInstanceState);
145 private void iniciarRuta() {
146 initRutaBtn.setOnClickListener(v -> {
148 Toast.makeText(
this,
"No se puede iniciar hasta que no se guarde la ruta.", Toast.LENGTH_SHORT).show();
150 if(puntos.isEmpty()){
151 Toast.makeText(
this,
"Eliga primero destinos para visitar.", Toast.LENGTH_SHORT).show();
153 actualizarRuta(
false);
154 Intent intent =
new Intent(RutaActivity.this, ShareActivity.class);
155 intent.putExtra(
"rutaId", rutaId);
156 startActivity(intent);
166 private void guardarImagenes() {
167 imageBtn.setOnClickListener(v -> {
168 Intent intent =
new Intent(Intent.ACTION_PICK);
169 intent.setType(
"image/*");
170 startActivityForResult(intent, REQUEST_CODE_SELECT_IMAGE);
177 private void guardarRuta() {
178 saveBtn.setOnClickListener(v -> {
180 actualizarRuta(
true);
190 private void crearRuta(){
191 String newTitulo = titulo.getText().toString().trim();
192 if(newTitulo !=
null && !newTitulo.isEmpty()){
193 String newDescripcion = descripcion.getText().toString();
194 boolean newPublico = publico.isChecked();
195 boolean newCircular = circular.isChecked();
196 Map<String, Object> camposRuta =
new HashMap<>();
197 camposRuta.put(
"titulo",newTitulo);
198 camposRuta.put(
"descripcion",newDescripcion);
199 camposRuta.put(
"publico",newPublico);
200 camposRuta.put(
"circular",newCircular);
201 camposRuta.put(
"puntos",puntos);
202 camposRuta.put(
"imagenes", imagenes);
203 reference.collection(
"colecciones").document(nombreColeccion).collection(
"rutas").document(idAuxiliar).set(camposRuta);
204 if(!nombreColeccion.equals(
"Rutas propias")){
205 camposRuta.put(
"origen",nombreColeccion);
206 reference.collection(
"colecciones").document(
"Rutas propias").collection(
"rutas").document(idAuxiliar).set(camposRuta);
208 Toast.makeText(
this,
"Ruta creada correctamente", Toast.LENGTH_SHORT).show();
209 Intent intent =
new Intent();
210 intent.putExtra(
"coleccionBack", nombreColeccion);
211 setResult(RESULT_OK, intent);
214 Toast.makeText(
this,
"Escriba un titulo",Toast.LENGTH_SHORT).show();
221 private void actualizarRuta(
boolean finish){
222 String newTitulo = titulo.getText().toString().trim();
223 if(newTitulo !=
null && !newTitulo.isEmpty()){
224 String newDescripcion = descripcion.getText().toString();
225 boolean newPublico = publico.isChecked();
226 boolean newCircular = circular.isChecked();
227 DocumentReference auxReference = reference.collection(
"colecciones").document(nombreColeccion).collection(
"rutas").document(rutaId);
228 auxReference.get().addOnSuccessListener(documentSnapshot -> {
229 if (documentSnapshot.exists()) {
230 Map<String, Object> updates = new HashMap<>();
231 updates.put(
"titulo", newTitulo);
232 updates.put(
"descripcion",newDescripcion);
233 updates.put(
"publico",newPublico);
234 updates.put(
"circular",newCircular);
235 updates.put(
"imagenes",imagenes);
236 updates.put(
"puntos",puntos);
237 auxReference.update(updates);
238 if(documentSnapshot.getString(
"origen") != null){
239 reference.collection(
"colecciones").document(documentSnapshot.getString(
"origen")).collection(
"rutas").document(rutaId).update(updates);
241 if(!nombreColeccion.equals(
"Rutas propias")){
242 reference.collection(
"colecciones").document(
"Rutas propias").collection(
"rutas").document(rutaId).update(updates);
245 Toast.makeText(this,
"Ruta actualizada correctamente", Toast.LENGTH_SHORT).show();
246 Intent intent = new Intent();
247 intent.putExtra(
"coleccionBack", nombreColeccion);
248 setResult(RESULT_OK, intent);
254 Toast.makeText(
this,
"Escriba un titulo",Toast.LENGTH_SHORT).show();
263 final Executor EXECUTOR = Executors.newSingleThreadExecutor();
264 final Handler HANDLER =
new Handler(Looper.getMainLooper());
265 EXECUTOR.execute(() -> {
267 reference.collection(
"colecciones").document(nombreColeccion).collection(
"rutas").document(rutaId).
get().addOnSuccessListener(
268 documentSnapshot -> {
269 origen = documentSnapshot.getString(
"origen");
270 titulo.setText(documentSnapshot.getString(
"titulo"));
271 descripcion.setText(documentSnapshot.getString(
"descripcion"));
272 publico.setChecked(documentSnapshot.getBoolean(
"publico"));
273 circular.setChecked(documentSnapshot.getBoolean(
"circular"));
274 imagenes = (ArrayList<String>) documentSnapshot.get(
"imagenes");
275 for (String s: imagenes) {
279 viewPager.setAdapter(imagePagerAdapter);
280 puntos = (ArrayList<GeoPoint>) documentSnapshot.get(
"puntos");
281 initMapa(savedInstanceState);
292 private void initMapa(Bundle savedInstanceState){
293 final Executor EXECUTOR = Executors.newSingleThreadExecutor();
294 final Handler HANDLER =
new Handler(Looper.getMainLooper());
295 EXECUTOR.execute(() -> {
297 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
298 @SuppressLint(
"MissingPermission") Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
300 double latitude = 43.3657013;
301 double longitude = -5.858561;
302 if (lastKnownLocation != null) {
303 latitude = lastKnownLocation.getLatitude();
304 longitude = lastKnownLocation.getLongitude();
306 final GeoPoint geoPoint =
new GeoPoint(latitude, longitude);
307 mapView = findViewById(R.id.mapView);
308 mapView.onCreate(savedInstanceState);
309 mapView.getMapAsync(mapboxMap -> {
310 this.mapboxMap = mapboxMap;
311 mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(
312 new CameraPosition.Builder()
313 .target(
new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude()))
317 mapboxMap.getUiSettings().setZoomGesturesEnabled(
true);
318 mapboxMap.getUiSettings().setCompassEnabled(
true);
319 mapboxMap.setStyle(Style.SATELLITE_STREETS);
320 mapboxMap.getUiSettings().setAttributionEnabled(
false);
321 for (
int i = 0; i < puntos.size(); i++) {
322 GeoPoint g = puntos.get(i);
323 mapboxMap.addMarker(
new MarkerOptions()
324 .position(
new LatLng(g.getLatitude(),g.getLongitude()))
325 .title(
"Punto Nº" + (i+1)));
327 mapboxMap.addOnMapClickListener(point -> {
328 puntos.add(
new GeoPoint(point.getLatitude(), point.getLongitude()));
329 mapboxMap.addMarker(
new MarkerOptions()
331 .title(
"Punto Nº" + puntos.size()));
335 mapboxMap.setOnMarkerClickListener(marker -> {
336 if(marker.getTitle().equals(
"Punto Nº" + puntos.size())) {
337 puntos.remove(puntos.size() -1);
338 mapboxMap.removeMarker(marker);
340 Toast.makeText(
this,
"Solo puede borrar el último punto marcado.", Toast.LENGTH_SHORT).show();
353 Intent i = getIntent();
354 nombreColeccion = i.getStringExtra(
"coleccion");
355 rutaId = i.getStringExtra(
"rutaId");
356 idAuxiliar = UUID.randomUUID().toString();
357 mAuth = FirebaseAuth.getInstance();
358 db = FirebaseFirestore.getInstance();
359 storage = FirebaseStorage.getInstance();
360 reference = db.collection(
"usuarios").document(mAuth.getCurrentUser().getEmail());
361 saveBtn = findViewById(R.id.saveButton);
362 titulo = findViewById(R.id.tituloTexto);
363 descripcion = findViewById(R.id.descripcionTexto);
364 publico = findViewById(R.id.checkBoxPublica);
365 circular = findViewById(R.id.checkBoxCircular);
366 viewPager = findViewById(R.id.viewPager);
367 imageBtn = findViewById(R.id.addImageButton);
368 initRutaBtn = findViewById(R.id.initRutaBtn);
void onActivityResult(int requestCode, int resultCode, Intent data)
void onCreate(Bundle savedInstanceState)
void initializeRuta(Bundle savedInstanceState)