package com.boardgamegeek.ui.dialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; import android.text.TextUtils; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.DatePicker; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import com.boardgamegeek.R; import com.boardgamegeek.ui.model.PrivateInfo; import com.boardgamegeek.ui.widget.DatePickerDialogFragment; import com.boardgamegeek.util.DateTimeUtils; import com.boardgamegeek.util.DialogUtils; import com.boardgamegeek.util.PresentationUtils; import com.boardgamegeek.util.StringUtils; import java.text.DecimalFormat; import java.util.Calendar; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import hugo.weaving.DebugLog; import icepick.Icepick; import icepick.State; public class PrivateInfoDialogFragment extends DialogFragment { private static final DecimalFormat CURRENCY_FORMAT = new DecimalFormat("0.00"); private static final String DATE_PICKER_DIALOG_TAG = "DATE_PICKER_DIALOG"; public interface PrivateInfoDialogListener { void onFinishEditDialog(PrivateInfo privateInfo); } private ViewGroup root; private PrivateInfoDialogListener listener; @BindView(R.id.price_currency) Spinner priceCurrencyView; @BindView(R.id.price) EditText priceView; @BindView(R.id.current_value_currency) Spinner currentValueCurrencyView; @BindView(R.id.current_value) EditText currentValueView; @BindView(R.id.quantity) EditText quantityView; @BindView(R.id.acquisition_date_label) TextView acquisitionDateLabelView; @BindView(R.id.acquisition_date) TextView acquisitionDateView; @BindView(R.id.acquired_from) EditText acquiredFromView; @BindView(R.id.comment) EditText commentView; @State String priceCurrency; @State double price; @State String currentValueCurrency; @State double currentValue; @State String quantity; @State String acquisitionDate; @State String acquiredFrom; @State String comment; @NonNull public static PrivateInfoDialogFragment newInstance(@Nullable ViewGroup root, PrivateInfoDialogListener listener) { PrivateInfoDialogFragment fragment = new PrivateInfoDialogFragment(); fragment.initialize(root, listener); return fragment; } private void initialize(@Nullable ViewGroup root, PrivateInfoDialogListener listener) { this.root = root; this.listener = listener; } @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); View rootView = layoutInflater.inflate(R.layout.dialog_private_info, root, false); ButterKnife.bind(this, rootView); Icepick.restoreInstanceState(this, savedInstanceState); populateUi(); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Theme_bgglight_Dialog_Alert); builder.setTitle(R.string.title_private_info); builder.setView(rootView) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (listener != null) { PrivateInfo privateInfo = new PrivateInfo(); privateInfo.setPriceCurrency(priceCurrencyView.getSelectedItem().toString()); privateInfo.setPrice(StringUtils.parseDouble(priceView.getText().toString().trim())); privateInfo.setCurrentValueCurrency(currentValueCurrencyView.getSelectedItem().toString()); privateInfo.setCurrentValue(StringUtils.parseDouble(currentValueView.getText().toString().trim())); privateInfo.setQuantity(StringUtils.parseInt(quantityView.getText().toString().trim(), 1)); privateInfo.setAcquisitionDate(acquisitionDate); privateInfo.setAcquiredFrom(acquiredFromView.getText().toString().trim()); privateInfo.setPrivateComment(commentView.getText().toString().trim()); listener.onFinishEditDialog(privateInfo); } } }); final AlertDialog dialog = builder.create(); DialogUtils.requestFocus(dialog); return dialog; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Icepick.saveInstanceState(this, outState); } private void populateUi() { setUpCurrencyView(priceCurrencyView, priceCurrency); setUpValue(priceView, price); setUpCurrencyView(currentValueCurrencyView, currentValueCurrency); setUpValue(currentValueView, currentValue); PresentationUtils.setAndSelectExistingText(quantityView, quantity); showOrHideAcquisitionDateLabel(); acquisitionDateView.setText(DateTimeUtils.formatDateFromApi(getContext(), acquisitionDate)); PresentationUtils.setAndSelectExistingText(acquiredFromView, acquiredFrom); PresentationUtils.setAndSelectExistingText(commentView, comment); } private void setUpCurrencyView(Spinner spinner, String item) { ArrayAdapter<CharSequence> priceCurrencyAdapter = ArrayAdapter.createFromResource(getContext(), R.array.currency, android.R.layout.simple_spinner_item); priceCurrencyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(priceCurrencyAdapter); spinner.setSelection(priceCurrencyAdapter.getPosition(item)); } private void setUpValue(EditText editText, double value) { if (value == 0.0) { editText.setText(""); } else { PresentationUtils.setAndSelectExistingText(editText, CURRENCY_FORMAT.format(value)); } } private void showOrHideAcquisitionDateLabel() { acquisitionDateLabelView.setVisibility(TextUtils.isEmpty(acquisitionDate) ? View.INVISIBLE : View.VISIBLE); } @DebugLog @OnClick(R.id.acquisition_date) public void onDateClick() { final FragmentManager fragmentManager = getFragmentManager(); DatePickerDialogFragment datePickerDialogFragment = (DatePickerDialogFragment) fragmentManager.findFragmentByTag(DATE_PICKER_DIALOG_TAG); if (datePickerDialogFragment == null) { datePickerDialogFragment = new DatePickerDialogFragment(); datePickerDialogFragment.setOnDateSetListener(new OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { acquisitionDate = DateTimeUtils.formatDateForApi(year, monthOfYear, dayOfMonth); Calendar calendar = Calendar.getInstance(); calendar.set(year, monthOfYear, dayOfMonth); acquisitionDateView.setText(DateUtils.formatDateTime(getContext(), calendar.getTimeInMillis(), DateUtils.FORMAT_SHOW_DATE)); showOrHideAcquisitionDateLabel(); } }); } fragmentManager.executePendingTransactions(); datePickerDialogFragment.setCurrentDateInMillis(DateTimeUtils.getMillisFromApiDate(acquisitionDate, System.currentTimeMillis())); datePickerDialogFragment.show(fragmentManager, DATE_PICKER_DIALOG_TAG); } @DebugLog @OnClick(R.id.clear_date) public void onClearDateClick() { acquisitionDate = ""; acquisitionDateView.setText(""); showOrHideAcquisitionDateLabel(); } public void setPriceCurrency(String priceCurrency) { this.priceCurrency = priceCurrency; } public void setPrice(double price) { this.price = price; } public void setCurrentValueCurrency(String currentValueCurrency) { this.currentValueCurrency = currentValueCurrency; } public void setCurrentValue(double currentValue) { this.currentValue = currentValue; } public void setQuantity(int quantity) { this.quantity = String.valueOf(quantity); } public void setAcquisitionDate(String acquisitionDate) { this.acquisitionDate = acquisitionDate; } public void setAcquiredFrom(String acquiredFrom) { this.acquiredFrom = acquiredFrom; } public void setComment(String comment) { this.comment = comment; } }