package org.mtransit.android.ui.fragment; import java.util.ArrayList; import org.mtransit.android.R; import org.mtransit.android.commons.BundleUtils; import org.mtransit.android.commons.CollectionUtils; import org.mtransit.android.commons.LocationUtils; import org.mtransit.android.commons.MTLog; import org.mtransit.android.data.DataSourceProvider; import org.mtransit.android.data.POIArrayAdapter; import org.mtransit.android.data.POIManager; import org.mtransit.android.task.POIsLoader; import org.mtransit.android.ui.MTActivityWithLocation; import org.mtransit.android.util.LoaderUtils; import android.app.Activity; import android.app.Dialog; import android.location.Location; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.util.ArrayMap; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; import android.view.Window; import android.widget.ScrollView; public class PickPOIDialogFragment extends MTDialogFragmentV4 implements LoaderManager.LoaderCallbacks<ArrayList<POIManager>>, DataSourceProvider.ModulesUpdateListener, MTActivityWithLocation.UserLocationListener, POIArrayAdapter.OnClickHandledListener { private static final String TAG = PickPOIDialogFragment.class.getSimpleName(); @Override public String getLogTag() { return TAG; } private static final String EXTRA_POI_UUIDS = "extra_poi_uuids"; private static final String EXTRA_POI_AUTHORITIES = "extra_poi_authorities"; public static PickPOIDialogFragment newInstance(ArrayMap<String, String> uuidsAndAuthorities) { ArrayList<String> uuids = new ArrayList<String>(); ArrayList<String> authorities = new ArrayList<String>(); if (uuidsAndAuthorities != null) { for (ArrayMap.Entry<String, String> uuidAndAuthority : uuidsAndAuthorities.entrySet()) { uuids.add(uuidAndAuthority.getKey()); authorities.add(uuidAndAuthority.getValue()); } } return newInstance(uuids, authorities); } public static PickPOIDialogFragment newInstance(ArrayList<String> uuids, ArrayList<String> authorities) { PickPOIDialogFragment f = new PickPOIDialogFragment(); Bundle args = new Bundle(); args.putStringArrayList(EXTRA_POI_UUIDS, uuids); f.uuids = uuids; args.putStringArrayList(EXTRA_POI_AUTHORITIES, authorities); f.authorities = authorities; f.setArguments(args); return f; } private ArrayList<String> uuids = null; private ArrayList<String> authorities = null; private POIArrayAdapter adapter = null; private boolean modulesUpdated = false; private Location userLocation = null; @Override public void onAttach(Activity activity) { super.onAttach(activity); initAdapters(activity); } private void initAdapters(Activity activity) { this.adapter = new POIArrayAdapter(activity); this.adapter.setOnClickHandledListener(this); this.adapter.setTag(getLogTag()); } @Override public void onLeaving() { dismiss(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); restoreInstanceState(savedInstanceState, getArguments()); DataSourceProvider.addModulesUpdateListener(this); } private void restoreInstanceState(Bundle... bundles) { ArrayList<String> newUUIDs = BundleUtils.getStringArrayList(EXTRA_POI_UUIDS, bundles); if (CollectionUtils.getSize(newUUIDs) > 0) { this.uuids = newUUIDs; } ArrayList<String> newAuthorities = BundleUtils.getStringArrayList(EXTRA_POI_AUTHORITIES, bundles); if (CollectionUtils.getSize(newAuthorities) > 0) { this.authorities = newAuthorities; } } @Override public void onModulesUpdated() { this.modulesUpdated = true; if (!isResumed()) { return; } dismiss(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View view = inflater.inflate(R.layout.fragment_dialog_pick_poi, container, false); setupView(view); return view; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCancelable(true); dialog.setCanceledOnTouchOutside(true); return dialog; } private void setupView(View view) { if (view == null) { return; } inflateList(view); this.adapter.setManualScrollView((ScrollView) view.findViewById(R.id.scrollview)); this.adapter.setManualLayout((ViewGroup) view.findViewById(R.id.list)); switchView(view); } private void switchView(View view) { if (view == null) { return; } if (this.adapter == null || !this.adapter.isInitialized()) { showLoading(view); } else if (this.adapter.getPoisCount() == 0) { showEmpty(view); } else { showList(view); } } private void showList(View view) { if (view.findViewById(R.id.loading) != null) { // IF inflated/present DO view.findViewById(R.id.loading).setVisibility(View.GONE); // hide } if (view.findViewById(R.id.empty) != null) { // IF inflated/present DO view.findViewById(R.id.empty).setVisibility(View.GONE); // hide } inflateList(view); view.findViewById(R.id.list).setVisibility(View.VISIBLE); // show } private void inflateList(View view) { if (view.findViewById(R.id.list) == null) { // IF NOT present/inflated DO ((ViewStub) view.findViewById(R.id.list_stub)).inflate(); // inflate } } private void showLoading(View view) { if (view.findViewById(R.id.list) != null) { // IF inflated/present DO view.findViewById(R.id.list).setVisibility(View.GONE); // hide } if (view.findViewById(R.id.empty) != null) { // IF inflated/present DO view.findViewById(R.id.empty).setVisibility(View.GONE); // hide } view.findViewById(R.id.loading).setVisibility(View.VISIBLE); // show } private void showEmpty(View view) { if (view.findViewById(R.id.list) != null) { // IF inflated/present DO view.findViewById(R.id.list).setVisibility(View.GONE); // hide } if (view.findViewById(R.id.loading) != null) { // IF inflated/present DO view.findViewById(R.id.loading).setVisibility(View.GONE); // hide } if (view.findViewById(R.id.empty) == null) { // IF NOT present/inflated DO ((ViewStub) view.findViewById(R.id.empty_stub)).inflate(); // inflate } view.findViewById(R.id.empty).setVisibility(View.VISIBLE); // show } @Override public void onSaveInstanceState(Bundle outState) { if (CollectionUtils.getSize(this.uuids) > 0) { outState.putStringArrayList(EXTRA_POI_UUIDS, this.uuids); } if (CollectionUtils.getSize(this.authorities) > 0) { outState.putStringArrayList(EXTRA_POI_AUTHORITIES, this.authorities); } super.onSaveInstanceState(outState); } @Override public void onPause() { super.onPause(); if (this.adapter != null) { this.adapter.onPause(); } } @Override public void onResume() { super.onResume(); View view = getView(); if (this.modulesUpdated) { if (view != null) { view.post(new Runnable() { @Override public void run() { if (PickPOIDialogFragment.this.modulesUpdated) { onModulesUpdated(); } } }); } } switchView(view); if (this.adapter != null && this.adapter.isInitialized()) { this.adapter.onResume(getActivity(), this.userLocation); } else { LoaderUtils.restartLoader(this, POIS_LOADER, null, this); } onUserLocationChanged(((MTActivityWithLocation) getActivity()).getUserLocation()); } private static final int POIS_LOADER = 0; @Override public Loader<ArrayList<POIManager>> onCreateLoader(int id, Bundle args) { switch (id) { case POIS_LOADER: return new POIsLoader(getActivity(), this.uuids, this.authorities); default: MTLog.w(this, "Loader id '%s' unknown!", id); return null; } } @Override public void onLoaderReset(Loader<ArrayList<POIManager>> loader) { if (this.adapter != null) { this.adapter.clear(); } } @Override public void onLoadFinished(Loader<ArrayList<POIManager>> loader, ArrayList<POIManager> data) { this.adapter.setPois(data); this.adapter.updateDistanceNowAsync(this.userLocation); this.adapter.initManual(); switchView(getView()); } @Override public void onUserLocationChanged(Location newLocation) { if (newLocation != null) { if (this.userLocation == null || LocationUtils.isMoreRelevant(getLogTag(), this.userLocation, newLocation)) { this.userLocation = newLocation; if (this.adapter != null) { this.adapter.setLocation(newLocation); } } } } @Override public void onDestroy() { super.onDestroy(); if (this.adapter != null) { this.adapter.onDestroy(); this.adapter = null; } DataSourceProvider.removeModulesUpdateListener(this); } }