diff --git a/src/com/androidquery/callback/AbstractAjaxCallback.java b/src/com/androidquery/callback/AbstractAjaxCallback.java index 1fbb68a7..2071af96 100644 --- a/src/com/androidquery/callback/AbstractAjaxCallback.java +++ b/src/com/androidquery/callback/AbstractAjaxCallback.java @@ -145,6 +145,7 @@ public abstract class AbstractAjaxCallback implements Runnable{ private long expire; private String encoding = "UTF-8"; private WeakReference act; + private WeakReference ctx; private int method = Constants.METHOD_DETECT; private HttpUriRequest request; @@ -165,6 +166,7 @@ private void clear(){ transformer = null; ah = null; act = null; + ctx = null; } /** @@ -884,10 +886,8 @@ public void async(Activity act){ AQUtility.warn("Warning", "type() is not called with response type."); return; } - this.act = new WeakReference(act); async((Context) act); - } @@ -898,7 +898,7 @@ public void async(Activity act){ * @param context the context */ public void async(Context context){ - + this.ctx = new WeakReference(context); if(status == null){ status = new AjaxStatus(); status.redirect(url).refresh(refresh); @@ -949,7 +949,6 @@ public void failure(int code, String message){ private void work(Context context){ - T object = memGet(url); if(object != null){ @@ -985,7 +984,6 @@ public void run() { AQUtility.debug(e); status.code(AjaxStatus.NETWORK_ERROR).done(); } - if(!status.getReauth()){ //if doesn't need to reauth if(uiCallback){ @@ -1015,6 +1013,11 @@ private void backgroundWork(){ if(result == null){ datastoreWork(); } + + if(result == null){ + assetsWork(); + } + if(result == null){ networkWork(); @@ -1072,6 +1075,24 @@ private void datastoreWork(){ } } + private static final String PREFIX_ASSETS = "assets://"; + + private void assetsWork(){ + if (url.startsWith(PREFIX_ASSETS) == false){ + return; + } + try { + String u = url.substring(PREFIX_ASSETS.length()); + InputStream is = ctx.get().getAssets().open(u); + status.data(AQUtility.toBytes(is)).source(AjaxStatus.ASSETS) + .code(200).done(); + result = transform(url, status.getData(), status); + } catch (IOException e) { + AQUtility.debug(e); + status.code(AjaxStatus.ASSETS_ERROR).message(e.getMessage()); + } + } + private boolean reauth; private void networkWork(){ diff --git a/src/com/androidquery/callback/AjaxStatus.java b/src/com/androidquery/callback/AjaxStatus.java index 17c4b6bb..e0074bbc 100644 --- a/src/com/androidquery/callback/AjaxStatus.java +++ b/src/com/androidquery/callback/AjaxStatus.java @@ -51,11 +51,14 @@ public class AjaxStatus { /** Source DEVICE. */ public static final int DEVICE = 5; - + + /** Source ASSET. */ + public static final int ASSETS = 6; + public static final int NETWORK_ERROR = -101; public static final int AUTH_ERROR = -102; public static final int TRANSFORM_ERROR = -103; - + public static final int ASSETS_ERROR = -104; private int code = 200; private String message = "OK";