package de.tum.in.tumcampusapp.activities.generic; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.widget.SwipeRefreshLayout; import de.tum.in.tumcampusapp.auxiliary.Const; import de.tum.in.tumcampusapp.auxiliary.Utils; import de.tum.in.tumcampusapp.tumonline.TUMOnlineConst; import de.tum.in.tumcampusapp.tumonline.TUMOnlineRequest; import de.tum.in.tumcampusapp.tumonline.TUMOnlineRequestFetchListener; /** * Generic class which handles all basic tasks to communicate with TUMOnline and * provides a {@link android.support.v7.widget.SearchView} for searching the data. * It implements the TUMOnlineRequestFetchListener in order to receive data from * TUMOnline and implements a rich user feedback with error progress and token * related layouts. Generic class parameter specifies the type of data returned by TumOnline. */ public abstract class ActivityForSearchingTumOnline<T> extends ActivityForSearching implements TUMOnlineRequestFetchListener<T> { /** * The method which should be invoked by the TUmOnline Fetcher */ private final TUMOnlineConst<T> method; /** * Default layouts for user interaction */ protected TUMOnlineRequest<T> requestHandler; /** * Standard constructor for ActivityForSearchingTumOnline. * The given layout must include a all_error_layout. * If the Activity should support Pull-To-Refresh it can also contain a * {@link SwipeRefreshLayout} named ptr_layout * * @param method A identifier specifying what kind of data should be fetched from TumOnline * @param layoutId Resource id of the xml layout that should be used to inflate the activity * @param auth Authority for search suggestions declared in manifest file * @param minLen Minimum text length that has to be entered by the user before a search quest can be submitted */ public ActivityForSearchingTumOnline(TUMOnlineConst<T> method, int layoutId, String auth, int minLen) { super(layoutId, auth, minLen); this.method = method; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestHandler = new TUMOnlineRequest<>(method, this, true); } /** * Starts fetching data from TumOnline in background * {@link #onLoadFinished(Object)} gets called if data was fetched successfully. * If an error occurred it is handled by {@link ActivityForSearchingTumOnline}. */ protected void requestFetch() { requestFetch(false); } /** * Starts fetching data from TumOnline in background * {@link #onLoadFinished(Object)} gets called if data was fetched successfully. * If an error occurred it is handled by {@link ActivityForSearchingTumOnline}. * * @param force force reload */ void requestFetch(boolean force) { String accessToken = PreferenceManager.getDefaultSharedPreferences(this).getString(Const.ACCESS_TOKEN, null); if (accessToken == null) { showNoTokenLayout(); return; } Utils.logv("TUMOnline token is <" + accessToken + ">"); showLoadingStart(); requestHandler.setForce(force); requestHandler.fetchInteractive(this, this); } @Override public final void onFetch(T result) { showLoadingEnded(); onLoadFinished(result); } /** * Gets called when fetching data from TumOnline was successful * * @param result Data from TumOnline */ protected abstract void onLoadFinished(T result); @Override public void onNoInternetError() { showNoInternetLayout(); } @Override protected void onDestroy() { super.onDestroy(); requestHandler.cancelRequest(true); } @Override public void onFetchCancelled() { finish(); } @Override public void onFetchError(String errorReason) { showFailedTokenLayout(errorReason); } @Override public void onRefresh() { requestFetch(true); } }