package com.ambergleam.android.photogallery.manager; import android.content.Context; import com.ambergleam.android.photogallery.callbacks.ClearFavoritesCallback; import com.ambergleam.android.photogallery.callbacks.ClearSearchesCallback; import com.ambergleam.android.photogallery.callbacks.LoadFavoritesCallback; import com.ambergleam.android.photogallery.callbacks.LoadSearchesCallback; import com.ambergleam.android.photogallery.model.Favorite; import com.ambergleam.android.photogallery.model.Photo; import com.ambergleam.android.photogallery.model.Search; import com.ambergleam.android.photogallery.util.PreferenceUtils; import com.parse.ParseException; import com.parse.ParseObject; import com.parse.ParseQuery; import javax.inject.Inject; import javax.inject.Singleton; import timber.log.Timber; @Singleton public class DataManager { public static final String GROUP_NAME_SEARCH = "ALL_SEARCHES"; public static final String GROUP_NAME_FAVORITES = "ALL_FAVORITES"; @Inject public DataManager() { } public static void registerParseObjects() { ParseObject.registerSubclass(Search.class); ParseObject.registerSubclass(Favorite.class); } public void clearAppData(Context context) { PreferenceUtils.clear(context); clearSearches(); clearFavorites(); Timber.i("Cleared app data."); } public void saveSearch(String query) { if (query == null || checkSearchQueryExists(query)) { return; } Search search = new Search(); search.setUuidString(); search.setText(query); search.pinInBackground(GROUP_NAME_SEARCH); Timber.i("Saved search."); } public void loadSearches(final LoadSearchesCallback callback) { ParseQuery<Search> query = Search.getQuery(); query.fromLocalDatastore(); query.findInBackground((list, e) -> callback.onSearchesLoaded(list)); Timber.i("Loaded searches."); } public void clearSearches(final ClearSearchesCallback callback) { ParseObject.unpinAllInBackground(GROUP_NAME_SEARCH, e -> { callback.onSearchesCleared(); }); Timber.i("Cleared searches."); } public void clearSearches() { ParseObject.unpinAllInBackground(GROUP_NAME_SEARCH); Timber.i("Cleared searches."); } public boolean checkSearchQueryExists(String text) { ParseQuery<Search> query = Search.getQuery(); query.fromLocalDatastore(); query.whereEqualTo(Search.SEARCH_TEXT, text); try { if (query.getFirst() != null) { return true; } } catch (ParseException e) { Timber.e("Parse Exception."); } return false; } public void addFavorite(Photo photo) { if (photo == null) { Timber.e("Photo is null."); return; } if (isFavorite(photo)) { Timber.e("Photo is already a favorite."); return; } Favorite favorite = new Favorite(); favorite.setUuidString(); favorite.setPhoto(photo); favorite.pinInBackground(GROUP_NAME_FAVORITES); Timber.i("Added photo to favorites."); } public void removeFavorite(Photo photo) { if (photo == null) { Timber.e("Photo is null."); return; } Favorite favorite = getFavorite(photo); if (favorite == null) { Timber.e("Photo not found in favorites."); return; } favorite.unpinInBackground(GROUP_NAME_FAVORITES); Timber.i("Removed photo from favorites."); } public void loadFavorites(final LoadFavoritesCallback callback) { ParseQuery<Favorite> query = Favorite.getQuery(); query.fromLocalDatastore(); query.findInBackground((list, e) -> callback.onFavoritesLoaded(list)); Timber.i("Loaded favorites."); } public void clearFavorites(final ClearFavoritesCallback callback) { ParseObject.unpinAllInBackground(GROUP_NAME_FAVORITES, e -> { callback.onFavoritesCleared(); }); Timber.i("Cleared favorites."); } public void clearFavorites() { ParseObject.unpinAllInBackground(GROUP_NAME_FAVORITES); Timber.i("Cleared favorites."); } public boolean isFavorite(Photo photo) { if (photo == null) { Timber.e("Photo is null."); return false; } ParseQuery<Favorite> query = Favorite.getQuery(); query.fromLocalDatastore(); query.whereEqualTo(Favorite.FAVORITE_PHOTO_ID, photo.getId()); try { if (query.getFirst() != null) { return true; } } catch (ParseException e) { Timber.e("Parse Exception."); } return false; } public Favorite getFavorite(Photo photo) { if (photo == null) { Timber.e("Photo is null."); return null; } ParseQuery<Favorite> query = Favorite.getQuery(); query.fromLocalDatastore(); query.whereEqualTo(Favorite.FAVORITE_PHOTO_ID, photo.getId()); try { return query.getFirst(); } catch (ParseException e) { Timber.e("Parse Exception."); } return null; } }