5-7я лаба

This commit is contained in:
Sergey Karmanov 2024-12-04 01:43:56 +03:00
parent cc39ffdbe0
commit 340b4193de
21 changed files with 569 additions and 48 deletions

View File

@ -0,0 +1,44 @@
import android.app.AlertDialog;
import android.app.Fragment;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class CitySelectorFragment extends Fragment {
private List<String> cities;
private List<String> favoriteCities = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_city_selector, container, false);
ListView cityListView = view.findViewById(R.id.city_list);
// Пример списка городов
cities = Arrays.asList("Москва", "Санкт-Петербург", "Новосибирск", "Екатеринбург");
CityAdapter adapter = new CityAdapter(getContext(), cities);
cityListView.setAdapter(adapter);
cityListView.setOnItemLongClickListener((parent, view1, position, id) -> {
String selectedCity = cities.get(position);
showDialog(selectedCity);
return true;
});
return view;
}
private void showDialog(String city) {
new AlertDialog.Builder(getContext())
.setTitle("Выбор города")
.setMessage("Добавить " + city + " в избранное?")
.setPositiveButton("В избранное", (dialog, which) -> {
favoriteCities.add(city);
Toast.makeText(getContext(), city + " добавлен в избранное", Toast.LENGTH_SHORT).show();
})
.setNegativeButton("Отмена", null)
.show();
}
}

View File

@ -8,7 +8,7 @@ android {
defaultConfig { defaultConfig {
applicationId "com.example.myapplication" applicationId "com.example.myapplication"
minSdk 31 minSdk 30
targetSdk 34 targetSdk 34
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
@ -32,6 +32,9 @@ android {
} }
dependencies { dependencies {
implementation libs.room.runtime
annotationProcessor libs.room.compiler
implementation libs.appcompat implementation libs.appcompat
implementation libs.material implementation libs.material
implementation libs.activity implementation libs.activity

View File

@ -18,16 +18,16 @@
android:exported="true" android:exported="true"
android:label="@string/title_activity_main2" android:label="@string/title_activity_main2"
android:theme="@style/Theme.MyApplication.NoActionBar"> android:theme="@style/Theme.MyApplication.NoActionBar">
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".MainActivity"
android:exported="true">
</activity>
</application> </application>
</manifest> </manifest>

View File

@ -0,0 +1,37 @@
package com.example.myapplication;
import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
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;
@Database(entities = {User.class, City.class, FavoriteCity.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
public abstract CityDao cityDao();
public abstract FavoriteCityDao favoriteCityDao();
// public abstract WeatherDao weatherDao();
private static volatile AppDatabase INSTANCE;
public static AppDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "app_database")
.build();
}
}
}
return INSTANCE;
}
}

View File

@ -8,13 +8,14 @@ import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList; import com.example.myapplication.DTO.City;
import com.example.myapplication.DTO.WeatherData;
import java.util.List; import java.util.List;
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private List<WeatherData> localDataSet; private List<City> localDataSet;
public static class ViewHolder extends RecyclerView.ViewHolder { public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView; private final TextView textView;
@ -32,7 +33,7 @@ public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder
} }
public CustomAdapter(List<WeatherData> dataSet) { public CustomAdapter(List<City> dataSet) {
localDataSet = dataSet; localDataSet = dataSet;
} }
@ -52,7 +53,7 @@ public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder
// Get element from your dataset at this position and replace the // Get element from your dataset at this position and replace the
// contents of the view with that element // contents of the view with that element
viewHolder.getTextView().setText(localDataSet.get(position).City); viewHolder.getTextView().setText(localDataSet.get(position).CityName);
} }
// Return the size of your dataset (invoked by the layout manager) // Return the size of your dataset (invoked by the layout manager)

View File

@ -0,0 +1,31 @@
package com.example.myapplication.DAO;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import com.example.myapplication.DTO.City;
import com.example.myapplication.DTO.User;
import java.util.List;
@Dao
public interface CityDao {
@Insert
void insert(City city);
@Insert
void insertAll(City... city);
@Query("SELECT * FROM city_table")
List<City> getAllCity();
@Query("SELECT * FROM city_table WHERE id = :cityId")
City getCityById(int cityId);
@Query("SELECT COUNT(*) FROM city_table")
int countCity();
@Query("SELECT * FROM city_table WHERE CityName = :city")
City getCityByName(String city);
}

