package org.intermine.app.storage; /* * Copyright (C) 2015 InterMine * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. See the LICENSE file for more * information or http://www.gnu.org/copyleft/lesser.html. * */ import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.util.Log; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.octo.android.robospice.persistence.exception.CacheCreationException; import com.octo.android.robospice.persistence.exception.CacheLoadingException; import com.octo.android.robospice.persistence.exception.CacheSavingException; import com.octo.android.robospice.persistence.file.InFileObjectPersister; import com.octo.android.robospice.persistence.memory.CacheItem; import com.octo.android.robospice.persistence.memory.LruCache; import com.octo.android.robospice.persistence.memory.LruCacheObjectPersister; import com.octo.android.robospice.persistence.springandroid.json.gson.GsonObjectPersister; import org.intermine.app.InterMineApplication; import org.intermine.app.R; import org.intermine.app.core.Gene; import org.intermine.app.util.Strs; import java.lang.reflect.Type; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.inject.Inject; /** * @author Daria Komkova <Daria.Komkova @ hotmail.com> */ public abstract class BaseStorage implements Storage { public static final int DEFAULT_GENE_FAVORITES_CACHE_SIZE = 100; public static final String TAG = BaseStorage.class.getSimpleName(); @Inject SharedPreferences mPreferences; private Context mContext; private Gson mMapper; private Set<String> mDefaultMineNames; private LruCacheObjectPersister<Gene> mGeneFavoritesPersister; public BaseStorage(Context ctx) { InterMineApplication app = InterMineApplication.get(ctx); app.inject(this); mContext = ctx; mMapper = new Gson(); mGeneFavoritesPersister = createGeneFavoritesPersister(); String[] mineNamesArr = ctx.getResources().getStringArray(R.array.mines_names); String[] mineNamesUrls = ctx.getResources().getStringArray(R.array.mines_service_urls); String[] mineNamesWebAppUrls = ctx.getResources().getStringArray(R.array.mines_web_app_urls); mDefaultMineNames = new HashSet<>(Arrays.asList(mineNamesArr)); for (int i = 0; i < mineNamesArr.length; i++) { setMineUrl(mineNamesArr[i], mineNamesUrls[i]); setMineWebAppUrl(mineNamesArr[i], mineNamesWebAppUrls[i]); } } @Override public String getUserToken(String mineName) { return mPreferences.getString(USER_TOKEN_KEY + mineName, Strs.EMPTY_STRING); } @Override public void setUserToken(String mineName, String token) { SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(USER_TOKEN_KEY + mineName, token); editor.commit(); } @Override public Set<String> getMineNames() { return mPreferences.getStringSet(MINE_NAMES_KEY, mDefaultMineNames); } @Override public void setMineNames(Set<String> mineNames) { SharedPreferences.Editor editor = mPreferences.edit(); editor.putStringSet(MINE_NAMES_KEY, new HashSet<>(mineNames)); editor.commit(); } @Override public Set<String> getSelectedMineNames() { return mPreferences.getStringSet(SELECTED_MINE_NAMES_KEY, mDefaultMineNames); } @Override public void setSelectedMineNames(Set<String> mineNames) { SharedPreferences.Editor editor = mPreferences.edit(); editor.putStringSet(SELECTED_MINE_NAMES_KEY, new HashSet<>(mineNames)); editor.commit(); } @Override public String getMineUrl(String mine) { return mPreferences.getString(MINE_URL_KEY + mine, Strs.EMPTY_STRING); } @Override public void setMineUrl(String mine, String url) { SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(MINE_URL_KEY + mine, url); editor.commit(); } @Override public String getMineWebAppUrl(String mine) { return mPreferences.getString(MINE_URL_WEB_APP_KEY + mine, Strs.EMPTY_STRING); } @Override public void setMineWebAppUrl(String mine, String url) { SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(MINE_URL_WEB_APP_KEY + mine, url); editor.commit(); } @Override public void setWorkingMineName(String mineName) { SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(WORKING_MINE_NAME_KEY, mineName); editor.commit(); } @Override public String getWorkingMineName() { return mPreferences.getString(WORKING_MINE_NAME_KEY, "FlyMine"); } @Override public void setTypeFields(String mineName, Map<String, List<String>> typeFields) { String json = mMapper.toJson(typeFields); SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(TYPE_FIELDS_KEY + mineName, json); editor.commit(); } @Override public Map<String, List<String>> getTypeFields(String mineName) { String json = mPreferences.getString(TYPE_FIELDS_KEY + mineName, Strs.EMPTY_STRING); if (!json.isEmpty()) { Type type = new TypeToken<Map<String, List<String>>>() { }.getType(); return mMapper.fromJson(json, type); } return java.util.Collections.emptyMap(); } @Override public List<Gene> getGeneFavorites() { if (null != mGeneFavoritesPersister) { try { return mGeneFavoritesPersister.loadAllDataFromCache(); } catch (CacheLoadingException e) { Log.e(TAG, "Failed to load gene favorites from cache!", e); } } return null; } protected Context getContext() { return mContext; } @Override public void addGeneToFavorites(Gene gene) { if (null != mGeneFavoritesPersister) { try { mGeneFavoritesPersister.saveDataToCacheAndReturnData(gene, gene.generateCacheKey()); } catch (CacheSavingException e) { Log.e(TAG, String.format("Failed to save %s favorites to cache!", gene), e); } } } private LruCacheObjectPersister<Gene> createGeneFavoritesPersister() { LruCache<Object, CacheItem<Gene>> geneCache = new LruCache<>(DEFAULT_GENE_FAVORITES_CACHE_SIZE); try { InFileObjectPersister<Gene> inFilePersister = new GsonObjectPersister((Application) mContext, Gene.class); LruCacheObjectPersister<Gene> persister = new LruCacheObjectPersister<>(inFilePersister, geneCache); persister.setAsyncSaveEnabled(true); return persister; } catch (CacheCreationException e) { Log.e(TAG, "Failed to create gene favorites persister!", e); } return null; } }