package com.mygeopay.wallet.ui;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import com.mygeopay.core.coins.CoinType;
import com.mygeopay.wallet.Configuration;
import com.mygeopay.wallet.Constants;
import com.mygeopay.wallet.ExchangeRatesProvider;
import com.mygeopay.wallet.ExchangeRatesProvider.ExchangeRate;
import com.mygeopay.wallet.R;
import com.mygeopay.wallet.WalletApplication;
import com.mygeopay.wallet.ui.widget.HeaderWithFontIcon;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import static com.mygeopay.wallet.ExchangeRatesProvider.getRates;
/**
* Fragment that restores a wallet
*/
public class SelectCoinsFragment extends Fragment {
private static final Logger log = LoggerFactory.getLogger(SelectCoinsFragment.class);
private Listener mListener;
private String message;
private boolean isMultipleChoice;
private ListView coinList;
private Button nextButton;
private Configuration config;
private Activity activity;
private CoinExchangeListAdapter adapter;
private LoaderManager loaderManager;
private static final int ID_RATE_LOADER = 0;
public static Fragment newInstance(Bundle args) {
SelectCoinsFragment fragment = new SelectCoinsFragment();
fragment.setArguments(args);
return fragment;
}
public static Fragment newInstance(String message, boolean isMultipleChoice, Bundle args) {
args = args != null ? args : new Bundle();
args.putString(Constants.ARG_MESSAGE, message);
args.putBoolean(Constants.ARG_MULTIPLE_CHOICE, isMultipleChoice);
return newInstance(args);
}
public SelectCoinsFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
Bundle args = getArguments();
isMultipleChoice = args.getBoolean(Constants.ARG_MULTIPLE_CHOICE);
message = args.getString(Constants.ARG_MESSAGE);
}
adapter = new CoinExchangeListAdapter(activity, Constants.SUPPORTED_COINS);
String localSymbol = config.getExchangeCurrencyCode();
adapter.setExchangeRates(getRates(getActivity(), localSymbol));
loaderManager.initLoader(ID_RATE_LOADER, null, rateLoaderCallbacks);
}
@Override
public void onDestroy() {
loaderManager.destroyLoader(ID_RATE_LOADER);
super.onDestroy();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_select_coins_list, container, false);
nextButton = (Button) view.findViewById(R.id.button_next);
if (isMultipleChoice) {
nextButton.setEnabled(false);
nextButton.setOnClickListener(getNextOnClickListener());
} else {
nextButton.setVisibility(View.GONE);
}
coinList = (ListView) view.findViewById(R.id.coins_list);
// Set header if needed
if (message != null) {
HeaderWithFontIcon header = new HeaderWithFontIcon(activity);
header.setFontIcon(R.string.font_icon_coins);
header.setMessage(R.string.select_coins);
coinList.addHeaderView(header, null, false);
} else {
View topPaddingView = new View(activity);
topPaddingView.setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.half_standard_margin));
coinList.addHeaderView(topPaddingView, null, false);
}
if (isMultipleChoice) coinList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
coinList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
update(position);
}
});
coinList.setAdapter(adapter);
return view;
}
private View.OnClickListener getNextOnClickListener() {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<String> ids = new ArrayList<String>();
SparseBooleanArray selected = coinList.getCheckedItemPositions();
for (int i = 0; i < selected.size(); i++) {
if (selected.valueAt(i)) {
CoinType type = getCoinType(selected.keyAt(i));
ids.add(type.getId());
}
}
selectCoins(ids);
}
};
}
private void update(int currentSelection) {
if (isMultipleChoice) {
boolean isCoinSelected = false;
SparseBooleanArray selected = coinList.getCheckedItemPositions();
for (int i = 0; i < selected.size(); i++) {
if (selected.valueAt(i)) {
isCoinSelected = true;
break;
}
}
nextButton.setEnabled(isCoinSelected);
} else if (currentSelection >= 0) {
CoinType type = getCoinType(currentSelection);
selectCoins(Lists.newArrayList(type.getId()));
}
}
private CoinType getCoinType(int position) {
return (CoinType) coinList.getItemAtPosition(position);
}
private void selectCoins(ArrayList<String> ids) {
if (mListener != null) {
Bundle args = getArguments() == null ? new Bundle() : getArguments();
args.putStringArrayList(Constants.ARG_MULTIPLE_COIN_IDS, ids);
mListener.onCoinSelection(args);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (Listener) activity;
this.activity = activity;
WalletApplication application = (WalletApplication) activity.getApplication();
config = application.getConfiguration();
loaderManager = getLoaderManager();
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface Listener {
public void onCoinSelection(Bundle args);
}
private final LoaderManager.LoaderCallbacks<Cursor> rateLoaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
String localCurrency = config.getExchangeCurrencyCode();
return new ExchangeRateLoader(getActivity(), config, localCurrency);
}
@Override
public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) {
if (data != null && data.getCount() > 0) {
List<ExchangeRate> rates = new ArrayList<ExchangeRate>(data.getCount());
data.moveToFirst();
do {
ExchangeRate exchangeRate = ExchangeRatesProvider.getExchangeRate(data);
rates.add(exchangeRate);
} while (data.moveToNext());
adapter.setExchangeRates(rates);
}
}
@Override public void onLoaderReset(final Loader<Cursor> loader) { }
};
}