View File

@ -0,0 +1,27 @@
package com.example.myapplication.DAO;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import com.example.myapplication.DTO.FavoriteCity;
import java.util.List;
@Dao
public interface FavoriteCityDao {
@Insert
void insert(FavoriteCity favoriteCity);
@Insert
void insertAll(FavoriteCity... favoriteCities);
@Query("SELECT * FROM favorite_cities_table")
List<FavoriteCity> getAllFavoriteCity();
@Query("SELECT * FROM favorite_cities_table WHERE owner_id = :ownerId")
List<FavoriteCity> getFavoriteCityByOwnerId(long ownerId);
@Query("SELECT * FROM favorite_cities_table WHERE owner_id = :userId AND city_id = :cityId")
int isFavorite(long userId, long cityId);
}

View File

@ -0,0 +1,27 @@
package com.example.myapplication.DAO;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import com.example.myapplication.DTO.User;
import java.util.List;
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Insert
void insertAll(User... users);
@Query("SELECT * FROM user_table")
List<User> getAllUsers();
@Query("SELECT password FROM user_table WHERE LOWER(name) = LOWER(:name)")
String getPasswordByName(String name);
@Query("SELECT * FROM user_table WHERE LOWER(name) = LOWER(:username)")
User getUserByName(String username);
}

View File

@ -0,0 +1,7 @@
package com.example.myapplication.DAO;
import androidx.room.Dao;
@Dao
public class WeatherDao {
}

View File

@ -0,0 +1,25 @@
package com.example.myapplication.DTO;
@androidx.room.Entity(tableName = "city_table")
public class City {
@androidx.room.PrimaryKey(autoGenerate = true)
private long id;
public String CityName;
public City(String CityName) {
this.CityName = CityName;
}
public long getId() {
return id;
}
public String getName() {
return CityName;
}
public void setId(long id) {
this.id = id;
}
}

View File

@ -0,0 +1,60 @@
package com.example.myapplication.DTO;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.Index;
@Entity(tableName = "favorite_cities_table",
foreignKeys = {
@ForeignKey(entity = User.class,
parentColumns = "id",
childColumns = "owner_id",
onDelete = ForeignKey.CASCADE),
@ForeignKey(entity = City.class,
parentColumns = "id",
childColumns = "city_id",
onDelete = ForeignKey.CASCADE)
},
indices = {
@Index(value = "owner_id"),
@Index(value = "city_id")
}
)
public class FavoriteCity {
@androidx.room.PrimaryKey(autoGenerate = true)
private long id;
@androidx.room.ColumnInfo(name = "owner_id")
private long ownerId;
@androidx.room.ColumnInfo(name = "city_id")
private long cityId;
public FavoriteCity(long ownerId, long cityId) {
this.ownerId = ownerId;
this.cityId = cityId;
}
public long getId() {
return id;
}
public long getOwnerId() {
return ownerId;
}
public long getCityId() {
return cityId;
}
public void setId(long id) {
this.id = id;
}
public void setOwnerId(long ownerId) {
this.ownerId = ownerId;
}
public void setCityId(long cityId) {
this.cityId = cityId;
}
}

View File

@ -0,0 +1,33 @@
package com.example.myapplication.DTO;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "user_table")
public class User {
@PrimaryKey(autoGenerate = true)
private long id;
public String name;
public String password;
public User(String name, String password) {
this.name = name;
this.password = password;
}
public long getId() {
return id;
}
public String getPassword() {
return password;
}
public String getName() {
return name;
}
public void setId(long id) {
this.id = id;
}
}

View File

