/*
* Copyright 2015, 2016 Anael Mobilia
*
* This file is part of NextINpact-Unofficial.
*
* NextINpact-Unofficial 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.
*
* NextINpact-Unofficial 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 NextINpact-Unofficial. If not, see <http://www.gnu.org/licenses/>
*/
package com.pcinpact.datastorage;
import android.content.Context;
import android.util.Log;
import com.pcinpact.R;
import com.pcinpact.items.ArticleItem;
import com.pcinpact.utils.Constantes;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Gestion du cache de l'application
*
* @author Anael
*/
public class CacheManager {
/**
* Nettoie le cache de l'application des articles obsolètes.
*
* @param unContext context application
*/
public static void nettoyerCache(final Context unContext) {
// DEBUG
if (Constantes.DEBUG) {
Log.d("CacheManager", "nettoyerCache()");
}
try {
// Protection du context
Context monContext = unContext.getApplicationContext();
// Connexion à la BDD
DAO monDAO = DAO.getInstance(monContext);
// Nombre d'articles à conserver
int maLimite = Constantes.getOptionInt(monContext, R.string.idOptionNbArticles, R.string.defautOptionNbArticles);
// Chargement de tous les articles de la BDD
ArrayList<ArticleItem> mesArticles = monDAO.chargerArticlesTriParDate(0);
int nbArticles = mesArticles.size();
// Ai-je plus d'articles que ma limite ?
if (nbArticles > maLimite) {
/**
* Nettoyage de la BDD
*/
for (int i = maLimite; i < nbArticles; i++) {
ArticleItem article = mesArticles.get(i);
// DEBUG
if (Constantes.DEBUG) {
Log.w("CacheManager", "nettoyerCache() - suppression de " + article.getTitre());
}
// Suppression en DB
monDAO.supprimerArticle(article);
// Suppression des commentaires de l'article
monDAO.supprimerCommentaire(article.getId());
// Suppression de la date de Refresh des commentaires
monDAO.supprimerDateRefresh(article.getId());
// Suppression en BDD des images en cache
monDAO.cacheSupprimer(article.getId());
}
}
/**
* Nettoyage du FS
*/
// Miniatures articles
nettoyerCacheImages(monContext, Constantes.IMAGE_MINIATURE_ARTICLE, Constantes.PATH_IMAGES_MINIATURES);
// Illustrations des articles
nettoyerCacheImages(monContext, Constantes.IMAGE_CONTENU_ARTICLE, Constantes.PATH_IMAGES_ILLUSTRATIONS);
} catch (Exception e) {
// DEBUG
if (Constantes.DEBUG) {
Log.e("CacheManager", "nettoyerCache()", e);
}
}
}
/**
* Supprime l'ensemble du cache.
*
* @param unContext contexte application
*/
public static void effacerCache(final Context unContext) {
// DEBUG
if (Constantes.DEBUG) {
Log.i("CacheManager", "effacerCache()");
}
try {
// Protection du context
Context monContext = unContext.getApplicationContext();
// Connexion sur la BDD
DAO monDAO = DAO.getInstance(monContext);
/**
* Vidage BDD
*/
monDAO.vider();
/**
* Miniatures d'articles
*/
effacerContenuRepertoire(monContext.getFilesDir() + Constantes.PATH_IMAGES_MINIATURES);
/**
* Illustrations d'articles
*/
effacerContenuRepertoire(monContext.getFilesDir() + Constantes.PATH_IMAGES_ILLUSTRATIONS);
/**
* Smileys
*/
effacerCacheSmiley(monContext);
} catch (Exception e) {
// DEBUG
if (Constantes.DEBUG) {
Log.e("CacheManager", "nettoyerCache()", e);
}
}
}
/**
* Efface les smileys du cache
*
* @param unContext contexte de l'application
*/
public static void effacerCacheSmiley(final Context unContext) {
Context monContext = unContext.getApplicationContext();
effacerContenuRepertoire(monContext.getFilesDir() + Constantes.PATH_IMAGES_SMILEYS);
}
/**
* Efface tous les fichiers d'un répertoire.
*
* @param unPath répertoire
*/
private static void effacerContenuRepertoire(final String unPath) {
File[] mesFichiers = new File(unPath).listFiles();
if (mesFichiers != null) {
for (File unFichier : mesFichiers) {
// Fichier à effacer
unFichier.delete();
}
}
}
/**
* Effacement du cache v < 1.8.0
*
* @param unContext contexte de l'application
*/
public static void effacerCacheV180(final Context unContext) {
// Protection du context
Context monContext = unContext.getApplicationContext();
String[] savedFiles = monContext.fileList();
for (String file : savedFiles) {
// Article à effacer
monContext.deleteFile(file);
}
}
/**
* Liste des miniatures à télécharger car manquantes.
*
* @param unContext context
* @return liste d'URL
*/
public static ArrayList<String> getMiniaturesATelecharger(final Context unContext) {
// Retour
ArrayList<String> monRetour = new ArrayList<>();
Context monContext = unContext.getApplicationContext();
/**
* Miniatures dixit la BDD
*/
// Connexion à la BDD
DAO monDAO = DAO.getInstance(monContext);
// Récupération de la liste
HashMap<String, String> imagesCache = monDAO.cacheListeImages(Constantes.IMAGE_MINIATURE_ARTICLE);
/**
* Miniatures sur le FS
*/
String[] miniaturesFS = new File(monContext.getFilesDir() + Constantes.PATH_IMAGES_MINIATURES).list();
// Ssi j'ai déjà des miniatures...
if (miniaturesFS != null) {
// Pour chaque miniature que j'ai...
for (String uneMiniature : miniaturesFS) {
// Si elle est aussi dans la liste des miniatures à avoir
if (imagesCache.containsKey(uneMiniature)) {
// Je l'efface
imagesCache.remove(uneMiniature);
}
}
}
/**
* Préparation du retour
*/
for (String uneURL : imagesCache.values()) {
monRetour.add(uneURL);
}
return monRetour;
}
/**
* Nettoie le cache d'images
*
* @param unContext context
* @param unType type d'image
* @param pathType path pour ce type d'image (cf Constantes)
*/
private static void nettoyerCacheImages(final Context unContext, final int unType, final String pathType) {
Context monContext = unContext.getApplicationContext();
/**
* Images dixit la BDD
*/
// Connexion à la BDD
DAO monDAO = DAO.getInstance(monContext);
// Récupération de la liste
HashMap<String, String> imagesCache = monDAO.cacheListeImages(unType);
/**
* Images sur le FS
*/
String[] imagesFS = new File(monContext.getFilesDir() + pathType).list();
// Ssi j'ai déjà des images...
if (imagesFS != null) {
// Pour chaque image que j'ai...
for (String uneImage : imagesFS) {
// Si elle n'est pas dans la liste des images à avoir
if (!imagesCache.containsKey(uneImage)) {
// Je l'efface du FS
File monFichier = new File(monContext.getFilesDir() + pathType + uneImage);
if (!monFichier.delete() && Constantes.DEBUG) {
Log.w("CacheManager",
"nettoyerCacheImages() - erreur à la suppression de " + monContext.getFilesDir() + pathType
+ uneImage);
}
}
}
}
}
}