package com.xiaomi.xms.sales.ui; import android.app.ProgressDialog; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.text.TextUtils; import android.util.Patterns; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.LayoutParams; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Spinner; import com.xiaomi.xms.sales.R; import com.xiaomi.xms.sales.activity.OrderEditActivity; import com.xiaomi.xms.sales.adapter.EmailSpinnerAdapter; import com.xiaomi.xms.sales.loader.OrderInfoLoader; import com.xiaomi.xms.sales.loader.OrderUserInfoLoader; import com.xiaomi.xms.sales.loader.RequestLoader; import com.xiaomi.xms.sales.loader.RequestLoader.Result; import com.xiaomi.xms.sales.model.Order; import com.xiaomi.xms.sales.model.Tags; import com.xiaomi.xms.sales.request.HostManager; import com.xiaomi.xms.sales.request.Request; import com.xiaomi.xms.sales.ui.OrderEditDetailFragment.RadioButtonInfo.Tag; import com.xiaomi.xms.sales.util.Constants; import com.xiaomi.xms.sales.util.JsonUtil; import com.xiaomi.xms.sales.util.LogUtil; import com.xiaomi.xms.sales.util.PrinterService; import com.xiaomi.xms.sales.util.ToastUtil; import com.xiaomi.xms.sales.util.Utils; import com.xiaomi.xms.sales.widget.BaseAlertDialog; import com.xiaomi.xms.sales.widget.EmptyLoadingView; import com.xiaomi.xms.sales.xmsf.account.LoginManager; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; public class OrderEditDetailFragment extends BaseFragment implements LoaderCallbacks<OrderUserInfoLoader.Result>, OnCheckedChangeListener { private static final String TAG = "OrderEditDetailFragment"; private final static int ORDER_USERINFO_LOADER = 1; private static final int GET_ORDER_INFO = 1001; // LoaderManager用来区别不同的Loader private static final int REQUEST_LOADER = 0; // 用于区分不同的请求 private static final int REQUEST_CODE = 0; private EditText mUserNameText; private EditText mUserTelText; private EditText mUserEmailText; private Spinner mUserEmailSpinner; private EditText mUserEmailDomainText; private RadioGroup mInvoiceRadioGroup; private EditText mInvoiceTitleText; private Button mSubmitBtn; private ProgressDialog mProgressDialog; private EmptyLoadingView mLoadingView; private ViewGroup mInvoiceTitleBg; private String mUserNameStr; private String mUserTelStr; private String mUserEmailStr; private String mInvoiceTitleStr; private String mUserEmailDomainStr; private RequestLoader mRequestLoader; private Handler mHandler = new Handler(); private String mOrderId; private RadioButton mInvoiceRadioButton; private final static int GROUP_INVOICE = 1; private EmailSpinnerAdapter mEmailSpinnerAdapter; private ArrayList<String> mEmailList; private HashMap<Integer, String> mFormDefaultValue = new HashMap<Integer, String>(); private String printerIP; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.order_edit_detail_fragment, container, false); mUserNameText = (EditText) view.findViewById(R.id.order_edit_user_name); mUserTelText = (EditText) view.findViewById(R.id.order_edit_user_tel); mUserEmailText = (EditText) view.findViewById(R.id.order_edit_user_email); mInvoiceTitleText = (EditText) view.findViewById(R.id.order_edit_form_invoice_title); mUserEmailSpinner = (Spinner) view.findViewById(R.id.order_edit_user_email_spinner); mInvoiceRadioGroup = (RadioGroup) view.findViewById(R.id.order_edit_form_radiogroup_invoice); mSubmitBtn = (Button) view.findViewById(R.id.order_edit_submit); mLoadingView = (EmptyLoadingView) view.findViewById(R.id.loading); mInvoiceTitleBg = (ViewGroup) view.findViewById(R.id.corder_edit_form_invoice_title_bg); mUserEmailDomainText = (EditText) view.findViewById(R.id.order_edit_user_email_domain); mEmailSpinnerAdapter = new EmailSpinnerAdapter(getActivity()); mUserEmailSpinner.setAdapter(mEmailSpinnerAdapter); mInvoiceRadioGroup.setOnCheckedChangeListener(this); handleIntent(); return view; } private void handleIntent() { Bundle bundle = getArguments(); if (bundle != null) { String action = bundle.getString(Constants.Intent.EXTRA_ORDER_EDIT_ACTION); mOrderId = bundle.getString(Constants.Intent.EXTRA_PAYMENT_ORDER_ID); printerIP = bundle.getString(Constants.Intent.EXTRA_PRINTER_IP); if (TextUtils.equals(action, "ADD")) { setInvoice(); String[] email = getResources().getStringArray(R.array.email); mEmailList = new ArrayList<String>(Arrays.asList(email)); if (mEmailList != null && mEmailList.size() > 0) { mEmailSpinnerAdapter.updateData(mEmailList); } getActivity().setTitle(R.string.order_add_title); mSubmitBtn.setText(R.string.order_edit_submit); } else if (TextUtils.equals(action, "EDIT")) { getActivity().setTitle(R.string.order_edit_title); mSubmitBtn.setText(R.string.order_edit_confirm); getLoaderManager().initLoader(ORDER_USERINFO_LOADER, null, this); } } } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mSubmitBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (checkInput()) { showDialog(""); // 这里要得到loadManager getLoaderManager().initLoader(REQUEST_LOADER, null, mRequestCallback); Request request = new Request(HostManager.URL_XMS_SALE_API); JSONObject jsonObject = new JSONObject(); try { jsonObject.put("serviceNumber", mOrderId); jsonObject.put(Tags.XMSAPI.USERID, LoginManager.getInstance().getUserId()); jsonObject.put("consignee", mUserNameStr); jsonObject.put("tel", mUserTelStr); String email = ""; if (!TextUtils.isEmpty(mUserEmailDomainStr)) { email = mUserEmailStr + "@" + mUserEmailDomainStr; } else if (!TextUtils.isEmpty(mUserEmailStr)) { email = mUserEmailStr + "@" + mUserEmailSpinner.getSelectedView().getTag().toString(); } jsonObject.put("email", email); jsonObject.put("invoiceType", getDefaultValue(GROUP_INVOICE)); if (TextUtils.equals(getDefaultValue(GROUP_INVOICE), Tags.CheckoutSubmit.INVOICE_ID_COMPANY)) { jsonObject.put("invoiceTitle", mInvoiceTitleStr); } String data = JsonUtil.creatRequestJson(HostManager.Method.METHOD_UPDATECONSIGNEEINF, jsonObject); if (!TextUtils.isEmpty(data)) { request.addParam(Tags.RequestKey.DATA, data); mRequestLoader.load(REQUEST_CODE, request); } } catch (JSONException e) { e.printStackTrace(); } } } }); mUserEmailSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if (TextUtils.equals(view.getTag().toString(), "其它")) { mUserEmailDomainText.setVisibility(View.VISIBLE); mUserEmailSpinner.setVisibility(View.GONE); } } @Override public void onNothingSelected(AdapterView<?> parent) { LogUtil.i(TAG, "onNothingSelected"); } }); } private LoaderCallbacks<RequestLoader.Result> mRequestCallback = new LoaderCallbacks<RequestLoader.Result>() { @Override public Loader<Result> onCreateLoader(int id, Bundle bundle) { mRequestLoader = new RequestLoader(getActivity()); return mRequestLoader; } @Override public void onLoadFinished(Loader<Result> loader, Result data) { if (data != null) { if (REQUEST_CODE == data.mRequestCode) { dismissDialog(); // 每次调用结束必须销毁loader getLoaderManager().destroyLoader(REQUEST_LOADER); if (data.mStatus == Request.STATUS_OK) { JSONObject jsonObj = data.mData; if (jsonObj != null) { LogUtil.d(TAG, jsonObj.toString()); if (Tags.isJSONReturnedOK(jsonObj)) { ToastUtil.show(getActivity(), R.string.order_edit_ok); if(printerIP != null && printerIP.length() > 0){ getLoaderManager().restartLoader(GET_ORDER_INFO, null, new LoaderCallbacks<OrderInfoLoader.Result>() { @Override public OrderInfoLoader onCreateLoader(int id, Bundle arg1) { if (id == GET_ORDER_INFO) { OrderInfoLoader mLoader = new OrderInfoLoader(getActivity()); mLoader.setNeedSecurityKeyTask(false); mLoader.setNeedDatabase(false); mLoader.setOrderId(mOrderId); mLoader.setProgressNotifiable(mLoadingView); return mLoader; } return null; } @Override public void onLoadFinished(Loader<OrderInfoLoader.Result> loader, OrderInfoLoader.Result data) { if (data != null && data.mOrderInfo != null) { final String PRINT_IP = printerIP; final Order order = data.mOrderInfo; new Thread(new Runnable() { @Override public void run() { PrinterService printerService; try { printerService = new PrinterService(PRINT_IP); printerService.print(order,getActivity()); } catch (IOException e) { e.printStackTrace(); } } }).start(); } mHandler.post(new Runnable() { @Override public void run() { ((OrderEditActivity) getActivity()).onBackPressed(true); } }); } @Override public void onLoaderReset(Loader<OrderInfoLoader.Result> loader) { } }); } else{ mHandler.post(new Runnable() { @Override public void run() { ((OrderEditActivity) getActivity()).onBackPressed(true); } }); } } else { ToastUtil.show(getActivity(), R.string.order_edit_error); } } } else { ToastUtil.show(getActivity(), R.string.order_edit_error); } } } } @Override public void onLoaderReset(Loader<Result> arg0) { } }; private boolean checkInput() { mUserNameStr = mUserNameText.getText().toString(); mUserTelStr = mUserTelText.getText().toString(); if (!TextUtils.isEmpty(mUserTelStr)) { if (!isPhoneValid(mUserTelStr) || mUserTelStr.length() != 11) { ToastUtil.show(getActivity(), R.string.order_edit_tel_error_info); mUserTelText.requestFocus(); return false; } } mUserEmailStr = mUserEmailText.getText().toString(); String invoice = getDefaultValue(GROUP_INVOICE); if (TextUtils.isEmpty(invoice) || TextUtils.equals(invoice, "0")) { ToastUtil.show(getActivity(), R.string.order_invoice_empty_info); return false; } if (invoice == Tags.CheckoutSubmit.INVOICE_ID_COMPANY) { mInvoiceTitleStr = mInvoiceTitleText.getText().toString(); if (TextUtils.isEmpty(mInvoiceTitleStr)) { ToastUtil.show(getActivity(), R.string.order_edit_invoice_empty_info); mInvoiceTitleText.requestFocus(); return false; } } if (TextUtils.equals(mUserEmailSpinner.getSelectedView().getTag().toString(), "其它")) { mUserEmailDomainStr = mUserEmailDomainText.getText().toString(); if (TextUtils.isEmpty(mUserEmailDomainStr)) { ToastUtil.show(getActivity(), R.string.order_edit_email_domain_empty_info); mUserEmailDomainText.requestFocus(); return false; } } if (!TextUtils.isEmpty(mUserEmailStr)) { String emailAll = ""; if (!TextUtils.isEmpty(mUserEmailDomainStr)) { emailAll = mUserEmailStr + "@" + mUserEmailDomainStr; } else { emailAll = mUserEmailStr + "@" + mUserEmailSpinner.getSelectedView().getTag().toString(); } if (!isEmailValid(emailAll)) { ToastUtil.show(getActivity(), R.string.order_edit_email_error_info); mUserEmailText.requestFocus(); return false; } } return true; } private boolean isPhoneValid(CharSequence phone) { return Patterns.PHONE.matcher(phone).matches(); } private boolean isEmailValid(CharSequence email) { return Patterns.EMAIL_ADDRESS.matcher(email).matches(); } private void showDialog(String message) { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(getActivity()); } mProgressDialog.setMessage(message); mProgressDialog.setCancelable(true); mProgressDialog.setIndeterminate(false); mProgressDialog.show(); mProgressDialog.setContentView(R.layout.progressbar); } private void dismissDialog() { if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { RadioButton button = (RadioButton) group.findViewById(checkedId); if (group == mInvoiceRadioGroup) { if (TextUtils .equals(button.getTag().toString(), Tags.CheckoutSubmit.INVOICE_ID_COMPANY)) { displayInvoiceTitle(View.VISIBLE, true); mInvoiceRadioButton = button; button.setBackgroundResource(R.drawable.radiobottom_middle_invoice_p); } else { if (mInvoiceRadioButton != null) { mInvoiceRadioButton.setBackgroundResource(R.drawable.radiobutton_bottom_bg); } displayInvoiceTitle(View.GONE, false); } setDefaultValue(GROUP_INVOICE, button.getTag().toString()); } } private void setInvoice() { ArrayList<RadioButtonInfo> buttons = new ArrayList<RadioButtonInfo>(); RadioButtonInfo button2 = new RadioButtonInfo(); button2.mTitle = getString(R.string.checkout_personal_invoice); button2.mTag = Tags.CheckoutSubmit.INVOICE_ID_PERSONAL; buttons.add(button2); RadioButtonInfo button3 = new RadioButtonInfo(); button3.mTitle = getString(R.string.checkout_company_invoice); button3.mTag = Tags.CheckoutSubmit.INVOICE_ID_COMPANY; buttons.add(button3); addRadioButtons(mInvoiceRadioGroup, buttons, getDefaultValue(GROUP_INVOICE)); } private String getDefaultValue(int key) { String ret = mFormDefaultValue.get(key); LogUtil.d(TAG, "getDefaultValue: key is " + key + ", value is " + ret); return ret; } private void setDefaultValue(int key, String value) { LogUtil.d(TAG, "SetDefaultValue: key is " + key + ", value is " + value); mFormDefaultValue.put(key, value); } private void displayInvoiceTitle(int visibility, boolean isShow) { showInput(isShow); mInvoiceTitleBg.setVisibility(visibility); } public void showInput(boolean isShow) { if (isShow) { mInvoiceTitleText.setFocusable(true); mInvoiceTitleText.setFocusableInTouchMode(true); mInvoiceTitleText.requestFocus(); Utils.SoftInput.show(mInvoiceTitleText.getContext(), mInvoiceTitleText); } else { mInvoiceTitleText.setFocusable(false); mInvoiceTitleText.setFocusableInTouchMode(false); Utils.SoftInput.hide(mInvoiceTitleText.getContext(), mInvoiceTitleText.getWindowToken()); } } private void addRadioButtons(RadioGroup group, ArrayList<RadioButtonInfo> items, String defaultValue) { LogUtil.d(TAG, "addRadioButtons"); String value = null; RadioButton first = null; int count = items.size(); for (int i = 0; i < count; i++) { RadioButtonInfo item = items.get(i); RadioButton button = new RadioButton(getActivity()); if (i == 0) { first = button; } button.setText(item.mTitle); if (item.mTags.size() == 0) { button.setTag(item.mTag); } else { for (int j = 0; j < item.mTags.size(); j++) { Tag tag = item.mTags.get(j); button.setTag(tag.key, tag.value); } } group.addView(button); if (count == 1) { button.setBackgroundResource(R.drawable.radiobutton_single_bg); } else if (i == 0) { button.setBackgroundResource(R.drawable.radiobutton_up_bg); } else if (i == count - 1) { button.setBackgroundResource(R.drawable.radiobutton_bottom_bg); } else { button.setBackgroundResource(R.drawable.radiobutton_middle_bg); } button.setButtonDrawable(new ColorDrawable(Color.TRANSPARENT)); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); button.setLayoutParams(params); value = button.getTag().toString(); if (defaultValue == null) { first.setChecked(true); } else if (TextUtils.equals(value, defaultValue)) { button.setChecked(true); } } } class RadioButtonInfo { public String mTitle; public String mTag; public ArrayList<Tag> mTags = new ArrayList<Tag>(); public void addTag(int key, String value) { Tag tag = new Tag(); tag.key = key; tag.value = value; mTags.add(tag); } class Tag { public int key; public String value; } } @Override public Loader<OrderUserInfoLoader.Result> onCreateLoader(int id, Bundle bundle) { if (id == ORDER_USERINFO_LOADER) { mLoader = new OrderUserInfoLoader(getActivity(), mOrderId); mLoader.setProgressNotifiable(mLoadingView); mLoader.setNeedDatabase(false); return (Loader<OrderUserInfoLoader.Result>) mLoader; } return null; } @Override public void onLoadFinished(Loader<OrderUserInfoLoader.Result> arg0, OrderUserInfoLoader.Result data) { mInvoiceRadioGroup.removeAllViews(); String[] email = getResources().getStringArray(R.array.email); mEmailList = new ArrayList<String>(Arrays.asList(email)); if (mEmailList != null && mEmailList.size() > 0) { mEmailSpinnerAdapter.updateData(mEmailList); } String userName = data.mOrderUserInfo.getUserName(); mUserNameText.setText(!TextUtils.isEmpty(userName) && !"null".equals(userName) ? userName : ""); String userTel = data.mOrderUserInfo.getUserTel(); mUserTelText.setText(!TextUtils.isEmpty(userTel) && !"null".equals(userTel) ? userTel : ""); String emailStr = data.mOrderUserInfo.getUserEmail(); if (!TextUtils.isEmpty(emailStr) && !"null".equals(emailStr) && emailStr.contains("@")) { mUserEmailText.setText(emailStr.split("@")[0]); mUserEmailSpinner.setSelection(-1 == mEmailList.indexOf(emailStr.split("@")[1]) ? mEmailList .size() - 1 : mEmailList.indexOf(emailStr.split("@")[1])); mUserEmailDomainText.setText(emailStr.split("@")[1]); } String invoiceType = data.mOrderUserInfo.getInvoiceType(); if (TextUtils.equals("0", invoiceType)) { invoiceType = Tags.CheckoutSubmit.INVOICE_ID_PERSONAL; } setDefaultValue(GROUP_INVOICE, invoiceType); setInvoice(); View button = mInvoiceRadioGroup.getChildAt(Integer.parseInt(invoiceType) - 1); if (TextUtils.equals(invoiceType, Tags.CheckoutSubmit.INVOICE_ID_COMPANY)) { displayInvoiceTitle(View.VISIBLE, false); mInvoiceTitleText.setText(data.mOrderUserInfo.getInvoiceTitle()); mInvoiceTitleText.setSelection(data.mOrderUserInfo.getInvoiceTitle().length()); button.setBackgroundResource(R.drawable.radiobottom_middle_invoice_p); } else { if (mInvoiceRadioButton != null) { mInvoiceRadioButton.setBackgroundResource(R.drawable.radiobutton_bottom_bg); } displayInvoiceTitle(View.GONE, false); } mUserNameText.setSelection(!TextUtils.isEmpty(userName) && !"null".equals(userName) ? userName.length() : 0); mUserNameText.requestFocus(); } @Override public void onLoaderReset(Loader<OrderUserInfoLoader.Result> arg0) { } // 显示退出的Dialog public void showExitDialog() { final BaseAlertDialog dialog = new BaseAlertDialog(getActivity()); dialog.setTitle(R.string.order_user_info_exit_dialog_title); dialog.setMessage(R.string.order_user_info_exit_dialog_message); dialog.setPositiveButton(R.string.order_user_info_exit_dialog_ask_ok, new OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); dialog.show(); } }