Commit a45cdb6d by Wyh

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	component-print/src/main/java/com/joe/print/mvp/print/EpsonPrint.java
#	component-print/src/main/java/com/joe/print/mvp/print/service/PrjService.java
#	component-print/src/main/java/com/joe/print/mvp/ui/activity/PrintActivity.java
#	library-common/src/main/java/com/gingersoft/gsa/cloud/common/printer/plugins/PrinterFlowListener.java
#	library-print/src/main/java/com/gingersoft/gsa/cloud/print/PrintSocketHolder.java
parents 33ba7f75 36db1aef
package com.gingersoft.gsa.cloud.download.mvp.presenter;
import android.app.Application;
import android.text.TextUtils;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager;
import com.billy.cc.core.component.CC;
......@@ -55,7 +56,15 @@ import com.jess.arms.utils.DeviceUtils;
import com.jess.arms.utils.RxLifecycleUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.inject.Inject;
......@@ -119,6 +128,10 @@ public class DownloadPresenter extends BasePresenter<DownloadContract.Model, Dow
//當前下載進度
private float currentProgress = 0;
//响应数据保存到本地库的数量
private int saveSuccessCount;
private Map<Integer, Object> responseDataMaps = new HashMap<>();
private List<Observable> mRequestObservables = new ArrayList<>();
private List<Disposable> mDownDisposable = new ArrayList<>();
......@@ -155,6 +168,7 @@ public class DownloadPresenter extends BasePresenter<DownloadContract.Model, Dow
}
requestCount = urlList.length;
saveSuccessCount = 0;
responseSuccessCount = 0;
currentProgress = 0;
IActivity.setTvProgress(0);
......@@ -193,6 +207,7 @@ public class DownloadPresenter extends BasePresenter<DownloadContract.Model, Dow
private void downDataRequest(Observable observable, int downIndex) {
observable
.subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
......@@ -204,10 +219,25 @@ public class DownloadPresenter extends BasePresenter<DownloadContract.Model, Dow
}
@Override
public void onComplete() {
if (responseSuccessCount == requestCount) {
saveToDatabase(0, new OnSaveDownDataListener() {
@Override
public void onComplete(int nextIndex) {
boolean end = saveToDatabase(nextIndex, this);
if (end && saveSuccessCount == requestCount) {
endDownReturn();
}
}
});
}
}
@Override
public void onNext(@NonNull BaseResult result) {
if (result.isSuccess()) {
saveToDatabase(result.getData(), downIndex);
responseDataMaps.put(downIndex, result.getData());
DataDownLoadState loadState = mList.get(downIndex);
loadState.setState(2);
......@@ -215,10 +245,8 @@ public class DownloadPresenter extends BasePresenter<DownloadContract.Model, Dow
currentProgress += loadState.getRatio();
IActivity.setTvProgress(currentProgress);
responseSuccessCount++;
if (responseSuccessCount == requestCount) {
endDownReturn();
}
}
}
......@@ -232,169 +260,209 @@ public class DownloadPresenter extends BasePresenter<DownloadContract.Model, Dow
});
}
private void saveToDatabase(Object data, int downIndex) {
try {
switch (downIndex) {
case 0:
List<Function> functionList = GsonUtils.jsonToList(data, Function.class);
if (functionList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FunctionDaoUtils functionDao = new FunctionDaoUtils(IActivity);
functionDao.deleteAll();
functionDao.insertMultFunction(functionList);
private boolean saveToDatabase(int downIndex, OnSaveDownDataListener saveDownDataListener) {
Object data = responseDataMaps.get(downIndex);
if (data == null) {
return true;
}
int nextIndex = downIndex + 1;
switch (downIndex) {
case 0:
List<Function> functionList = GsonUtils.jsonToList(data, Function.class);
if (functionList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FunctionDaoUtils functionDao = new FunctionDaoUtils(IActivity);
functionDao.deleteAll();
functionDao.insertMultFunction(functionList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
XFunctionManager.newInstance().updateFunctions(functionList);
}
break;
case 1:
List<Food> foodList = GsonUtils.jsonToList(data, Food.class);
if (foodList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FoodDaoUtils foodDao = new FoodDaoUtils(IActivity);
foodDao.deleteAll();
foodDao.insertMultFood(foodList);
}
});
XFunctionManager.newInstance().updateFunctions(functionList);
}
break;
case 1:
List<Food> foodList = GsonUtils.jsonToList(data, Food.class);
if (foodList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FoodDaoUtils foodDao = new FoodDaoUtils(IActivity);
foodDao.deleteAll();
foodDao.insertMultFood(foodList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 2:
List<Modifier> modifierList = GsonUtils.jsonToList(data, Modifier.class);
if (modifierList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ModifierDaoUtils modifierDao = new ModifierDaoUtils(IActivity);
modifierDao.deleteAll();
modifierDao.insertMultModifier(modifierList);
CommonConfiguration.getInstance().saveModifierTopIdConfiguration(modifierList);
}
});
}
break;
case 2:
List<Modifier> modifierList = GsonUtils.jsonToList(data, Modifier.class);
if (modifierList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ModifierDaoUtils modifierDao = new ModifierDaoUtils(IActivity);
modifierDao.deleteAll();
modifierDao.insertMultModifier(modifierList);
CommonConfiguration.getInstance().saveModifierTopIdConfiguration(modifierList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 3:
List<FoodCombo> foodComboList = GsonUtils.jsonToList(data, FoodCombo.class);
if (foodComboList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FoodComboDaoUtils comboDao = new FoodComboDaoUtils(IActivity);
comboDao.deleteAll();
comboDao.insertMultCombo(foodComboList);
CommonConfiguration.getInstance().saveComboIdConfiguration(foodComboList);
}
});
}
break;
case 3:
List<FoodCombo> foodComboList = GsonUtils.jsonToList(data, FoodCombo.class);
if (foodComboList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FoodComboDaoUtils comboDao = new FoodComboDaoUtils(IActivity);
comboDao.deleteAll();
comboDao.insertMultCombo(foodComboList);
CommonConfiguration.getInstance().saveComboIdConfiguration(foodComboList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 4:
List<ComboItem> comboItemList = GsonUtils.jsonToList(data, ComboItem.class);
if (comboItemList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ComboItemDaoUtils comboDao = new ComboItemDaoUtils(IActivity);
comboDao.deleteAll();
comboDao.insertMultCombo(comboItemList);
}
});
}
break;
case 4:
List<ComboItem> comboItemList = GsonUtils.jsonToList(data, ComboItem.class);
if (comboItemList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ComboItemDaoUtils comboDao = new ComboItemDaoUtils(IActivity);
comboDao.deleteAll();
comboDao.insertMultCombo(comboItemList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 5:
List<FoodModifier> foodModifierList = GsonUtils.jsonToList(data, FoodModifier.class);
if (foodModifierList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FoodModifierDaoUtils foodModifierDao = new FoodModifierDaoUtils(IActivity);
foodModifierDao.deleteAll();
foodModifierDao.insertMultFoodModifier(foodModifierList);
}
});
}
break;
case 5:
List<FoodModifier> foodModifierList = GsonUtils.jsonToList(data, FoodModifier.class);
if (foodModifierList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
FoodModifierDaoUtils foodModifierDao = new FoodModifierDaoUtils(IActivity);
foodModifierDao.deleteAll();
foodModifierDao.insertMultFoodModifier(foodModifierList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 6:
List<Discount> discountList = GsonUtils.jsonToList(data, Discount.class);
if (discountList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
DiscountDaoUtils discountDaoUtils = new DiscountDaoUtils(IActivity);
discountDaoUtils.deleteAll();
discountDaoUtils.insertMultDiscount(discountList);
}
});
}
break;
case 6:
List<Discount> discountList = GsonUtils.jsonToList(data, Discount.class);
if (discountList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
DiscountDaoUtils discountDaoUtils = new DiscountDaoUtils(IActivity);
discountDaoUtils.deleteAll();
discountDaoUtils.insertMultDiscount(discountList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 7:
List<ExpandInfo> expandInfoList = GsonUtils.jsonToList(data, ExpandInfo.class);
if (expandInfoList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ExpandInfoDaoUtils expandInfoDaoUtils = new ExpandInfoDaoUtils(IActivity);
expandInfoDaoUtils.deleteAll();
expandInfoDaoUtils.insertMultExpandInfo(expandInfoList);
RestaurantExpandInfoUtils.setCommonExpandInfo(expandInfoList);
}
});
}
break;
case 7:
List<ExpandInfo> expandInfoList = GsonUtils.jsonToList(data, ExpandInfo.class);
if (expandInfoList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ExpandInfoDaoUtils expandInfoDaoUtils = new ExpandInfoDaoUtils(IActivity);
expandInfoDaoUtils.deleteAll();
expandInfoDaoUtils.insertMultExpandInfo(expandInfoList);
RestaurantExpandInfoUtils.setCommonExpandInfo(expandInfoList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 8:
PrinterListBean printerListBean = JsonUtils.parseObject(data, PrinterListBean.class);
if (printerListBean != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
PrinterDeviceDaoUtils printerDeviceDaoUtils = new PrinterDeviceDaoUtils(IActivity);
printerDeviceDaoUtils.deleteAll();
printerDeviceDaoUtils.insertMultPrinterDeviceBean(printerListBean.getList());
}
});
}
break;
case 8:
PrinterListBean printerListBean = JsonUtils.parseObject(data, PrinterListBean.class);
if (printerListBean != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
PrinterDeviceDaoUtils printerDeviceDaoUtils = new PrinterDeviceDaoUtils(IActivity);
printerDeviceDaoUtils.deleteAll();
printerDeviceDaoUtils.insertMultPrinterDeviceBean(printerListBean.getList());
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
case 9:
List<ColorBean> colorBeanList = GsonUtils.jsonToList(data, ColorBean.class);
if (colorBeanList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ColorDaoUtils colorDaoUtils = new ColorDaoUtils(IActivity);
colorDaoUtils.deleteAll();
colorDaoUtils.insertMultColorBean(colorBeanList);
}
});
}
break;
case 9:
List<ColorBean> colorBeanList = GsonUtils.jsonToList(data, ColorBean.class);
if (colorBeanList != null) {
Observable.just(0)
.observeOn(Schedulers.io())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
ColorDaoUtils colorDaoUtils = new ColorDaoUtils(IActivity);
colorDaoUtils.deleteAll();
colorDaoUtils.insertMultColorBean(colorBeanList);
saveSuccessCount++;
if (saveDownDataListener != null) {
saveDownDataListener.onComplete(nextIndex);
}
});
}
break;
}
} catch (Exception e) {
LoganManager.w_code(TAG, "下載異常=" + e.getMessage());
} finally {
}
});
}
break;
}
return false;
}
private void initDownState() {
......@@ -471,4 +539,8 @@ public class DownloadPresenter extends BasePresenter<DownloadContract.Model, Dow
}
mDownDisposable.clear();
}
public interface OnSaveDownDataListener {
void onComplete(int nextIndex);
}
}
......@@ -8,6 +8,7 @@ import com.epson.epos2.Epos2Exception;
import com.epson.epos2.printer.Printer;
import com.epson.epos2.printer.PrinterStatusInfo;
import com.epson.epos2.printer.ReceiveListener;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterPlugins;
import com.gingersoft.gsa.cloud.print.PrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
......@@ -51,6 +52,7 @@ public class EpsonPrint implements ReceiveListener {
mPrinter = new Printer(Printer.TM_U220, Printer.MODEL_TAIWAN, context);
} catch (Exception e) {
e.printStackTrace();
LoganManager.w_printer(TAG, "初始化针式打印机失败:" + e.getMessage());
return false;
}
mPrinter.setReceiveEventListener(this);
......@@ -66,10 +68,11 @@ public class EpsonPrint implements ReceiveListener {
}
while (true) {
try {
LoganManager.w_printer(TAG, "斷開連接");
mPrinter.disconnect();
break;
} catch (final Exception e) {
Log.e(TAG, "斷開連接報錯" + e.getMessage() + e.getClass().getName());
LoganManager.w_printer(TAG, "斷開連接報錯:" + e.getMessage());
if (e instanceof Epos2Exception) {
//Note: If printer is processing such as printing and so on, the disconnect API returns ERR_PROCESSING.
if (((Epos2Exception) e).getErrorStatus() == Epos2Exception.ERR_PROCESSING) {
......@@ -120,6 +123,7 @@ public class EpsonPrint implements ReceiveListener {
} catch (Exception e) {
e.printStackTrace();
mPrinter.clearCommandBuffer();
LoganManager.w_printer(TAG, "創建打印數據失败:" + e.getMessage());
return false;
}
return true;
......@@ -312,7 +316,7 @@ public class EpsonPrint implements ReceiveListener {
private void connectByIp(String ip, PrinterStatusInfo statusInfo) {
if (statusInfo != null) {
Log.e(TAG, "連接狀態1111:" + statusInfo.getConnection());
LoganManager.w_printer(TAG, "連接狀態1111:"+statusInfo.getConnection());
if (statusInfo.getConnection() != 1) {
//未連接
if (connectPrinter(ip)) {
......@@ -321,7 +325,7 @@ public class EpsonPrint implements ReceiveListener {
} else {
//已連接,判斷這次是否是上次的ip,如果不是,斷開連這個ip
if (ipAddress != null && !ipAddress.equals(ip)) {
Log.e(TAG, "不是上次的ip,斷開重連");
LoganManager.w_printer(TAG, "不是上次的ip,斷開重連:" + ip);
disconnectPrinter();
if (connectPrinter(ip)) {
ipAddress = ip;
......@@ -333,7 +337,7 @@ public class EpsonPrint implements ReceiveListener {
ipAddress = ip;
}
}
Log.e(TAG, "連接狀態222:" + statusInfo.getConnection());
LoganManager.w_printer(TAG, "連接狀態222:"+statusInfo.getConnection());
}
private void loginfo(PrinterStatusInfo statusInfo) {
......@@ -361,12 +365,14 @@ public class EpsonPrint implements ReceiveListener {
mPrinter.connect("TCP:" + ip, Printer.PARAM_DEFAULT);
} catch (Exception e) {
Log.e(TAG, "連接打印機報錯" + e.getMessage() + e.getClass().getName());
PrinterPlugins.getOnPrinterFlowHandler().connectionError(e);
e.printStackTrace();
LoganManager.w_printer(TAG, "連接打印機報錯:"+ e.getMessage());
disconnectPrinter();
finalizeObject();
PrinterPlugins.getOnPrinterFlowHandler().connectionError(e);
return false;
}
PrinterPlugins.getOnPrinterFlowHandler().connectionSuccess();
return true;
}
......@@ -384,7 +390,6 @@ public class EpsonPrint implements ReceiveListener {
if (receiveListener != null) {
receiveListener.onPtrReceive(printer, i, printerStatusInfo, ids.get(0));
}
bitmaps.remove(0);
ids.remove(0);
}
......@@ -394,7 +399,6 @@ public class EpsonPrint implements ReceiveListener {
isPrint = false;
disconnectPrinter();
finalizeObject();
}
}
}
......@@ -459,7 +459,7 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
LoganManager.w_printer(TAG, "关闭Socket出错");
break;
}
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(errorCode);
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(null,errorCode);
setPrintState(errorCode);
}
......@@ -644,18 +644,21 @@ public abstract class PrinterRoot<T extends PrintContent> implements PrintSocket
ll_member_info.setVisibility(View.GONE);
}
//生成積分QRCode碼(飯糰APP掃碼獲得積分)
if (TextUtils.isEmpty(integralQrcode) ||
(boolean) RestaurantExpandInfoUtils.getValue(ExpandConstant.ToPrintQRCode, false) == false) {
if ((boolean) RestaurantExpandInfoUtils.getValue(ExpandConstant.ToPrintQRCode, false) == false) {
llIntegralQrcode.setVisibility(View.GONE);
} else {
llIntegralQrcode.setVisibility(View.VISIBLE);
Bitmap QRImage = null;
try {
QRImage = QRCodeUtil.makeQRImage(integralQrcode, 220, 220);
} catch (WriterException e) {
e.printStackTrace();
if (!TextUtils.isEmpty(integralQrcode)) {
llIntegralQrcode.setVisibility(View.VISIBLE);
Bitmap QRImage = null;
try {
QRImage = QRCodeUtil.makeQRImage(integralQrcode, 220, 220);
} catch (WriterException e) {
e.printStackTrace();
}
ivIntegralQrcode.setImageBitmap(QRImage);
} else {
llIntegralQrcode.setVisibility(View.GONE);
}
ivIntegralQrcode.setImageBitmap(QRImage);
}
return view;
}
......
......@@ -12,9 +12,11 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.epson.epos2.Epos2Exception;
import com.epson.epos2.printer.Printer;
import com.epson.epos2.printer.PrinterStatusInfo;
import com.epson.epos2.printer.ReceiveListener;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.common.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager;
......@@ -41,7 +43,9 @@ import com.hyweb.n5.lib.constant.PrinterConstant;
import com.hyweb.n5.lib.util.PrinterUtil;
import com.hyweb.n5.server.aidl.IOnPrintCallback;
import com.joe.print.mvp.print.EpsonPrint;
import com.joe.print.mvp.print.IpPrintMaker;
import com.joe.print.mvp.print.PrintPrjKitchen;
import com.joe.print.mvp.print.PrinterRoot;
import com.joe.print.mvp.print.common.PrinterFinderCallback;
import com.joe.print.mvp.print.common.SendResultCode;
import com.joe.print.mvp.print.maker.PrjPrintMaker;
......@@ -52,6 +56,7 @@ import com.joe.print.mvp.print.usb.UsbPrinterFinder;
import com.joe.print.mvp.print.utils.MyPrintUtils;
import com.sunmi.peripheral.printer.InnerResultCallbcak;
import com.xuexiang.rxutil2.rxjava.RxJavaUtils;
import com.xuexiang.rxutil2.rxjava.task.RxIOTask;
import org.json.JSONArray;
import org.json.JSONException;
......@@ -70,6 +75,7 @@ import java.util.concurrent.TimeUnit;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
......@@ -570,7 +576,7 @@ public class PrjService extends Service implements ReceiveListener {
PrinterPlugins.getOnPrinterFlowHandler().onPrintSuccess();
updatePrjSuccess(key);
} else if (code == SendResultCode.SEND_FAILED) {
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(code);
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(null, code);
updatePrjFailure(key);
}
});
......@@ -906,7 +912,7 @@ public class PrjService extends Service implements ReceiveListener {
//打印成功
updatePrjSuccess(s);
} else {
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(i);
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(null,i);
//打印失敗
updatePrjFailure(s);
}
......
......@@ -5,6 +5,7 @@ import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.util.Log;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.joe.print.mvp.print.common.SendCallback;
import com.joe.print.mvp.print.common.SendResultCode;
......@@ -13,7 +14,10 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UsbPrint {
// private UsbPrint INSTANCE;
private final String TAG = "UsbPrint";
// private UsbPrint INSTANCE;
private final UsbManager usbManager;
private SendCallback sendCallback;
private final ExecutorService threadPool;
......@@ -66,13 +70,14 @@ public class UsbPrint {
connection.close();
int sendResultCode = result > 0 ? SendResultCode.SEND_SUCCESS : SendResultCode.SEND_FAILED;
Log.e("ddd", "發送結果" + sendResultCode);
if (usbPrinter != null && sendCallback != null) {
LoganManager.w_printer(TAG, "發送結果" + sendResultCode);
if(usbPrinter != null && sendCallback != null) {
sendCallback.onCallback(sendResultCode, usbPrinter.getPrinterName());
}
} else {
Log.e("ddd", "連接失敗");
LoganManager.w_printer(TAG, "連接失敗");
}
}
}
......
package com.joe.print.mvp.ui.activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.billy.cc.core.component.CC;
import com.billy.cc.core.component.CCResult;
import com.billy.cc.core.component.CCUtil;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.gingersoft.gsa.cloud.app.GsaCloudApplication;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterFlowListener;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterPlugins;
import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.print.PrintExecutor;
......@@ -28,27 +43,43 @@ import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrintCurrencyBean;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.ui.utils.DialogUtils;
import com.jess.arms.base.BaseActivity;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.joe.print.R;
import com.joe.print.di.component.DaggerPrintComponent;
import com.joe.print.mvp.contract.PrintContract;
import com.joe.print.mvp.presenter.PrintPresenter;
import com.joe.print.mvp.print.EpsonPrint;
import com.joe.print.mvp.print.maker.OpenCashBoxMaker;
import com.joe.print.mvp.print.OpenCashBoxMaker;
import com.joe.print.mvp.print.PrintInstruction;
import com.joe.print.mvp.print.PrintListener;
import com.joe.print.mvp.print.PrintPrjKitchen;
import com.joe.print.mvp.print.PrinterRoot;
import com.joe.print.mvp.print.utils.MyPrintUtils;
import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter;
import com.joe.print.mvp.ui.adapter.PrintProgressAdapter;
import com.joe.print.mvp.ui.view.PrinterLoadingDialog;
import com.joe.print.mvp.ui.view.SelectPrintDevicePopup;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.core.CenterPopupView;
import com.lxj.xpopup.enums.PopupAnimation;
import com.lxj.xpopup.impl.LoadingPopupView;
import com.xuexiang.rxutil2.rxjava.RxJavaUtils;
import com.xuexiang.rxutil2.rxjava.task.RxAsyncTask;
import com.xuexiang.rxutil2.rxjava.task.RxUITask;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import static com.gingersoft.gsa.cloud.common.constans.PrintConstans.PRINT_BILL;
import static com.gingersoft.gsa.cloud.common.constans.PrintConstans.PRINT_OTHER_CLOSING;
import static com.gingersoft.gsa.cloud.common.constans.PrintConstans.PRINT_OTHER_ORDER;
......@@ -100,7 +131,9 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
/**
* 打印進度
*/
private LoadingPopupView loadingPopup;
// private LoadingPopupView loadingPopup;
private PrinterLoadingDialog printerLoadingDialog;
@Override
public void setupActivityComponent(@NonNull AppComponent appComponent) {
......@@ -121,10 +154,14 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override
public void initData(@Nullable Bundle savedInstanceState) {
loadingPopup = new XPopup.Builder(mContext)
.popupAnimation(PopupAnimation.ScaleAlphaFromCenter)
.asLoading("加载中...");
loadingPopup.show();
// loadingPopup = new XPopup.Builder(mContext)
// .popupAnimation(PopupAnimation.ScaleAlphaFromCenter)
// .asLoading("加载中...");
// loadingPopup.show();
printerLoadingDialog = new PrinterLoadingDialog(mContext).build();
printerLoadingDialog.show();
callId = CCUtil.getNavigateCallId(this);
//獲取打印類型,根據打印類型生成對應的bitmap
type = CCUtil.getNavigateParam(this, PrintConstans.PRINT_TYPE, PrintConstans.PRINT_TEST);
......@@ -139,6 +176,49 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
}
//初始化打印配置
initPrintConfig(printContent);
PrinterPlugins.setOnPrinterFlowHandler(new PrinterFlowListener() {
@Override
public void connectionBefore(String deviceName, String IP, int port, long ioTimeout, long printTimeout) {
}
@Override
public void connectionSuccess() {
printerLoadingDialog.setStep(2, PrinterLoadingDialog.status_success);
}
@Override
public void connectionError(Exception e) {
printerLoadingDialog.setStep(2, PrinterLoadingDialog.status_error);
}
@Override
public void disconnect() {
printerLoadingDialog.setStep(4, PrinterLoadingDialog.status_success);
}
@Override
public void onPrinterDataBefore(int orderType, int printType, String printerData, String printerDeviceInfo) {
printerLoadingDialog.setStep(1, PrinterLoadingDialog.status_default);
}
@Override
public void onPrinterBitmapBefore(int orderType, int printType, String directoryName, List<Bitmap> bitmaps) {
printerLoadingDialog.setStep(1, PrinterLoadingDialog.status_success);
}
@Override
public void onPrintSuccess() {
printerLoadingDialog.setStep(3, PrinterLoadingDialog.status_success);
}
@Override
public void onPrintError(Exception e, int errorCode) {
printerLoadingDialog.setStep(3, PrinterLoadingDialog.status_error);
}
});
}
/**
......@@ -185,7 +265,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
//如果彈窗已經關閉,打印機還是為空,說明用戶沒有選擇打印機
if (this.defaultPrint == null) {
printFailure("沒有找到打印機,無法打印");
finish();
killMyself();
}
});
new XPopup.Builder(mContext).asCustom(selectPrintDevicePopup).show();
......@@ -318,13 +398,13 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
}
private void addPrintProgress(String printState) {
loadingPopup.setTitle(printState);
printerLoadingDialog.setTitle(printState);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//doSomeTing,點擊當前頁面任意地方自動關閉
finish();
killMyself();
return true;
}
......@@ -360,10 +440,10 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
break;
case PrintSocketHolder.STATE_4:
tip = "關閉中";
finish();
killMyself();
break;
case FINISH:
finish();
killMyself();
break;
case ADD_PRINT_DEVICE:
addPrintDevice();
......@@ -387,7 +467,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
public void printSuccess() {
LoganManager.w_printer(TAG, "printFailure 打印成功");
CC.sendCCResult(callId, CCResult.success());
finish();
killMyself();
}
@Override
......@@ -398,7 +478,7 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
} else {
CC.sendCCResult(callId, CCResult.error("print error"));
}
finish();
killMyself();
}
@Override
......@@ -491,10 +571,13 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
@Override
protected void onDestroy() {
super.onDestroy();
loadingPopup.dismiss();
//關閉打印頁面時,關閉所有打印連接
//關閉ip打印連接
PrintSocketHolder.getInstance().closeSocket();
//關閉針式打印連接
EpsonPrint.getInstance().disconnectPrinter();
EpsonPrint.getInstance().finalizeObject();
printerLoadingDialog.dismiss();
}
@Override
......
package com.joe.print.mvp.ui.view;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.airbnb.lottie.LottieAnimationView;
import com.gingersoft.gsa.cloud.pay.pos.hywebpos.constant.HywebActionStatusCode;
import com.gingersoft.gsa.cloud.ui.widget.dialog.BaseRetryDialog;
import com.joe.print.R;
import com.qmuiteam.qmui.layout.QMUILinearLayout;
import com.qmuiteam.qmui.util.QMUIDisplayHelper;
import butterknife.BindDrawable;
/**
* 作者:ELEGANT_BIN
* 版本:1.6.0
* 创建日期:2020-03-28
* 修订历史:2020-03-28
* 描述:
*/
public class PrinterLoadingDialog extends BaseRetryDialog {
private static final String TAG = "PrinterLoadingDialog";
private Context mContext;
private TextView tv_generate_print_data, tv_connecting, tv_printing, tv_print_result;
// @BindDrawable(R.drawable.print_grey_point)
// Drawable mGreyDrawable;
// @BindDrawable(R.drawable.print_green_point)
// Drawable mGreedDrawable;
// @BindDrawable(R.drawable.print_red_point)
// Drawable mReaDrawable;
public static final byte status_default = 0;
public static final byte status_success = 1;
public static final byte status_error = 2;
private int mRadius;
private float mShadowAlpha = 0.25f;
private int mShadowElevationDp = 14;
public PrinterLoadingDialog(@NonNull Context context) {
super(context, R.style.MyDialogTheme2);
mContext = context;
mRadius = QMUIDisplayHelper.dp2px(mContext, 8);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCanceledOnTouchOutside(true);
}
@Override
public void show() {
super.show();
}
@Override
public void dismiss() {
super.dismiss();
}
public PrinterLoadingDialog build() {
View contentView = buildViews();
int screenWidth = (int) (QMUIDisplayHelper.getScreenWidth(mContext) * 0.9);
int screenHeight = (int) (QMUIDisplayHelper.getScreenHeight(mContext) * 0.5);
setContentView(contentView, new LinearLayout.LayoutParams(screenWidth, screenHeight));
return this;
}
private View buildViews() {
View view = View.inflate(mContext, getContentViewLayoutId(), null);
QMUILinearLayout ll_container = view.findViewById(R.id.ll_container);
LottieAnimationView printLottieView = view.findViewById(R.id.lottieAnimationView);
tv_generate_print_data = view.findViewById(R.id.tv_generate_print_data);
tv_connecting = view.findViewById(R.id.tv_connecting);
tv_printing = view.findViewById(R.id.tv_printing);
tv_print_result = view.findViewById(R.id.tv_print_result);
ll_container.setRadiusAndShadow(mRadius, QMUIDisplayHelper.dp2px(mContext, mShadowElevationDp), mShadowAlpha);
printLottieView.setAnimation(R.raw.printer_loading3);
printLottieView.loop(true);
// printLottieView.addAnimatorUpdateListener((animation) -> {
// // Do something.动画状态监听回调
//
// });
printLottieView.playAnimation();//播放动画
// //progress范围0~1f,设置动画进度
// printLottieView.setProgress(0.5f);
// // 自定义动画时长,此处利用ValueAnimator值动画来实时更新AnimationView的进度来达到控制动画时长。
// ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(500);
// animator.start();//启动动画
return view;
}
public void setStep(int step, int status) {
tv_generate_print_data.post(new Runnable() {
@Override
public void run() {
switch (step) {
case 1:
if (status == PrinterLoadingDialog.status_success) {
tv_generate_print_data.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_green_point), null, null);
} else if (status == PrinterLoadingDialog.status_error) {
tv_generate_print_data.setCompoundDrawables(null,getDrawableByResId(R.drawable.print_red_point), null, null);
} else {
tv_generate_print_data.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_grey_point), null, null);
}
break;
case 2:
if (status == PrinterLoadingDialog.status_success) {
tv_connecting.setCompoundDrawables(null,getDrawableByResId(R.drawable.print_green_point), null, null);
} else if (status == PrinterLoadingDialog.status_error) {
tv_connecting.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_red_point), null, null);
} else {
tv_connecting.setCompoundDrawables(null,getDrawableByResId(R.drawable.print_grey_point), null, null);
}
break;
case 3:
if (status == PrinterLoadingDialog.status_success) {
tv_printing.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_green_point), null, null);
} else if (status == PrinterLoadingDialog.status_error) {
tv_printing.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_red_point), null, null);
} else {
tv_printing.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_grey_point), null, null);
}
break;
case 4:
if (status == PrinterLoadingDialog.status_success) {
tv_print_result.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_green_point), null, null);
} else if (status == PrinterLoadingDialog.status_error) {
tv_print_result.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_red_point), null, null);
} else {
tv_print_result.setCompoundDrawables(null, getDrawableByResId(R.drawable.print_grey_point), null, null);
}
break;
default:
break;
}
}
});
}
private Drawable getDrawableByResId(int resId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return mContext.getDrawable(resId);
}
return mContext.getResources().getDrawable(resId);
}
protected int getContentViewLayoutId() {
return R.layout.print_dialog_loading;
}
private OnClickListener onClickListener;
public void setOnClickListener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public interface OnClickListener {
// void onItemClick(FoodReason item, int position, int deleteNumber);
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/green" />
<size
android:width="@dimen/dp_10"
android:height="@dimen/dp_10" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/theme_grey_color" />
<size
android:width="@dimen/dp_10"
android:height="@dimen/dp_10" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/red" />
<size
android:width="@dimen/dp_10"
android:height="@dimen/dp_10" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.qmuiteam.qmui.layout.QMUILinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@color/theme_white_color"
android:orientation="vertical">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottieAnimationView"
android:layout_width="@dimen/dp_150"
android:layout_height="@dimen/dp_150"
android:layout_gravity="center_horizontal"
app:lottie_autoPlay="true"
app:lottie_loop="true" />
<!-- 打印前數據信息,圖片->連接成功(失敗)->打印中->打印成功(失敗)->斷開連接-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_generate_print_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/print_grey_point"
android:text="生成打印數據"
android:textColor="@color/black"
android:textSize="@dimen/sp_10" />
<View
android:layout_width="@dimen/dp_50"
android:layout_height="1px"
android:background="@color/black" />
<TextView
android:id="@+id/tv_connecting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/print_grey_point"
android:text="連接中"
android:textColor="@color/black"
android:textSize="@dimen/sp_10" />
<View
android:layout_width="@dimen/dp_50"
android:layout_height="1px"
android:background="@color/black" />
<TextView
android:id="@+id/tv_printing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/print_grey_point"
android:text="打印中"
android:textColor="@color/black"
android:textSize="@dimen/sp_10" />
<View
android:layout_width="@dimen/dp_50"
android:layout_height="1px"
android:background="@color/black" />
<TextView
android:id="@+id/tv_print_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/print_grey_point"
android:text="結果"
android:textColor="@color/black"
android:textSize="@dimen/sp_10" />
</LinearLayout>
</com.qmuiteam.qmui.layout.QMUILinearLayout>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"v": "5.5.7",
"meta": {
"g": "LottieFiles AE 0.1.20",
"a": "",
"k": "",
"d": "",
"tc": "#FFFFFF"
},
"fr": 60,
"ip": 0,
"op": 70,
"w": 1920,
"h": 1080,
"nm": "Printer1",
"ddd": 0,
"assets": [
{
"id": "image_0",
"w": 971,
"h": 803,
"u": "",
"p": "data:image/png;base64,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",
"e": 1
},
{
"id": "image_1",
"w": 511,
"h": 330,
"u": "",
"p": "data:image/png;base64,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",
"e": 1
},
{
"id": "image_2",
"w": 511,
"h": 260,
"u": "",
"p": "data:image/png;base64,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",
"e": 1
},
{
"id": "comp_0",
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Layer 2 Outlines",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
982.613,
813.599,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
27.446,
27.451,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ix": 1,
"ks": {
"a": 0,
"k": {
"i": [
[
0,
-15.021
],
[
-15.021,
0
],
[
0,
15.024
],
[
15.019,
0
]
],
"o": [
[
0,
15.024
],
[
15.019,
0
],
[
0,
-15.021
],
[
-15.021,
0
]
],
"v": [
[
-27.196,
-0.014
],
[
-0.016,
27.201
],
[
27.196,
-0.014
],
[
-0.016,
-27.201
]
],
"c": true
},
"ix": 2
},
"nm": "Path 1",
"mn": "ADBE Vector Shape - Group",
"hd": false
},
{
"ty": "fl",
"c": {
"a": 1,
"k": [
{
"i": {
"x": [
0.667
],
"y": [
1
]
},
"o": {
"x": [
0.333
],
"y": [
0
]
},
"t": 0,
"s": [
0.239215686275,
0.901960784314,
0.713725490196,
1
]
},
{
"i": {
"x": [
0.667
],
"y": [
1
]
},
"o": {
"x": [
0.333
],
"y": [
0
]
},
"t": 30,
"s": [
1,
1,
1,
1
]
},
{
"t": 60,
"s": [
0.239215686917,
0.901960790157,
0.713725507259,
1
]
}
],
"ix": 4
},
"o": {
"a": 0,
"k": 100,
"ix": 5
},
"r": 1,
"bm": 0,
"nm": "Fill 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
27.446,
27.451
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transform"
}
],
"nm": "Group 1",
"np": 2,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 90,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Layer 3 Outlines",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
982.613,
737.809,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
27.446,
27.455,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ix": 1,
"ks": {
"a": 0,
"k": {
"i": [
[
0,
-15.037
],
[
-15.021,
0
],
[
0,
15.008
],
[
15.019,
0
]
],
"o": [
[
0,
15.008
],
[
15.019,
0
],
[
0,
-15.037
],
[
-15.021,
0
]
],
"v": [
[
-27.196,
0.013
],
[
-0.016,
27.205
],
[
27.196,
0.013
],
[
-0.016,
-27.205
]
],
"c": true
},
"ix": 2
},
"nm": "Path 1",
"mn": "ADBE Vector Shape - Group",
"hd": false
},
{
"ty": "fl",
"c": {
"a": 1,
"k": [
{
"i": {
"x": [
0.667
],
"y": [
1
]
},
"o": {
"x": [
0.333
],
"y": [
0
]
},
"t": 0,
"s": [
1,
1,
1,
1
]
},
{
"i": {
"x": [
0.667
],
"y": [
1
]
},
"o": {
"x": [
0.333
],
"y": [
0
]
},
"t": 30,
"s": [
0.241020619869,
0.901176571846,
0.712560653687,
1
]
},
{
"t": 60,
"s": [
1,
1,
1,
1
]
}
],
"ix": 4
},
"o": {
"a": 0,
"k": 100,
"ix": 5
},
"r": 1,
"bm": 0,
"nm": "Fill 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
27.446,
27.455
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transform"
}
],
"nm": "Group 1",
"np": 2,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 90,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 2,
"nm": "MainPRinter",
"refId": "image_0",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
561,
529.497,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
485.229,
401.141,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"ip": 0,
"op": 90,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 4,
"ty": 2,
"nm": "Layer 5",
"refId": "image_1",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 1,
"k": [
{
"i": {
"x": 0.833,
"y": 0.833
},
"o": {
"x": 0.167,
"y": 0.167
},
"t": 25,
"s": [
560.992,
555.489,
0
],
"to": [
0,
51,
0
],
"ti": [
0,
-51,
0
]
},
{
"t": 55,
"s": [
560.992,
861.489,
0
]
}
],
"ix": 2
},
"a": {
"a": 0,
"k": [
255.107,
164.761,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"ef": [
{
"ty": 21,
"nm": "Fill",
"np": 9,
"mn": "ADBE Fill",
"ix": 1,
"en": 1,
"ef": [
{
"ty": 10,
"nm": "Fill Mask",
"mn": "ADBE Fill-0001",
"ix": 1,
"v": {
"a": 0,
"k": 0,
"ix": 1
}
},
{
"ty": 7,
"nm": "All Masks",
"mn": "ADBE Fill-0007",
"ix": 2,
"v": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": 2,
"nm": "Color",
"mn": "ADBE Fill-0002",
"ix": 3,
"v": {
"a": 0,
"k": [
0.239215686917,
0.901960790157,
0.713725507259,
1
],
"ix": 3
}
},
{
"ty": 7,
"nm": "Invert",
"mn": "ADBE Fill-0006",
"ix": 4,
"v": {
"a": 0,
"k": 0,
"ix": 4
}
},
{
"ty": 0,
"nm": "Horizontal Feather",
"mn": "ADBE Fill-0003",
"ix": 5,
"v": {
"a": 0,
"k": 0,
"ix": 5
}
},
{
"ty": 0,
"nm": "Vertical Feather",
"mn": "ADBE Fill-0004",
"ix": 6,
"v": {
"a": 0,
"k": 0,
"ix": 6
}
},
{
"ty": 0,
"nm": "Opacity",
"mn": "ADBE Fill-0005",
"ix": 7,
"v": {
"a": 0,
"k": 1,
"ix": 7
}
}
]
}
],
"ip": 0,
"op": 90,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 5,
"ty": 2,
"nm": "Layer 6",
"refId": "image_2",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 1,
"k": [
{
"i": {
"x": 0.667,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 0,
"s": [
560.991,
-72.462,
0
],
"to": [
0,
45.667,
0
],
"ti": [
0,
-45.667,
0
]
},
{
"t": 31,
"s": [
560.991,
201.538,
0
]
}
],
"ix": 2
},
"a": {
"a": 0,
"k": [
255.107,
129.788,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"ef": [
{
"ty": 21,
"nm": "Fill",
"np": 9,
"mn": "ADBE Fill",
"ix": 1,
"en": 1,
"ef": [
{
"ty": 10,
"nm": "Fill Mask",
"mn": "ADBE Fill-0001",
"ix": 1,
"v": {
"a": 0,
"k": 0,
"ix": 1
}
},
{
"ty": 7,
"nm": "All Masks",
"mn": "ADBE Fill-0007",
"ix": 2,
"v": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": 2,
"nm": "Color",
"mn": "ADBE Fill-0002",
"ix": 3,
"v": {
"a": 0,
"k": [
0.239215686917,
0.901960790157,
0.713725507259,
1
],
"ix": 3
}
},
{
"ty": 7,
"nm": "Invert",
"mn": "ADBE Fill-0006",
"ix": 4,
"v": {
"a": 0,
"k": 0,
"ix": 4
}
},
{
"ty": 0,
"nm": "Horizontal Feather",
"mn": "ADBE Fill-0003",
"ix": 5,
"v": {
"a": 0,
"k": 0,
"ix": 5
}
},
{
"ty": 0,
"nm": "Vertical Feather",
"mn": "ADBE Fill-0004",
"ix": 6,
"v": {
"a": 0,
"k": 0,
"ix": 6
}
},
{
"ty": 0,
"nm": "Opacity",
"mn": "ADBE Fill-0005",
"ix": 7,
"v": {
"a": 0,
"k": 1,
"ix": 7
}
}
]
}
],
"ip": 0,
"op": 90,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 6,
"ty": 2,
"nm": "Layer 4",
"refId": "image_2",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 1,
"k": [
{
"i": {
"x": 0.667,
"y": 1
},
"o": {
"x": 0.333,
"y": 0
},
"t": 0,
"s": [
560.991,
201.538,
0
],
"to": [
0,
48.833,
0
],
"ti": [
0,
-48.833,
0
]
},
{
"t": 31,
"s": [
560.991,
494.538,
0
]
}
],
"ix": 2
},
"a": {
"a": 0,
"k": [
255.107,
129.788,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"ef": [
{
"ty": 21,
"nm": "Fill",
"np": 9,
"mn": "ADBE Fill",
"ix": 1,
"en": 1,
"ef": [
{
"ty": 10,
"nm": "Fill Mask",
"mn": "ADBE Fill-0001",
"ix": 1,
"v": {
"a": 0,
"k": 0,
"ix": 1
}
},
{
"ty": 7,
"nm": "All Masks",
"mn": "ADBE Fill-0007",
"ix": 2,
"v": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": 2,
"nm": "Color",
"mn": "ADBE Fill-0002",
"ix": 3,
"v": {
"a": 0,
"k": [
0.239215686917,
0.901960790157,
0.713725507259,
1
],
"ix": 3
}
},
{
"ty": 7,
"nm": "Invert",
"mn": "ADBE Fill-0006",
"ix": 4,
"v": {
"a": 0,
"k": 0,
"ix": 4
}
},
{
"ty": 0,
"nm": "Horizontal Feather",
"mn": "ADBE Fill-0003",
"ix": 5,
"v": {
"a": 0,
"k": 0,
"ix": 5
}
},
{
"ty": 0,
"nm": "Vertical Feather",
"mn": "ADBE Fill-0004",
"ix": 6,
"v": {
"a": 0,
"k": 0,
"ix": 6
}
},
{
"ty": 0,
"nm": "Opacity",
"mn": "ADBE Fill-0005",
"ix": 7,
"v": {
"a": 0,
"k": 1,
"ix": 7
}
}
]
}
],
"ip": 0,
"op": 90,
"st": 0,
"bm": 0
}
]
}
],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 0,
"nm": "5572 [Converted]",
"refId": "comp_0",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
960,
540,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
561,
561,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6
}
},
"ao": 0,
"w": 1122,
"h": 1122,
"ip": 0,
"op": 90,
"st": 0,
"bm": 0
}
],
"markers": []
}
\ No newline at end of file
{"v":"5.5.10","fr":30,"ip":0,"op":90,"w":300,"h":300,"nm":"sec2-02","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-60.812,22.5],[-60.75,52.75],[63.75,53.25],[63.625,21.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-60.812,22.5],[-60.725,60.15],[63.775,60.55],[63.625,21.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-60.812,22.5],[-60.725,60.15],[63.775,60.55],[63.625,21.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-60.812,22.5],[-60.725,60.15],[63.775,60.55],[63.625,21.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-60.812,22.5],[-60.667,77.417],[63.833,77.583],[63.625,21.5]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-60.812,22.5],[-60.625,89.75],[63.875,89.75],[63.625,21.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":15,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim In Path","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,122.333,0],"ix":2},"a":{"a":0,"k":[125,110.667,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[192,94.333],[162,94.333]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[8.187,0],[0,0],[0,-8.187],[0,0],[-8.187,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,8.188],[0,0]],"o":[[0,0],[0,-8.187],[0,0],[-8.187,0],[0,0],[0,8.188],[0,0],[0,0],[0,0],[0,0],[0,0],[8.187,0],[0,0],[0,0]],"v":[[95,-17.5],[95,-45.86],[80.11,-60.5],[-80.11,-60.5],[-95,-45.86],[-95,45.368],[-80.11,60.5],[-61,60.5],[-61,29.5],[64,29.5],[64,60.5],[80.11,60.5],[95,45.368],[95,6.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[125,130.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.8,0],[0,0],[0,-14.8],[0,0],[0,0],[0,0]],"o":[[0,0],[-14.801,0],[0,0],[0,0],[0,0],[0,-14.8]],"v":[[39.974,-20.241],[-39.972,-20.241],[-66.771,6.557],[-66.771,20.241],[66.772,20.241],[66.772,6.557]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[125,50.241],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":15,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim In Path","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
......@@ -288,6 +288,8 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
return;
}
LoganManager.w_tableMode(TAG, LoganManager.EVENT_SELECTED, "食品【" + datasBean.getProductName() + "】");
RvMealClicked = true;
//设置当前操作的食品
mCurrentOrderDetailBean = datasBean;
......@@ -895,17 +897,16 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
* @param initTable 是否是開台
*/
private void printSendOrder(boolean initTable) {
if (DoshokuOrder.getInstance().getNewFoodList() == null || DoshokuOrder.getInstance().getNewFoodList().size() <= 0) {
//沒有新的食品時,不打印送單
IActivity.returnBeforeActivity(initTable);
return;
}
if (RestaurantExpandInfoUtils.getValue(ExpandConstant.AutoPrinterPaper, true)) {
if (RestaurantExpandInfoUtils.getValue(ExpandConstant.MergeSendFood, true)) {
//合并主食品
mergeMainFoodNumber(mOrderMealList);
}
//餐檯送單
if (DoshokuOrder.getInstance().getNewFoodList() == null || DoshokuOrder.getInstance().getNewFoodList().size() <= 0) {
//沒有新的食品時,不打印送單
IActivity.returnBeforeActivity(initTable);
return;
}
PrintContent printContent = new PrintContentAdapter().adaptationSendOrderPaperContent(DoshokuOrder.getInstance(), mTableInfo);
CC.obtainBuilder(ComponentName.COMPONENT_PRINT)
......@@ -1131,15 +1132,15 @@ public class MealStandPresenter extends BaseOrderPresenter<MealStandContract.Mod
if (!deleteFood.isNew()) {
//TODO 刪除已下單食品
if (!deleteFood.isModify()) {
LoganManager.w_tableMode(TAG, LoganManager.EVENT_CLICK + "刪除已下單食品【" + deleteFood.getRemark() + "】");
LoganManager.w_tableMode(TAG, LoganManager.EVENT_CLICK + "已下單食品【" + deleteFood.getProductName() + "】");
deleteWithOrderedFood(deleteFood);
}
} else {
if (deleteStyle == 2) {
LoganManager.w_tableMode(TAG, LoganManager.EVENT_LONG_CLICK + "刪除【" + deleteFood.getRemark() + "】");
LoganManager.w_tableMode(TAG, LoganManager.EVENT_DELETE + "食品【" + deleteFood.getProductName() + "】");
mSelectMealAdapter.removeAllNewFoodItem();
} else {
LoganManager.w_tableMode(TAG, LoganManager.EVENT_CLICK + "刪除【" + deleteFood.getRemark() + "】");
LoganManager.w_tableMode(TAG, LoganManager.EVENT_DELETE + "食品【" + deleteFood.getProductName() + "】");
int deletePosition = mSelectMealAdapter.removeFoodItem();
mRootView.setMealRvScrollToPosition(deletePosition);
//更新最大可選數
......
......@@ -100,6 +100,7 @@ import butterknife.BindView;
import butterknife.OnClick;
import butterknife.OnLongClick;
import static com.gingersoft.gsa.cloud.common.utils.log.LogUtil.v;
import static com.jess.arms.utils.Preconditions.checkNotNull;
......@@ -722,12 +723,20 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
}
@OnClick({R2.id.btn_key1, R2.id.btn_key2, R2.id.btn_key3, R2.id.btn_key4, R2.id.btn_key5, R2.id.btn_keys,
R2.id.btn_numberman, R2.id.btn_fid, R2.id.btn_meal_delete, R2.id.btn_meal_modify_restore, R2.id.btn_send_order, R2.id.tv_no_save_return, R2.id.fl_order_content,
R2.id.btn_numberman, R2.id.btn_fid, R2.id.btn_meal_delete, R2.id.btn_meal_modify_restore, R2.id.btn_send_order, R2.id.tv_no_save_return, R2.id.tv_order_content,
R2.id.btn_taste, R2.id.btn_msg, R2.id.btn_delete, R2.id.btn_end, R2.id.iv_fine_back})
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
LoganManager.w_tableMode(TAG, LoganManager.EVENT_CLICK, v.getTransitionName());
String text = null;
if (v instanceof Button) {
Button button = (Button) v;
text = button.getText().toString();
} else if (v instanceof TextView) {
TextView textView = (TextView) v;
text = textView.getText().toString();
}
LoganManager.w_tableMode(TAG, LoganManager.EVENT_CLICK, text);
}
recordOperat(true);
......@@ -776,7 +785,7 @@ public class MealStandActivity extends BaseFragmentActivity<MealStandPresenter>
mPresenter.sendOrder(false, null);
// }
// });
} else if (id == R.id.fl_order_content) {
} else if (id == R.id.tv_order_content) {
//如果打印成功會回調
Intent intent = new Intent(mContext, OrderContentActivity.class);
startActivityForResult(intent, ORDER_CONTENT_CODE);
......
......@@ -315,9 +315,9 @@ public class SoldoutCtrlActivity extends BaseFragmentActivity<SoldoutCtrlPresent
//循坏加入点点图片组
ivPoints[i] = new ImageView(this);
if (i == 0) {
ivPoints[i].setImageResource(R.drawable.base_recycle_bottom_point_focuese);
ivPoints[i].setImageResource(R.drawable.base_red_point);
} else {
ivPoints[i].setImageResource(R.drawable.base_recycle_bottom_point_unfocused);
ivPoints[i].setImageResource(R.drawable.base_grey_point);
}
ivPoints[i].setPadding(0, 0, 0, 0);
ll_food_group_point.addView(ivPoints[i]);
......@@ -714,9 +714,9 @@ public class SoldoutCtrlActivity extends BaseFragmentActivity<SoldoutCtrlPresent
mPageIndex = pageIndex;
for (int i = 0; i < totalPage; i++) {
if (i == pageIndex) {
ivPoints[i].setImageResource(R.drawable.base_recycle_bottom_point_focuese);
ivPoints[i].setImageResource(R.drawable.base_red_point);
} else {
ivPoints[i].setImageResource(R.drawable.base_recycle_bottom_point_unfocused);
ivPoints[i].setImageResource(R.drawable.base_grey_point);
}
}
}
......
......@@ -217,8 +217,8 @@ public class TableActivity extends BaseFragmentActivity<TablePresenter> implemen
@Override
public void onClick(View v) {
LoganManager.w_tableMode(TAG, "手動刷新餐檯數據");
launchActivity(new Intent(mContext, CoordinatorlayoutActivity.class));
// getTables(true, null);
// launchActivity(new Intent(mContext, CoordinatorlayoutActivity.class));
getTables(true, null);
}
});
rightButton2.setOnClickListener(new View.OnClickListener() {
......
......@@ -97,16 +97,14 @@ public class BillItemAdapter extends DefaultAdapter<BillItem> {
tv_money.setText(cashStr + datasBean.getMoney());
}
if (datasBean instanceof ServiceChargeItem) {
if (isUseFreeServicePayMethod) {
// 中划线
tv_title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
tv_money.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
} else {
// 取消设置的的划线
tv_title.getPaint().setFlags(0);
tv_money.getPaint().setFlags(0);
}
// 默认没有划线
tv_title.getPaint().setFlags(0);
tv_money.getPaint().setFlags(0);
if (datasBean instanceof ServiceChargeItem && isUseFreeServicePayMethod) {
// 中划线
tv_title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
tv_money.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
}
tv_title.setTextSize(BillTotalFontSize);
......@@ -115,10 +113,13 @@ public class BillItemAdapter extends DefaultAdapter<BillItem> {
tv_title.setTextColor(datasBean.getTextColor());
tv_money.setTextColor(datasBean.getTextColor());
// if (mContext instanceof OrderContentActivity &&
// (datasBean.getType() == BillOrderMoney.NOMAL_DISCOUNT_TYPE || datasBean.getType() == BillOrderMoney.COUPON_DISCOUNT_TYPE) &&
// datasBean.getType() != BillOrderMoney.MEMBER_DISCOUNT_TYPE &&
// datasBean.getStatus() == 0) {
if (mContext instanceof OrderContentActivity &&
(datasBean.getType() == BillOrderMoney.NOMAL_DISCOUNT_TYPE || datasBean.getType() == BillOrderMoney.COUPON_DISCOUNT_TYPE) &&
datasBean.getType() != BillOrderMoney.MEMBER_DISCOUNT_TYPE &&
datasBean.getStatus() == 0) {
datasBean.getType() != BillOrderMoney.MEMBER_DISCOUNT_TYPE) {
iv_delete.setVisibility(View.VISIBLE);
iv_delete.setOnClickListener(v -> {
if (mOnItemClickListener != null) {
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<?xml version="1.0" encoding="utf-8"?><!--<androidx.coordinatorlayout.widget.CoordinatorLayout-->
<!-- xmlns:android="http://schemas.android.com/apk/res/android"-->
<!-- xmlns:app="http://schemas.android.com/apk/res-auto"-->
<!-- android:id="@+id/coordinator_layout"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent">-->
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#222222"
android:gravity="center"
android:text="该区域可折叠"
android:textColor="@android:color/white"
android:textSize="30sp"
app:layout_scrollFlags="scroll" />
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#DD012D"
android:gravity="center"
android:text="该区域为上滑至头部固定区域"
android:textColor="@android:color/white"
android:textSize="20sp" />
</com.google.android.material.appbar.AppBarLayout>
<!-- <com.google.android.material.appbar.AppBarLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content">-->
<!-- <TextView-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="100dp"-->
<!-- android:background="#222222"-->
<!-- android:gravity="center"-->
<!-- android:text="该区域可折叠"-->
<!-- android:textColor="@android:color/white"-->
<!-- android:textSize="30sp"-->
<!-- app:layout_scrollFlags="scroll" />-->
<!-- <TextView-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="50dp"-->
<!-- android:background="#DD012D"-->
<!-- android:gravity="center"-->
<!-- android:text="该区域为上滑至头部固定区域"-->
<!-- android:textColor="@android:color/white"-->
<!-- android:textSize="20sp" />-->
<!-- </com.google.android.material.appbar.AppBarLayout>-->
<!-- <com.google.android.material.bottomappbar.BottomAppBar-->
<!-- android:id="@+id/bar"-->
......@@ -58,4 +57,45 @@
<!-- android:layout_height="wrap_content" />-->
<!-- </FrameLayout>-->
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<!--</androidx.coordinatorlayout.widget.CoordinatorLayout>-->
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/green_400">
<!-- <include layout="@layout/cat_bottomappbar_content"/>-->
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:fitsSystemWindows="true" />
<!-- <com.google.android.material.floatingactionbutton.FloatingActionButton-->
<!-- android:id="@+id/fab"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- app:layout_anchor="@+id/bar"-->
<!-- app:srcCompat="@drawable/ic_account" />-->
<!-- <FrameLayout-->
<!-- android:id="@+id/bottom_drawer"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:elevation="16dp"-->
<!-- app:behavior_hideable="true"-->
<!-- app:layout_behavior="@string/bottom_sheet_behavior">-->
<!-- <com.google.android.material.navigation.NavigationView-->
<!-- android:id="@+id/navigation_view"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- app:menu="@menu/table_function_menu" />-->
<!-- </FrameLayout>-->
</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
......@@ -7,8 +7,8 @@ ext {
targetSdkVersion : 29,
//正式版: 1.0.3 3
//內部測試版:1.2.0 20
versionCode : 24,
versionName : "1.2.4"
versionCode : 25,
versionName : "1.2.5"
]
version = [
......@@ -33,39 +33,40 @@ ext {
dependencies = [
//support
"appcompat-v7" : 'androidx.appcompat:appcompat:1.0.2',//不要超過1.0.2,不然android5.1.1用webview會有問題
"design" : 'com.google.android.material:material:1.0.0',
"support-design" : 'com.android.support:design:28.0.0',
"support-v4" : 'androidx.legacy:legacy-support-v4:1.0.0',
"cardview-v7" : 'androidx.cardview:cardview:1.0.0',
"annotations" : 'androidx.annotation:annotation:1.0.0',
"recyclerview-v7" : 'androidx.recyclerview:recyclerview:1.0.0',
"coordinatorlayout" : 'androidx.coordinatorlayout:coordinatorlayout:1.1.0',
"appcompat-v7" : 'androidx.appcompat:appcompat:1.0.2',//不要超過1.0.2,不然android5.1.1用webview會有問題
"design" : 'com.google.android.material:material:1.0.0',
"support-design" : 'com.android.support:design:28.0.0',
"support-v4" : 'androidx.legacy:legacy-support-v4:1.0.0',
"cardview-v7" : 'androidx.cardview:cardview:1.0.0',
"annotations" : 'androidx.annotation:annotation:1.0.0',
"recyclerview-v7" : 'androidx.recyclerview:recyclerview:1.0.0',
"coordinatorlayout" : 'androidx.coordinatorlayout:coordinatorlayout:1.1.0',
//network
"retrofit" : "com.squareup.retrofit2:retrofit:${version["retrofitSdkVersion"]}",
"retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitSdkVersion"]}",
"okhttp3" : "com.squareup.okhttp3:okhttp:3.8.1",
"okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0",
"glide" : "com.github.bumptech.glide:glide:${version["glideSdkVersion"]}",
"glide-compiler" : "com.github.bumptech.glide:compiler:${version["glideSdkVersion"]}",
"glide-loader-okhttp3" : "com.github.bumptech.glide:okhttp3-integration:${version["glideSdkVersion"]}",
"picasso" : "com.squareup.picasso:picasso:2.5.2",
"retrofit" : "com.squareup.retrofit2:retrofit:${version["retrofitSdkVersion"]}",
"retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava2": "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitSdkVersion"]}",
"okhttp3" : "com.squareup.okhttp3:okhttp:3.8.1",
"okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0",
"glide" : "com.github.bumptech.glide:glide:${version["glideSdkVersion"]}",
"glide-compiler" : "com.github.bumptech.glide:compiler:${version["glideSdkVersion"]}",
"glide-loader-okhttp3" : "com.github.bumptech.glide:okhttp3-integration:${version["glideSdkVersion"]}",
"picasso" : "com.squareup.picasso:picasso:2.5.2",
//view
"autolayout" : "com.zhy:autolayout:1.4.5",
"autosize" : 'me.jessyan:autosize:1.1.2',
"butterknife" : "com.jakewharton:butterknife:${version["butterknifeSdkVersion"]}",
"butterknife-compiler" : "com.jakewharton:butterknife-compiler:${version["butterknifeSdkVersion"]}",
"pickerview" : "com.contrarywind:Android-PickerView:4.1.9",
"photoview" : "com.github.chrisbanes.photoview:library:1.2.3",
"numberprogressbar" : "com.daimajia.numberprogressbar:library:1.2@aar",
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
"paginate" : "com.github.markomilos:paginate:0.5.1",
"vlayout" : "com.alibaba.android:vlayout:1.1.0@aar",
"loadsir" : "com.kingja.loadsir:loadsir:1.3.8",
"autolayout" : "com.zhy:autolayout:1.4.5",
"autosize" : 'me.jessyan:autosize:1.1.2',
"butterknife" : "com.jakewharton:butterknife:${version["butterknifeSdkVersion"]}",
"butterknife-compiler" : "com.jakewharton:butterknife-compiler:${version["butterknifeSdkVersion"]}",
"pickerview" : "com.contrarywind:Android-PickerView:4.1.9",
"photoview" : "com.github.chrisbanes.photoview:library:1.2.3",
"numberprogressbar" : "com.daimajia.numberprogressbar:library:1.2@aar",
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
"paginate" : "com.github.markomilos:paginate:0.5.1",
"vlayout" : "com.alibaba.android:vlayout:1.1.0@aar",
"loadsir" : "com.kingja.loadsir:loadsir:1.3.8",
"lottie" : "com.airbnb.android:lottie:2.7.0",
//rx1
"rxandroid" : "io.reactivex:rxandroid:1.2.1",
......
......@@ -150,6 +150,8 @@ dependencies {
api rootProject.ext.dependencies["pickerview"]
//底部功能導航view
api 'com.github.ittianyu:BottomNavigationViewEx:2.0.4'
//lottie
api rootProject.ext.dependencies["lottie"]
//滴滴開源 哆啦A夢:辅助开发工具、测试效率工具、视觉辅助工具
debugImplementation 'com.didichuxing.doraemonkit:dokitx:3.3.3'
releaseImplementation 'com.didichuxing.doraemonkit:dokitx-no-op:3.3.3'
......
......@@ -143,7 +143,7 @@ public class GsaCloudApplication extends BaseApplication {
//初始化QMUI相关
initQMUI();
//初始化哆啦A夢
// initDoraemonKit();
initDoraemonKit();
//初始化上下拉刷新
initRefresh();
//初始化加载反馈页管理框架
......@@ -166,7 +166,6 @@ public class GsaCloudApplication extends BaseApplication {
//上傳餐廳擴展信息
ExpandInfoSetting.initUpdateExtendedConfiguration(uiStyleConfiguration, functionConfiguration);
LoganManager.w_action(TAG, TAG + ": onCreate end.....");
}
......@@ -202,7 +201,7 @@ public class GsaCloudApplication extends BaseApplication {
* 初始化滴滴開發,測試輔助工具哆啦A夢
*/
private void initDoraemonKit() {
DoraemonKit.install(getAppContext(), DoraemonKitConfig.PRODUCE_ID);
// DoraemonKit.install(getAppContext(), DoraemonKitConfig.PRODUCE_ID);
}
/**
......@@ -363,8 +362,12 @@ public class GsaCloudApplication extends BaseApplication {
}
@Override
public void onPrintError(int errorCode) {
LoganManager.w_printer(TAG, "打印失敗:" + errorCode);
public void onPrintError(Exception e, int errorCode) {
if (e != null) {
LoganManager.w_printer(TAG, "打印失敗:" + e.getMessage());
} else {
LoganManager.w_printer(TAG, "打印失敗:" + errorCode);
}
}
@Override
......@@ -380,7 +383,11 @@ public class GsaCloudApplication extends BaseApplication {
@Override
public void connectionError(Exception e) {
LoganManager.w_printer(TAG, "連接打印機失敗" );
if (e != null) {
LoganManager.w_printer(TAG, "連接打印機失敗:" + e.getMessage());
} else {
LoganManager.w_printer(TAG, "連接打印機失敗");
}
}
@Override
......
......@@ -14,8 +14,8 @@ public class LoganConfig {
public static final String EncryptKey16 = "0123456789012345";
public static final String EncryptIV16 = "0123456789012345";
public static final String APP_ID = "gingersoft1008611";
public static final String UPLOAD_LOG_URL = HttpsConstans.HTTP_ADDRESS_URL_HK+ "/logan-web/logan/upload.json";
// public static final String UPLOAD_LOG_URL = "http://192.168.1.131:8080/logan-web/logan/upload.json";
// public static final String UPLOAD_LOG_URL = HttpsConstans.HTTP_ADDRESS_URL_HK+ "/logan-web/logan/upload.json";
public static final String UPLOAD_LOG_URL = "http://192.168.1.131:8080/logan-web/logan/upload.json";
/**
* 日誌保留天數
......
......@@ -25,7 +25,7 @@ public class ExpandConstant {
public final static String ItemDecimals = "ItemDecimals";
public final static String MergeSendFood = "MergeSendFood";
/**送單自動打印上菜紙*/
public final static String AutoPrinterPaper = "AutoPrinterParper";
public final static String AutoPrinterPaper = "AutoPrinterPaper";
/**結賬是否打印積分二維碼*/
public final static String ToPrintQRCode = "ToPrintQRCode";
......
......@@ -155,7 +155,6 @@ public class RestaurantExpandInfoUtils {
}
}
}
int i = 100;
}
......
......@@ -62,6 +62,7 @@ public class PrinterFileUtils {
public static void savePrinterBitmapByType(int orderType, int printType, String directoryName, List<Bitmap> bitmaps) {
RxIOTask rxIOTask = new RxIOTask(0) {
@Override
public Object doInIOThread(Object o) {
String savePath = getPathByPrintType(printType);
......
......@@ -11,7 +11,7 @@ import java.util.Map;
* @作者: bin
* @創建時間: 2021-01-25 10:19
* @更新時間: 2021-01-25 10:19
* @描述:打印整體打印流程(打印前數據信息,圖片->連接成功(失敗)->打印成功(失敗)->斷開連接)
* @描述:打印整體流程(打印前數據信息,圖片->連接成功(失敗)->打印成功(失敗)->斷開連接)
*/
public interface PrinterFlowListener extends ExternalPrinterConnection {
/**
......@@ -44,5 +44,5 @@ public interface PrinterFlowListener extends ExternalPrinterConnection {
*
* @param errorCode 錯誤碼
*/
void onPrintError(int errorCode);
void onPrintError(Exception e,int errorCode);
}
......@@ -222,9 +222,17 @@ class GetInfoUpdateService : Service() {
if (postCallBack != null) {
postCallBack!!.callBack(type)
}
//-1斷開連接,\n-2:消息傳輸錯誤,\n0:連接消息,\n1:登錄通知,\n2:登出通知,\n3:外賣送單通知,\n4:自取送單通知,\n5:歷史訂單通知,\n6:修改訂單狀態通知,\n7:支付成功通知"
if (type == 3 || type == 4 || type == 5
|| type == 7) {
//-1斷開連接,
// \n-2:消息傳輸錯誤,
// \n0:連接消息,
// \n1:登錄通知,
// \n2:登出通知,
// \n3:外賣送單通知,
// \n4:自取送單通知,
// \n5:歷史訂單通知,
// \n6:修改訂單狀態通知,
// \n7:支付成功通知"
if (type == 3 || type == 4 || type == 5 || type == 7) {
//播放提示音
initSoundPool(R.raw.newordervocal)
} else if (type == 8) {
......
......@@ -12,10 +12,8 @@ import com.scwang.smartrefresh.layout.listener.OnStateChangedListener;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.ref.WeakReference;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.List;
/**
......@@ -81,6 +79,14 @@ public class PrintSocketHolder {
e.printStackTrace();
LoganManager.w_printer(TAG, "連接打印機失敗: " + ip + ":" + port + "." + e.getMessage());
return ERROR_7;
} catch (SocketException e) {
e.printStackTrace();
PrinterPlugins.getOnPrinterFlowHandler().connectionError(e);
return ERROR_7;
} catch (IOException e) {
e.printStackTrace();
PrinterPlugins.getOnPrinterFlowHandler().connectionError(e);
return ERROR_7;
} catch (Exception e) {
closeSocket();
e.printStackTrace();
......@@ -97,6 +103,7 @@ public class PrintSocketHolder {
} catch (IOException e) {
LoganManager.w_printer(TAG, "獲取打印機輸入流異常: " + socket.getInetAddress() + e.getMessage());
closeSocket();
PrinterPlugins.getOnPrinterFlowHandler().connectionError(e);
return ERROR_10;
}
return ERROR_0;
......@@ -126,6 +133,7 @@ public class PrintSocketHolder {
out.flush();
} catch (IOException | NullPointerException e) {
LoganManager.w_printer(TAG, "打印prj寫入數據异常: " + e.getMessage());
PrinterPlugins.getOnPrinterFlowHandler().onPrintError(e, ERROR_10);
closeSocket();
return ERROR_10;
}
......
......@@ -149,7 +149,23 @@ public class OrderPayView extends LinearLayout {
return;
}
boolean useFreeServicePayMethod = isUseFreeServicePayMethod(method);
if (mBillMoneyList.size() > 0 && PayMethodUtils.withHywebPayMethod(method)) {
int hywebPayMethodIndex = PayMethodUtils.hasHywebPayMethod(mBillMoneyList);
if (hywebPayMethodIndex != -1) {
//只允許存在一個hyweb支付
mBillMoneyList.remove(hywebPayMethodIndex);
}
}
if (mBillMoneyList.size() >= MAX_COUNT_PAY_MEMBER) {
//替换掉第一个
mBillMoneyList.remove(0);
mBillMoneyList.add(method);
} else {
mBillMoneyList.add(method);
}
boolean useFreeServicePayMethod = hasUseFreeServicePayMethod(method);
if (useFreeServicePayMethod) {
//有使用免服務費支付方式 重新獲取一遍尚欠金額
paymentDifference = getPaymentDifference();
......@@ -181,21 +197,6 @@ public class OrderPayView extends LinearLayout {
}
}
}
if (mBillMoneyList.size() > 0 && PayMethodUtils.withHywebPayMethod(method)) {
int hywebPayMethodIndex = PayMethodUtils.hasHywebPayMethod(mBillMoneyList);
if (hywebPayMethodIndex != -1) {
//只允許存在一個hyweb支付
mBillMoneyList.remove(hywebPayMethodIndex);
}
}
if (mBillMoneyList.size() >= MAX_COUNT_PAY_MEMBER) {
//替换掉第一个
mBillMoneyList.remove(0);
mBillMoneyList.add(method);
} else {
mBillMoneyList.add(method);
}
int notifyPosition = mBillMoneyList.size() - 1;
mBillMoneyAdapter.setSelect_position(notifyPosition);
......@@ -235,7 +236,7 @@ public class OrderPayView extends LinearLayout {
//設置差額狀態
setDifferenceText(context);
setWhetherFreeServiceCallback(isUseFreeServicePayMethod(null));
setWhetherFreeServiceCallback(hasUseFreeServicePayMethod(null));
if (onSelectPayClickLisenter != null) {
onSelectPayClickLisenter.delClick(datasBean);
......@@ -255,7 +256,7 @@ public class OrderPayView extends LinearLayout {
ToastUtils.show(context, "請選擇支付方式");
return;
}
boolean useFreeServicePayMethod = isUseFreeServicePayMethod(selectPayMethod);
boolean useFreeServicePayMethod = hasUseFreeServicePayMethod(selectPayMethod);
setWhetherFreeServiceCallback(useFreeServicePayMethod);
pressExact();
......@@ -316,9 +317,9 @@ public class OrderPayView extends LinearLayout {
/**
* 設置是否免服務費回調
*/
public void setWhetherFreeServiceCallback(boolean isUseFreeServicePayMethod) {
public void setWhetherFreeServiceCallback(boolean hasUseFreeServicePayMethod) {
if (onFreeServiceStatusChangeLisenter != null) {
onFreeServiceStatusChangeLisenter.onFreeServiceStautsChange(isUseFreeServicePayMethod);
onFreeServiceStatusChangeLisenter.onFreeServiceStautsChange(hasUseFreeServicePayMethod);
}
}
......@@ -328,7 +329,7 @@ public class OrderPayView extends LinearLayout {
* @param method
* @return
*/
private boolean isUseFreeServicePayMethod(PayMethod method) {
private boolean hasUseFreeServicePayMethod(PayMethod method) {
boolean freeServiceStatus = false;
if (method != null) {
if (method.getWhetherFreeService() == 1) {
......@@ -731,7 +732,7 @@ public class OrderPayView extends LinearLayout {
}
public interface OnFreeServiceStatusChangeLisenter {
void onFreeServiceStautsChange(boolean isUseFreeServicePayMethod);
void onFreeServiceStautsChange(boolean hasUseFreeServicePayMethod);
}
public interface OnSelectPayClickLisenter {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment