package com.mygeopay.wallet.ui;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.mygeopay.core.coins.CoinType;
import com.mygeopay.core.wallet.WalletPocketHD;
import com.mygeopay.wallet.AddressBookProvider;
import com.mygeopay.wallet.Constants;
import com.mygeopay.wallet.R;
import com.mygeopay.wallet.WalletApplication;
import com.mygeopay.wallet.util.ThrottlingWalletChangeListener;
import com.mygeopay.wallet.util.WeakHandler;
import org.bitcoinj.core.Address;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*/
public class PreviousAddressesFragment extends Fragment {
private static final Logger log = LoggerFactory.getLogger(PreviousAddressesFragment.class);
private static final int UPDATE_VIEW = 0;
private Listener listener;
private CoinType type;
private String accountId;
private WalletPocketHD pocket;
private AddressesListAdapter adapter;
private ContentResolver resolver;
private final Handler handler = new MyHandler(this);
private static class MyHandler extends WeakHandler<PreviousAddressesFragment> {
public MyHandler(PreviousAddressesFragment ref) { super(ref); }
@Override
protected void weakHandleMessage(PreviousAddressesFragment ref, Message msg) {
switch (msg.what) {
case UPDATE_VIEW:
ref.updateView();
}
}
}
private final ContentObserver addressBookObserver = new ContentObserver(handler) {
@Override
public void onChange(final boolean selfChange) {
adapter.clearLabelCache();
}
};
public static PreviousAddressesFragment newInstance(String accountId) {
PreviousAddressesFragment fragment = new PreviousAddressesFragment();
Bundle args = new Bundle();
args.putString(Constants.ARG_ACCOUNT_ID, accountId);
fragment.setArguments(args);
return fragment;
}
public PreviousAddressesFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
accountId = getArguments().getString(Constants.ARG_ACCOUNT_ID);
}
WalletApplication walletApplication = (WalletApplication) getActivity().getApplication();
// TODO
pocket = (WalletPocketHD) walletApplication.getAccount(accountId);
if (pocket == null) {
Toast.makeText(getActivity(), R.string.no_such_pocket_error, Toast.LENGTH_LONG).show();
return;
}
type = pocket.getCoinType();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_previous_addresses, container, false);
final ListView previousAddresses = (ListView) view.findViewById(R.id.previous_addresses);
// Set a space to the beginning and end of the list. If possible find a better way
View spacerView = new View(getActivity());
spacerView.setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.half_standard_margin));
previousAddresses.addHeaderView(spacerView);
spacerView = new View(getActivity());
spacerView.setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.half_standard_margin));
previousAddresses.addFooterView(spacerView);
// Init list adapter
adapter = new AddressesListAdapter(inflater.getContext(), pocket);
previousAddresses.setAdapter(adapter);
// Start TransactionDetailsActivity on click
previousAddresses.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= previousAddresses.getHeaderViewsCount()) {
Object obj = parent.getItemAtPosition(position);
if (obj != null && obj instanceof Address) {
Bundle args = new Bundle();
args.putString(Constants.ARG_ACCOUNT_ID, accountId);
args.putSerializable(Constants.ARG_ADDRESS, (Address)obj);
listener.onAddressSelected(args);
} else {
Toast.makeText(getActivity(), R.string.error_generic, Toast.LENGTH_LONG).show();
}
}
}
});
// Subscribe and update the amount
pocket.addEventListener(walletListener);
updateView();
return view;
}
@Override
public void onResume() {
super.onResume();
resolver.registerContentObserver(AddressBookProvider.contentUri(
getActivity().getPackageName(), type), true, addressBookObserver);
updateView();
}
@Override
public void onPause() {
resolver.unregisterContentObserver(addressBookObserver);
super.onPause();
}
@Override
public void onDestroyView() {
pocket.removeEventListener(walletListener);
walletListener.removeCallbacks();
super.onDestroyView();
}
private void updateView() {
adapter.replace(pocket.getIssuedReceiveAddresses(), pocket.getUsedAddresses());
}
private final ThrottlingWalletChangeListener walletListener = new ThrottlingWalletChangeListener() {
@Override
public void onThrottledWalletChanged() {
handler.sendMessage(handler.obtainMessage(UPDATE_VIEW));
}
};
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (Listener) activity;
resolver = activity.getContentResolver();
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement " + PreviousAddressesFragment.Listener.class);
}
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
public interface Listener {
public void onAddressSelected(Bundle args);
}
}