Commit 3f9efe4d authored by hywang's avatar hywang

增加连接蓝牙打印机,打印绒毛购买功能

parent 3c04d802
......@@ -46,6 +46,7 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation files('libs\\printersdkv5.6.jar')
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
......
......@@ -10,6 +10,8 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<application
......@@ -83,6 +85,7 @@
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize"/>
<activity android:name=".ui.villus.BluetoothDeviceList"/>
</application>
</manifest>
\ No newline at end of file
......@@ -4,6 +4,8 @@ import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.printer.sdk.PrinterInstance;
/**
* <pre>
* author : lei
......@@ -55,6 +57,14 @@ public class Configs {
//0 高频,1低频
public static String FREQUENCY_CONFIG = "0";
/** 蓝牙 */
public static boolean isConnected = false;// 蓝牙连接状态
public static final String DEVICEADDRESS = "deviceAddress";
public static String DEVICENAME = "deviceName";
public static PrinterInstance myPrinter;
public static boolean ISCONNECTED;
public static String packageName(Context context) {
PackageManager manager = context.getPackageManager();
......
......@@ -25,6 +25,7 @@ import com.phlx.wool.entity.VillusGaugeEntity;
import com.phlx.wool.params.BasicParams;
import com.phlx.wool.params.CattleResponse;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
......@@ -231,6 +232,14 @@ public class Repository extends BaseModel implements HttpDataSource, LocalDataSo
return DbUtil.getInstance().queryAll(DivisionEntity.class, builder);
}
@Override
public List<DivisionEntity> getPertainForCode(String Id) {
QueryBuilder<DivisionEntity> builder =
DbUtil.getInstance().getQueryBuilder(DivisionEntity.class)
.where(DivisionEntityDao.Properties.Code.eq(Id));
return DbUtil.getInstance().queryAll(DivisionEntity.class, builder);
}
@Override
public List<VillusBuyEntity> getVillusBuy() {
QueryBuilder<VillusBuyEntity> builder =
......
......@@ -15,8 +15,8 @@ import com.phlx.wool.ui.splash.SplashVM;
import com.phlx.wool.ui.sync.vm.ClearVM;
import com.phlx.wool.ui.sync.vm.DownloadVM;
import com.phlx.wool.ui.sync.vm.UploadVM;
import com.phlx.wool.ui.villus.VillusBuyVM;
import com.phlx.wool.ui.villus.VillusGaugeVM;
import com.phlx.wool.ui.villus.vm.VillusBuyVM;
import com.phlx.wool.ui.villus.vm.VillusGaugeVM;
import com.phlx.wool.ui.work.harmless.HarmlessVM;
import com.phlx.wool.ui.work.mark.MarkingVM;
import com.phlx.wool.ui.work.quarantine.QuarantineVM;
......
......@@ -103,10 +103,15 @@ public interface LocalDataSource {
List<Variety> getVariety();
/**
* 获取行政区划
* 获取行政区划列表
*/
List<DivisionEntity> getPertain(String parentId);
/**
* 获取行政区划详细信息
*/
List<DivisionEntity> getPertainForCode(String Id);
/**
* 获取绒毛购买列表
*/
......
......@@ -123,6 +123,11 @@ public class LocalDataSourceImpl implements LocalDataSource {
return DbUtil.getInstance().queryAll(DivisionEntity.class);
}
@Override
public List<DivisionEntity> getPertainForCode(String Id) {
return DbUtil.getInstance().queryAll(DivisionEntity.class);
}
@Override
public List<VillusBuyEntity> getVillusBuy() {
return DbUtil.getInstance().queryAll(VillusBuyEntity.class);
......
......@@ -47,7 +47,7 @@ public class RetrofitClient {
//缓存时间
private static final int CACHE_TIMEOUT = 10 * 1024 * 1024;
//服务端根路径
public static String baseUrl = "192.168.8.189";
public static String baseUrl = "192.168.8.182";
public static String port = "80";
private static Context mContext = Utils.getContext();
......
package com.phlx.wool.ui.main;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.view.GravityCompat;
......@@ -10,11 +26,21 @@ import androidx.lifecycle.ViewModelProviders;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.phlx.wool.BR;
import com.phlx.wool.Configs;
import com.phlx.wool.R;
import com.phlx.wool.data.VMFactory;
import com.phlx.wool.databinding.ActivityMainBinding;
import com.phlx.wool.rfid.ModuleManager;
import com.phlx.wool.ui.base.BaseActivity;
import com.phlx.wool.ui.villus.BluetoothDeviceList;
import com.phlx.wool.util.TextUtil;
import com.printer.sdk.PrinterInstance;
import com.printer.sdk.utils.PrefUtils;
import com.printer.sdk.utils.XLog;
import com.printer.sdk.PrinterConstants.Connect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* <pre>
......@@ -26,6 +52,27 @@ import com.phlx.wool.ui.base.BaseActivity;
* </pre>
*/
public class MainActivity extends BaseActivity<ActivityMainBinding, MainVM> {
protected static final String TAG = "MainActivity";
//蓝牙
private static BluetoothDevice mDevice;
public static String devicesName = "未知设备";
private static String devicesAddress;
private BluetoothAdapter mBtAdapter;
private IntentFilter bluDisconnectFilter;
// 不同蓝牙链接方式的判断依据 “确认连接”
public static int connectMains = 0;
public static final int CONNECT_DEVICE = 1;
private final static int SCANNIN_GREQUEST_CODE = 2;
public static final int ENABLE_BT = 3;
private static boolean hasRegDisconnectReceiver = false;
private int interfaceType = 0;
private ProgressDialog dialog;
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_main;
......@@ -48,6 +95,18 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainVM> {
super.initData();
setSupportActionBar(binding.include.toolbar);
viewModel.initToolbar();
// 初始化对话框
dialog = new ProgressDialog(this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setTitle("蓝牙连接中。。。");
dialog.setMessage("请等待。。。");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
PrefUtils.setString(this, Configs.DEVICEADDRESS, devicesAddress);
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
if (ModuleManager.openCom() != 0) {
new MaterialDialog.Builder(this).title("系统提示").content("串口打开失败,无法工作,请检查设备").cancelable(false).canceledOnTouchOutside(false).positiveText("退出").onAny(new MaterialDialog.SingleButtonCallback() {
@Override
......@@ -78,6 +137,331 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainVM> {
}
}).show();
});
//弹出绒毛购买打印选择
viewModel.printEvent.observe(this, aBoolean -> {
new MaterialDialog.Builder(this).title("系统信息").content("请选择购买订单!!!")
.cancelable(false).canceledOnTouchOutside(false)
.positiveText("确定")
.items(viewModel.getVillusBuyList())
.itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {
viewModel.printVillusBuy(Configs.myPrinter, text);
return true;
}
}).show();
});
//连接蓝牙
viewModel.bluetoothEvent.observe(this, aBoolean -> {
new MaterialDialog.Builder(this).title("系统信息").content("请先连接蓝牙")
.cancelable(false).canceledOnTouchOutside(false)
.positiveText("确定").onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (which == DialogAction.POSITIVE) {
dialog.dismiss();
connectMains = 0;
// 重新连接
if (!(mBtAdapter == null)) {
// 判断设备蓝牙功能是否打开
if (!mBtAdapter.isEnabled()) {
// 打开蓝牙功能
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, ENABLE_BT);
} else {
// mDevice
devicesAddress = PrefUtils.getString(MainActivity.this, Configs.DEVICEADDRESS, "");
if (devicesAddress == null || devicesAddress.length() <= 0) {
Toast.makeText(MainActivity.this, "您是第一次启动程序,请选择重新搜索连接!",
Toast.LENGTH_SHORT).show();
} else {
connect2BlueToothdevice();
}
}
}
}
}
}).negativeText("重新选择").onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (which == DialogAction.NEGATIVE) {
dialog.dismiss();
connectMains = 1;
if (!(mBtAdapter == null)) {
// 判断设备蓝牙功能是否打开
if (!mBtAdapter.isEnabled()) {
// 打开蓝牙功能
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, MainActivity.ENABLE_BT);
} else {
Intent intent = new Intent(MainActivity.this, BluetoothDeviceList.class);
startActivityForResult(intent, CONNECT_DEVICE);
}
}
}
}
}).show();
});
}
private void connect2BlueToothdevice() {
dialog.show();
mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(devicesAddress);
devicesName = mDevice.getName();
Configs.myPrinter = PrinterInstance.getPrinterInstance(mDevice, mHandler);
if (mDevice.getBondState() == BluetoothDevice.BOND_NONE) { // 未绑定
// IntentFilter boundFilter = new IntentFilter();
// boundFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
// mContext.registerReceiver(boundDeviceReceiver, boundFilter);
PairOrConnect(true);
} else {
PairOrConnect(false);
}
}
private void PairOrConnect(boolean pair) {
if (pair) {
IntentFilter boundFilter = new IntentFilter();
boundFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(boundDeviceReceiver, boundFilter);
boolean success = false;
try {
// // 自动设置pin值
// Method autoBondMethod =
// BluetoothDevice.class.getMethod("setPin", new Class[] {
// byte[].class });
// boolean result = (Boolean) autoBondMethod.invoke(mDevice, new
// Object[] { "1234".getBytes() });
// Log.i(TAG, "setPin is success? : " + result);
// 开始配对 这段代码打开输入配对密码的对话框
Method createBondMethod = BluetoothDevice.class.getMethod("createBond");
success = (Boolean) createBondMethod.invoke(mDevice);
// // 取消用户输入
// Method cancelInputMethod =
// BluetoothDevice.class.getMethod("cancelPairingUserInput");
// boolean cancleResult = (Boolean)
// cancelInputMethod.invoke(mDevice);
// Log.i(TAG, "cancle is success? : " + cancleResult);
} catch (IllegalAccessException e) {
e.printStackTrace();
Log.e(TAG, "IllegalAccessException: " + e.getMessage());
} catch (IllegalArgumentException e) {
e.printStackTrace();
Log.e(TAG, "IllegalArgumentException: " + e.getMessage());
} catch (InvocationTargetException e) {
e.printStackTrace();
Log.e(TAG, "InvocationTargetException: " + e.getMessage());
} catch (NoSuchMethodException e) {
e.printStackTrace();
Log.e(TAG, "NoSuchMethodException: " + e.getMessage());
}
Log.i(TAG, "createBond is success? : " + success);
} else {
new connectThread().start();
}
}
private class connectThread extends Thread {
@Override
public void run() {
Configs.isConnected = Configs.myPrinter.openConnection();
Message mes = new Message();
mes.what = 105;
if (Configs.myPrinter != null && Configs.myPrinter.getCurrentStatus() == 0) {
Configs.myPrinter.ringBuzzer(2);
mes.obj = "打印机连接完毕" + Configs.myPrinter.getCurrentStatus();
} else {
mes.obj = "打印机异常:" + Configs.myPrinter.getCurrentStatus();
}
mHandler.sendMessage(mes);
}
}
private BroadcastReceiver boundDeviceReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (!mDevice.equals(device)) {
return;
}
switch (device.getBondState()) {
case BluetoothDevice.BOND_BONDING:
Log.i(TAG, "bounding......");
break;
case BluetoothDevice.BOND_BONDED:
Log.i(TAG, "bound success");
// if bound success, auto init BluetoothPrinter. open
// connect.
unregisterReceiver(boundDeviceReceiver);
dialog.show();
// 配对完成开始连接
if (Configs.myPrinter != null) {
new connectThread().start();
}
break;
case BluetoothDevice.BOND_NONE:
Log.i(TAG, "执行顺序----4");
unregisterReceiver(boundDeviceReceiver);
Log.i(TAG, "bound cancel");
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "配对失败", Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
}
};
// 用于接受连接状态消息的 Handler
private Handler mHandler = new Handler() {
@SuppressLint("ShowToast")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Connect.SUCCESS:
Configs.isConnected = true;
Configs.ISCONNECTED = Configs.isConnected;
Configs.DEVICENAME = devicesName;
if (interfaceType == 0) {
PrefUtils.setString(MainActivity.this, Configs.DEVICEADDRESS, devicesAddress);
bluDisconnectFilter = new IntentFilter();
bluDisconnectFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
MainActivity.this.registerReceiver(myReceiver, bluDisconnectFilter);
hasRegDisconnectReceiver = true;
}
// TOTO 暂时将TSPL指令设置参数的设置放在这
// if (setPrinterTSPL(myPrinter)) {
// if (interfaceType == 0) {
// Toast.makeText(mContext,
// R.string.settingactivitty_toast_bluetooth_set_tspl_successful,
// 0)
// .show();
// } else if (interfaceType == 1) {
// Toast.makeText(mContext,
// R.string.settingactivity_toast_usb_set_tspl_succefful,
// 0).show();
// }
// }
break;
case Connect.FAILED:
Configs.isConnected = false;
Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
XLog.i(TAG, "ZL at MainActivity Handler() 连接失败!");
break;
case Connect.CLOSED:
Configs.isConnected = false;
Configs.ISCONNECTED = Configs.isConnected;
Configs.DEVICENAME = devicesName;
Toast.makeText(MainActivity.this, "连接关闭", Toast.LENGTH_SHORT).show();
XLog.i(TAG, "ZL at MainActivity Handler() 连接关闭!");
break;
case Connect.NODEVICE:
Configs.isConnected = false;
Toast.makeText(MainActivity.this, "没有设备可以连接", Toast.LENGTH_SHORT).show();
break;
case 105:
Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
// updateButtonState(Configs.isConnected);
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
};
public BroadcastReceiver myReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
if (device != null && Configs.myPrinter != null && Configs.isConnected && device.equals(mDevice)) {
Configs.myPrinter.closeConnection();
mHandler.obtainMessage(Connect.CLOSED).sendToTarget();
}
}
}
};
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK)
return;
if (requestCode == CONNECT_DEVICE) {// 连接设备
devicesAddress = data.getExtras().getString(BluetoothDeviceList.EXTRA_DEVICE_ADDRESS);
devicesName = data.getExtras().getString(BluetoothDeviceList.EXTRA_DEVICE_NAME);
connect2BlueToothdevice();
}
if (requestCode == SCANNIN_GREQUEST_CODE) {
// 校验扫描到的mac是否合法
devicesAddress = data.getExtras().getString(BluetoothDeviceList.EXTRA_DEVICE_ADDRESS);
Log.i(TAG, "devicesAddress:" + devicesAddress);
devicesAddress = TextUtil.formatTheString(devicesAddress);
if (BluetoothAdapter.checkBluetoothAddress(devicesAddress)) {
connect2BlueToothdevice();
} else {
Log.e("yxz", devicesAddress);
Toast.makeText(this, "蓝牙mac:" + devicesAddress + "不合法", Toast.LENGTH_SHORT).show();
}
}
if (requestCode == ENABLE_BT) {
if (resultCode == Activity.RESULT_OK) {
if (!mBtAdapter.isEnabled()) {
// 打开蓝牙功能
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, ENABLE_BT);
} else {
switch (connectMains) {
case 0:
// mDevice
devicesAddress = PrefUtils.getString(this, Configs.DEVICEADDRESS, "");
if (devicesAddress == null || devicesAddress.length() <= 0) {
Toast.makeText(MainActivity.this, "您是第一次启动程序,请选择重新搜索连接!", Toast.LENGTH_SHORT).show();
} else {
connect2BlueToothdevice();
}
break;
case 1:
Intent intent = new Intent(this, BluetoothDeviceList.class);
startActivityForResult(intent, CONNECT_DEVICE);
break;
}
}
} else {
Toast.makeText(MainActivity.this, "蓝牙未启用", Toast.LENGTH_SHORT).show();
}
}
}
/**
......
......@@ -5,9 +5,11 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import com.phlx.wool.Configs;
import com.phlx.wool.data.Repository;
import com.phlx.wool.db.DbUtil;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.VillusBuyEntity;
import com.phlx.wool.ui.base.MainBarVM;
import com.phlx.wool.ui.inventory.InventoryActivity;
import com.phlx.wool.ui.sync.activity.ClearActivity;
......@@ -16,6 +18,15 @@ import com.phlx.wool.ui.sync.activity.UploadActivity;
import com.phlx.wool.ui.villus.VillusBuyActivity;
import com.phlx.wool.ui.villus.VillusGaugeActivity;
import com.phlx.wool.ui.work.unit.UnitActivity;
import com.phlx.wool.util.PrintLabel;
import com.printer.sdk.PrinterConstants;
import com.printer.sdk.PrinterConstants.Command;
import com.printer.sdk.PrinterInstance;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import me.goldze.mvvmhabit.binding.command.BindingAction;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
......@@ -24,11 +35,16 @@ import me.goldze.mvvmhabit.utils.SPUtils;
public class MainVM extends MainBarVM<Repository> {
private List<VillusBuyEntity> villusBuyEntities;
private static String unitSp;
public SingleLiveEvent<Boolean> nullEvent = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> drawerEvent = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> bluetoothEvent = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> printEvent = new SingleLiveEvent<>();
public MainVM(@NonNull Application application, Repository repository) {
super(application, repository);
......@@ -101,12 +117,84 @@ public class MainVM extends MainBarVM<Repository> {
}
});
public BindingCommand OnVillusPrintClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
if (Configs.isConnected)
printEvent.call();
else
bluetoothEvent.call();
}
});
public List<String> getVillusBuyList() {
List<String> villusBuyNoList = new ArrayList<>();
villusBuyEntities = new ArrayList<>();
villusBuyEntities = model.getVillusBuy();
if (villusBuyEntities != null && villusBuyEntities.size() > 0) {
for (VillusBuyEntity villusBuyEntity : villusBuyEntities) {
villusBuyNoList.add(villusBuyEntity.getBuyBatch());
}
}
return villusBuyNoList;
}
//写打印内容
public void printVillusBuy(PrinterInstance myPrinter, CharSequence[] text) {
PrintLabel.printVillusBuy(model, myPrinter, villusBuyEntities, text);
// for (CharSequence batchNo : text) {
// VillusBuyEntity vbe = null;
// for (VillusBuyEntity villusBuyEntity : villusBuyEntities) {
// if (villusBuyEntity.getBuyBatch().equals(batchNo)) {
// vbe = villusBuyEntity;
// break;
// }
// }
//
// if (vbe != null) {
//
// DivisionEntity divisionEntity = model.getPertainForCode(vbe.getRevision()).get(0);
// String pertainName = "";
// if (divisionEntity != null ) {
// pertainName = divisionEntity.getName();
// }
// myPrinter.setFont(0, 1, 1, 1, 1);
// myPrinter.setPrinter(Command.ALIGN, Command.ALIGN_CENTER);
// myPrinter.printText("绒毛购买信息\r\n");
// myPrinter.setPrinter(Command.ALIGN, Command.ALIGN_LEFT);
// myPrinter.setLeftMargin(8);
// myPrinter.setFont(0, 0, 0, 0, 1);
//// myPrinter.printText(" " + "\r\n");
// myPrinter.printText("批次:" + vbe.getBuyBatch() + "\r\n");
// myPrinter.printText("苏木:" + pertainName + "\r\n");
// myPrinter.printText("重量:" + vbe.getBuyWeight() + "(千克)\r\n");
// myPrinter.printText("厂家:" + vbe.getBuyFactory() + "\r\n");
//
// myPrinter.printText("日期:" + vbe.getBuyDate() + "\r\n");
// myPrinter.printText("负责人:" + vbe.getPersonInCharge() + "\r\n");
// myPrinter.printText(" " + "\r\n");
// myPrinter.setPrinter(Command.ALIGN, Command.ALIGN_RIGHT);
// myPrinter.setLeftMargin(0);
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// myPrinter.printText(dateFormat.format(new Date()) + "\r\n");
// myPrinter.printText(" " + "\r\n");
// myPrinter.printText(" " + "\r\n");
// myPrinter.printText(" " + "\r\n");
// myPrinter.printText(" " + "\r\n");
// }
// }
}
public BindingCommand OnDownloadClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
startActivity(DownloadActivity.class);
}
});
public BindingCommand OnUploadClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
......@@ -114,17 +202,18 @@ public class MainVM extends MainBarVM<Repository> {
}
});
public BindingCommand OnClearDataClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
startActivity(ClearActivity.class);
}
});
public BindingCommand OnSelectUnitClickCommand = new BindingCommand(new BindingAction() {
@Override
public void call() {
startActivity(UnitActivity.class);
}
});
}
package com.phlx.wool.ui.villus;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.phlx.wool.R;
import com.printer.sdk.utils.XLog;
import java.lang.reflect.Method;
import java.util.Set;
public class BluetoothDeviceList extends Activity {
private static final String TAG = "DeviceListActivity";
public static String EXTRA_DEVICE_ADDRESS = "device_address";
public static String EXTRA_RE_PAIR = "re_pair";
public static String EXTRA_DEVICE_NAME = "device_name";
// Member fields
private BluetoothAdapter mBtAdapter;
private ArrayAdapter<String> mPairedDevicesArrayAdapter;
private ListView pairedListView;
private Button scanButton;
private Button backButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.device_list);
setTitle("请选择设备");
setResult(Activity.RESULT_CANCELED);
initView();
}
private void initView() {
mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_item);
pairedListView = (ListView) findViewById(R.id.paired_devices);
pairedListView.setAdapter(mPairedDevicesArrayAdapter);
pairedListView.setOnItemClickListener(mDeviceClickListener);
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
mPairedDevicesArrayAdapter.add(device.getName() + " ( 已经配对 )" + "\n" + device.getAddress());
}
}
scanButton = (Button) findViewById(R.id.button_scan);
scanButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
doDiscovery();
v.setEnabled(false);
}
});
backButton = (Button) findViewById(R.id.button_bace);
backButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
protected void onStop() {
if (mBtAdapter != null && mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
this.unregisterReceiver(mReceiver);
super.onStop();
}
@Override
protected void onResume() {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(mReceiver, filter);
super.onResume();
}
/**
* Start device discover with the BluetoothAdapter
*/
private void doDiscovery() {
Log.d(TAG, "doDiscovery()");
// Indicate scanning in the title
setProgressBarIndeterminateVisibility(true);
setTitle("内容扫描后");
// If we're already discovering, stop it
// if (mBtAdapter.isDiscovering()) {
// mBtAdapter.cancelDiscovery();
// }
mPairedDevicesArrayAdapter.clear();
// Request discover from BluetoothAdapter
mBtAdapter.startDiscovery();
}
private void returnToPreviousActivity(String address, boolean re_pair, String name) {
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
Intent intent = new Intent();
intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
intent.putExtra(EXTRA_RE_PAIR, re_pair);
intent.putExtra(EXTRA_DEVICE_NAME, name);
setResult(Activity.RESULT_OK, intent);
finish();
}
private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);
String name = info.substring(0, info.length() - 17);
returnToPreviousActivity(address, false, name);
}
};
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
}
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String itemName = device.getName() + " ( "
+ (device.getBondState() == BluetoothDevice.BOND_BONDED ? "已经配对" : "没有配对")
+ " )" + "\n" + device.getAddress();
mPairedDevicesArrayAdapter.remove(itemName);
mPairedDevicesArrayAdapter.add(itemName);
pairedListView.setEnabled(true);
}
if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
setProgressBarIndeterminateVisibility(false);
setTitle("请选择要连接的设备");
if (mPairedDevicesArrayAdapter.getCount() == 0) {
String noDevices = "未找到";
mPairedDevicesArrayAdapter.add(noDevices);
pairedListView.setEnabled(false);
}
scanButton.setEnabled(true);
}
if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
switch (device.getBondState()) {
case BluetoothDevice.BOND_BONDING:
XLog.d(TAG, "----------bounding......,mac" + device.getAddress() + "----------");
break;
case BluetoothDevice.BOND_BONDED:
XLog.d(TAG, "----------bound success, mac:" + device.getAddress() + "----------");
break;
case BluetoothDevice.BOND_NONE:
XLog.e(TAG, "----------bound cancel, mac:" + device.getAddress() + "----------");
Toast.makeText(BluetoothDeviceList.this, "设备:" + device.getAddress() + "已解除配对", Toast.LENGTH_SHORT).show();
;
break;
default:
break;
}
}
}
};
//与设备解除配对
static public boolean removeBond(Class btClass, BluetoothDevice btDevice) throws Exception {
Method removeBondMethod = btClass.getMethod("removeBond");
Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
return returnValue.booleanValue();
}
}
package com.phlx.wool.ui.villus;
import android.app.Dialog;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
......@@ -9,17 +12,25 @@ import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.SpinnerAdapter;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProviders;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bigkoo.pickerview.builder.TimePickerBuilder;
import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;
import com.bigkoo.pickerview.listener.OnTimeSelectListener;
import com.bigkoo.pickerview.view.TimePickerView;
import com.phlx.wool.Configs;
import com.phlx.wool.R;
import com.phlx.wool.data.VMFactory;
import com.phlx.wool.databinding.ActivityVillusBuyBinding;
import com.phlx.wool.ui.base.BaseActivity;
import com.phlx.wool.ui.main.MainActivity;
import com.phlx.wool.ui.villus.vm.VillusBuyVM;
import com.printer.sdk.utils.PrefUtils;
import java.util.Date;
......@@ -66,10 +77,41 @@ public class VillusBuyActivity extends BaseActivity<ActivityVillusBuyBinding, Vi
pvTime.show(binding.birthDayTv);
});
viewModel.changeDivision.observe(this, aBoolean -> {
SpinnerAdapter spa = binding.divisionSp.getAdapter();
if (spa != null)
spa.notify();
//弹出绒毛购买打印选择
viewModel.printEvent.observe(this, aBoolean -> {
new MaterialDialog.Builder(this).title("系统信息").content("是否打印")
.cancelable(false).canceledOnTouchOutside(false)
.positiveText("确定").onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (which == DialogAction.POSITIVE) {
dialog.dismiss();
viewModel.printVillusBuy();
}
}
}).negativeText("取消").onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (which == DialogAction.NEGATIVE) {
dialog.dismiss();
viewModel.backMain();
}
}
}).show();
});
viewModel.warningEvent.observe(this, aBoolean -> {
new MaterialDialog.Builder(this).title("系统信息").content("请在首页连接蓝牙后再上传")
.cancelable(false).canceledOnTouchOutside(false)
.positiveText("确定").onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (which == DialogAction.POSITIVE) {
dialog.dismiss();
viewModel.backMain();
}
}
}).show();
});
}
......
......@@ -19,10 +19,10 @@ import com.phlx.wool.R;
import com.phlx.wool.data.VMFactory;
import com.phlx.wool.databinding.ActivityVillusGaugeBinding;
import com.phlx.wool.ui.base.BaseActivity;
import com.phlx.wool.ui.villus.vm.VillusGaugeVM;
import java.util.Date;
import me.goldze.mvvmhabit.base.BaseViewModel;
import me.tatarka.bindingcollectionadapter2.BR;
public class VillusGaugeActivity extends BaseActivity<ActivityVillusGaugeBinding, VillusGaugeVM> {
......
package com.phlx.wool.ui.villus;
package com.phlx.wool.ui.villus.vm;
import android.app.Application;
import android.util.Log;
......@@ -20,7 +20,9 @@ import com.phlx.wool.event.EventTag;
import com.phlx.wool.params.CattleResponse;
import com.phlx.wool.params.UploadParams;
import com.phlx.wool.ui.base.BackBarVM;
import com.phlx.wool.util.PrintLabel;
import com.phlx.wool.widget.ItemData;
import com.printer.sdk.PrinterInstance;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
......@@ -55,6 +57,8 @@ public class VillusBuyVM extends BackBarVM<Repository> {
public SingleLiveEvent<Boolean> buyDay = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> changeDivision = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> printEvent = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> warningEvent = new SingleLiveEvent<>();
private SimpleDateFormat dateFormat;
private Disposable inventoryBus;
......@@ -209,10 +213,10 @@ public class VillusBuyVM extends BackBarVM<Repository> {
public void onNotification(boolean result) {
if (result) {
dismissDialog();
backMain();
printEvent.call();
}
}
}).deleteAsyncBatch(VillusBuyEntity.class, uploadData);
}).insertAsyncBatch(VillusBuyEntity.class, uploadData);
} else {
dismissDialog();
ToastUtils.showShort("上传失败");
......@@ -224,7 +228,24 @@ public class VillusBuyVM extends BackBarVM<Repository> {
);
}
private void backMain() {
//写打印内容
public void printVillusBuy() {
if (!Configs.isConnected) {
warningEvent.call();
return;
}
List<VillusBuyEntity> villusBuyEntities = model.getVillusBuy();
if (Configs.myPrinter != null && villusBuyEntities != null) {
CharSequence[] text = new CharSequence[1];
text[0] = entity.getBuyBatch();
PrintLabel.printVillusBuy(model, Configs.myPrinter, villusBuyEntities, text);
backMain();
}
}
public void backMain() {
finish();
}
......
package com.phlx.wool.ui.villus;
package com.phlx.wool.ui.villus.vm;
import android.app.Application;
import android.view.View;
......
package com.phlx.wool.util;
import com.phlx.wool.Configs;
import com.phlx.wool.data.Repository;
import com.phlx.wool.db.DbUtil;
import com.phlx.wool.entity.DivisionEntity;
import com.phlx.wool.entity.VillusBuyEntity;
import com.printer.sdk.PrinterInstance;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import com.printer.sdk.PrinterConstants.Command;
public class PrintLabel {
//写绒毛购买打印内容
public static void printVillusBuy(Repository model, PrinterInstance myPrinter, List<VillusBuyEntity> villusBuyEntities, CharSequence[] text) {
if (text == null || text.length == 0) {
return;
}
for (CharSequence batchNo : text) {
VillusBuyEntity vbe = null;
for (VillusBuyEntity villusBuyEntity : villusBuyEntities) {
if (villusBuyEntity.getBuyBatch().equals(batchNo)) {
vbe = villusBuyEntity;
break;
}
}
if (vbe != null) {
DivisionEntity divisionEntity = model.getPertainForCode(vbe.getRevision()).get(0);
String pertainName = "";
if (divisionEntity != null) {
pertainName = divisionEntity.getName();
}
myPrinter.setFont(0, 1, 1, 1, 1);
myPrinter.setPrinter(Command.ALIGN, Command.ALIGN_CENTER);
myPrinter.printText("绒毛购买信息\r\n");
myPrinter.setPrinter(Command.ALIGN, Command.ALIGN_LEFT);
myPrinter.setLeftMargin(8);
myPrinter.setFont(0, 0, 0, 0, 1);
// myPrinter.printText(" " + "\r\n");
myPrinter.printText("批次:" + vbe.getBuyBatch() + "\r\n");
myPrinter.printText("苏木:" + pertainName + "\r\n");
myPrinter.printText("重量:" + vbe.getBuyWeight() + "(千克)\r\n");
myPrinter.printText("厂家:" + vbe.getBuyFactory() + "\r\n");
myPrinter.printText("日期:" + vbe.getBuyDate() + "\r\n");
myPrinter.printText("负责人:" + vbe.getPersonInCharge() + "\r\n");
myPrinter.printText(" " + "\r\n");
myPrinter.setPrinter(Command.ALIGN, Command.ALIGN_RIGHT);
myPrinter.setLeftMargin(0);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
myPrinter.printText(dateFormat.format(new Date()) + "\r\n");
myPrinter.printText(" " + "\r\n");
myPrinter.printText(" " + "\r\n");
myPrinter.printText(" " + "\r\n");
myPrinter.printText(" " + "\r\n");
myPrinter.ringBuzzer(1);
}
}
}
}
......@@ -79,4 +79,22 @@ public class TextUtil {
return name;
}
/**
* 将一个字符串中的所有字母均转换为大写
*
* @param devicesAddress
* @return
*/
public static String formatTheString(String devicesAddress) {
StringBuffer newDevicesAddress = new StringBuffer("");
for (int i = 0; i < devicesAddress.length(); i++) {
char chars = devicesAddress.charAt(i);
String childString = "" + chars;
childString = childString.toUpperCase();
newDevicesAddress.append(childString);
}
return newDevicesAddress.toString().substring(0, 17);
// return newDevicesAddress.toString();
}
}
......@@ -96,20 +96,6 @@
binding:layout_constraintStart_toStartOf="@+id/basic_info_desc"
binding:layout_constraintTop_toBottomOf="@+id/basic_info_desc" />
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/villus_gauge_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_20"
android:text="绒毛测量"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size"
android:checked="@{viewModel.isDownloadVillusGauge}"
binding:onCheckedChangedCommand="@{viewModel.onDownloadVillusGaugeCommand}"
binding:layout_constraintStart_toStartOf="@+id/veterinary_info_desc"
binding:layout_constraintTop_toBottomOf="@+id/veterinary_info_desc" />
<View
android:id="@+id/clear_line"
android:layout_width="match_parent"
......
......@@ -183,6 +183,20 @@
binding:layout_constraintTop_toBottomOf="@+id/marking_btn"
binding:onClickCommand="@{viewModel.OnVillusGaugeClickCommand}" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/villus_print_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_10"
android:drawableTop="@mipmap/ic_harmless"
android:drawablePadding="@dimen/dp_10"
android:text="@string/villus_print"
android:textSize="@dimen/main_btn_size"
binding:layout_constraintStart_toEndOf="@+id/villus_gauge_btn"
binding:layout_constraintTop_toBottomOf="@+id/marking_btn"
binding:onClickCommand="@{viewModel.OnVillusPrintClickCommand}" />
<View
android:id="@+id/sync_tip_line"
......
......@@ -5,7 +5,7 @@
<variable
name="viewModel"
type="com.phlx.wool.ui.villus.VillusBuyVM" />
type="com.phlx.wool.ui.villus.vm.VillusBuyVM" />
</data>
......
......@@ -5,7 +5,7 @@
<variable
name="viewModel"
type="com.phlx.wool.ui.villus.VillusGaugeVM" />
type="com.phlx.wool.ui.villus.vm.VillusGaugeVM" />
</data>
......
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2009 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:padding="1dp"
android:textColor="#ffffff"
android:textSize="25sp" />
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/test"
android:orientation="vertical" >
<ListView
android:id="@+id/paired_devices"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/button_scan"
android:layout_alignParentTop="true" />
<Button
android:id="@+id/button_scan"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/button_bace"
android:layout_margin="10dp"
android:text="搜索蓝牙" />
<Button
android:id="@+id/button_bace"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="@string/back" />
</RelativeLayout>
\ No newline at end of file
......@@ -11,9 +11,10 @@
<string name="exit">退出</string>
<string name="marking">打标记录</string>
<string name="quarantine">检疫记录</string>
<string name="harmless">无害化处理</string>
<string name="harmless"> 无害化处理 </string>
<string name="villus_buy">绒毛收购</string>
<string name="villus_gauge">绒毛测量</string>
<string name="villus_print">绒毛收购打印</string>
<string name="download">下载数据</string>
<string name="upload">上传数据</string>
<string name="re_login">重新登录</string>
......
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