package ar.rulosoft.mimanganu; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.ProgressBar; import java.util.ArrayList; import java.util.List; import ar.rulosoft.mimanganu.componentes.Database; import ar.rulosoft.mimanganu.componentes.Manga; import ar.rulosoft.mimanganu.servers.ServerBase; import ar.rulosoft.mimanganu.utils.AsyncAddManga; import ar.rulosoft.mimanganu.utils.Util; public class SearchResultsFragment extends Fragment { public static final String TERM = "termino_busqueda"; private String search_term = ""; private int serverId; private ProgressBar loading; private ListView list; private PerformSearchTask performSearchTask = new PerformSearchTask(); private boolean searchPerformed; private ArrayList<Manga> mangasFromSearch = new ArrayList<>(); private boolean mangaAlreadyAdded; private Manga longClickedManga = null; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { setRetainInstance(true); setHasOptionsMenu(true); return inflater.inflate(R.layout.fragment_search_result, container, false); } @Override public void onActivityCreated(Bundle savedState) { super.onActivityCreated(savedState); serverId = getArguments().getInt(MainFragment.SERVER_ID); search_term = getArguments().getString(TERM); list = (ListView) getView().findViewById(R.id.result); loading = (ProgressBar) getView().findViewById(R.id.loading); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Manga manga = (Manga) list.getAdapter().getItem(position); Bundle bundle = new Bundle(); bundle.putInt(MainFragment.SERVER_ID, serverId); bundle.putString(DetailsFragment.TITLE, manga.getTitle()); bundle.putString(DetailsFragment.PATH, manga.getPath()); DetailsFragment detailsFragment = new DetailsFragment(); detailsFragment.setArguments(bundle); ((MainActivity) getActivity()).replaceFragment(detailsFragment, "DetailsFragment"); searchPerformed = true; } }); registerForContextMenu(list); if (searchPerformed) { if (list != null) list.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, mangasFromSearch)); } else performSearchTask = (PerformSearchTask) new PerformSearchTask().execute(); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { int position = ((AdapterView.AdapterContextMenuInfo) menuInfo).position; final Manga manga = (Manga) list.getAdapter().getItem(position); longClickedManga = manga; Thread t0 = new Thread(new Runnable() { @Override public void run() { try { List<Manga> mangas = Database.getMangas(getContext(), null, true); for (Manga m : mangas) { if (m.getPath().equals(manga.getPath())) mangaAlreadyAdded = true; } } catch (Exception e) { Log.e("SFNF", "Exception", e); Util.getInstance().toast(getContext(), Log.getStackTraceString(e)); } } }); t0.start(); MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.menu_manga_item_server_nav, menu); menu.setHeaderTitle(manga.getTitle()); } @Override public boolean onContextItemSelected(MenuItem item) { if (!mangaAlreadyAdded) { AsyncAddManga nAsyncAddManga = new AsyncAddManga(longClickedManga, getActivity(), getView(), false, true, false); nAsyncAddManga.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { Util.getInstance().showFastSnackBar(getString(R.string.already_on_db), getView(), getActivity()); } mangaAlreadyAdded = false; longClickedManga = null; return super.onContextItemSelected(item); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: { getActivity().onBackPressed(); return true; } default: break; } return super.onOptionsItemSelected(item); } @Override public void onResume() { super.onResume(); if (searchPerformed) { loading.setVisibility(ProgressBar.INVISIBLE); ((MainActivity) getActivity()).setTitle(getResources().getString(R.string.search_result, search_term) + " " + ServerBase.getServer(serverId, getContext()).getServerName()); } } @Override public void onDetach() { super.onDetach(); performSearchTask.cancel(true); mangasFromSearch.clear(); } public class PerformSearchTask extends AsyncTask<Void, Void, ArrayList<Manga>> { public String error = ""; @Override protected void onPreExecute() { if (isAdded()) { loading.setVisibility(ProgressBar.VISIBLE); ((MainActivity) getActivity()).setTitle(getResources().getString(R.string.searching, search_term) + " " + ServerBase.getServer(serverId, getContext()).getServerName()); } } @Override protected ArrayList<Manga> doInBackground(Void... params) { ArrayList<Manga> mangas = new ArrayList<>(); if (isAdded()) { ServerBase serverBase = ServerBase.getServer(serverId, getContext()); try { mangas = serverBase.search(search_term); } catch (Exception e) { error = e.getMessage(); } } return mangas; } @Override protected void onPostExecute(ArrayList<Manga> result) { if (isAdded()) { loading.setVisibility(ProgressBar.INVISIBLE); ((MainActivity) getActivity()).setTitle(getResources().getString(R.string.search_result, search_term) + " " + ServerBase.getServer(serverId, getContext()).getServerName()); if (error != null) { if (error.length() < 2) { if (result != null && !result.isEmpty() && list != null) { list.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, result)); if (!mangasFromSearch.isEmpty()) mangasFromSearch.clear(); mangasFromSearch.addAll(result); } else if (result == null || result.isEmpty()) { Util.getInstance().showFastSnackBar(getResources().getString(R.string.busquedanores), getView(), getContext()); } } else { Util.getInstance().showFastSnackBar(error, getView(), getContext()); } } } super.onPostExecute(result); } } }