package ar.rulosoft.mimanganu; import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import android.preference.PreferenceManager; import android.util.Log; import android.view.View; import java.util.ArrayList; import ar.rulosoft.mimanganu.componentes.Database; import ar.rulosoft.mimanganu.componentes.Manga; import ar.rulosoft.mimanganu.servers.ServerBase; import ar.rulosoft.mimanganu.utils.NetworkUtilsAndReceiver; import ar.rulosoft.mimanganu.utils.Util; /** * Created by jtx on 15.09.2016. */ public class AutomaticUpdateTask extends AsyncTask<Void, Integer, Integer> { public static int mNotifyID = (int) System.currentTimeMillis(); private ArrayList<Manga> mangaList; private ArrayList<Manga> fromFolderMangaList; private int threads = 2; private int ticket = threads; private int result = 0; private int numNow = 0; private String error = ""; private Context context; private SharedPreferences pm; private View view; public AutomaticUpdateTask(Context context, View view, SharedPreferences pm) { this.context = context; this.view = view; this.pm = pm; if (pm.getBoolean("include_finished_manga", false)) mangaList = Database.getMangas(context, null, true); else mangaList = Database.getMangasForUpdates(context); fromFolderMangaList = Database.getFromFolderMangas(context); threads = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(context).getString("update_threads_manual", "2")); ticket = threads; mNotifyID = (int) System.currentTimeMillis(); } @Override protected void onPreExecute() { super.onPreExecute(); if (context != null) { Util.getInstance().createSearchingForUpdatesNotification(context, mNotifyID); Util.getInstance().showFastSnackBar(context.getResources().getString(R.string.searching_for_updates), view, context); } } @Override protected void onProgressUpdate(Integer... values) { if (context != null) { Util.getInstance().changeSearchingForUpdatesNotification(context, mangaList.size(), ++numNow, mNotifyID, context.getResources().getString(R.string.searching_for_updates), numNow + "/" + mangaList.size() + " - " + mangaList.get(values[0]).getTitle(), true); } super.onProgressUpdate(values); } @Override protected Integer doInBackground(Void... params) { if (context != null && error.isEmpty()) { final boolean fast = pm.getBoolean("fast_update", true); ticket = threads; if (!NetworkUtilsAndReceiver.isConnectedNonDestructive(context)) { mangaList = fromFolderMangaList; } for (int idx = 0; idx < mangaList.size(); idx++) { if (MainActivity.isCancelled || Util.n > (48 - threads)) cancel(true); try { final int idxNow = idx; // If there is no ticket, sleep for 1 second and ask again while (ticket < 1) { try { Thread.sleep(1000); } catch (InterruptedException e) { Log.e("ULT", "Update sleep failure", e); } } ticket--; // If tickets were passed, create new requests new Thread(new Runnable() { @Override public void run() { try { if (!isCancelled()) { Manga manga = mangaList.get(idxNow); ServerBase serverBase = ServerBase.getServer(manga.getServerId(), context); publishProgress(idxNow); serverBase.loadChapters(manga, false); result += serverBase.searchForNewChapters(manga.getId(), context, fast); } } catch (Exception e) { Log.e("ULT", "Update server failure", e); } finally { ticket++; } } }).start(); } catch (Exception e) { error = Log.getStackTraceString(e); } } // After finishing the loop, wait for all threads to finish their task before ending while (ticket < threads) { try { Thread.sleep(1000); } catch (InterruptedException e) { Log.e("ULT", "After sleep failure", e); } } } return result; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); if (context != null) { if (result > 0) { Util.getInstance().cancelNotification(mNotifyID); Util.getInstance().showFastSnackBar(context.getResources().getString(R.string.mgs_update_found, "" + result), view, context); } else { Util.getInstance().cancelNotification(mNotifyID); if (!error.isEmpty()) { Util.getInstance().toast(context, error); } else { Util.getInstance().showFastSnackBar(context.getResources().getString(R.string.no_new_updates_found), view, context); } } } else { Util.getInstance().cancelNotification(mNotifyID); } } @Override protected void onCancelled() { Util.getInstance().cancelNotification(mNotifyID); if (context != null) { Util.getInstance().toast(context, context.getString(R.string.update_search_cancelled)); if (Util.n > (48 - threads)) { Util.getInstance().toast(context, context.getString(R.string.notification_tray_is_full)); } } } }