@ -1,6 +1,13 @@
package com.example.myapplication; package com.example.myapplication.DTO;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "weather_table")
public class WeatherData { public class WeatherData {
@PrimaryKey(autoGenerate = true)
private long id;
public String City; public String City;
public String Temperature; public String Temperature;
public String WeatherCondition; public String WeatherCondition;

View File

@ -0,0 +1,44 @@
package com.example.myapplication;
import com.example.myapplication.DAO.CityDao;
import com.example.myapplication.DAO.FavoriteCityDao;
import com.example.myapplication.DAO.UserDao;
import com.example.myapplication.DTO.User;
public class DatabaseInitializer {
public static void populateDatabase(final AppDatabase db) {
new Thread(() -> {
UserDao userDao = db.userDao();
CityDao cityDao = db.cityDao();
FavoriteCityDao favoriteCityDao = db.favoriteCityDao();
// Создание начальных данных
User user1 = new User("Alice", "kek123");
User user2 = new User("Bob", "kek123");
User user3 = new User("Charlie", "kek123");
User user4 = new User("David", "kek123");
User user5 = new User("Eve", "kek123");
userDao.insertAll(user1, user2, user3, user4, user5);
// Создание городов
// City city1 = new City("Moscow");
// City city2 = new City("Saint Petersburg");
// City city3 = new City("Novosibirsk");
// City city4 = new City("Yekaterinburg");
// City city5 = new City("Kazan");
// City city6 = new City("Chelyabinsk");
// City city7 = new City("Omsk");
// cityDao.insertAll(city1, city2, city3, city4, city5, city6, city7);
// Создание связей между пользователями и городами
// FavoriteCity favoriteCity1 = new FavoriteCity(1, 1);
// FavoriteCity favoriteCity2 = new FavoriteCity(1, 2);
// FavoriteCity favoriteCity3 = new FavoriteCity(1, 3);
// FavoriteCity favoriteCity4 = new FavoriteCity(2, 4);
// FavoriteCity favoriteCity5 = new FavoriteCity(2, 5);
// FavoriteCity favoriteCity6 = new FavoriteCity(3, 6);
// FavoriteCity favoriteCity7 = new FavoriteCity(3, 7);
// favoriteCityDao.insertAll(favoriteCity1, favoriteCity2, favoriteCity3, favoriteCity4, favoriteCity5, favoriteCity6, favoriteCity7);
}).start();
}
}

View File

@ -1,10 +1,12 @@
package com.example.myapplication; package com.example.myapplication;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.ColorMatrix; import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter; import android.graphics.ColorMatrixColorFilter;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
@ -13,12 +15,24 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets; import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsCompat;
import android.widget.EditText; import android.widget.EditText;
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.User;
import java.util.List;
import java.util.concurrent.Executors;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
EditText emailEditText; EditText emailEditText;
EditText passwordEditText; EditText passwordEditText;
private UserDao userDao;
AppDatabase db;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -34,23 +48,102 @@ public class MainActivity extends AppCompatActivity {
emailEditText = findViewById(R.id.editTextTextEmailAddress); emailEditText = findViewById(R.id.editTextTextEmailAddress);
passwordEditText = findViewById(R.id.editTextTextPassword); passwordEditText = findViewById(R.id.editTextTextPassword);
db = AppDatabase.getDatabase(this);
userDao = db.userDao();
ImageView imageView = findViewById(R.id.imageView); ImageView imageView = findViewById(R.id.imageView);
ColorMatrix matrix = new ColorMatrix(); ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0); // Set saturation to 0 to make the image monochrome matrix.setSaturation(0); // Set saturation to 0 to make the image monochrome
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
imageView.setColorFilter(filter); imageView.setColorFilter(filter);
// Проверка первого запуска
SharedPreferences sharedPreferences = getSharedPreferences("app_prefs", MODE_PRIVATE);
boolean isFirstRun = sharedPreferences.getBoolean("isFirstRun", true);
if (isFirstRun) {
// Заполнение базы данных начальными данными
DatabaseInitializer.populateDatabase(db);
// Установка флага, что приложение уже запускалось
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("isFirstRun", false);
editor.apply();
}
// Тестовая фигня что бы показать
Executors.newSingleThreadExecutor().execute(() -> {
try {
FavoriteCityDao favoriteCityDao = db.favoriteCityDao();
CityDao cityDao = db.cityDao();
Log.d("MainActivity", "-------------------------------\nAll users:");
// Получение всех пользователей
List<User> users = userDao.getAllUsers();
for (User user : users) {
Log.d("User", user.getName());
}
if (cityDao.countCity() > 0) {
Log.d("MainActivity", "-------------------------------\nAll city:");
// Получение всех городов
List<City> cities = cityDao.getAllCity();
for (City city : cities) {
Log.d("City", city.getName());
}
}
//
// Log.d("MainActivity", "-------------------------------\nAll fav:");
// // Получение всех связей
// List<FavoriteCity> favoriteCities = favoriteCityDao.getAllFavoriteCity();
// for (FavoriteCity favoriteCity : favoriteCities) {
// Log.d("FavoriteCity", "User: " + favoriteCity.getOwnerId() + ", City: " + favoriteCity.getCityId());
// }
} catch (Exception e) {
Log.e("MainActivity", "Error: " + e.getMessage());
}
});
} }
public void goToAnotherActivity(View view) { public void goToAnotherActivity(View view) {
String[] logins = getResources().getStringArray(R.array.passwords_array); view.setEnabled(false);
for (String login : logins) {
String[] parts = login.split("\\|"); String enteredLogin = emailEditText.getText().toString();
if (parts[0].equals(emailEditText.getText().toString()) && parts[1].equals(passwordEditText.getText().toString())) { String enteredPassword = passwordEditText.getText().toString();
startActivity(new Intent(this, MainActivity2.class));
Executors.newSingleThreadExecutor().execute(() -> {
try {
String password = userDao.getPasswordByName(enteredLogin);
runOnUiThread(() -> {
if (enteredPassword.equals(password)) {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
intent.putExtra("userName", enteredLogin);
startActivity(intent);
} else { } else {
emailEditText.setTextColor(Color.RED); emailEditText.setTextColor(Color.RED);
passwordEditText.setTextColor(Color.RED); passwordEditText.setTextColor(Color.RED);
} }
} });
} catch (Exception e) {
Log.e("MainActivity", "Error: " + e.getMessage());
runOnUiThread(() -> {
emailEditText.setTextColor(Color.RED);
passwordEditText.setTextColor(Color.RED);
});
}
});
view.setEnabled(true);
// String[] logins = getResources().getStringArray(R.array.passwords_array);
//
// for (String login : logins) {
// String[] parts = login.split("\\|");
// if (parts[0].equals(emailEditText.getText().toString()) && parts[1].equals(passwordEditText.getText().toString())) {
// startActivity(new Intent(this, MainActivity2.class));
// } else {
// emailEditText.setTextColor(Color.RED);
// passwordEditText.setTextColor(Color.RED);
// }
// }
} }
} }

View File

@ -1,10 +1,11 @@
package com.example.myapplication; package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.view.Menu; import android.view.Menu;
import com.example.myapplication.ui.home.HomeFragment; import com.example.myapplication.DTO.WeatherData;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView; import com.google.android.material.navigation.NavigationView;
@ -23,6 +24,12 @@ public class MainActivity2 extends AppCompatActivity {
private ActivityMain2Binding binding; private ActivityMain2Binding binding;
private WeatherData CurrentCity = new WeatherData("Город ещё не выбран","", "", "", ""); private WeatherData CurrentCity = new WeatherData("Город ещё не выбран","", "", "", "");
private String userName = "";
public String getUserName() {
return userName;
}
public WeatherData getCurrentCity() { public WeatherData getCurrentCity() {
return CurrentCity; return CurrentCity;
} }
@ -34,6 +41,9 @@ public class MainActivity2 extends AppCompatActivity {
binding = ActivityMain2Binding.inflate(getLayoutInflater()); binding = ActivityMain2Binding.inflate(getLayoutInflater());
setContentView(binding.getRoot()); setContentView(binding.getRoot());
Intent intent = getIntent();
userName = intent.getStringExtra("userName");
setSupportActionBar(binding.appBarMain.toolbar); setSupportActionBar(binding.appBarMain.toolbar);
binding.appBarMain.fab.setOnClickListener(new View.OnClickListener() { binding.appBarMain.fab.setOnClickListener(new View.OnClickListener() {
@Override @Override

View File

@ -12,7 +12,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.example.myapplication.MainActivity2; import com.example.myapplication.MainActivity2;
import com.example.myapplication.R; import com.example.myapplication.R;
import com.example.myapplication.WeatherData; import com.example.myapplication.DTO.WeatherData;
import com.example.myapplication.databinding.FragmentGalleryBinding; import com.example.myapplication.databinding.FragmentGalleryBinding;
public class GalleryFragment extends Fragment { public class GalleryFragment extends Fragment {

View File

@ -1,36 +1,37 @@
package com.example.myapplication.ui.home; package com.example.myapplication.ui.home;
import android.app.AlertDialog;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SortedList;
import com.example.myapplication.AppDatabase;
import com.example.myapplication.CustomAdapter; 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.MainActivity2;
import com.example.myapplication.R; import com.example.myapplication.R;
import com.example.myapplication.RecyclerItemClickListener; import com.example.myapplication.RecyclerItemClickListener;
import com.example.myapplication.WeatherData; import com.example.myapplication.DTO.WeatherData;
import com.example.myapplication.databinding.FragmentHomeBinding; import com.example.myapplication.databinding.FragmentHomeBinding;
import com.example.myapplication.ui.gallery.GalleryFragment;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import java.io.Console;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.concurrent.Executors;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -44,6 +45,9 @@ public class HomeFragment extends Fragment {
private FragmentHomeBinding binding; private FragmentHomeBinding binding;
private WeatherService service; private WeatherService service;
private ArrayList<WeatherData> weatherDataList = new ArrayList<>(); private ArrayList<WeatherData> weatherDataList = new ArrayList<>();
private List<City> cityList = new ArrayList<City>();
private RecyclerView recyclerView;
public View onCreateView(@NonNull LayoutInflater inflater, public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) { ViewGroup container, Bundle savedInstanceState) {
@ -53,16 +57,7 @@ public class HomeFragment extends Fragment {
binding = FragmentHomeBinding.inflate(inflater, container, false); binding = FragmentHomeBinding.inflate(inflater, container, false);
View root = binding.getRoot(); View root = binding.getRoot();
Retrofit retrofit = new Retrofit.Builder() recyclerView = root.findViewById(R.id.suslik);
.baseUrl("https://raw.githubusercontent.com/Lpirskaya/JsonLab/refs/heads/master/")
.addConverterFactory(GsonConverterFactory.create())
.build();
service = retrofit.create(WeatherService.class);
// String[] city_list = getResources().getStringArray(R.array.city_list);
// Arrays.sort(city_list);
RecyclerView recyclerView = root.findViewById(R.id.suslik);
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(root.getContext(), recyclerView ,new RecyclerItemClickListener.OnItemClickListener() { recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(root.getContext(), recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) { @Override public void onItemClick(View view, int position) {
Log.e("HomeFragment", "onClick: " + weatherDataList.get(position).City); Log.e("HomeFragment", "onClick: " + weatherDataList.get(position).City);
@ -73,16 +68,70 @@ public class HomeFragment extends Fragment {
@Override @Override
public void onLongItemClick(View view, int position) { public void onLongItemClick(View view, int position) {
String selectedCity = weatherDataList.get(position).City;
showDialog(selectedCity);
} }
})); }));
recyclerView.setLayoutManager(new LinearLayoutManager(root.getContext())); recyclerView.setLayoutManager(new LinearLayoutManager(root.getContext()));
CustomAdapter adapter = new CustomAdapter(weatherDataList); CustomAdapter adapter = new CustomAdapter(cityList);
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://raw.githubusercontent.com/Lpirskaya/JsonLab/refs/heads/master/")
.addConverterFactory(GsonConverterFactory.create())
.build();
service = retrofit.create(WeatherService.class);
return root; 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();
AppDatabase db = AppDatabase.getDatabase(getContext());
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) {
getActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), city + " уже в избранном", Toast.LENGTH_SHORT).show();
});
return;
}
favoriteCityDao.insert(new FavoriteCity(userObj.getId(), cityObj.getId()));
getActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), city + " добавлен в избранное", Toast.LENGTH_SHORT).show();
});
} else {
Log.e("HomeFragment", "User or city not found");
}
// Вывод всех связей
List<FavoriteCity> favoriteCities = favoriteCityDao.getAllFavoriteCity();
for (FavoriteCity favoriteCity : favoriteCities) {
Log.d("FavoriteCity", "User: " + favoriteCity.getOwnerId() + ", City: " + favoriteCity.getCityId());
}
});
} else {
Log.e("HomeFragment", "Ошибка получения контекста");
}
})
.setNegativeButton("Отмена", null)
.show();
}
public interface WeatherService { public interface WeatherService {
@GET("Weather2022.json") @GET("Weather2022.json")
Call<JsonArray> getWeather2022(); Call<JsonArray> getWeather2022();
@ -115,6 +164,7 @@ public class HomeFragment extends Fragment {
)); ));
weatherDataList.sort((o1, o2) -> o1.City.compareTo(o2.City)); weatherDataList.sort((o1, o2) -> o1.City.compareTo(o2.City));
// JsonObject item = weatherData.get(i).getAsJsonObject(); // JsonObject item = weatherData.get(i).getAsJsonObject();
// Log.i("HomeFragment", "City: " + item.get("City").getAsString()); // Log.i("HomeFragment", "City: " + item.get("City").getAsString());
// Log.i("HomeFragment", "Temperature: " + item.get("Temperature").getAsInt()); // Log.i("HomeFragment", "Temperature: " + item.get("Temperature").getAsInt());
@ -123,6 +173,21 @@ public class HomeFragment extends Fragment {
// Log.i("HomeFragment", "Wind: " + item.get("Wind").getAsString()); // Log.i("HomeFragment", "Wind: " + item.get("Wind").getAsString());
// Log.i("HomeFragment", "-------------------"); // Log.i("HomeFragment", "-------------------");
} }
AppDatabase db = AppDatabase.getDatabase(getContext());
CityDao cityDao = db.cityDao();
Executors.newSingleThreadExecutor().execute(() -> {
if (cityDao.countCity() == 0) {
for (WeatherData wd : weatherDataList) {
Log.i("HomeFragment", "Inserting city: " + wd.City);
cityDao.insert(new City(wd.City));
}
}
cityList = cityDao.getAllCity();
getActivity().runOnUiThread(() -> {
recyclerView.setAdapter(new CustomAdapter(cityList));
});
});
} else } else
Log.e("HomeFragment", "Request failed: " + response.message()); Log.e("HomeFragment", "Request failed: " + response.message());
} }

