Cache.java 源代码
package com.unity3d.services.core.api;
import android.annotation.TargetApi;
import android.media.MediaMetadataRetriever;
import android.util.Base64;
import android.util.SparseArray;
import com.anythink.core.api.ATAdConst;
import com.unity3d.services.core.cache.CacheDirectory;
import com.unity3d.services.core.cache.CacheDirectoryType;
import com.unity3d.services.core.cache.CacheError;
import com.unity3d.services.core.cache.CacheThread;
import com.unity3d.services.core.device.Device;
import com.unity3d.services.core.log.DeviceLog;
import com.unity3d.services.core.misc.Utilities;
import com.unity3d.services.core.properties.ClientProperties;
import com.unity3d.services.core.properties.SdkProperties;
import com.unity3d.services.core.request.WebRequestError;
import com.unity3d.services.core.webview.bridge.WebViewCallback;
import com.unity3d.services.core.webview.bridge.WebViewExposed;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class Cache {
@WebViewExposed
public static void deleteFile(String str, WebViewCallback webViewCallback) {
if (new File(fileIdToFilename(str)).delete()) {
webViewCallback.invoke(new Object[0]);
} else {
webViewCallback.error(CacheError.FILE_IO_ERROR, new Object[0]);
}
}
@WebViewExposed
public static void download(String str, String str2, JSONArray jSONArray, Boolean bool, WebViewCallback webViewCallback) {
if (CacheThread.isActive()) {
webViewCallback.error(CacheError.FILE_ALREADY_CACHING, new Object[0]);
return;
}
if (!Device.isActiveNetworkConnected()) {
webViewCallback.error(CacheError.NO_INTERNET, new Object[0]);
return;
}
try {
CacheThread.download(str, fileIdToFilename(str2), Request.getHeadersMap(jSONArray), bool.booleanValue());
webViewCallback.invoke(new Object[0]);
} catch (Exception e6) {
DeviceLog.exception("Error mapping headers for the request", e6);
webViewCallback.error(WebRequestError.MAPPING_HEADERS_FAILED, str, str2);
}
}
private static String fileIdToFilename(String str) {
return SdkProperties.getCacheDirectory() + "/" + SdkProperties.getCacheFilePrefix() + str;
}
@WebViewExposed
public static void getCacheDirectoryExists(WebViewCallback webViewCallback) {
File cacheDirectory = SdkProperties.getCacheDirectory();
if (cacheDirectory == null) {
webViewCallback.error(CacheError.CACHE_DIRECTORY_NULL, new Object[0]);
} else {
webViewCallback.invoke(Boolean.valueOf(cacheDirectory.exists()));
}
}
@WebViewExposed
public static void getCacheDirectoryType(WebViewCallback webViewCallback) {
CacheDirectory cacheDirectoryObject = SdkProperties.getCacheDirectoryObject();
if (cacheDirectoryObject != null && cacheDirectoryObject.getCacheDirectory(ClientProperties.getApplicationContext()) != null) {
if (!cacheDirectoryObject.getCacheDirectory(ClientProperties.getApplicationContext()).exists()) {
webViewCallback.error(CacheError.CACHE_DIRECTORY_DOESNT_EXIST, new Object[0]);
return;
}
CacheDirectoryType type = cacheDirectoryObject.getType();
if (type == null) {
webViewCallback.error(CacheError.CACHE_DIRECTORY_TYPE_NULL, new Object[0]);
return;
} else {
webViewCallback.invoke(type.name());
return;
}
}
webViewCallback.error(CacheError.CACHE_DIRECTORY_NULL, new Object[0]);
}
@WebViewExposed
public static void getFileContent(String str, String str2, WebViewCallback webViewCallback) {
Object encodeToString;
String fileIdToFilename = fileIdToFilename(str);
File file = new File(fileIdToFilename);
if (!file.exists()) {
webViewCallback.error(CacheError.FILE_NOT_FOUND, str, fileIdToFilename);
return;
}
try {
byte[] readFileBytes = Utilities.readFileBytes(file);
if (str2 == null) {
webViewCallback.error(CacheError.UNSUPPORTED_ENCODING, str, fileIdToFilename, str2);
return;
}
if (str2.equals("UTF-8")) {
encodeToString = Charset.forName("UTF-8").decode(ByteBuffer.wrap(readFileBytes)).toString();
} else if (str2.equals("Base64")) {
encodeToString = Base64.encodeToString(readFileBytes, 2);
} else {
webViewCallback.error(CacheError.UNSUPPORTED_ENCODING, str, fileIdToFilename, str2);
return;
}
webViewCallback.invoke(encodeToString);
} catch (IOException e6) {
webViewCallback.error(CacheError.FILE_IO_ERROR, str, fileIdToFilename, e6.getMessage() + ", " + e6.getClass().getName());
}
}
@WebViewExposed
public static void getFileInfo(String str, WebViewCallback webViewCallback) {
try {
webViewCallback.invoke(getFileJson(str));
} catch (JSONException e6) {
DeviceLog.exception("Error creating JSON", e6);
webViewCallback.error(CacheError.JSON_ERROR, new Object[0]);
}
}
private static JSONObject getFileJson(String str) throws JSONException {
JSONObject jSONObject = new JSONObject();
jSONObject.put("id", str);
File file = new File(fileIdToFilename(str));
if (file.exists()) {
jSONObject.put("found", true);
jSONObject.put(ATAdConst.NETWORK_REQUEST_PARAMS_KEY.BANNER_SIZE, file.length());
jSONObject.put("mtime", file.lastModified());
} else {
jSONObject.put("found", false);
}
return jSONObject;
}
@WebViewExposed
public static void getFilePath(String str, WebViewCallback webViewCallback) {
if (new File(fileIdToFilename(str)).exists()) {
webViewCallback.invoke(fileIdToFilename(str));
} else {
webViewCallback.error(CacheError.FILE_NOT_FOUND, new Object[0]);
}
}
@WebViewExposed
public static void getFiles(WebViewCallback webViewCallback) {
File cacheDirectory = SdkProperties.getCacheDirectory();
if (cacheDirectory == null) {
return;
}
DeviceLog.debug("Unity Ads cache: checking app directory for Unity Ads cached files");
File[] listFiles = cacheDirectory.listFiles(new FilenameFilter() {
@Override
public boolean accept(File file, String str) {
return str.startsWith(SdkProperties.getCacheFilePrefix());
}
});
if (listFiles == null || listFiles.length == 0) {
webViewCallback.invoke(new JSONArray());
}
try {
JSONArray jSONArray = new JSONArray();
for (File file : listFiles) {
String substring = file.getName().substring(SdkProperties.getCacheFilePrefix().length());
DeviceLog.debug("Unity Ads cache: found " + substring + ", " + file.length() + " bytes");
jSONArray.put(getFileJson(substring));
}
webViewCallback.invoke(jSONArray);
} catch (JSONException e6) {
DeviceLog.exception("Error creating JSON", e6);
webViewCallback.error(CacheError.JSON_ERROR, new Object[0]);
}
}
@WebViewExposed
public static void getFreeSpace(WebViewCallback webViewCallback) {
webViewCallback.invoke(Long.valueOf(Device.getFreeSpace(SdkProperties.getCacheDirectory())));
}
@WebViewExposed
public static void getHash(String str, WebViewCallback webViewCallback) {
webViewCallback.invoke(Utilities.Sha256(str));
}
@WebViewExposed
public static void getMetaData(String str, JSONArray jSONArray, WebViewCallback webViewCallback) {
try {
SparseArray<String> metaData = getMetaData(fileIdToFilename(str), jSONArray);
JSONArray jSONArray2 = new JSONArray();
for (int i6 = 0; i6 < metaData.size(); i6++) {
JSONArray jSONArray3 = new JSONArray();
jSONArray3.put(metaData.keyAt(i6));
jSONArray3.put(metaData.valueAt(i6));
jSONArray2.put(jSONArray3);
}
webViewCallback.invoke(jSONArray2);
} catch (IOException e6) {
webViewCallback.error(CacheError.FILE_IO_ERROR, e6.getMessage());
} catch (RuntimeException e7) {
webViewCallback.error(CacheError.INVALID_ARGUMENT, e7.getMessage());
} catch (JSONException e8) {
webViewCallback.error(CacheError.JSON_ERROR, e8.getMessage());
}
}
@WebViewExposed
public static void getProgressInterval(WebViewCallback webViewCallback) {
webViewCallback.invoke(Integer.valueOf(CacheThread.getProgressInterval()));
}
@WebViewExposed
public static void getTimeouts(WebViewCallback webViewCallback) {
webViewCallback.invoke(Integer.valueOf(CacheThread.getConnectTimeout()), Integer.valueOf(CacheThread.getReadTimeout()));
}
@WebViewExposed
public static void getTotalSpace(WebViewCallback webViewCallback) {
webViewCallback.invoke(Long.valueOf(Device.getTotalSpace(SdkProperties.getCacheDirectory())));
}
@WebViewExposed
public static void isCaching(WebViewCallback webViewCallback) {
webViewCallback.invoke(Boolean.valueOf(CacheThread.isActive()));
}
@WebViewExposed
public static void recreateCacheDirectory(WebViewCallback webViewCallback) {
if (SdkProperties.getCacheDirectory().exists()) {
webViewCallback.error(CacheError.CACHE_DIRECTORY_EXISTS, new Object[0]);
return;
}
SdkProperties.setCacheDirectory(null);
if (SdkProperties.getCacheDirectory() == null) {
webViewCallback.error(CacheError.CACHE_DIRECTORY_NULL, new Object[0]);
} else {
webViewCallback.invoke(new Object[0]);
}
}
@WebViewExposed
public static void setFileContent(String str, String str2, String str3, WebViewCallback webViewCallback) {
FileOutputStream fileOutputStream;
String fileIdToFilename = fileIdToFilename(str);
boolean z6 = true;
try {
byte[] bytes = str3.getBytes("UTF-8");
if (str2 != null && str2.length() > 0) {
if (str2.equals("Base64")) {
bytes = Base64.decode(str3, 2);
} else if (!str2.equals("UTF-8")) {
webViewCallback.error(CacheError.UNSUPPORTED_ENCODING, str, fileIdToFilename, str2);
return;
}
}
FileOutputStream fileOutputStream2 = null;
try {
try {
try {
fileOutputStream = new FileOutputStream(fileIdToFilename);
} catch (Exception e6) {
DeviceLog.exception("Error closing FileOutputStream", e6);
z6 = false;
if (!z6) {
}
}
} catch (FileNotFoundException unused) {
} catch (IOException unused2) {
}
} catch (Throwable th) {
th = th;
}
try {
fileOutputStream.write(bytes);
fileOutputStream.flush();
try {
fileOutputStream.close();
} catch (Exception e7) {
DeviceLog.exception("Error closing FileOutputStream", e7);
}
} catch (FileNotFoundException unused3) {
fileOutputStream2 = fileOutputStream;
webViewCallback.error(CacheError.FILE_NOT_FOUND, str, fileIdToFilename, str2);
if (fileOutputStream2 != null) {
fileOutputStream2.close();
}
z6 = false;
if (!z6) {
}
} catch (IOException unused4) {
fileOutputStream2 = fileOutputStream;
webViewCallback.error(CacheError.FILE_IO_ERROR, str, fileIdToFilename, str2);
if (fileOutputStream2 != null) {
fileOutputStream2.close();
}
z6 = false;
if (!z6) {
}
} catch (Throwable th2) {
th = th2;
fileOutputStream2 = fileOutputStream;
if (fileOutputStream2 != null) {
try {
fileOutputStream2.close();
} catch (Exception e8) {
DeviceLog.exception("Error closing FileOutputStream", e8);
}
}
throw th;
}
if (!z6) {
webViewCallback.invoke(new Object[0]);
}
} catch (UnsupportedEncodingException unused5) {
webViewCallback.error(CacheError.UNSUPPORTED_ENCODING, str, fileIdToFilename, str2);
}
}
@WebViewExposed
public static void setProgressInterval(Integer num, WebViewCallback webViewCallback) {
CacheThread.setProgressInterval(num.intValue());
webViewCallback.invoke(new Object[0]);
}
@WebViewExposed
public static void setTimeouts(Integer num, Integer num2, WebViewCallback webViewCallback) {
CacheThread.setConnectTimeout(num.intValue());
CacheThread.setReadTimeout(num2.intValue());
webViewCallback.invoke(new Object[0]);
}
@WebViewExposed
public static void stop(WebViewCallback webViewCallback) {
if (!CacheThread.isActive()) {
webViewCallback.error(CacheError.NOT_CACHING, new Object[0]);
} else {
CacheThread.cancel();
webViewCallback.invoke(new Object[0]);
}
}
@TargetApi(10)
private static SparseArray<String> getMetaData(String str, JSONArray jSONArray) throws JSONException, IOException, RuntimeException {
File file = new File(str);
SparseArray<String> sparseArray = new SparseArray<>();
if (file.exists()) {
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(file.getAbsolutePath());
for (int i6 = 0; i6 < jSONArray.length(); i6++) {
int i7 = jSONArray.getInt(i6);
String extractMetadata = mediaMetadataRetriever.extractMetadata(i7);
if (extractMetadata != null) {
sparseArray.put(i7, extractMetadata);
}
}
return sparseArray;
}
throw new IOException("File: " + file.getAbsolutePath() + " doesn't exist");
}
}