Updated code

This commit is contained in:
Stepan 2025-07-07 12:32:11 +02:00
parent 3c0c9ba2e6
commit 8598bd837e
20 changed files with 193 additions and 195 deletions

View File

@ -14,8 +14,8 @@ import com.example.airquality.databinding.ActivityDetailsBinding;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.types.FormattedTemperature; import com.example.airquality.types.FormattedTemperature;
import com.example.airquality.types.Weather3h; import com.example.airquality.types.Weather3h;
import com.example.airquality.utils.PreferencesManager; import com.example.airquality.utils.helpers.PreferencesManager;
import com.example.airquality.utils.ToolbarCompatActivity; import com.example.airquality.utils.base.ToolbarCompatActivity;
public class DetailsActivity extends ToolbarCompatActivity { public class DetailsActivity extends ToolbarCompatActivity {
@ -23,45 +23,64 @@ public class DetailsActivity extends ToolbarCompatActivity {
private Weather3h weather3h; private Weather3h weather3h;
private City city; private City city;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
binding = ActivityDetailsBinding.inflate(getLayoutInflater()); binding = ActivityDetailsBinding.inflate(getLayoutInflater());
View view = binding.getRoot(); setContentView(binding.getRoot());
setContentView(view);
Intent intent = getIntent(); loadIntentData();
weather3h = (Weather3h) intent.getSerializableExtra("WEATHER_3H"); setupToolbar();
city = (City) intent.getSerializableExtra("CITY"); displayWeatherData();
initToolbar();
setToolbarTitle(weather3h.getDateTime());
updateData();
} }
protected void updateData() { private void loadIntentData() {
FormattedTemperature formattedTemperature = weather3h.formattedTemp(this); Intent intent = getIntent();
if(checkInternet()) if (intent != null) {
{ weather3h = (Weather3h) intent.getSerializableExtra("WEATHER_3H");
city = (City) intent.getSerializableExtra("CITY");
}
if (weather3h == null || city == null) {
Toast.makeText(this, "Missing weather or city data", Toast.LENGTH_LONG).show();
finish();
}
}
private void setupToolbar() {
initToolbar();
if (weather3h != null) {
setToolbarTitle(weather3h.getDateTime());
}
}
private void displayWeatherData() {
if (weather3h == null || city == null) return;
final FormattedTemperature temp = weather3h.formattedTemp(this);
loadWeatherIcon();
bindWeatherDetails(temp);
}
private void loadWeatherIcon() {
if (hasNetworkConnection()) {
Glide.with(this) Glide.with(this)
.load(weather3h.getIconUrl()) .load(weather3h.getIconUrl())
.into(binding.icon); .into(binding.icon);
binding.iconCode.setText(""); binding.iconCode.setText("");
} } else {
else
{
binding.icon.setImageDrawable(null); binding.icon.setImageDrawable(null);
binding.iconCode.setText(weather3h.getIconCode()); binding.iconCode.setText(weather3h.getIconCode());
} }
}
private void bindWeatherDetails(FormattedTemperature temp) {
binding.cityText.setText(city.toString()); binding.cityText.setText(city.toString());
binding.datetimeText.setText(weather3h.getDateTime()); binding.datetimeText.setText(weather3h.getDateTime());
binding.tempWeatherText.setText(formattedTemperature.tempText + " | " + weather3h.getDescription()); binding.tempWeatherText.setText(temp.tempText + " | " + weather3h.getDescription());
binding.tempText.setText(formattedTemperature.tempMinText + " ~ " + formattedTemperature.tempMaxText); binding.tempText.setText(temp.tempMinText + " ~ " + temp.tempMaxText);
binding.pressureText.setText(weather3h.getPressure() + " hPa"); binding.pressureText.setText(weather3h.getPressure() + " hPa");
binding.humidityText.setText(weather3h.getHumidity() + "%"); binding.humidityText.setText(weather3h.getHumidity() + "%");
binding.windSpeedText.setText(weather3h.getWindSpeed() + " m/s"); binding.windSpeedText.setText(weather3h.getWindSpeed() + " m/s");
@ -69,41 +88,34 @@ public class DetailsActivity extends ToolbarCompatActivity {
@Override @Override
protected void onRefreshOptionToolbar() { protected void onRefreshOptionToolbar() {
if(!checkInternet()) { if (!hasNetworkConnection()) {
Toast.makeText(this, "You can't load data from internet on offline mode", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Offline mode: can't update data", Toast.LENGTH_SHORT).show();
return; return;
} }
String units = PreferencesManager.getUnits(this); final String units = PreferencesManager.getUnits(this);
RequestQueue queue = Volley.newRequestQueue(this); final RequestQueue queue = Volley.newRequestQueue(this);
ForecastAPIRequest forecastAPI = new ForecastAPIRequest(this, city, units) { ForecastAPIRequest forecastRequest = new ForecastAPIRequest(this, city, units) {
@Override @Override
public void onSuccess(Weather3h[] weatherList) { public void onSuccess(Weather3h[] weatherList) {
boolean isFound = false; for (Weather3h item : weatherList) {
for (Weather3h w : weatherList) { if (item.getDateTime().equals(weather3h.getDateTime())) {
if (w.getDateTime().equals(weather3h.getDateTime())) { weather3h = item;
// Update to new data Toast.makeText(DetailsActivity.this, "Weather updated", Toast.LENGTH_SHORT).show();
weather3h = w; displayWeatherData();
isFound = true; return;
break;
} }
} }
if(isFound) { Toast.makeText(DetailsActivity.this, "This time is no longer available", Toast.LENGTH_SHORT).show();
Toast.makeText(DetailsActivity.this, "Data was updated!", Toast.LENGTH_SHORT).show();
updateData();
}
else {
Toast.makeText(DetailsActivity.this, "This time is deprecated", Toast.LENGTH_SHORT).show();
}
} }
@Override @Override
public void onError(VolleyError error) { public void onError(VolleyError error) {
Toast.makeText(DetailsActivity.this, "Failed to load weather data", Toast.LENGTH_SHORT).show(); Toast.makeText(DetailsActivity.this, "Error loading weather data", Toast.LENGTH_SHORT).show();
} }
}; };
queue.add(forecastAPI.getRequest()); queue.add(forecastRequest.getRequest());
} }
} }

View File

@ -6,26 +6,25 @@ import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import com.example.airquality.databinding.ActivityFavoritesBinding; import com.example.airquality.databinding.ActivityFavoritesBinding;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.utils.BaseCompatActivity; import com.example.airquality.utils.base.BaseCompatActivity;
import com.example.airquality.utils.CityAdapter; import com.example.airquality.utils.hooks.CityAdapter;
import com.example.airquality.utils.DatabaseHelper; import com.example.airquality.utils.helpers.DatabaseManager;
import com.example.airquality.utils.PreferencesManager; import com.example.airquality.utils.helpers.PreferencesManager;
import com.example.airquality.utils.Weather3hAdapter;
import java.text.SimpleDateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
public class FavoritesActivity extends BaseCompatActivity { public class FavoritesActivity extends BaseCompatActivity {
private ActivityFavoritesBinding binding; private ActivityFavoritesBinding binding;
private CityAdapter cityAdapter;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -33,65 +32,63 @@ public class FavoritesActivity extends BaseCompatActivity {
EdgeToEdge.enable(this); EdgeToEdge.enable(this);
binding = ActivityFavoritesBinding.inflate(getLayoutInflater()); binding = ActivityFavoritesBinding.inflate(getLayoutInflater());
View view = binding.getRoot(); setContentView(binding.getRoot());
setContentView(view);
setupRecyclerView();
setListeners();
}
private void setupRecyclerView() {
binding.cityFavoriteList.setLayoutManager(new LinearLayoutManager(this)); binding.cityFavoriteList.setLayoutManager(new LinearLayoutManager(this));
} }
public void onSearchActivityBtn(View view) {
Intent intent = new Intent(this, SearchCityActivity.class); private void setListeners() {
startActivity(intent); binding.newCityBtn.setOnClickListener(v -> openSearchActivity());
}
private void openSearchActivity() {
startActivity(new Intent(this, SearchCityActivity.class));
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
loadFavoriteList(); refreshFavoritesList();
}
private City[] getFavoriteList()
{
DatabaseHelper dbHelper = new DatabaseHelper(this);
List<City> cityList = dbHelper.getAllCities();
return cityList.toArray(new City[0]);
// City[] cities = new City[] {
// new City("Belgrade", "RS", 44.7866, 20.4489, "2025-07-04 12:30"),
// new City("Novi Sad", "RS", 45.2671, 19.8335, "2025-07-03 09:15"),
// new City("Niš", "RS", 43.3209, 21.8958, "2025-07-02 18:45"),
// new City("Subotica", "RS", 46.1000, 19.6667, "2025-07-01 14:10"),
// new City("Kragujevac", "RS", 44.0128, 20.9110, "2025-06-30 07:50")
// };
//
// return cities;
} }
private void setEnteredDateTime(City city) { private void refreshFavoritesList() {
DatabaseHelper dbHelper = new DatabaseHelper(this); List<City> cities = getStoredCities();
// Get current timestamp, e.g. "2025-07-05 16:45" cityAdapter = new CityAdapter(this, cities) {
String currentTimestamp = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault()).format(new java.util.Date());
boolean success = dbHelper.updateCityLastEnteredAt(city.name, city.country, currentTimestamp);
Toast.makeText(
this,
success ? "Updated last entered time for " + city.name : "Failed to update last entered time for " + city.name,
Toast.LENGTH_SHORT
).show();
}
private void loadFavoriteList() {
List<City> cities = Arrays.asList(getFavoriteList());
CityAdapter adapter = new CityAdapter(this, cities) {
@Override @Override
public void onSelectCity(City city) { public void onSelectCity(City city) {
if (!hasNetworkConnection()) {
Toast.makeText(FavoritesActivity.this, "Offline mode. Please connect to the Internet.", Toast.LENGTH_SHORT).show();
return;
}
PreferencesManager.setCity(FavoritesActivity.this, city); PreferencesManager.setCity(FavoritesActivity.this, city);
setEnteredDateTime(city); updateLastAccessTime(city);
finish(); finish();
} }
}; };
binding.cityFavoriteList.setAdapter(adapter);
binding.cityFavoriteList.setAdapter(cityAdapter);
}
private List<City> getStoredCities() {
DatabaseManager db = new DatabaseManager(this);
return db.getAllCities();
}
private void updateLastAccessTime(City city) {
String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()).format(new Date());
DatabaseManager db = new DatabaseManager(this);
boolean updated = db.updateCityLastEnteredAt(city.name, city.country, timestamp);
if (!updated) {
Toast.makeText(this, "Could not update visit time for " + city.name, Toast.LENGTH_SHORT).show();
}
} }
} }

