From 94c3fa8cdb8fbcbdefb4bdeb4304c2b6181be19a Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sun, 27 Dec 2015 20:02:40 +0300 Subject: cache expiration fixes --- org.fox.ttcomics/build.gradle | 2 +- org.fox.ttcomics/src/main/AndroidManifest.xml | 10 ++- .../java/org/fox/ttcomics2/ComicListFragment.java | 26 +++---- .../java/org/fox/ttcomics2/CommonActivity.java | 21 ++---- .../java/org/fox/ttcomics2/DatabaseHelper.java | 63 ++++++++--------- .../main/java/org/fox/ttcomics2/MainActivity.java | 6 +- .../fox/ttcomics2/utils/CacheCleanupService.java | 79 ++++++++++++++++++++++ 7 files changed, 136 insertions(+), 71 deletions(-) mode change 100644 => 100755 org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java create mode 100755 org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CacheCleanupService.java (limited to 'org.fox.ttcomics') diff --git a/org.fox.ttcomics/build.gradle b/org.fox.ttcomics/build.gradle index 7cad928..79e3050 100755 --- a/org.fox.ttcomics/build.gradle +++ b/org.fox.ttcomics/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "org.fox.ttcomics2" - minSdkVersion 16 + minSdkVersion 19 targetSdkVersion 21 } diff --git a/org.fox.ttcomics/src/main/AndroidManifest.xml b/org.fox.ttcomics/src/main/AndroidManifest.xml index 4b32a0d..70f66f9 100755 --- a/org.fox.ttcomics/src/main/AndroidManifest.xml +++ b/org.fox.ttcomics/src/main/AndroidManifest.xml @@ -1,10 +1,10 @@ + android:versionCode="69" + android:versionName="1.28" > @@ -66,6 +66,10 @@ android:name=".sync.SyncFolderService" android:exported="false"/> + + \ No newline at end of file diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java index 63ede5a..19c50ef 100755 --- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java +++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java @@ -71,7 +71,7 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { m_mode = mode; } - public void updateWithoutRescan() { + public void refresh() { if (m_adapter != null) { m_adapter.changeCursor(createCursor()); //m_animationAdapter.reset(); @@ -271,15 +271,10 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { m_swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { - rescan(true); + rescan(); } }); - m_swipeLayout.setColorScheme(android.R.color.holo_green_dark, - android.R.color.holo_red_dark, - android.R.color.holo_blue_dark, - android.R.color.holo_orange_dark); - m_adapter = new ComicsListAdapter(getActivity(), R.layout.comics_grid_row, createCursor(), new String[] { "filename" }, new int[] { R.id.file_name }, 0); m_animationAdapter = new ScaleInAnimationAdapter(m_adapter); @@ -292,7 +287,7 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - rescan(true); + rescan(); } }); @@ -373,7 +368,7 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { m_activity.m_databaseHelper.setLastPosition(fileName, m_activity.m_databaseHelper.getSize(fileName) - 1); - updateWithoutRescan(); + refresh(); return true; default: return false; @@ -431,10 +426,10 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { m_prefs = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext()); } - protected void rescan(final boolean fullRescan) { + protected void rescan() { if (m_swipeLayout != null) m_swipeLayout.setRefreshing(true); - m_activity.m_databaseHelper.rescanDirectory(m_baseDirectory, fullRescan, new DatabaseHelper.DirectoryScanListener() { + m_activity.m_databaseHelper.rescanDirectory(m_baseDirectory, new DatabaseHelper.DirectoryScanListener() { @Override public void onProgressUpdate(int progress, int max) { @@ -444,11 +439,11 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { @Override public void onPostExecute(int result) { try { - m_activity.cleanupCache(false); + m_activity.cleanupCache(); if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false); - updateWithoutRescan(); + refresh(); } catch (Exception e) { e.printStackTrace(); @@ -468,9 +463,10 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { } if (m_activity.m_databaseHelper.getCachedItemCount(m_baseDirectory) == 0) { - rescan(false); + rescan(); } else { - updateWithoutRescan(); + refresh(); + m_activity.cleanupCache(); } String comicsDir = m_prefs.getString("comics_directory", ""); diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java index a224356..8d94b4c 100755 --- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java +++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java @@ -21,11 +21,11 @@ import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import org.fox.ttcomics2.sync.SyncClient; import org.fox.ttcomics2.utils.ByteArrayImageDownloader; +import org.fox.ttcomics2.utils.CacheCleanupService; import java.io.File; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.Date; public class CommonActivity extends AppCompatActivity { private final String TAG = this.getClass().getSimpleName(); @@ -36,6 +36,8 @@ public class CommonActivity extends AppCompatActivity { protected final static int REQUEST_SHARE = 1; protected static final int REQUEST_VIEWCOMIC = 2; + public static final long MAX_CACHE_SIZE = 100 * 1024 * 1024; // bytes + protected SharedPreferences m_prefs; protected SyncClient m_syncClient = new SyncClient(); @@ -199,20 +201,9 @@ public class CommonActivity extends AppCompatActivity { } } - public void cleanupCache(boolean deleteAll) { - if (isStorageWritable()) { - File cachePath = getExternalCacheDir(); - - long now = new Date().getTime(); - - if (cachePath.isDirectory()) { - for (File file : cachePath.listFiles()) { - if (deleteAll || now - file.lastModified() > 1000*60*60*24*7) { - file.delete(); - } - } - } - } + public void cleanupCache() { + Intent intent = new Intent(CommonActivity.this, CacheCleanupService.class); + startService(intent); } public static boolean isStorageAvailable() { diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java index fbe02e9..5316be4 100755 --- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java +++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java @@ -276,7 +276,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { c.close(); } - public void rescanDirectory(String comicsDir, final boolean fullRescan, final DirectoryScanListener listener) { + public void rescanDirectory(String comicsDir, final DirectoryScanListener listener) { AsyncTask task = new AsyncTask() { @@ -312,51 +312,46 @@ public class DatabaseHelper extends SQLiteOpenHelper { } else if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)")) { try { - int size = getSize(filePath); + ComicArchive cba = null; - if (size == -1 || fullRescan) { - - ComicArchive cba = null; - - if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)")) { - cba = new CbzComicArchive(filePath); - } - - if (cba != null && cba.getCount() > 0) { - // Get cover + if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)")) { + cba = new CbzComicArchive(filePath); + } - try { - File thumbnailFile = new File(CommonActivity.getCacheFileName(m_context, filePath)); + if (cba != null && cba.getCount() > 0) { + // Get cover - if (CommonActivity.isStorageWritable()) { - if (!thumbnailFile.exists() || fullRescan) { - InputStream is = cba.getItem(0); + try { + File thumbnailFile = new File(CommonActivity.getCacheFileName(m_context, filePath)); - if (is != null) { - FileOutputStream fos = new FileOutputStream(thumbnailFile); + if (CommonActivity.isStorageWritable()) { + if (!thumbnailFile.exists()) { + InputStream is = cba.getItem(0); - byte[] buffer = new byte[1024]; - int len; - while ((len = is.read(buffer)) != -1) { - fos.write(buffer, 0, len); - } + if (is != null) { + FileOutputStream fos = new FileOutputStream(thumbnailFile); - fos.close(); - is.close(); + byte[] buffer = new byte[1024]; + int len; + while ((len = is.read(buffer)) != -1) { + fos.write(buffer, 0, len); } - } else if (thumbnailFile.exists()) { - thumbnailFile.setLastModified(new Date().getTime()); + + fos.close(); + is.close(); } + } else if (thumbnailFile.exists()) { + thumbnailFile.setLastModified(new Date().getTime()); } - - } catch (IOException e) { - e.printStackTrace(); } - size = cba.getCount(); - - setSize(filePath, size); + } catch (IOException e) { + e.printStackTrace(); } + + int size = cba.getCount(); + + setSize(filePath, size); } } catch (IOException e) { e.printStackTrace(); diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java old mode 100644 new mode 100755 index b7933e8..6819500 --- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java +++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java @@ -268,7 +268,7 @@ public class MainActivity extends CommonActivity implements MaterialTabListener, ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST); if (frag != null && frag.isAdded()) { - frag.rescan(true); + frag.rescan(); } } } @@ -305,7 +305,7 @@ public class MainActivity extends CommonActivity implements MaterialTabListener, if (frag != null && frag.isAdded()) { frag.setMode(tab.getPosition()); - frag.updateWithoutRescan(); + frag.refresh(); } } @@ -328,7 +328,7 @@ public class MainActivity extends CommonActivity implements MaterialTabListener, ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST); if (frag != null && frag.isAdded()) { - frag.updateWithoutRescan(); + frag.refresh(); } } diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CacheCleanupService.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CacheCleanupService.java new file mode 100755 index 0000000..ec73e34 --- /dev/null +++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CacheCleanupService.java @@ -0,0 +1,79 @@ +package org.fox.ttcomics2.utils; + +import android.app.IntentService; +import android.content.Intent; +import android.os.Environment; +import android.util.Log; + +import org.fox.ttcomics2.CommonActivity; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class CacheCleanupService extends IntentService { + private final String TAG = this.getClass().getSimpleName(); + + public CacheCleanupService() { + super("CacheCleanupService"); + } + public CacheCleanupService(String name) { + super(name); + } + + public static boolean isStorageWritable() { + String state = Environment.getExternalStorageState(); + return Environment.MEDIA_MOUNTED.equals(state); + } + @Override + protected void onHandleIntent(Intent workIntent) { + Log.d(TAG, "starting..."); + + if (isStorageWritable()) { + File cachePath = getExternalCacheDir(); + + try { + + if (cachePath.isDirectory()) { + long totalSize = 0; + + ArrayList fileList = new ArrayList(); + + for (File file : cachePath.listFiles()) { + if (file.getName().toLowerCase().contains(".png")) { + totalSize += file.length(); + fileList.add(file); + } + } + + Log.d(TAG, "total cache size=" + totalSize); + + if (totalSize >= CommonActivity.MAX_CACHE_SIZE) { + Log.d(TAG, "expiring oldest files..."); + + Collections.sort(fileList, new Comparator() { + public int compare(File f1, File f2) { + return Long.compare(f1.lastModified(), f2.lastModified()); + } + }); + + for (File file : fileList) { + if (totalSize >= CommonActivity.MAX_CACHE_SIZE) { + totalSize -= file.length(); + file.delete(); + } else { + break; + } + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + Log.d(TAG, "done."); + } +} \ No newline at end of file -- cgit v1.2.3