mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Add an option to change cache size and clear the cache
This commit is contained in:
		| @@ -1,8 +1,8 @@ | ||||
| package eu.kanade.mangafeed.data.cache; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.text.format.Formatter; | ||||
|  | ||||
| import com.bumptech.glide.Glide; | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.reflect.TypeToken; | ||||
| import com.jakewharton.disklrucache.DiskLruCache; | ||||
| @@ -15,6 +15,7 @@ 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; | ||||
| @@ -26,67 +27,54 @@ public class CacheManager { | ||||
|     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 long PARAMETER_CACHE_SIZE = 100 * 1024 * 1024; | ||||
|     private static final int READ_TIMEOUT = 60; | ||||
|  | ||||
|     private Context mContext; | ||||
|     private Gson mGson; | ||||
|     private Context context; | ||||
|     private Gson gson; | ||||
|  | ||||
|     private DiskLruCache mDiskCache; | ||||
|     private DiskLruCache diskCache; | ||||
|  | ||||
|     public CacheManager(Context context) { | ||||
|         mContext = context; | ||||
|         mGson = new Gson(); | ||||
|     public CacheManager(Context context, PreferencesHelper preferences) { | ||||
|         this.context = context; | ||||
|         gson = new Gson(); | ||||
|  | ||||
|         try { | ||||
|             mDiskCache = DiskLruCache.open( | ||||
|             diskCache = DiskLruCache.open( | ||||
|                     new File(context.getCacheDir(), PARAMETER_CACHE_DIRECTORY), | ||||
|                     PARAMETER_APP_VERSION, | ||||
|                     PARAMETER_VALUE_COUNT, | ||||
|                     PARAMETER_CACHE_SIZE | ||||
|                     preferences.cacheSize() * 1024 * 1024 | ||||
|             ); | ||||
|         } catch (IOException e) { | ||||
|             // Do Nothing. | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public Observable<Boolean> clearImageCache() { | ||||
|         return Observable.create(subscriber -> { | ||||
|             try { | ||||
|                 subscriber.onNext(clearImageCacheImpl()); | ||||
|                 subscriber.onCompleted(); | ||||
|             } catch (Throwable e) { | ||||
|                 subscriber.onError(e); | ||||
|             } | ||||
|         }); | ||||
|     public boolean remove(String file) { | ||||
|         if (file.equals("journal") || file.startsWith("journal.")) | ||||
|             return false; | ||||
|  | ||||
|         try { | ||||
|             String key = file.substring(0, file.lastIndexOf(".")); | ||||
|             return diskCache.remove(key); | ||||
|         } catch (IOException e) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private boolean clearImageCacheImpl() { | ||||
|         boolean isSuccessful = true; | ||||
|     public File getCacheDir() { | ||||
|         return diskCache.getDirectory(); | ||||
|     } | ||||
|  | ||||
|         File imageCacheDirectory = Glide.getPhotoCacheDir(mContext); | ||||
|         if (imageCacheDirectory.isDirectory()) { | ||||
|             for (File cachedFile : imageCacheDirectory.listFiles()) { | ||||
|                 if (!cachedFile.delete()) { | ||||
|                     isSuccessful = false; | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             isSuccessful = false; | ||||
|         } | ||||
|     public long getRealSize() { | ||||
|         return DiskUtils.getDirectorySize(getCacheDir()); | ||||
|     } | ||||
|  | ||||
|         File urlCacheDirectory = getCacheDir(); | ||||
|         if (urlCacheDirectory.isDirectory()) { | ||||
|             for (File cachedFile : urlCacheDirectory.listFiles()) { | ||||
|                 if (!cachedFile.delete()) { | ||||
|                     isSuccessful = false; | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             isSuccessful = false; | ||||
|         } | ||||
|     public String getReadableSize() { | ||||
|         return Formatter.formatFileSize(context, getRealSize()); | ||||
|     } | ||||
|  | ||||
|         return isSuccessful; | ||||
|     public void setSize(int value) { | ||||
|         diskCache.setMaxSize(value * 1024 * 1024); | ||||
|     } | ||||
|  | ||||
|     public Observable<List<Page>> getPageUrlsFromDiskCache(final String chapterUrl) { | ||||
| @@ -107,10 +95,10 @@ public class CacheManager { | ||||
|  | ||||
|         try { | ||||
|             String key = DiskUtils.hashKeyForDisk(chapterUrl); | ||||
|             snapshot = mDiskCache.get(key); | ||||
|             snapshot = diskCache.get(key); | ||||
|  | ||||
|             Type collectionType = new TypeToken<List<Page>>() {}.getType(); | ||||
|             pages = mGson.fromJson(snapshot.getString(0), collectionType); | ||||
|             pages = gson.fromJson(snapshot.getString(0), collectionType); | ||||
|         } catch (IOException e) { | ||||
|             // Do Nothing. | ||||
|         } finally { | ||||
| @@ -122,13 +110,13 @@ public class CacheManager { | ||||
|     } | ||||
|  | ||||
|     public void putPageUrlsToDiskCache(final String chapterUrl, final List<Page> pages) { | ||||
|         String cachedValue = mGson.toJson(pages); | ||||
|         String cachedValue = gson.toJson(pages); | ||||
|  | ||||
|         DiskLruCache.Editor editor = null; | ||||
|         OutputStream outputStream = null; | ||||
|         try { | ||||
|             String key = DiskUtils.hashKeyForDisk(chapterUrl); | ||||
|             editor = mDiskCache.edit(key); | ||||
|             editor = diskCache.edit(key); | ||||
|             if (editor == null) { | ||||
|                 return; | ||||
|             } | ||||
| @@ -137,7 +125,7 @@ public class CacheManager { | ||||
|             outputStream.write(cachedValue.getBytes()); | ||||
|             outputStream.flush(); | ||||
|  | ||||
|             mDiskCache.flush(); | ||||
|             diskCache.flush(); | ||||
|             editor.commit(); | ||||
|         } catch (Exception e) { | ||||
|             // Do Nothing. | ||||
| @@ -155,13 +143,9 @@ public class CacheManager { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public File getCacheDir() { | ||||
|         return mDiskCache.getDirectory(); | ||||
|     } | ||||
|  | ||||
|     public boolean isImageInCache(final String imageUrl) { | ||||
|         try { | ||||
|             return mDiskCache.get(DiskUtils.hashKeyForDisk(imageUrl)) != null; | ||||
|             return diskCache.get(DiskUtils.hashKeyForDisk(imageUrl)) != null; | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
| @@ -171,7 +155,7 @@ public class CacheManager { | ||||
|     public String getImagePath(final String imageUrl) { | ||||
|         try { | ||||
|             String imageName = DiskUtils.hashKeyForDisk(imageUrl) + ".0"; | ||||
|             File file = new File(mDiskCache.getDirectory(), imageName); | ||||
|             File file = new File(diskCache.getDirectory(), imageName); | ||||
|             return file.getCanonicalPath(); | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
| @@ -185,7 +169,7 @@ public class CacheManager { | ||||
|  | ||||
|         try { | ||||
|             String key = DiskUtils.hashKeyForDisk(imageUrl); | ||||
|             editor = mDiskCache.edit(key); | ||||
|             editor = diskCache.edit(key); | ||||
|             if (editor == null) { | ||||
|                 throw new IOException("Unable to edit key"); | ||||
|             } | ||||
| @@ -194,7 +178,7 @@ public class CacheManager { | ||||
|             sink = Okio.buffer(Okio.sink(outputStream)); | ||||
|             sink.writeAll(response.body().source()); | ||||
|  | ||||
|             mDiskCache.flush(); | ||||
|             diskCache.flush(); | ||||
|             editor.commit(); | ||||
|         } catch (Exception e) { | ||||
|             throw new IOException("Unable to save image"); | ||||
|   | ||||
| @@ -40,6 +40,10 @@ 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); | ||||
|     } | ||||
|   | ||||
| @@ -8,10 +8,12 @@ import dagger.Component; | ||||
| import eu.kanade.mangafeed.data.chaptersync.MyAnimeList; | ||||
| import eu.kanade.mangafeed.data.chaptersync.UpdateChapterSyncService; | ||||
| import eu.kanade.mangafeed.data.download.DownloadService; | ||||
| import eu.kanade.mangafeed.data.source.base.Source; | ||||
| import eu.kanade.mangafeed.data.sync.LibraryUpdateService; | ||||
| import eu.kanade.mangafeed.injection.module.AppModule; | ||||
| import eu.kanade.mangafeed.injection.module.DataModule; | ||||
| import eu.kanade.mangafeed.ui.catalogue.CataloguePresenter; | ||||
| import eu.kanade.mangafeed.ui.catalogue.SourcePresenter; | ||||
| import eu.kanade.mangafeed.ui.download.DownloadPresenter; | ||||
| import eu.kanade.mangafeed.ui.library.LibraryPresenter; | ||||
| import eu.kanade.mangafeed.ui.manga.MangaActivity; | ||||
| @@ -19,12 +21,10 @@ import eu.kanade.mangafeed.ui.manga.MangaPresenter; | ||||
| import eu.kanade.mangafeed.ui.manga.chapter.ChaptersPresenter; | ||||
| import eu.kanade.mangafeed.ui.manga.info.MangaInfoPresenter; | ||||
| import eu.kanade.mangafeed.ui.manga.myanimelist.MyAnimeListPresenter; | ||||
| import eu.kanade.mangafeed.ui.reader.ReaderPresenter; | ||||
| import eu.kanade.mangafeed.ui.catalogue.SourcePresenter; | ||||
| import eu.kanade.mangafeed.data.source.base.Source; | ||||
| import eu.kanade.mangafeed.ui.reader.ReaderActivity; | ||||
| import eu.kanade.mangafeed.ui.reader.ReaderPresenter; | ||||
| import eu.kanade.mangafeed.ui.setting.SettingsAccountsFragment; | ||||
| import eu.kanade.mangafeed.ui.setting.SettingsDownloadsFragment; | ||||
| import eu.kanade.mangafeed.ui.setting.SettingsActivity; | ||||
|  | ||||
| @Singleton | ||||
| @Component( | ||||
| @@ -48,7 +48,7 @@ public interface AppComponent { | ||||
|     void inject(ReaderActivity readerActivity); | ||||
|     void inject(MangaActivity mangaActivity); | ||||
|     void inject(SettingsAccountsFragment settingsAccountsFragment); | ||||
|     void inject(SettingsDownloadsFragment settingsDownloadsFragment); | ||||
|     void inject(SettingsActivity settingsActivity); | ||||
|  | ||||
|     void inject(Source source); | ||||
|  | ||||
|   | ||||
| @@ -35,8 +35,8 @@ public class DataModule { | ||||
|  | ||||
|     @Provides | ||||
|     @Singleton | ||||
|     CacheManager provideCacheManager(Application app) { | ||||
|         return new CacheManager(app); | ||||
|     CacheManager provideCacheManager(Application app, PreferencesHelper preferences) { | ||||
|         return new CacheManager(app, preferences); | ||||
|     } | ||||
|  | ||||
|     @Provides | ||||
|   | ||||
| @@ -2,7 +2,6 @@ package eu.kanade.mangafeed.ui.setting; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceCategory; | ||||
| import android.preference.PreferenceFragment; | ||||
| import android.preference.PreferenceScreen; | ||||
|  | ||||
| import java.util.List; | ||||
| @@ -10,33 +9,29 @@ import java.util.List; | ||||
| import javax.inject.Inject; | ||||
|  | ||||
| import eu.kanade.mangafeed.App; | ||||
| import eu.kanade.mangafeed.R; | ||||
| import eu.kanade.mangafeed.data.chaptersync.BaseChapterSync; | ||||
| import eu.kanade.mangafeed.data.chaptersync.ChapterSyncManager; | ||||
| import eu.kanade.mangafeed.data.preference.PreferencesHelper; | ||||
| import eu.kanade.mangafeed.data.source.SourceManager; | ||||
| import eu.kanade.mangafeed.data.source.base.Source; | ||||
| import eu.kanade.mangafeed.ui.base.activity.BaseActivity; | ||||
| import eu.kanade.mangafeed.ui.setting.dialog.ChapterSyncLoginDialog; | ||||
| import eu.kanade.mangafeed.ui.setting.dialog.SourceLoginDialog; | ||||
| import eu.kanade.mangafeed.ui.setting.preference.ChapterSyncLoginDialog; | ||||
| import eu.kanade.mangafeed.ui.setting.preference.SourceLoginDialog; | ||||
| import rx.Observable; | ||||
|  | ||||
| public class SettingsAccountsFragment extends PreferenceFragment { | ||||
| public class SettingsAccountsFragment extends SettingsNestedFragment { | ||||
|  | ||||
|     @Inject PreferencesHelper preferences; | ||||
|     @Inject SourceManager sourceManager; | ||||
|     @Inject ChapterSyncManager syncManager; | ||||
|  | ||||
|     public static SettingsAccountsFragment newInstance() { | ||||
|         return new SettingsAccountsFragment(); | ||||
|     public static SettingsNestedFragment newInstance(int resourcePreference, int resourceTitle) { | ||||
|         SettingsNestedFragment fragment = new SettingsAccountsFragment(); | ||||
|         fragment.setBundle(resourcePreference, resourceTitle); | ||||
|         return fragment; | ||||
|     } | ||||
|  | ||||
|     public void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         App.get(getActivity()).getComponent().inject(this); | ||||
|  | ||||
|         addPreferencesFromResource(R.xml.pref_accounts); | ||||
|  | ||||
|         PreferenceScreen screen = getPreferenceScreen(); | ||||
|  | ||||
|         List<Source> sourceAccounts = getSourcesWithLogin(); | ||||
| @@ -67,13 +62,6 @@ public class SettingsAccountsFragment extends PreferenceFragment { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         super.onResume(); | ||||
|         ((BaseActivity)getActivity()) | ||||
|                 .setToolbarTitle(getString(R.string.pref_category_accounts)); | ||||
|     } | ||||
|  | ||||
|     private List<Source> getSourcesWithLogin() { | ||||
|         return Observable.from(sourceManager.getSources()) | ||||
|                 .filter(Source::isLoginRequired) | ||||
|   | ||||
| @@ -1,20 +1,30 @@ | ||||
| package eu.kanade.mangafeed.ui.setting; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceFragment; | ||||
| import android.support.v7.widget.Toolbar; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
|  | ||||
| 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.preference.PreferencesHelper; | ||||
| import eu.kanade.mangafeed.ui.base.activity.BaseActivity; | ||||
|  | ||||
| public class SettingsActivity extends BaseActivity { | ||||
|  | ||||
|     @Inject PreferencesHelper preferences; | ||||
|     @Inject CacheManager cacheManager; | ||||
|  | ||||
|     @Bind(R.id.toolbar) Toolbar toolbar; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         App.get(getActivity()).getComponent().inject(this); | ||||
|         setContentView(R.layout.activity_preferences); | ||||
|         ButterKnife.bind(this); | ||||
|  | ||||
| @@ -31,4 +41,46 @@ public class SettingsActivity extends BaseActivity { | ||||
|         if( !getFragmentManager().popBackStackImmediate() ) super.onBackPressed(); | ||||
|     } | ||||
|  | ||||
|     public static class SettingsMainFragment extends PreferenceFragment { | ||||
|  | ||||
|         @Override | ||||
|         public void onCreate(Bundle savedInstanceState) { | ||||
|             super.onCreate(savedInstanceState); | ||||
|             addPreferencesFromResource(R.xml.pref_main); | ||||
|  | ||||
|             registerSubpreference(R.string.pref_category_reader_key, | ||||
|                     SettingsNestedFragment.newInstance( | ||||
|                         R.xml.pref_reader, R.string.pref_category_reader)); | ||||
|  | ||||
|             registerSubpreference(R.string.pref_category_downloads_key, | ||||
|                     SettingsDownloadsFragment.newInstance( | ||||
|                         R.xml.pref_downloads, R.string.pref_category_downloads)); | ||||
|  | ||||
|             registerSubpreference(R.string.pref_category_accounts_key, | ||||
|                     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)); | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void onResume() { | ||||
|             super.onResume(); | ||||
|             ((BaseActivity) getActivity()).setToolbarTitle(getString(R.string.label_settings)); | ||||
|         } | ||||
|  | ||||
|         private void registerSubpreference(int preferenceResource, PreferenceFragment fragment) { | ||||
|             findPreference(getString(preferenceResource)) | ||||
|                     .setOnPreferenceClickListener(preference -> { | ||||
|                         getFragmentManager().beginTransaction() | ||||
|                                 .replace(R.id.settings_content, fragment) | ||||
|                                 .addToBackStack(fragment.getClass().getSimpleName()).commit(); | ||||
|                         return true; | ||||
|                     }); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,92 @@ | ||||
| package eu.kanade.mangafeed.ui.setting; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.preference.Preference; | ||||
|  | ||||
| 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.setBundle(resourcePreference, resourceTitle); | ||||
|         return fragment; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         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())); | ||||
|     } | ||||
|  | ||||
|     @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_files) | ||||
|                 .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())); | ||||
|                         }); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -2,30 +2,21 @@ package eu.kanade.mangafeed.ui.setting; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.preference.ListPreference; | ||||
| import android.preference.PreferenceFragment; | ||||
| import android.preference.PreferenceScreen; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
|  | ||||
| import eu.kanade.mangafeed.App; | ||||
| import eu.kanade.mangafeed.R; | ||||
| import eu.kanade.mangafeed.data.preference.PreferencesHelper; | ||||
| import eu.kanade.mangafeed.ui.base.activity.BaseActivity; | ||||
| import eu.kanade.mangafeed.util.DiskUtils; | ||||
|  | ||||
| public class SettingsDownloadsFragment extends PreferenceFragment { | ||||
| public class SettingsDownloadsFragment extends SettingsNestedFragment { | ||||
|  | ||||
|     @Inject PreferencesHelper preferences; | ||||
|  | ||||
|     public static SettingsDownloadsFragment newInstance() { | ||||
|         return new SettingsDownloadsFragment(); | ||||
|     public static SettingsNestedFragment newInstance(int resourcePreference, int resourceTitle) { | ||||
|         SettingsNestedFragment fragment = new SettingsDownloadsFragment(); | ||||
|         fragment.setBundle(resourcePreference, resourceTitle); | ||||
|         return fragment; | ||||
|     } | ||||
|  | ||||
|     public void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         App.get(getActivity()).getComponent().inject(this); | ||||
|  | ||||
|         addPreferencesFromResource(R.xml.pref_downloads); | ||||
|  | ||||
|         PreferenceScreen screen = getPreferenceScreen(); | ||||
|  | ||||
| @@ -46,11 +37,4 @@ public class SettingsDownloadsFragment extends PreferenceFragment { | ||||
|         screen.addPreference(directoriesPref); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         super.onResume(); | ||||
|         ((BaseActivity)getActivity()) | ||||
|                 .setToolbarTitle(getString(R.string.pref_category_downloads)); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,44 +0,0 @@ | ||||
| package eu.kanade.mangafeed.ui.setting; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceFragment; | ||||
|  | ||||
| import eu.kanade.mangafeed.R; | ||||
| import eu.kanade.mangafeed.ui.base.activity.BaseActivity; | ||||
|  | ||||
| public class SettingsMainFragment extends PreferenceFragment { | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         addPreferencesFromResource(R.xml.pref_main); | ||||
|  | ||||
|         registerSubpreference(R.string.pref_category_reader_key, | ||||
|                 SettingsNestedFragment.newInstance( | ||||
|                         R.xml.pref_reader, R.string.pref_category_reader)); | ||||
|  | ||||
|         registerSubpreference(R.string.pref_category_downloads_key, | ||||
|                 SettingsDownloadsFragment.newInstance()); | ||||
|  | ||||
|         registerSubpreference(R.string.pref_category_accounts_key, | ||||
|                 SettingsAccountsFragment.newInstance()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         super.onResume(); | ||||
|         ((BaseActivity)getActivity()) | ||||
|                 .setToolbarTitle(getString(R.string.label_settings)); | ||||
|     } | ||||
|  | ||||
|     private void registerSubpreference(int preferenceResource, PreferenceFragment fragment) { | ||||
|         findPreference(getString(preferenceResource)) | ||||
|                 .setOnPreferenceClickListener(preference -> { | ||||
|                     getFragmentManager().beginTransaction() | ||||
|                             .replace(R.id.settings_content, fragment) | ||||
|                             .addToBackStack(fragment.getClass().getSimpleName()).commit(); | ||||
|                     return true; | ||||
|                 }); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -3,34 +3,45 @@ package eu.kanade.mangafeed.ui.setting; | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceFragment; | ||||
|  | ||||
| import eu.kanade.mangafeed.data.preference.PreferencesHelper; | ||||
| import eu.kanade.mangafeed.ui.base.activity.BaseActivity; | ||||
|  | ||||
| public class SettingsNestedFragment extends PreferenceFragment { | ||||
|  | ||||
|     protected PreferencesHelper preferences; | ||||
|  | ||||
|     private static final String RESOURCE_FILE = "resource_file"; | ||||
|     private static final String TOOLBAR_TITLE = "toolbar_title"; | ||||
|  | ||||
|     public static SettingsNestedFragment newInstance(int resourcePreference, int resourceTitle) { | ||||
|         SettingsNestedFragment fragment = new SettingsNestedFragment(); | ||||
|         Bundle args = new Bundle(); | ||||
|         args.putInt(RESOURCE_FILE, resourcePreference); | ||||
|         args.putInt(TOOLBAR_TITLE, resourceTitle); | ||||
|         fragment.setArguments(args); | ||||
|         fragment.setBundle(resourcePreference, resourceTitle); | ||||
|         return fragment; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         preferences = getSettingsActivity().preferences; | ||||
|         addPreferencesFromResource(getArguments().getInt(RESOURCE_FILE)); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         super.onResume(); | ||||
|         ((BaseActivity)getActivity()) | ||||
|         ((BaseActivity) getActivity()) | ||||
|                 .setToolbarTitle(getString(getArguments().getInt(TOOLBAR_TITLE))); | ||||
|     } | ||||
|  | ||||
|     public void setBundle(int resourcePreference, int resourceTitle) { | ||||
|         Bundle args = new Bundle(); | ||||
|         args.putInt(RESOURCE_FILE, resourcePreference); | ||||
|         args.putInt(TOOLBAR_TITLE, resourceTitle); | ||||
|         setArguments(args); | ||||
|     } | ||||
|  | ||||
|     public SettingsActivity getSettingsActivity() { | ||||
|         return (SettingsActivity) getActivity(); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package eu.kanade.mangafeed.ui.setting.dialog; | ||||
| package eu.kanade.mangafeed.ui.setting.preference; | ||||
| 
 | ||||
| import android.content.Context; | ||||
| import android.content.DialogInterface; | ||||
| @@ -0,0 +1,35 @@ | ||||
| package eu.kanade.mangafeed.ui.setting.preference; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.preference.ListPreference; | ||||
| import android.util.AttributeSet; | ||||
|  | ||||
| public class IntListPreference extends ListPreference | ||||
| { | ||||
|     public IntListPreference(Context context, AttributeSet attrs) { | ||||
|         super(context, attrs); | ||||
|     } | ||||
|  | ||||
|     public IntListPreference(Context context) { | ||||
|         super(context); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected boolean persistString(String value) { | ||||
|         if(value == null) { | ||||
|             return false; | ||||
|         } else { | ||||
|             return persistInt(Integer.valueOf(value)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected String getPersistedString(String defaultReturnValue) { | ||||
|         if(getSharedPreferences().contains(getKey())) { | ||||
|             int intValue = getPersistedInt(0); | ||||
|             return String.valueOf(intValue); | ||||
|         } else { | ||||
|             return defaultReturnValue; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package eu.kanade.mangafeed.ui.setting.dialog; | ||||
| package eu.kanade.mangafeed.ui.setting.preference; | ||||
| 
 | ||||
| import android.app.AlertDialog; | ||||
| import android.content.Context; | ||||
| @@ -1,4 +1,4 @@ | ||||
| package eu.kanade.mangafeed.ui.setting.dialog; | ||||
| package eu.kanade.mangafeed.ui.setting.preference; | ||||
| 
 | ||||
| import android.content.Context; | ||||
| import android.content.DialogInterface; | ||||
| @@ -158,5 +158,18 @@ public final class DiskUtils { | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     public static long getDirectorySize(File f) { | ||||
|         long size = 0; | ||||
|         if (f.isDirectory()) { | ||||
|             for (File file : f.listFiles()) { | ||||
|                 size += getDirectorySize(file); | ||||
|             } | ||||
|         } else { | ||||
|             size=f.length(); | ||||
|         } | ||||
|         return size; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -27,4 +27,16 @@ | ||||
|         <item>2</item> | ||||
|         <item>3</item> | ||||
|     </string-array> | ||||
|  | ||||
|     <string-array name="cache_size"> | ||||
|         <item>50 MB</item> | ||||
|         <item>75 MB</item> | ||||
|         <item>100 MB</item> | ||||
|     </string-array> | ||||
|  | ||||
|     <string-array name="cache_values"> | ||||
|         <item>50</item> | ||||
|         <item>75</item> | ||||
|         <item>100</item> | ||||
|     </string-array> | ||||
| </resources> | ||||
| @@ -3,6 +3,7 @@ | ||||
|     <string name="pref_category_reader_key">pref_category_reader_key</string> | ||||
|     <string name="pref_category_accounts_key">pref_category_accounts_key</string> | ||||
|     <string name="pref_category_downloads_key">pref_category_downloads_key</string> | ||||
|     <string name="pref_category_cache_key">pref_category_cache_key</string> | ||||
|  | ||||
|     <string name="pref_default_viewer_key">pref_default_viewer_key</string> | ||||
|     <string name="pref_hide_status_bar_key">pref_hide_status_bar_key</string> | ||||
| @@ -15,4 +16,7 @@ | ||||
|  | ||||
|     <string name="pref_download_directory_key">pref_download_directory_key</string> | ||||
|     <string name="pref_download_threads_key">pref_download_threads_key</string> | ||||
|  | ||||
|     <string name="pref_chapter_cache_size_key">pref_chapter_cache_size_key</string> | ||||
|     <string name="pref_clear_chapter_cache_key">pref_clear_chapter_cache_key</string> | ||||
| </resources> | ||||
| @@ -29,12 +29,16 @@ | ||||
|     <string name="button_ok">OK</string> | ||||
|     <string name="button_cancel">Cancel</string> | ||||
|  | ||||
|     <!-- Operations --> | ||||
|     <string name="deleting_files">Deleting files…</string> | ||||
|     <string name="loading">Loading…</string> | ||||
|  | ||||
|     <!-- Preferences --> | ||||
|       <!-- Subsections --> | ||||
|     <string name="pref_category_reader">Reader</string> | ||||
|     <string name="pref_category_accounts">Accounts</string> | ||||
|     <string name="pref_category_downloads">Downloads</string> | ||||
|     <string name="pref_category_cache">Cache</string> | ||||
|  | ||||
|       <!-- Reader section --> | ||||
|     <string name="pref_hide_status_bar">Hide status bar</string> | ||||
| @@ -53,16 +57,22 @@ | ||||
|     <string name="pref_download_directory">Downloads directory</string> | ||||
|     <string name="pref_download_threads">Download threads</string> | ||||
|  | ||||
|       <!-- Cache section --> | ||||
|     <string name="pref_chapter_cache_size">Chapters cache size</string> | ||||
|     <string name="pref_clear_chapter_cache">Clear chapter cache</string> | ||||
|     <string name="used_cache">Used: %1$s</string> | ||||
|     <string name="cache_deleted">Cache cleared. %1$d files have been deleted</string> | ||||
|     <string name="cache_delete_error">An error occurred clearing cache</string> | ||||
|  | ||||
|  | ||||
|     <!-- Login dialog --> | ||||
|     <string name="accounts_login_title">Login for %1$s</string> | ||||
|     <string name="username">Username</string> | ||||
|     <string name="password">Password</string> | ||||
|     <string name="show_password">Show password</string> | ||||
|     <string name="check_credentials">Check credentials</string> | ||||
|     <string name="login">Login</string> | ||||
|     <string name="login_success">Login successful</string> | ||||
|     <string name="invalid_login">Login error</string> | ||||
|     <string name="loading">Loading…</string> | ||||
|     <string name="unknown_error">Unknown error</string> | ||||
|  | ||||
|     <!-- Library fragment --> | ||||
|   | ||||
							
								
								
									
										16
									
								
								app/src/main/res/xml/pref_cache.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/src/main/res/xml/pref_cache.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <eu.kanade.mangafeed.ui.setting.preference.IntListPreference | ||||
|         android:title="@string/pref_chapter_cache_size" | ||||
|         android:key="@string/pref_chapter_cache_size_key" | ||||
|         android:entries="@array/cache_size" | ||||
|         android:entryValues="@array/cache_values" | ||||
|         android:summary="%s" | ||||
|         android:defaultValue="75"/> | ||||
|  | ||||
|     <Preference | ||||
|         android:title="@string/pref_clear_chapter_cache" | ||||
|         android:key="@string/pref_clear_chapter_cache_key" /> | ||||
|  | ||||
| </PreferenceScreen> | ||||
| @@ -16,4 +16,9 @@ | ||||
|         android:persistent="false" | ||||
|         android:title="@string/pref_category_accounts" /> | ||||
|  | ||||
|     <Preference | ||||
|         android:key="@string/pref_category_cache_key" | ||||
|         android:persistent="false" | ||||
|         android:title="@string/pref_category_cache" /> | ||||
|  | ||||
| </PreferenceScreen> | ||||
		Reference in New Issue
	
	Block a user