/* * Created by LuaView. * Copyright (c) 2017, Alibaba Group. All rights reserved. * * This source code is licensed under the MIT. * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree. */ package com.taobao.luaview.global; import android.content.Context; import android.text.TextUtils; import com.taobao.luaview.scriptbundle.LuaScriptManager; import com.taobao.luaview.scriptbundle.ScriptBundle; import com.taobao.luaview.scriptbundle.asynctask.ScriptBundleDownloadTask; import com.taobao.luaview.scriptbundle.asynctask.ScriptBundleUltimateLoadTask; import com.taobao.luaview.scriptbundle.asynctask.SimpleTask1; import com.taobao.luaview.scriptbundle.asynctask.delegate.ScriptBundleUnpackDelegate; import com.taobao.luaview.util.FileUtil; import org.luaj.vm2.LuaValue; /** * script loader * * @author song * @date 15/11/10 */ public class LuaScriptLoader { private Context mContext; public LuaScriptLoader(final Context context) { if (context != null) { try { this.mContext = context.getApplicationContext(); } catch (Exception e) { e.printStackTrace(); } } LuaScriptManager.init(context); } public interface ScriptLoaderCallback { void onScriptLoaded(final ScriptBundle bundle);//脚本加载 } /** * 脚本运行回调 */ public interface ScriptExecuteCallback { /** * 脚本准备完毕, 返回true,表示需要自己处理执行,onScriptCompiled,onScriptExecuted不会被执行,返回false表示系统继续执行 * * @param bundle * @return */ boolean onScriptPrepared(ScriptBundle bundle); /** * 脚本编译完成,参数表示编译之后的结果,不保证一定被调用到 * 返回true,表示需要自己处理执行,返回false,表示系统继续执行 * * @param value */ boolean onScriptCompiled(LuaValue value, LuaValue context, LuaValue view); /** * 脚本执行完成,参数表示是否执行成功,保证一定被调用到 * * @param uri 原始的加载url * @param executedSuccess */ void onScriptExecuted(String uri, boolean executedSuccess); } //-----------------------------------------static methods--------------------------------------- /** * 将asset目录下所有bundle包解压缩出来,一般在初始化的时候调用 * * @param basePath */ public void unpackAllAssetBundle(final String basePath) { if (basePath != null) { ScriptBundleUnpackDelegate.unpackAllAssetScripts(mContext, basePath); } } /** * clear invalid bundle of given url * TODO 在脚本加载失败的时候调用清理函数 * * @param url */ public static void clearInvalidBundle(final String url) { if (!TextUtils.isEmpty(url)) { new SimpleTask1<Void>() { @Override protected Void doInBackground(Object... params) { String folderPath = LuaScriptManager.buildScriptBundleFolderPath(url); FileUtil.delete(folderPath); return null; } }.executeInPool(); } } //--------------------------------lua script get and decode------------------------------------- /** * fetch a script from network (if needed) or from local file system * * @param url * @param callback */ public void load(final String url, final ScriptLoaderCallback callback) { load(url, null, callback); } /** * fetch a script from network (if needed) or from local file system * * @param url * @param sha256 * @param callback */ public void load(final String url, final String sha256, final ScriptLoaderCallback callback) { new ScriptBundleUltimateLoadTask(mContext, callback).load(url, sha256); } //--------------------------------preload script------------------------------------------------ /** * preload script * * @param url * @param sha256 */ public void preload(final String url, final String sha256) { new ScriptBundleUltimateLoadTask(mContext, null).load(url, sha256); } /** * download script * * @param url * @param sha256 */ public void download(final String url, final String sha256) { if (!LuaScriptManager.existsScriptBundle(url)) {//load local new ScriptBundleDownloadTask(mContext, null).executeInPool(url, sha256); } } }