/**
* Copyright (c) 2015 unfoldingWord
* http://creativecommons.org/licenses/MIT/
* See LICENSE file for details.
* Contributors:
* PJ Fechner <pj@actsmedia.com>
*/
package services;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import com.google.common.io.ByteStreams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.unfoldingword.mobile.R;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.ListIterator;
import model.DaoDBHelper;
import model.DataFileManager;
import model.daoModels.Book;
import model.daoModels.Version;
import model.parsers.MediaType;
import runnables.UpdateAndVerifyBookRunnable;
import runnables.UpdateLanguageLocaleRunnable;
import runnables.UpdateProjectsRunnable;
import utils.FileNameHelper;
import utils.UWPreferenceManager;
/**
* Created by PJ Fechner
* Service for adding the preloaded content to DB
*/
public class UWPreLoaderService extends UWUpdaterService {
private static final String TAG = "UWPreLoader";
public static final String BROAD_CAST_PRELOAD_SUCCESSFUL = "org.unfoldingword.mobile.PRELOAD_SUCCESSFUL";
private boolean hasUpdatedVersions = false;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
addRunnable(new PreloadVersionsRunnable());
return START_STICKY;
}
@Override
protected void stopService() {
// This is to cause the book text to only be added after all other content
if(!hasUpdatedVersions) {
addRunnable(new PreloadTextRunnable());
hasUpdatedVersions = true;
}
else {
getApplicationContext().sendBroadcast(new Intent(BROAD_CAST_PRELOAD_SUCCESSFUL));
this.stopSelf();
}
}
class PreloadVersionsRunnable implements Runnable {
@Override
public void run() {
updateVersions();
updateLocales();
runnableFinished();
}
private void updateVersions(){
try {
String jsonString = loadDbFile(getApplicationContext().getResources().getString(R.string.preloaded_catalog_file_name));
JSONObject jsonObject = new JSONObject(jsonString);
long modified = jsonObject.getLong(UWUpdaterService.MODIFIED_JSON_KEY);
UWPreferenceManager.setLastUpdatedDate(getApplicationContext(), modified);
// UWDataParser.getInstance(getApplicationContext()).updateProjects(jsonObject.getJSONArray(UWDataParser.PROJECTS_JSON_KEY), false);
addRunnable(new UpdateProjectsRunnable(jsonObject.getJSONArray(UWUpdaterService.PROJECTS_JSON_KEY), getThis()));
}
catch (JSONException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
private void updateLocales(){
try {
String jsonString = loadDbFile(getApplicationContext().getResources().getString(R.string.preloaded_locales_file_name));
JSONArray locales = new JSONArray(jsonString);
UWPreferenceManager.setHasDownloadedLocales(getApplicationContext(), true);
addRunnable(new UpdateLanguageLocaleRunnable(locales, getThis()));
}
catch (JSONException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
}
class PreloadTextRunnable implements Runnable{
@Override
public void run() {
List<Book> books = DaoDBHelper.getDaoSession(getApplicationContext())
.getBookDao().queryBuilder().list();
ListIterator li = books.listIterator(books.size());
// Iterate in reverse to start with the stories.
while(li.hasPrevious()) {
Book book = (Book) li.previous();
try {
String signature = loadDbFile(FileNameHelper.getSaveFileNameFromUrl(book.getSignatureUrl()));
if(signature == null){
signature = "";
}
byte[] text = loadDbFileBytes(FileNameHelper.getSaveFileNameFromUrl(book.getSourceUrl()));
DataFileManager.saveDataForBook(getApplicationContext(), book, text, MediaType.MEDIA_TYPE_TEXT);
DataFileManager.saveSignatureForBook(getApplicationContext(), book, signature.getBytes(), MediaType.MEDIA_TYPE_TEXT);
// saveFile(text, book.getSourceUrl());
// saveFile(signature.getBytes("UTF-8"), book.getSignatureUrl());
UpdateAndVerifyBookRunnable runnable = new UpdateAndVerifyBookRunnable(book, getThis(), text, signature);
addRunnable(runnable, book.getVersion(), MediaType.MEDIA_TYPE_TEXT);
}
catch (IOException e){
e.printStackTrace();
}
}
List<Version> versions = DaoDBHelper.getDaoSession(getApplicationContext())
.getVersionDao().queryBuilder().list();
for(Version version : versions){
version.update();
}
runnableFinished();
}
}
private void saveFile(byte[] bytes, String url){
try{
FileOutputStream fos = getApplicationContext().openFileOutput(FileNameHelper.getSaveFileNameFromUrl(url), Context.MODE_PRIVATE);
fos.write(bytes);
fos.close();
Log.i(TAG, "USFM File Saved");
}
catch (IOException e){
e.printStackTrace();
Log.e(TAG, "Error when saving USFM");
}
}
private byte[] loadDbFileBytes(String fileName) throws IOException{
// Open your local model.db as the input stream
InputStream inputStream = getApplicationContext().getAssets().open("preloaded_content/" + fileName);
byte[] file = ByteStreams.toByteArray(inputStream);
return file;
}
private String loadDbFile(String fileName) throws IOException{
// Open your local model.db as the input stream
InputStream inputStream = getApplicationContext().getAssets().open("preloaded_content/" + fileName);
String file = new String(ByteStreams.toByteArray(inputStream));
return file;
}
}