package com.venmo.android.pin; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class PinFragment extends Fragment implements PinFragmentImplement { private static final String KEY_FRAGMENT_VIEW_TYPE = "com.venmo.input_fragment_view_type"; private PinListener mListener; private PinDisplayType mPinDisplayType; private BaseViewController mViewController; private PinFragmentConfiguration mConfig; private View mRootView; public static PinFragment newInstanceForVerification() { return newInstanceForVerification(null); } public static PinFragment newInstanceForVerification(PinFragmentConfiguration config) { return newInstance(PinDisplayType.VERIFY, config); } public static PinFragment newInstanceForCreation() { return newInstanceForCreation(null); } public static PinFragment newInstanceForCreation(PinFragmentConfiguration config) { return newInstance(PinDisplayType.CREATE, config); } private static PinFragment newInstance(PinDisplayType type, PinFragmentConfiguration config) { PinFragment instance = new PinFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(KEY_FRAGMENT_VIEW_TYPE, type); instance.setArguments(bundle); instance.setConfig(config); return instance; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); Bundle args = getArguments(); mPinDisplayType = (PinDisplayType) args.getSerializable(KEY_FRAGMENT_VIEW_TYPE); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.layout_pin_view, container, false); setDisplayType(mPinDisplayType); initViewController(); return mRootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (!(activity instanceof PinListener)) { throw new ClassCastException( "Hosting activity must implement PinFragment.Listener"); } else { mListener = (PinListener) activity; if (mConfig == null) setConfig(new PinFragmentConfiguration(getActivity())); } } @Override public Context getContext() { return getActivity(); } @Override public void setConfig(PinFragmentConfiguration config) { mConfig = config; } @Override public PinFragmentConfiguration getConfig() { return mConfig; } public void onPinCreationEntered(String pinEntry) { mPinDisplayType = PinDisplayType.CONFIRM; mViewController = new ConfirmPinViewController(this, mRootView, pinEntry); } public void setViewController(BaseViewController controller) { mViewController = controller; } public void notifyValid() { mListener.onValidated(); } public void notifyCreated() { mListener.onPinCreated(); } public void setDisplayType(PinDisplayType type) { mPinDisplayType = type; } private void initViewController() { switch (mPinDisplayType) { case VERIFY: setViewController(new VerifyPinViewController(this, mRootView)); break; case CREATE: setViewController(new CreatePinViewController(this, mRootView)); break; case CONFIRM: mViewController.refresh(mRootView); break; default: throw new IllegalStateException( "Invalid DisplayType " + mPinDisplayType.toString()); } } }