package my_view; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.app.TimePickerDialog; import android.content.Context; import android.content.Intent; import android.inputmethodservice.KeyboardView; import android.os.Bundle; import android.text.InputType; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; import android.widget.TimePicker; import com.cutil.StringUtils; import com.google.gson.Gson; import com.google.gson.internal.LinkedTreeMap; import com.selectpicker.OptionsPopupWindow; import com.sl.house_property.R; import com.sl.house_property.f1.CarragelistActivity; import com.sl.house_property.f2.PropertyFeeActivity; import com.sl.house_property.user.MyPayActivity; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import entity.RegisterUser; import http.ApiConfig; import my_loader.Loader; import my_loader.Resultcode; import rx.Subscription; import rx.functions.Action1; import tools.Config; import tools.DateTimeUtils; import utils.Constants; import utils.KeyboardUtil; import utils.Md5; public class ConfirmCarmoneyDialog extends Dialog { private CarragelistActivity context; private String title1; private String title2; private String title3; private String title4; private String confirmButtonText; private String cacelButtonText; private ClickListenerInterface clickListenerInterface; private KeyboardUtil keyboardUtil; private EditText carNoEditText; private EditText starttimeText, endtimeText; private View rootView; private OptionsPopupWindow alarmOptionPop; private ProgressDialog progressDialog; private Loader mGankLoader; private String rentId; private String defaultStartTime; private String defaultEndTime; private double price; public interface ClickListenerInterface { public void doConfirm(); public void doCancel(); } public ConfirmCarmoneyDialog(CarragelistActivity context, String title1, String rent_id, String startTime, String endTime, double price) { super(context, R.style.MyDialog); progressDialog = new ProgressDialog(context); this.context = context; this.title1 = title1; this.rentId = rent_id; this.defaultStartTime = startTime; this.defaultEndTime = endTime; this.price = price; } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); init(); carNoEditText = (EditText) findViewById(R.id.car_no_input); carNoEditText.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { hideKeyboard(v); showCarNoInput(); } else { keyboardUtil.hideKeyboard(); } } }); carNoEditText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (keyboardUtil != null && !keyboardUtil.isShow()) { showCarNoInput(); } } }); starttimeText = (EditText) findViewById(R.id.starttime); starttimeText.setInputType(InputType.TYPE_NULL); starttimeText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showStartTimeDialog(); } }); starttimeText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { showStartTimeDialog(); } } }); endtimeText = (EditText) findViewById(R.id.endtime); endtimeText.setInputType(InputType.TYPE_NULL); endtimeText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showEndTimeDialog(); } }); endtimeText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { showEndTimeDialog(); } } }); findViewById(R.id.confirmBtn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { submitData(); } }); } private boolean checkTimeRange(String startTime, String endTime, String selectTime) { String[] startTimeArray = startTime.split(":"); String[] endTimeArray = endTime.split(":"); String[] selectTimeArray = selectTime.split(":"); // 统一转化为分钟进行对比 Long startTimeM = Long.parseLong(startTimeArray[0]) * 60 + Long.parseLong(startTimeArray[1]); Long endTimeM = Long.parseLong(endTimeArray[0]) * 60 + Long.parseLong(endTimeArray[1]); Long selectTimeM = Long.parseLong(selectTimeArray[0]) * 60 + Long.parseLong(selectTimeArray[1]); if (selectTimeM < startTimeM || selectTimeM > endTimeM) { return false; } return true; } private void showEndTimeDialog() { CharSequence timeObj = endtimeText.getText(); String timeStr = timeObj.toString().trim(); String[] timeArr = timeStr.split(":"); final DateTimeUtils dateTimeUtils = new DateTimeUtils(context); if (timeObj != null && !"".equals(timeObj.toString().trim())) { dateTimeUtils.showTimePickerDialog(new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int i, int i1) { endTimeSelected(i, i1); } }, Integer.parseInt(timeArr[0]), Integer.parseInt(timeArr[1])); } else { dateTimeUtils.showTimePickerDialog(new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int i, int i1) { endTimeSelected(i, i1); } }); } } /** * 结束时间选中业务处理 * @param i * @param i1 */ private void endTimeSelected(int i, int i1) { String min = "0"; if (i1 < 10) { min += i1; } else { min = i1 + ""; } String selectTime = i + ":" + min; if (!checkTimeRange(defaultStartTime, defaultEndTime, selectTime)) { context.setToast("请选择规定范围内的时间!"); return; } if (!checkHalfHour(starttimeText.getText().toString(),selectTime)){ context.setToast("停车时间不能小于30分钟!"); return; } endtimeText.setText(selectTime); updateAmount(); } private void showStartTimeDialog() { CharSequence timeObj = starttimeText.getText(); final DateTimeUtils dateTimeUtils = new DateTimeUtils(context); if (timeObj != null && !"".equals(timeObj.toString().trim())) { String timeStr = timeObj.toString().trim(); String[] timeArr = timeStr.split(":"); dateTimeUtils.showTimePickerDialog(new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int i, int i1) { startTimeSelected(i, i1); } }, Integer.parseInt(timeArr[0]), Integer.parseInt(timeArr[1])); } else { dateTimeUtils.showTimePickerDialog(new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int i, int i1) { startTimeSelected(i, i1); } }); } } /** * 开始时间选择业务处理 * @param i * @param i1 */ private void startTimeSelected(int i, int i1) { String min = "0"; if (i1 < 10) { min += i1; } else { min = i1 + ""; } String selectTime = i + ":" + min; if (!checkTimeRange(defaultStartTime, defaultEndTime, selectTime)) { context.setToast("请选择规定范围内的时间!"); return; } if (!checkHalfHour(selectTime,endtimeText.getText().toString())){ context.setToast("停车时间不能小于30分钟!"); return; } starttimeText.setText(selectTime); updateAmount(); } private void showTimeAlert() { final ArrayList stringList = new ArrayList(); for (int i = 1; i <= 12; i++) { stringList.add(i + "小时"); } alarmOptionPop = new OptionsPopupWindow(context); alarmOptionPop.setPicker(stringList); alarmOptionPop.setOnoptionsSelectListener(new OptionsPopupWindow.OnOptionsSelectListener() { @Override public void onOptionsSelect(int position, int option2, int options3) { // ((EditText) findViewById(R.id.hour_stop)).setText(stringList.get(position)); } }); int height = alarmOptionPop.getContentView().getMeasuredHeight(); alarmOptionPop.getContentView().measure(0, 0); alarmOptionPop.showAtLocation(carNoEditText, Gravity.BOTTOM, 0, -height); } private void showCarNoInput() { keyboardUtil = new KeyboardUtil((Activity) context, (KeyboardView) rootView.findViewById(R.id.keyboard_view), carNoEditText); keyboardUtil.hideSoftInputMethod(); keyboardUtil.showKeyboard(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (keyboardUtil != null && keyboardUtil.isShow()) { keyboardUtil.hideKeyboard(); } else { cancel(); } } return false; } public static void hideKeyboard(View view) { InputMethodManager imm = (InputMethodManager) view.getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } public void init() { LayoutInflater inflater = LayoutInflater.from(context); rootView = inflater.inflate(R.layout.confirmcarmoney, null); setContentView(rootView); Window dialogWindow = getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用 lp.width = (int) (d.widthPixels); // 高度设置为屏幕的0.6 dialogWindow.setAttributes(lp); } public void setClicklistener(ClickListenerInterface clickListenerInterface) { this.clickListenerInterface = clickListenerInterface; } private class ClickListener implements View.OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); switch (id) { case R.id.title1: clickListenerInterface.doConfirm(); break; } } } private void updateAmount() { String startTime = starttimeText.getText().toString(); String endTime = endtimeText.getText().toString(); if (!com.cutil.StringUtils.isTrimEmpty(startTime) && !com.cutil.StringUtils.isTrimEmpty(endTime)) { StopResultInfo stopResultInfo = culAmount(); if (stopResultInfo != null && stopResultInfo.getStopAmount() != null) { ((TextView) findViewById(R.id.amountText)).setText("¥" + stopResultInfo.getStopAmount() + ""); } } else { ((TextView) findViewById(R.id.amountText)).setText("¥0"); } } private boolean checkHalfHour(String startTimeStr,String endTimeStr) { StopResultInfo stopResultInfo = null; if (!com.cutil.StringUtils.isTrimEmpty(startTimeStr) && !com.cutil.StringUtils.isTrimEmpty(endTimeStr)) { String[] startTimeArray = startTimeStr.split(":"); String[] endTimeArray = endTimeStr.split(":"); int startHour = Integer.parseInt(startTimeArray[0]); int endHour = Integer.parseInt(endTimeArray[0]); int startM = Integer.parseInt(startTimeArray[1]); int endM = Integer.parseInt(endTimeArray[1]); // 分钟计算 int timeLong = (endHour - startHour) * 60 + (endM - startM); // 计算小时计费单位(超过30分钟算一个小时,不足30分钟不计费) if (timeLong < 30) { return false; } } return true; } private StopResultInfo culAmount() { StopResultInfo stopResultInfo = null; String startTime = starttimeText.getText().toString(); if (com.cutil.StringUtils.isTrimEmpty(startTime)) { context.setToast("请选择开始时间!"); return stopResultInfo; } String endTime = endtimeText.getText().toString(); if (com.cutil.StringUtils.isTrimEmpty(endTime)) { context.setToast("请选择结束时间!"); return stopResultInfo; } String[] startTimeArray = startTime.split(":"); String[] endTimeArray = endTime.split(":"); int startHour = Integer.parseInt(startTimeArray[0]); int endHour = Integer.parseInt(endTimeArray[0]); if (startHour > endHour) { context.setToast("开始时间必须小于结束时间!"); return stopResultInfo; } int startM = Integer.parseInt(startTimeArray[1]); int endM = Integer.parseInt(endTimeArray[1]); if (startHour == endHour && startM >= endM) { context.setToast("开始时间必须小于结束时间!"); return stopResultInfo; } // 分钟计算 int timeLong = (endHour - startHour) * 60 + (endM - startM); // 计算小时计费单位(超过30分钟算一个小时,不足30分钟不计费) if (timeLong < 30) { context.setToast("停车时间不能小于30分钟!"); return stopResultInfo; } // 计费规则可以理解为没个小时的后半个小时才开始叠加计费,所以可以用如下算法来表示 long unitTime = ((timeLong - 30) / 60) + 1; double amount = unitTime * price; return new StopResultInfo(timeLong, amount); } private void submitData() { // check data String carNo = carNoEditText.getText().toString(); if (com.cutil.StringUtils.isTrimEmpty(carNo)) { context.setToast("请输入车牌号!"); return; } StopResultInfo stopResultInfo = culAmount(); if (stopResultInfo == null) { return; } RegisterUser user = Config.getInstance(context).getUser(); Map map = new HashMap<>(); if (user != null) { map.put("userid", user.getUserid()); } else { map.put("userid", 0 + ""); } map.put("rent_id", rentId); map.put("cart_number", carNo); map.put("stop_time", stopResultInfo.getStopLong() + ""); map.put("stop_amount", stopResultInfo.getStopAmount() + ""); map.put("start_stop_time", defaultStartTime); map.put("end_stop_time", defaultEndTime); map.put("app", "Garage"); map.put("class", "Garage_an_AddGarageOrder"); map.put("sign", Md5.md5("Garage" + "Garage_an_AddGarageOrder" + Md5.secret)); getGankList(ApiConfig.BASE_URL, map, "数据提交中...", carNoEditText.getId()); } private void getGankList(String myurl, Map map, String msg, final int requstecode) { progressDialog.setMessage(msg); progressDialog.setCancelable(false); progressDialog.show(); mGankLoader = new Loader(); Subscription subscription = mGankLoader.getMovie(myurl, map).subscribe(new Action1() { @Override public void call(Resultcode resultcode) { progressDialog.dismiss(); if (!(resultcode.status == 0)) { context.setToast(1, resultcode.msg); } if (resultcode.status == 0) { // context.setToast("提交成功!"); LinkedTreeMap data = (LinkedTreeMap) resultcode.data; String s = new Gson().toJson(data); try { JSONObject jsonObject = new JSONObject(s); String orderSn = jsonObject.getString("order_sn"); String stopAmount = jsonObject.getString("stop_amount"); gotoPay(orderSn, stopAmount); } catch (JSONException e) { e.printStackTrace(); } dismiss(); } } }, new Action1() { @Override public void call(Throwable throwable) { progressDialog.dismiss(); context.setToast(2, context.getString(R.string.getdatafailure)); throwable.printStackTrace(); } }); context.addSubscription(subscription); } private void gotoPay(String orderSn, String stopAmount) { // 跳转支付选择界面 Intent intent = new Intent(context, MyPayActivity.class); if (StringUtils.isTrimEmpty(orderSn) || StringUtils.isTrimEmpty(stopAmount) || Double.parseDouble(stopAmount) <= 0) { context.setToast(2, "数据异常!"); return; } intent.putExtra("payNumber", stopAmount); intent.putExtra("title", "停车费"); intent.putExtra("orderSn", orderSn); intent.putExtra("feeCategory", Constants.FeeCategory.PARKING_FEE); context.startActivityForResult(intent,Constants.PAY_REQUEST_CODE); } public class StopResultInfo { private Integer stopLong; private Double stopAmount; private StopResultInfo(Integer stopLong, Double stopAmount) { this.stopAmount = stopAmount; this.stopLong = stopLong; } public Integer getStopLong() { return stopLong; } public void setStopLong(Integer stopLong) { this.stopLong = stopLong; } public Double getStopAmount() { return stopAmount; } public void setStopAmount(Double stopAmount) { this.stopAmount = stopAmount; } } }