From 87449feb42473a1c59789329c60a44e869290ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHector=E2=80=9D?= <“hectorbringaslopez@gmail.com”> Date: Wed, 30 Oct 2024 15:36:22 +0100 Subject: [PATCH 1/8] =?UTF-8?q?Boton=20filtrar=20a=C3=B1adido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/OrdenarGasolineraCercanasUITest.java | 4 ++-- .../activities/main/IMainContract.java | 13 ++++++++++--- .../activities/main/MainPresenter.java | 18 ++++++++++++------ .../gasolineras/activities/main/MainView.java | 15 +++++++++++---- .../app/src/main/res/drawable/filter.png | Bin 0 -> 1882 bytes .../res/drawable/{filtro.png => ordenar.png} | Bin AndroidProject/app/src/main/res/menu/menu.xml | 7 ++++++- 7 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 AndroidProject/app/src/main/res/drawable/filter.png rename AndroidProject/app/src/main/res/drawable/{filtro.png => ordenar.png} (100%) diff --git a/AndroidProject/app/src/androidTest/java/es/unican/gasolineras/activities/main/OrdenarGasolineraCercanasUITest.java b/AndroidProject/app/src/androidTest/java/es/unican/gasolineras/activities/main/OrdenarGasolineraCercanasUITest.java index e1339bc..7712d29 100644 --- a/AndroidProject/app/src/androidTest/java/es/unican/gasolineras/activities/main/OrdenarGasolineraCercanasUITest.java +++ b/AndroidProject/app/src/androidTest/java/es/unican/gasolineras/activities/main/OrdenarGasolineraCercanasUITest.java @@ -87,7 +87,7 @@ public void testOrdenaGasolinerasCercanasCasoExito() { onView(withId(R.id.buttonGuardar)).perform(click()); //clicka en filtrar - onView(withId(R.id.menuFiltrar)).perform(click()); + onView(withId(R.id.menuOrdenar)).perform(click()); //clicka en el selector de Pto Interes onView(withId(R.id.spinnerPtosInteres)).perform(click()); @@ -112,7 +112,7 @@ public void testOrdenaGasolinerasCercanasCasoExito() { public void OrdenarGasolinerasCercanasNoPtoInteres(){ //clicka en filtrar - onView(withId(R.id.menuFiltrar)).perform(click()); + onView(withId(R.id.menuOrdenar)).perform(click()); //comprueba mensaje de error onView(withId(R.id.tvListaVacia)). diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java index 08f5bea..9374e2f 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java @@ -5,7 +5,6 @@ import es.unican.gasolineras.model.Gasolinera; import es.unican.gasolineras.model.PuntoInteres; import es.unican.gasolineras.repository.IGasolinerasRepository; -import es.unican.gasolineras.repository.IPuntosInteresDAO; /** * The Presenter-View contract for the Main activity. @@ -112,14 +111,22 @@ public interface View { /** * La vista manda una peticion al presenter para que muestre el - * popup de filtrar. + * popup de ordenar. */ - public void showPopUpFiltrar(); + public void showPopUpOrdenar(); /** * Informa al presenter que el boton de ordenar ha sido clickado. */ public void onOrdenarClicked(PuntoInteres p); + + public void showAnhadirPuntoInteresActivity(); + + /** + * La vista manda una peticion al presenter para que muestre el + * popup de filtrar. + */ + public void showPopUpFiltar(); } } diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java index c1cd616..1962449 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java @@ -54,6 +54,17 @@ public void onMenuInfoClicked() { public void onMenuAnhadirPuntoInteresClicked() { view.showAnhadirPuntoInteresActivity(); } + /** + * Muestra el popup de ordenar + */ + public void onMenuOrdenarClicked() { + view.showPopUpOrdenar(); + } + + /** + * Muestra el popup de filtrar + */ + public void onMenuFiltrarClicked() { view.showPopUpFiltar(); } @@ -82,12 +93,7 @@ public void onFailure(Throwable e) { repository.requestGasolineras(callBack, IDCCAAs.CANTABRIA.id); } - /** - * Muestra el popup de filtrar - */ - public void onMenuFiltrarClicked() { - view.showPopUpFiltrar(); - } + /** * Muestra la lista de gasolineras ordenadas por el punto de interes diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java index c33ae11..bb470fe 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java @@ -17,7 +17,6 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import androidx.room.Room; import org.parceler.Parcels; @@ -99,15 +98,18 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { presenter.onMenuInfoClicked(); return true; } - if (itemId == R.id.menuFiltrar) { + if (itemId == R.id.menuOrdenar) { presenter.onMenuFiltrarClicked(); return true; } - if (itemId == R.id.menuItemAnhadirPuntoInteres) { presenter.onMenuAnhadirPuntoInteresClicked(); return true; } + if (itemId == R.id.menuFiltrar) { + presenter.(); + return true; + } return super.onOptionsItemSelected(item); } @@ -193,7 +195,7 @@ public void getPuntosInteresDAO() { } @Override - public void showPopUpFiltrar() { + public void showPopUpOrdenar() { final AlertDialog.Builder builder = new AlertDialog.Builder(MainView.this); LayoutInflater inflater = MainView.this.getLayoutInflater(); View dialogView = inflater.inflate(R.layout.puntos_interes_dialog_layout, null); @@ -265,4 +267,9 @@ public void showAnhadirPuntoInteresActivity() { Intent intent = new Intent(this, AnhadirPuntoInteresView.class); startActivity(intent); } + + @Override + public void showPopUpFiltar() { + + } } \ No newline at end of file diff --git a/AndroidProject/app/src/main/res/drawable/filter.png b/AndroidProject/app/src/main/res/drawable/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..10ebc607732e547da5959872b6ea3a3e596377a2 GIT binary patch literal 1882 zcmai#dpHyNAIHDjnA@C&Rc__dK?rN^mog$-8FNbvp)ILKF3S{|OE;G@mo(Rt2+=W> z#-Y<}L<-Gij_8C#VWXAqHFBK4f6wnZe|$dg=ks|!&+~bIp6ByCuPa0^4`oG7MF4;@ z9_Qw}q2d3AJbWY1mL%D22qeMR!xgZfX^Q}mL*dB0?AZGWvH@n$lXP51mq6BwNLKM{=bsk-IXOuk+a!K$Fm+;!xRtT+^keWhy^qI zJ(B`y7I!)p;9hS% z+`pS6sx*7F6zp1YYL%J?s|egc2R3f~0z_E-)d=`yTMakdb-VSI9eP}10{kH|l_w(k zT&?t|2k!AGI8k}-+?CS-1%?hb*WQt5Cbw=8b)p$Nvlk3`*o~(3HJ1%w4^vvPQ;e+gqD zMG$5px|eGTL)+Osmr9ZKtm>f1zhz7_c;|6K4w0BM+Ycd&MBS+!4W0fbZ-~RcVnDRz z*oisZVJmD_;q!_yn(K_`d2b;HOKe(qx@4zvE}~agRbs)aWCn0*QP@d;gHsh$l|2^L zI4o_JyT{UyP$ta3Kd9a8Z{igw$P$zc8;#*h1fma>TYr8@?=6Pmay;_B{_-=QprM&; z^lrHbvsh-RP(x>=xBEi+yDEP@I=xHO>o|o1N6X)9!o66U`qk2uwnWa&lfCrAIw4O6 z#&PWm^sz6?J%#21`X~@Ced0#6ju4VB3e_#IlRj@-xo7ZNLqOl~MNy%&SENk2<2#o+ zidS9<8mXF$VM6=fs6@Xy1>b%9)b~cF38elb4eFb^`5K<9rB`!Glk#FZB+^2gw{$;9 zZb-H`v%mD4!d;gxR{BXDLorJJgwLuhxVuFq^wopf0L248qO$8?IMZ?Q3M~A$K6C*K zCI~BZVUc{5v@9|fJ$FO?=JPnsNSdsy83Ya0%btd#y(O$zgj2mS)4DNYPE$YF_zUAx zdXzv=Wx6X`gF*GNYLXMxdCDCOwH(g4M>>#h>}cZSH2(DCP=4pjyqjr_3)Fx^DHd0P z;o;=XLa|bKQ0xJ<9pN6Vo=XnDw1kcv)6kK+eGaG_ufxa3BY%&jJh|;U>I-Vh<5OfU zC9JZjaKDKbrH2w}%YN%@TO^v)h|e-j9Y2p9Y0!?fXA~48dv9ZrN65&&1Fh5-Hg}`C9wj>4g;i{dNS>Lz?f!DR3}>g8j#)jkMj*LpQ96C*(P%xPy!GIpP*Ph=<((tVYnyp;__IoO-5-{%3)w+) z!H`_)Q(McqGjSOMu`=9*##>qs7Y-|h7u+=HGUJ|{))ST4v$ydU>nh$zuFAJb*{MrY z2!*AUrh(rHR(aoQc}dSyX@o8JWf>o9pxM5lTjpq)0)_R@o^&Qb4+_)as`P+j|@d?gk`kk{}$WTig zU4PZ#Dq^sFR;q)m3f?_s14f=4s-YW01mu#hM(I)ORE~d5@BA*)%jpz~;JnSgylc2g zMP6T>wzVW;h%>va;4Q~a<@aq@?eT^nJH@Uu#oUDuqxqN{Rd2w?*-O~_#LwxEC8tFy zKK-k~Gmf)HJ9aZ8T}aSd{w8u81ET>0EdCKDwZplwuO8z;f~vQpdRDIB(7ar>zM5ed zde=v3>sm~K(_l80^zV<%sY3Szliwq__m}ONo1Y91Ja2`gTlw)SFsLAA$-b4A0LK>i zdHb9)%N|rDzM`*SJfj7h?Ga8MtIA~^F^{h|taWZh*@Vdr8_!*z>|^SbeRg(E{yyR7 z`2vP3e|Ape#FyBf+Jq%}5M2|2YL0k!in02zGF7y0pU_3R_oK>tthB<``!VQq + Date: Wed, 30 Oct 2024 17:18:30 +0100 Subject: [PATCH 2/8] Interfaz y metodo creado --- .../activities/main/IMainContract.java | 3 + .../activities/main/MainPresenter.java | 18 +++- .../gasolineras/activities/main/MainView.java | 62 +++++++++++++- .../unican/gasolineras/model/Gasolinera.java | 12 +++ .../gasolineras/model/TipoCombustible.java | 18 ++++ .../filtrar_precio_max_dialog_layout.xml | 82 +++++++++++++++++++ 6 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 AndroidProject/app/src/main/java/es/unican/gasolineras/model/TipoCombustible.java create mode 100644 AndroidProject/app/src/main/res/layout/filtrar_precio_max_dialog_layout.xml diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java index 9374e2f..d352a8b 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/IMainContract.java @@ -4,6 +4,7 @@ import es.unican.gasolineras.model.Gasolinera; import es.unican.gasolineras.model.PuntoInteres; +import es.unican.gasolineras.model.TipoCombustible; import es.unican.gasolineras.repository.IGasolinerasRepository; /** @@ -123,6 +124,8 @@ public interface View { public void showAnhadirPuntoInteresActivity(); + void onFiltrarClicked(double precioMax, TipoCombustible combustible); + /** * La vista manda una peticion al presenter para que muestre el * popup de filtrar. diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java index 1962449..a4205ba 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainPresenter.java @@ -6,6 +6,7 @@ import es.unican.gasolineras.model.Gasolinera; import es.unican.gasolineras.model.IDCCAAs; import es.unican.gasolineras.model.PuntoInteres; +import es.unican.gasolineras.model.TipoCombustible; import es.unican.gasolineras.repository.ICallBack; import es.unican.gasolineras.repository.IGasolinerasRepository; @@ -19,6 +20,7 @@ public class MainPresenter implements IMainContract.Presenter { /** Atributo lista gasolineras */ List gasolineras; + List gasolinerasMod; /** * @see IMainContract.Presenter#init(IMainContract.View) @@ -64,7 +66,9 @@ public void onMenuOrdenarClicked() { /** * Muestra el popup de filtrar */ - public void onMenuFiltrarClicked() { view.showPopUpFiltar(); } + public void onMenuFiltrarClicked() { + view.showPopUpFiltar(); + } @@ -81,6 +85,8 @@ public void onSuccess(List stations) { gasolineras = stations; view.showStations(stations); view.showLoadCorrect(stations.size()); + //Inicializo la lista que se modifica + gasolinerasMod = new ArrayList<>(gasolineras); } @Override @@ -101,8 +107,12 @@ public void onFailure(Throwable e) { */ public void ordenarGasolinerasCercanasPtoInteres(PuntoInteres p) { GasolineraDistanciaComparator comparator = new GasolineraDistanciaComparator(p); - List gasolinerasCopia = new ArrayList<>(gasolineras); - gasolinerasCopia.sort(comparator); - view.showStations(gasolinerasCopia); + gasolinerasMod.sort(comparator); + view.showStations(gasolinerasMod); + } + + public void filtraGasolinerasPorPrecioMaximo(double precioMax, TipoCombustible combustible) { + + view.showStations(gasolinerasMod); } } diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java index bb470fe..d65dd47 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java @@ -8,6 +8,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; +import android.widget.EditText; import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; @@ -31,6 +32,7 @@ import es.unican.gasolineras.activities.puntoInteres.AnhadirPuntoInteresView; import es.unican.gasolineras.model.Gasolinera; import es.unican.gasolineras.model.PuntoInteres; +import es.unican.gasolineras.model.TipoCombustible; import es.unican.gasolineras.repository.AppDatabase; import es.unican.gasolineras.repository.DbFunctions; import es.unican.gasolineras.repository.IGasolinerasRepository; @@ -99,7 +101,7 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { return true; } if (itemId == R.id.menuOrdenar) { - presenter.onMenuFiltrarClicked(); + presenter.onMenuOrdenarClicked(); return true; } if (itemId == R.id.menuItemAnhadirPuntoInteres) { @@ -107,7 +109,7 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { return true; } if (itemId == R.id.menuFiltrar) { - presenter.(); + presenter.onMenuFiltrarClicked(); return true; } return super.onOptionsItemSelected(item); @@ -268,8 +270,64 @@ public void showAnhadirPuntoInteresActivity() { startActivity(intent); } + @Override + public void onFiltrarClicked(double precioMax, TipoCombustible combustible) { + presenter.filtraGasolinerasPorPrecioMaximo(precioMax, combustible); + } + @Override public void showPopUpFiltar() { + final AlertDialog.Builder builder = new AlertDialog.Builder(MainView.this); + LayoutInflater inflater = MainView.this.getLayoutInflater(); + View dialogView = inflater.inflate(R.layout.filtrar_precio_max_dialog_layout, null); + + // Referencio el spinner + Spinner spinner = dialogView.findViewById(R.id.spinnerFuelType); + EditText etMaxPrice = dialogView.findViewById(R.id.etMaxPrice); + View btnOrdenar = dialogView.findViewById(R.id.btnFiltrar); // Referencia al botón "Filtrar" + View btnCancelar = dialogView.findViewById(R.id.btnCancelar); // Referencia al botón "Cancelar" + + // Llenar el spinner con los valores del enum TipoCombustible + ArrayAdapter adapter = new ArrayAdapter<>( + MainView.this, + android.R.layout.simple_spinner_item, + TipoCombustible.values() + ); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(adapter); + + // Creo el alert y muestro el dialog + builder.setView(dialogView); + AlertDialog dialog = builder.create(); + dialog.show(); + + // Listener para el botón "Cancelar" + btnCancelar.setOnClickListener(v -> dialog.dismiss()); + + // Listener para el botón "Filtrar" + btnOrdenar.setOnClickListener(v -> { + String maxPriceText = etMaxPrice.getText().toString(); + if (maxPriceText.isEmpty()) { + Toast.makeText(MainView.this, "Por favor, introduce un precio máximo.", Toast.LENGTH_SHORT).show(); + } else { + double precioMax; + try { + precioMax = Double.parseDouble(maxPriceText); + } catch (NumberFormatException e) { + Toast.makeText(MainView.this, "Introduce un número válido para el precio máximo.", Toast.LENGTH_SHORT).show(); + return; + } + // Obtener el tipo de combustible seleccionado del spinner + TipoCombustible combustible = (TipoCombustible) spinner.getSelectedItem(); + + // Llamar al método onFiltrarClicked pasando el tipo de combustible y el precio máximo + onFiltrarClicked(precioMax, combustible); + + // Cerrar el popup + dialog.dismiss(); + } + }); } + } \ No newline at end of file diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/model/Gasolinera.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/model/Gasolinera.java index a758a84..9a1f1d4 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/model/Gasolinera.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/model/Gasolinera.java @@ -29,8 +29,20 @@ public class Gasolinera { @SerializedName("Dirección") protected String direccion; @SerializedName("Municipio") protected String municipio; + @SerializedName("Precio Biodiesel") protected double biodiesel; + @SerializedName("Precio Bioetanol") protected double bioetanol; + @SerializedName("Precio Gas Natural Comprimido") protected double gnc; + @SerializedName("Precio Gas Natural Licuado") protected double gnl; + @SerializedName("Precio Gases licuados del petróleo") protected double glp; @SerializedName("Precio Gasoleo A") protected double gasoleoA; + @SerializedName("Precio Gasoleo B") protected double gasoleoB; + @SerializedName("Precio Gasoleo Premium") protected double gasoleoPremium; + @SerializedName("Precio Gasolina 95 E10") protected double gasolina95E10; @SerializedName("Precio Gasolina 95 E5") protected double gasolina95E5; + @SerializedName("Precio Gasolina 95 E5 Premium") protected double gasolina95E5Premium; + @SerializedName("Precio Gasolina 98 E10") protected double gasolina98E10; + @SerializedName("Precio Gasolina 98 E5") protected double gasolina98E5; + @SerializedName("Precio Hidrogeno") protected double hidrogeno; @SerializedName("Horario") protected String horario; diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/model/TipoCombustible.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/model/TipoCombustible.java new file mode 100644 index 0000000..5cf457b --- /dev/null +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/model/TipoCombustible.java @@ -0,0 +1,18 @@ +package es.unican.gasolineras.model; + +public enum TipoCombustible { + BIODIESEL, + BIOETANOL, + GNC, + GNL, + GLP, + GASOLEO_A, + GASOLEO_B, + GASOLEO_PREMIUM, + GASOLINA_95_E10, + GASOLINA_95_E5, + GASOLINA_95_E5_PREMIUM, + GASOLINA_98_E10, + GASOLINA_98_E5, + HIDROGENO; +} diff --git a/AndroidProject/app/src/main/res/layout/filtrar_precio_max_dialog_layout.xml b/AndroidProject/app/src/main/res/layout/filtrar_precio_max_dialog_layout.xml new file mode 100644 index 0000000..d6778a5 --- /dev/null +++ b/AndroidProject/app/src/main/res/layout/filtrar_precio_max_dialog_layout.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + +