5-7я лаба
This commit is contained in:
parent
cc39ffdbe0
commit
340b4193de
44
src/app/CitySelectorFragment.java
Normal file
44
src/app/CitySelectorFragment.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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>
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.example.myapplication.DAO;
|
||||||
|
|
||||||
|
import androidx.room.Dao;
|
||||||
|
|
||||||
|
@Dao
|
||||||
|
public class WeatherDao {
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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" }
|
||||||
|
2
src/gradle/wrapper/gradle-wrapper.properties
vendored
2
src/gradle/wrapper/gradle-wrapper.properties
vendored
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user