48 private TextView tvName;
49 private CircleImageView profileImage;
51 private RecyclerView recyclerView;
53 private List<Producto> productList;
55 private static final String TAG =
"HomeFragment";
59 public View
onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
60 View view = inflater.inflate(R.layout.fragment_home, container,
false);
63 tvName = view.findViewById(R.id.txtUser);
64 profileImage = view.findViewById(R.id.profileImage);
65 Button button1 = view.findViewById(R.id.btn1);
66 Button button2 = view.findViewById(R.id.btn);
67 Button button3 = view.findViewById(R.id.btn3);
68 Button button4 = view.findViewById(R.id.btn4);
69 ImageView imageView1 = view.findViewById(R.id.imageView3);
70 ImageView imageView2 = view.findViewById(R.id.imageView4);
71 FloatingActionButton btnWebsite = view.findViewById(R.id.btnWebsite);
74 recyclerView = view.findViewById(R.id.recyclerview_productos_home);
75 recyclerView.setLayoutManager(
new LinearLayoutManager(getContext()));
78 productList =
new ArrayList<>();
81 public void onAgregarCarritoClick(Producto producto) {
82 agregarProductoAlCarrito(producto.getIdProducto());
86 recyclerView.setAdapter(adapter);
89 btnWebsite.setOnClickListener(v -> {
90 String url =
"https://ispcfood.netlify.app/";
91 Intent intent =
new Intent(Intent.ACTION_VIEW);
92 intent.setData(Uri.parse(url));
93 startActivity(intent);
96 profileManager =
new ProfileManager(requireContext());
97 SessionManager sessionManager =
new SessionManager(requireContext());
100 mostrarNombreUsuario();
101 cargarImagenPerfil();
106 button1.setOnClickListener(v -> navegarAProductosConFiltro(3));
107 button2.setOnClickListener(v -> navegarAProductosConFiltro(1));
108 button3.setOnClickListener(v -> navegarAProductosConFiltro(0));
109 button4.setOnClickListener(v -> navegarAProductosConFiltro(2));
110 imageView1.setOnClickListener(v -> navegarAProductosConFiltro(3));
111 imageView2.setOnClickListener(v -> navegarAProductosConFiltro(2));
116 private void mostrarNombreUsuario() {
117 String nombreGuardado = profileManager.
getName();
118 if (nombreGuardado !=
null) {
119 tvName.setText(getString(R.string.bienvenido_usuario, nombreGuardado));
121 tvName.setText(R.string.usuario);
125 private void cargarImagenPerfil() {
129 Log.d(TAG,
"URL base recuperada: " + baseUrl);
130 Log.d(TAG,
"URL con timestamp: " + imageUrl);
132 if (baseUrl !=
null && !baseUrl.isEmpty()) {
134 com.example.food_front.utils.ImageCacheManager.clearGlideCache(requireContext());
140 java.net.URL url =
new java.net.URL(baseUrl);
141 java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();
142 connection.setDoInput(
true);
143 connection.setUseCaches(
false);
144 connection.setRequestProperty(
"Cache-Control",
"no-cache, no-store, must-revalidate");
145 connection.setRequestProperty(
"Pragma",
"no-cache");
146 connection.connect();
148 final android.graphics.Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(connection.getInputStream());
151 if (getActivity() !=
null && !getActivity().isFinishing()) {
152 getActivity().runOnUiThread(() -> {
153 if (bitmap !=
null) {
154 profileImage.setImageBitmap(bitmap);
155 Log.d(TAG,
"Imagen cargada exitosamente con descarga directa");
158 cargarImagenConGlide(imageUrl);
162 }
catch (Exception e) {
163 Log.e(TAG,
"Error al descargar directamente: " + e.getMessage());
165 if (getActivity() !=
null && !getActivity().isFinishing()) {
166 getActivity().runOnUiThread(() -> cargarImagenConGlide(imageUrl));
171 Log.d(TAG,
"No hay URL de imagen, usando imagen predeterminada");
173 profileImage.setImageResource(R.drawable.default_profile);
177 private void cargarImagenConGlide(String imageUrl) {
179 Glide.with(requireContext())
181 .skipMemoryCache(
true)
182 .diskCacheStrategy(com.bumptech.glide.load.engine.DiskCacheStrategy.NONE)
183 .placeholder(R.drawable.default_profile)
184 .error(R.drawable.default_profile)
185 .listener(
new RequestListener<Drawable>() {
187 public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model,
188 @NonNull Target<Drawable> target,
boolean isFirstResource) {
189 Log.e(TAG,
"Error al cargar la imagen: " + e);
194 public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model,
195 @NonNull Target<Drawable> target,
196 @NonNull DataSource dataSource,
197 boolean isFirstResource) {
198 Log.d(TAG,
"Imagen cargada exitosamente desde: " + model);
207 if (profileImage !=
null && url !=
null && !url.isEmpty()) {
209 com.example.food_front.utils.ImageCacheManager.clearGlideCache(requireContext());
211 String imageUrlWithTimestamp = url +
"?nocache=" + Math.random() +
"&t=" + System.currentTimeMillis();
212 Log.d(TAG,
"Actualizando imagen desde otro fragmento: " + imageUrlWithTimestamp);
218 java.net.URL url1 =
new java.net.URL(url);
219 final android.graphics.Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(url1.openConnection().getInputStream());
222 if (getActivity() !=
null && !getActivity().isFinishing()) {
223 getActivity().runOnUiThread(() -> {
224 if (bitmap !=
null) {
226 profileImage.setImageBitmap(bitmap);
227 Log.d(TAG,
"Imagen en HomeFragment actualizada directamente con Bitmap");
230 Glide.with(requireContext())
231 .load(imageUrlWithTimestamp)
232 .skipMemoryCache(
true)
233 .diskCacheStrategy(com.bumptech.glide.load.engine.DiskCacheStrategy.NONE)
234 .placeholder(R.drawable.default_profile)
235 .error(R.drawable.default_profile)
240 }
catch (Exception e) {
241 Log.e(TAG,
"Error al descargar directamente en HomeFragment: " + e.getMessage());
243 if (getActivity() !=
null && !getActivity().isFinishing()) {
244 getActivity().runOnUiThread(() -> {
245 Glide.with(requireContext())
246 .load(imageUrlWithTimestamp)
247 .skipMemoryCache(
true)
248 .diskCacheStrategy(com.bumptech.glide.load.engine.DiskCacheStrategy.NONE)
249 .placeholder(R.drawable.default_profile)
250 .error(R.drawable.default_profile)
260 private void cargarProductos(
int categoriaId) {
261 String url =
"https://backmobile1.onrender.com/api/producto/";
263 StringRequest stringRequest =
new StringRequest(Request.Method.GET, url,
267 JSONArray jsonArray = new JSONArray(response);
270 for (int i = 0; i < jsonArray.length(); i++) {
271 JSONObject jsonObject = jsonArray.getJSONObject(i);
274 int id_producto = jsonObject.getInt(
"id_producto");
275 String nombre_producto = jsonObject.getString(
"nombre_producto");
276 String descripcion = jsonObject.getString(
"descripcion");
277 double precio = jsonObject.getDouble(
"precio");
278 String imagenUrl = jsonObject.getString(
"imageURL");
279 int id_categoria = jsonObject.has(
"id_categoria") ? jsonObject.getInt(
"id_categoria") : 0;
282 if (categoriaId == 0 || id_categoria == categoriaId) {
283 Producto producto = new Producto(id_producto, nombre_producto, descripcion, precio, imagenUrl, id_categoria);
284 productList.add(producto);
289 adapter.notifyDataSetChanged();
291 } catch (JSONException e) {
293 Log.e(TAG,
"Error al parsear el JSON: " + e.getMessage());
296 Log.e(TAG,
"Error en la solicitud: " + error.getMessage());
301 Volley.newRequestQueue(requireContext()).add(stringRequest);
305 private void agregarProductoAlCarrito(
int idProducto) {
306 String url =
"https://backmobile1.onrender.com/appCART/agregar/" + idProducto +
"/";
308 SessionManager sessionManager =
new SessionManager(getContext());
309 String token = sessionManager.getToken();
310 Log.d(
"AuthToken",
"Token usado en la solicitud: " + token);
313 StringRequest stringRequest =
new StringRequest(Request.Method.POST, url,
316 Log.d(TAG,
"Producto agregado al carrito: " + response);
317 android.widget.Toast.makeText(getContext(),
"Producto agregado al carrito", android.widget.Toast.LENGTH_SHORT).show();
321 Log.e(TAG,
"Error al agregar al carrito: " + error.getMessage());
322 if (error.networkResponse != null) {
323 Log.e(TAG,
"Código de respuesta: " + error.networkResponse.statusCode);
325 android.widget.Toast.makeText(getContext(),
"Error al agregar producto al carrito", android.widget.Toast.LENGTH_SHORT).show();
328 public java.util.Map<String, String> getHeaders() {
329 java.util.Map<String, String> headers =
new java.util.HashMap<>();
330 headers.put(
"Authorization",
"Bearer " + token);
335 protected java.util.Map<String, String> getParams() {
336 java.util.Map<String, String> params =
new java.util.HashMap<>();
337 params.put(
"direccion",
"casa");
338 params.put(
"cantidad",
"1");
344 Volley.newRequestQueue(getContext()).add(stringRequest);
347 android.widget.Toast.makeText(getContext(),
"Debes iniciar sesión para agregar productos al carrito", android.widget.Toast.LENGTH_SHORT).show();
355 reloadProfileDataIfNeeded();
358 private void reloadProfileDataIfNeeded() {
361 long now = System.currentTimeMillis();
363 if (now - lastUpdated > 5 * 60 * 1000) {
364 Log.d(TAG,
"Han pasado más de 5 minutos, recargando datos del perfil");
365 cargarImagenPerfil();
382 private void navegarAProductosConFiltro(
int categoriaId) {
384 Bundle args =
new Bundle();
385 args.putInt(
"categoria_id", categoriaId);
386 productsFragment.setArguments(args);
387 requireActivity().getSupportFragmentManager()
389 .replace(R.id.fragment_container_view, productsFragment)
390 .addToBackStack(
null)