package co.smartreceipts.android.fragments; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; 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.view.LayoutInflater; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Spinner; import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import co.smartreceipts.android.R; import co.smartreceipts.android.model.Receipt; import co.smartreceipts.android.model.Trip; import co.smartreceipts.android.persistence.database.controllers.TableEventsListener; import co.smartreceipts.android.persistence.database.controllers.impl.ReceiptTableController; import co.smartreceipts.android.persistence.database.controllers.impl.StubTableEventsListener; import co.smartreceipts.android.persistence.database.controllers.impl.TripTableController; import dagger.android.support.AndroidSupportInjection; public class ReceiptMoveCopyDialogFragment extends DialogFragment implements Dialog.OnClickListener { public static final String TAG = ReceiptMoveCopyDialogFragment.class.getSimpleName(); @Inject TripTableController tripTableController; @Inject ReceiptTableController receiptTableController; private Receipt mReceipt; private TableEventsListener<Trip> mTripTableEventsListener; private Spinner mTripSpinner; public static ReceiptMoveCopyDialogFragment newInstance(@NonNull Receipt receipt) { final ReceiptMoveCopyDialogFragment fragment = new ReceiptMoveCopyDialogFragment(); final Bundle args = new Bundle(); args.putParcelable(Receipt.PARCEL_KEY, receipt); fragment.setArguments(args); return fragment; } @Override public void onAttach(Context context) { AndroidSupportInjection.inject(this); super.onAttach(context); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mReceipt = getArguments().getParcelable(Receipt.PARCEL_KEY); mTripTableEventsListener = new UpdateAdapterTrips(); } @SuppressLint("InflateParams") @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final LayoutInflater inflater = LayoutInflater.from(getActivity()); final View dialogView = inflater.inflate(R.layout.dialog_receipt_move_copy, null); mTripSpinner = (Spinner) dialogView.findViewById(R.id.move_copy_spinner); mTripSpinner.setPrompt(getString(R.string.report)); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(getString(R.string.move_copy_item, mReceipt.getName())); builder.setView(dialogView); builder.setCancelable(true); // Note: we change this order from standard Android, so move appears next to copy builder.setPositiveButton(R.string.move, this); builder.setNeutralButton(android.R.string.cancel, this); builder.setNegativeButton(R.string.copy, this); return builder.show(); } @Override public void onResume() { super.onResume(); tripTableController.subscribe(mTripTableEventsListener); tripTableController.get(); } @Override public void onPause() { tripTableController.unsubscribe(mTripTableEventsListener); super.onPause(); } @Override public void onClick(DialogInterface dialogInterface, int which) { final TripNameAdapterWrapper wrapper = (TripNameAdapterWrapper) mTripSpinner.getSelectedItem(); if (which == DialogInterface.BUTTON_POSITIVE) { if (wrapper != null) { receiptTableController.move(mReceipt, wrapper.mTrip); dismiss(); } } else if (which == DialogInterface.BUTTON_NEGATIVE) { if (wrapper != null) { receiptTableController.copy(mReceipt, wrapper.mTrip); dismiss(); } } else { dismiss(); } } private final class UpdateAdapterTrips extends StubTableEventsListener<Trip> { @Override public void onGetSuccess(@NonNull List<Trip> list) { final List<TripNameAdapterWrapper> wrappers = new ArrayList<>(); for (final Trip trip : list) { wrappers.add(new TripNameAdapterWrapper(trip)); } final ArrayAdapter<TripNameAdapterWrapper> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, wrappers); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mTripSpinner.setAdapter(adapter); } } /** * A lazy implementation to take advantage that array adapters just call #toString */ private final class TripNameAdapterWrapper { private final Trip mTrip; public TripNameAdapterWrapper(@NonNull Trip trip) { mTrip = Preconditions.checkNotNull(trip); } @Override public String toString() { return mTrip.getName(); } } }