View File

@ -34,8 +34,10 @@
android:layout_marginBottom="10sp" android:layout_marginBottom="10sp"
android:hint="@string/e_mail" android:hint="@string/e_mail"
android:inputType="textEmailAddress" android:inputType="textEmailAddress"
android:text="Alice"
android:textAlignment="center" android:textAlignment="center"
tools:ignore="Autofill" /> tools:ignore="Autofill"
tools:text="Alice" />
<EditText <EditText
android:id="@+id/editTextTextPassword" android:id="@+id/editTextTextPassword"
@ -45,7 +47,8 @@
android:inputType="textPassword" android:inputType="textPassword"
android:minHeight="48dp" android:minHeight="48dp"
android:textAlignment="center" android:textAlignment="center"
tools:ignore="Autofill" /> tools:ignore="Autofill"
tools:text="kek123" />
</LinearLayout> </LinearLayout>

View File

@ -1,5 +1,5 @@
[versions] [versions]
agp = "8.6.0" agp = "8.7.2"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.2.1" junitVersion = "1.2.1"
espressoCore = "3.6.1" espressoCore = "3.6.1"
@ -12,6 +12,8 @@ lifecycleViewmodelKtx = "2.8.5"
navigationFragment = "2.6.0" navigationFragment = "2.6.0"
navigationUi = "2.6.0" navigationUi = "2.6.0"
retrofitVersion = "2.9.0" retrofitVersion = "2.9.0"
roomRuntime = "2.6.1"
roomCompiler = "2.6.1"
[libraries] [libraries]
converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofitVersion" } converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofitVersion" }
@ -27,6 +29,8 @@ lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-view
navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigationFragment" } navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigationFragment" }
navigation-ui = { group = "androidx.navigation", name = "navigation-ui", version.ref = "navigationUi" } navigation-ui = { group = "androidx.navigation", name = "navigation-ui", version.ref = "navigationUi" }
retrofit2-retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofitVersion" } retrofit2-retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofitVersion" }
room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomCompiler" }
room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }

View File

@ -1,6 +1,6 @@
#Fri Sep 20 13:46:49 MSK 2024 #Fri Sep 20 13:46:49 MSK 2024
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists