/** * Copyright (C) 2013 Romain Guefveneu. * * This file is part of naonedbus. * * Naonedbus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Naonedbus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.naonedbus.manager.impl; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.naonedbus.bean.Arret; import net.naonedbus.bean.Favori; import net.naonedbus.bean.Groupe; import net.naonedbus.manager.SQLiteManager; import net.naonedbus.provider.impl.FavoriProvider; import net.naonedbus.provider.impl.GroupeProvider; import net.naonedbus.provider.table.EquipementTable; import net.naonedbus.provider.table.FavoriTable; import net.naonedbus.provider.table.LigneTable; import net.naonedbus.provider.table.SensTable; import net.naonedbus.rest.container.FavoriContainer; import net.naonedbus.rest.controller.impl.FavoriController; import org.json.JSONException; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.util.SparseIntArray; import com.google.gson.JsonParseException; public class FavoriManager extends SQLiteManager<Favori> { private final List<OnFavoriActionListener> mListeners = new ArrayList<OnFavoriActionListener>(); private boolean mIsImporting = false; private String mRestoredFavoris; public static abstract class OnFavoriActionListener { public void onImport() { }; public void onAdd(final Arret item) { }; public void onRemove(final int id) { }; public void onUpdate() { }; } private static FavoriManager instance; private final Favori.Builder mBuilder; public static synchronized FavoriManager getInstance() { if (instance == null) { instance = new FavoriManager(); } return instance; } protected FavoriManager() { super(FavoriProvider.CONTENT_URI); mBuilder = new Favori.Builder(); } /** * @param contentResolver * @return les favoris avec les données sur la ligne et le sens */ public List<Favori> getFull(final ContentResolver contentResolver) { final Uri.Builder builder = FavoriProvider.CONTENT_URI.buildUpon(); builder.path(FavoriProvider.FAVORIS_FULL_URI_PATH_QUERY); return getFromCursorFull(contentResolver.query(builder.build(), null, null, null, null)); } /** * Transformer un curseur en liste d'éléments * * @param c * un Curseur * @return une liste d'éléments */ protected List<Favori> getFromCursorFull(final Cursor c) { final List<Favori> items = new ArrayList<Favori>(); if (c.getCount() > 0) { c.moveToFirst(); while (!c.isAfterLast()) { items.add(getSingleFromCursorFull(c)); c.moveToNext(); } } c.close(); return items; } public Favori getSingleFromCursorFull(final Cursor c) { mBuilder.setId(c.getInt(c.getColumnIndex(FavoriTable._ID))); mBuilder.setCodeLigne(c.getString(c.getColumnIndex(FavoriTable.CODE_LIGNE))); mBuilder.setCodeSens(c.getString(c.getColumnIndex(FavoriTable.CODE_SENS))); mBuilder.setCodeArret(c.getString(c.getColumnIndex(FavoriTable.CODE_ARRET))); mBuilder.setNomFavori(c.getString(c.getColumnIndex(FavoriTable.NOM))); mBuilder.setNomArret(c.getString(c.getColumnIndex(EquipementTable.NOM))); final int couleurBackground = c.getInt(c.getColumnIndex(LigneTable.COULEUR_BACK)); final int couleurFront = c.getInt(c.getColumnIndex(LigneTable.COULEUR_FRONT)); mBuilder.setCouleurBackground(couleurBackground); mBuilder.setCouleurTexte(couleurFront); mBuilder.setNomSens(c.getString(c.getColumnIndex(SensTable.NOM))); mBuilder.setLettre(c.getString(c.getColumnIndex(LigneTable.LETTRE))); return mBuilder.build(); } @Override public Favori getSingleFromCursor(final Cursor c) { mBuilder.setId(c.getInt(c.getColumnIndex(FavoriTable._ID))); mBuilder.setCodeLigne(c.getString(c.getColumnIndex(FavoriTable.CODE_LIGNE))); mBuilder.setCodeSens(c.getString(c.getColumnIndex(FavoriTable.CODE_SENS))); mBuilder.setCodeArret(c.getString(c.getColumnIndex(FavoriTable.CODE_ARRET))); mBuilder.setNomArret(c.getString(c.getColumnIndex(FavoriTable.NOM))); mBuilder.setNomFavori(null); mBuilder.setCouleurBackground(0); mBuilder.setCouleurTexte(0); mBuilder.setNomSens(null); mBuilder.setLettre(null); return mBuilder.build(); } public void addFavori(final ContentResolver contentResolver, final Arret item) { final ContentValues values = getContentValues(item); contentResolver.insert(FavoriProvider.CONTENT_URI, values); if (mIsImporting == false) notifyOnAdd(item); } public void addFavori(final ContentResolver contentResolver, final Favori item) { final ContentValues values = getContentValues(item); contentResolver.insert(FavoriProvider.CONTENT_URI, values); if (mIsImporting == false) notifyOnAdd(item); } public void addFavori(final SQLiteDatabase db, final Favori item) { final ContentValues values = getContentValues(item); db.insert(FavoriTable.TABLE_NAME, null, values); if (mIsImporting == false) notifyOnAdd(item); } public void removeFavori(final ContentResolver contentResolver, final int id) { contentResolver.delete(FavoriProvider.CONTENT_URI, FavoriTable._ID + "=?", new String[] { String.valueOf(id) }); if (mIsImporting == false) notifyOnRemove(id); } public void setFavori(final ContentResolver contentResolver, final Favori item) { final ContentValues values = getContentValues(item); contentResolver.update(FavoriProvider.CONTENT_URI, values, FavoriTable._ID + "=?", new String[] { String.valueOf(item.getId()) }); } public boolean isFavori(final ContentResolver contentResolver, final int arretId) { return getSingle(contentResolver, arretId) != null; } @Override protected ContentValues getContentValues(final Favori item) { final ContentValues values = new ContentValues(); values.put(FavoriTable._ID, item.getId()); values.put(FavoriTable.CODE_LIGNE, item.getCodeLigne()); values.put(FavoriTable.CODE_SENS, item.getCodeSens()); values.put(FavoriTable.CODE_ARRET, item.getCodeArret()); values.put(FavoriTable.NOM, item.getNomFavori()); return values; } /** * getContentValues for ArretItem * * @param item * @return a ContentValue filled with ArretItem values, for a FavoriTable * structure */ private ContentValues getContentValues(final Arret item) { final ContentValues values = new ContentValues(); values.put(FavoriTable._ID, item.getId()); values.put(FavoriTable.CODE_LIGNE, item.getCodeLigne()); values.put(FavoriTable.CODE_SENS, item.getCodeSens()); values.put(FavoriTable.CODE_ARRET, item.getCodeArret()); return values; } /** * Renvoyer la liste des favoris au format Json. * * @return la liste des favoris au format Json */ public String toJson(final ContentResolver contentResolver) { final GroupeManager groupeManager = GroupeManager.getInstance(); final List<Favori> favoris = getAll(contentResolver, null, null); final List<Groupe> groupes = groupeManager.getAll(contentResolver); final FavoriContainer container = new FavoriContainer(); for (final Groupe groupe : groupes) { container.addGroupe(groupe.getId(), groupe.getNom(), groupe.getOrdre()); } for (final Favori favori : favoris) { final List<Groupe> favoriGroupes = groupeManager.getAll(contentResolver, favori.getId()); final List<Integer> idGroupes = new ArrayList<Integer>(); for (final Groupe groupe : favoriGroupes) { idGroupes.add(groupe.getId()); } container.addFavori(favori.getCodeLigne(), favori.getCodeSens(), favori.getCodeArret(), favori.getNomFavori(), idGroupes); } final FavoriController controller = new FavoriController(); return controller.toJson(container); } /** * Remplacer les favoris par ceux fournis en Json * * @param contentResolver * @param json * @throws JSONException */ public void fromJson(final ContentResolver contentResolver, final String json) throws JSONException { final FavoriController controller = new FavoriController(); final FavoriContainer favoris = controller.parseJsonObject(json); fromList(contentResolver, favoris); } /** * Remplacer les favoris par ceux de la liste * * @param contentResolver * @param container */ private void fromList(final ContentResolver contentResolver, final FavoriContainer container) { final ArretManager arretManager = ArretManager.getInstance(); final GroupeManager groupeManager = GroupeManager.getInstance(); final SparseIntArray groupeMapping = new SparseIntArray(); // Delete old items contentResolver.delete(FavoriProvider.CONTENT_URI, null, null); contentResolver.delete(GroupeProvider.CONTENT_URI, null, null); // Add new items for (final net.naonedbus.rest.container.FavoriContainer.Groupe g : container.groupes) { final Groupe groupe = new Groupe(); groupe.setNom(g.nom); groupe.setOrdre(g.ordre); final int idLocal = groupeManager.add(contentResolver, groupe).intValue(); groupeMapping.put(g.id, idLocal); } Integer itemId; final Favori.Builder builder = new Favori.Builder(); for (final net.naonedbus.rest.container.FavoriContainer.Favori f : container.favoris) { builder.setCodeArret(f.codeArret); builder.setCodeSens(f.codeSens); builder.setCodeLigne(f.codeLigne); builder.setNomFavori(f.nomFavori); itemId = arretManager.getIdByFavori(contentResolver, builder.build()); if (itemId != null) { builder.setId(itemId); addFavori(contentResolver, builder.build()); // Associer aux groupes final List<Integer> favoriGroupes = f.idGroupes; if (favoriGroupes != null) for (final Integer idGroupe : favoriGroupes) { if (groupeMapping.indexOfKey(idGroupe) > -1) { groupeManager.addFavoriToGroup(contentResolver, groupeMapping.get(idGroupe), itemId); } } } } } /** * Importer les favoris depuis le cloud * * @throws IOException * @throws JSONException * @throws JsonMappingException * @throws JsonParseException */ public void importFavoris(final ContentResolver contentResolver, final String id) throws IOException, JSONException { final FavoriController controller = new FavoriController(); final FavoriContainer favoris = controller.get(id); mIsImporting = true; fromList(contentResolver, favoris); mIsImporting = false; notifyOnImport(); } public void addActionListener(final OnFavoriActionListener l) { mListeners.add(l); } public void removeActionListener(final OnFavoriActionListener l) { mListeners.remove(l); } public void setRestoredFavoris(final String values) { mRestoredFavoris = values; } public String getRestoredFavoris() { return mRestoredFavoris; } private void notifyOnAdd(final Arret item) { for (final OnFavoriActionListener l : mListeners) { l.onAdd(item); l.onUpdate(); } } private void notifyOnRemove(final int id) { for (final OnFavoriActionListener l : mListeners) { l.onRemove(id); l.onUpdate(); } } private void notifyOnImport() { for (final OnFavoriActionListener l : mListeners) { l.onImport(); l.onUpdate(); } } }