package com.dotcool.reader.task;
import java.io.File;
import java.util.ArrayList;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.os.AsyncTask;
import android.util.Log;
import com.dotcool.reader.LNReaderApplication;
import com.dotcool.R;
import com.dotcool.reader.callback.CallbackEventData;
import com.dotcool.reader.callback.ICallbackEventData;
import com.dotcool.reader.callback.ICallbackNotifier;
import com.dotcool.reader.dao.NovelsDao;
import com.dotcool.reader.model.BookModel;
import com.dotcool.reader.model.ImageModel;
import com.dotcool.reader.model.NovelContentModel;
import com.dotcool.reader.model.PageModel;
public class RelinkImagesTask extends AsyncTask<Void, ICallbackEventData, Void> implements ICallbackNotifier {
private static final String TAG = RelinkImagesTask.class.toString();
private final String rootPath;
private ICallbackNotifier callback;
private String source;
private final boolean hasError = false;
private int updated;
public static RelinkImagesTask instance;
public static RelinkImagesTask getInstance() {
return instance;
}
public static RelinkImagesTask getInstance(String rootPath, ICallbackNotifier callback, String source) {
if (instance == null || instance.getStatus() == Status.FINISHED) {
instance = new RelinkImagesTask(rootPath, callback, source);
}
else {
instance.setCallback(callback, source);
}
return instance;
}
public void setCallback(ICallbackNotifier callback, String source) {
this.callback = callback;
this.source = source;
}
private RelinkImagesTask(String rootPath, ICallbackNotifier callback, String source) {
this.rootPath = rootPath;
this.callback = callback;
this.source = source;
}
public void onCallback(ICallbackEventData message) {
publishProgress(message);
}
@Override
protected Void doInBackground(Void... params) {
processImageInContents();
processBigImage();
return null;
}
private void processBigImage() {
ArrayList<ImageModel> images = NovelsDao.getInstance().getAllImages();
int count = 1;
for (ImageModel image : images) {
String message = LNReaderApplication.getInstance().getApplicationContext().getResources().getString(R.string.relink_task_progress2, image.getName(), count, images.size());
publishProgress(new CallbackEventData(message));
String oldPath = image.getPath();
// skip if file exists
if (new File(oldPath).exists()) {
Log.d(TAG, "Skipping: " + oldPath);
continue;
}
String newPath = oldPath.replaceAll("[\\w/\\./!$%^&*()_+|~\\={}\\[\\]:\";'<>?,-]+/project/images/", rootPath + "/project/images/");
Log.i(TAG, "Trying to update big image: " + oldPath + " => " + newPath);
if (new File(newPath).exists()) {
Log.i(TAG, "Updated: " + oldPath + " => " + newPath);
image.setPath(newPath);
NovelsDao.getInstance().insertImage(image);
++updated;
}
else {
Log.w(TAG, "File doesn't exists: " + newPath);
}
++count;
}
}
private void processImageInContents() {
// get all contents
ArrayList<PageModel> pages = NovelsDao.getInstance().getAllContentPageModel();
updated = 0;
int count = 1;
for (PageModel page : pages) {
String message = LNReaderApplication.getInstance().getApplicationContext().getResources().getString(R.string.relink_task_progress, page.getPage(), count, pages.size());
publishProgress(new CallbackEventData(message));
try {
// get the contents
NovelContentModel content = NovelsDao.getInstance().getNovelContent(new BookModel(), false, callback);
if (content != null) {
// replace the rootpath based on /project/
// for now just replace the thumbs
// file:///mnt/sdcard/test/project/images/thumb/c/c7/Accel_World_v01_262.jpg/84px-Accel_World_v01_262.jpg
// file:///sdcard-ext/.bakareaderex/project/images/thumb/c/c7/Accel_World_v01_262.jpg/84px-Accel_World_v01_262.jpg
Document doc = Jsoup.parse(content.getContent());
Elements imageElements = doc.select("img");
for (Element image : imageElements) {
String imgUrl = image.attr("src");
if (imgUrl.startsWith("file:///") && imgUrl.contains("/project/images/thumb/")) {
String mntImgUrl = imgUrl.replace("file:///", "");
Log.d(TAG, "Found image : " + imgUrl);
if (!new File(mntImgUrl).exists()) {
Log.d(TAG, "Old image doesn't exists/moved: " + mntImgUrl);
String newUrl = imgUrl.replaceAll("file:///[\\w/\\./!$%^&*()_+|~\\={}\\[\\]:\";'<>?,-]+/project/images/thumb/", "file:///" + rootPath + "/project/images/thumb/");
String mntNewUrl = newUrl.replace("file:///", "");
Log.d(TAG, "Trying to replace with " + mntNewUrl);
if (new File(mntNewUrl).exists()) {
Log.d(TAG, "Replace image: " + imgUrl + " ==> " + newUrl);
image.attr("src", newUrl);
++updated;
}
}
}
}
content.setContent(doc.html());
NovelsDao.getInstance().updateNovelContent(content);
}
} catch (Exception e) {
message = LNReaderApplication.getInstance().getApplicationContext().getResources().getString(R.string.relink_task_error, page.getPage());
Log.e(TAG, message, e);
publishProgress(new CallbackEventData(message));
}
++count;
}
}
@Override
protected void onProgressUpdate(ICallbackEventData... values) {
Log.d(TAG, values[0].getMessage());
if (callback != null)
callback.onCallback(new CallbackEventData(values[0].getMessage(), source));
}
@Override
protected void onPostExecute(Void result) {
if (!hasError) {
String message = LNReaderApplication.getInstance().getApplicationContext().getResources().getString(R.string.relink_task_complete, rootPath, updated);
Log.i(TAG, message);
if (callback != null)
callback.onCallback(new CallbackEventData(message, source));
}
}
}