package com.afollestad.silk.caching; import android.content.Context; import android.content.SharedPreferences; import android.util.Log; import java.util.List; /** * @author Aidan Follestad (afollestad) */ class SilkCacheBaseLimiter<Item> { public SilkCacheBaseLimiter(Context context, String name) { mContext = context; mName = name; } private final Context mContext; private final String mName; protected Context getContext() { return mContext; } protected String getName() { return mName; } protected void log(String message) { Log.d("SilkCache-" + getName(), message); } protected SharedPreferences getLimiterPrefs() { return mContext.getSharedPreferences("[silk-cache-limiters]", Context.MODE_PRIVATE); } private SilkCacheLimiter getLimiter() { if (!hasLimiter()) return null; return new SilkCacheLimiter(getLimiterPrefs().getString(mName, null)); } public final boolean hasLimiter() { return getLimiterPrefs().contains(mName); } protected boolean atLimit(List<Item> buffer) { SilkCacheLimiter mLimiter = getLimiter(); return mLimiter != null && buffer.size() > mLimiter.getSizeLimit(); } protected List<Item> performLimit(List<Item> buffer) { SilkCacheLimiter mLimiter = getLimiter(); log("Performing limiting on cache..."); if (mLimiter.getBehavior() == LimiterBehavior.CLEAR) { buffer.clear(); return buffer; } int removed = 0; log("Limiting behavior: " + mLimiter.getBehavior().name()); while (buffer.size() > mLimiter.getSizeLimit()) { removed++; switch (mLimiter.getBehavior()) { case REMOVE_TOP: buffer.remove(0); break; case REMOVE_BOTTOM: buffer.remove(buffer.size() - 1); break; } } log("Removed " + removed + " items for limiting"); return buffer; } }