package de.ironjan.mensaupb.menus_ui; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.ItemClick; import org.androidannotations.annotations.UiThread; import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.sharedpreferences.Pref; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.ironjan.mensaupb.BuildConfig; import de.ironjan.mensaupb.R; import de.ironjan.mensaupb.opening_times.data_storage.OpeningTimesKeeper; import de.ironjan.mensaupb.prefs.InternalKeyValueStore_; import de.ironjan.mensaupb.sync.AccountCreator; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; @SuppressWarnings("WeakerAccess") @EFragment(R.layout.fragment_menu_listing) public class MenuListingFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { public static final String ARG_DATE = "date"; public static final String ARG_LOCATION = "restaurant"; public static final int TIMEOUT_30_SECONDS = 30000; private final Logger LOGGER = LoggerFactory.getLogger(MenuListingFragment.class.getSimpleName()); @ViewById(R.id.emptyExplanation) View mLoadingView; @ViewById(R.id.closed) View mClosed; @ViewById(android.R.id.empty) View empty; @ViewById(android.R.id.list) StickyListHeadersListView list; @Pref InternalKeyValueStore_ mInternalKeyValueStore; @Bean AccountCreator mAccountCreator; private MenuListingAdapter adapter; private MenusNavigationCallback navigationCallback; public static MenuListingFragment getInstance(String dateAsKey, String restaurant) { MenuListingFragment fragment = new MenuListingFragment_(); Bundle arguments = new Bundle(); arguments.putString(MenuListingFragment.ARG_DATE, dateAsKey); arguments.putString(MenuListingFragment.ARG_LOCATION, restaurant); fragment.setArguments(arguments); return fragment; } @Override public void onAttach(Context context) { if (!(context instanceof MenusNavigationCallback)) { throw new IllegalArgumentException("MenuListingFragment can only be attached to an Activity implementing MenusNavigationCallback."); } super.onAttach(context); this.navigationCallback = (MenusNavigationCallback) context; } private String getArgLocation() { String location = getArguments().getString(ARG_LOCATION); return location.replaceAll("\\*", "%"); } private String getArgDate() { return getArguments().getString(ARG_DATE); } @AfterViews void loadContent() { adapter = new MenuListingAdapter(getActivity(), getArgDate(), getArgLocation()); adapter.setViewBinder(new MenuDetailViewBinder()); getLoaderManager().initLoader(0, null, adapter); list.setAdapter(adapter); list.setAreHeadersSticky(false); updateEmptyView(); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(TIMEOUT_30_SECONDS); updateLoadingMessage(); } catch (InterruptedException e) { // ignored } } }).start(); } private void updateEmptyView() { list.setEmptyView(empty); boolean isOpen = OpeningTimesKeeper.isOpenOn(getArgLocation(), getArgDate()); boolean isEmpty = adapter.isEmpty(); if (isEmpty && isOpen) { mLoadingView.setVisibility(View.VISIBLE); mClosed.setVisibility(View.GONE); } else if(isEmpty){ mLoadingView.setVisibility(View.GONE); mClosed.setVisibility(View.VISIBLE); }else { mLoadingView.setVisibility(View.GONE); mClosed.setVisibility(View.GONE); } } @UiThread void updateLoadingMessage() { long lastSyncTimeStamp = mInternalKeyValueStore.lastSyncTimeStamp().get(); if (0L == lastSyncTimeStamp) { updateEmptyView(); } else { list.setEmptyView(mClosed); } } @ItemClick void listItemClicked(int pos) { if (BuildConfig.DEBUG) LOGGER.debug("listItemClicked({})", pos); final long _id = adapter.getItemId(pos); navigationCallback.showMenu(_id); if (BuildConfig.DEBUG) LOGGER.debug("listItemClicked({}) done", pos); } @Override public void onRefresh() { Bundle settingsBundle = new Bundle(); settingsBundle.putBoolean( ContentResolver.SYNC_EXTRAS_MANUAL, true); settingsBundle.putBoolean( ContentResolver.SYNC_EXTRAS_EXPEDITED, true); ContentResolver.requestSync(mAccountCreator.getAccount(), AccountCreator.AUTHORITY, settingsBundle); LOGGER.debug("Sync requested."); } }