package org.mortbay.ijetty;
import java.io.File;
import java.io.IOException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.mortbay.ijetty.network.IRequestListener;
import org.mortbay.ijetty.network.InterfaceOp;
import org.mortbay.ijetty.util.AmlogicExt;
import org.mortbay.ijetty.util.ApkUtils;
import org.mortbay.ijetty.util.DateUtils;
import org.mortbay.ijetty.util.FileUtil;
import org.mortbay.ijetty.util.LogUtil;
import org.mortbay.ijetty.util.PlayListUtil;
import org.mortbay.ijetty.util.PropertiesUtils;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.WebSettings;
import android.os.Bundle;
public class HeartBeatThread
{
private final static String LOGCAT = "=>HeartBeatThread";
private Thread thread;
private boolean doneFlag = false;
private static HeartBeatThread instance;
private static boolean threadStartFlag = false;
private PropertiesUtils mPropertiesUtil = new PropertiesUtils();;
// String mActivityName = null;
public synchronized static HeartBeatThread getInstance()
{
if (instance == null)
instance = new HeartBeatThread();
return instance;
}
private HeartBeatThread()
{
doneFlag = false;
thread = new Thread()
{
@Override
public void run()
{
process(this);
}
};
thread.setName("Daemon HeartBeatThread thread");
thread.setDaemon(false);
}
public void startup()
{
if (threadStartFlag)
return;
Log.i(LOGCAT,"HeartBeatThread thread.start();");
thread.start();
}
@SuppressWarnings("deprecation")
public void shutdown()
{
if (threadStartFlag)
thread.stop();
Log.i(LOGCAT,"HeartBeatThread thread.stop();");
doneFlag = true;
}
public static final char SPLIT_CHAR = '|';
private void updateGroupId(String group_id)
{
//String group_id = respObj.optString("group_id","");
if (!TextUtils.isEmpty(group_id))
{
group_id = group_id.trim();
//Log.w(TAG,"===>" + group_id);
if (!group_id.equals(AppConstants.GROUP_ID))
{
AppConstants.GROUP_ID = group_id;
}
}
}
/*
* 从服务器更新播放连接地址,先判断连接地址是否有效
* */
private void updatePlayLink(String playURL)
{
//String playURL = respObj.optString("link","");
if (!TextUtils.isEmpty(playURL))
{
playURL = playURL.trim();
Log.w(LOGCAT,"===>playURL:" + playURL);
Log.w(LOGCAT,"===>CLIENT_CUR_PLAYURL:" + AppConstants.CLIENT_CUR_PLAYURL);
if (!playURL.equals(AppConstants.CLIENT_CUR_PLAYURL))
{
AppConstants.CLIENT_CUR_PLAYURL = playURL;
//保存URL到配置文件
File clientProps = new File(IJetty.__JETTY_DIR + "/" + IJetty.__ETC_DIR + "/properties.xml");
mPropertiesUtil.readPropertiesFileFromXML(clientProps.getAbsolutePath());
mPropertiesUtil.setPlayUrl(AppConstants.CLIENT_CUR_PLAYURL);
mPropertiesUtil.writePropertiesFileToXML(clientProps.getAbsolutePath());
IJetty.getInstance().mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
IJetty.getInstance().mWebView.loadUrl(AppConstants.CLIENT_CUR_PLAYURL);
}
}
}
/*
*从服务器更新播放清单,先判断是否有更新
* */
private void updatePlayList(String playListVersion)
{
if (!playListVersion.equals(PlayListUtil.playListVersion))
{
//Log.w(LOGCAT,"===>playListVersion:" + playListVersion);
//保存播单版本到配置文件
File clientProps = new File(IJetty.__JETTY_DIR + "/" + IJetty.__ETC_DIR + "/properties.xml");
mPropertiesUtil.readPropertiesFileFromXML(clientProps.getAbsolutePath());
mPropertiesUtil.setPlayListVersion(playListVersion);//保存节目单推送版本记录
mPropertiesUtil.writePropertiesFileToXML(clientProps.getAbsolutePath());
PlayListUtil.playListVersion = playListVersion;
//PlayListUtil.isPlayListChanged = true;//转PlayList线程处理
PlayListUtil.getJsonPlayList();
}
}
private void updateApks(String apkPushVersion)
{
//String apkPushVersion = respObj.optString("version_apk","");
if(!apkPushVersion.equals(ApkUtils.apkPushVersion))
{
File clientProps = new File(IJetty.__JETTY_DIR + "/" + IJetty.__ETC_DIR + "/properties.xml");
mPropertiesUtil.readPropertiesFileFromXML(clientProps.getAbsolutePath());
mPropertiesUtil.setApkPushVersion(apkPushVersion);//保存APK推送版本记录
mPropertiesUtil.writePropertiesFileToXML(clientProps.getAbsolutePath());
ApkUtils.apkPushVersion = apkPushVersion;
ApkUtils.isApkChanged = true;//转apk线程处理
}
}
private void updateRefresh(boolean refreshStatus)
{
//refresh
//boolean refreshStatus = respObj.optBoolean("refresh");//optString("refresh","");
//Log.w(LOGCAT,"refreshStatus:" + refreshStatus);
if(refreshStatus)
{
IJetty.getInstance().mWebView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK);
//mWebView.getSettings().setCacheMode( WebSettings.LOAD_NO_CACHE);
IJetty.getInstance().mWebView.clearHistory();
IJetty.getInstance().mWebView.clearFormData();
IJetty.getInstance().mWebView.clearCache(true);
IJetty.getInstance().mWebView.reload();
//IJetty.getInstance().mWebView.loadUrl(AppConstants.CLIENT_CUR_PLAYURL);
InterfaceOp.protoRefreshConfirm(new IRequestListener()
{
public void onError(Exception e)
{
LogUtil.log("protoRefreshConfirm onError: " + e.getMessage());
}
public void onComplete(boolean isError, String errMsg, JSONObject respObj)
{
//Log.e("smallstar", "heartbeat onComplete=>isError: " + isError + " respObj:" + respObj);
if (isError || (respObj == null))
{
return;
}
String result = respObj.optString("result","");
if (!result.equals("true"))
{
Log.w("protoRefreshConfirm return",result);
return;
}
}
});
}
}
public void UpdateUrlPlaylist()
{
//urlplaylist处理
if(!AppConstants.URLPLAYLIST.isEmpty())
{
Log.e(LOGCAT, "AppConstants.URLPLAYLIST:=" + AppConstants.URLPLAYLIST);
JSONArray jsonar=null;
String playUrl = "";
try {
jsonar = new JSONArray(AppConstants.URLPLAYLIST);
for(int i=0; i<jsonar.length(); i++)
{
JSONObject oj = jsonar.getJSONObject(i);
Long tsStart = Long.parseLong(oj.getString("time_start"));
Long tsEnd = Long.parseLong(oj.getString("time_end"));
Long tsNow = System.currentTimeMillis()/1000;
String ts = tsNow.toString();
if(tsStart < tsNow && tsNow < tsEnd)
{
playUrl = oj.getString("url");
//Log.v(LOGCAT,playUrl);
break;
}
}
if(!playUrl.isEmpty() && !playUrl.equals(AppConstants.CLIENT_CUR_PLAYURL))
{
IJetty.getInstance().mWebView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK);
//mWebView.getSettings().setCacheMode( WebSettings.LOAD_NO_CACHE);
IJetty.getInstance().mWebView.clearHistory();
IJetty.getInstance().mWebView.clearFormData();
IJetty.getInstance().mWebView.clearCache(true);
//IJetty.getInstance().mWebView.setIntegerProperty("loadUrlTimeoutValue", 60000);
IJetty.getInstance().mWebView.loadUrl(playUrl);
AppConstants.CLIENT_CUR_PLAYURL = playUrl;
}
if(playUrl.isEmpty() && !AppConstants.CLIENT_CUR_PLAYURL.equals(AppConstants.CLIENT_DEFAULT2_PLAYURL))
{
IJetty.getInstance().mWebView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK);
//mWebView.getSettings().setCacheMode( WebSettings.LOAD_NO_CACHE);
IJetty.getInstance().mWebView.clearHistory();
IJetty.getInstance().mWebView.clearFormData();
IJetty.getInstance().mWebView.clearCache(true);
IJetty.getInstance().mWebView.loadUrl(AppConstants.CLIENT_DEFAULT2_PLAYURL);
AppConstants.CLIENT_CUR_PLAYURL = AppConstants.CLIENT_DEFAULT2_PLAYURL;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
else
{
if(!AppConstants.CLIENT_CUR_PLAYURL.equals(AppConstants.CLIENT_DEFAULT2_PLAYURL))
{
IJetty.getInstance().mWebView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK);
//mWebView.getSettings().setCacheMode( WebSettings.LOAD_NO_CACHE);
IJetty.getInstance().mWebView.clearHistory();
IJetty.getInstance().mWebView.clearFormData();
IJetty.getInstance().mWebView.clearCache(true);
IJetty.getInstance().mWebView.loadUrl(AppConstants.CLIENT_DEFAULT2_PLAYURL);
AppConstants.CLIENT_CUR_PLAYURL = AppConstants.CLIENT_DEFAULT2_PLAYURL;
}
}
}
public void process(Thread thisThread)
{
threadStartFlag = true;
try
{
while (!doneFlag && (thread == thisThread))
{
try
{
if(ApkUtils.isHome())
{
Log.e("smallstar", "is home!..................");
ApkUtils.startApk("org.mortbay.ijetty", ".IJetty");
IJetty.getInstance().mWebView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK);
//mWebView.getSettings().setCacheMode( WebSettings.LOAD_NO_CACHE);
IJetty.getInstance().mWebView.clearHistory();
IJetty.getInstance().mWebView.clearFormData();
IJetty.getInstance().mWebView.clearCache(true);
IJetty.getInstance().mWebView.reload();
}
//TODO:检查是否安装了软件管理工具,如果没有安装到指定地址下载安装
if(!ApkUtils.isBackgroundRunning(IJetty.getInstance(), "com.smallstar.androidlibapp"))
{
Log.e("smallstar", "com.smallstar.androidlibapp is not running.");
ApkUtils.startApk("com.smallstar.androidlibapp", ".BootStartActivity");
}
//检查是否需要升级console.war
//Log.w("===smalsltar===", AppConstants.getMediaSdFolder() + "/console.war");
File warFile = new File(AppConstants.getMediaSdFolder() + "/console.war");
if(warFile.exists())
{
//(1)copy file to tmp,(2)rename war file,(3)stopService and delay,(4)starService,(5)install war file
try
{
Log.w("====smallstar=====", "(1)copy file to tmp");
FileUtil.copyFile(warFile, new File(IJetty.__JETTY_DIR+"/"+IJetty.__TMP_DIR +"/"+"console.war"));
Log.w("====smallstar=====", "(2)rename war file");
warFile.renameTo(new File(AppConstants.getMediaSdFolder() + "/console_old.war"));
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.w("====smallstar=====", "(3)stopService and delay");
IJetty.getInstance().stopService(new Intent(IJetty.getInstance(),IJettyService.class));
warFile = new File(IJetty.__JETTY_DIR+"/"+IJetty.__TMP_DIR + "/" + "console.war");
if(warFile.exists()){
try
{
File webappDir = new File (IJetty.__JETTY_DIR+"/"+IJetty.__WEBAPP_DIR);
Log.w("====smallstar=====", webappDir.getPath());
String name = warFile.getName();
if (name.endsWith(".war") || name.endsWith(".jar"))
name = name.substring(0, name.length()-4);
Log.w("====smallstar=====", "(5)install war file");
Installer.install(warFile, warFile.getPath(), webappDir, name, false);
warFile.delete();
}
catch (Exception e)
{
Log.e("Jetty", "Bad resource", e);
}
}
Log.w("====smallstar=====", "(4)starService");
Intent intent = new Intent(IJetty.getInstance(),IJettyService.class);
intent.putExtra(IJetty.getInstance().__PORT,IJetty.getInstance().__PORT_DEFAULT);
intent.putExtra(IJetty.getInstance().__NIO,IJetty.getInstance().__NIO_DEFAULT);
intent.putExtra(IJetty.getInstance().__SSL,IJetty.getInstance().__SSL_DEFAULT);
intent.putExtra(IJetty.getInstance().__CONSOLE_PWD,IJetty.getInstance().__CONSOLE_PWD_DEFAULT);
IJetty.getInstance().startService(intent);
}
InterfaceOp.protoHeartbeat(new IRequestListener()
{
public void onError(Exception e)
{
LogUtil.log("heartbeat onError: " + e.getMessage());
}
public void onComplete(boolean isError, String errMsg, JSONObject respObj)
{
Log.e(LOGCAT, "heartbeat onComplete=>isError: " + isError + " respObj:" + respObj);
if (isError || (respObj == null)) return;
updateGroupId(respObj.optString("group_id",""));
//TODO:通过PlayLink功能,强制终端一直播放指定连接
//updatePlayLink(respObj.optString("link",""));
updatePlayList(respObj.optString("version_program",""));
updateApks(respObj.optString("version_apk",""));
updateRefresh(respObj.optBoolean("refresh"));
UpdateUrlPlaylist();
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
catch (OutOfMemoryError e)
{
e.printStackTrace();
}
finally
{
SystemClock.sleep((AppConstants.HEARTBEAT_TIME - 3) * 1000);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
threadStartFlag = false;
}
}
}