package com.thomasdh.roosterpgplus.Fragments;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.thomasdh.roosterpgplus.Adapters.AnimatedPagerAdapter;
import com.thomasdh.roosterpgplus.Data.Rooster;
import com.thomasdh.roosterpgplus.Data.RoosterBuilder;
import com.thomasdh.roosterpgplus.Helpers.Apache.BasicNameValuePair;
import com.thomasdh.roosterpgplus.Helpers.HelperFunctions;
import com.thomasdh.roosterpgplus.Helpers.Apache.NameValuePair;
import com.thomasdh.roosterpgplus.MainApplication;
import com.thomasdh.roosterpgplus.Models.Lesuur;
import com.thomasdh.roosterpgplus.R;
import com.thomasdh.roosterpgplus.Settings.Constants;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
public abstract class RoosterViewFragment extends android.support.v4.app.Fragment implements ViewPager.OnPageChangeListener, RoosterBuilder.OnDagScrollListener {
@Getter
ViewPager viewPager;
@Getter
SwipeRefreshLayout swipeRefreshLayout;
@Getter @Setter private View rootView;
public enum LoadType { OFFLINE, ONLINE, NEWONLINE, REFRESH }
@Getter(value = AccessLevel.PACKAGE) private int week;
@Getter @Setter private int dag = 0;
private boolean isScrollingViewPager = false;
private boolean[] isScrollingScrollView = new boolean[10];
private boolean hadInternetConnection = true;
//region Types
public static Class<? extends RoosterViewFragment>[] types = new Class[]{
PersoonlijkRoosterFragment.class,
KlassenRoosterFragment.class,
DocentenRoosterFragment.class,
LokalenRoosterFragment.class,
LeerlingRoosterFragment.class,
EntityRoosterFragment.class,
PGTVRoosterFragment.class
};
//endregion
//region Creating
// Nieuwe instantie van het opgegeven type
public static <T extends RoosterViewFragment> T newInstance(Class<T> type, int week) {
T fragment;
try {
fragment = type.newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
fragment.setWeek(week, false);
return fragment;
}
//endregion
//region LifeCycle
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Tracker tracker = MainApplication.getTracker(MainApplication.TrackerName.APP_TRACKER, getContext());
tracker.setScreenName(getAnalyticsTitle());
tracker.send(new HitBuilders.ScreenViewBuilder().build());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return null;
}
public void setupSwipeRefreshLayout() {
if(swipeRefreshLayout != null) {
swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary, R.color.colorAccent, R.color.colorPrimaryDark);
swipeRefreshLayout.setOnRefreshListener(() -> loadRooster(true));
}
}
@Override
public void OnScroll(int scrollY, int dag) {
if (swipeRefreshLayout != null && dag == getDag()) {
isScrollingScrollView[dag] = scrollY != 0;
swipeRefreshLayout.setEnabled(!isScrollingViewPager && !isScrollingScrollView[dag]);
}
}
@Override
public void onResume() {
super.onResume();
setInternetConnectionState(HelperFunctions.hasInternetConnection(getContext()));
}
//endregion
//region Listeners
// Pas een rooster laden als er een week bekend is (of herladen als je wil)
public void setWeek(int week) {
setWeek(week, true);
}
public void setWeek(int week, boolean loadRooster) {
this.week = week;
if(week == Calendar.getInstance().get(Calendar.WEEK_OF_YEAR)) {
setDag(Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 2);
if(getDag() < 0) setDag(0); // voor weekenden
} else {
setDag(0);
}
if(loadRooster) {
loadRooster();
}
}
@Override
public void onPageScrolled(int i, float v, int i2) {}
@Override
public void onPageScrollStateChanged(int i) {
isScrollingViewPager = i != ViewPager.SCROLL_STATE_IDLE;
if(swipeRefreshLayout != null && getDag() >= 0)
swipeRefreshLayout.setEnabled(!isScrollingViewPager && !isScrollingScrollView[getDag()]);
}
@Override
public void onPageSelected(int i) { setDag(i); }
//endregion
//region Roosters
protected abstract boolean canLoadRooster();
protected abstract List<NameValuePair> getURLQuery(List<NameValuePair> query);
protected abstract LoadType getLoadType();
protected abstract long getLoad();
protected abstract void setLoad();
public abstract String getAnalyticsTitle();
public void loadRooster() {
loadRooster(false);
}
public void loadRooster(boolean reload) {
if(!canLoadRooster() || getWeek() == -1 || getActivity() == null) return;
Tracker tracker = MainApplication.getTracker(MainApplication.TrackerName.APP_TRACKER, getContext().getApplicationContext());
tracker.send(new HitBuilders.EventBuilder()
.setCategory(Constants.ANALYTICS_CATEGORIES_ROOSTER)
.setAction(reload ? Constants.ANALYTICS_ACTIVITY_ROOSTER_ACTION_REFRESH : Constants.ANALYTICS_ACTIVITY_ROOSTER_ACTION_LOAD)
.setLabel(getAnalyticsTitle())
.build());
if(swipeRefreshLayout != null)
swipeRefreshLayout.setRefreshing(true);
List<NameValuePair> query = new ArrayList<>();
query.add(new BasicNameValuePair("week", Integer.toString(getWeek())));
query = getURLQuery(query);
LoadType loadType = reload ? LoadType.REFRESH : getLoadType();
Rooster.getRooster(query, loadType, getContext(), (result, urenCount) -> {
if (getActivity() == null) return; // oude context
if (loadType == LoadType.ONLINE || loadType == LoadType.REFRESH || loadType == LoadType.NEWONLINE && HelperFunctions.hasInternetConnection(getContext())) {
setLoad();
}
if (swipeRefreshLayout != null) swipeRefreshLayout.setRefreshing(false);
buildRooster(urenCount).build((List<Lesuur>) result);
}, exception -> {
if (swipeRefreshLayout != null) swipeRefreshLayout.setRefreshing(false);
if (loadType != LoadType.REFRESH) {
buildRooster(0).build((List<Lesuur>) null);
}
});
}
RoosterBuilder buildRooster(int urenCount) {
if(getViewPager().getAdapter() == null) getViewPager().setAdapter(new AnimatedPagerAdapter());
getViewPager().getAdapter().notifyDataSetChanged();
getViewPager().addOnPageChangeListener(this);
return new RoosterBuilder(getContext())
.in(getViewPager())
.setShowDag(getDag())
.setShowVervangenUren(true)
.setLastLoad(getLoad())
.setOnDagScrollListener(this)
.setUrenCount(urenCount);
}
public void setInternetConnectionState(boolean hasInternetConnection) {
if(!hadInternetConnection && hasInternetConnection) {
loadRooster(true);
}
hadInternetConnection = hasInternetConnection;
}
//endregion
}