/** * Copyright (c) 2015 unfoldingWord * http://creativecommons.org/licenses/MIT/ * See LICENSE file for details. * Contributors: * PJ Fechner <pj@actsmedia.com> */ package runnables; import android.content.Context; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import model.DataFileManager; import model.DownloadState; import model.UWDatabaseModel; import model.daoModels.Book; import model.daoModels.DaoSession; import model.daoModels.Version; import model.parsers.MediaType; import services.UWUpdaterService; import tasks.ModelCreator; import tasks.ModelSaveOrUpdater; /** * Created by PJ Fechner on 6/17/15. * Runnable for updating a list of books */ public class UpdateBooksRunnable implements Runnable{ private static final String TAG = "UpdateBooksRunnable"; public static final String CHAPTERS_JSON_KEY = "chapters"; public static final String MEDIA_JSON_KEY = "media"; public static final String AUDIO_JSON_KEY = "audio"; private JSONArray jsonModels; private UWUpdaterService updater; private Version parent; public UpdateBooksRunnable(JSONArray jsonModels, UWUpdaterService updater, Version parent) { this.jsonModels = jsonModels; this.updater = updater; this.parent = parent; } @Override public void run() { parseModels(jsonModels); } private void parseModels(JSONArray models){ for(int i = 0; i < models.length(); i++){ try { updateModel(models.getJSONObject(i), i == (models.length() - 1)); } catch (JSONException e){ e.printStackTrace(); } } } private void updateModel(final JSONObject jsonObject, final boolean isLast){ new ModelCreator(new Book(), parent, new ModelCreator.ModelCreationListener() { @Override public void modelWasCreated(UWDatabaseModel model) { if(model instanceof Book) { UWDatabaseModel shouldContinueUpdate = new BookSaveOrUpdater(updater.getApplicationContext()).start(model); if(shouldContinueUpdate != null){ updateChapters((Book) shouldContinueUpdate); updateMedia(jsonObject, (Book) shouldContinueUpdate); } if(isLast){ updater.runnableFinished(parent, MediaType.MEDIA_TYPE_TEXT); } } } }).execute(jsonObject); } private void updateChapters(final Book parent){ DataFileManager.getStateOfContent(updater.getApplicationContext(), parent.getVersion(), MediaType.MEDIA_TYPE_TEXT, new DataFileManager.GetDownloadStateResponse() { @Override public void foundDownloadState(DownloadState state) { if(state == DownloadState.DOWNLOAD_STATE_DOWNLOADED) { updater.addRunnable(new UpdateBookContentRunnable(parent, updater), parent.getVersion(), MediaType.MEDIA_TYPE_TEXT); } } }); } private void updateMedia(JSONObject bookJson, Book book){ try { updater.addRunnable(new UpdateAudioBookRunnable(bookJson.getJSONObject(MEDIA_JSON_KEY).getJSONObject(AUDIO_JSON_KEY), updater, book)); } catch (JSONException e ){ e.printStackTrace(); } } private class BookSaveOrUpdater extends ModelSaveOrUpdater { public BookSaveOrUpdater(Context context) { super(context); } @Override protected UWDatabaseModel getExistingModel(String slug, DaoSession session) { return Book.getModelForUniqueSlug(slug, session); } } }