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/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java index 1f34ae8..7b151bf 100644 --- a/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java +++ b/library/src/main/java/com/danikula/videocache/HttpProxyCacheServer.java @@ -181,6 +181,26 @@ public void shutdown() { } } + public void cleanCache() { + StorageUtils.cleanDirectory(config.cacheRoot); + 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/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/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java b/library/src/main/java/com/danikula/videocache/sourcestorage/DatabaseSourceInfoStorage.java index a3999e6..550abd2 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,17 @@ public void release() { close(); } + @Override + 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 e2c08c4..2aaac6c 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,12 @@ public void put(String url, SourceInfo sourceInfo) { @Override 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 5e97d6d..a5c4489 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,8 @@ public interface SourceInfoStorage { void put(String url, SourceInfo sourceInfo); void release(); + + void clean(); + + void remove(String url); } diff --git a/sample/build.gradle b/sample/build.gradle index 5876444..5a01632 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' @@ -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())); - } - } - } -} 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'