package net.reichholf.dreamdroid.fragment; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.Loader; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import net.reichholf.dreamdroid.DreamDroid; import net.reichholf.dreamdroid.R; import net.reichholf.dreamdroid.activities.abs.MultiPaneHandler; import net.reichholf.dreamdroid.adapter.recyclerview.ZapAdapter; import net.reichholf.dreamdroid.fragment.abs.BaseHttpRecyclerFragment; import net.reichholf.dreamdroid.helpers.ExtendedHashMap; import net.reichholf.dreamdroid.helpers.ExtendedHashMapHelper; import net.reichholf.dreamdroid.helpers.NameValuePair; import net.reichholf.dreamdroid.helpers.RecyclerViewPauseOnScrollListener; import net.reichholf.dreamdroid.helpers.Statics; import net.reichholf.dreamdroid.helpers.enigma2.Service; import net.reichholf.dreamdroid.helpers.enigma2.requesthandler.ServiceListRequestHandler; import net.reichholf.dreamdroid.intents.IntentFactory; import net.reichholf.dreamdroid.loader.AsyncListLoader; import net.reichholf.dreamdroid.loader.LoaderResult; import java.util.ArrayList; /** * Created by reichi on 8/30/13. * This fragment is actually based on a GridView, it uses some small hacks to trick the ListFragment into working anyways * As a GridView is also using a ListAdapter, this avoids having to copy existing code */ public class ZapFragment extends BaseHttpRecyclerFragment { public static final String BUNDLE_KEY_BOUQUETLIST = "bouquetList"; public static String BUNDLE_KEY_CURRENT_BOUQUET = "currentBouquet"; private ArrayList<ExtendedHashMap> mBouquetList; private ExtendedHashMap mCurrentBouquet; private boolean mWaitingForPicker; @Override public void onCreate(Bundle savedInstanceState) { mEnableReload = false; super.onCreate(savedInstanceState); initTitle(""); mBouquetList = new ArrayList<>(); mCurrentBouquet = new ExtendedHashMap(); mCurrentBouquet.put(Service.KEY_REFERENCE, DreamDroid.getCurrentProfile().getDefaultRef()); mCurrentBouquet.put(Service.KEY_NAME, DreamDroid.getCurrentProfile().getDefaultRefName()); mWaitingForPicker = false; restoreState(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.card_grid_content, container, false); RecyclerView recyclerView = (RecyclerView) view.findViewById(android.R.id.list); recyclerView.setLayoutManager(new GridLayoutManager(getAppCompatActivity(), 3)); RecyclerViewPauseOnScrollListener listener = new RecyclerViewPauseOnScrollListener(Statics.TAG_PICON, true, true); recyclerView.addOnScrollListener(listener); restoreState(savedInstanceState); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } private void restoreState(Bundle savedInstanceState) { boolean reload = false; if (savedInstanceState == null) { mReload = true; } else { ExtendedHashMap currentBouquet = ExtendedHashMapHelper.restoreFromBundle(savedInstanceState, BUNDLE_KEY_CURRENT_BOUQUET); if (currentBouquet != null) mCurrentBouquet = currentBouquet; else mReload = true; ArrayList<ExtendedHashMap> bouquetList = ExtendedHashMapHelper.restoreListFromBundle(savedInstanceState, BUNDLE_KEY_BOUQUETLIST); if (bouquetList != null) mBouquetList = bouquetList; else mReload = true; } if (reload) mReload = true; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new ZapAdapter(getContext(), mMapList); getRecyclerView().setAdapter(mAdapter); } @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable(BUNDLE_KEY_CURRENT_BOUQUET, mCurrentBouquet); outState.putSerializable(BUNDLE_KEY_BOUQUETLIST, mBouquetList); super.onSaveInstanceState(outState); } @Override public void createOptionsMenu(Menu menu, MenuInflater inflater) { super.createOptionsMenu(menu, inflater); inflater.inflate(R.menu.epgbouquet, menu); } @Override public void onItemClick(RecyclerView rv, View v, int position, long id) { String ref = mMapList.get(position).getString(Service.KEY_REFERENCE); zapTo(ref); } @Override public boolean onItemLongClick(RecyclerView rv, View v, int position, long id) { String ref = mMapList.get(position).getString(Service.KEY_REFERENCE); String name = mMapList.get(position).getString(Service.KEY_NAME); try { startActivity(IntentFactory.getStreamServiceIntent(getAppCompatActivity(), ref, name)); } catch (ActivityNotFoundException e) { showToast(getText(R.string.missing_stream_player)); } return true; } @Override public Loader<LoaderResult<ArrayList<ExtendedHashMap>>> onCreateLoader(int i, Bundle bundle) { return new AsyncListLoader(getAppCompatActivity(), new ServiceListRequestHandler(), false, bundle); } @Override public ArrayList<NameValuePair> getHttpParams(int loader) { ArrayList<NameValuePair> params = new ArrayList<>(); params.add(new NameValuePair("sRef", mCurrentBouquet.getString(Service.KEY_REFERENCE))); return params; } @Override protected void reload() { if(mCurrentBouquet != null && !mCurrentBouquet.isEmpty()) super.reload(); else if(!mWaitingForPicker) pickBouquet(); } @Override public String getLoadFinishedTitle() { if(mCurrentBouquet != null) return mCurrentBouquet.getString(Service.KEY_NAME, super.getLoadFinishedTitle()); return super.getLoadFinishedTitle(); } @Override public void onLoadFinished(Loader<LoaderResult<ArrayList<ExtendedHashMap>>> loader, LoaderResult<ArrayList<ExtendedHashMap>> result) { mMapList.clear(); mAdapter.notifyDataSetChanged(); if (result.isError()) { setEmptyText(result.getErrorText()); return; } setEmptyText(null); ArrayList<ExtendedHashMap> list = result.getResult(); setCurrentTitle(getLoadFinishedTitle()); getAppCompatActivity().setTitle(getCurrentTitle()); if (list.size() == 0) { setEmptyText(getText(R.string.no_list_item)); } else { for (ExtendedHashMap service : list) { if (!Service.isMarker(service.getString(Service.KEY_REFERENCE))) mMapList.add(service); } } mAdapter.notifyDataSetChanged(); mHttpHelper.onLoadFinished(); } @Override protected boolean onItemSelected(int id) { switch (id) { case R.id.menu_pick_bouquet: pickBouquet(); return true; } return super.onItemSelected(id); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) return; switch (requestCode) { case Statics.REQUEST_PICK_BOUQUET: ExtendedHashMap bouquet = data.getParcelableExtra(PickServiceFragment.KEY_BOUQUET); String reference = bouquet.getString(Service.KEY_REFERENCE, ""); if (!reference.equals(mCurrentBouquet.getString(Service.KEY_REFERENCE))) { mCurrentBouquet = bouquet; getRecyclerView().smoothScrollToPosition(0); } reload(); mWaitingForPicker = false; break; } super.onActivityResult(requestCode, resultCode, data); } private void pickBouquet() { mWaitingForPicker = true; PickServiceFragment f = new PickServiceFragment(); Bundle args = new Bundle(); ExtendedHashMap data = new ExtendedHashMap(); data.put(Service.KEY_REFERENCE, "default"); args.putSerializable(sData, data); args.putString("action", Statics.INTENT_ACTION_PICK_BOUQUET); f.setArguments(args); f.setTargetFragment(this, Statics.REQUEST_PICK_BOUQUET); ((MultiPaneHandler) getAppCompatActivity()).showDetails(f, true); } }