package com.huhx0015.gw2at.view.fragments;
import android.app.ProgressDialog;
import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.huhx0015.gw2at.R;
import com.huhx0015.gw2at.constants.GW2Constants;
import com.huhx0015.gw2at.model.objects.GW2Account;
import com.huhx0015.gw2at.databinding.FragmentCharacterBinding;
import com.huhx0015.gw2at.interfaces.RetrofitInterface;
import com.huhx0015.gw2at.model.responses.characters.CharacterOverviewResponse;
import com.huhx0015.gw2at.utils.DialogUtils;
import com.huhx0015.gw2at.utils.SnackbarUtils;
import com.huhx0015.gw2at.viewmodels.fragments.CharacterFragmentViewModel;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* Created by Michael Yoon Huh on 2/4/2017.
*/
public class CharacterFragment extends ApiFragment {
/** CLASS VARIABLES ________________________________________________________________________ **/
// DATABINDING VARIABLES
private FragmentCharacterBinding mBinding;
private CharacterFragmentViewModel mViewModel;
// DATA VARIABLES
private List<String> mCharacterList;
private CharacterOverviewResponse mCharacterOverviewResponse;
// LOGGING VARIABLES
private static final String LOG_TAG = CharacterFragment.class.getSimpleName();
// PARCELABLE VARIABLES
private static final String CHARACTER_FRAGMENT_CHARACTER_LIST = LOG_TAG + "_CHARACTER_LIST";
/** CONSTRUCTOR METHODS ____________________________________________________________________ **/
public static CharacterFragment newInstance() {
return new CharacterFragment();
}
/** FRAGMENT LIFECYCLE METHODS _____________________________________________________________ **/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mBinding = DataBindingUtil.inflate(getActivity().getLayoutInflater(), R.layout.fragment_character, null, false);
mViewModel = new CharacterFragmentViewModel();
mBinding.setViewModel(mViewModel);
if (savedInstanceState != null) {
mCharacterList = savedInstanceState.getStringArrayList(CHARACTER_FRAGMENT_CHARACTER_LIST);
if (mCharacterList != null && !mCharacterList.isEmpty()) {
queryCharacterOverview(GW2Account.getInstance().getApiKey(), mCharacterList.get(0));
} else {
queryCharacterList(GW2Account.getInstance().getApiKey());
}
} else {
queryCharacterList(GW2Account.getInstance().getApiKey());
}
return mBinding.getRoot();
}
/** FRAGMENT EXTENSION METHODS _____________________________________________________________ **/
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList(CHARACTER_FRAGMENT_CHARACTER_LIST, new ArrayList<>(mCharacterList));
}
/** NETWORK METHODS ________________________________________________________________________ **/
private void queryCharacterList(final String key) {
final ProgressDialog progressDialog = DialogUtils.createProgressDialog(mContext);
RetrofitInterface charactersResponse = mNetworkAdapter.create(RetrofitInterface.class);
Observable<List<String>> call = charactersResponse.getCharacters(GW2Constants.API_BEARER + key);
call.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(List<String> value) {
mCharacterList = value;
GW2Account.getInstance().setCharacterList(value);
if (!value.isEmpty()) {
queryCharacterOverview(key, value.get(0));
}
}
@Override
public void onError(Throwable t) {
progressDialog.dismiss();
SnackbarUtils.displaySnackbarWithAction(mBinding.getRoot(), t.getLocalizedMessage(),
Snackbar.LENGTH_INDEFINITE, Color.RED, getString(R.string.retry),
new View.OnClickListener() {
@Override
public void onClick(View v) {
queryCharacterList(key);
}
});
Log.e(LOG_TAG, "queryCharacters(): ERROR: " + t.getLocalizedMessage());
}
@Override
public void onComplete() {
progressDialog.dismiss();
}
});
}
private void queryCharacterOverview(final String key, final String id) {
final ProgressDialog progressDialog = DialogUtils.createProgressDialog(mContext);
RetrofitInterface characterOverviewResponse = mNetworkAdapter.create(RetrofitInterface.class);
Observable<CharacterOverviewResponse> call = characterOverviewResponse.getCharacter(GW2Constants.API_BEARER + key, id);
call.subscribeOn(Schedulers.io());
call.observeOn(AndroidSchedulers.mainThread());
call.subscribe(new Observer<CharacterOverviewResponse>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(CharacterOverviewResponse value) {
mCharacterOverviewResponse = value;
mViewModel.setCharacterName(value.getName());
mViewModel.setCharacterRace(value.getRace());
mViewModel.setCharacterGender(value.getGender());
mViewModel.setCharacterProfession(value.getProfession());
mViewModel.setCharacterLevel(value.getLevel().toString());
mViewModel.setCharacterGuild(value.getGuild());
mViewModel.setCharacterAge(value.getAge().toString());
mViewModel.setCharacterCreated(value.getCreated());
mViewModel.setCharacterDeaths(value.getDeaths().toString());
mViewModel.setCharacterVisibility(true);
}
@Override
public void onError(Throwable t) {
progressDialog.dismiss();
SnackbarUtils.displaySnackbarWithAction(mBinding.getRoot(), t.getLocalizedMessage(),
Snackbar.LENGTH_INDEFINITE, Color.RED, getString(R.string.retry),
new View.OnClickListener() {
@Override
public void onClick(View v) {
queryCharacterOverview(key, id);
}
});
Log.e(LOG_TAG, "queryCharacterOverview(): ERROR: " + t.getLocalizedMessage());
}
@Override
public void onComplete() {
progressDialog.dismiss();
}
});
}
}