Commit 414e7e7d by Wyh

04-11 多台打印,長按印單切換打印機

parent 3bebf347
...@@ -17,11 +17,11 @@ package com.jess.arms.base; ...@@ -17,11 +17,11 @@ package com.jess.arms.base;
import android.view.View; import android.view.View;
import androidx.recyclerview.widget.RecyclerView;
import com.jess.arms.utils.ThirdViewUtil; import com.jess.arms.utils.ThirdViewUtil;
import com.zhy.autolayout.utils.AutoUtils; import com.zhy.autolayout.utils.AutoUtils;
import androidx.recyclerview.widget.RecyclerView;
/** /**
* ================================================ * ================================================
* 基类 {@link RecyclerView.ViewHolder} * 基类 {@link RecyclerView.ViewHolder}
...@@ -33,11 +33,18 @@ import androidx.recyclerview.widget.RecyclerView; ...@@ -33,11 +33,18 @@ import androidx.recyclerview.widget.RecyclerView;
*/ */
public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements View.OnClickListener { public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements View.OnClickListener {
protected OnViewClickListener mOnViewClickListener = null; protected OnViewClickListener mOnViewClickListener = null;
protected DefaultAdapter.OnLongClickListener mOnLongClickListener = null;
protected final String TAG = this.getClass().getSimpleName(); protected final String TAG = this.getClass().getSimpleName();
public BaseHolder(View itemView) { public BaseHolder(View itemView) {
super(itemView); super(itemView);
itemView.setOnClickListener(this);//点击事件 itemView.setOnClickListener(this);//点击事件
itemView.setOnLongClickListener(v -> {
if (mOnLongClickListener != null) {
mOnLongClickListener.onLongClick(v, getAdapterPosition());
}
return false;
});
if (ThirdViewUtil.USE_AUTOLAYOUT == 1) AutoUtils.autoSize(itemView);//适配z if (ThirdViewUtil.USE_AUTOLAYOUT == 1) AutoUtils.autoSize(itemView);//适配z
ThirdViewUtil.bindTarget(this, itemView);//绑定 ThirdViewUtil.bindTarget(this, itemView);//绑定
} }
...@@ -62,7 +69,7 @@ public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements V ...@@ -62,7 +69,7 @@ public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements V
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (mOnViewClickListener != null) { if (mOnViewClickListener != null) {
mOnViewClickListener.onViewClick(view, this.getPosition()); mOnViewClickListener.onViewClick(view, this.getAdapterPosition());
} }
} }
...@@ -73,4 +80,8 @@ public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements V ...@@ -73,4 +80,8 @@ public abstract class BaseHolder<T> extends RecyclerView.ViewHolder implements V
public void setOnItemClickListener(OnViewClickListener listener) { public void setOnItemClickListener(OnViewClickListener listener) {
this.mOnViewClickListener = listener; this.mOnViewClickListener = listener;
} }
public void setmOnLongClickListener(DefaultAdapter.OnLongClickListener mOnLongClickListener) {
this.mOnLongClickListener = mOnLongClickListener;
}
} }
...@@ -19,10 +19,10 @@ import android.view.LayoutInflater; ...@@ -19,10 +19,10 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import java.util.List;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
/** /**
* ================================================ * ================================================
* 基类 {@link RecyclerView.Adapter} ,如果需要实现非常复杂的 {@link RecyclerView} ,请尽量使用其他优秀的三方库 * 基类 {@link RecyclerView.Adapter} ,如果需要实现非常复杂的 {@link RecyclerView} ,请尽量使用其他优秀的三方库
...@@ -35,6 +35,7 @@ import androidx.recyclerview.widget.RecyclerView; ...@@ -35,6 +35,7 @@ import androidx.recyclerview.widget.RecyclerView;
public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder<T>> { public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder<T>> {
protected List<T> mInfos; protected List<T> mInfos;
protected OnRecyclerViewItemClickListener mOnItemClickListener = null; protected OnRecyclerViewItemClickListener mOnItemClickListener = null;
protected OnLongClickListener mOnLongClickListener = null;
private BaseHolder<T> mHolder; private BaseHolder<T> mHolder;
public DefaultAdapter(List<T> infos) { public DefaultAdapter(List<T> infos) {
...@@ -53,14 +54,13 @@ public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder< ...@@ -53,14 +54,13 @@ public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder<
public BaseHolder<T> onCreateViewHolder(ViewGroup parent, final int viewType) { public BaseHolder<T> onCreateViewHolder(ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false); View view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
mHolder = getHolder(view, viewType); mHolder = getHolder(view, viewType);
mHolder.setOnItemClickListener(new BaseHolder.OnViewClickListener() {//设置Item点击事件 //设置Item点击事件
@Override mHolder.setOnItemClickListener((view1, position) -> {
public void onViewClick(View view, int position) {
if (mOnItemClickListener != null && mInfos != null && mInfos.size() > 0) { if (mOnItemClickListener != null && mInfos != null && mInfos.size() > 0) {
mOnItemClickListener.onItemClick(view, viewType, mInfos.get(position), position); mOnItemClickListener.onItemClick(view1, viewType, mInfos.get(position), position);
}
} }
}); });
mHolder.setmOnLongClickListener(mOnLongClickListener);
return mHolder; return mHolder;
} }
...@@ -151,7 +151,15 @@ public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder< ...@@ -151,7 +151,15 @@ public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<BaseHolder<
void onItemClick(View view, int viewType, T data, int position); void onItemClick(View view, int viewType, T data, int position);
} }
public interface OnLongClickListener {
boolean onLongClick(View v, int position);
}
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
this.mOnItemClickListener = listener; this.mOnItemClickListener = listener;
} }
public void setmOnLongClickListener(OnLongClickListener mOnLongClickListener) {
this.mOnLongClickListener = mOnLongClickListener;
}
} }
...@@ -7,7 +7,6 @@ apply plugin: 'kotlin-android-extensions' ...@@ -7,7 +7,6 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-kapt'
android { android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"] compileSdkVersion rootProject.ext.android["compileSdkVersion"]
// compileSdkVersion 28
defaultConfig { defaultConfig {
if (project.ext.runAsApp) { if (project.ext.runAsApp) {
applicationId "com.gingersoft.gsa.other_order_mode" applicationId "com.gingersoft.gsa.other_order_mode"
......
...@@ -87,7 +87,6 @@ class OtherOrderActivity : AppCompatActivity() { ...@@ -87,7 +87,6 @@ class OtherOrderActivity : AppCompatActivity() {
ToastUtils.show(this@OtherOrderActivity, "請輸入手機號或訂單號") ToastUtils.show(this@OtherOrderActivity, "請輸入手機號或訂單號")
} }
} }
tabs.setupWithViewPager(viewPager) tabs.setupWithViewPager(viewPager)
for (i in 0 until ints.size) { for (i in 0 until ints.size) {
......
package com.joe.print.mvp.contract; package com.joe.print.mvp.contract;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult; import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.mvp.IView; import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel; import com.jess.arms.mvp.IModel;
import java.util.List;
import io.reactivex.Observable; import io.reactivex.Observable;
...@@ -25,7 +28,7 @@ public interface PrintContract { ...@@ -25,7 +28,7 @@ public interface PrintContract {
/** /**
* 顯示打印機列表彈窗 * 顯示打印機列表彈窗
*/ */
void showPrinterList(); void showPrinterList(List<PrinterDeviceBean> deviceBeans);
} }
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存 //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
......
...@@ -3,26 +3,25 @@ package com.joe.print.mvp.presenter; ...@@ -3,26 +3,25 @@ package com.joe.print.mvp.presenter;
import android.app.Application; import android.app.Application;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult; import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils; import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.integration.AppManager;
import com.jess.arms.di.scope.ActivityScope; import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.http.imageloader.ImageLoader; import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.RxLifecycleUtils;
import com.joe.print.mvp.contract.PrintContract;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler; import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber; import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import javax.inject.Inject;
import com.jess.arms.utils.RxLifecycleUtils;
import com.joe.print.mvp.contract.PrintContract;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import java.util.List;
/** /**
* ================================================ * ================================================
...@@ -77,13 +76,13 @@ public class PrintPresenter extends BasePresenter<PrintContract.Model, PrintCont ...@@ -77,13 +76,13 @@ public class PrintPresenter extends BasePresenter<PrintContract.Model, PrintCont
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) { .subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
@Override @Override
public void onNext(BaseResult baseResult) { public void onNext(BaseResult baseResult) {
if(baseResult.isSuccess()){ if (baseResult.isSuccess()) {
List<PrinterDeviceBean> deviceBeans = JsonUtils.parseArray(baseResult.getData(), PrinterDeviceBean.class); List<PrinterDeviceBean> deviceBeans = JsonUtils.parseArray(baseResult.getData(), PrinterDeviceBean.class);
if(deviceBeans != null && deviceBeans.size() > 0){
//有打印機,返回true //有打印機,返回true
PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans); PrinterManager.getPrinterManager().setDeviceBeans(deviceBeans);
mRootView.showPrinterList(); mRootView.showPrinterList(deviceBeans);
} } else {
mRootView.showPrinterList(null);
} }
} }
}); });
......
...@@ -4,7 +4,6 @@ import android.app.Application; ...@@ -4,7 +4,6 @@ import android.app.Application;
import com.gingersoft.gsa.cloud.base.common.bean.BaseResult; import com.gingersoft.gsa.cloud.base.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.base.utils.JsonUtils; import com.gingersoft.gsa.cloud.base.utils.JsonUtils;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.di.scope.ActivityScope; import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.http.imageloader.ImageLoader; import com.jess.arms.http.imageloader.ImageLoader;
...@@ -62,21 +61,9 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model, ...@@ -62,21 +61,9 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
/** /**
* 添加打印機 * 添加打印機
*
* @param restaurantId 餐廳id
* @param ip 打印機ip
* @param port 打印機端口號
* @param type 類型1 :55mm, 2:88mm
*/ */
public void addPrinter(int restaurantId, String ip, String port, int type) { public void addPrinter(PrinterDeviceBean printerDeviceBean) {
PrinterDeviceBean printerDeviceBean;
if (TextUtil.isEmptyOrNullOrUndefined(port)) {
printerDeviceBean = new PrinterDeviceBean(restaurantId, ip, null, type);
} else {
printerDeviceBean = new PrinterDeviceBean(restaurantId, ip, Integer.parseInt(port), type);
}
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), JsonUtils.toJson(printerDeviceBean)); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), JsonUtils.toJson(printerDeviceBean));
mModel.addPrinter(requestBody) mModel.addPrinter(requestBody)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading("")) .doOnSubscribe(disposable -> mRootView.showLoading(""))
...@@ -98,21 +85,9 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model, ...@@ -98,21 +85,9 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
/** /**
* 更新打印機信息 * 更新打印機信息
*
* @param id 打印機id
* @param restaurantId 餐廳id
* @param ip 打印機ip地址
* @param port 打印機端口號
* @param type 打印機類型 1 :55mm, 2:88mm
*/ */
public void updatePrinterInfo(int id, int restaurantId, String ip, String port, int type) { public void updatePrinterInfo(PrinterDeviceBean deviceBean) {
PrinterDeviceBean printerDeviceBean; RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), JsonUtils.toJson(deviceBean));
if (TextUtil.isEmptyOrNullOrUndefined(port)) {
printerDeviceBean = new PrinterDeviceBean(id, null, ip, null, type);
} else {
printerDeviceBean = new PrinterDeviceBean(id, null, ip, Integer.parseInt(port), type);
}
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), JsonUtils.toJson(printerDeviceBean));
mModel.updatePrinter(requestBody) mModel.updatePrinter(requestBody)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading("")) .doOnSubscribe(disposable -> mRootView.showLoading(""))
...@@ -125,7 +100,7 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model, ...@@ -125,7 +100,7 @@ public class PrinterAddPresenter extends BasePresenter<PrinterAddContract.Model,
public void onNext(BaseResult baseResult) { public void onNext(BaseResult baseResult) {
if (baseResult.isSuccess()) { if (baseResult.isSuccess()) {
mRootView.showMessage("保存成功"); mRootView.showMessage("保存成功");
mRootView.updatePrinterSuccess(printerDeviceBean); mRootView.updatePrinterSuccess(deviceBean);
mRootView.killMyself(); mRootView.killMyself();
} }
} }
......
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.base.utils.view.ImageUtils;
import com.gingersoft.gsa.cloud.print.PrintDataMaker;
import com.gingersoft.gsa.cloud.print.PrinterWriter;
import com.gingersoft.gsa.cloud.print.PrinterWriter58mm;
import com.gingersoft.gsa.cloud.print.PrinterWriter80mm;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Wyh on 2020/1/9.
* ip打印類
*/
public class IpPrintMaker implements PrintDataMaker {
private Context mContext;
private int width; // 打印的圖片寬度,紙張寬度
private List<Bitmap> bitmaps;
public IpPrintMaker(Context context, int width, List<Bitmap> bitmaps) {
this.mContext = context;
this.width = width;
this.bitmaps = bitmaps;
}
@Override
public List<byte[]> getPrintData(int type) {
ArrayList<byte[]> data = new ArrayList<>();
try {
PrinterWriter printer;
printer = type == PrinterWriter58mm.TYPE_58 ? new PrinterWriter58mm(255, width) : new PrinterWriter80mm(255, width);
printer.setAlignCenter();
data.add(printer.getDataAndReset());
if (bitmaps.size() <= 0) {
ToastUtils.show(mContext, "打印失敗");
return null;
}
for (int i = 0; i < bitmaps.size(); i++) {
ArrayList<byte[]> image1 = printer.getImageByte(bitmaps.get(i));//將bitmap縮放到打印機紙張大小再添加到集合中。
data.addAll(image1);//draw2PxPoint2(bitmaps.get(i)
printer.printLineFeed();
printer.printLineFeed();
printer.printLineFeed();
printer.printLineFeed();
printer.printLineFeed();
printer.feedPaperCutPartial();
data.add(printer.getDataAndReset());
}
data.add(printer.getDataAndClose());
return data;
} catch (Exception e) {
return new ArrayList<>();
}
}
/*************************************************************************
     * 假设一个240*240的图片,分辨率设为24, 共分10行打印
     * 每一行,是一个 240*24 的点阵, 每一列有24个点,存储在3个byte里面。
     * 每个byte存储8个像素点信息。因为只有黑白两色,所以对应为1的位是黑色,对应为0的位是白色
     **************************************************************************/
/**
* 把一张Bitmap图片转化为打印机可以打印的字节流
*
* @param bmp
* @return
*/
public void draw2PxPoint(Bitmap bmp) throws IOException {
//用来存储转换后的 bitmap 数据。为什么要再加1000,这是为了应对当图片高度无法
//整除24时的情况。比如bitmap 分辨率为 240 * 250,占用 7500 byte,
//但是实际上要存储11行数据,每一行需要 24 * 240 / 8 =720byte 的空间。再加上一些指令存储的开销,
//所以多申请 1000byte 的空间是稳妥的,不然运行时会抛出数组访问越界的异常。
int size = bmp.getWidth() * bmp.getHeight() / 8 + 1000;
byte[] data = new byte[size];
int k = 0;
//设置行距为0的指令
data[k++] = 0x1B;
data[k++] = 0x33;
data[k++] = 0x00;
// 逐行打印
for (int j = 0; j < bmp.getHeight() / 24f; j++) {
//打印图片的指令
data[k++] = 0x1B;
data[k++] = 0x2A;
data[k++] = 33;
data[k++] = (byte) (bmp.getWidth() % 256); //nL
data[k++] = (byte) (bmp.getWidth() / 256); //nH
//对于每一行,逐列打印
for (int i = 0; i < bmp.getWidth(); i++) {
//每一列24个像素点,分为3个字节存储
for (int m = 0; m < 3; m++) {
//每个字节表示8个像素点,0表示白色,1表示黑色
for (int n = 0; n < 8; n++) {
byte b = px2Byte(i, j * 24 + m * 8 + n, bmp);
data[k] += data[k] + b;
}
k++;
}
}
data[k++] = 10;//换行
}
// socketOut.write(data);
// socketOut.flush();
}
/*************************************************************************
* 我们的热敏打印机是RP-POS80S或RP-POS80P或RP-POS80CS或RP-POS80CP打印机
* 360*360的图片,8个字节(8个像素点)是一个二进制,将二进制转化为十进制数值
* y轴:24个像素点为一组,即360就是15组(0-14)
* x轴:360个像素点(0-359)
* 里面的每一组(24*360),每8个像素点为一个二进制,(每组有3个,3*8=24)
**************************************************************************/
/**
* 把一张Bitmap图片转化为打印机可以打印的bit(将图片压缩为360*360)
* 效率很高(相对于下面)
*
* @param bit
* @return
*/
public static byte[] draw2PxPoint2(Bitmap bit) {
byte[] data = new byte[16290];
int height = bit.getHeight() + (24 - bit.getHeight() % 24);
int y = height / 24;
int k = 0;
for (int j = 0; j < y; j++) {
data[k++] = 0x1B;
data[k++] = 0x2A;
data[k++] = 33; // m=33时,选择24点双密度打印,分辨率达到200DPI。
data[k++] = 0x68;
data[k++] = 0x01;
for (int i = 0; i < bit.getWidth(); i++) {
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 8; n++) {
byte b = px2Byte(i, j * 24 + m * 8 + n, bit);
data[k] += data[k] + b;
}
k++;
}
}
data[k++] = 10;
}
return data;
}
/**
* 把一张Bitmap图片转化为打印机可以打印的bit
*
* @param bit
* @return
*/
public static byte[] pic2PxPoint(Bitmap bit) {
long start = System.currentTimeMillis();
byte[] data = new byte[16290];
int k = 0;
for (int i = 0; i < 15; i++) {
data[k++] = 0x1B;
data[k++] = 0x2A;
data[k++] = 33; // m=33时,选择24点双密度打印,分辨率达到200DPI。
data[k++] = 0x68;
data[k++] = 0x01;
for (int x = 0; x < 360; x++) {
for (int m = 0; m < 3; m++) {
byte[] by = new byte[8];
for (int n = 0; n < 8; n++) {
byte b = px2Byte(x, i * 24 + m * 8 + 7 - n, bit);
by[n] = b;
}
data[k] = (byte) changePointPx1(by);
k++;
}
}
data[k++] = 10;
}
long end = System.currentTimeMillis();
long str = end - start;
return data;
}
/**
* 图片二值化,黑色是1,白色是0
*
* @param x 横坐标
* @param y 纵坐标
* @param bit 位图
* @return
*/
public static byte px2Byte(int x, int y, Bitmap bit) {
byte b;
if (y >= bit.getHeight()) {
return 0;
}
int pixel = bit.getPixel(x, y);
int red = (pixel & 0x00ff0000) >> 16; // 取高两位
int green = (pixel & 0x0000ff00) >> 8; // 取中两位
int blue = pixel & 0x000000ff; // 取低两位
int gray = RGB2Gray(red, green, blue);
if (gray < 128) {
b = 1;
} else {
b = 0;
}
return b;
}
/**
* 图片灰度的转化
*
* @param r
* @param g
* @param b
* @return
*/
private static int RGB2Gray(int r, int g, int b) {
int gray = (int) (0.29900 * r + 0.58700 * g + 0.11400 * b); //灰度转化公式
return gray;
}
/**
* 对图片进行压缩(去除透明度)
*
* @param bitmapOrg
*/
public static Bitmap compressPic(Bitmap bitmapOrg) {
// 获取这个图片的宽和高
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
// 定义预转换成的图片的宽度和高度
int newWidth = 360;
int newHeight = 360;
Bitmap targetBmp = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);
Canvas targetCanvas = new Canvas(targetBmp);
targetCanvas.drawColor(0xffffffff);
targetCanvas.drawBitmap(bitmapOrg, new Rect(0, 0, width, height), new Rect(0, 0, newWidth, newHeight), null);
return targetBmp;
}
/**
* 对图片进行压缩(不去除透明度)
*
* @param bitmapOrg
*/
public static Bitmap compressBitmap(Bitmap bitmapOrg) {
// 加载需要操作的图片,这里是一张图片
// Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.alipay);
// 获取这个图片的宽和高
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
// 定义预转换成的图片的宽度和高度
int newWidth = 360;
int newHeight = 360;
// 计算缩放率,新尺寸除原始尺寸
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 创建操作图片用的matrix对象
Matrix matrix = new Matrix();
// 缩放图片动作
matrix.postScale(scaleWidth, scaleHeight);
// 创建新的图片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);
// 将上面创建的Bitmap转换成Drawable对象,使得其可以使用在ImageView, ImageButton中
// BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
return resizedBitmap;
}
/**
* 将[1,0,0,1,0,0,0,1]这样的二进制转为化十进制的数值(效率更高)
*
* @param arry
* @return
*/
public static int changePointPx1(byte[] arry) {
int v = 0;
for (int j = 0; j < arry.length; j++) {
if (arry[j] == 1) {
v = v | 1 << j;
}
}
return v;
}
/**
* 将[1,0,0,1,0,0,0,1]这样的二进制转为化十进制的数值
*
* @param arry
* @return
*/
public byte changePointPx(byte[] arry) {
byte v = 0;
for (int i = 0; i < 8; i++) {
v += v + arry[i];
}
return v;
}
/**
* 得到位图的某个点的像素值
*
* @param bitmap
* @return
*/
public byte[] getPicPx(Bitmap bitmap) {
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];// 保存所有的像素的数组,图片宽×高
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
for (int i = 0; i < pixels.length; i++) {
int clr = pixels[i];
int red = (clr & 0x00ff0000) >> 16; // 取高两位
int green = (clr & 0x0000ff00) >> 8; // 取中两位
int blue = clr & 0x000000ff; // 取低两位
System.out.println("r=" + red + ",g=" + green + ",b=" + blue);
}
return null;
}
}
...@@ -13,9 +13,9 @@ import com.sunmi.peripheral.printer.SunmiPrinterService; ...@@ -13,9 +13,9 @@ import com.sunmi.peripheral.printer.SunmiPrinterService;
* 版本:1.6.0 * 版本:1.6.0
* 创建日期:2019/6/27 * 创建日期:2019/6/27
* 修订历史:2019/6/27 * 修订历史:2019/6/27
* 描述: * 描述:獲取本地商米、N5打印機狀態
*/ */
public class PrintStatus { public class LocationPrintStatus {
public static boolean initV2PrintStatus(Context context, SunmiPrinterService service) { public static boolean initV2PrintStatus(Context context, SunmiPrinterService service) {
int printerState = 0; int printerState = 0;
......
//package com.joe.print.mvp.print;
//
//import android.content.Context;
//
//import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
//import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
//
//import am.util.printer.PrintExecutor;
//import am.util.printer.PrintSocketHolder;
//import am.util.printer.PrinterWriter58mm;
//
///**
// * Created by Wyh on 2020/1/15.
// */
//public class Print implements PrintSocketHolder.OnStateChangedListener, PrintExecutor.OnPrintResultListener {
// private PrintExecutor executor;
// private SendPrint maker;
// private static Print print;
// private Context mContext;
// public static Print getInstance() {
// synchronized (Print.class) {
// if (print == null) {
// print = new Print();
// }
// }
// return print;
// }
//
// public void printOrder(Context context) {
// this.mContext = context;
// LoadingDialog.showNewDialogForLoading(GsaCloudApplication.getAppContext(),"初始化...",false);
// if (executor == null) {
// executor = new PrintExecutor("192.168.1.217", 9100, PrinterWriter58mm.TYPE_58);
// executor.setOnStateChangedListener(this);
// executor.setOnPrintResultListener(this);
// }
// if (maker == null) {
// maker = new SendPrint(context, 255, 580);
// }
// executor.setIp("192.168.1.218", 9100);
// executor.doPrinterRequestAsync(maker);
// }
//
//
// @Override
// public void onResult(int errorCode) {
// String msg;
// switch (errorCode) {
// case PrintSocketHolder.ERROR_0:
// //打印成功
// msg = "打印成功";
// break;
// case PrintSocketHolder.ERROR_2:
// //创建Socket失败
// msg = "連接打印機失敗";
// break;
// case PrintSocketHolder.ERROR_1:
// case PrintSocketHolder.ERROR_3:
// case PrintSocketHolder.ERROR_4:
// case PrintSocketHolder.ERROR_5:
// default:
// //打印失敗
// msg = "打印失敗";
//// LoadingDialog.cancelDialogForLoading();
// break;
// }
// LoadingDialog.setText(msg);
// }
//
// @Override
// public void onStateChanged(int state) {
// String msg = "";
// switch (state) {
// case PrintSocketHolder.STATE_0:
// case PrintSocketHolder.STATE_1:
// //创建Socket连接
// msg = "連接打印機...";
// break;
// case PrintSocketHolder.STATE_2:
// case PrintSocketHolder.STATE_3:
// //写入测试页面数据
// msg = "正在打印...";
// break;
// case PrintSocketHolder.STATE_4:
// msg = "正在關閉...";
//// LoadingDialog.cancelDialogForLoading();
// break;
// }
// LoadingDialog.setText(msg);
// }
//}
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.adapter.print.BillAdapter;
import com.gingersoft.gsa.cloud.base.adapter.print.BillTypeAdapter;
import com.gingersoft.gsa.cloud.base.adapter.print.FoodAdapter;
import com.gingersoft.gsa.cloud.base.common.bean.BillingBean;
import com.gingersoft.gsa.cloud.base.common.bean.OrderDetail;
import com.gingersoft.gsa.cloud.base.common.bean.PayMethod;
import com.gingersoft.gsa.cloud.base.common.bean.TableBean;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.joe.print.R;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 結賬單
*/
public class PrintBill extends PrinterInIt {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
bitmapMaps.put("", bitmaps);
return bitmapMaps;
}
/**
* 獲取"結賬單"圖片
*
* @param context
* @return
*/
private Bitmap getServeBitmap(Context context) {
List<OrderDetail> foodList = MyOrderManage.getInstance().getOrderFoodList();
TableBean.DataBean tableBean = OpenTableManage.getDefault().getTableBean();
if (foodList == null || foodList.size() <= 0 || tableBean == null) {
return null;
}
View view = LinearLayout.inflate(context, R.layout.print_layout_print_bill, null);
TextView brandName = view.findViewById(R.id.tv_brand_name);
TextView restaurantName = view.findViewById(R.id.tv_restaurant_name);
TextView topOrderNum = view.findViewById(R.id.tv_print_bill_order_num);//頂部的訂單號
TextView tableNum = view.findViewById(R.id.tv_dining_table_number);
TextView people = view.findViewById(R.id.tv_people);
TextView orderNum = view.findViewById(R.id.tv_order_num);
TextView orderData = view.findViewById(R.id.tv_date);
RecyclerView rvFood = view.findViewById(R.id.rv_food);
RecyclerView rvBillAmount = view.findViewById(R.id.rv_bill_amount);
TextView mTvTotalAmount = view.findViewById(R.id.tv_total_amount);
TextView checkOutTime = view.findViewById(R.id.tv_checkout_time);
TextView line_food_info = view.findViewById(R.id.line_food_info);
RecyclerView rvPayType = view.findViewById(R.id.rv_print_pay_type);//顯示支付方式
tableNum.setText(tableBean.getTableName());
people.setText(OpenTableManage.getDefault().getPeopleNumber() + "");
orderData.setText(TimeUtils.parseTimeRepeat(tableBean.getCreateTime(), TimeUtils.DEFAULT_DATE_FORMAT));
checkOutTime.setText(TimeUtils.getCurrentTimeInString(TimeUtils.DEFAULT_DATE_FORMAT));
FoodAdapter foodAdapter = new FoodAdapter(foodList);
rvFood.setLayoutManager(new LinearLayoutManager(context));
rvFood.setAdapter(foodAdapter);
List<BillingBean> billingBeans = new ArrayList<>();
if (billingBeans.size() <= 0) {
line_food_info.setVisibility(View.GONE);
} else {
BillAdapter billAdapter = new BillAdapter(billingBeans);
rvBillAmount.setLayoutManager(new LinearLayoutManager(context));
rvBillAmount.setAdapter(billAdapter);
}
if (OpenTableManage.getDefault().getTableBean() != null) {
tableNum.setText(OpenTableManage.getDefault().getTableBean().getTableName());
people.setText(OpenTableManage.getDefault().getPeopleNumber() + "");
}
if (MyOrderManage.getInstance().getOrderId() != -1) {
orderNum.setText(MyOrderManage.getInstance().getOrderId() + "");
}
BigDecimal totalAmount = new BigDecimal(0);
for (OrderDetail OrderDetail : MyOrderManage.getInstance().getOrderFoodList()) {
totalAmount = MoneyUtil.sum(totalAmount, OrderDetail.getPrice());
}
//總金額
mTvTotalAmount.setText(totalAmount + "");
List<PayMethod> payBillMoneys = MyOrderManage.getInstance().getBillMoney();
rvPayType.setLayoutManager(new LinearLayoutManager(context));
rvPayType.setAdapter(new BillTypeAdapter(payBillMoneys));
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
return viewToBitmap(context, view);
}
}
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import com.gingersoft.gsa.cloud.base.utils.PrintTransitUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 清機報表
*/
public class PrintCleanMachine extends PrinterInIt {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
bitmapMaps.put("", bitmaps);
return bitmapMaps;
}
/**
* 獲取"清機報表"圖片
*
* @param mContext
* @return
*/
private Bitmap getServeBitmap(Context mContext) {
View view = PrintTransitUtils.getInstance().getPrintView();
if (view != null) {
return viewToBitmap(mContext, view);
}
return null;
}
}
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.adapter.print.KitChenPrintFoodAdapter;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.OrderDetail;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.joe.print.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 廚房單打印
*/
public class PrintKitchen extends PrinterInIt {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<OrderDetail> orderDetails = MyOrderManage.getInstance().getNewFoodList();
if (orderDetails != null) {
//廚房單,可能會有多個IP打印
//獲得ip打印列表,
//再將食品數據根據打印位置分組。
//打印一組之後,關閉連接,切換第二台打印機ip,如此循環
//打印完成之後,返回所有打印結果。
Map<String, List<OrderDetail>> foodMaps = new HashMap<>();
String emptyPrintLocation = "null";//部分食品沒有打印位置時設置為此key,比如這是第一個食品,沒有打印位置時
int lastEmptyPrintLocationIndex = 0;//上一次遍歷到第一個食品時都沒有打印位置時,開始的食品位置
//將所有食品進行遍歷,分組
for (int i = 0; i < orderDetails.size(); i++) {
OrderDetail food = orderDetails.get(i);
if (TextUtil.isEmptyOrNullOrUndefined(food.getPrintseting())) {
//如果沒有打印位置,向上尋找
if (i == 0) {
food.setPrintseting(emptyPrintLocation);
addToMap(foodMaps, food);
} else {
for (int j = i - 1; j >= lastEmptyPrintLocationIndex; j--) {
//一直遍歷,直到找到有打印位置的食品
// 如果所有食品都沒有打印位置的情況,為了避免多次遍歷
// 如果本次遍歷到第一個食品,都沒有打印位置,記錄下這一次開始遍歷的下標,下一次遍歷到這個位置就停止
if (!TextUtil.isEmptyOrNullOrUndefined(orderDetails.get(j).getPrintseting())) {
//一直遍歷,直到找到有打印位置的食品
//判斷是否帶*號
if (orderDetails.get(j).getPrintseting().contains("*")) {
//帶*號,則需要取得通過下標加去掉*號的標識來取得map中的集合,將i食品裝進去,這樣就能打印在一張紙上
//如果沒取得集合,則通過打印位置去map取得集合,將j食品從map中移除,將這個j食品的和i食品裝一起
// 生成新的key。為當前下標+"標識符"+去掉*的打印位置,不帶*的key取得的食品集合才能打印在一張紙上。
String newKey = j + DELIMITER + orderDetails.get(j).getPrintseting().replaceAll("\\*", "");
//通過newKey取得map中的集合
List<OrderDetail> newKeyfoods = foodMaps.get(newKey);
if (newKeyfoods != null) {
newKeyfoods.add(food);
} else {
List<OrderDetail> printsetingFoods = foodMaps.get(orderDetails.get(j).getPrintseting());
if (printsetingFoods != null) {//理論上不會為空
printsetingFoods.remove(printsetingFoods.lastIndexOf(orderDetails.get(j)));
//移除掉之後,put到newkey中
List<OrderDetail> newFoods = new ArrayList<>();
newFoods.add(orderDetails.get(j));
newFoods.add(food);
foodMaps.put(newKey, newFoods);
}
}
break;
} else {
//沒有*號,不需要做多餘的操作
food.setPrintseting(orderDetails.get(j).getPrintseting());
addToMap(foodMaps, food);
}
} else if (j == lastEmptyPrintLocationIndex) {
//從i到0的打印位置都沒有,記錄下i,下次只遍歷到i就停下來
lastEmptyPrintLocationIndex = i;
//如果找到最初的那個食品,也沒有打印位置,設置打印位置為"null"
food.setPrintseting(emptyPrintLocation);
addToMap(foodMaps, food);
}
}
}
} else {
//有打印位置,
//已經保存過這個位置的,
addToMap(foodMaps, food);
}
}
//通過打印位置生成多張用於打印的bitmap
for (Map.Entry<String, List<OrderDetail>> entry : foodMaps.entrySet()) {
String key = entry.getKey();
List<Bitmap> bitmaps = new ArrayList<>();
if (key.contains("*")) {
//如果帶*號,這個集合就需要切紙,每個食品都需要單獨在一張廚房單上
for (OrderDetail orderDetail : entry.getValue()) {
List<OrderDetail> orders = new ArrayList<>();//這裡new集合是因為下面的方法需要的參數是list集合
orders.add(orderDetail);
Bitmap bitmap = getKitChenPrintBitmap(mContext, orders);
bitmaps.add(bitmap);
}
} else {
Bitmap bitmap = getKitChenPrintBitmap(mContext, entry.getValue());
//不帶*號,所有同樣廚房位置的食品都在一張紙上
bitmaps.add(bitmap);
}
bitmapMaps.put(key, bitmaps);
}
}
return bitmapMaps;
}
private void addToMap(Map<String, List<OrderDetail>> foodMaps, OrderDetail food) {
if (foodMaps.get(food.getPrintseting()) != null) {
Objects.requireNonNull(foodMaps.get(food.getPrintseting())).add(food);
} else {
List<OrderDetail> newFoods = new ArrayList<>();
newFoods.add(food);
foodMaps.put(food.getPrintseting(), newFoods);
}
}
/**
* 獲取"廚房單"圖片
*
* @param context
* @return
*/
private Bitmap getKitChenPrintBitmap(Context context, List<OrderDetail> foodList) {
if (foodList == null || foodList.size() <= 0) {
return null;
}
View view = LinearLayout.inflate(context, R.layout.print_kitchen, null);
TextView tvTableNumber = view.findViewById(R.id.tv_kitchen_print_table_number);
TextView tvOrderNumber = view.findViewById(R.id.tv_order_num);
TextView tvOpeningTime = view.findViewById(R.id.tv_opening_time);
TextView tvOrderTime = view.findViewById(R.id.tv_order_time);
TextView tvKitChenLocation = view.findViewById(R.id.tv_kitchen_location);
TextView tvPeople = view.findViewById(R.id.tv_people);
TextView tvOperator = view.findViewById(R.id.tv_operator);
RecyclerView rvFood = view.findViewById(R.id.rv_kitchen_food);
TextView tvTableNumber2 = view.findViewById(R.id.tv_kitchen_print_table_number2);
if (foodList.size() > 0 && foodList.get(0) != null) {
KitChenPrintFoodAdapter foodAdapter = new KitChenPrintFoodAdapter(foodList);
rvFood.setLayoutManager(new LinearLayoutManager(context));
rvFood.setAdapter(foodAdapter);
//廚房位置
if (!TextUtil.isEmptyOrNullOrUndefined(foodList.get(0).getPrintseting())) {
tvKitChenLocation.setText(foodList.get(0).getPrintseting());//.replace("*", "")
tvKitChenLocation.setVisibility(View.VISIBLE);
} else {
tvKitChenLocation.setVisibility(View.GONE);
}
}
if (OpenTableManage.getDefault().getTableBean() != null) {
// 台號
tvTableNumber.setText(OpenTableManage.getDefault().getTableBean().getTableName() + "");
tvTableNumber2.setText(OpenTableManage.getDefault().getTableBean().getTableName() + "");
//人數
tvPeople.setText(OpenTableManage.getDefault().getPeopleNumber() + "");
//訂單號
tvOrderNumber.setText("" + MyOrderManage.getInstance().getOrderId());
//開台時間
tvOpeningTime.setText(TimeUtils.parseTimeRepeat(OpenTableManage.getDefault().getTableBean().getCreateTime(), TimeUtils.DEFAULT_DATE_FORMAT));
}
//落單時間,為當前時間
tvOrderTime.setText(TimeUtils.getCurrentTimeInString(TimeUtils.DEFAULT_DATE_FORMAT));
//操作人員
tvOperator.setText(GsaCloudApplication.userName);
return viewToBitmap(context, view);
}
}
package com.joe.print.mvp.print;
public interface PrintListener {
void printStateChanged(int state);
void printSuccess();
void printFile();
}
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.adapter.print.BillAdapter;
import com.gingersoft.gsa.cloud.base.adapter.print.FoodAdapter;
import com.gingersoft.gsa.cloud.base.common.bean.BillingBean;
import com.gingersoft.gsa.cloud.base.common.bean.OrderDetail;
import com.gingersoft.gsa.cloud.base.common.bean.TableBean;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.joe.print.R;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 上菜紙打印
*/
public class PrintServe extends PrinterInIt {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
bitmapMaps.put("", bitmaps);
return bitmapMaps;
}
/**
* 獲取"印單"圖片
*
* @param context
* @return
*/
private Bitmap getServeBitmap(Context context) {
List<OrderDetail> foodList = MyOrderManage.getInstance().getNewFoodList();
if (foodList == null || foodList.size() <= 0) {
return null;
}
View view = LinearLayout.inflate(context, R.layout.print_layout_print, null);
TextView brandName = view.findViewById(R.id.tv_brand_name);
TextView restaurantName = view.findViewById(R.id.tv_restaurant_name);
TextView tableNum = view.findViewById(R.id.tv_dining_table_number);
TextView people = view.findViewById(R.id.tv_people);
TextView orderNum = view.findViewById(R.id.tv_order_num);
TextView orderData = view.findViewById(R.id.tv_date);
RecyclerView rvFood = view.findViewById(R.id.rv_food);
RecyclerView rvBillAmount = view.findViewById(R.id.rv_bill_amount);
TextView mTvTotalAmount = view.findViewById(R.id.tv_total_amount);
TextView checkOutTime = view.findViewById(R.id.tv_checkout_time);
TextView line_food_info = view.findViewById(R.id.line_food_info);
TableBean.DataBean tableBean = OpenTableManage.getDefault().getTableBean();
tableNum.setText(tableBean.getTableName());
people.setText(OpenTableManage.getDefault().getPeopleNumber() + "");
orderData.setText(TimeUtils.getCurrentTimeInString(TimeUtils.DEFAULT_DATE_FORMAT));
checkOutTime.setText(TimeUtils.getCurrentTimeInString(TimeUtils.DEFAULT_DATE_FORMAT));
FoodAdapter foodAdapter = new FoodAdapter(foodList);
rvFood.setLayoutManager(new LinearLayoutManager(context));
rvFood.setAdapter(foodAdapter);
List<BillingBean> billingBeans = new ArrayList<>();
if (billingBeans.size() <= 0) {
line_food_info.setVisibility(View.GONE);
} else {
BillAdapter billAdapter = new BillAdapter(billingBeans);
rvBillAmount.setLayoutManager(new LinearLayoutManager(context));
rvBillAmount.setAdapter(billAdapter);
}
if (OpenTableManage.getDefault().getTableBean() != null) {
tableNum.setText(OpenTableManage.getDefault().getTableBean().getTableName());
people.setText(OpenTableManage.getDefault().getPeopleNumber() + "");
}
if (MyOrderManage.getInstance().getOrderId() != -1) {
orderNum.setText(MyOrderManage.getInstance().getOrderId() + "");
}
BigDecimal totalAmount = new BigDecimal(0);
for (OrderDetail OrderDetail : foodList) {
totalAmount = MoneyUtil.sum(totalAmount, MoneyUtil.priceCalculation(OrderDetail.getPrice(), OrderDetail.getNumber()));
}
//總金額
mTvTotalAmount.setText(totalAmount + "");
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
return viewToBitmap(context, view);
}
}
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.adapter.print.BillAdapter;
import com.gingersoft.gsa.cloud.base.adapter.print.FoodAdapter;
import com.gingersoft.gsa.cloud.base.common.bean.BillingBean;
import com.gingersoft.gsa.cloud.base.common.bean.OrderDetail;
import com.gingersoft.gsa.cloud.base.common.bean.TableBean;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.MoneyUtil;
import com.gingersoft.gsa.cloud.base.utils.time.TimeUtils;
import com.joe.print.R;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 印單打印
*/
public class PrintSlip extends PrinterInIt {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getServeBitmap(mContext));
//這裡可能還需要加上廚房單的內容,有未送單的食品時。
PrintKitchen kitchen = new PrintKitchen();
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>(kitchen.getPrintBitmap(mContext));
bitmapMaps.put("", bitmaps);
return bitmapMaps;
}
/**
* 獲取"印單"圖片
*
* @param context
* @return
*/
private Bitmap getServeBitmap(Context context) {
List<OrderDetail> foodList = MyOrderManage.getInstance().getNewFoodList();
if (foodList == null || foodList.size() <= 0) {
return null;
}
View view = LinearLayout.inflate(context, R.layout.print_layout_print, null);
TextView brandName = view.findViewById(R.id.tv_brand_name);
TextView restaurantName = view.findViewById(R.id.tv_restaurant_name);
TextView tableNum = view.findViewById(R.id.tv_dining_table_number);
TextView people = view.findViewById(R.id.tv_people);
TextView orderNum = view.findViewById(R.id.tv_order_num);
TextView orderData = view.findViewById(R.id.tv_date);
RecyclerView rvFood = view.findViewById(R.id.rv_food);
RecyclerView rvBillAmount = view.findViewById(R.id.rv_bill_amount);
TextView mTvTotalAmount = view.findViewById(R.id.tv_total_amount);
TextView checkOutTime = view.findViewById(R.id.tv_checkout_time);
TextView line_food_info = view.findViewById(R.id.line_food_info);
TableBean.DataBean tableBean = OpenTableManage.getDefault().getTableBean();
tableNum.setText(tableBean.getTableName());
people.setText(OpenTableManage.getDefault().getPeopleNumber() + "");
orderData.setText(TimeUtils.getCurrentTimeInString(TimeUtils.DEFAULT_DATE_FORMAT));
checkOutTime.setText(TimeUtils.getCurrentTimeInString(TimeUtils.DEFAULT_DATE_FORMAT));
FoodAdapter foodAdapter = new FoodAdapter(foodList);
rvFood.setLayoutManager(new LinearLayoutManager(context));
rvFood.setAdapter(foodAdapter);
List<BillingBean> billingBeans = new ArrayList<>();
if (billingBeans.size() <= 0) {
line_food_info.setVisibility(View.GONE);
} else {
BillAdapter billAdapter = new BillAdapter(billingBeans);
rvBillAmount.setLayoutManager(new LinearLayoutManager(context));
rvBillAmount.setAdapter(billAdapter);
}
if (OpenTableManage.getDefault().getTableBean() != null) {
tableNum.setText(OpenTableManage.getDefault().getTableBean().getTableName());
people.setText(OpenTableManage.getDefault().getPeopleNumber() + "");
}
if (MyOrderManage.getInstance().getOrderId() != -1) {
orderNum.setText(MyOrderManage.getInstance().getOrderId() + "");
}
BigDecimal totalAmount = new BigDecimal(0);
for (OrderDetail OrderDetail : foodList) {
totalAmount = MoneyUtil.sum(totalAmount, MoneyUtil.priceCalculation(OrderDetail.getPrice(), OrderDetail.getNumber()));
}
//總金額
mTvTotalAmount.setText(totalAmount + "");
//加载条形码
// ImageView ivBarCode = view.findViewById(R.id.iv_bar_code);
// ivBarCode.setImageBitmap(BitmapUtil.generateBitmap("12312112131", 2, 450, 150));
return viewToBitmap(context, view);
}
}
package com.joe.print.mvp.print;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.LinearLayout;
import com.joe.print.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 測試頁打印
*/
public class PrintTest extends PrinterInIt {
@Override
public Map<String, List<Bitmap>> getPrintBitmap(Context mContext) {
Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<Bitmap> bitmaps = new ArrayList<>();
bitmaps.add(getTestPrintBitmap(mContext));
bitmapMaps.put("", bitmaps);
return bitmapMaps;
}
/**
* 獲取測試打印bitmap
*
* @param context
* @return
*/
private Bitmap getTestPrintBitmap(Context context) {
View view = LinearLayout.inflate(context, R.layout.print_test, null);
return viewToBitmap(context, view);
}
}
...@@ -82,6 +82,8 @@ public class PrintUtils { ...@@ -82,6 +82,8 @@ public class PrintUtils {
private static List<Bitmap> getKitchenBitmap(Context mContext) { private static List<Bitmap> getKitchenBitmap(Context mContext) {
List<Bitmap> bitmaps = new ArrayList<>(); List<Bitmap> bitmaps = new ArrayList<>();
// Map<String, List<Bitmap>> bitmapMaps = new HashMap<>();
List<OrderDetail> orderDetails = MyOrderManage.getInstance().getNewFoodList(); List<OrderDetail> orderDetails = MyOrderManage.getInstance().getNewFoodList();
if (orderDetails != null) { if (orderDetails != null) {
//廚房單,可能會有多個IP打印 //廚房單,可能會有多個IP打印
...@@ -152,17 +154,21 @@ public class PrintUtils { ...@@ -152,17 +154,21 @@ public class PrintUtils {
//通過打印位置生成多張用於打印的bitmap //通過打印位置生成多張用於打印的bitmap
for (Map.Entry<String, List<OrderDetail>> entry : foodMaps.entrySet()) { for (Map.Entry<String, List<OrderDetail>> entry : foodMaps.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
// List<Bitmap> bitmaps1 = new ArrayList<>();
if (key.contains("*")) { if (key.contains("*")) {
//如果帶*號,這個集合就需要切紙,每個食品都需要單獨在一張廚房單上 //如果帶*號,這個集合就需要切紙,每個食品都需要單獨在一張廚房單上
for (OrderDetail orderDetail : entry.getValue()) { for (OrderDetail orderDetail : entry.getValue()) {
List<OrderDetail> orders = new ArrayList<>();//這裡new集合是因為下面的方法需要的參數是list集合 List<OrderDetail> orders = new ArrayList<>();//這裡new集合是因為下面的方法需要的參數是list集合
orders.add(orderDetail); orders.add(orderDetail);
bitmaps.add(PrintUtils.getKitChenPrintBitmap(mContext, orders)); bitmaps.add(PrintUtils.getKitChenPrintBitmap(mContext, orders));
// bitmaps1.add(PrintUtils.getKitChenPrintBitmap(mContext, orders));
} }
} else { } else {
//不帶*號,所有同樣廚房位置的食品都在一張紙上 //不帶*號,所有同樣廚房位置的食品都在一張紙上
bitmaps.add(PrintUtils.getKitChenPrintBitmap(mContext, entry.getValue())); bitmaps.add(PrintUtils.getKitChenPrintBitmap(mContext, entry.getValue()));
// bitmaps1.add(PrintUtils.getKitChenPrintBitmap(mContext, entry.getValue()));
} }
// bitmapMaps.put(key, bitmaps1);
} }
} }
//通過遍歷map進行打印 //通過遍歷map進行打印
......
package com.joe.print.mvp.print;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.AidlUtil;
import com.gingersoft.gsa.cloud.base.utils.constans.Constans;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.base.utils.view.ImageUtils;
import com.gingersoft.gsa.cloud.base.utils.view.LayoutToBitmapUtils;
import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.print.PrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
import com.gingersoft.gsa.cloud.print.PrinterWriter58mm;
import com.gingersoft.gsa.cloud.print.PrinterWriter80mm;
import com.hyweb.n5.lib.constant.PrinterConstant;
import com.hyweb.n5.lib.util.PrinterUtil;
import com.hyweb.n5.server.aidl.IOnPrintCallback;
import com.jess.arms.utils.ArmsUtils;
import com.joe.print.R;
import com.joe.print.mvp.ui.activity.PrintActivity;
import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter;
import com.joe.print.mvp.ui.adapter.PrintFailListAdapter;
import com.joe.print.mvp.ui.adapter.PrintFileBitmapAdapter;
import com.sunmi.peripheral.printer.InnerResultCallbcak;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public abstract class PrinterInIt implements PrintSocketHolder.OnStateChangedListener, PrintExecutor.OnPrintResultListener {
public final static int PRINT_TEST = -1;//測試頁
public final static int PRINT_SERVE = 0;//上菜紙
public final static int PRINT_SLIP = 1;//印單
public final static int PRINT_BILL = 2;//結賬單
public final static int PRINT_KITCHEN = 3;//送單,廚房單
public final static int PRINT_CLEAN_MACHINE = 4;//清機報表
private final static int SUNMI_PAPER_WIDTH = 360;//商米打印機紙張寬度
private final static int N5_PAPER_WIDTH = 500;//N5打印機紙張寬度
final static String DELIMITER = "/";//將打印位置區分開來。。。。,暫時只有廚房單用到
private Context mContext;
private PrintListener printListener;
private Map<String, List<Bitmap>> listMap;
public static PrinterInIt getPrinterByType(int type) {
if (type == PRINT_TEST) {
return new PrintTest();
} else if (type == PRINT_SERVE) {
return new PrintServe();
} else if (type == PRINT_SLIP) {
return new PrintSlip();
} else if (type == PRINT_BILL) {
return new PrintBill();
} else if (type == PRINT_KITCHEN) {
return new PrintKitchen();
} else if (type == PRINT_CLEAN_MACHINE) {
return new PrintCleanMachine();
}
return null;
}
public PrinterInIt setmContext(Context mContext) {
this.mContext = mContext;
return this;
}
public PrinterInIt setPrintListener(PrintListener printListener) {
this.printListener = printListener;
return this;
}
/**
* @param mContext
* @return key為打印位置,值為圖片集合的map
*/
public abstract Map<String, List<Bitmap>> getPrintBitmap(Context mContext);
public void print(List<PrinterDeviceBean> deviceBeans) {
listMap = getPrintBitmap(mContext);
printSize = listMap.size();
if (printSize <= 0) {
printListener.printFile();
return;
}
// 先不管有沒有默認打印位置
// 第一步先查看map中的key是不是空的"",有key就要獲取打印機列表,找到對應打印機打印。如果沒有找到打印機再去找默認打印機
// 如果沒有key,則是走默認打印機流程
for (Map.Entry<String, List<Bitmap>> entry : listMap.entrySet()) {
if (entry.getKey().equals("")) {
//沒有打印位置,獲取默認打印位置
defaultPrint(deviceBeans, entry.getValue());
} else {
//有打印位置
hasPrinterSettingPrint(entry.getKey(), entry.getValue(), deviceBeans);
}
}
}
/**
* 本機打印
*/
public void locationPrint(List<Bitmap> bitmaps, PrintListener listener) {
//本機打印
if (bitmaps == null || bitmaps.size() <= 0) {
ToastUtils.show(mContext, "未獲取到打印內容");
listener.printFile();
return;
}
String model = Build.MODEL;
if (GsaCloudApplication.mV2.contains(model)) {
sunmiPrint(bitmaps, listener);
} else if (GsaCloudApplication.mN5.contains(model)) {
//N5打印
n5Print(bitmaps, listener);
} else {
ToastUtils.show(mContext, "暫不支持本機型打印");
listener.printFile();
}
}
/**
* n5打印
*
* @param bitmaps
* @param listener
*/
private void n5Print(List<Bitmap> bitmaps, PrintListener listener) {
try {
try {
for (int i = 0; i < bitmaps.size(); i++) {
PrinterUtil.appendImage(ImageUtils.zoomDrawable(bitmaps.get(i), N5_PAPER_WIDTH), PrinterConstant.ALIGN_CENTER);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false);
}
startN5Print(listener);
} catch (NullPointerException e) {
ToastUtils.show(mContext, "打印失敗,請重試");
// finish();
listener.printFile();
}
} catch (RemoteException e) {
e.printStackTrace();
listener.printFile();
}
}
/**
* 商米打印
*
* @param bitmaps
* @param listener
*/
private void sunmiPrint(List<Bitmap> bitmaps, PrintListener listener) {
//商米打印
AidlUtil.getInstance().printBitmaps(bitmaps, SUNMI_PAPER_WIDTH, new InnerResultCallbcak() {
@Override
public void onRunResult(boolean isSuccess) {
//返回接⼝执⾏的情况(并⾮真实打印):成功或失败
if (isSuccess) {
ToastUtils.show(mContext, "打印成功");
listener.printSuccess();
} else {
ToastUtils.show(mContext, "打印失敗");
listener.printFile();
}
}
@Override
public void onReturnString(String result) {
//部分接⼝会异步返回查询数据
Log.e("eee", "onReturnString:" + result);
}
@Override
public void onRaiseException(int code, String msg) {
//接⼝执⾏失败时,返回的异常状态
Log.e("eee", "打印異常狀態碼:" + code + "---MSG:" + msg);
}
@Override
public void onPrintResult(int code, String msg) {
//事务模式下真实的打印结果返回
Log.e("eee", "打印結果:" + code + "---MSG:" + msg);
}
});
}
private void startN5Print(PrintListener listener) {
try {
PrinterUtil.startPrint(true, new IOnPrintCallback.Stub() {
@Override
public void onPrintResult(int i) {
if (i == 0) {
//打印成功
listener.printSuccess();
} else {
//打印失敗
listener.printFile();
}
}
@Override
public IBinder asBinder() {
return this;
}
});
} catch (RemoteException e) {
e.printStackTrace();
//打印失敗
listener.printFile();
}
}
//需要打印的次數,根據打印位置來計數,帶*號的之後需要另算。
private int printSize;
private List<PrinterDeviceBean> printerDeviceBeans;
/**
* 有打印位置的打印方式
*
* @param key 打印位置
* @param bitmaps 需要打印的圖片
* @param printerDeviceBeans ip打印機集合
*/
private void hasPrinterSettingPrint(String key, List<Bitmap> bitmaps, List<PrinterDeviceBean> printerDeviceBeans) {
this.printerDeviceBeans = printerDeviceBeans;
//獲取用於打印的圖片
if (printerDeviceBeans.size() == 1) {
//如果只有一台ip打印機設備,直接全部打印在這台設備上
ipDevicePrint(printerDeviceBeans.get(0), bitmaps);
} else {
//通過打印位置生成多張用於打印的bitmap
//在打印機列表中找到當前key,
boolean isPrint = false;//是否已經打印
for (int i = 0; i < printerDeviceBeans.size(); i++) {
int lastIndex = key.lastIndexOf(DELIMITER);
key = key.substring(lastIndex + 1);
if (key.replaceAll("\\*", "").trim().equals(printerDeviceBeans.get(i).getName().trim())) {
//如果key(打印位置)去掉*號和打印機名稱相同,則在這台機器上打印
ipDevicePrint(printerDeviceBeans.get(i), bitmaps);
isPrint = true;
break;
}
}
// 循環完也沒找到對應的打印機,則使用默認打印位置,或直接本機打印
if (!isPrint) {
// 獲取默認打印位置
// 獲得用戶默認的打印方式
defaultPrint(printerDeviceBeans, bitmaps);
}
}
}
/**
* 根據打印機位置獲取打印內容
*
* @param key 打印位置
* @return 打印內容
*/
private List<Bitmap> getPrintBitmapByPrintLocation(String key) {
for (Map.Entry<String, List<Bitmap>> entry : listMap.entrySet()) {
if (!entry.getKey().equals("")) {
//有打印位置
String newKey = entry.getKey();
int lastIndex = newKey.lastIndexOf(DELIMITER);
newKey = newKey.substring(lastIndex + 1);
if (newKey.equals(key)) {
return entry.getValue();
}
}
}
return null;
}
private void defaultPrint(List<PrinterDeviceBean> printerDeviceBeans, List<Bitmap> bitmaps) {
if (Objects.equals(SPUtils.get(mContext, Constans.DEFAULT_PRINT_METHOD, ""), "")) {
// 如果沒有默認打印位置,彈出彈窗讓用戶選擇是本機打印還是ip打印
new DialogUtils(mContext, R.layout.print_dialog_select_device) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
//本地打印
hepler.setViewClick(R.id.local_print, v -> {
locationPrint(bitmaps, new PrintListener() {
@Override
public void printStateChanged(int state) {
}
@Override
public void printSuccess() {
cutPrintSize();
}
@Override
public void printFile() {
cutPrintSize();
}
});
//修改默認打印方式為本地
SPUtils.put(mContext, Constans.DEFAULT_PRINT_METHOD, Constans.LOCAL_PRINT);
dialog.dismiss();
});
//ip打印
hepler.setViewClick(R.id.internet_print, v -> {
//修改默認打印方式為IP打印
SPUtils.put(mContext, Constans.DEFAULT_PRINT_METHOD, Constans.IP_PRINT);
//彈出彈窗,讓用戶選擇ip打印機
showIpPrintDeviceList(printerDeviceBeans, bitmaps);
});
}
}.createDialogView().show();
} else if (Objects.equals(SPUtils.get(mContext, Constans.DEFAULT_PRINT_METHOD, ""), Constans.LOCAL_PRINT)) {
// 默認打印方式為本地,進行本地打印
locationPrint(bitmaps, new PrintListener() {
@Override
public void printStateChanged(int state) {
}
@Override
public void printSuccess() {
setPrintState(PrintActivity.FINISH);
}
@Override
public void printFile() {
setPrintState(PrintActivity.FINISH);
}
});
} else if (Objects.equals(SPUtils.get(mContext, Constans.DEFAULT_PRINT_METHOD, ""), Constans.IP_PRINT)) {
// 默認打印方式為ip打印,調用ip打印方法
// 獲取默認ip打印機,
if (!Objects.equals(SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, ""), "")) {
//有默認打印機
PrinterDeviceBean printerDeviceBean = new PrinterDeviceBean();
printerDeviceBean.setIp((String) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, ""));
printerDeviceBean.setPort((Integer) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PORT, 0));
printerDeviceBean.setType((Integer) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PAPER, 0));
ipDevicePrint(printerDeviceBean, bitmaps);
} else {
//沒有默認打印機,彈出彈窗,讓用戶選擇ip打印機
showIpPrintDeviceList(printerDeviceBeans, bitmaps);
}
}
}
private void showIpPrintDeviceList(List<PrinterDeviceBean> printerDeviceBeans, List<Bitmap> bitmaps) {
if (printerDeviceBeans != null && printerDeviceBeans.size() > 0) {
new DialogUtils(mContext, R.layout.print_dialog_internet_list) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
RecyclerView mRvPrintList = hepler.getView(R.id.rv_print_list);
DialogPrinterListAdapter printListAdapter = new DialogPrinterListAdapter(printerDeviceBeans, mContext);
mRvPrintList.setLayoutManager(new LinearLayoutManager(mContext));
//分割线
mRvPrintList.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(mContext, R.color.line_color)));
mRvPrintList.setAdapter(printListAdapter);
printListAdapter.setOnItemClickListener((adapter, view, position) -> {
//用戶選擇的ip打印機打印
ipDevicePrint(printerDeviceBeans.get(position), bitmaps);
dialog.dismiss();
});
}
}
.setHeight(ArmsUtils.getScreenHeidth(mContext) / 2)
.createDialogView()
.show();
} else {
//沒有打印機,讓用戶去添加
setPrintState(PrintActivity.ADD_PRINT_DEVICE);
}
}
public void ipDevicePrint(PrinterDeviceBean printerDeviceBean, List<Bitmap> bitmaps) {
ipDevicePrint(printerDeviceBean, bitmaps, this, this);
}
/**
* ip設備打印
*/
public void ipDevicePrint(PrinterDeviceBean printerDeviceBean, List<Bitmap> bitmaps, PrintSocketHolder.OnStateChangedListener stateChangedListener, PrintExecutor.OnPrintResultListener resultListener) {
int paperType = printerDeviceBean.getType();//打印紙類型 1:58mm,2::80mm
int printWidth;//打印出來的內容寬度
if (paperType == 1) {
paperType = PrinterWriter58mm.TYPE_58;
printWidth = 580 - 20;//兩邊留20的空隙
} else {
paperType = PrinterWriter80mm.TYPE_80;
printWidth = 800 - 20;//兩邊留20的空隙
}
PrintExecutor executor = new PrintExecutor(printerDeviceBean, paperType);
executor.setOnStateChangedListener(stateChangedListener);
executor.setOnPrintResultListener(resultListener);
List<Bitmap> zoomBitmaps = new ArrayList<>();
if (bitmaps != null) {
for (int i = 0; i < bitmaps.size(); i++) {
zoomBitmaps.add(ImageUtils.zoomDrawable(bitmaps.get(i), printWidth));
}
}
IpPrintMaker maker = new IpPrintMaker(mContext, printWidth, zoomBitmaps);
executor.doPrinterRequestAsync(maker);
}
/**
* view轉bitmap
*
* @param context
* @param view
* @return
*/
final Bitmap viewToBitmap(Context context, View view) {
LayoutToBitmapUtils.layoutView(context, view);//先测量view
//轉為bitmap
return LayoutToBitmapUtils.loadBitmapFromView(view);
}
//打印失敗設備map
private List<PrinterDeviceBean> printerFileDevices = new ArrayList<>();
@Override
public void onResult(int errorCode, PrinterDeviceBean printerDeviceBean) {
switch (errorCode) {
case PrintSocketHolder.ERROR_0:
Log.e("eee", "打印成功");
cutPrintSize();
break;
case PrintSocketHolder.ERROR_1:
Log.e("eee", "生成測試頁面數據失敗");
break;
case PrintSocketHolder.ERROR_2:
Log.e("eee", "連接打印機失敗" + System.currentTimeMillis());
case PrintSocketHolder.ERROR_3:
Log.e("eee", "獲取輸出流失敗");
printerFileDevices.add(printerDeviceBean);
cutPrintSize();
break;
case PrintSocketHolder.ERROR_4:
Log.e("eee", "寫入測試頁面數據失敗");
break;
case PrintSocketHolder.ERROR_5:
Log.e("eee", "必要的參數不能為空");
break;
}
setPrintState(errorCode);
}
@Override
public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) {
setPrintState(state);
}
private void setPrintState(int state) {
if (printListener != null) {
printListener.printStateChanged(state);
}
}
private void cutPrintSize() {
Log.e("eee", "個數:" + printSize);
printSize--;
if (printSize <= 0) {
Log.e("eee", "打印完了");
//全部打印完了
if (printerFileDevices != null && printerFileDevices.size() > 0) {
//有打印失敗的.關閉activity中的加載框
setPrintState(PrintActivity.DIMISS_LOADING);
//显示彈窗,將失敗的打印機信息和食品組顯示出來。
new DialogUtils(mContext, R.layout.dialog_print_fail_list) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
hepler.getView(R.id.iv_close_dialog).setOnClickListener(v -> dialog.dismiss());
RecyclerView recyclerView = hepler.getView(R.id.rv_print_fail_list);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
PrintFailListAdapter adapter = new PrintFailListAdapter(printerFileDevices);
recyclerView.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(mContext, R.color.line_color)));
adapter.setOnItemClickListener((adapter12, view, position) -> {
//顯示打印失敗的食品。
PrintFileBitmapAdapter bitmapAdapter = new PrintFileBitmapAdapter(getPrintBitmapByPrintLocation(printerFileDevices.get(position).getName().trim()));
recyclerView.setAdapter(bitmapAdapter);
});
adapter.setSwitchPrintListenter(position -> {
if (printerDeviceBeans != null && printerDeviceBeans.size() > 0) {
//切換打印機打印。跳轉到選擇打印機列表
DialogPrinterListAdapter adapter1 = new DialogPrinterListAdapter(printerDeviceBeans, mContext);
//分割线
recyclerView.setAdapter(adapter1);
adapter1.setOnItemClickListener((adapter2, view, position1) -> {
printerFileDevices.set(position, printerDeviceBeans.get(position1));
adapter.setData(position, printerDeviceBeans.get(position1));
recyclerView.setAdapter(adapter);
});
} else {
//沒有打印機,讓用戶去添加
setPrintState(PrintActivity.ADD_PRINT_DEVICE);
}
});
adapter.setTryAgainPrintListenter(position -> {
//重試打印。
ipDevicePrint(printerFileDevices.get(position), getPrintBitmapByPrintLocation(printerFileDevices.get(position).getName().trim()), (state, printerDeviceBean) -> {
//打印機打印狀態切換回調
}, (errorCode, printerDeviceBean) -> {
switch (errorCode) {
case PrintSocketHolder.ERROR_0:
//打印成功
adapter.remove(position);
Log.e("eee", "打印成功");
if (adapter.getItemCount() <= 0) {
//所有都打印成功
printListener.printSuccess();
}
break;
case PrintSocketHolder.ERROR_2:
case PrintSocketHolder.ERROR_3:
//打印失敗
adapter.setItemStatus(position, 0);
Log.e("eee", "打印失敗");
break;
}
});
});
recyclerView.setAdapter(adapter);
}
}
.setWidth((int) (ArmsUtils.getScreenWidth(mContext) * 0.66))
.setHeight((int) (ArmsUtils.getScreenHeidth(mContext) * 0.66))
.createDialogView()
.setCanceledOnTouchOutside(false)
.setOnDismissListener(dialog -> setPrintState(PrintActivity.FINISH))
.show();
} else {
//都打印成功了
Log.e("eee", "打印成功");
printListener.printSuccess();
}
}
}
}
...@@ -18,7 +18,7 @@ import java.util.List; ...@@ -18,7 +18,7 @@ import java.util.List;
/** /**
* Created by Wyh on 2020/1/9. * Created by Wyh on 2020/1/9.
* 送單打印 * ip打印類
*/ */
public class SendPrint implements PrintDataMaker { public class SendPrint implements PrintDataMaker {
......
...@@ -14,9 +14,9 @@ import java.util.ArrayList; ...@@ -14,9 +14,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* 打印測試
* 测试数据生成 * 测试数据生成
*/ */
public class TestPrintDataMaker implements PrintDataMaker { public class TestPrintDataMaker implements PrintDataMaker {
private Context context; private Context context;
......
...@@ -22,6 +22,7 @@ import androidx.annotation.Nullable; ...@@ -22,6 +22,7 @@ import androidx.annotation.Nullable;
import com.billy.cc.core.component.CC; import com.billy.cc.core.component.CC;
import com.billy.cc.core.component.CCResult; import com.billy.cc.core.component.CCResult;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.gingersoft.gsa.cloud.print.PrintExecutor; import com.gingersoft.gsa.cloud.print.PrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintSocketHolder; import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
import com.gingersoft.gsa.cloud.print.PrinterWriter58mm; import com.gingersoft.gsa.cloud.print.PrinterWriter58mm;
...@@ -132,15 +133,16 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta ...@@ -132,15 +133,16 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta
} }
public void printOrder(Context context) { public void printOrder(Context context) {
PrinterDeviceBean printerDeviceBean = new PrinterDeviceBean("", null, ip, port, type);
if (executor == null) { if (executor == null) {
executor = new PrintExecutor(ip, port, paperType); executor = new PrintExecutor(printerDeviceBean, paperType);
executor.setOnStateChangedListener(this); executor.setOnStateChangedListener(this);
executor.setOnPrintResultListener(this); executor.setOnPrintResultListener(this);
} }
if (maker == null) { if (maker == null) {
maker = new SendPrint(context, 255, printWidth, type); maker = new SendPrint(context, 255, printWidth, type);
} }
executor.setIp(ip, port); executor.setIp(printerDeviceBean);
if (type == -1) { if (type == -1) {
executor.doPrinterRequestAsync(new TestPrintDataMaker(context, 380, 255)); executor.doPrinterRequestAsync(new TestPrintDataMaker(context, 380, 255));
} else { } else {
...@@ -149,7 +151,7 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta ...@@ -149,7 +151,7 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta
} }
@Override @Override
public void onResult(int errorCode) { public void onResult(int errorCode, PrinterDeviceBean printerDeviceBean) {
String tip; String tip;
switch (errorCode) { switch (errorCode) {
case PrintSocketHolder.ERROR_0: case PrintSocketHolder.ERROR_0:
...@@ -189,7 +191,7 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta ...@@ -189,7 +191,7 @@ public class IpPrintActivity extends Activity implements PrintSocketHolder.OnSta
} }
@Override @Override
public void onStateChanged(int state) { public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) {
String tip = "打印中..."; String tip = "打印中...";
switch (state) { switch (state) {
case PrintSocketHolder.STATE_0: case PrintSocketHolder.STATE_0:
......
...@@ -3,37 +3,28 @@ package com.joe.print.mvp.ui.activity; ...@@ -3,37 +3,28 @@ package com.joe.print.mvp.ui.activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Color;
import android.os.Build; import android.graphics.drawable.ColorDrawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; 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.CC;
import com.billy.cc.core.component.CCResult; import com.billy.cc.core.component.CCResult;
import com.billy.cc.core.component.CCUtil; import com.billy.cc.core.component.CCUtil;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication; import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.common.bean.PrinterManger.PrinterManager;
import com.gingersoft.gsa.cloud.base.utils.AidlUtil;
import com.gingersoft.gsa.cloud.base.utils.constans.Constans;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils; import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import com.gingersoft.gsa.cloud.constans.PrintConstans;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.hyweb.n5.lib.constant.PrinterConstant; import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
import com.hyweb.n5.lib.exception.NoInitPrinterException;
import com.hyweb.n5.lib.util.PrinterUtil;
import com.hyweb.n5.server.aidl.IOnPrintCallback;
import com.jess.arms.base.BaseActivity; import com.jess.arms.base.BaseActivity;
import com.jess.arms.di.component.AppComponent; import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils; import com.jess.arms.utils.ArmsUtils;
...@@ -41,16 +32,12 @@ import com.joe.print.R; ...@@ -41,16 +32,12 @@ import com.joe.print.R;
import com.joe.print.di.component.DaggerPrintComponent; import com.joe.print.di.component.DaggerPrintComponent;
import com.joe.print.mvp.contract.PrintContract; import com.joe.print.mvp.contract.PrintContract;
import com.joe.print.mvp.presenter.PrintPresenter; import com.joe.print.mvp.presenter.PrintPresenter;
import com.joe.print.mvp.print.PrintStatus; import com.joe.print.mvp.print.PrintListener;
import com.joe.print.mvp.print.PrintUtils; import com.joe.print.mvp.print.PrinterInIt;
import com.joe.print.mvp.ui.adapter.DialogPrinterListAdapter;
import com.sunmi.peripheral.printer.InnerResultCallbcak;
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import static com.billy.cc.core.component.CCUtil.EXTRA_KEY_CALL_ID;
import static com.jess.arms.utils.Preconditions.checkNotNull; import static com.jess.arms.utils.Preconditions.checkNotNull;
...@@ -73,21 +60,18 @@ import static com.jess.arms.utils.Preconditions.checkNotNull; ...@@ -73,21 +60,18 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
* ----網絡打印 * ----網絡打印
* ----获取網絡打印機列表 * ----获取網絡打印機列表
*/ */
public class PrintActivity extends BaseActivity<PrintPresenter> implements PrintContract.View, DialogInterface.OnDismissListener { public class PrintActivity extends BaseActivity<PrintPresenter> implements PrintContract.View, DialogInterface.OnDismissListener, PrintListener {
private int dialogCount = 0;
private DialogUtils selectDialog;
/**
* 0:上菜紙
* 1:印單
* 2:結賬單
* 3:廚房單
* 4:清機報表
*/
private int type = -1;
public final static int ADD_PRINT_CODE = 1001;//添加打印機回調 public final static int ADD_PRINT_CODE = 1001;//添加打印機回調
public final static int DIMISS_LOADING = 1002;//關閉加載窗
public final static int FINISH = 1003;//關閉頁面
public final static int ADD_PRINT_DEVICE = 1004;//添加打印機
private String callId; private String callId;
private PrinterInIt printerInIt;
private Dialog mLoadingDialog;
private TextView mTvLoadingTip;
@Override @Override
public void setupActivityComponent(@NonNull AppComponent appComponent) { public void setupActivityComponent(@NonNull AppComponent appComponent) {
...@@ -106,218 +90,152 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -106,218 +90,152 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
return 0; //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0 return 0; //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
} }
int paperWidth = 500;
@Override @Override
public void initData(@Nullable Bundle savedInstanceState) { public void initData(@Nullable Bundle savedInstanceState) {
callId = CCUtil.getNavigateCallId(this); callId = CCUtil.getNavigateCallId(this);
initPrint();
//獲取打印類型,根據打印類型生成對應的bitmap //獲取打印類型,根據打印類型生成對應的bitmap
type = CCUtil.getNavigateParam(this, "type", 1001); /**
//380 540 * 0:上菜紙
List<Bitmap> bitmaps = PrintUtils.getPrintBitmap(mContext, type, paperWidth); * 1:印單
if (bitmaps.size() <= 0) { * 2:結賬單
printFile(); * 3:廚房單
finish(); * 4:清機報表
return; */
} int type = CCUtil.getNavigateParam(this, "type", -1);
// 獲得用戶默認的打印方式
if (Objects.equals(SPUtils.get(mContext, Constans.DEFAULT_PRINT_METHOD, ""), "")) {
// 如果沒有默認打印位置
noDefaultPrintMethod(bitmaps);
} else if (Objects.equals(SPUtils.get(mContext, Constans.DEFAULT_PRINT_METHOD, ""), Constans.LOCAL_PRINT)) {
// 默認打印方式為本地,進行本地打印
locationPrint(bitmaps);
} else if (Objects.equals(SPUtils.get(mContext, Constans.DEFAULT_PRINT_METHOD, ""), Constans.IP_PRINT)) {
// 默認打印方式為ip打印,調用ip打印方法
ipPrint();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//doSomeTing,點擊當前頁面任意地方自動關閉
finish();
return true;
}
private void initPrint() { initDialog();
if (GsaCloudApplication.mV2.contains(Build.MODEL)) {
paperWidth = 360;
} else if (GsaCloudApplication.mN5.contains(Build.MODEL)) {
paperWidth = 500;
try {
//初始化N5打印
boolean state = PrintStatus.initN5PrintStatus(mContext);
if (!state) {
//不能打印
printFile();
}
} catch (NullPointerException e) {
e.printStackTrace();
//如果是空指針,那麼需要初始化
try {
PrinterUtil.initPrinter(this);
} catch (NoInitPrinterException | RemoteException ex) {
ex.printStackTrace();
}
}
}
}
private void noDefaultPrintMethod(List<Bitmap> bitmaps) { PrinterDeviceBean deviceBean = (PrinterDeviceBean) getIntent().getSerializableExtra("deviceBean");
selectDialog = new DialogUtils(mContext, R.layout.print_dialog_select_device) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
dialogCount++;
hepler.setViewClick(R.id.local_print, v -> {
locationPrint(bitmaps);
//修改默認打印方式為本地
SPUtils.put(mContext, Constans.DEFAULT_PRINT_METHOD, Constans.LOCAL_PRINT);
dialog.dismiss();
});
hepler.setViewClick(R.id.internet_print, v -> {
//修改默認打印方式為IP打印
SPUtils.put(mContext, Constans.DEFAULT_PRINT_METHOD, Constans.IP_PRINT);
ipPrint();
});
}
}.createDialogView().show().setOnDismissListener(this);
}
/** if (type != PrinterInIt.PRINT_TEST) {
* IP打印 //不是测试才去获取打印机列表,获取到打印机列表之后就进行打印
*/
private void ipPrint() {
//獲取默認選中的IP打印機
if (Objects.equals(SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, ""), "")) {
//如果沒有獲取到默認打印機IP
if (PrinterManager.getPrinterManager().getDeviceBeans() != null
&& PrinterManager.getPrinterManager().getDeviceBeans().size() > 0) {
//如果本地保存有打印設備
showPrinterList();
} else {
//網絡獲取打印設備
mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext)); mPresenter.getPrinterList(GsaCloudApplication.getRestaurantId(mContext));
} }
} else {
//如果有默認選中打印機
PrinterDeviceBean printerDeviceBean = new PrinterDeviceBean();
printerDeviceBean.setIp((String) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_IP, ""));
printerDeviceBean.setPort((Integer) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PORT, 0));
printerDeviceBean.setType((Integer) SPUtils.get(mContext, PrintConstans.DEFAULT_PRINT_PAPER, 0));
startToIpPrint(printerDeviceBean);
}
}
/** printerInIt = PrinterInIt.getPrinterByType(type);
* 本地打印 if (printerInIt != null) {
*/ printerInIt.setmContext(mContext).setPrintListener(this);
private void locationPrint(List<Bitmap> bitmaps) {
//本機打印
if (bitmaps == null || bitmaps.size() <= 0) {
ToastUtils.show(mContext, "未獲取到打印內容");
printFile();
return;
}
String model = Build.MODEL;
if (GsaCloudApplication.mV2.contains(model)) {
//商米打印
AidlUtil.getInstance().printBitmaps(bitmaps, new InnerResultCallbcak() {
@Override
public void onRunResult(boolean isSuccess) {
//返回接⼝执⾏的情况(并⾮真实打印):成功或失败
if (isSuccess) {
ToastUtils.show(mContext, "打印成功");
printSuccess();
} else {
ToastUtils.show(mContext, "打印失敗");
printFile();
}
} }
@Override if (type == PrinterInIt.PRINT_TEST && deviceBean != null) {
public void onReturnString(String result) { printerInIt.ipDevicePrint(deviceBean, printerInIt.getPrintBitmap(mContext).get(""));
//部分接⼝会异步返回查询数据 } else {
Log.e("eee", "onReturnString:" + result); ToastUtils.show(mContext, "测试失败");
} }
@Override
public void onRaiseException(int code, String msg) {
//接⼝执⾏失败时,返回的异常状态
Log.e("eee", "打印異常狀態碼:" + code + "---MSG:" + msg);
} }
@Override private void initDialog() {
public void onPrintResult(int code, String msg) {
//事务模式下真实的打印结果返回
Log.e("eee", "打印結果:" + code + "---MSG:" + msg);
}
});
} else if (GsaCloudApplication.mN5.contains(model)) {
//N5打印
try {
try { try {
for (int i = 0; i < bitmaps.size(); i++) { View view = LayoutInflater.from(mContext).inflate(R.layout.ui_dialog_loading, null);
PrinterUtil.appendImage(bitmaps.get(i), PrinterConstant.ALIGN_CENTER); mTvLoadingTip = view.findViewById(R.id.tv_loading_dialog_text);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false); mLoadingDialog = new Dialog(mContext, R.style.ui_loading_dialog);
PrinterUtil.appendPrnStr("\n", 24, PrinterConstant.ALIGN_CENTER, false); mLoadingDialog.setCancelable(true);
} mLoadingDialog.setCanceledOnTouchOutside(false);
startN5Print(); Window window = mLoadingDialog.getWindow();
} catch (NullPointerException e) { window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
ToastUtils.show(mContext, "打印失敗,請重試"); // window.getDecorView().setBackgroundResource(android.R.color.transparent);
finish();
} mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
} catch (RemoteException e) { mLoadingDialog.show();
// mLoadingDialog.setOnDismissListener(dialog -> dismiss());
setLoadingText("加載中...");
} catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
printFile();
} }
} else {
ToastUtils.show(mContext, "暫不支持本機型打印");
printFile();
} }
}
private void startN5Print() { private void setLoadingText(String tip) {
try { if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
PrinterUtil.startPrint(true, new IOnPrintCallback.Stub() { mTvLoadingTip.setText(tip);
@Override
public void onPrintResult(int i) {
if (i == 0) {
//打印成功
printSuccess();
} else {
//打印失敗
printFile();
} }
} }
@Override @Override
public IBinder asBinder() { public boolean dispatchTouchEvent(MotionEvent ev) {
return this; //doSomeTing,點擊當前頁面任意地方自動關閉
} finish();
}); return true;
} catch (RemoteException e) {
e.printStackTrace();
//打印失敗
printFile();
}
} }
/** /**
* 打印失敗 * 打印失敗
*/ */
private void printFile() { @Override
public void printFile() {
CC.sendCCResult(callId, CCResult.error("print error")); CC.sendCCResult(callId, CCResult.error("print error"));
finish(); finish();
Log.e("eee", "打印失敗,關閉頁面");
}
@Override
public void printStateChanged(int state) {
String tip = "加載中...";
switch (state) {
case PrintSocketHolder.ERROR_0:
Log.e("eee", "打印成功");
tip = "打印成功";
break;
case PrintSocketHolder.ERROR_1:
Log.e("eee", "生成測試頁面數據失敗");
tip = "生成打印數據失敗";
break;
case PrintSocketHolder.ERROR_2:
Log.e("eee", "連接打印機失敗" + System.currentTimeMillis());
case PrintSocketHolder.ERROR_3:
Log.e("eee", "獲取輸出流失敗");
tip = "連接打印機失敗";
break;
case PrintSocketHolder.ERROR_4:
Log.e("eee", "寫入測試頁面數據失敗");
tip = "寫入測試頁面數據失敗";
break;
case PrintSocketHolder.ERROR_5:
Log.e("eee", "必要的參數不能為空");
tip = "必要的參數不能為空";
break;
case PrintSocketHolder.STATE_0:
Log.e("eee", "生成測試頁數據");
case PrintSocketHolder.STATE_1:
Log.e("eee", "開始創建連接");
tip = "開始創建連接";
break;
case PrintSocketHolder.STATE_2:
Log.e("eee", "創建連接成功,開始發送數據");
tip = "創建連接成功,開始發送數據";
break;
case PrintSocketHolder.STATE_3:
Log.e("eee", "開始寫入數據");
tip = "開始寫入數據";
break;
case PrintSocketHolder.STATE_4:
Log.e("eee", "關閉中");
tip = "關閉中";
break;
case DIMISS_LOADING:
if (mLoadingDialog != null) {
mLoadingDialog.dismiss();
}
break;
case FINISH:
finish();
printSuccess();
break;
case ADD_PRINT_DEVICE:
addPrintDevice();
break;
}
setLoadingText(tip);
} }
/** /**
* 打印成功 * 打印成功
*/ */
private void printSuccess() { @Override
public void printSuccess() {
CC.sendCCResult(callId, CCResult.success()); CC.sendCCResult(callId, CCResult.success());
finish(); finish();
Log.e("eee", "打印成功,關閉頁面");
} }
@Override @Override
...@@ -373,55 +291,18 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -373,55 +291,18 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
} }
@Override @Override
public void showPrinterList() { public void showPrinterList(List<PrinterDeviceBean> deviceBeans) {
if (selectDialog != null && selectDialog.isShowing()) { if (deviceBeans != null && deviceBeans.size() > 0) {
selectDialog.dismiss(); printerInIt.print(deviceBeans);
}
List<PrinterDeviceBean> deviceBeans = PrinterManager.getPrinterManager().getDeviceBeans();
if (deviceBeans != null) {
if (deviceBeans.size() == 1) {
//如果只配置了一個打印機,直接使用這個打印機進行打印
startToIpPrint(deviceBeans.get(0));
} else {
//有打印機,彈出彈窗,選擇打印機
new DialogUtils(mContext, R.layout.print_dialog_internet_list) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
dialogCount++;
RecyclerView mRvPrintList = hepler.getView(R.id.rv_print_list);
DialogPrinterListAdapter printListAdapter = new DialogPrinterListAdapter(deviceBeans, mContext);
mRvPrintList.setLayoutManager(new LinearLayoutManager(mContext));
//分割线
mRvPrintList.addItemDecoration(new DefaultItemDecoration(ContextCompat.getColor(mContext, R.color.line_color)));
mRvPrintList.setAdapter(printListAdapter);
printListAdapter.setOnItemClickListener((adapter, view, position) -> {
startToIpPrint(deviceBeans.get(position));
dialog.dismiss();
});
dialog.setOnDismissListener(PrintActivity.this);
}
}
.setHeight(ArmsUtils.getScreenHeidth(mContext) / 2)
.createDialogView()
.show();
}
} else { } else {
//沒有配置打印機 //沒有配置打印機
startActivityForResult(new Intent(mContext, PrinterAddActivity.class), ADD_PRINT_CODE); addPrintDevice();
} }
} }
private void startToIpPrint(PrinterDeviceBean deviceBean) { private void addPrintDevice() {
dialogCount = 2;//設置為2為了不讓回調打印失敗,因為這裡是跳轉ip打印,會關閉選擇ip的dialog,dialog關閉時會調用onDismiss方法,如果dialogCount小於2就會回調打印失敗 ToastUtils.show(mContext, "沒有打印機,請添加");
Intent intent = new Intent(mContext, IpPrintActivity.class); startActivityForResult(new Intent(mContext, PrinterAddActivity.class), ADD_PRINT_CODE);
intent.putExtra("ip", deviceBean.getIp());
intent.putExtra("port", deviceBean.getPort());
intent.putExtra("paperType", deviceBean.getType());
intent.putExtra("type", type);
intent.putExtra(EXTRA_KEY_CALL_ID, callId);
startActivity(intent);
finish();
} }
@Override @Override
...@@ -430,18 +311,22 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print ...@@ -430,18 +311,22 @@ public class PrintActivity extends BaseActivity<PrintPresenter> implements Print
if (requestCode == ADD_PRINT_CODE && resultCode == PrintActivity.ADD_PRINT_CODE) { if (requestCode == ADD_PRINT_CODE && resultCode == PrintActivity.ADD_PRINT_CODE) {
//添加打印機成功, //添加打印機成功,
if (data != null && data.getSerializableExtra("printDevice") != null) { if (data != null && data.getSerializableExtra("printDevice") != null) {
startToIpPrint((PrinterDeviceBean) data.getSerializableExtra("printDevice")); List<PrinterDeviceBean> printerDeviceBeans = new ArrayList<>();
printerDeviceBeans.add((PrinterDeviceBean) data.getSerializableExtra("printDevice"));
printerInIt.print(printerDeviceBeans);
} else {
ToastUtils.show(mContext, "未獲取到打印機");
printFile();
} }
} else {
ToastUtils.show(mContext, "未獲取到打印機");
printFile();
} }
} }
@Override @Override
public void onDismiss(DialogInterface dialog) { public void onDismiss(DialogInterface dialog) {
dialogCount--;
if (dialogCount <= 0) {
printFile();
finish();
}
} }
} }
...@@ -16,6 +16,7 @@ import androidx.annotation.Nullable; ...@@ -16,6 +16,7 @@ import androidx.annotation.Nullable;
import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication; import com.gingersoft.gsa.cloud.base.application.GsaCloudApplication;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils; import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils; import com.gingersoft.gsa.cloud.base.utils.toast.ToastUtils;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.jess.arms.base.BaseActivity; import com.jess.arms.base.BaseActivity;
...@@ -42,6 +43,8 @@ import static com.jess.arms.utils.Preconditions.checkNotNull; ...@@ -42,6 +43,8 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implements PrinterAddContract.View, View.OnClickListener { public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implements PrinterAddContract.View, View.OnClickListener {
// EditText ipEdit1, ipEdit2, ipEdit3, ipEdit4; // EditText ipEdit1, ipEdit2, ipEdit3, ipEdit4;
@BindView(R2.id.add_printer_ed_name)
EditText mEdPrintName;
@BindViews({R2.id.ip_edit_1, R2.id.ip_edit_2, R2.id.ip_edit_3, R2.id.ip_edit_4}) @BindViews({R2.id.ip_edit_1, R2.id.ip_edit_2, R2.id.ip_edit_3, R2.id.ip_edit_4})
EditText[] ipEdits = new EditText[4]; EditText[] ipEdits = new EditText[4];
@BindView(R2.id.add_printer_topbar) @BindView(R2.id.add_printer_topbar)
...@@ -53,9 +56,11 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem ...@@ -53,9 +56,11 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
@BindView(R2.id.printer_type) @BindView(R2.id.printer_type)
RadioGroup rgPaperType; RadioGroup rgPaperType;
private PrinterDeviceBean printerDeviceBean; private PrinterDeviceBean printerDeviceBean;
private boolean isEditPrinter = false;//是否是編輯打印機 private boolean isEditPrinter = false;//是否是編輯打印機
private boolean isDefault = false;//是否是默認打印機 private boolean isDefault = false;//是否是默認打印機
@Override @Override
public void setupActivityComponent(@NonNull AppComponent appComponent) { public void setupActivityComponent(@NonNull AppComponent appComponent) {
DaggerPrinterAddComponent //如找不到该类,请编译一下项目 DaggerPrinterAddComponent //如找不到该类,请编译一下项目
...@@ -85,6 +90,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem ...@@ -85,6 +90,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
// } // }
//如果不為空,則是編輯打印機,初始化信息 //如果不為空,則是編輯打印機,初始化信息
if (printerDeviceBean != null) { if (printerDeviceBean != null) {
mEdPrintName.setText(String.valueOf(printerDeviceBean.getName()));
ips = printerDeviceBean.getIp().split("[.]"); ips = printerDeviceBean.getIp().split("[.]");
etPort.setText(printerDeviceBean.getPort() + ""); etPort.setText(printerDeviceBean.getPort() + "");
if (printerDeviceBean.getType() == 1) { if (printerDeviceBean.getType() == 1) {
...@@ -168,7 +174,10 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem ...@@ -168,7 +174,10 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v.getId() == R.id.printer_add || v.getId() == R.id.print_test) { if (v.getId() == R.id.printer_add || v.getId() == R.id.print_test) {
if (mEdPrintName.getText().toString().contains("/")) {
ToastUtils.show(mContext, "打印機名稱禁止帶/字符");
return;
}
//保存打印機信息 //保存打印機信息
StringBuilder ipAddress = new StringBuilder(); StringBuilder ipAddress = new StringBuilder();
for (EditText editText : ipEdits) { for (EditText editText : ipEdits) {
...@@ -189,19 +198,27 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem ...@@ -189,19 +198,27 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
if (rgPaperType.getCheckedRadioButtonId() != R.id.print_paper_size_58) { if (rgPaperType.getCheckedRadioButtonId() != R.id.print_paper_size_58) {
paperType = 2; paperType = 2;
} }
String port = etPort.getText().toString();
PrinterDeviceBean deviceBean;
if (TextUtil.isEmptyOrNullOrUndefined(port)) {
deviceBean = new PrinterDeviceBean(mEdPrintName.getText().toString().trim(), printerDeviceBean.getId(), GsaCloudApplication.getRestaurantId(mContext), ipAddress.substring(0, ipAddress.lastIndexOf(".")), null, paperType);
} else {
deviceBean = new PrinterDeviceBean(mEdPrintName.getText().toString().trim(), printerDeviceBean.getId(), GsaCloudApplication.getRestaurantId(mContext), ipAddress.substring(0, ipAddress.lastIndexOf(".")), Integer.parseInt(port), paperType);
}
//添加打印機 //添加打印機
if (v.getId() == R.id.printer_add) { if (v.getId() == R.id.printer_add) {
if (isEditPrinter && printerDeviceBean != null) { if (isEditPrinter && printerDeviceBean != null) {
mPresenter.updatePrinterInfo(printerDeviceBean.getId(), GsaCloudApplication.getRestaurantId(mContext), ipAddress.substring(0, ipAddress.lastIndexOf(".")), etPort.getText().toString(), paperType); deviceBean.setRestaurantId(null);
mPresenter.updatePrinterInfo(deviceBean);
} else { } else {
mPresenter.addPrinter(GsaCloudApplication.getRestaurantId(mContext), ipAddress.substring(0, ipAddress.lastIndexOf(".")), etPort.getText().toString(), paperType); mPresenter.addPrinter(deviceBean);
} }
} else if (v.getId() == R.id.print_test) { } else if (v.getId() == R.id.print_test) {
//打印測試 //打印測試
Intent intent = new Intent(mContext, IpPrintActivity.class); Intent intent = new Intent(mContext, PrintActivity.class);
intent.putExtra("ip", ipAddress.substring(0, ipAddress.lastIndexOf("."))); intent.putExtra("deviceBean", deviceBean);
intent.putExtra("port", Integer.parseInt(etPort.getText().toString()));
intent.putExtra("paperType", paperType);
startActivity(intent); startActivity(intent);
} }
} }
...@@ -227,7 +244,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem ...@@ -227,7 +244,7 @@ public class PrinterAddActivity extends BaseActivity<PrinterAddPresenter> implem
@Override @Override
public void updatePrinterSuccess(PrinterDeviceBean item) { public void updatePrinterSuccess(PrinterDeviceBean item) {
//修改打印機成功,如果這個打印機是用戶設置的默認打印機,則需要更新信息 //修改打印機成功,如果這個打印機是用戶設置的默認打印機,則需要更新信息
if(isDefault){ if (isDefault) {
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_IP, item.getIp()); SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_IP, item.getIp());
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PORT, item.getPort()); SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PORT, item.getPort());
SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PAPER, item.getType()); SPUtils.put(mContext, PrintConstans.DEFAULT_PRINT_PAPER, item.getType());
......
...@@ -81,13 +81,12 @@ public class PrinterListActivity extends BaseActivity<PrintListPresenter> implem ...@@ -81,13 +81,12 @@ public class PrinterListActivity extends BaseActivity<PrintListPresenter> implem
private void initViewPager() { private void initViewPager() {
List<String> titles = new ArrayList<>(); List<String> titles = new ArrayList<>();
List<Fragment> mFragments = new ArrayList<>(); List<Fragment> mFragments = new ArrayList<>();
mFragments.add(IpPrintListActivityFragment.newInstance());
if (PrintUtils.isPrintDevice()) { if (PrintUtils.isPrintDevice()) {
titles.add("本機打印"); titles.add("本機打印");
mFragments.add(LocalPrintFragment.newInstance()); mFragments.add(LocalPrintFragment.newInstance());
} }
titles.add("網絡打印"); titles.add("網絡打印");
mFragments.add(IpPrintListActivityFragment.newInstance());
//实例化适配器 //实例化适配器
mTabFragmentAdapter = new TabFragmentAdapter(getSupportFragmentManager(), 1); mTabFragmentAdapter = new TabFragmentAdapter(getSupportFragmentManager(), 1);
......
...@@ -2,6 +2,8 @@ package com.joe.print.mvp.ui.adapter; ...@@ -2,6 +2,8 @@ package com.joe.print.mvp.ui.adapter;
import android.content.Context; import android.content.Context;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder; import com.chad.library.adapter.base.BaseViewHolder;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
...@@ -9,8 +11,6 @@ import com.joe.print.R; ...@@ -9,8 +11,6 @@ import com.joe.print.R;
import java.util.List; import java.util.List;
import androidx.annotation.Nullable;
/** /**
* Created by Wyh on 2020/1/16. * Created by Wyh on 2020/1/16.
*/ */
...@@ -28,9 +28,4 @@ public class DialogPrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean ...@@ -28,9 +28,4 @@ public class DialogPrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean
helper.setText(R.id.tv_printer_ip, String.format(mContext.getString(R.string.print_ip), item.getIp())); helper.setText(R.id.tv_printer_ip, String.format(mContext.getString(R.string.print_ip), item.getIp()));
helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), item.getPort() + "")); helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), item.getPort() + ""));
} }
public void notifyData(List<PrinterDeviceBean> data) {
this.mData = data;
super.notifyDataSetChanged();
}
} }
package com.joe.print.mvp.ui.adapter;
import android.view.View;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import com.joe.print.R;
import java.util.ArrayList;
import java.util.List;
public class PrintFailListAdapter extends BaseQuickAdapter<PrinterDeviceBean, BaseViewHolder> {
/**
* 0:打印失敗
* 1:打印中,這時候重試按鈕和切換打印機按鈕都不顯示,顯示progress
* 2:打印完成,刪除這條數據
*/
private List<Integer> printStatus = new ArrayList<>();
private onTryAgainPrintListenter tryAgainPrintListenter;
private onSwitchPrintListenter switchPrintListenter;
public PrintFailListAdapter(@Nullable List<PrinterDeviceBean> data) {
super(R.layout.item_print_fail_layout, data);
assert data != null;
for (int i = 0; i < data.size(); i++) {
printStatus.add(0);
}
}
@Override
public void remove(int position) {
printStatus.remove(position);
super.remove(position);
}
public void setTryAgainPrintListenter(onTryAgainPrintListenter tryAgainPrintListenter) {
this.tryAgainPrintListenter = tryAgainPrintListenter;
}
public void setSwitchPrintListenter(onSwitchPrintListenter switchPrintListenter) {
this.switchPrintListenter = switchPrintListenter;
}
public void setItemStatus(int position, int stauts) {
if (position < printStatus.size()) {
printStatus.set(position, stauts);
}
super.notifyItemChanged(position);
}
@Override
protected void convert(BaseViewHolder helper, PrinterDeviceBean item) {
helper.setText(R.id.tv_print_device_name, item.getName());
if (tryAgainPrintListenter != null)
helper.getView(R.id.tv_try_again_btn).setOnClickListener(v -> {
tryAgainPrintListenter.onClick(helper.getAdapterPosition());
setItemStatus(helper.getAdapterPosition(), 1);
});
if (switchPrintListenter != null)
helper.getView(R.id.tv_switch_print_btn).setOnClickListener(v -> switchPrintListenter.onClick(helper.getAdapterPosition()));
if (printStatus.get(helper.getAdapterPosition()) == 1) {
helper.getView(R.id.loading_progress).setVisibility(View.VISIBLE);
helper.getView(R.id.tv_print_status).setVisibility(View.VISIBLE);
helper.getView(R.id.tv_try_again_btn).setVisibility(View.GONE);
helper.getView(R.id.tv_switch_print_btn).setVisibility(View.GONE);
} else {
helper.getView(R.id.loading_progress).setVisibility(View.GONE);
helper.getView(R.id.tv_print_status).setVisibility(View.GONE);
helper.getView(R.id.tv_try_again_btn).setVisibility(View.VISIBLE);
helper.getView(R.id.tv_switch_print_btn).setVisibility(View.VISIBLE);
}
}
public interface onTryAgainPrintListenter {
void onClick(int position);
}
public interface onSwitchPrintListenter {
void onClick(int position);
}
}
package com.joe.print.mvp.ui.adapter;
import android.graphics.Bitmap;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.joe.print.R;
import java.util.List;
public class PrintFileBitmapAdapter extends BaseQuickAdapter<Bitmap, BaseViewHolder> {
public PrintFileBitmapAdapter(@Nullable List<Bitmap> data) {
super(R.layout.print_fail_img_item, data);
}
@Override
protected void convert(BaseViewHolder helper, Bitmap item) {
((ImageView) helper.getView(R.id.iv_print_fail)).setImageBitmap(item);
}
}
...@@ -59,7 +59,7 @@ public class PrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean, Base ...@@ -59,7 +59,7 @@ public class PrinterListAdapter extends BaseQuickAdapter<PrinterDeviceBean, Base
((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(false); ((RadioButton) helper.getView(R.id.cb_printer_item)).setChecked(false);
} }
helper.setText(R.id.tv_printer_name, item.getIp() + ""); helper.setText(R.id.tv_printer_name, item.getName() + "");
helper.setText(R.id.tv_printer_ip, String.format(mContext.getString(R.string.print_ip), item.getIp())); helper.setText(R.id.tv_printer_ip, String.format(mContext.getString(R.string.print_ip), item.getIp()));
if (item.getPort() == null) { if (item.getPort() == null) {
helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), "")); helper.setText(R.id.tv_printer_port, String.format(mContext.getString(R.string.print_port), ""));
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_4" />
<solid android:color="@color/theme_red_color" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/dp_4" />
<solid android:color="@color/theme_color" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_print_fail_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_white_eight_corners_bg" />
<ImageView
android:id="@+id/iv_close_dialog"
android:layout_width="@dimen/dp_50"
android:layout_height="@dimen/dp_50"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/dp_20"
android:padding="@dimen/dp_10"
android:src="@drawable/dialog_close" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="@dimen/dp_10">
<TextView
android:id="@+id/tv_print_device_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="K1"
android:textColor="@color/theme_333_color"
android:textSize="@dimen/dp_16" />
<ProgressBar
android:id="@+id/loading_progress"
android:layout_width="@dimen/dp_15"
android:layout_height="@dimen/dp_15"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/tv_print_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打印中..."
android:textColor="@color/theme_333_color"
android:textSize="@dimen/dp_16" />
<TextView
android:id="@+id/tv_try_again_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_error_color_bg"
android:paddingLeft="@dimen/dp_10"
android:paddingTop="@dimen/dp_5"
android:paddingRight="@dimen/dp_10"
android:paddingBottom="@dimen/dp_5"
android:text="重試"
android:textColor="@color/white"
android:textSize="@dimen/dp_16" />
<TextView
android:id="@+id/tv_switch_print_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:background="@drawable/shape_theme_color_bg"
android:paddingLeft="@dimen/dp_10"
android:paddingTop="@dimen/dp_5"
android:paddingRight="@dimen/dp_10"
android:paddingBottom="@dimen/dp_5"
android:text="切換打印機"
android:textColor="@color/white"
android:textSize="@dimen/dp_16" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/dp_10">
<ImageView
android:id="@+id/iv_print_fail"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
\ No newline at end of file
...@@ -22,6 +22,40 @@ ...@@ -22,6 +22,40 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="0.3" android:layout_weight="0.3"
android:text="名稱"
android:textColor="@color/normal_color"
android:textSize="@dimen/dp_14"
android:textStyle="bold" />
<EditText
android:id="@+id/add_printer_ed_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_weight="0.7"
android:background="@null"
android:hint="請輸入打印機名稱"
android:maxLines="1"
android:textColor="@color/normal_color"
android:textColorHint="@color/hint_color"
android:textSize="@dimen/dp_14">
<requestFocus />
</EditText>
</LinearLayout>
<include layout="@layout/include_horizontal_color_ccc_dividing_line" />
<LinearLayout
style="@style/print_add_printer_input_style"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.3"
android:text="打印機IP" android:text="打印機IP"
android:textColor="@color/normal_color" android:textColor="@color/normal_color"
android:textSize="@dimen/dp_14" android:textSize="@dimen/dp_14"
...@@ -46,10 +80,7 @@ ...@@ -46,10 +80,7 @@
android:text="192" android:text="192"
android:textColor="@color/normal_color" android:textColor="@color/normal_color"
android:textCursorDrawable="@null" android:textCursorDrawable="@null"
android:textSize="@dimen/dp_15"> android:textSize="@dimen/dp_15" />
<requestFocus />
</EditText>
<TextView <TextView
android:id="@+id/dot_1" android:id="@+id/dot_1"
......
...@@ -4,7 +4,6 @@ apply plugin: 'kotlin-android-extensions' ...@@ -4,7 +4,6 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'com.jakewharton.butterknife' apply plugin: 'com.jakewharton.butterknife'
apply plugin: 'org.greenrobot.greendao' apply plugin: 'org.greenrobot.greendao'
apply plugin: 'android-aspectjx'
android { android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"] compileSdkVersion rootProject.ext.android["compileSdkVersion"]
......
package com.gingersoft.gsa.cloud.aspectj; package com.gingersoft.gsa.cloud.aspectj;
import android.util.Log;
import android.view.View; import android.view.View;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
...@@ -32,6 +33,7 @@ public class SingleClickAspect { ...@@ -32,6 +33,7 @@ public class SingleClickAspect {
@Around("methodAnnotated()") @Around("methodAnnotated()")
public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
// 取出方法的参数 // 取出方法的参数
Log.e("eee", "執行aroundJoinPoint");
View view = null; View view = null;
for (Object arg : joinPoint.getArgs()) { for (Object arg : joinPoint.getArgs()) {
if (arg instanceof View) { if (arg instanceof View) {
......
...@@ -15,6 +15,7 @@ import org.aspectj.lang.annotation.Pointcut; ...@@ -15,6 +15,7 @@ import org.aspectj.lang.annotation.Pointcut;
/** /**
* Created by Wyh on 2020/3/2. * Created by Wyh on 2020/3/2.
* 組件化使用Aspect有問題。
*/ */
@Aspect @Aspect
public class SwitchPrintAspect { public class SwitchPrintAspect {
......
...@@ -6,6 +6,7 @@ import android.os.RemoteException; ...@@ -6,6 +6,7 @@ import android.os.RemoteException;
import android.widget.Toast; import android.widget.Toast;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil; import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.base.utils.view.ImageUtils;
import com.sunmi.peripheral.printer.InnerPrinterCallback; import com.sunmi.peripheral.printer.InnerPrinterCallback;
import com.sunmi.peripheral.printer.InnerPrinterException; import com.sunmi.peripheral.printer.InnerPrinterException;
import com.sunmi.peripheral.printer.InnerPrinterManager; import com.sunmi.peripheral.printer.InnerPrinterManager;
...@@ -180,7 +181,7 @@ public class AidlUtil { ...@@ -180,7 +181,7 @@ public class AidlUtil {
/* /*
*打印图片 *打印图片
*/ */
public void printBitmaps(List<Bitmap> bitmaps, InnerResultCallbcak mInnerResultCallbcak) { public void printBitmaps(List<Bitmap> bitmaps, int paperWidth, InnerResultCallbcak mInnerResultCallbcak) {
if (sunmiPrinterService == null) { if (sunmiPrinterService == null) {
Toast.makeText(context, LanguageUtils.get_language_system(context, "server.disconnected", "未連接上打印機!"), Toast.LENGTH_LONG).show(); Toast.makeText(context, LanguageUtils.get_language_system(context, "server.disconnected", "未連接上打印機!"), Toast.LENGTH_LONG).show();
return; return;
...@@ -189,7 +190,7 @@ public class AidlUtil { ...@@ -189,7 +190,7 @@ public class AidlUtil {
try { try {
sunmiPrinterService.setAlignment(1, null); sunmiPrinterService.setAlignment(1, null);
for (int i = 0; i < bitmaps.size(); i++) { for (int i = 0; i < bitmaps.size(); i++) {
sunmiPrinterService.printBitmap(bitmaps.get(i), mInnerResultCallbcak); sunmiPrinterService.printBitmap(ImageUtils.zoomDrawable(bitmaps.get(i), paperWidth), mInnerResultCallbcak);
sunmiPrinterService.lineWrap(3, null); sunmiPrinterService.lineWrap(3, null);
} }
} catch (RemoteException e) { } catch (RemoteException e) {
......
...@@ -113,6 +113,11 @@ public abstract class DialogUtils { ...@@ -113,6 +113,11 @@ public abstract class DialogUtils {
} }
public DialogUtils setCanceledOnTouchOutside(boolean cancel) {
dialog.setCanceledOnTouchOutside(cancel);
return this;
}
public static class ViewHepler { public static class ViewHepler {
private final SparseArray<View> mViews; private final SparseArray<View> mViews;
private View mConvertView; private View mConvertView;
......
...@@ -21,6 +21,7 @@ public class PrinterDeviceBean implements Serializable { ...@@ -21,6 +21,7 @@ public class PrinterDeviceBean implements Serializable {
@Id(autoincrement = true) @Id(autoincrement = true)
private Long dbid; private Long dbid;
private String name;
private Integer restaurantId; private Integer restaurantId;
private String ip;//ip private String ip;//ip
private Integer port;//端口 private Integer port;//端口
...@@ -30,7 +31,8 @@ public class PrinterDeviceBean implements Serializable { ...@@ -30,7 +31,8 @@ public class PrinterDeviceBean implements Serializable {
public PrinterDeviceBean() { public PrinterDeviceBean() {
} }
public PrinterDeviceBean(int id, Integer restaurantId, String ip, Integer port, int type) { public PrinterDeviceBean(String name, int id, Integer restaurantId, String ip, Integer port, int type) {
this.name = name;
this.id = id; this.id = id;
this.restaurantId = restaurantId; this.restaurantId = restaurantId;
this.ip = ip; this.ip = ip;
...@@ -39,24 +41,34 @@ public class PrinterDeviceBean implements Serializable { ...@@ -39,24 +41,34 @@ public class PrinterDeviceBean implements Serializable {
} }
public PrinterDeviceBean(Integer restaurantId, String ip, Integer port, int type) { public PrinterDeviceBean(String name, Integer restaurantId, String ip, Integer port, int type) {
this.name = name;
this.restaurantId = restaurantId; this.restaurantId = restaurantId;
this.ip = ip; this.ip = ip;
this.port = port; this.port = port;
this.type = type; this.type = type;
} }
@Generated(hash = 1970016969) @Generated(hash = 2107713534)
public PrinterDeviceBean(int id, Long dbid, Integer restaurantId, String ip, Integer port, public PrinterDeviceBean(int id, Long dbid, String name, Integer restaurantId, String ip, Integer port,
int type) { int type) {
this.id = id; this.id = id;
this.dbid = dbid; this.dbid = dbid;
this.name = name;
this.restaurantId = restaurantId; this.restaurantId = restaurantId;
this.ip = ip; this.ip = ip;
this.port = port; this.port = port;
this.type = type; this.type = type;
} }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() { public int getId() {
return this.id; return this.id;
} }
......
...@@ -26,10 +26,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> { ...@@ -26,10 +26,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
public static class Properties { public static class Properties {
public final static Property Id = new Property(0, int.class, "id", false, "ID"); public final static Property Id = new Property(0, int.class, "id", false, "ID");
public final static Property Dbid = new Property(1, Long.class, "dbid", true, "_id"); public final static Property Dbid = new Property(1, Long.class, "dbid", true, "_id");
public final static Property RestaurantId = new Property(2, Integer.class, "restaurantId", false, "RESTAURANT_ID"); public final static Property Name = new Property(2, String.class, "name", false, "NAME");
public final static Property Ip = new Property(3, String.class, "ip", false, "IP"); public final static Property RestaurantId = new Property(3, Integer.class, "restaurantId", false, "RESTAURANT_ID");
public final static Property Port = new Property(4, Integer.class, "port", false, "PORT"); public final static Property Ip = new Property(4, String.class, "ip", false, "IP");
public final static Property Type = new Property(5, int.class, "type", false, "TYPE"); public final static Property Port = new Property(5, Integer.class, "port", false, "PORT");
public final static Property Type = new Property(6, int.class, "type", false, "TYPE");
} }
...@@ -47,10 +48,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> { ...@@ -47,10 +48,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
db.execSQL("CREATE TABLE " + constraint + "\"PRINTER_DEVICE_BEAN\" (" + // db.execSQL("CREATE TABLE " + constraint + "\"PRINTER_DEVICE_BEAN\" (" + //
"\"ID\" INTEGER NOT NULL ," + // 0: id "\"ID\" INTEGER NOT NULL ," + // 0: id
"\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 1: dbid "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 1: dbid
"\"RESTAURANT_ID\" INTEGER," + // 2: restaurantId "\"NAME\" TEXT," + // 2: name
"\"IP\" TEXT," + // 3: ip "\"RESTAURANT_ID\" INTEGER," + // 3: restaurantId
"\"PORT\" INTEGER," + // 4: port "\"IP\" TEXT," + // 4: ip
"\"TYPE\" INTEGER NOT NULL );"); // 5: type "\"PORT\" INTEGER," + // 5: port
"\"TYPE\" INTEGER NOT NULL );"); // 6: type
} }
/** Drops the underlying database table. */ /** Drops the underlying database table. */
...@@ -69,21 +71,26 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> { ...@@ -69,21 +71,26 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
stmt.bindLong(2, dbid); stmt.bindLong(2, dbid);
} }
String name = entity.getName();
if (name != null) {
stmt.bindString(3, name);
}
Integer restaurantId = entity.getRestaurantId(); Integer restaurantId = entity.getRestaurantId();
if (restaurantId != null) { if (restaurantId != null) {
stmt.bindLong(3, restaurantId); stmt.bindLong(4, restaurantId);
} }
String ip = entity.getIp(); String ip = entity.getIp();
if (ip != null) { if (ip != null) {
stmt.bindString(4, ip); stmt.bindString(5, ip);
} }
Integer port = entity.getPort(); Integer port = entity.getPort();
if (port != null) { if (port != null) {
stmt.bindLong(5, port); stmt.bindLong(6, port);
} }
stmt.bindLong(6, entity.getType()); stmt.bindLong(7, entity.getType());
} }
@Override @Override
...@@ -96,21 +103,26 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> { ...@@ -96,21 +103,26 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
stmt.bindLong(2, dbid); stmt.bindLong(2, dbid);
} }
String name = entity.getName();
if (name != null) {
stmt.bindString(3, name);
}
Integer restaurantId = entity.getRestaurantId(); Integer restaurantId = entity.getRestaurantId();
if (restaurantId != null) { if (restaurantId != null) {
stmt.bindLong(3, restaurantId); stmt.bindLong(4, restaurantId);
} }
String ip = entity.getIp(); String ip = entity.getIp();
if (ip != null) { if (ip != null) {
stmt.bindString(4, ip); stmt.bindString(5, ip);
} }
Integer port = entity.getPort(); Integer port = entity.getPort();
if (port != null) { if (port != null) {
stmt.bindLong(5, port); stmt.bindLong(6, port);
} }
stmt.bindLong(6, entity.getType()); stmt.bindLong(7, entity.getType());
} }
@Override @Override
...@@ -123,10 +135,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> { ...@@ -123,10 +135,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
PrinterDeviceBean entity = new PrinterDeviceBean( // PrinterDeviceBean entity = new PrinterDeviceBean( //
cursor.getInt(offset + 0), // id cursor.getInt(offset + 0), // id
cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1), // dbid cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1), // dbid
cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2), // restaurantId cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // name
cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // ip cursor.isNull(offset + 3) ? null : cursor.getInt(offset + 3), // restaurantId
cursor.isNull(offset + 4) ? null : cursor.getInt(offset + 4), // port cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // ip
cursor.getInt(offset + 5) // type cursor.isNull(offset + 5) ? null : cursor.getInt(offset + 5), // port
cursor.getInt(offset + 6) // type
); );
return entity; return entity;
} }
...@@ -135,10 +148,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> { ...@@ -135,10 +148,11 @@ public class PrinterDeviceBeanDao extends AbstractDao<PrinterDeviceBean, Long> {
public void readEntity(Cursor cursor, PrinterDeviceBean entity, int offset) { public void readEntity(Cursor cursor, PrinterDeviceBean entity, int offset) {
entity.setId(cursor.getInt(offset + 0)); entity.setId(cursor.getInt(offset + 0));
entity.setDbid(cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1)); entity.setDbid(cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1));
entity.setRestaurantId(cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2)); entity.setName(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
entity.setIp(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); entity.setRestaurantId(cursor.isNull(offset + 3) ? null : cursor.getInt(offset + 3));
entity.setPort(cursor.isNull(offset + 4) ? null : cursor.getInt(offset + 4)); entity.setIp(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
entity.setType(cursor.getInt(offset + 5)); entity.setPort(cursor.isNull(offset + 5) ? null : cursor.getInt(offset + 5));
entity.setType(cursor.getInt(offset + 6));
} }
@Override @Override
......
...@@ -19,7 +19,8 @@ package com.gingersoft.gsa.cloud.print; ...@@ -19,7 +19,8 @@ package com.gingersoft.gsa.cloud.print;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask; import android.os.AsyncTask;
import java.lang.ref.WeakReference; import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import java.util.List; import java.util.List;
/** /**
...@@ -32,15 +33,15 @@ public class PrintExecutor { ...@@ -32,15 +33,15 @@ public class PrintExecutor {
private int mReconnectTimes = 0; private int mReconnectTimes = 0;
private int time = 0; private int time = 0;
private PrintSocketHolder.OnStateChangedListener listener; private PrintSocketHolder.OnStateChangedListener listener;
private WeakReference<OnPrintResultListener> mListener; private OnPrintResultListener mListener;
public PrintExecutor(BluetoothDevice device, int type) { public PrintExecutor(BluetoothDevice device, int type) {
holder = new PrintSocketHolder(device); holder = new PrintSocketHolder(device);
setType(type); setType(type);
} }
public PrintExecutor(String ip, int port, int type) { public PrintExecutor(PrinterDeviceBean printerDeviceBean, int type) {
holder = new PrintSocketHolder(ip, port); holder = new PrintSocketHolder(printerDeviceBean);
setType(type); setType(type);
} }
...@@ -118,12 +119,9 @@ public class PrintExecutor { ...@@ -118,12 +119,9 @@ public class PrintExecutor {
/** /**
* 设置IP及端口 * 设置IP及端口
*
* @param ip IP
* @param port 端口
*/ */
public void setIp(String ip, int port) { public void setIp(PrinterDeviceBean printerDeviceBean) {
holder.setIp(ip, port); holder.setIp(printerDeviceBean);
} }
/** /**
...@@ -168,11 +166,11 @@ public class PrintExecutor { ...@@ -168,11 +166,11 @@ public class PrintExecutor {
* @param listener 回调 * @param listener 回调
*/ */
public void setOnPrintResultListener(OnPrintResultListener listener) { public void setOnPrintResultListener(OnPrintResultListener listener) {
mListener = new WeakReference<>(listener); this.mListener = listener;
} }
public interface OnPrintResultListener { public interface OnPrintResultListener {
void onResult(int errorCode); void onResult(int errorCode, PrinterDeviceBean printerDeviceBean);
} }
private class PrintTask extends AsyncTask<PrintDataMaker, Integer, Integer> implements private class PrintTask extends AsyncTask<PrintDataMaker, Integer, Integer> implements
...@@ -197,7 +195,7 @@ public class PrintExecutor { ...@@ -197,7 +195,7 @@ public class PrintExecutor {
if (values == null || values.length < 1) if (values == null || values.length < 1)
return; return;
if (listener != null) if (listener != null)
listener.onStateChanged(values[0]); listener.onStateChanged(values[0], holder.getPrinterDeviceBean());
} }
@Override @Override
...@@ -216,14 +214,14 @@ public class PrintExecutor { ...@@ -216,14 +214,14 @@ public class PrintExecutor {
private void onResult(int errorCode) { private void onResult(int errorCode) {
try { try {
if (mListener != null) if (mListener != null)
mListener.get().onResult(errorCode); mListener.onResult(errorCode, holder.getPrinterDeviceBean());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@Override @Override
public void onStateChanged(int state) { public void onStateChanged(int state, PrinterDeviceBean printerDeviceBean) {
publishProgress(state); publishProgress(state);
} }
} }
......
...@@ -21,6 +21,7 @@ import android.bluetooth.BluetoothDevice; ...@@ -21,6 +21,7 @@ import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket; import android.bluetooth.BluetoothSocket;
import com.gingersoft.gsa.cloud.constans.PrintConstans; import com.gingersoft.gsa.cloud.constans.PrintConstans;
import com.gingersoft.gsa.cloud.database.bean.PrinterDeviceBean;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
...@@ -36,7 +37,7 @@ import java.util.UUID; ...@@ -36,7 +37,7 @@ import java.util.UUID;
*/ */
@SuppressWarnings({"WeakerAccess", "unused"}) @SuppressWarnings({"WeakerAccess", "unused"})
public class PrintSocketHolder { public class PrintSocketHolder {
public static final int STATE_0 = 0;// 生成测试页面数据 public static final int STATE_0 = 10;// 生成测试页面数据
public static final int STATE_1 = 1;// 创建Socket连接 public static final int STATE_1 = 1;// 创建Socket连接
public static final int STATE_2 = 2;// 获取输出流 public static final int STATE_2 = 2;// 获取输出流
public static final int STATE_3 = 3;// 写入测试页面数据 public static final int STATE_3 = 3;// 写入测试页面数据
...@@ -50,8 +51,9 @@ public class PrintSocketHolder { ...@@ -50,8 +51,9 @@ public class PrintSocketHolder {
public static final int ERROR_6 = -6;// 关闭Socket出错 public static final int ERROR_6 = -6;// 关闭Socket出错
public static final int ERROR_100 = -100;// 失败 public static final int ERROR_100 = -100;// 失败
private static final UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//蓝牙打印UUID private static final UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//蓝牙打印UUID
private String ip; // private String ip;
private int port = 9100; // private int port = 9100;
private PrinterDeviceBean printerDeviceBean;
private BluetoothDevice mDevice; private BluetoothDevice mDevice;
private Socket socket; private Socket socket;
private BluetoothSocket bluetoothSocket; private BluetoothSocket bluetoothSocket;
...@@ -62,14 +64,14 @@ public class PrintSocketHolder { ...@@ -62,14 +64,14 @@ public class PrintSocketHolder {
setDevice(device); setDevice(device);
} }
public PrintSocketHolder(String ip, int port) { public PrintSocketHolder(PrinterDeviceBean printerDeviceBean) {
setIp(ip, port); setIp(printerDeviceBean);
} }
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
public int createSocket() { public int createSocket() {
onPrinterStateChanged(STATE_1); onPrinterStateChanged(STATE_1);
if (mDevice == null && ip == null) if (mDevice == null && (printerDeviceBean == null || printerDeviceBean.getIp() == null))
return ERROR_5; return ERROR_5;
try { try {
if (mDevice != null) { if (mDevice != null) {
...@@ -77,7 +79,7 @@ public class PrintSocketHolder { ...@@ -77,7 +79,7 @@ public class PrintSocketHolder {
bluetoothSocket.connect(); bluetoothSocket.connect();
} else { } else {
socket = new Socket();//ip, port socket = new Socket();//ip, port
InetSocketAddress socketAddress = new InetSocketAddress(ip, port); InetSocketAddress socketAddress = new InetSocketAddress(printerDeviceBean.getIp(), printerDeviceBean.getPort());
//设置 超时时间 //设置 超时时间
socket.setSoTimeout(PrintConstans.SO_TIMEOUT); socket.setSoTimeout(PrintConstans.SO_TIMEOUT);
socket.connect(socketAddress, PrintConstans.PRINT_TIMEOUT);//开始连接ip socket.connect(socketAddress, PrintConstans.PRINT_TIMEOUT);//开始连接ip
...@@ -200,8 +202,8 @@ public class PrintSocketHolder { ...@@ -200,8 +202,8 @@ public class PrintSocketHolder {
*/ */
public void onPrinterStateChanged(int state) { public void onPrinterStateChanged(int state) {
try { try {
if (mListener != null) if (mListener != null && mListener.get() != null)
mListener.get().onStateChanged(state); mListener.get().onStateChanged(state, printerDeviceBean);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
...@@ -209,13 +211,26 @@ public class PrintSocketHolder { ...@@ -209,13 +211,26 @@ public class PrintSocketHolder {
/** /**
* 设置IP及端口 * 设置IP及端口
*
* @param ip IP
* @param port 端口
*/ */
public void setIp(String ip, int port) { public void setIp(PrinterDeviceBean printerDeviceBean) {
this.ip = ip; this.printerDeviceBean = printerDeviceBean;
this.port = port; }
// public String getIp() {
// return ip;
// }
//
// public int getPort() {
// return port;
// }
public PrinterDeviceBean getPrinterDeviceBean() {
return printerDeviceBean;
}
public void setPrinterDeviceBean(PrinterDeviceBean printerDeviceBean) {
this.printerDeviceBean = printerDeviceBean;
} }
/** /**
...@@ -237,6 +252,6 @@ public class PrintSocketHolder { ...@@ -237,6 +252,6 @@ public class PrintSocketHolder {
} }
public interface OnStateChangedListener { public interface OnStateChangedListener {
void onStateChanged(int state); void onStateChanged(int state, PrinterDeviceBean printerDeviceBean);
} }
} }
...@@ -16,10 +16,17 @@ ...@@ -16,10 +16,17 @@
package com.gingersoft.gsa.cloud.print; package com.gingersoft.gsa.cloud.print;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Matrix; import android.graphics.Matrix;
import com.gingersoft.gsa.cloud.base.R;
import com.gingersoft.gsa.cloud.base.utils.constans.Constans;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -441,4 +448,25 @@ public class PrinterUtils { ...@@ -441,4 +448,25 @@ public class PrinterUtils {
private static byte charToByte(char c) { private static byte charToByte(char c) {
return (byte) hexStr.indexOf(c); return (byte) hexStr.indexOf(c);
} }
/**
* 顯示修改打印方式的彈窗
* @param context
*/
public static void switchPrintMethod(Context context){
// 顯示切換打印方式的彈窗
new DialogUtils(context, R.layout.print_select_print_method) {
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
hepler.setViewClick(R.id.local_print, v -> {
SPUtils.put(dialog.getContext(), Constans.DEFAULT_PRINT_METHOD, Constans.LOCAL_PRINT);
dialog.dismiss();
});
hepler.setViewClick(R.id.internet_print, v -> {
SPUtils.put(dialog.getContext(), Constans.DEFAULT_PRINT_METHOD, Constans.IP_PRINT);
dialog.dismiss();
});
}
}.createDialogView().show();
}
} }
apply from: rootProject.file('cc-settings.gradle') apply from: rootProject.file('cc-settings.gradle')
apply plugin: 'com.jakewharton.butterknife' apply plugin: 'com.jakewharton.butterknife'
android { android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"] compileSdkVersion rootProject.ext.android["compileSdkVersion"]
......
...@@ -18,14 +18,13 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage; ...@@ -18,14 +18,13 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage; import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils; import com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.database.bean.Function; import com.gingersoft.gsa.cloud.database.bean.Function;
import com.gingersoft.gsa.cloud.table.R; import com.gingersoft.gsa.cloud.print.PrinterUtils;
import com.gingersoft.gsa.cloud.table.app.GoldConstants; import com.gingersoft.gsa.cloud.table.app.GoldConstants;
import com.gingersoft.gsa.cloud.table.mvp.contract.OrderContentContract; import com.gingersoft.gsa.cloud.table.mvp.contract.OrderContentContract;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.BaseRespose; import com.gingersoft.gsa.cloud.table.mvp.model.bean.BaseRespose;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.TableDetail; import com.gingersoft.gsa.cloud.table.mvp.model.bean.TableDetail;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.AddOrderRequest; import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.AddOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.CreateOrderRequest; import com.gingersoft.gsa.cloud.table.mvp.model.bean.request.CreateOrderRequest;
import com.gingersoft.gsa.cloud.table.mvp.model.constant.MealConstant;
import com.gingersoft.gsa.cloud.table.mvp.model.utils.OrderAssemblyUtil; import com.gingersoft.gsa.cloud.table.mvp.model.utils.OrderAssemblyUtil;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity; import com.gingersoft.gsa.cloud.table.mvp.ui.activity.MealStandActivity;
import com.gingersoft.gsa.cloud.table.mvp.ui.activity.OrderContentActivity; import com.gingersoft.gsa.cloud.table.mvp.ui.activity.OrderContentActivity;
...@@ -38,8 +37,6 @@ import com.jess.arms.di.scope.ActivityScope; ...@@ -38,8 +37,6 @@ import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.http.imageloader.ImageLoader; import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager; import com.jess.arms.integration.AppManager;
import com.jess.arms.utils.RxLifecycleUtils; import com.jess.arms.utils.RxLifecycleUtils;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.api.RefreshLayout;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -157,6 +154,14 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra ...@@ -157,6 +154,14 @@ public class OrderContentPresenter extends BaseOrderPresenter<OrderContentContra
} }
} }
}); });
mOrderTopFunctionAdapter.setmOnLongClickListener((v, position) -> {
if (mFunctionList != null) {
if (mFunctionList.get(position).getResName().equals("印單") || mFunctionList.get(position).getResName().equals("送單")) {
PrinterUtils.switchPrintMethod(v.getContext());
}
}
return false;
});
} }
public void initTopFunctionData() { public void initTopFunctionData() {
......
package com.gingersoft.gsa.cloud.table.mvp.ui.activity; package com.gingersoft.gsa.cloud.table.mvp.ui.activity;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.os.Build; import android.os.Build;
...@@ -38,14 +37,13 @@ import com.gingersoft.gsa.cloud.base.common.bean.TableBean; ...@@ -38,14 +37,13 @@ import com.gingersoft.gsa.cloud.base.common.bean.TableBean;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage; import com.gingersoft.gsa.cloud.base.common.bean.mealManage.MyOrderManage;
import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage; import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.VibratorUtils; import com.gingersoft.gsa.cloud.base.utils.VibratorUtils;
import com.gingersoft.gsa.cloud.base.utils.constans.Constans;
import com.gingersoft.gsa.cloud.base.utils.other.SPUtils; import com.gingersoft.gsa.cloud.base.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.base.widget.DialogUtils;
import com.gingersoft.gsa.cloud.database.bean.Food; import com.gingersoft.gsa.cloud.database.bean.Food;
import com.gingersoft.gsa.cloud.database.utils.ComboItemDaoUtils; import com.gingersoft.gsa.cloud.database.utils.ComboItemDaoUtils;
import com.gingersoft.gsa.cloud.database.utils.FoodComboDaoUtils; import com.gingersoft.gsa.cloud.database.utils.FoodComboDaoUtils;
import com.gingersoft.gsa.cloud.database.utils.FoodDaoUtils; import com.gingersoft.gsa.cloud.database.utils.FoodDaoUtils;
import com.gingersoft.gsa.cloud.database.utils.FoodModifierDaoUtils; import com.gingersoft.gsa.cloud.database.utils.FoodModifierDaoUtils;
import com.gingersoft.gsa.cloud.print.PrinterUtils;
import com.gingersoft.gsa.cloud.table.R; import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2; import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.app.GoldConstants; import com.gingersoft.gsa.cloud.table.app.GoldConstants;
...@@ -1004,28 +1002,11 @@ public class MealStandActivity extends BaseActivity<MealStandPresenter> implemen ...@@ -1004,28 +1002,11 @@ public class MealStandActivity extends BaseActivity<MealStandPresenter> implemen
map.put(MealConstant.fine_tabs_ViewMode, rl_fine_tabs); map.put(MealConstant.fine_tabs_ViewMode, rl_fine_tabs);
map.put(MealConstant.ViewMode_keys, keyView); map.put(MealConstant.ViewMode_keys, keyView);
// @SwitchPrintMethod
btn_send_order.setOnLongClickListener(v -> { btn_send_order.setOnLongClickListener(v -> {
new DialogUtils(mContext, R.layout.print_select_print_method) { PrinterUtils.switchPrintMethod(mContext);
@Override
public void initLayout(ViewHepler hepler, Dialog dialog) {
hepler.setViewClick(R.id.local_print, v -> {
SPUtils.put(mContext, Constans.DEFAULT_PRINT_METHOD, Constans.LOCAL_PRINT);
dialog.dismiss();
});
hepler.setViewClick(R.id.internet_print, v -> {
SPUtils.put(mContext, Constans.DEFAULT_PRINT_METHOD, Constans.IP_PRINT);
dialog.dismiss();
});
}
}.createDialogView().show();
return false; return false;
}); });
// btn_send_order.setOnLongClickListener(new View.OnLongClickListener() {
// @Override
// public boolean onLongClick(View v) {
// return false;
// }
// });
} }
public FoodGroupAdapter getFoodGroupGridViewAdapter() { public FoodGroupAdapter getFoodGroupGridViewAdapter() {
......
...@@ -24,6 +24,7 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage; ...@@ -24,6 +24,7 @@ import com.gingersoft.gsa.cloud.base.common.bean.mealManage.OpenTableManage;
import com.gingersoft.gsa.cloud.base.utils.VibratorUtils; import com.gingersoft.gsa.cloud.base.utils.VibratorUtils;
import com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils; import com.gingersoft.gsa.cloud.base.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.base.utils.log.LogUtil; import com.gingersoft.gsa.cloud.base.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.print.PrinterUtils;
import com.gingersoft.gsa.cloud.table.R; import com.gingersoft.gsa.cloud.table.R;
import com.gingersoft.gsa.cloud.table.R2; import com.gingersoft.gsa.cloud.table.R2;
import com.gingersoft.gsa.cloud.table.app.payment.PayConstant; import com.gingersoft.gsa.cloud.table.app.payment.PayConstant;
...@@ -62,6 +63,7 @@ import javax.inject.Inject; ...@@ -62,6 +63,7 @@ import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
import butterknife.OnClick; import butterknife.OnClick;
import butterknife.OnLongClick;
import static com.jess.arms.utils.Preconditions.checkNotNull; import static com.jess.arms.utils.Preconditions.checkNotNull;
...@@ -78,7 +80,7 @@ import static com.jess.arms.utils.Preconditions.checkNotNull; ...@@ -78,7 +80,7 @@ import static com.jess.arms.utils.Preconditions.checkNotNull;
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a> * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================ * ================================================
*/ */
public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements OrderPayContract.View { public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements OrderPayContract.View, View.OnLongClickListener {
@Inject @Inject
AppManager mAppManager; AppManager mAppManager;
...@@ -284,6 +286,21 @@ public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements ...@@ -284,6 +286,21 @@ public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements
} }
} }
@Override
@OnLongClick({R2.id.btn_sure_pay})
public boolean onLongClick(View v) {
if (v.getId() == R.id.btn_sure_pay) {
PrinterUtils.switchPrintMethod(mContext);
}
return false;
}
//
// @SwitchPrintMethod
// public void switchPrint(View v) {
//
// PrinterUtils.switchPrintMethod(mContext);
// }
private void backPressed() { private void backPressed() {
// if (isPrepay) { // if (isPrepay) {
// //恢復預結賬前的食品 // //恢復預結賬前的食品
...@@ -685,4 +702,5 @@ public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements ...@@ -685,4 +702,5 @@ public class OrderPayActivity extends BaseActivity<OrderPayPresenter> implements
public void onPointerCaptureChanged(boolean hasCapture) { public void onPointerCaptureChanged(boolean hasCapture) {
} }
} }
...@@ -2,7 +2,6 @@ package com.gingersoft.gsa.cloud.table.mvp.ui.adapter; ...@@ -2,7 +2,6 @@ package com.gingersoft.gsa.cloud.table.mvp.ui.adapter;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import com.gingersoft.gsa.cloud.database.bean.Function; import com.gingersoft.gsa.cloud.database.bean.Function;
import com.gingersoft.gsa.cloud.table.R; import com.gingersoft.gsa.cloud.table.R;
...@@ -10,7 +9,6 @@ import com.gingersoft.gsa.cloud.table.R2; ...@@ -10,7 +9,6 @@ import com.gingersoft.gsa.cloud.table.R2;
import com.jess.arms.base.BaseHolder; import com.jess.arms.base.BaseHolder;
import com.jess.arms.base.DefaultAdapter; import com.jess.arms.base.DefaultAdapter;
import com.qmuiteam.qmui.alpha.QMUIAlphaButton; import com.qmuiteam.qmui.alpha.QMUIAlphaButton;
import com.qmuiteam.qmui.util.QMUIDisplayHelper;
import java.util.List; import java.util.List;
...@@ -65,7 +63,6 @@ public class OrderTopFunctionAdapter extends DefaultAdapter<Function> { ...@@ -65,7 +63,6 @@ public class OrderTopFunctionAdapter extends DefaultAdapter<Function> {
btn_name.setTextColor(datasBean.getTextColor()); btn_name.setTextColor(datasBean.getTextColor());
btn_name.setBackgroundColor(datasBean.getBackgroundColor()); btn_name.setBackgroundColor(datasBean.getBackgroundColor());
btn_name.setTextSize(datasBean.getTextSize()); btn_name.setTextSize(datasBean.getTextSize());
} }
} }
......
ext.mainApp = true //设置为true,表示此module为主app module,一直以application方式编译 ext.mainApp = true //设置为true,表示此module为主app module,一直以application方式编译
apply from: rootProject.file("cc-settings.gradle") apply from: rootProject.file("cc-settings.gradle")
apply plugin: 'com.jakewharton.butterknife' apply plugin: 'com.jakewharton.butterknife'
//apply plugin: 'android-aspectjx'
android { android {
signingConfigs { signingConfigs {
GSAndroidNew { GSAndroidNew {
...@@ -84,7 +83,6 @@ dependencies { ...@@ -84,7 +83,6 @@ dependencies {
addComponent 'other_order_mode' addComponent 'other_order_mode'
annotationProcessor rootProject.ext.dependencies["dagger2-compiler"] annotationProcessor rootProject.ext.dependencies["dagger2-compiler"]
implementation rootProject.ext.dependencies["autosize"] implementation rootProject.ext.dependencies["autosize"]
implementation rootProject.ext.dependencies["fastjson"] implementation rootProject.ext.dependencies["fastjson"]
......
...@@ -113,7 +113,7 @@ public class WelcomeActivity extends LoginInterfaceImpl<WelcomePresenter> implem ...@@ -113,7 +113,7 @@ public class WelcomeActivity extends LoginInterfaceImpl<WelcomePresenter> implem
} }
}); });
guideBeanList.add(new GuideBean("多终端云同步,轻松管理所有", "為您搭建優良高效管理平台", getResources().getDrawable(R.mipmap.pic_guide_one))); guideBeanList.add(new GuideBean("多終端雲同步,輕鬆管理所有", "為您搭建優良高效管理平台", getResources().getDrawable(R.mipmap.pic_guide_one)));
guideBeanList.add(new GuideBean("數據分析可視化", "數據統計一目了然,直觀看到數據變化趨勢", getResources().getDrawable(R.mipmap.pic_guide_two))); guideBeanList.add(new GuideBean("數據分析可視化", "數據統計一目了然,直觀看到數據變化趨勢", getResources().getDrawable(R.mipmap.pic_guide_two)));
guideBeanList.add(new GuideBean("多種點餐方式", "提供方便快捷的點餐服務,減低落錯單機會", getResources().getDrawable(R.mipmap.pic_guide_three))); guideBeanList.add(new GuideBean("多種點餐方式", "提供方便快捷的點餐服務,減低落錯單機會", getResources().getDrawable(R.mipmap.pic_guide_three)));
GuideAdapter adapter = new GuideAdapter(mContext, guideBeanList); GuideAdapter adapter = new GuideAdapter(mContext, guideBeanList);
......
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