FavoritePath
Cargando...
Buscando...
Nada coincide
RutaActivity.java
1package uo269509.favoritepath.activity;
2
3import android.annotation.SuppressLint;
4import android.content.Context;
5import android.content.Intent;
6import android.location.Location;
7import android.location.LocationManager;
8import android.net.Uri;
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;
16
17import androidx.appcompat.app.AppCompatActivity;
18import androidx.viewpager.widget.ViewPager;
19
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;
36
37import java.util.ArrayList;
38import java.util.HashMap;
39import java.util.List;
40import java.util.Map;
41import java.util.UUID;
42import java.util.concurrent.Executor;
43import java.util.concurrent.Executors;
44
45import uo269509.favoritepath.R;
46import uo269509.favoritepath.adapter.ImagePagerAdapter;
47
48public class RutaActivity extends AppCompatActivity {
49
50 private static final int REQUEST_CODE_SELECT_IMAGE = 1;
51 FirebaseAuth mAuth;
52 FirebaseFirestore db;
53 FirebaseStorage storage;
54 DocumentReference reference;
55 FloatingActionButton saveBtn;
56 String rutaId;
57 String idAuxiliar;
58 String origen;
59 String nombreColeccion;
60 EditText titulo;
61 EditText descripcion;
62 CheckBox publico;
63 CheckBox circular;
64 ViewPager viewPager;
65 Button imageBtn;
66 Button initRutaBtn;
67 ArrayList<String> mImageUris = new ArrayList<>();
68 List<String> imagenes = new ArrayList<>();
69 MapView mapView;
70 MapboxMap mapboxMap;
71 ArrayList<GeoPoint> puntos = new ArrayList<>();
72
78 @Override
79 public void onBackPressed() {
80 if(rutaId == null && !imagenes.isEmpty()){
81 for (String url: imagenes) {
82 StorageReference fileRef = storage.getReferenceFromUrl(url);
83 fileRef.delete();
84 }
85 }
86 super.onBackPressed();
87 }
88
95 @Override
96 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
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");
103 } else {
104 imageRef = storage.getReference().child("images").child(idAuxiliar + "_imagen" + imagenes.size() + ".jpg");
105 }
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);
113 ImagePagerAdapter imagePagerAdapter = new ImagePagerAdapter(mImageUris);
114 viewPager.setAdapter(imagePagerAdapter);
115 imagePagerAdapter.notifyDataSetChanged();
116 Toast.makeText(this, "Imagen cargada, deslice para ver todas las imágenes.", Toast.LENGTH_SHORT).show();
117 });
118 });
119 }
120 }
121
127 @Override
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);
132 init();
133 if(rutaId != null)
134 initializeRuta(savedInstanceState);
135 else
136 initMapa(savedInstanceState);
137 guardarRuta();
138 guardarImagenes();
139 iniciarRuta();
140 }
141
145 private void iniciarRuta() {
146 initRutaBtn.setOnClickListener(v -> {
147 if(rutaId == null){
148 Toast.makeText(this, "No se puede iniciar hasta que no se guarde la ruta.", Toast.LENGTH_SHORT).show();
149 }else {
150 if(puntos.isEmpty()){
151 Toast.makeText(this, "Eliga primero destinos para visitar.", Toast.LENGTH_SHORT).show();
152 }else {
153 actualizarRuta(false);
154 Intent intent = new Intent(RutaActivity.this, ShareActivity.class);
155 intent.putExtra("rutaId", rutaId);
156 startActivity(intent);
157 }
158 }
159 });
160 }
161
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);
171 });
172 }
173
177 private void guardarRuta() {
178 saveBtn.setOnClickListener(v -> {
179 if(rutaId != null){
180 actualizarRuta(true);
181 }else{
182 crearRuta();
183 }
184 });
185 }
186
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);
207 }
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);
212 finish();
213 }else{
214 Toast.makeText(this, "Escriba un titulo",Toast.LENGTH_SHORT).show();
215 }
216 }
217
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);
240 }
241 if(!nombreColeccion.equals("Rutas propias")){
242 reference.collection("colecciones").document("Rutas propias").collection("rutas").document(rutaId).update(updates);
243 }
244 if(finish) {
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);
249 finish();
250 }
251 }
252 });
253 }else{
254 Toast.makeText(this, "Escriba un titulo",Toast.LENGTH_SHORT).show();
255 }
256 }
257
262 public void initializeRuta(Bundle savedInstanceState) {
263 final Executor EXECUTOR = Executors.newSingleThreadExecutor();
264 final Handler HANDLER = new Handler(Looper.getMainLooper());
265 EXECUTOR.execute(() -> {
266 HANDLER.post(() -> {
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) {
276 mImageUris.add(s);
277 }
278 ImagePagerAdapter imagePagerAdapter = new ImagePagerAdapter(mImageUris);
279 viewPager.setAdapter(imagePagerAdapter);
280 puntos = (ArrayList<GeoPoint>) documentSnapshot.get("puntos");
281 initMapa(savedInstanceState);
282 }
283 );
284 });
285 });
286 }
287
292 private void initMapa(Bundle savedInstanceState){
293 final Executor EXECUTOR = Executors.newSingleThreadExecutor();
294 final Handler HANDLER = new Handler(Looper.getMainLooper());
295 EXECUTOR.execute(() -> {
296 HANDLER.post(() -> {
297 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
298 @SuppressLint("MissingPermission") Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
299 //Coordenadas de Oviedo si el usuario no tiene localización
300 double latitude = 43.3657013;
301 double longitude = -5.858561;
302 if (lastKnownLocation != null) {
303 latitude = lastKnownLocation.getLatitude();
304 longitude = lastKnownLocation.getLongitude();
305 }
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()))
314 .zoom(12)
315 .build()
316 ));
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)));
326 }
327 mapboxMap.addOnMapClickListener(point -> {
328 puntos.add(new GeoPoint(point.getLatitude(), point.getLongitude()));
329 mapboxMap.addMarker(new MarkerOptions()
330 .position(point)
331 .title("Punto Nº" + puntos.size()));
332 return true;
333 });
334
335 mapboxMap.setOnMarkerClickListener(marker -> {
336 if(marker.getTitle().equals("Punto Nº" + puntos.size())) {
337 puntos.remove(puntos.size() -1);
338 mapboxMap.removeMarker(marker);
339 }else{
340 Toast.makeText(this, "Solo puede borrar el último punto marcado.", Toast.LENGTH_SHORT).show();
341 }
342 return true;
343 });
344 });
345 });
346 });
347 }
348
352 private void init(){
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);
369 }
370
371}
void onActivityResult(int requestCode, int resultCode, Intent data)
void onCreate(Bundle savedInstanceState)
void initializeRuta(Bundle savedInstanceState)