/*
* Licensed Materials - Property of IBM
* © Copyright IBM Corporation 2015. All Rights Reserved.
*/
package com.ibm.mil.readyapps.telco.mydata;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.ibm.mil.readyapps.telco.R;
import com.ibm.mil.readyapps.telco.cycles.Cycle;
import com.ibm.mil.readyapps.telco.offers.AcceptedOfferBinder;
import com.ibm.mil.readyapps.telco.offers.Offer;
import com.ibm.mil.readyapps.telco.offers.OfferModel;
import com.ibm.mil.readyapps.telco.offers.OfferModelImpl;
import com.ibm.mil.readyapps.telco.usage.Usage;
import com.ibm.mil.readyapps.telco.utils.PlanConstants;
import com.ibm.mil.readyapps.telco.utils.RecyclerDivider;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Subscription;
/**
* Fragment for Data tab of app.
*/
public class DataFragment extends Fragment implements DataView {
private DataRecyclerAdapter dataAdapter;
private Resources resources;
@Bind(R.id.my_data_recyclerview)RecyclerView recyclerView;
private DataPresenter presenter;
private List<Offer> appOffers;
private List<Offer> acceptedOffers;
private List<Usage> usages;
private Cycle cycle;
private boolean alreadyInitializedRecyclerList = false;
private Subscription myAppSubscription;
private OfferModel offerModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_data, container, false);
ButterKnife.bind(this, view);
offerModel = new OfferModelImpl();
resources = getActivity().getResources();
CoordinatorLayout layout = (CoordinatorLayout) getActivity().findViewById(R.id.coordinator_layout);
presenter = new DataPresenterImpl(this);
dataAdapter = new DataRecyclerAdapter(layout, getActivity().getApplicationContext(), presenter);
presenter.getAcceptedOffers();
presenter.listenForUndoAccept();
presenter.getAppOffers(getActivity());
presenter.getAppUsages(getActivity());
presenter.getCycle();
return view;
}
@Override
public void onDestroy() {
super.onDestroy();
myAppSubscription.unsubscribe();
}
/**
* Initialize the recycler view with adapter and add subscribers.
*/
private void initRecyclerView() {
AcceptedOfferBinder acceptedOfferBinder = dataAdapter.getOfferBinder();
recyclerView.setAdapter(dataAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
//anim test
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
animator.setAddDuration(200);
animator.setRemoveDuration(200);
myAppSubscription = presenter.addAppUsage(offerModel.getAppOfferStream());
presenter.removeOffer(acceptedOfferBinder.getRemoveOfferStream());
presenter.undoRemoveOffer(offerModel.getUndoOfferRemoveStream());
}
/**
* Populate the recycler view with the relevant data.
*/
private void populateDataRecyclerList() {
//cycle
dataAdapter.setCycle(cycle);
//app usage header
dataAdapter.setDividerHeader(new RecyclerDivider(resources.getString(R.string.app_usage_header), -1));
//usages
dataAdapter.setAppUsage(usages);
//my apps header
dataAdapter.setMyAppHeader(new RecyclerDivider(resources.getString(R.string.my_apps_header), -1));
//my apps
dataAdapter.setMyApps(appOffers);
//Accepted offer header
dataAdapter.setAcceptedOfferHeader(new RecyclerDivider(resources.getString(R.string.add_to_plan_header), 0));
//accepted offers
//filter
List<Offer> dataOffers = new ArrayList<>();
for(Offer offer : acceptedOffers){
if(offer.getType() == PlanConstants.DATA){
dataOffers.add(offer);
}
}
dataAdapter.setCardOffers(dataOffers);
}
/**
* DataView override for displaying the cycle as it emits changes.
* Only initialize the recycler view if it has not been initialized
* before.
*
* @param cycle the cycle that has been updated
*/
@Override
public void displayCycle(Cycle cycle) {
this.cycle = cycle;
if (alreadyInitializedRecyclerList) {
populateDataRecyclerList();
} else {
initRecyclerView();
alreadyInitializedRecyclerList = true;
populateDataRecyclerList();
}
}
/**
* Update the app usages property.
*
* @param appUsages the new value to replace with
*/
@Override
public void displayAppUsages(List<Usage> appUsages) {
this.usages = appUsages;
}
/**
* Update the app offers property.
*
* @param appOffers the new value to replace with
*/
@Override
public void displayAppOffers(List<Offer> appOffers) {
this.appOffers = appOffers;
}
/**
* Update the accepted offers.
*
* @param acceptedOffers the offers to replace with
*/
@Override
public void displayAcceptedOffers(List<Offer> acceptedOffers) {
this.acceptedOffers = acceptedOffers;
}
/**
* Remove an offer from accepted offers array.
*
* @param offer the offer to remove
*/
@Override
public void removeAcceptedOffer(Offer offer) {
this.acceptedOffers.remove(offer);
dataAdapter.removeCardOffer(offer);
}
/**
* Update the adapter with the offer we want to show.
*
* @param offer the offer to be shown
*/
@Override
public void displayCardOffer(Offer offer) {
this.acceptedOffers.add(offer);
if(offer.getType() == PlanConstants.DATA) {
dataAdapter.setCardOffer(offer);
}
}
/**
* Update the adapter with the usage we want to show.
*
* @param newUsage the usage to be shown
*/
@Override
public void displayNewUsage(Usage newUsage) {
dataAdapter.setNewUsage(newUsage);
}
/**
* Update the adapter with the new cycle.
*
* @param cycle the new cycle to be shown
*/
@Override
public void updateCycleView(Cycle cycle) {
dataAdapter.setCycle(cycle);
}
/**
* Update the adapter with a new app offer.
*
* @param offer the app offer to be shown
*/
@Override
public void displayAppOffer(Offer offer) {
dataAdapter.setAppOffer(offer);
}
/**
* Remove an offer from the adapter.
*
* @param offer the offer to remove
*/
@Override
public void removeAppOffer(Offer offer) {
dataAdapter.removeAppOffer(offer);
}
}