package ar.rulosoft.mimanganu.componentes; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.List; import ar.rulosoft.custompref.ArrayAdapterDirectory; import ar.rulosoft.mimanganu.MainActivity; import ar.rulosoft.mimanganu.MainFragment; import ar.rulosoft.mimanganu.R; import ar.rulosoft.mimanganu.servers.FromFolder; import ar.rulosoft.mimanganu.servers.ServerBase; import ar.rulosoft.mimanganu.utils.Util; /** * Created by Raul on 14/05/2016 */ public class MangaFolderSelect extends DialogFragment { private Context context = getActivity(); private String actual; private ListView dirs; private TextView dirs_path; private MainFragment mainFragment; private int mNotifyID_AddAllMangaInDirectory = (int) System.currentTimeMillis(); @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setPositiveButton(getActivity().getString(android.R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (MainActivity.pm != null) { if (MainActivity.pm.getBoolean("multi_import", false)) { new AddAllMangaInDirectoryTask().execute(actual); } else { new AddMangaTask().execute(actual); } } else { new AddMangaTask().execute(actual); } } }); builder.setNegativeButton(getActivity().getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); LayoutInflater i = getActivity().getLayoutInflater(); View view = i.inflate(R.layout.dialog_select_directory, null); SharedPreferences pm = PreferenceManager.getDefaultSharedPreferences(getActivity()); actual = pm.getString("directorio", Environment.getExternalStorageDirectory().getPath() + "/MiMangaNu/"); dirs = (ListView) view.findViewById(R.id.dirList); dirs_path = (TextView) view.findViewById(R.id.dirBreadcrumb); ArrayList<String> dirList = Util.getInstance().dirList(actual); context = getActivity(); ArrayAdapter<String> adap = new ArrayAdapterDirectory(context, R.layout.listitem_dir, dirList); dirs_path.setText(actual); dirs.setAdapter(adap); dirs.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { String item = (String) dirs.getItemAtPosition(arg2); if (!item.equals("..")) { actual += item + "/"; } else { actual = actual.substring(0, actual.lastIndexOf("/")); actual = actual.substring(0, actual.lastIndexOf("/") + 1); } ArrayList<String> dirList = Util.getInstance().dirList(actual); ArrayAdapter<String> adap = new ArrayAdapterDirectory(context, R.layout.listitem_dir, dirList); dirs_path.setText(actual); dirs.setAdapter(adap); } }); builder.setView(view); return builder.create(); } public void setMainFragment(MainFragment mainFragment) { this.mainFragment = mainFragment; } public class AddMangaTask extends AsyncTask<String, Integer, Void> { ProgressDialog adding = new ProgressDialog(getActivity()); String error = ""; int max = 0; ServerBase serverBase = ServerBase.getServer(ServerBase.FROMFOLDER, context); Manga manga; boolean onDb; @Override protected void onPreExecute() { adding.setMessage(getResources().getString(R.string.adding_to_db)); adding.show(); super.onPreExecute(); } @Override protected Void doInBackground(String... params) { String title = Util.getInstance().getLastStringInPath(params[0]); List<Manga> mangas = Database.getFromFolderMangas(getContext()); onDb = false; for (Manga m : mangas) { if (m.getPath().equals(params[0])) onDb = true; } if (!onDb) { manga = new Manga(FromFolder.FROMFOLDER, title, params[0], true); manga.setImages(""); try { serverBase.loadChapters(manga, false); } catch (Exception e) { Log.e("MangaFolderSelect", "Exception", e); error = Log.getStackTraceString(e); } max = manga.getChapters().size(); int mid = Database.addManga(getActivity(), manga); long initTime = System.currentTimeMillis(); for (int i = 0; i < manga.getChapters().size(); i++) { if (System.currentTimeMillis() - initTime > 500) { publishProgress(i); initTime = System.currentTimeMillis(); } Database.addChapter(getActivity(), manga.getChapter(i), mid); } } else { Log.i("MangaFolderSelect", "already on db: " + params[0]); } return null; } @Override protected void onProgressUpdate(final Integer... values) { super.onProgressUpdate(values); if (isAdded()) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { if (adding != null) { adding.setMessage(getResources().getString(R.string.adding_to_db) + " " + values[0] + "/" + max); } } }); } } @Override protected void onPostExecute(Void result) { adding.dismiss(); if (isAdded()) { if(!onDb) Toast.makeText(getActivity(), getResources().getString(R.string.agregado), Toast.LENGTH_SHORT).show(); else Toast.makeText(getContext(), getContext().getString(R.string.dir_already_on_db), Toast.LENGTH_LONG).show(); if (!error.isEmpty()) { Toast.makeText(getActivity(), error, Toast.LENGTH_LONG).show(); } if (mainFragment != null) { mainFragment.setListManga(true); } getActivity().onBackPressed(); } super.onPostExecute(result); } } public class AddAllMangaInDirectoryTask extends AsyncTask<String, Integer, Void> { String error = ""; int max = 0; ServerBase serverBase = ServerBase.getServer(ServerBase.FROMFOLDER, context); Manga manga; @Override protected void onPreExecute() { mNotifyID_AddAllMangaInDirectory = (int) System.currentTimeMillis(); if(isAdded()) Util.getInstance().createNotificationWithProgressbar(getContext(), mNotifyID_AddAllMangaInDirectory, getResources().getString(R.string.adding_folders_as_mangas), ""); super.onPreExecute(); } @Override protected void onProgressUpdate(final Integer... values) { if(isAdded()) Util.getInstance().changeNotificationWithProgressbar(max, values[0], mNotifyID_AddAllMangaInDirectory, getResources().getString(R.string.adding_folders_as_mangas), "" + values[0] + " / " + max, true); super.onProgressUpdate(values); } @Override protected Void doInBackground(String... params) { String directory = params[0]; File f = new File(directory); if (f.listFiles().length > 0) { max = f.listFiles().length; int n = 0; for (File child : f.listFiles()) { n++; publishProgress(n); directory = child.getAbsolutePath(); List<Manga> fromFolderMangas = Database.getFromFolderMangas(getContext()); Log.i("MangaFolderSelect", "FromFolder directory: " + directory); boolean onDb = false; for (Manga m : fromFolderMangas) { if (m.getPath().equals(directory)) onDb = true; } if (!onDb) { String title = Util.getInstance().getLastStringInPathDontRemoveLastChar(directory); manga = new Manga(FromFolder.FROMFOLDER, title, directory, true); manga.setImages(""); try { serverBase.loadChapters(manga, false); } catch (Exception e) { Log.e("MangaFolderSelect", "Exception", e); error = Log.getStackTraceString(e); } int mid = Database.addManga(getActivity(), manga); for (int i = 0; i < manga.getChapters().size(); i++) { Database.addChapter(getActivity(), manga.getChapter(i), mid); } } else { Log.i("MangaFolderSelect", "already on db: " + directory); } } } return null; } @Override protected void onPostExecute(Void result) { if (isAdded()) { Util.getInstance().cancelNotification(mNotifyID_AddAllMangaInDirectory); Toast.makeText(getActivity(), getResources().getString(R.string.agregado), Toast.LENGTH_SHORT).show(); if (!error.isEmpty()) { Toast.makeText(getActivity(), error, Toast.LENGTH_LONG).show(); } if (mainFragment != null) { mainFragment.setListManga(true); } //getActivity().onBackPressed(); } super.onPostExecute(result); } } }