package com.salama.android.baseapp;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger;
import com.salama.android.dataservice.SalamaDataService;
import com.salama.android.dataservice.SalamaDataServiceConfig;
import com.salama.android.dataservice.WebService;
import com.salama.android.jsservice.base.natives.SalamaNativeService;
import com.salama.android.support.ServiceSupportApplication;
import com.salama.android.support.ServiceSupportUtil;
import com.salama.android.util.HexUtil;
import com.salama.android.util.SSLog;
import com.salama.android.webcore.WebController;
import com.salama.android.webcore.WebManager;
public class BaseAppService {
private final static String LOG_TAG = BaseAppService.class.getSimpleName();
public final static String DEFAULT_WEB_PACKAGE_DIR = "html";
public final static String DEFAULT_WEB_RESOURCE_DIR = "res";
private static boolean _debugMode = false;
// --------------- arguments ---------------
private final String _udid;
private final int _httpRequestTimeoutSeconds;
private final String _webPackageDirName;
private final String _webResourceDirName;
//private final File _webBaseDir = null;
// --------------- variables ----------------
private String _bundleId = null;
//private SalamaDataServiceConfig _config;
private SalamaDataService _dataService;
private String _systemLanguage = null;
//private String _systemLanguagePrefix = null;
private String _textFileName = null;
private SalamaNativeService _nativeService = null;
private WebService _webService = null;
private AtomicInteger _dataIdSeq = new AtomicInteger(0);
public static void setDebugMode(boolean debugMode) {
_debugMode = debugMode;
if (_debugMode) {
//默认debug模式下,html.zip每次都解压。正式发布时,设置debugMode为false,软件发布版本发生变化时,html.zip会被解压。
WebController.setDebugMode(true);
//默认debugLevel,正式发布时改为errorLevel
SSLog.setSSLogLevel(SSLog.SSLogLevelDebug);
} else {
WebController.setDebugMode(false);
//默认debugLevel,正式发布时改为errorLevel
SSLog.setSSLogLevel(SSLog.SSLogLevelError);
}
}
public static boolean isDebugMode() {
return _debugMode;
}
public String getUdid() {
return _udid;
}
public String getBundleId() {
return _bundleId;
}
public String getSystemLanguage() {
return _systemLanguage;
}
public SalamaDataService getDataService() {
return _dataService;
}
public WebService getWebService() {
return _webService;
}
public SalamaNativeService getNativeService() {
return _nativeService;
}
public String getTextByKey(String key) {
return ServiceSupportUtil.getStringsValueByKey(key, _textFileName);
}
/**
* 生成dataId(可以作为本地数据库的数据主键)
*/
public String generateNewDataId() {
//It is unlikely that count of generated id is more than Short.MAX_VALUE in 1 millisecond
short seq = (short)(_dataIdSeq.incrementAndGet() & 0xFFFF);
return _udid
.concat(HexUtil.toHexString(System.currentTimeMillis()))
.concat(HexUtil.toHexString(seq))
;
}
/**
*
* @param debugMode Optional
* @param udid Required
* @param webPackageDirName Optional
* @param webResourceDirName Optional
*/
public BaseAppService(
String udid,
int httpRequestTimeoutSeconds,
String webPackageDirName,
String webResourceDirName
) {
_udid = udid;
_httpRequestTimeoutSeconds = httpRequestTimeoutSeconds;
_webPackageDirName = webPackageDirName;
_webResourceDirName = webResourceDirName;
//get bundle id
_bundleId = ServiceSupportApplication.singleton().getPackageName();
SSLog.i(LOG_TAG, "_udid:" + _udid);
SSLog.i(LOG_TAG, "_httpRequestTimeoutSeconds:" + _httpRequestTimeoutSeconds);
SSLog.i(LOG_TAG, "_webPackageDirName:" + _webPackageDirName);
SSLog.i(LOG_TAG, "_webResourceDirName:" + _webResourceDirName);
SSLog.i(LOG_TAG, "_bundleId:" + _bundleId);
checkTextFile();
initWebController();
initServices();
}
protected void initWebController() {
final String webPackageName = _webPackageDirName;
int htmlId = ServiceSupportApplication.singleton().getResources().getIdentifier(
webPackageName, "raw", ServiceSupportApplication.singleton().getPackageName());
SSLog.i(LOG_TAG, "htmlId:" + htmlId);
InputStream htmlPackageStream = ServiceSupportApplication.singleton().
getResources().openRawResource(htmlId);
try {
WebManager.initWithWebPackageName(webPackageName, htmlPackageStream);
SSLog.i(LOG_TAG, "webBaseDir:" + WebManager.getWebController().getWebBaseDirPath());
SSLog.i(LOG_TAG, "webRootDir:" + WebManager.getWebController().getWebRootDirPath());
} catch(IOException e) {
throw new RuntimeException(e);
}
}
protected void initServices() {
_dataService = new SalamaDataService(makeDataServiceConfig());
_nativeService = new SalamaNativeService(_dataService);
_webService = new WebService();
_webService.setRequestTimeoutSeconds(_httpRequestTimeoutSeconds);
_webService.setResourceFileManager(_dataService.getResourceFileManager());
}
private SalamaDataServiceConfig makeDataServiceConfig() {
SalamaDataServiceConfig config = new SalamaDataServiceConfig();
config.setHttpRequestTimeout(_httpRequestTimeoutSeconds);
//resource directory name
File resDir = new File(WebManager.getWebController().getWebRootDirPath(), _webResourceDirName);
config.setResourceStorageDirPath(resDir.getAbsolutePath());
//local Sqlite file name
if(!DEFAULT_WEB_PACKAGE_DIR.equals(_webPackageDirName)) {
config.setDbName("localDB" + "_" + _webPackageDirName);
} else {
config.setDbName("localDB");
}
return config;
}
private void checkTextFile() {
_systemLanguage = Locale.getDefault().getLanguage();
SSLog.i(LOG_TAG, "_systemLanguage:" + _systemLanguage);
//init .strings file
_textFileName = "text_".concat(_systemLanguage.substring(0, 2));
int textFileId = ServiceSupportApplication.singleton().getResources().getIdentifier(
_textFileName, "raw", ServiceSupportApplication.singleton().getPackageName());
if(textFileId == 0) {
//file not exists
SSLog.i(LOG_TAG, _textFileName + ".strings does not exist. Change to use text_en.strings");
_textFileName = "text_en";
textFileId = ServiceSupportApplication.singleton().getResources().getIdentifier(
_textFileName, "raw", ServiceSupportApplication.singleton().getPackageName());
}
SSLog.i(LOG_TAG, "_textFileName:" + _textFileName + " textFileId:" + textFileId);
if(textFileId != 0) {
try {
ServiceSupportUtil.loadStringsFile(_textFileName,
ServiceSupportApplication.singleton().getResources().openRawResource(textFileId));
} catch (Exception e) {
SSLog.e(LOG_TAG, "Error in openning file:" + _textFileName, e);
}
}
}
protected void printWebDirFiles() {
File webBaseDir = new File(WebManager.getWebController().getWebBaseDirPath());
SSLog.d(LOG_TAG, "list webBaseDir:" + webBaseDir);
printSubFiles(webBaseDir);
File webRootDir = new File(WebManager.getWebController().getWebRootDirPath());
SSLog.d(LOG_TAG, "list webRootDir:" + webRootDir);
printSubFiles(webRootDir);
}
private void printSubFiles(File dir) {
File[] files = dir.listFiles();
if(files != null) {
for(File file : files) {
SSLog.d(LOG_TAG, "isDir:" + file.isDirectory() + " path:" + file.getName());
}
}
}
}