View File

@ -14,10 +14,10 @@ import com.android.volley.toolbox.Volley;
import com.example.airquality.api.ForecastAPIRequest; import com.example.airquality.api.ForecastAPIRequest;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.types.Weather3h; import com.example.airquality.types.Weather3h;
import com.example.airquality.utils.DatabaseHelper; import com.example.airquality.utils.helpers.DatabaseManager;
import com.example.airquality.utils.PreferencesManager; import com.example.airquality.utils.helpers.PreferencesManager;
import com.example.airquality.utils.ToolbarCompatActivity; import com.example.airquality.utils.base.ToolbarCompatActivity;
import com.example.airquality.utils.Weather3hAdapter; import com.example.airquality.utils.hooks.Weather3hAdapter;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -46,7 +46,7 @@ public class MainActivity extends ToolbarCompatActivity {
} }
private void saveOffline(Weather3h[] weathers) { private void saveOffline(Weather3h[] weathers) {
DatabaseHelper dbHelper = new DatabaseHelper(this); // Make sure you have context here DatabaseManager dbHelper = new DatabaseManager(this);
dbHelper.deleteAllWeather(); dbHelper.deleteAllWeather();
@ -60,17 +60,15 @@ public class MainActivity extends ToolbarCompatActivity {
Toast.makeText(this, "Weather data saved successfully!", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Weather data saved successfully!", Toast.LENGTH_SHORT).show();
} }
private Weather3h[] loadOffline() { private Weather3h[] loadOffline() {
DatabaseHelper dbHelper = new DatabaseHelper(this); DatabaseManager dbHelper = new DatabaseManager(this);
List<Weather3h> weatherList = dbHelper.getAllWeather(); List<Weather3h> weatherList = dbHelper.getAllWeather();
Toast.makeText(this, "Loaded " + weatherList.size() + " weather entries", Toast.LENGTH_SHORT).show();
return weatherList.toArray(new Weather3h[0]); return weatherList.toArray(new Weather3h[0]);
} }
@Override @Override
protected void onRefreshOptionToolbar() { protected void onRefreshOptionToolbar() {
if(!checkInternet()) { if(!hasNetworkConnection()) {
Toast.makeText(MainActivity.this, "You can't load data from internet on offline mode", Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this, "You can't load data from internet on offline mode", Toast.LENGTH_SHORT).show();
return; return;
} }
@ -93,8 +91,7 @@ public class MainActivity extends ToolbarCompatActivity {
setToolbarTitle(city.toString()); setToolbarTitle(city.toString());
// If no internet if(!hasNetworkConnection()) {
if(!checkInternet()) {
displayRecycler(loadOffline(), city, days); displayRecycler(loadOffline(), city, days);
Toast.makeText(MainActivity.this, "You are on offline mode", Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this, "You are on offline mode", Toast.LENGTH_SHORT).show();
return; return;

View File

@ -5,10 +5,6 @@ import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import com.android.volley.RequestQueue; import com.android.volley.RequestQueue;
@ -17,17 +13,16 @@ import com.android.volley.toolbox.Volley;
import com.example.airquality.api.CityAPIRequest; import com.example.airquality.api.CityAPIRequest;
import com.example.airquality.databinding.ActivitySearchCityBinding; import com.example.airquality.databinding.ActivitySearchCityBinding;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.utils.BaseCompatActivity; import com.example.airquality.utils.base.BaseCompatActivity;
import com.example.airquality.utils.CityAdapter; import com.example.airquality.utils.hooks.CityAdapter;
import com.example.airquality.utils.DatabaseHelper; import com.example.airquality.utils.helpers.DatabaseManager;
import com.example.airquality.utils.PreferencesManager;
import com.example.airquality.utils.Weather3hAdapter;
import java.util.Arrays; import java.util.Arrays;
public class SearchCityActivity extends BaseCompatActivity { public class SearchCityActivity extends BaseCompatActivity {
private ActivitySearchCityBinding binding; private ActivitySearchCityBinding binding;
private CityAdapter cityAdapter;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -37,49 +32,69 @@ public class SearchCityActivity extends BaseCompatActivity {
binding = ActivitySearchCityBinding.inflate(getLayoutInflater()); binding = ActivitySearchCityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot()); setContentView(binding.getRoot());
setupRecyclerView();
setListeners();
}
private void setupRecyclerView() {
binding.citySearchResult.setLayoutManager(new LinearLayoutManager(this)); binding.citySearchResult.setLayoutManager(new LinearLayoutManager(this));
} }
public void onSearchBtn(View view) { private void setListeners() {
loadCities(); binding.searchBtn.setOnClickListener(v -> searchCities());
} }
private void addToFavorite(City city) { private void searchCities() {
DatabaseHelper dbHelper = new DatabaseHelper(this); final String query = binding.searchEditText.getText().toString().trim();
boolean success = dbHelper.addOneCity(city);
Toast.makeText(this, success ? "City added to favorites!" : "Failed to add city.", Toast.LENGTH_SHORT).show();
}
private void loadCities() { if (query.isEmpty()) {
String searchQuery = binding.searchEditText.getText().toString(); Toast.makeText(this, "Please enter a city name", Toast.LENGTH_SHORT).show();
// If no internet
if(!checkInternet()) {
Toast.makeText(this, "You are on offline mode", Toast.LENGTH_SHORT).show();
return; return;
} }
RequestQueue queue = Volley.newRequestQueue(this);
CityAPIRequest cityAPIRequest = new CityAPIRequest(this, searchQuery) { if (!hasNetworkConnection()) {
@Override Toast.makeText(this, "You are in offline mode. Online search is unavailable.", Toast.LENGTH_SHORT).show();
public void onSuccess(City[] objectList) { return;
CityAdapter adapter = new CityAdapter(SearchCityActivity.this, Arrays.asList(objectList), "Add") {
@Override
public void onSelectCity(City city) {
addToFavorite(city);
finish();
} }
};
binding.citySearchResult.setAdapter(adapter); fetchCitiesFromApi(query);
}
private void fetchCitiesFromApi(String query) {
final RequestQueue queue = Volley.newRequestQueue(this);
CityAPIRequest request = new CityAPIRequest(this, query) {
@Override
public void onSuccess(City[] cities) {
displaySearchResults(cities);
} }
@Override @Override
public void onError(VolleyError error) { public void onError(VolleyError error) {
Toast.makeText(SearchCityActivity.this, "Failed to load weather data", Toast.LENGTH_SHORT).show(); Toast.makeText(SearchCityActivity.this, "Failed to load city data", Toast.LENGTH_SHORT).show();
} }
}; };
queue.add(cityAPIRequest.getRequest()); queue.add(request.getRequest());
}
private void displaySearchResults(City[] cities) {
cityAdapter = new CityAdapter(this, Arrays.asList(cities), "Add") {
@Override
public void onSelectCity(City city) {
addCityToFavorites(city);
finish();
}
};
binding.citySearchResult.setAdapter(cityAdapter);
}
private void addCityToFavorites(City city) {
DatabaseManager db = new DatabaseManager(this);
boolean success = db.addOneCity(city);
String message = success ? "City added to favorites!" : "Failed to add city.";
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
} }
} }

View File

@ -1,19 +1,16 @@
package com.example.airquality; package com.example.airquality;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.utils.BaseCompatActivity; import com.example.airquality.utils.base.BaseCompatActivity;
import com.example.airquality.utils.PreferencesManager; import com.example.airquality.utils.helpers.PreferencesManager;
public class SettingsActivity extends BaseCompatActivity { public class SettingsActivity extends BaseCompatActivity {
Spinner spinnerCity; Spinner spinnerCity;

View File

@ -7,13 +7,10 @@ import com.android.volley.Request;
import com.android.volley.Response; import com.android.volley.Response;
import com.android.volley.VolleyError; import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest; import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.utils.CityParser; import com.example.airquality.utils.hooks.CityParser;
import com.example.airquality.utils.Weather3hParser;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject;
public class CityAPIRequest extends JsonAPIRequest<City, JsonArrayRequest> { public class CityAPIRequest extends JsonAPIRequest<City, JsonArrayRequest> {

View File

@ -2,7 +2,6 @@ package com.example.airquality.api;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.widget.Toast;
import com.android.volley.Request; import com.android.volley.Request;
import com.android.volley.Response; import com.android.volley.Response;
@ -10,12 +9,10 @@ import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.JsonObjectRequest;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.types.Weather3h; import com.example.airquality.types.Weather3h;
import com.example.airquality.utils.Weather3hParser; import com.example.airquality.utils.hooks.Weather3hParser;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.Arrays;
public class ForecastAPIRequest extends JsonAPIRequest<Weather3h, JsonObjectRequest> { public class ForecastAPIRequest extends JsonAPIRequest<Weather3h, JsonObjectRequest> {
@SuppressLint("DefaultLocale") @SuppressLint("DefaultLocale")

View File

@ -1,19 +1,9 @@
package com.example.airquality.api; package com.example.airquality.api;
import android.content.Context; import android.content.Context;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError; import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.example.airquality.MainActivity;
import com.example.airquality.R; import com.example.airquality.R;
import com.example.airquality.types.Weather3h;
import com.example.airquality.utils.Weather3hAdapter;
import com.example.airquality.utils.Weather3hParser;
import org.json.JSONObject;
public abstract class JsonAPIRequest<T, JR> { public abstract class JsonAPIRequest<T, JR> {

View File

@ -2,7 +2,7 @@ package com.example.airquality.types;
import android.content.Context; import android.content.Context;
import com.example.airquality.utils.PreferencesManager; import com.example.airquality.utils.helpers.PreferencesManager;
public class FormattedTemperature { public class FormattedTemperature {
public String tempText; public String tempText;

View File

@ -1,4 +1,4 @@
package com.example.airquality.utils; package com.example.airquality.utils.base;
import android.content.Context; import android.content.Context;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@ -8,14 +8,14 @@ import android.view.View;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
public class BaseCompatActivity extends AppCompatActivity { public class BaseCompatActivity extends AppCompatActivity {
public boolean checkInternet() public boolean hasNetworkConnection()
{ {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
} }
public void onBackButton(View view) public void onBack(View view)
{ {
finish(); finish();
} }

View File

@ -1,9 +1,8 @@
package com.example.airquality.utils; package com.example.airquality.utils.base;
import android.content.Intent; import android.content.Intent;
import android.view.MenuInflater; import android.view.MenuInflater;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import com.example.airquality.R; import com.example.airquality.R;

View File

@ -1,4 +1,4 @@
package com.example.airquality.utils; package com.example.airquality.utils.helpers;
import android.content.ContentValues; import android.content.ContentValues;
@ -13,7 +13,7 @@ import com.example.airquality.types.Weather3h;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class DatabaseHelper extends SQLiteOpenHelper { public class DatabaseManager extends SQLiteOpenHelper {
//weather info //weather info
public static final String DATABASE_NAME = "weather.db"; public static final String DATABASE_NAME = "weather.db";
@ -42,7 +42,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
public static final String COLUMN_CITY_LONGITUDE = "longitude"; public static final String COLUMN_CITY_LONGITUDE = "longitude";
public static final String COLUMN_CITY_LAST_ENTERED = "lastEnteredAt"; public static final String COLUMN_CITY_LAST_ENTERED = "lastEnteredAt";
public DatabaseHelper(Context context) { public DatabaseManager(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION); super(context, DATABASE_NAME, null, DATABASE_VERSION);
} }
@ -86,7 +86,6 @@ public class DatabaseHelper extends SQLiteOpenHelper {
} }
//functions for weather info
public boolean addOneWeather(Weather3h weather) { public boolean addOneWeather(Weather3h weather) {
SQLiteDatabase db = this.getWritableDatabase(); SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues(); ContentValues cv = new ContentValues();
@ -150,7 +149,6 @@ public class DatabaseHelper extends SQLiteOpenHelper {
db.close(); db.close();
} }
//functions for favorite cities
public boolean addOneCity(City city) { public boolean addOneCity(City city) {
SQLiteDatabase db = this.getWritableDatabase(); SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues(); ContentValues cv = new ContentValues();

View File

@ -1,4 +1,4 @@
package com.example.airquality.utils; package com.example.airquality.utils.helpers;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;

View File

@ -1,4 +1,4 @@
package com.example.airquality.utils; package com.example.airquality.utils.hooks;
import android.content.Context; import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;

View File

@ -1,7 +1,6 @@
package com.example.airquality.utils; package com.example.airquality.utils.hooks;
import com.example.airquality.types.City; import com.example.airquality.types.City;
import com.example.airquality.types.Weather3h;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;

View File

@ -1,4 +1,4 @@
package com.example.airquality.utils; package com.example.airquality.utils.hooks;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;

View File

@ -1,4 +1,4 @@
package com.example.airquality.utils; package com.example.airquality.utils.hooks;
import com.example.airquality.types.Weather3h; import com.example.airquality.types.Weather3h;

View File

@ -21,7 +21,7 @@
<Button <Button
style="@style/BackButton" style="@style/BackButton"
android:onClick="onBackButton" /> android:onClick="onBack" />
<TextView <TextView
style="@style/headerText" style="@style/headerText"
@ -35,19 +35,20 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxWidth="320dp" android:maxWidth="320dp"
android:text="Add new city" android:text="Add new city"
android:layout_marginTop="20dp" android:layout_marginTop="10dp"
android:onClick="onSearchActivityBtn" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout" /> app:layout_constraintTop_toBottomOf="@+id/cityFavoriteList" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/cityFavoriteList" android:id="@+id/cityFavoriteList"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:dividerHeight="1dp" android:dividerHeight="1dp"
app:layout_constraintTop_toBottomOf="@id/newCityBtn" android:layout_marginTop="20dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/linearLayout"
app:layout_constraintBottom_toTopOf="@id/newCityBtn"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/> app:layout_constraintEnd_toEndOf="parent"/>

View File

@ -21,7 +21,7 @@
<Button <Button
style="@style/BackButton" style="@style/BackButton"
android:onClick="onBackButton" /> android:onClick="onBack" />
<TextView <TextView
style="@style/headerText" style="@style/headerText"
@ -53,7 +53,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Search" android:text="Search"
android:onClick="onSearchBtn"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -19,7 +19,7 @@
<Button <Button
style="@style/BackButton" style="@style/BackButton"
android:onClick="onBackButton" android:onClick="onBack"
/> />
<TextView <TextView
style="@style/headerText" style="@style/headerText"