Remove cache size setting. Add advanced settings section. Other minor changes.

This commit is contained in:
inorichi
2016-01-02 21:09:46 +01:00
parent 77d2e6643a
commit 453a187938
17 changed files with 178 additions and 166 deletions

View File

@ -15,25 +15,25 @@ import java.io.OutputStream;
import java.lang.reflect.Type;
import java.util.List;
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
import eu.kanade.mangafeed.data.source.model.Page;
import eu.kanade.mangafeed.util.DiskUtils;
import okio.BufferedSink;
import okio.Okio;
import rx.Observable;
public class CacheManager {
public class ChapterCache {
private static final String PARAMETER_CACHE_DIRECTORY = "chapter_disk_cache";
private static final int PARAMETER_APP_VERSION = 1;
private static final int PARAMETER_VALUE_COUNT = 1;
private static final int PARAMETER_CACHE_SIZE = 75 * 1024 * 1024;
private Context context;
private Gson gson;
private DiskLruCache diskCache;
public CacheManager(Context context, PreferencesHelper preferences) {
public ChapterCache(Context context) {
this.context = context;
gson = new Gson();
@ -42,7 +42,7 @@ public class CacheManager {
new File(context.getCacheDir(), PARAMETER_CACHE_DIRECTORY),
PARAMETER_APP_VERSION,
PARAMETER_VALUE_COUNT,
preferences.cacheSize() * 1024 * 1024
PARAMETER_CACHE_SIZE
);
} catch (IOException e) {
// Do Nothing.

View File

@ -136,6 +136,16 @@ public class DatabaseHelper {
.prepare();
}
public PreparedDeleteByQuery deleteMangasNotInLibrary() {
return db.delete()
.byQuery(DeleteQuery.builder()
.table(MangaTable.TABLE)
.where(MangaTable.COLUMN_FAVORITE + "=?")
.whereArgs(0)
.build())
.prepare();
}
// Chapters related queries

View File

@ -56,10 +56,6 @@ public class PreferencesHelper {
prefs.edit().clear().apply();
}
public int cacheSize() {
return prefs.getInt(getKey(R.string.pref_chapter_cache_size_key), 75);
}
public Preference<Boolean> lockOrientation() {
return rxPrefs.getBoolean(getKey(R.string.pref_lock_orientation_key), true);
}

View File

@ -16,7 +16,7 @@ import java.util.Map;
import javax.inject.Inject;
import eu.kanade.mangafeed.App;
import eu.kanade.mangafeed.data.cache.CacheManager;
import eu.kanade.mangafeed.data.cache.ChapterCache;
import eu.kanade.mangafeed.data.database.models.Chapter;
import eu.kanade.mangafeed.data.database.models.Manga;
import eu.kanade.mangafeed.data.network.NetworkHelper;
@ -29,7 +29,7 @@ import rx.schedulers.Schedulers;
public abstract class Source extends BaseSource {
@Inject protected NetworkHelper networkService;
@Inject protected CacheManager cacheManager;
@Inject protected ChapterCache chapterCache;
@Inject protected PreferencesHelper prefs;
protected Headers requestHeaders;
protected LazyHeaders glideHeaders;
@ -89,7 +89,7 @@ public abstract class Source extends BaseSource {
}
public Observable<List<Page>> getCachedPageListOrPullFromNetwork(final String chapterUrl) {
return cacheManager.getPageUrlsFromDiskCache(getChapterCacheKey(chapterUrl))
return chapterCache.getPageUrlsFromDiskCache(getChapterCacheKey(chapterUrl))
.onErrorResumeNext(throwable -> {
return pullPageListFromNetwork(chapterUrl);
})
@ -141,13 +141,13 @@ public abstract class Source extends BaseSource {
return pageObservable
.flatMap(p -> {
if (!cacheManager.isImageInCache(page.getImageUrl())) {
if (!chapterCache.isImageInCache(page.getImageUrl())) {
return cacheImage(page);
}
return Observable.just(page);
})
.flatMap(p -> {
page.setImagePath(cacheManager.getImagePath(page.getImageUrl()));
page.setImagePath(chapterCache.getImagePath(page.getImageUrl()));
page.setStatus(Page.READY);
return Observable.just(page);
})
@ -162,7 +162,7 @@ public abstract class Source extends BaseSource {
return getImageProgressResponse(page)
.flatMap(resp -> {
try {
cacheManager.putImageToDiskCache(page.getImageUrl(), resp);
chapterCache.putImageToDiskCache(page.getImageUrl(), resp);
} catch (IOException e) {
return Observable.error(e);
}
@ -176,7 +176,7 @@ public abstract class Source extends BaseSource {
public void savePageList(String chapterUrl, List<Page> pages) {
if (pages != null)
cacheManager.putPageUrlsToDiskCache(getChapterCacheKey(chapterUrl), pages);
chapterCache.putPageUrlsToDiskCache(getChapterCacheKey(chapterUrl), pages);
}
protected List<Page> convertToPages(List<String> pageUrls) {

View File

@ -6,7 +6,7 @@ import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import eu.kanade.mangafeed.data.cache.CacheManager;
import eu.kanade.mangafeed.data.cache.ChapterCache;
import eu.kanade.mangafeed.data.cache.CoverCache;
import eu.kanade.mangafeed.data.mangasync.MangaSyncManager;
import eu.kanade.mangafeed.data.database.DatabaseHelper;
@ -35,8 +35,8 @@ public class DataModule {
@Provides
@Singleton
CacheManager provideCacheManager(Application app, PreferencesHelper preferences) {
return new CacheManager(app, preferences);
ChapterCache provideChapterCache(Application app) {
return new ChapterCache(app);
}
@Provides

View File

@ -87,8 +87,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
readerMenu.show(false);
readerTheme = preferences.getReaderTheme();
if (readerTheme == BLACK_THEME)
setBlackTheme();
applyTheme();
initializeSettings();
@ -265,10 +264,15 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
recreate();
}
private void setBlackTheme() {
getWindow().getDecorView().getRootView().setBackgroundColor(Color.BLACK);
pageNumber.setTextColor(ContextCompat.getColor(this, R.color.light_grey));
pageNumber.setBackgroundColor(ContextCompat.getColor(this, R.color.page_number_background_black));
private void applyTheme() {
View rootView = getWindow().getDecorView().getRootView();
if (readerTheme == BLACK_THEME) {
rootView.setBackgroundColor(Color.BLACK);
pageNumber.setTextColor(ContextCompat.getColor(this, R.color.light_grey));
pageNumber.setBackgroundColor(ContextCompat.getColor(this, R.color.page_number_background_black));
} else {
rootView.setBackgroundColor(Color.WHITE);
}
}
public int getReaderTheme() {

View File

@ -10,14 +10,16 @@ import butterknife.Bind;
import butterknife.ButterKnife;
import eu.kanade.mangafeed.App;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.cache.CacheManager;
import eu.kanade.mangafeed.data.cache.ChapterCache;
import eu.kanade.mangafeed.data.database.DatabaseHelper;
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
import eu.kanade.mangafeed.ui.base.activity.BaseActivity;
public class SettingsActivity extends BaseActivity {
@Inject PreferencesHelper preferences;
@Inject CacheManager cacheManager;
@Inject ChapterCache chapterCache;
@Inject DatabaseHelper db;
@Bind(R.id.toolbar) Toolbar toolbar;
@ -64,9 +66,9 @@ public class SettingsActivity extends BaseActivity {
SettingsAccountsFragment.newInstance(
R.xml.pref_accounts, R.string.pref_category_accounts));
registerSubpreference(R.string.pref_category_cache_key,
SettingsCacheFragment.newInstance(
R.xml.pref_cache, R.string.pref_category_cache));
registerSubpreference(R.string.pref_category_advanced_key,
SettingsAdvancedFragment.newInstance(
R.xml.pref_advanced, R.string.pref_category_advanced));
registerSubpreference(R.string.pref_category_about_key,
SettingsAboutFragment.newInstance(

View File

@ -0,0 +1,109 @@
package eu.kanade.mangafeed.ui.setting;
import android.os.Bundle;
import android.preference.Preference;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.MaterialDialog;
import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.cache.ChapterCache;
import eu.kanade.mangafeed.data.database.DatabaseHelper;
import eu.kanade.mangafeed.util.ToastUtil;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
public class SettingsAdvancedFragment extends SettingsNestedFragment {
private CompositeSubscription subscriptions;
public static SettingsNestedFragment newInstance(int resourcePreference, int resourceTitle) {
SettingsNestedFragment fragment = new SettingsAdvancedFragment();
fragment.setArgs(resourcePreference, resourceTitle);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
View view = super.onCreateView(inflater, container, savedState);
subscriptions = new CompositeSubscription();
Preference clearCache = findPreference(getString(R.string.pref_clear_chapter_cache_key));
clearCache.setOnPreferenceClickListener(preference -> {
clearChapterCache(preference);
return true;
});
clearCache.setSummary(getString(R.string.used_cache, getChapterCache().getReadableSize()));
Preference clearDatabase = findPreference(getString(R.string.pref_clear_database_key));
clearDatabase.setOnPreferenceClickListener(preference -> {
clearDatabase();
return true;
});
return view;
}
@Override
public void onDestroyView() {
subscriptions.unsubscribe();
super.onDestroyView();
}
private void clearChapterCache(Preference preference) {
final ChapterCache chapterCache = getChapterCache();
final AtomicInteger deletedFiles = new AtomicInteger();
File[] files = chapterCache.getCacheDir().listFiles();
MaterialDialog dialog = new MaterialDialog.Builder(getActivity())
.title(R.string.deleting)
.progress(false, files.length, true)
.cancelable(false)
.show();
subscriptions.add(Observable.defer(() -> Observable.from(files))
.concatMap(file -> {
if (chapterCache.remove(file.getName())) {
deletedFiles.incrementAndGet();
}
return Observable.just(file);
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(file -> dialog.incrementProgress(1),
error -> {
dialog.dismiss();
ToastUtil.showShort(getActivity(), getString(R.string.cache_delete_error));
}, () -> {
dialog.dismiss();
ToastUtil.showShort(getActivity(), getString(R.string.cache_deleted, deletedFiles.get()));
preference.setSummary(getString(R.string.used_cache, chapterCache.getReadableSize()));
}));
}
private void clearDatabase() {
final DatabaseHelper db = getSettingsActivity().db;
new MaterialDialog.Builder(getActivity())
.content(R.string.clear_database_confirmation)
.positiveText(R.string.button_yes)
.negativeText(R.string.button_no)
.onPositive((dialog1, which) -> {
db.deleteMangasNotInLibrary().executeAsBlocking();
})
.show();
}
private ChapterCache getChapterCache() {
return getSettingsActivity().chapterCache;
}
}

View File

@ -1,98 +0,0 @@
package eu.kanade.mangafeed.ui.setting;
import android.os.Bundle;
import android.preference.Preference;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.MaterialDialog;
import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.cache.CacheManager;
import eu.kanade.mangafeed.ui.setting.preference.IntListPreference;
import eu.kanade.mangafeed.util.ToastUtil;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class SettingsCacheFragment extends SettingsNestedFragment implements Preference.OnPreferenceClickListener {
private CacheManager cacheManager;
private Preference clearCache;
private Subscription clearChapterCacheSubscription;
public static SettingsNestedFragment newInstance(int resourcePreference, int resourceTitle) {
SettingsNestedFragment fragment = new SettingsCacheFragment();
fragment.setArgs(resourcePreference, resourceTitle);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
View view = super.onCreateView(inflater, container, savedState);
cacheManager = getSettingsActivity().cacheManager;
IntListPreference cacheSize = (IntListPreference)findPreference(getString(R.string.pref_chapter_cache_size_key));
cacheSize.setOnPreferenceChangeListener(
(preference, newValue) -> {
cacheManager.setSize(Integer.parseInt(newValue.toString()));
return true;
});
clearCache = findPreference(getString(R.string.pref_clear_chapter_cache_key));
clearCache.setOnPreferenceClickListener(this);
clearCache.setSummary(getString(R.string.used_cache, cacheManager.getReadableSize()));
return view;
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference.equals(clearCache)) {
clearChapterCache();
}
return true;
}
private void clearChapterCache() {
final AtomicInteger deletedFiles = new AtomicInteger();
File[] files = cacheManager.getCacheDir().listFiles();
MaterialDialog dialog = new MaterialDialog.Builder(getActivity())
.title(R.string.deleting)
.progress(false, files.length, true)
.cancelable(false)
.dismissListener(d -> {
if (clearChapterCacheSubscription != null && !clearChapterCacheSubscription.isUnsubscribed())
clearChapterCacheSubscription.unsubscribe();
})
.show();
clearChapterCacheSubscription = Observable.defer(() -> Observable.from(files))
.concatMap(file -> {
if (cacheManager.remove(file.getName())) {
deletedFiles.incrementAndGet();
}
return Observable.just(file);
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(file -> dialog.incrementProgress(1),
error -> {
dialog.dismiss();
ToastUtil.showShort(getActivity(), getString(R.string.cache_delete_error));
}, () -> {
dialog.dismiss();
ToastUtil.showShort(getActivity(), getString(R.string.cache_deleted, deletedFiles.get()));
clearCache.setSummary(getString(R.string.used_cache, cacheManager.getReadableSize()));
});
}
}