From 98c89f7b367efbb4f89f0e7dbcaf38696ea1e9ad Mon Sep 17 00:00:00 2001 From: Sergey Karmanov Date: Mon, 23 Dec 2024 14:25:02 +0300 Subject: [PATCH] =?UTF-8?q?8=20=D0=BB=D0=B0=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/myapplication/DAO/CityDao.java | 2 +- .../myapplication/DAO/FavoriteCityDao.java | 3 + .../example/myapplication/MainActivity2.java | 4 + .../myapplication/ui/home/HomeFragment.java | 22 ++-- .../ui/slideshow/SlideshowFragment.java | 119 +++++++++++++++++- .../main/res/layout/fragment_slideshow.xml | 19 +-- 6 files changed, 141 insertions(+), 28 deletions(-) diff --git a/src/app/src/main/java/com/example/myapplication/DAO/CityDao.java b/src/app/src/main/java/com/example/myapplication/DAO/CityDao.java index 0451044..7f5b273 100644 --- a/src/app/src/main/java/com/example/myapplication/DAO/CityDao.java +++ b/src/app/src/main/java/com/example/myapplication/DAO/CityDao.java @@ -21,7 +21,7 @@ public interface CityDao { List getAllCity(); @Query("SELECT * FROM city_table WHERE id = :cityId") - City getCityById(int cityId); + City getCityById(long cityId); @Query("SELECT COUNT(*) FROM city_table") int countCity(); diff --git a/src/app/src/main/java/com/example/myapplication/DAO/FavoriteCityDao.java b/src/app/src/main/java/com/example/myapplication/DAO/FavoriteCityDao.java index ff23e81..9de62c9 100644 --- a/src/app/src/main/java/com/example/myapplication/DAO/FavoriteCityDao.java +++ b/src/app/src/main/java/com/example/myapplication/DAO/FavoriteCityDao.java @@ -24,4 +24,7 @@ public interface FavoriteCityDao { @Query("SELECT * FROM favorite_cities_table WHERE owner_id = :userId AND city_id = :cityId") int isFavorite(long userId, long cityId); + + @Query("DELETE FROM favorite_cities_table WHERE owner_id = :userId AND city_id = :cityId") + void removeFavorite(long userId, long cityId); } diff --git a/src/app/src/main/java/com/example/myapplication/MainActivity2.java b/src/app/src/main/java/com/example/myapplication/MainActivity2.java index c98c698..bc91b22 100644 --- a/src/app/src/main/java/com/example/myapplication/MainActivity2.java +++ b/src/app/src/main/java/com/example/myapplication/MainActivity2.java @@ -18,12 +18,16 @@ import androidx.appcompat.app.AppCompatActivity; import com.example.myapplication.databinding.ActivityMain2Binding; +import java.util.ArrayList; + public class MainActivity2 extends AppCompatActivity { private AppBarConfiguration mAppBarConfiguration; private ActivityMain2Binding binding; private WeatherData CurrentCity = new WeatherData("Город ещё не выбран","", "", "", ""); + public static ArrayList weatherDataList = new ArrayList<>(); + private String userName = ""; public String getUserName() { diff --git a/src/app/src/main/java/com/example/myapplication/ui/home/HomeFragment.java b/src/app/src/main/java/com/example/myapplication/ui/home/HomeFragment.java index 6ef5f60..5ff5025 100644 --- a/src/app/src/main/java/com/example/myapplication/ui/home/HomeFragment.java +++ b/src/app/src/main/java/com/example/myapplication/ui/home/HomeFragment.java @@ -4,6 +4,7 @@ import android.app.AlertDialog; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; @@ -11,6 +12,9 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.NavigationUI; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -27,6 +31,7 @@ import com.example.myapplication.R; import com.example.myapplication.RecyclerItemClickListener; import com.example.myapplication.DTO.WeatherData; import com.example.myapplication.databinding.FragmentHomeBinding; +import com.google.android.material.navigation.NavigationView; import com.google.gson.JsonArray; import java.util.ArrayList; @@ -44,9 +49,7 @@ public class HomeFragment extends Fragment { private FragmentHomeBinding binding; private WeatherService service; - private ArrayList weatherDataList = new ArrayList<>(); private List cityList = new ArrayList(); - private RecyclerView recyclerView; public View onCreateView(@NonNull LayoutInflater inflater, @@ -60,15 +63,15 @@ public class HomeFragment extends Fragment { recyclerView = root.findViewById(R.id.suslik); recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(root.getContext(), recyclerView ,new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { - Log.e("HomeFragment", "onClick: " + weatherDataList.get(position).City); if (getActivity() instanceof MainActivity2) { - ((MainActivity2) getActivity()).setCurrentCity(weatherDataList.get(position)); + Log.e("HomeFragment", "onClick: " + MainActivity2.weatherDataList.get(position).City); + ((MainActivity2) getActivity()).setCurrentCity(MainActivity2.weatherDataList.get(position)); } } @Override public void onLongItemClick(View view, int position) { - String selectedCity = weatherDataList.get(position).City; + String selectedCity = MainActivity2.weatherDataList.get(position).City; showDialog(selectedCity); } })); @@ -143,7 +146,6 @@ public class HomeFragment extends Fragment { binding = null; } - @Override public void onResume() { super.onResume(); @@ -153,9 +155,9 @@ public class HomeFragment extends Fragment { if (response.isSuccessful()) { JsonArray weatherData = response.body(); Log.d("HomeFragment", "Weather data: " + weatherData); - weatherDataList = new ArrayList<>(weatherData.size()); + MainActivity2.weatherDataList = new ArrayList<>(weatherData.size()); for (int i = 0; i < weatherData.size(); i++) { - weatherDataList.add(new WeatherData( + MainActivity2.weatherDataList.add(new WeatherData( weatherData.get(i).getAsJsonObject().get("City").getAsString(), weatherData.get(i).getAsJsonObject().get("Temperature").getAsString(), weatherData.get(i).getAsJsonObject().get("WeatherCondition").getAsString(), @@ -163,7 +165,7 @@ public class HomeFragment extends Fragment { weatherData.get(i).getAsJsonObject().get("Wind").getAsString() )); - weatherDataList.sort((o1, o2) -> o1.City.compareTo(o2.City)); + MainActivity2.weatherDataList.sort((o1, o2) -> o1.City.compareTo(o2.City)); // JsonObject item = weatherData.get(i).getAsJsonObject(); // Log.i("HomeFragment", "City: " + item.get("City").getAsString()); @@ -178,7 +180,7 @@ public class HomeFragment extends Fragment { CityDao cityDao = db.cityDao(); Executors.newSingleThreadExecutor().execute(() -> { if (cityDao.countCity() == 0) { - for (WeatherData wd : weatherDataList) { + for (WeatherData wd : MainActivity2.weatherDataList) { Log.i("HomeFragment", "Inserting city: " + wd.City); cityDao.insert(new City(wd.City)); } diff --git a/src/app/src/main/java/com/example/myapplication/ui/slideshow/SlideshowFragment.java b/src/app/src/main/java/com/example/myapplication/ui/slideshow/SlideshowFragment.java index 232bfec..0b860e6 100644 --- a/src/app/src/main/java/com/example/myapplication/ui/slideshow/SlideshowFragment.java +++ b/src/app/src/main/java/com/example/myapplication/ui/slideshow/SlideshowFragment.java @@ -1,37 +1,148 @@ package com.example.myapplication.ui.slideshow; +import android.app.AlertDialog; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.example.myapplication.AppDatabase; +import com.example.myapplication.CustomAdapter; +import com.example.myapplication.DAO.CityDao; +import com.example.myapplication.DAO.FavoriteCityDao; +import com.example.myapplication.DAO.UserDao; +import com.example.myapplication.DTO.City; +import com.example.myapplication.DTO.FavoriteCity; +import com.example.myapplication.DTO.User; +import com.example.myapplication.MainActivity2; +import com.example.myapplication.R; +import com.example.myapplication.RecyclerItemClickListener; import com.example.myapplication.databinding.FragmentSlideshowBinding; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; + public class SlideshowFragment extends Fragment { private FragmentSlideshowBinding binding; + private RecyclerView recyclerView; + private List cityList = new ArrayList(); + + private AppDatabase db; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - SlideshowViewModel slideshowViewModel = - new ViewModelProvider(this).get(SlideshowViewModel.class); binding = FragmentSlideshowBinding.inflate(inflater, container, false); View root = binding.getRoot(); - final TextView textView = binding.textSlideshow; - slideshowViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); + db = AppDatabase.getDatabase(getContext()); + + recyclerView = root.findViewById(R.id.fav_cyclik); + recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(root.getContext(), recyclerView, new RecyclerItemClickListener.OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + Log.e("SlideshowFragment", "onClick: " + cityList.get(position).CityName); + if (getActivity() instanceof MainActivity2) { + ((MainActivity2) getActivity()).setCurrentCity(MainActivity2.weatherDataList.get(position)); + } + } + + @Override + public void onLongItemClick(View view, int position) { + String selectedCity = cityList.get(position).CityName; + showDialog(selectedCity); + } + })); + + recyclerView.setLayoutManager(new LinearLayoutManager(root.getContext())); + CustomAdapter adapter = new CustomAdapter(cityList); + recyclerView.setAdapter(adapter); + return root; } + private void showDialog(String city) { + new AlertDialog.Builder(getContext()) + .setTitle("Выбор города") + .setMessage("Удалить " + city + " из избранного?") + .setPositiveButton("Удалить", (dialog, which) -> { + if (getActivity() instanceof MainActivity2) { + String username = ((MainActivity2) getActivity()).getUserName(); + + Executors.newSingleThreadExecutor().execute(() -> { + CityDao cityDao = db.cityDao(); + UserDao userDao = db.userDao(); + FavoriteCityDao favoriteCityDao = db.favoriteCityDao(); + City cityObj = cityDao.getCityByName(city); + User userObj = userDao.getUserByName(username); + + // check if city is already in favorites + if (userObj != null && cityObj != null) { + if (favoriteCityDao.isFavorite(userObj.getId(), cityObj.getId()) > 0) { + favoriteCityDao.removeFavorite(userObj.getId(), cityObj.getId()); + getActivity().runOnUiThread(() -> { + Toast.makeText(getContext(), city + " удалён из избранного", Toast.LENGTH_SHORT).show(); + updateData(); + }); + } + } else { + Log.e("HomeFragment", "User or city not found"); + } + }); + + } else { + Log.e("SlideshowFragment", "Ошибка получения контекста"); + } + }) + .setNegativeButton("Отмена", null) + .show(); + } + @Override public void onDestroyView() { super.onDestroyView(); binding = null; } + + @Override + public void onResume() { + super.onResume(); + updateData(); + } + + private void updateData() { + Executors.newSingleThreadExecutor().execute(() -> { + if (getActivity() instanceof MainActivity2) { + String username = ((MainActivity2) getActivity()).getUserName(); + + CityDao cityDao = db.cityDao(); + UserDao userDao = db.userDao(); + FavoriteCityDao favoriteCityDao = db.favoriteCityDao(); + + User userObj = userDao.getUserByName(username); + + List favCity = favoriteCityDao.getFavoriteCityByOwnerId(userObj.getId()); + cityList.clear(); + + for (FavoriteCity favoriteCity : favCity) { + City city = cityDao.getCityById(favoriteCity.getCityId()); + cityList.add(city); + } + getActivity().runOnUiThread(() -> { + recyclerView.getAdapter().notifyDataSetChanged(); + }); + } + }); + } } \ No newline at end of file diff --git a/src/app/src/main/res/layout/fragment_slideshow.xml b/src/app/src/main/res/layout/fragment_slideshow.xml index 2141a33..db16a7f 100644 --- a/src/app/src/main/res/layout/fragment_slideshow.xml +++ b/src/app/src/main/res/layout/fragment_slideshow.xml @@ -4,19 +4,12 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.slideshow.SlideshowFragment"> + tools:context=".ui.home.HomeFragment"> - + android:layout_height="match_parent" + android:id="@+id/fav_cyclik"> + + \ No newline at end of file