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.FormattedTemperature;
import com.example.airquality.types.Weather3h;
import com.example.airquality.utils.PreferencesManager;
import com.example.airquality.utils.ToolbarCompatActivity;
import com.example.airquality.utils.helpers.PreferencesManager;
import com.example.airquality.utils.base.ToolbarCompatActivity;
public class DetailsActivity extends ToolbarCompatActivity {
@ -23,45 +23,64 @@ public class DetailsActivity extends ToolbarCompatActivity {
private Weather3h weather3h;
private City city;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityDetailsBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
setContentView(binding.getRoot());
Intent intent = getIntent();
weather3h = (Weather3h) intent.getSerializableExtra("WEATHER_3H");
city = (City) intent.getSerializableExtra("CITY");
initToolbar();
setToolbarTitle(weather3h.getDateTime());
updateData();
loadIntentData();
setupToolbar();
displayWeatherData();
}
protected void updateData() {
FormattedTemperature formattedTemperature = weather3h.formattedTemp(this);
private void loadIntentData() {
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)
.load(weather3h.getIconUrl())
.into(binding.icon);
binding.iconCode.setText("");
}
else
{
} else {
binding.icon.setImageDrawable(null);
binding.iconCode.setText(weather3h.getIconCode());
}
}
private void bindWeatherDetails(FormattedTemperature temp) {
binding.cityText.setText(city.toString());
binding.datetimeText.setText(weather3h.getDateTime());
binding.tempWeatherText.setText(formattedTemperature.tempText + " | " + weather3h.getDescription());
binding.tempText.setText(formattedTemperature.tempMinText + " ~ " + formattedTemperature.tempMaxText);
binding.tempWeatherText.setText(temp.tempText + " | " + weather3h.getDescription());
binding.tempText.setText(temp.tempMinText + " ~ " + temp.tempMaxText);
binding.pressureText.setText(weather3h.getPressure() + " hPa");
binding.humidityText.setText(weather3h.getHumidity() + "%");
binding.windSpeedText.setText(weather3h.getWindSpeed() + " m/s");
@ -69,41 +88,34 @@ public class DetailsActivity extends ToolbarCompatActivity {
@Override
protected void onRefreshOptionToolbar() {
if(!checkInternet()) {
Toast.makeText(this, "You can't load data from internet on offline mode", Toast.LENGTH_SHORT).show();
if (!hasNetworkConnection()) {
Toast.makeText(this, "Offline mode: can't update data", Toast.LENGTH_SHORT).show();
return;
}
String units = PreferencesManager.getUnits(this);
RequestQueue queue = Volley.newRequestQueue(this);
final String units = PreferencesManager.getUnits(this);
final RequestQueue queue = Volley.newRequestQueue(this);
ForecastAPIRequest forecastAPI = new ForecastAPIRequest(this, city, units) {
ForecastAPIRequest forecastRequest = new ForecastAPIRequest(this, city, units) {
@Override
public void onSuccess(Weather3h[] weatherList) {
boolean isFound = false;
for (Weather3h w : weatherList) {
if (w.getDateTime().equals(weather3h.getDateTime())) {
// Update to new data
weather3h = w;
isFound = true;
break;
for (Weather3h item : weatherList) {
if (item.getDateTime().equals(weather3h.getDateTime())) {
weather3h = item;
Toast.makeText(DetailsActivity.this, "Weather updated", Toast.LENGTH_SHORT).show();
displayWeatherData();
return;
}
}
if(isFound) {
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();
}
Toast.makeText(DetailsActivity.this, "This time is no longer available", Toast.LENGTH_SHORT).show();
}
@Override
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 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 com.example.airquality.databinding.ActivityFavoritesBinding;
import com.example.airquality.types.City;
import com.example.airquality.utils.BaseCompatActivity;
import com.example.airquality.utils.CityAdapter;
import com.example.airquality.utils.DatabaseHelper;
import com.example.airquality.utils.PreferencesManager;
import com.example.airquality.utils.Weather3hAdapter;
import com.example.airquality.utils.base.BaseCompatActivity;
import com.example.airquality.utils.hooks.CityAdapter;
import com.example.airquality.utils.helpers.DatabaseManager;
import com.example.airquality.utils.helpers.PreferencesManager;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class FavoritesActivity extends BaseCompatActivity {
private ActivityFavoritesBinding binding;
private CityAdapter cityAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -33,65 +32,63 @@ public class FavoritesActivity extends BaseCompatActivity {
EdgeToEdge.enable(this);
binding = ActivityFavoritesBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
setContentView(binding.getRoot());
setupRecyclerView();
setListeners();
}
private void setupRecyclerView() {
binding.cityFavoriteList.setLayoutManager(new LinearLayoutManager(this));
}
public void onSearchActivityBtn(View view) {
Intent intent = new Intent(this, SearchCityActivity.class);
startActivity(intent);
private void setListeners() {
binding.newCityBtn.setOnClickListener(v -> openSearchActivity());
}
private void openSearchActivity() {
startActivity(new Intent(this, SearchCityActivity.class));
}
@Override
protected void onResume() {
super.onResume();
loadFavoriteList();
}
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;
refreshFavoritesList();
}
private void setEnteredDateTime(City city) {
DatabaseHelper dbHelper = new DatabaseHelper(this);
private void refreshFavoritesList() {
List<City> cities = getStoredCities();
// Get current timestamp, e.g. "2025-07-05 16:45"
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) {
cityAdapter = new CityAdapter(this, cities) {
@Override
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);
setEnteredDateTime(city);
updateLastAccessTime(city);
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.types.City;
import com.example.airquality.types.Weather3h;
import com.example.airquality.utils.DatabaseHelper;
import com.example.airquality.utils.PreferencesManager;
import com.example.airquality.utils.ToolbarCompatActivity;
import com.example.airquality.utils.Weather3hAdapter;
import com.example.airquality.utils.helpers.DatabaseManager;
import com.example.airquality.utils.helpers.PreferencesManager;
import com.example.airquality.utils.base.ToolbarCompatActivity;
import com.example.airquality.utils.hooks.Weather3hAdapter;
import java.util.Arrays;
import java.util.List;
@ -46,7 +46,7 @@ public class MainActivity extends ToolbarCompatActivity {
}
private void saveOffline(Weather3h[] weathers) {
DatabaseHelper dbHelper = new DatabaseHelper(this); // Make sure you have context here
DatabaseManager dbHelper = new DatabaseManager(this);
dbHelper.deleteAllWeather();
@ -60,17 +60,15 @@ public class MainActivity extends ToolbarCompatActivity {
Toast.makeText(this, "Weather data saved successfully!", Toast.LENGTH_SHORT).show();
}
private Weather3h[] loadOffline() {
DatabaseHelper dbHelper = new DatabaseHelper(this);
DatabaseManager dbHelper = new DatabaseManager(this);
List<Weather3h> weatherList = dbHelper.getAllWeather();
Toast.makeText(this, "Loaded " + weatherList.size() + " weather entries", Toast.LENGTH_SHORT).show();
return weatherList.toArray(new Weather3h[0]);
}
@Override
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();
return;
}
@ -93,8 +91,7 @@ public class MainActivity extends ToolbarCompatActivity {
setToolbarTitle(city.toString());
// If no internet
if(!checkInternet()) {
if(!hasNetworkConnection()) {
displayRecycler(loadOffline(), city, days);
Toast.makeText(MainActivity.this, "You are on offline mode", Toast.LENGTH_SHORT).show();
return;

View File

@ -5,10 +5,6 @@ import android.view.View;
import android.widget.Toast;
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 com.android.volley.RequestQueue;
@ -17,17 +13,16 @@ import com.android.volley.toolbox.Volley;
import com.example.airquality.api.CityAPIRequest;
import com.example.airquality.databinding.ActivitySearchCityBinding;
import com.example.airquality.types.City;
import com.example.airquality.utils.BaseCompatActivity;
import com.example.airquality.utils.CityAdapter;
import com.example.airquality.utils.DatabaseHelper;
import com.example.airquality.utils.PreferencesManager;
import com.example.airquality.utils.Weather3hAdapter;
import com.example.airquality.utils.base.BaseCompatActivity;
import com.example.airquality.utils.hooks.CityAdapter;
import com.example.airquality.utils.helpers.DatabaseManager;
import java.util.Arrays;
public class SearchCityActivity extends BaseCompatActivity {
private ActivitySearchCityBinding binding;
private CityAdapter cityAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -37,49 +32,69 @@ public class SearchCityActivity extends BaseCompatActivity {
binding = ActivitySearchCityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setupRecyclerView();
setListeners();
}
private void setupRecyclerView() {
binding.citySearchResult.setLayoutManager(new LinearLayoutManager(this));
}
public void onSearchBtn(View view) {
loadCities();
private void setListeners() {
binding.searchBtn.setOnClickListener(v -> searchCities());
}
private void addToFavorite(City city) {
DatabaseHelper dbHelper = new DatabaseHelper(this);
boolean success = dbHelper.addOneCity(city);
Toast.makeText(this, success ? "City added to favorites!" : "Failed to add city.", Toast.LENGTH_SHORT).show();
}
private void searchCities() {
final String query = binding.searchEditText.getText().toString().trim();
private void loadCities() {
String searchQuery = binding.searchEditText.getText().toString();
// If no internet
if(!checkInternet()) {
Toast.makeText(this, "You are on offline mode", Toast.LENGTH_SHORT).show();
if (query.isEmpty()) {
Toast.makeText(this, "Please enter a city name", Toast.LENGTH_SHORT).show();
return;
}
RequestQueue queue = Volley.newRequestQueue(this);
CityAPIRequest cityAPIRequest = new CityAPIRequest(this, searchQuery) {
if (!hasNetworkConnection()) {
Toast.makeText(this, "You are in offline mode. Online search is unavailable.", Toast.LENGTH_SHORT).show();
return;
}
fetchCitiesFromApi(query);
}
private void fetchCitiesFromApi(String query) {
final RequestQueue queue = Volley.newRequestQueue(this);
CityAPIRequest request = new CityAPIRequest(this, query) {
@Override
public void onSuccess(City[] objectList) {
CityAdapter adapter = new CityAdapter(SearchCityActivity.this, Arrays.asList(objectList), "Add") {
@Override
public void onSelectCity(City city) {
addToFavorite(city);
finish();
}
};
binding.citySearchResult.setAdapter(adapter);
public void onSuccess(City[] cities) {
displaySearchResults(cities);
}
@Override
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;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import com.example.airquality.types.City;
import com.example.airquality.utils.BaseCompatActivity;
import com.example.airquality.utils.PreferencesManager;
import com.example.airquality.utils.base.BaseCompatActivity;
import com.example.airquality.utils.helpers.PreferencesManager;
public class SettingsActivity extends BaseCompatActivity {
Spinner spinnerCity;

View File

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

View File

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

View File

@ -1,19 +1,9 @@
package com.example.airquality.api;
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.toolbox.JsonObjectRequest;
import com.example.airquality.MainActivity;
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> {

View File

@ -2,7 +2,7 @@ package com.example.airquality.types;
import android.content.Context;
import com.example.airquality.utils.PreferencesManager;
import com.example.airquality.utils.helpers.PreferencesManager;
public class FormattedTemperature {
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.net.ConnectivityManager;
@ -8,14 +8,14 @@ import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
public class BaseCompatActivity extends AppCompatActivity {
public boolean checkInternet()
public boolean hasNetworkConnection()
{
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
public void onBackButton(View view)
public void onBack(View view)
{
finish();
}

View File

@ -1,9 +1,8 @@
package com.example.airquality.utils;
package com.example.airquality.utils.base;
import android.content.Intent;
import android.view.MenuInflater;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
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;
@ -13,7 +13,7 @@ import com.example.airquality.types.Weather3h;
import java.util.ArrayList;
import java.util.List;
public class DatabaseHelper extends SQLiteOpenHelper {
public class DatabaseManager extends SQLiteOpenHelper {
//weather info
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_LAST_ENTERED = "lastEnteredAt";
public DatabaseHelper(Context context) {
public DatabaseManager(Context context) {
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) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
@ -150,7 +149,6 @@ public class DatabaseHelper extends SQLiteOpenHelper {
db.close();
}
//functions for favorite cities
public boolean addOneCity(City city) {
SQLiteDatabase db = this.getWritableDatabase();
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.SharedPreferences;

View File

@ -1,4 +1,4 @@
package com.example.airquality.utils;
package com.example.airquality.utils.hooks;
import android.content.Context;
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.Weather3h;
import org.json.JSONArray;
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.Intent;

View File

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

View File

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

View File

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

View File

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