package ar.rulosoft.mimanganu; import android.app.ActionBar; import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.support.v7.widget.SearchView.OnQueryTextListener; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.ProgressBar; import java.util.ArrayList; import java.util.List; import ar.rulosoft.mimanganu.adapters.MangaRecAdapterBase; import ar.rulosoft.mimanganu.adapters.MangaRecAdapterBase.OnLastItem; import ar.rulosoft.mimanganu.adapters.MangaRecAdapterBase.OnMangaClick; import ar.rulosoft.mimanganu.adapters.MangasRecAdapter; import ar.rulosoft.mimanganu.adapters.MangasRecAdapterText; import ar.rulosoft.mimanganu.componentes.Database; import ar.rulosoft.mimanganu.componentes.FilterViewGenerator; import ar.rulosoft.mimanganu.componentes.Manga; import ar.rulosoft.mimanganu.servers.ServerBase; import ar.rulosoft.mimanganu.utils.AsyncAddManga; import ar.rulosoft.mimanganu.utils.ThemeColors; import ar.rulosoft.mimanganu.utils.Util; import static ar.rulosoft.mimanganu.MainActivity.colors; public class ServerFilteredNavigationFragment extends Fragment implements OnLastItem, OnMangaClick, FilterViewGenerator.FilterListener { int serverID; private boolean mStart = true; private ServerBase serverBase; private RecyclerView recyclerViewGrid; private ProgressBar loading; private MangaRecAdapterBase mAdapter; private boolean newTask = false; private int page = 1; private int[][] filters = null; private int firstVisibleItem; private LoadLastTask loadLastTask = new LoadLastTask(); private int lastContextMenuIndex = 0; private boolean mangaAlreadyAdded; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { Thread t0 = new Thread(new Runnable() { @Override public void run() { try { List<Manga> mangas = Database.getMangas(getContext(), null, true); if (mAdapter != null) { for (Manga m : mangas) { if (m.getPath().equals(mAdapter.getItem(lastContextMenuIndex).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); if (mAdapter != null) { menu.setHeaderTitle(mAdapter.getItem((int) v.getTag()).getTitle()); } lastContextMenuIndex = (int) v.getTag(); } @Override public boolean onContextItemSelected(MenuItem item) { if (!mangaAlreadyAdded) { AsyncAddManga nAsyncAddManga = new AsyncAddManga(mAdapter.getItem(lastContextMenuIndex), 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; return super.onContextItemSelected(item); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { setHasOptionsMenu(true); serverID = getArguments().getInt(MainFragment.SERVER_ID); return inflater.inflate(R.layout.fragment_server_visual_list, container, false); } @Override public void onActivityCreated(Bundle savedState) { super.onActivityCreated(savedState); SharedPreferences pm = PreferenceManager.getDefaultSharedPreferences(getActivity()); colors = ThemeColors.getColors(pm); ActionBar mActBar = getActivity().getActionBar(); if (mActBar != null) { mActBar.setTitle(getResources() .getString(R.string.listaen) + " " + serverBase.getServerName()); mActBar.setDisplayHomeAsUpEnabled(true); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getActivity().getWindow(); window.setNavigationBarColor(colors[0]); window.setStatusBarColor(colors[4]); } serverBase = ServerBase.getServer(serverID, getContext()); if (filters == null) { filters = serverBase.getBasicFilter(); } recyclerViewGrid = (RecyclerView) getView().findViewById(R.id.grilla); if (serverBase.getFilteredType() == ServerBase.FilteredType.TEXT) { DividerItemDecoration divider = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL); Drawable sd = ContextCompat.getDrawable(getContext(), R.drawable.divider); sd.setColorFilter(colors[0], PorterDuff.Mode.DARKEN); divider.setDrawable(sd); recyclerViewGrid.addItemDecoration(divider); } loading = (ProgressBar) getView().findViewById(R.id.loading); int columnSize = Integer.parseInt(pm.getString("grid_columns", "-1")); if (columnSize == -1 || pm.getBoolean("grid_columns_automatic_detection", true)) columnSize = Util.getInstance().getGridColumnSizeFromWidth(getActivity()); if (serverBase.getFilteredType() == ServerBase.FilteredType.TEXT) columnSize = 1; recyclerViewGrid.setLayoutManager(new GridLayoutManager(getActivity(), columnSize)); if (mAdapter != null) { mAdapter.setOnCreateContextMenuListener(this); recyclerViewGrid.setAdapter(mAdapter); recyclerViewGrid.getLayoutManager().scrollToPosition(firstVisibleItem); loading.setVisibility(View.INVISIBLE); } else { loadLastTask = (LoadLastTask) new LoadLastTask().execute(page); } } @Override public void onRequestedLastItem() { if (serverBase.hasMore && !loading.isShown() && !mStart) loadLastTask = (LoadLastTask) new LoadLastTask().execute(page); } @Override public void onResume() { super.onResume(); ((MainActivity) getActivity()).setTitle(getResources().getString(R.string.listaen) + " " + serverBase.getServerName()); ((MainActivity) getActivity()).enableHomeButton(true); } @Override public void onPause() { firstVisibleItem = ((GridLayoutManager) recyclerViewGrid.getLayoutManager()).findFirstVisibleItemPosition(); super.onPause(); } @Override public void onDetach() { super.onDetach(); loadLastTask.cancel(true); } @Override public void onMangaClick(Manga manga) { Bundle bundle = new Bundle(); bundle.putInt(MainFragment.SERVER_ID, serverBase.getServerID()); bundle.putString(DetailsFragment.TITLE, manga.getTitle()); bundle.putString(DetailsFragment.PATH, manga.getPath()); bundle.putString(DetailsFragment.IMG, manga.getImages()); DetailsFragment detailsFragment = new DetailsFragment(); detailsFragment.setArguments(bundle); ((MainActivity) getActivity()).replaceFragment(detailsFragment, "DetailsFragment"); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.manga_server_visual, menu); MenuItem search = menu.findItem(R.id.action_search); MenuItem vcl = menu.findItem(R.id.ver_como_lista); if (!serverBase.hasList()) vcl.setVisible(false); SearchView searchView = (SearchView) MenuItemCompat.getActionView(search); searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String value) { Bundle bundle = new Bundle(); bundle.putInt(MainFragment.SERVER_ID, serverBase.getServerID()); bundle.putString(SearchResultsFragment.TERM, value); SearchResultsFragment searchResultsFragment = new SearchResultsFragment(); searchResultsFragment.setArguments(bundle); ((MainActivity) getActivity()).replaceFragment(searchResultsFragment, "SearchFragment"); return true; } @Override public boolean onQueryTextChange(String s) { return false; } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { getActivity().onBackPressed(); return true; } else if (item.getItemId() == R.id.ver_como_lista) { ServerListFragment fragment = new ServerListFragment(); Bundle b = new Bundle(); b.putInt(MainFragment.SERVER_ID, serverBase.getServerID()); fragment.setArguments(b); ((MainActivity) getActivity()).replaceFragment(fragment, "FilteredServerList"); } else if (item.getItemId() == R.id.filter) { FilterViewGenerator mFilter = new FilterViewGenerator(getActivity(), "Filter", serverBase.getServerFilters(), filters, colors[0]); mFilter.getDialog().show(); mFilter.setFilterListener(this); } return super.onOptionsItemSelected(item); } @Override public void applyFilter(int[][] selectedIndexes) { if (!loading.isShown()) { filters = selectedIndexes; mAdapter = null; page = 1; mStart = true; serverBase.hasMore = true; loadLastTask = (LoadLastTask) new LoadLastTask().execute(page); } else { newTask = true; } } public class LoadLastTask extends AsyncTask<Integer, Void, ArrayList<Manga>> { String error = ""; @Override protected void onPreExecute() { loading.setVisibility(ProgressBar.VISIBLE); } @SuppressWarnings("ResourceType")//TODO ver problema @Override protected ArrayList<Manga> doInBackground(Integer... params) { ArrayList<Manga> mangas = null; try { mangas = serverBase.getMangasFiltered(filters, params[0]); } catch (Exception e) { Log.e("SFNF", "Exception", e); error = Log.getStackTraceString(e); } return mangas; } @Override protected void onPostExecute(ArrayList<Manga> result) { if (!error.isEmpty()) { Util.getInstance().toast(getContext(), error); } else { page++; if (result != null && result.size() != 0 && recyclerViewGrid != null) { if (isAdded()) { if (mAdapter == null) { if (serverBase.getFilteredType() == ServerBase.FilteredType.VISUAL) { mAdapter = new MangasRecAdapter(result, getActivity(), MainActivity.darkTheme); } else { mAdapter = new MangasRecAdapterText(result, getActivity(), MainActivity.darkTheme); } mAdapter.setOnCreateContextMenuListener(ServerFilteredNavigationFragment.this); mAdapter.setLastItemListener(ServerFilteredNavigationFragment.this); mAdapter.setMangaClickListener(ServerFilteredNavigationFragment.this); recyclerViewGrid.setAdapter(mAdapter); } else { mAdapter.addAll(result); } } } mStart = false; if (newTask) { mAdapter = null; page = 1; mStart = true; serverBase.hasMore = true; loadLastTask = (LoadLastTask) new LoadLastTask().execute(page); newTask = false; } } loading.setVisibility(ProgressBar.INVISIBLE); } } }