From 620e9be54a9cf60979c3631ea53ffada8c92f81a Mon Sep 17 00:00:00 2001 From: Milos Milutinovic Date: Wed, 14 Jun 2017 08:45:16 +0200 Subject: [PATCH 1/4] misc - build tools version up --- library/build.gradle | 2 +- sample/build.gradle | 2 +- test/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index 7358dde..4cd8f3c 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'bintray-release' android { compileSdkVersion 23 - buildToolsVersion '25.0.2' + buildToolsVersion '25.0.3' defaultConfig { minSdkVersion 9 diff --git a/sample/build.gradle b/sample/build.gradle index 5876444..5ddf70d 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -16,7 +16,7 @@ apply plugin: 'com.neenbedankt.android-apt' android { compileSdkVersion 23 - buildToolsVersion '25.0.2' + buildToolsVersion '25.0.3' defaultConfig { applicationId 'com.danikula.videocache.sample' diff --git a/test/build.gradle b/test/build.gradle index 5dd2ee7..baffb5b 100644 --- a/test/build.gradle +++ b/test/build.gradle @@ -6,7 +6,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion '25.0.2' + buildToolsVersion '25.0.3' defaultConfig { applicationId 'com.danikula.proxycache.test' From e0c917d4aa74067ffd2b58dd13b1f8cb39f55f17 Mon Sep 17 00:00:00 2001 From: Milos Milutinovic Date: Wed, 14 Jun 2017 09:04:36 +0200 Subject: [PATCH 2/4] Integrate clean cache operation into HttpProxyCacheServer; remove extra code from sample --- .../videocache/HttpProxyCacheServer.java | 5 ++ .../com/danikula/videocache/StorageUtils.java | 36 +++++++++++++ sample/build.gradle | 4 +- .../com/danikula/videocache/sample/App.java | 4 +- .../videocache/sample/MenuActivity.java | 11 +--- .../com/danikula/videocache/sample/Utils.java | 53 ------------------- 6 files changed, 47 insertions(+), 66 deletions(-) delete mode 100644 sample/src/main/java/com/danikula/videocache/sample/Utils.java diff --git a/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java index 1f34ae8..2bc6e4c 100644 --- a/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java +++ b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java @@ -181,6 +181,11 @@ public void shutdown() { } } + public void cleanCache() { + StorageUtils.cleanDirectory(config.cacheRoot); + // TODO: clean database as well + } + private boolean isAlive() { return pinger.ping(3, 70); // 70+140+280=max~500ms } diff --git a/library/src/main/java/com/danikula/videocache/StorageUtils.java b/library/src/main/java/com/danikula/videocache/StorageUtils.java index a4f2dce..b7ec1d5 100644 --- a/library/src/main/java/com/danikula/videocache/StorageUtils.java +++ b/library/src/main/java/com/danikula/videocache/StorageUtils.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import java.io.File; +import java.io.IOException; import static android.os.Environment.MEDIA_MOUNTED; @@ -80,4 +81,39 @@ private static File getExternalCacheDir(Context context) { } return appCacheDir; } + + public static void cleanDirectory(File file) { + if (!file.exists()) { + return; + } + File[] contentFiles = file.listFiles(); + if (contentFiles != null) { + for (File contentFile : contentFiles) { + try { + delete(contentFile); + } catch (IOException e) { + LOG.warn(e.getMessage()); + } + } + } + } + + private static void delete(File file) throws IOException { + if (file.isFile() && file.exists()) { + deleteOrThrow(file); + } else { + cleanDirectory(file); + deleteOrThrow(file); + } + } + + private static void deleteOrThrow(File file) throws IOException { + if (file.exists()) { + boolean isDeleted = file.delete(); + if (!isDeleted) { + throw new IOException(String.format("File %s can't be deleted", file.getAbsolutePath())); + } + } + } + } diff --git a/sample/build.gradle b/sample/build.gradle index 5ddf70d..5a01632 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -35,10 +35,10 @@ apt { } dependencies { -// compile project(':library') + compile project(':library') compile 'com.android.support:support-v4:23.1.0' compile 'org.androidannotations:androidannotations-api:3.3.2' - compile 'com.danikula:videocache:2.7.0' +// compile 'com.danikula:videocache:2.7.0' compile 'com.viewpagerindicator:library:2.4.2-SNAPSHOT@aar' apt 'org.androidannotations:androidannotations:3.3.2' } diff --git a/sample/src/main/java/com/danikula/videocache/sample/App.java b/sample/src/main/java/com/danikula/videocache/sample/App.java index 095469d..d9cd112 100644 --- a/sample/src/main/java/com/danikula/videocache/sample/App.java +++ b/sample/src/main/java/com/danikula/videocache/sample/App.java @@ -5,6 +5,8 @@ import com.danikula.videocache.HttpProxyCacheServer; +import java.io.File; + /** * @author Alexey Danilov (danikula@gmail.com). */ @@ -19,7 +21,7 @@ public static HttpProxyCacheServer getProxy(Context context) { private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer.Builder(this) - .cacheDirectory(Utils.getVideoCacheDir(this)) + .cacheDirectory(new File(getExternalCacheDir(), "video-cache")) .build(); } } diff --git a/sample/src/main/java/com/danikula/videocache/sample/MenuActivity.java b/sample/src/main/java/com/danikula/videocache/sample/MenuActivity.java index 353ab4e..398cdd0 100644 --- a/sample/src/main/java/com/danikula/videocache/sample/MenuActivity.java +++ b/sample/src/main/java/com/danikula/videocache/sample/MenuActivity.java @@ -3,11 +3,9 @@ import android.content.Intent; import android.support.annotation.NonNull; import android.support.v4.app.FragmentActivity; -import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; -import android.widget.Toast; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; @@ -15,7 +13,6 @@ import org.androidannotations.annotations.ItemClick; import org.androidannotations.annotations.ViewById; -import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -48,13 +45,7 @@ void onListItemClicked(int position) { @Click(R.id.cleanCacheButton) void onClearCacheButtonClick() { - try { - - Utils.cleanVideoCacheDir(this); - } catch (IOException e) { - Log.e(null, "Error cleaning cache", e); - Toast.makeText(this, "Error cleaning cache", Toast.LENGTH_LONG).show(); - } + App.getProxy(this).cleanCache(); } private static final class ListEntry { diff --git a/sample/src/main/java/com/danikula/videocache/sample/Utils.java b/sample/src/main/java/com/danikula/videocache/sample/Utils.java deleted file mode 100644 index 4377983..0000000 --- a/sample/src/main/java/com/danikula/videocache/sample/Utils.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.danikula.videocache.sample; - -import android.content.Context; - -import java.io.File; -import java.io.IOException; - -/** - * Some utils methods. - * - * @author Alexey Danilov (danikula@gmail.com). - */ -public class Utils { - - public static File getVideoCacheDir(Context context) { - return new File(context.getExternalCacheDir(), "video-cache"); - } - - public static void cleanVideoCacheDir(Context context) throws IOException { - File videoCacheDir = getVideoCacheDir(context); - cleanDirectory(videoCacheDir); - } - - private static void cleanDirectory(File file) throws IOException { - if (!file.exists()) { - return; - } - File[] contentFiles = file.listFiles(); - if (contentFiles != null) { - for (File contentFile : contentFiles) { - delete(contentFile); - } - } - } - - private static void delete(File file) throws IOException { - if (file.isFile() && file.exists()) { - deleteOrThrow(file); - } else { - cleanDirectory(file); - deleteOrThrow(file); - } - } - - private static void deleteOrThrow(File file) throws IOException { - if (file.exists()) { - boolean isDeleted = file.delete(); - if (!isDeleted) { - throw new IOException(String.format("File %s can't be deleted", file.getAbsolutePath())); - } - } - } -} From 273829debf9c6647408ae027314799ff648f7348 Mon Sep 17 00:00:00 2001 From: Milos Milutinovic Date: Wed, 14 Jun 2017 09:39:55 +0200 Subject: [PATCH 3/4] Cleaning cache files cleans all source info storage entries as well --- .../java/com/danikula/videocache/HttpProxyCacheServer.java | 2 +- .../videocache/sourcestorage/DatabaseSourceInfoStorage.java | 5 +++++ .../videocache/sourcestorage/NoSourceInfoStorage.java | 4 ++++ .../danikula/videocache/sourcestorage/SourceInfoStorage.java | 3 +++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java index 2bc6e4c..3bb0eca 100644 --- a/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java +++ b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java @@ -183,7 +183,7 @@ public void shutdown() { public void cleanCache() { StorageUtils.cleanDirectory(config.cacheRoot); - // TODO: clean database as well + config.sourceInfoStorage.clean(); } private boolean isAlive() { diff --git a/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java b/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java index a3999e6..36a1c2f 100644 --- a/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java +++ b/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java @@ -80,6 +80,11 @@ public void release() { close(); } + @Override + public void clean() { + getWritableDatabase().delete(TABLE, null, null); + } + private SourceInfo convert(Cursor cursor) { return new SourceInfo( cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_URL)), diff --git a/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java b/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java index e2c08c4..03f62b6 100644 --- a/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java +++ b/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java @@ -21,4 +21,8 @@ public void put(String url, SourceInfo sourceInfo) { @Override public void release() { } + + @Override + public void clean() { + } } diff --git a/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java b/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java index 5e97d6d..d51f36f 100644 --- a/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java +++ b/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java @@ -14,4 +14,7 @@ public interface SourceInfoStorage { void put(String url, SourceInfo sourceInfo); void release(); + + void clean(); + } From c111624761332fbb2c2e034d71f22d979381dded Mon Sep 17 00:00:00 2001 From: Milos Milutinovic Date: Wed, 14 Jun 2017 13:18:52 +0200 Subject: [PATCH 4/4] Added removeFromCache method; removes cached video as well as the corresponding source info --- .../danikula/videocache/HttpProxyCacheServer.java | 15 +++++++++++++++ .../sourcestorage/DatabaseSourceInfoStorage.java | 6 ++++++ .../sourcestorage/NoSourceInfoStorage.java | 4 ++++ .../sourcestorage/SourceInfoStorage.java | 1 + 4 files changed, 26 insertions(+) diff --git a/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java index 3bb0eca..7b151bf 100644 --- a/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java +++ b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java @@ -186,6 +186,21 @@ public void cleanCache() { config.sourceInfoStorage.clean(); } + public void removeFromCache(String url) { + if(!isCached(url)) return; + + File cacheFile = getCacheFile(url); + if(!cacheFile.exists()) return; + + boolean isDeleted = cacheFile.delete(); + if (!isDeleted) { + LOG.warn(String.format("File %s can't be deleted", cacheFile.getAbsolutePath())); + return; + } + + config.sourceInfoStorage.remove(url); + } + private boolean isAlive() { return pinger.ping(3, 70); // 70+140+280=max~500ms } diff --git a/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java b/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java index 36a1c2f..550abd2 100644 --- a/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java +++ b/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java @@ -85,6 +85,12 @@ public void clean() { getWritableDatabase().delete(TABLE, null, null); } + @Override + public void remove(String url) { + checkNotNull(url); + getWritableDatabase().delete(TABLE, COLUMN_URL + "=?", new String[]{url}); + } + private SourceInfo convert(Cursor cursor) { return new SourceInfo( cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_URL)), diff --git a/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java b/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java index 03f62b6..2aaac6c 100644 --- a/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java +++ b/library/src/main/java/com/danikula/videocache/sourcestorage/NoSourceInfoStorage.java @@ -25,4 +25,8 @@ public void release() { @Override public void clean() { } + + @Override + public void remove(String url) { + } } diff --git a/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java b/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java index d51f36f..a5c4489 100644 --- a/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java +++ b/library/src/main/java/com/danikula/videocache/sourcestorage/SourceInfoStorage.java @@ -17,4 +17,5 @@ public interface SourceInfoStorage { void clean(); + void remove(String url); }