package com.adsdk.sdk.video;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.http.client.methods.HttpGet;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.SparseArray;
import android.util.TypedValue;
public class ResourceManager {
public static final int RESOURCE_LOADED_MSG = 100;
public static final int TYPE_UNKNOWN = -1;
public static final int TYPE_FILE = 0;
public static final int TYPE_ZIP = 1;
public static boolean sDownloading = false;
public static boolean sCancel = false;
public static HttpGet sDownloadGet;
public static final String VERSION = "version.txt";
public static final String TOPBAR_BG = "bar.png";
public static final String BOTTOMBAR_BG = "bar.png";
public static final String PLAY_ICON = "video_play.png";
public static final String PAUSE_ICON = "video_pause.png";
public static final String REPLAY_ICON = "video_replay.png";
public static final String BACK_ICON = "browser_back.png";
public static final String FORWARD_ICON = "browser_forward.png";
public static final String RELOAD_ICON = "video_replay.png";
public static final String EXTERNAL_ICON = "browser_external.png";
public static final String SKIP_ICON = "skip.png";
public static final String CLOSE_BUTTON_NORMAL = "close_button_normal.png";
public static final String CLOSE_BUTTON_PRESSED = "close_button_pressed.png";
public static final int DEFAULT_TOPBAR_BG_RESOURCE_ID = -1;
public static final int DEFAULT_BOTTOMBAR_BG_RESOURCE_ID = -2;
public static final int DEFAULT_PLAY_IMAGE_RESOURCE_ID = -11;
public static final int DEFAULT_PAUSE_IMAGE_RESOURCE_ID = -12;
public static final int DEFAULT_REPLAY_IMAGE_RESOURCE_ID = -13;
public static final int DEFAULT_BACK_IMAGE_RESOURCE_ID = -14;
public static final int DEFAULT_FORWARD_IMAGE_RESOURCE_ID = -15;
public static final int DEFAULT_RELOAD_IMAGE_RESOURCE_ID = -16;
public static final int DEFAULT_EXTERNAL_IMAGE_RESOURCE_ID = -17;
public static final int DEFAULT_SKIP_IMAGE_RESOURCE_ID = -18;
public static final int DEFAULT_CLOSE_BUTTON_NORMAL_RESOURCE_ID = -29;
public static final int DEFAULT_CLOSE_BUTTON_PRESSED_RESOURCE_ID = -30;
private static HashMap<Integer, Drawable> sResources = new HashMap<Integer,Drawable>();
private Handler mHandler;
private HashMap<Integer, Drawable> mResources = new HashMap<Integer,Drawable>();
public static Drawable getDefaultResource(int resId) {
return sResources.get(resId);
}
public static Drawable getDefaultSkipButton(Context ctx){
return buildDrawable(ctx, SKIP_ICON);
}
public static boolean resourcesInstalled(Context ctx) {
boolean result = false;
String[] files = ctx.fileList();
for (int i = 0; i < files.length; i++) {
if (VERSION.equals(files[i])) {
return true;
}
}
return result;
}
public static long getInstalledVersion(Context ctx) {
long result = -1;
FileInputStream in = null;
try {
in = ctx.openFileInput(VERSION);
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
BufferedReader reader = new BufferedReader(isr);
String version = reader.readLine();
result = Long.valueOf(version).longValue();
} catch (Exception e) {
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
}
}
}
return result;
}
public static void saveInstalledVersion(Context ctx, long version) {
FileOutputStream out = null;
try {
out = ctx.openFileOutput(VERSION, Context.MODE_PRIVATE);
OutputStreamWriter osr = new OutputStreamWriter(out, "UTF-8");
osr.write(String.valueOf(version));
osr.flush();
} catch (Exception e) {
} finally {
if (out != null) {
try {
out.close();
} catch (Exception e) {
}
}
}
}
public void releaseInstance(){
Iterator<Entry<Integer, Drawable>> it = mResources.entrySet().iterator();
while(it.hasNext()) {
Entry<Integer, Drawable> pairsEntry = (Entry<Integer, Drawable>)it.next();
it.remove();
BitmapDrawable d = (BitmapDrawable) pairsEntry.getValue();
}
assert(mResources.size()==0);
System.gc();
}
private static void initDefaultResource(Context ctx, int resource) {
switch (resource) {
case DEFAULT_PLAY_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_PLAY_IMAGE_RESOURCE_ID,
PLAY_ICON);
break;
case DEFAULT_PAUSE_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_PAUSE_IMAGE_RESOURCE_ID,
PAUSE_ICON);
break;
case DEFAULT_REPLAY_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_REPLAY_IMAGE_RESOURCE_ID,
REPLAY_ICON);
break;
case DEFAULT_BACK_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_BACK_IMAGE_RESOURCE_ID,
BACK_ICON);
break;
case DEFAULT_FORWARD_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_FORWARD_IMAGE_RESOURCE_ID,
FORWARD_ICON);
break;
case DEFAULT_RELOAD_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_RELOAD_IMAGE_RESOURCE_ID,
RELOAD_ICON);
break;
case DEFAULT_EXTERNAL_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_EXTERNAL_IMAGE_RESOURCE_ID,
EXTERNAL_ICON);
break;
case DEFAULT_SKIP_IMAGE_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_SKIP_IMAGE_RESOURCE_ID,
SKIP_ICON);
break;
case DEFAULT_TOPBAR_BG_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_TOPBAR_BG_RESOURCE_ID, TOPBAR_BG);
break;
case DEFAULT_BOTTOMBAR_BG_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_BOTTOMBAR_BG_RESOURCE_ID,
BOTTOMBAR_BG);
break;
case DEFAULT_CLOSE_BUTTON_NORMAL_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_CLOSE_BUTTON_NORMAL_RESOURCE_ID,
CLOSE_BUTTON_NORMAL);
break;
case DEFAULT_CLOSE_BUTTON_PRESSED_RESOURCE_ID:
registerImageResource(ctx, DEFAULT_CLOSE_BUTTON_PRESSED_RESOURCE_ID,
CLOSE_BUTTON_PRESSED);
break;
}
}
private static void registerImageResource(Context ctx, int resId,
String name) {
Drawable d = buildDrawable(ctx, name);
if (d != null) {
sResources.put(resId, d);
}
}
private static Drawable buildDrawable(Context ctx, String name) {
InputStream in = null;
try {
in = ctx.getClass().getClassLoader()
.getResourceAsStream("defaultresources/" + name);
Bitmap b = BitmapFactory.decodeStream(in);
if (b != null) {
DisplayMetrics m = ctx.getResources().getDisplayMetrics();
int w = b.getWidth();
int h = b.getHeight();
int imageWidth = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, w, m);
int imageHeight = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, h, m);
if ((imageWidth != w) || (imageHeight != h)) {
b = Bitmap.createScaledBitmap(b, imageWidth, imageHeight,
false);
}
return new BitmapDrawable(ctx.getResources(), b);
}
} catch (Exception e) {
} finally {
if (in != null) {
try {
in.close();
in = null;
} catch (Exception e) {
}
}
}
return null;
}
public static boolean isDownloading() {
return sDownloading;
}
public static void cancel() {
sCancel = true;
if (sDownloadGet != null) {
sDownloadGet.abort();
sDownloadGet = null;
}
sResources.clear();
}
public ResourceManager(Context ctx, Handler h) {
mHandler = h;
}
public void fetchResource(Context ctx, String url, int resourceId) {
if (sResources.get(resourceId) == null) {
new FetchImageTask(ctx, url, resourceId).execute();
}
}
public boolean containsResource(int resourceId) {
return (mResources.get(resourceId) != null || mResources
.get(resourceId) != null);
}
public Drawable getResource(Context ctx, int resourceId) {
BitmapDrawable d;
d = (BitmapDrawable) mResources.get(resourceId);
if(d!=null){
return d;
}
return ResourceManager.getStaticResource(ctx, resourceId);
}
public static Drawable getStaticResource(Context ctx, int resourceId) {
BitmapDrawable d = (BitmapDrawable) sResources.get(resourceId);
if (d == null || d.getBitmap().isRecycled()) {
initDefaultResource(ctx, resourceId);
d = (BitmapDrawable) sResources.get(resourceId);
}
return d;
}
private class FetchImageTask extends AsyncTask<Void, Void, Boolean> {
String mUrl;
int mResourceId;
Context mContext;
public FetchImageTask(Context ctx, String url, int resId) {
mContext = ctx;
mUrl = url;
mResourceId = resId;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
Message msg = mHandler.obtainMessage(RESOURCE_LOADED_MSG,
mResourceId, 0);
mHandler.sendMessage(msg);
}
@Override
protected Boolean doInBackground(Void... params) {
Drawable d = null;
if ((mUrl != null) && (mUrl.length() > 0)) {
d = fetchImage(mUrl);
}
if (d != null) {
mResources.put(mResourceId, d);
return true;
}
return false;
}
private Drawable fetchImage(String urlString) {
try {
URL url = new URL(urlString);
InputStream is = (InputStream) url.getContent();
Bitmap b = BitmapFactory.decodeStream(is);
if (b != null) {
DisplayMetrics m = mContext.getResources()
.getDisplayMetrics();
int w = b.getWidth();
int h = b.getHeight();
int imageWidth = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, w, m);
int imageHeight = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, h, m);
if ((imageWidth != w) || (imageHeight != h)) {
b = Bitmap.createScaledBitmap(b, imageWidth,
imageHeight, false);
}
return new BitmapDrawable(mContext.getResources(), b);
}
} catch (Exception e) {
}
return null;
}
}
}