I'm working on an Android app where users can add and remove restaurants from their favourites via the RestaurantPage activity. When I access the RestaurantPage activity from the UserFavourites activity and attempt to remove the restaurant from my favourites, Firestore successfully updates, removing the restaurant from my favourites in the database. However, when I access a restaurant via the Search activity, I cannot remove the restaurant from my favourites (Firestore isn't updated when the favourite button is clicked). Here is the code for my RestaurantPage activity, UserFavourites activity, Search activity and AppManager class. I'm new to Android developing so any help would be much appreciated!
RestaurantPage:
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import java.util.ArrayList;
public class RestaurantPage extends AppCompatActivity {
Button favourited;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.menu_restaurantpage);
favourited = findViewById(R.id.favouriteButton);
Restaurant currRestaurant = AppManager.getCurrentRestaurant();
ArrayList<Restaurant> currFavourites = AppManager.getCurrentUser().getFavourites();
Log.d("CURR USER", AppManager.getCurrentUser().getUsername());
int i = 0;
boolean flag = false;
while (i < currFavourites.size() && !flag){
if (currFavourites.get(i).getName().equals(currRestaurant.getName())){
flag = true;
}
i++;
}
if (flag) {
favourited.setText("Remove from favourites");
}
else {
favourited.setText("Add to favourites");
}
favourited.setOnClickListener((view) -> {
ArrayList<Restaurant> currentFavourites = AppManager.getCurrentUser().getFavourites();
int j = 0;
boolean flag2 = false;
while (j < currentFavourites.size() && !flag2) {
if (currentFavourites.get(j).getName().equals(currRestaurant.getName())) {
flag2 = true;
}
j++;
}
if (flag2) {
AppManager.getCurrentUser().removeFavourite(currRestaurant);
favourited.setText("Add to favourites");
}
else {
AppManager.getCurrentUser().addFavourite(currRestaurant);
favourited.setText("Remove from favourites");
}
AppManager.uploadUser(AppManager.getCurrentUser());
});
}
}
UserFavourites:
public class UserFavourites extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
private FirebaseAuth authenticate;
private ArrayList<User> userList;
private User currentUser;
private SearchView favouritesBar;
private RecyclerView favouritesRecyclerView;
private SearchAdapter searchAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.menu_favourites);
authenticate = FirebaseAuth.getInstance();
favouritesRecyclerView = findViewById(R.id.favourites_list);
favouritesRecyclerView.setItemAnimator(new DefaultItemAnimator());
favouritesRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
currentUser = AppManager.getCurrentUser();
if (currentUser == null){
Log.d( "USER FAIL", "No user found");
startActivity(new Intent(UserFavourites.this, HomeScreen.class));
return;
}
else {
Log.d("USER FOUND", "User found");
}
searchAdapter = new SearchAdapter(currentUser.getFavourites(), UserFavourites.this, new SearchAdapter.ItemClickListener() {
@Override
public void onItemClick(Restaurant restaurant) {
Log.d("NEWPAGE", "User sent to restaurant page for " + restaurant.getName());
AppManager.setCurrentRestaurant(restaurant);
startActivity(new Intent(UserFavourites.this, RestaurantPage.class));
}
});
}
}
Search:
public class Search extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
protected ArrayList<Restaurant> searchList;
protected RecyclerView searchRecyclerView;
SearchAdapter searchAdapter;
private DrawerLayout nav_layout;
private Toolbar nav_toolbar;
private NavigationView nav_view;
private ArrayList<User> userList;
private User currentUser;
private FirebaseAuth authenticate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.menu_searchpage);
nav_layout = findViewById(R.id.nav_layout);
nav_toolbar = findViewById(R.id.nav_toolbar);
nav_view = findViewById(R.id.navigationView);
nav_view.setItemIconTintList(null);
searchRecyclerView = findViewById(R.id.search_list);
searchRecyclerView.setItemAnimator(new DefaultItemAnimator());
searchRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
searchList = AppManager.getRestaurants();
authenticate = FirebaseAuth.getInstance();
currentUser = AppManager.getCurrentUser();
if (currentUser == null){
Log.d( "USER FAIL", "No user found");
startActivity(new Intent(Search.this, HomeScreen.class));
return;
}
else {
Log.d("USER FOUND", "User found");
}
searchAdapter = new SearchAdapter(searchList, Search.this, new SearchAdapter.ItemClickListener() {
@Override
public void onItemClick(Restaurant restaurant) {
Log.d("NEWPAGE", "User sent to restaurant page for " + restaurant.getName());
AppManager.setCurrentRestaurant(restaurant);
startActivity(new Intent(Search.this, RestaurantPage.class));
}
});
}
}
AppManager:
package com.example.csia;
import android.util.Log;
import com.google.firebase.firestore.AggregateQuery;
import com.google.firebase.firestore.AggregateQuerySnapshot;
import com.google.firebase.firestore.AggregateSource;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import java.util.ArrayList;
public class AppManager {
private static int numOfRestaurants;
private static FirebaseFirestore db = FirebaseFirestore.getInstance();
private static ArrayList<User> users = new ArrayList<User>();
protected static ArrayList<Restaurant> restaurants = new ArrayList<Restaurant>();
private static Restaurant currentRestaurant;
private static User currentUser;
public static ArrayList<User> getUsersImmediately(){
return users;
}
public static ArrayList<User> getUsers(){
users.clear();
db.collection("users").get()
.addOnCompleteListener((task) -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
users.add(document.toObject(User.class));
Log.d("USER ADD", "Added user to user list");
}
Log.d("DOWNLOAD DB", "Successfully obtained users");
}
})
.addOnFailureListener((task) -> {
Log.d("DOWNLOAD DB", "Failed to obtain users");
});
return users;
}
public static void downloadRestaurants(){
restaurants.clear();
db.collection("restaurants").get()
.addOnCompleteListener((task) -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
restaurants.add(document.toObject(Restaurant.class));
Log.d("RESTAURANT ADD", "Added restaurant to restaurant list");
}
Log.d("DOWNLOAD DB", "Successfully downloaded restaurants");
}
})
.addOnFailureListener((task) -> {
Log.d("DOWNLOAD DB", "Failed to download restaurants");
});
}
public static void downloadUsers(){
users.clear();
db.collection("users").get()
.addOnCompleteListener((task) -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
users.add(document.toObject(User.class));
Log.d("USER ADD", "Added user to user list");
}
Log.d("DOWNLOAD DB", "Successfully downloaded users");
}
})
.addOnFailureListener((task) -> {
Log.d("DOWNLOAD DB", "Failed to download users");
});
}
public static void uploadUser(User user){
db.collection("users").document(user.getUsername())
.set(user)
.addOnSuccessListener((task) -> {
Log.d("UPLOAD DB", "User " + user.getUsername() + " uploaded to database");
})
.addOnFailureListener((task) ->{
Log.d("UPLOAD DB", "User could not be uploaded");
});
}
public static void uploadRestaurant(Restaurant restaurant){
db.collection("restaurants").document(restaurant.getName())
.set(restaurant)
.addOnSuccessListener((task) -> {
Log.d("UPLOAD DB", "Restaurant " + restaurant.getName() + " uploaded to database");
})
.addOnFailureListener((task) ->{
Log.d("UPLOAD DB", "Restaurant could not be uploaded");
});
}
public static boolean userExists(String username)
{
for (int i = 0; i < users.size(); i++)
{
if (users.get(i).getUsername().equals(username)){
return false;
}
}
return true;
}
public static ArrayList<Restaurant> getRestaurants(){
restaurants.clear();
db.collection("restaurants").get()
.addOnCompleteListener((task) -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
restaurants.add(document.toObject(Restaurant.class));
Log.d("RESTAURANT ADD", "Added restaurant to restaurant list");
}
Log.d("DOWNLOAD DB", "Successfully obtained restaurants");
}
})
.addOnFailureListener((task) -> {
Log.d("DOWNLOAD DB", "Failed to obtain restaurants");
});
return restaurants;
}
public static Restaurant getRestaurant(int i){
return restaurants.get(i);
}
public static Restaurant getCurrentRestaurant() {
return currentRestaurant;
}
public static void setCurrentRestaurant(Restaurant newCurrent) {
currentRestaurant = newCurrent;
}
public static User getCurrentUser() {
return currentUser;
}
public static void setCurrentUser(User currentUser) {
AppManager.currentUser = currentUser;
}
}