Commit db96dcd7 authored by hywang's avatar hywang

1.增加麒联上电;

2.增加自动判断上电模块;
3.增加标签绑定、标签换绑功能;
4,增加基础信息新增功能。
parent b8c195a0
......@@ -45,6 +45,8 @@ android {
abortOnError false
}
ndkVersion '22.1.7171670'
}
greendao {
......@@ -57,7 +59,6 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation files('libs\\uhf.jar')
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
......@@ -80,7 +81,6 @@ dependencies {
implementation project(':appupdateX')
implementation project(':mycontrol')
implementation files('libs/uhf.jar')
//生成主键
implementation 'cn.hutool:hutool-all:4.5.6'
//图片加载
......
No preview for this file type
......@@ -94,6 +94,16 @@
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.bind.BindActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.labelchange.LabelChangeActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustResize" />
<service
......
......@@ -90,6 +90,11 @@ public class Configs {
//盘点类型
public static final String SP_INVENTORY_STATUS = "SP_inventory_status";
//上电类型
public static final String SP_POWER_ON_TYPE = "sp_power_on_type";
//模块类型
public static final String SP_MODULE_TYPE = "sp_module_type";
//0 高频,1低频
public static String FREQUENCY_CONFIG = "1";
......
......@@ -8,6 +8,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.phlx.anchorcollect.ui.bind.BindVM;
import com.phlx.anchorcollect.ui.fragment.vm.BasicsCollectVM;
import com.phlx.anchorcollect.ui.fragment.vm.BreedingRecordVM;
import com.phlx.anchorcollect.ui.fragment.vm.ImmunRecordVM;
......@@ -16,6 +17,7 @@ import com.phlx.anchorcollect.ui.fragment.vm.PerformanceVM;
import com.phlx.anchorcollect.ui.fragment.vm.WeightManVM;
import com.phlx.anchorcollect.ui.home.HomeVM;
import com.phlx.anchorcollect.ui.info.CattleVM;
import com.phlx.anchorcollect.ui.labelchange.LabelChangeVM;
import com.phlx.anchorcollect.ui.login.LoginVM;
import com.phlx.anchorcollect.ui.main.MainVM;
import com.phlx.anchorcollect.ui.setting.SettingVM;
......@@ -102,6 +104,12 @@ public class VMFactory extends ViewModelProvider.NewInstanceFactory {
} else if (modelClass.isAssignableFrom(SettingVM.class)) {
return (T) new SettingVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(BindVM.class)) {
return (T) new BindVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(LabelChangeVM.class)) {
return (T) new LabelChangeVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(SyncVM.class)) {
return (T) new SyncVM(mApplication, repository);
}
......
......@@ -18,7 +18,6 @@ import org.greenrobot.greendao.annotation.Generated;
*/
@Entity
public class CattleResumeEntity extends BaseObservable implements Parcelable {
private static final long serialVersionUID = 1L;
/** unid主键 */
@Id(autoincrement = false)
......@@ -654,4 +653,43 @@ public class CattleResumeEntity extends BaseObservable implements Parcelable {
", remark='" + remark + '\'' +
'}';
}
public void copyEntity(CattleResumeEntity cre) {
this.unid= cre.getUnid();
this.registrationNo= cre.getRegistrationNo();
this.individualNo= cre.getIndividualNo();
this.circleNo= cre.getCircleNo();
this.raiseType= cre.getRaiseType();
this.raiseVarieties= cre.getRaiseVarieties();
this.birthdate= cre.getBirthdate();
this.birthHeavy= cre.getBirthHeavy();
this.sex= cre.getSex();
this.birthDifficulty= cre.getBirthDifficulty();
this.isTwins= cre.getIsTwins();
this.childTime= cre.getChildTime();
this.grade= cre.getGrade();
this.fatherReg= cre.getFatherReg();
this.motherReg= cre.getMotherReg();
this.fromMilkHeavy= cre.getFromMilkHeavy();
this.health= cre.getHealth();
this.junHeavy= cre.getJunHeavy();
this.decAppScore= cre.getDecAppScore();
this.photo= cre.getPhoto();
this.photoPath= cre.getPhotoPath();
this.status= cre.getStatus();
this.isOut= cre.getIsOut();
this.age= cre.getAge();
this.colour= cre.getColour();
this.inputTime= cre.getInputTime();
this.deptId= cre.getDeptId();
this.uploadStatus= cre.getUploadStatus();
this.uploadTime= cre.getUploadTime();
this.createBy= cre.getCreateBy();
this.createTime= cre.getCreateTime();
this.updateBy= cre.getUpdateBy();
this.updateTime= cre.getUpdateTime();
this.remark= cre.getRemark();
}
}
......@@ -50,15 +50,16 @@ public class RetrofitClient {
private static final int CACHE_TIMEOUT = 10 * 1024 * 1024;
//服务端根路径
public static String baseUrl =
"serve.xlglmnmyzspt.org.cn"//正式
// "serve.xlglmnmyzspt.org.cn"//正式old
// "serve.xlglzy.org.cn"//正式
// "39.101.170.186"//阿里云测试
// "192.168.1.80"//董
"192.168.8.135"//董
// "192.168.43.154"//张敏
;
public static String port =
""//正式
// ""//正式
// "9000"//阿里云测试
// "9000"//董
"9000"//董
;
private static Context mContext = Utils.getContext();
......
......@@ -14,109 +14,93 @@ import java.io.IOException;
*/
class DeviceControl {
void PowerOnDevice() {
switch (Configs.cpuName) {
case "MT6735":
try {
//手持机 RM_7088_MT2
WriteFile("/sys/class/misc/mtgpio/pin", "-wdout94 1");
Thread.sleep(300);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
private void WriteFile(String path, String value) throws IOException {
File DeviceName = new File(path);
if (DeviceName.exists()) {
BufferedWriter CtrlFile = new BufferedWriter(new FileWriter(DeviceName, false));
CtrlFile.write(value);
CtrlFile.flush();
CtrlFile.close();
}
break;
case "MT6762V/CB":
try {
//pad RM_WIOT61c_S1
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 24 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 24 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 24 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 55 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 55 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 55 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 173 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 173 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 173 1");
SystemClock.sleep(500);
} catch (IOException e) {
e.printStackTrace();
}
break;
case "MT6763V/B":
void PowerOn_pad_RM_SD100T_MT1( ) {
try {
//pad RM_SD100T_MT1
WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "mode75 0");
WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out75 1");
WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out55 1");
Thread.sleep(300);
Thread.sleep(3000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
break;
}
//RM_SD100T_MT1
// WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out55 1");
}
void PowerOffDevice() {
switch (Configs.cpuName) {
case "MT6735":
void PowerOff_pad_RM_SD100T_MT1() {
try {
//手持机 RM_7088_MT2
WriteFile("/sys/class/misc/mtgpio/pin", "-wdout94 0");
//pad RM_SD100T_MT1
WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out75 0");
WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out55 0");
} catch (IOException e) {
e.printStackTrace();
}
break;
}
case "MT6762V/CB":
void PowerOn_pad_RM_SD1006762_S0( ) {
try {
//RM_WIOT61c_S1
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 24 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 55 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 173 0");
} catch (IOException e) {
//pad RM_SD1006762_S0
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 52 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 52 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 52 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 89 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 89 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 89 1");
Thread.sleep( 3000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
break;
}
case "MT6763V/B":
void PowerOff_pad_RM_SD1006762_S0() {
try {
//pad RM_SD100T_MT1
WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out75 0");
WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out55 0");
//pad RM_SD1006762_S0
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 52 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 89 0");
} catch (IOException e) {
e.printStackTrace();
}
break;
}
void PowerOn_pad_RM_SD1006762_S1( ) {
try {
//pad RM_SD1006762_S1
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 24 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 24 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 24 1");
//RM_SD100T_MT1
// WriteFile("/sys/bus/platform/drivers/mediatek-pinctrl/10005000.pinctrl/mt_gpio", "out55 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 55 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 55 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 55 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 173 1");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "mode 173 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "dir 173 1");
Thread.sleep( 3000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
private void WriteFile(String path, String value) throws IOException {
File DeviceName = new File(path);
if (DeviceName.exists()) {
BufferedWriter CtrlFile = new BufferedWriter(new FileWriter(DeviceName, false));
CtrlFile.write(value);
CtrlFile.flush();
CtrlFile.close();
void PowerOff_pad_RM_SD1006762_S1() {
try {
//pad RM_SD1006762_S1
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 24 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 55 0");
WriteFile("/sys/devices/platform/pinctrl/mt_gpio", "out 173 0");
} catch (IOException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package com.phlx.anchorcollect.rfid;
import android.util.Log;
import com.phlx.anchorcollect.App;
import com.phlx.anchorcollect.Configs;
import com.uhf.structures.Rfid_Value;
import java.util.ArrayList;
import java.util.List;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.StringUtils;
public class ModuleManager {
private static String serialPort = "/dev/ttyMT1";
public static int openCom() {
final static String RM_SD100T_MT1 = "RM_SD100T_MT1";
final static String RM_SD1006762_S0 = "RM_SD1006762_S0";
final static String RM_SD1006762_S1 = "RM_SD1006762_S1";
switch (Configs.cpuName) {
final static List<String> powerList = new ArrayList<String>() {
{
add(RM_SD100T_MT1);
add(RM_SD1006762_S0);
add(RM_SD1006762_S1);
}
//手持机 RM_7088_MT2
case "MT6735":
serialPort = "/dev/ttyMT2";
break;
};
//pad RM_WIOT61c_S1
case "MT6762V/CB":
serialPort = "/dev/ttyS1";
break;
public static boolean initPower() {
String powerOnType = SPUtils.getInstance().getString(Configs.SP_POWER_ON_TYPE, "");
// powerOnType = RM_SD100T_MT1;
if (!StringUtils.isEmpty(powerOnType)) {
return powerOn(powerOnType);
} else {//没存类型就便利所有上电
for (int i = 0; i < powerList.size(); i++) {
if (powerOn(powerList.get(i))) {
SPUtils.getInstance().put(Configs.SP_POWER_ON_TYPE, powerList.get(i));
return true;
}
}
}
return false;
}
//上电
public static boolean powerOn(String powerOnType) {
//pad RM_SD100T_MT1
case "MT6763V/B":
serialPort = "/dev/ttyMT1";
String portStr = powerOnType.substring(powerOnType.lastIndexOf("_") + 1, powerOnType.length());
serialPort = "/dev/tty" + portStr;
boolean powerOnStatus = false;
if (App.getInstance().getLinkage().open_serial(serialPort) == 0) {
DeviceControl DevCtrl = new DeviceControl();
switch (powerOnType) {
case RM_SD100T_MT1:
DevCtrl.PowerOn_pad_RM_SD100T_MT1();
break;
case RM_SD1006762_S0:
DevCtrl.PowerOn_pad_RM_SD1006762_S0();
break;
case RM_SD1006762_S1:
DevCtrl.PowerOn_pad_RM_SD1006762_S1();
break;
}
powerOnStatus = openCom(powerOnType);
}
return powerOnStatus;
}
//设置模块类型
public static boolean openCom(String powerOnType) {
boolean openComStatus = false;
Rfid_Value rf = new Rfid_Value();
int moduleType = SPUtils.getInstance().getInt(Configs.SP_MODULE_TYPE, -1);
if (moduleType == -1) {//没有存就便利所有
rf = new Rfid_Value();
App.getInstance().getLinkage().setRFModuleType(1);//R2000 0,MagicRF 1,RM70xx 2, R2000plus 3
App.getInstance().getLinkage().getVersion(rf);
if (rf.value == 0) {
SPUtils.getInstance().put(Configs.SP_MODULE_TYPE, 1);
SPUtils.getInstance().put(Configs.SP_POWER_ON_TYPE, powerOnType);
return true;
}
App.getInstance().getLinkage().setRFModuleType(0);//R2000 0,MagicRF 1,RM70xx 2, R2000plus 3
App.getInstance().getLinkage().getVersion(rf);
if (rf.value == 0) {
SPUtils.getInstance().put(Configs.SP_MODULE_TYPE, 0);
SPUtils.getInstance().put(Configs.SP_POWER_ON_TYPE, powerOnType);
return true;
}
rf = new Rfid_Value();
App.getInstance().getLinkage().setRFModuleType(3);//R2000 0,MagicRF 1,RM70xx 2, R2000plus 3
App.getInstance().getLinkage().getVersion(rf);
if (rf.value == 0) {
SPUtils.getInstance().put(Configs.SP_MODULE_TYPE, 3);
SPUtils.getInstance().put(Configs.SP_POWER_ON_TYPE, powerOnType);
return true;
}
return App.getInstance().getLinkage().open_serial(serialPort);
} else {
App.getInstance().getLinkage().setRFModuleType(moduleType);//R2000 0,MagicRF 1,RM70xx 2, R2000plus 3
App.getInstance().getLinkage().getVersion(rf);
openComStatus = rf.value == 0;
}
return openComStatus;
}
public static void destroyLibSO() {
App.getInstance().getLinkage().deinitRFID();
......@@ -39,19 +121,31 @@ public class ModuleManager {
powerOff();
}
public static int powerOn() {
DeviceControl DevCtrl = new DeviceControl();
DevCtrl.PowerOnDevice();
Rfid_Value rf = new Rfid_Value();
App.getInstance().getLinkage().getVersion(rf);
return rf.value;
}
public static void powerOff() {
String powerOnType = SPUtils.getInstance().getString(Configs.SP_POWER_ON_TYPE, "");
DeviceControl DevCtrl = new DeviceControl();
DevCtrl.PowerOffDevice();
}
switch (powerOnType) {
case RM_SD100T_MT1:
DevCtrl.PowerOff_pad_RM_SD100T_MT1();
break;
case RM_SD1006762_S0:
DevCtrl.PowerOff_pad_RM_SD1006762_S0();
break;
case RM_SD1006762_S1:
DevCtrl.PowerOff_pad_RM_SD1006762_S1();
break;
default://如果没有存类型,就关闭所有类型
DevCtrl.PowerOff_pad_RM_SD100T_MT1();
DevCtrl.PowerOff_pad_RM_SD1006762_S0();
DevCtrl.PowerOff_pad_RM_SD1006762_S1();
break;
}
}
}
package com.phlx.anchorcollect.ui.bind;
import android.os.Bundle;
import androidx.lifecycle.ViewModelProviders;
import com.phlx.anchorcollect.R;
import com.phlx.anchorcollect.data.VMFactory;
import com.phlx.anchorcollect.databinding.ActivityBindBinding;
import com.phlx.anchorcollect.ui.base.BaseActivity;
import me.tatarka.bindingcollectionadapter2.BR;
public class BindActivity extends BaseActivity<ActivityBindBinding, BindVM> {
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_bind;
}
@Override
public int initVariableId() {
return BR.viewModel;
}
@Override
public void initParam() {
super.initParam();
}
@Override
public BindVM initViewModel() {
VMFactory factory = VMFactory.getInstance(getApplication());
return ViewModelProviders.of(this, factory).get(BindVM.class);
}
@Override
public void initData() {
super.initData();
viewModel.initToolbar();
}
@Override
public void initViewObservable() {
super.initViewObservable();
}
}
package com.phlx.anchorcollect.ui.bind;
import android.annotation.SuppressLint;
import android.app.Application;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Handler;
import android.os.Message;
import android.util.SparseIntArray;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableField;
import com.phlx.anchorcollect.App;
import com.phlx.anchorcollect.Configs;
import com.phlx.anchorcollect.R;
import com.phlx.anchorcollect.data.Repository;
import com.phlx.anchorcollect.db.DbUtil;
import com.phlx.anchorcollect.db.gen.CattleResumeEntityDao;
import com.phlx.anchorcollect.db.interf.DbQueryCallBack;
import com.phlx.anchorcollect.entity.CattleResumeEntity;
import com.phlx.anchorcollect.ui.base.BackBarVM;
import com.phlx.anchorcollect.util.TextUtil;
import com.phlx.anchorcollect.widget.ItemData;
import com.uhf.structures.InventoryData;
import com.uhf.structures.OnInventoryListener;
import org.greenrobot.greendao.query.QueryBuilder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import cn.wandersnail.commons.util.ToastUtils;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
import me.goldze.mvvmhabit.binding.command.BindingConsumer;
import me.goldze.mvvmhabit.binding.viewadapter.spinner.IKeyAndValue;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.StringUtils;
public class BindVM extends BackBarVM<Repository> implements OnInventoryListener {
public ObservableArrayList<IKeyAndValue> tagItemData;
private List<CattleResumeEntity> cattleResumeEntityList;
public ObservableField<String> individualNo = new ObservableField<>("");
public ObservableField<String> registrationNo = new ObservableField<>("");
private SoundPool soundPool;//盘点到标签时的提示音
private SparseIntArray musicId;
private boolean isScan = false;//是否在扫描
private String tag = "";//扫描到的标记
private CattleResumeEntity entity;
private SimpleDateFormat dateFormat;
public BindVM(@NonNull Application application, Repository model) {
super(application, model);
soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 5);
musicId = new SparseIntArray();
musicId.put(1, soundPool.load(getApplication(), R.raw.readcard, 1));
musicId.put(2, soundPool.load(getApplication(), R.raw.failure, 1));
}
@Override
public void onResume() {
super.onResume();
isScan = false;
tag = "";
App.getInstance().getLinkage().setOnInventoryListener(this);
}
//初始化ToolBar
public void initToolbar() {
setBackTitleText("绑定耳标");
setSettingVisibleObservable(View.GONE);
setBackRightTextVisible(View.VISIBLE);
setBackRightText(getApplication().getResources().getString(R.string.save));
initData();
}
private void initData() {
tagItemData = new ObservableArrayList<>();
cattleResumeEntityList = new ArrayList<>();
queryTag();
}
private void queryTag() {
tagItemData.clear();
cattleResumeEntityList.clear();
QueryBuilder<CattleResumeEntity> builder0 =
DbUtil.getInstance().getQueryBuilder(CattleResumeEntity.class)
.where(CattleResumeEntityDao.Properties.RegistrationNo.eq(""));
DbUtil.getInstance().setDbQueryCallBack(new DbQueryCallBack<CattleResumeEntity>() {
@Override
public void onSuccess(List<CattleResumeEntity> result) {
if (result != null && result.size() > 0) {
cattleResumeEntityList.addAll(result);
for (CattleResumeEntity cattleResumeEntity : result) {
tagItemData.add(new ItemData(cattleResumeEntity.getIndividualNo(), cattleResumeEntity.getIndividualNo()));
}
}
}
@Override
public void onFailed() {
ToastUtils.showShort("查询基础数据数量失败!");
dismissDialog();
}
}).queryAsyncAll(CattleResumeEntity.class, builder0);
}
public BindingCommand<IKeyAndValue> onTagSelectorCommand = new BindingCommand<>(new BindingConsumer<IKeyAndValue>() {
@Override
public void call(IKeyAndValue iKeyAndValue) {
individualNo.set(iKeyAndValue.getValue());
}
});
public BindingCommand onRegistrationNoClick = new BindingCommand(() -> startInventory());
@Override
protected void backRightTextOnClick() {
super.backRightTextOnClick();
if (StringUtils.isEmpty(individualNo.get())) {
ToastUtils.showShort("请选择可视耳标");
return;
}
if (StringUtils.isEmpty(registrationNo.get())) {
ToastUtils.showShort("请扫描标签");
return;
}
//判断是否已经绑定过高频耳标
QueryBuilder<CattleResumeEntity> builder0 =
DbUtil.getInstance().getQueryBuilder(CattleResumeEntity.class)
.where(CattleResumeEntityDao.Properties.RegistrationNo.eq(registrationNo.get()));
DbUtil.getInstance().setDbQueryCallBack(new DbQueryCallBack<CattleResumeEntity>() {
@Override
public void onSuccess(List<CattleResumeEntity> result) {
if (result != null && result.size() > 0) {
ToastUtils.showShort("该耳标已被绑定,请重新扫描!");
return;
} else {
bindRfid();
}
}
@Override
public void onFailed() {
ToastUtils.showShort("查询基础数据数量失败!");
dismissDialog();
}
}).queryAsyncAll(CattleResumeEntity.class, builder0);
}
private void bindRfid() {
for (CattleResumeEntity cattleResumeEntity : cattleResumeEntityList) {
if (cattleResumeEntity.getIndividualNo().equals(individualNo.get())) {
entity = cattleResumeEntity;
entity.setRegistrationNo(registrationNo.get());
entity.setUploadStatus("0");
cattleResumeEntity.setUpdateBy(SPUtils.getInstance().getString(Configs.SP_LOGIN_NAME));
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
cattleResumeEntity.setUpdateTime(dateFormat.format(new Date()));
break;
}
}
if (entity != null) {
long saveStatus = DbUtil.getInstance().insertOrReplace(entity);
if (saveStatus != -1) {
ToastUtils.showShort("耳标绑定成功!");
entity = null;
individualNo.set("");
registrationNo.set("");
queryTag();
} else {
ToastUtils.showShort("耳标绑定失败!");
}
}
}
//开始盘点一次
public void startInventory() {
if (!isScan) {
App.getInstance().getLinkage().startInventory(1, 0);
tag = "";
registrationNo.set("");
isScan = true;
} else {
App.getInstance().getLinkage().stopInventory();
isScan = false;
}
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x333) {
InventoryData inventoryData = (InventoryData) msg.obj;
if (inventoryData.getDataLength() > 0 && inventoryData.getEpcLength() > 0) {
String epc = TextUtil.byteToHexString(inventoryData.getEPC_Data(), inventoryData.getEpcLength()).substring(1);
String tid = TextUtil.byteToHexString(inventoryData.getData(), inventoryData.getDataLength());
soundPool.play(musicId.get(1), 1, 1, 0, 0, 1);
App.getInstance().getLinkage().stopInventory();
if ("".equals(tag))
checkEpc(epc, tid);
}
}
}
};
private void checkEpc(String epc, String tid) {
tag = epc + tid;
registrationNo.set(epc);
isScan = false;
}
@Override
public void getInventoryData(InventoryData inventoryData) {
if (inventoryData != null) {
Message messenger = handler.obtainMessage();
messenger.what = 0x333;
messenger.obj = inventoryData;
handler.sendMessage(messenger);
}
}
}
......@@ -2,6 +2,7 @@ package com.phlx.anchorcollect.ui.fragment;
import android.Manifest;
import android.app.Dialog;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
......@@ -45,6 +46,7 @@ import com.phlx.anchorcollect.entity.GenTableColumn;
import com.phlx.anchorcollect.event.EventTag;
import com.phlx.anchorcollect.ui.fragment.vm.BasicsCollectVM;
import com.phlx.anchorcollect.ui.info.CattleActivity;
import com.phlx.anchorcollect.util.BaseImageUtils;
import com.phlx.anchorcollect.util.DictUtils;
import com.phlx.anchorcollect.util.ImagePicker;
import com.phlx.anchorcollect.widget.SpaceItemDecoration;
......@@ -57,6 +59,7 @@ import java.util.List;
import io.reactivex.functions.Consumer;
import me.goldze.mvvmhabit.base.BaseFragment;
import me.goldze.mvvmhabit.utils.StringUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
......@@ -68,6 +71,8 @@ public class BasicsCollectFragment extends BaseFragment<FragmentBasicsCollectBin
private MaterialDialog showEpcDialog;
public MaterialDialog scanRfidDialog, scanChangeLabelDialog;
private static class SingletonClassInstance {
private static final BasicsCollectFragment instance = new BasicsCollectFragment();
}
......@@ -124,6 +129,7 @@ public class BasicsCollectFragment extends BaseFragment<FragmentBasicsCollectBin
if (!hidden) {
viewModel.addInventoryListener();
initImagePicker();
viewModel.initDataForUnid(Configs.tempUnid);
Configs.currentEvent = EventTag.EVENT_WEIGHT_DATA_BASICS;
} else {
......@@ -232,7 +238,7 @@ public class BasicsCollectFragment extends BaseFragment<FragmentBasicsCollectBin
}
}
Glide.with(getContext())
.load(viewModel.imgUrl)
.load(viewModel.getMarkImgUrl())
.apply(
new RequestOptions()
.skipMemoryCache(true)
......@@ -285,6 +291,67 @@ public class BasicsCollectFragment extends BaseFragment<FragmentBasicsCollectBin
.show();
}
});
viewModel.onChangeLabelEvent.observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(String s) {
scanChangeLabelDialog = new MaterialDialog.Builder(getActivity())
.title("请扫描或输入原耳标")
// .iconRes(R.drawable.ic_logo)
.canceledOnTouchOutside(false)
.autoDismiss(false)
// .content("高频耳标")
// .widgetColor(Color.BLUE)//输入框光标的颜色
//前2个一个是hint一个是预输入的文字
.input("可视耳标", "", new MaterialDialog.InputCallback() {
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
Log.i("scan", "输入的是:" + input);
}
})
.neutralText("扫描")
.onNeutral(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
viewModel.scanFunction = 2;
viewModel.scanRfid();
}
})
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
// dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
String registrationNo = dialog.getContentView().getText().toString();
String individualNo = dialog.getInputEditText().getText().toString();
if (StringUtils.isEmpty(registrationNo) && StringUtils.isEmpty(individualNo)) {
ToastUtils.showShort("请扫描或者输入耳标!");
return;
}
if (!StringUtils.isEmpty(registrationNo) && registrationNo.length() > 50) {
ToastUtils.showShort("高频耳标长度非法,请重新扫描!");
return;
}
if (!StringUtils.isEmpty(individualNo) && individualNo.length() > 25) {
ToastUtils.showShort("可视耳标超长,请填写在25位内!");
return;
}
viewModel.forwardChangeLabel(registrationNo, individualNo);
dialog.dismiss();
}
})
.negativeText("取消")
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
dialog.dismiss();
}
})
.show();
}
});
}
//选择框
......@@ -490,5 +557,30 @@ public class BasicsCollectFragment extends BaseFragment<FragmentBasicsCollectBin
}
}
private void initImagePicker() {
if (mImagePicker == null) {
mImagePicker = new ImagePicker(getActivity());
mImagePicker.setOnImagePickerListener(new ImagePicker.OnImagePickerListener() {
@Override
public void onSuccess(String path) {
Bitmap bitmap = BaseImageUtils.decodeBitmap(path, getActivity());
// Bitmap bitmap2 = BaseImageUtils.rotateBitmapByDegree(bitmap, BaseImageUtils.getBitmapDegree(path));
BaseImageUtils.saveBitmapToSDCard(bitmap, viewModel.getMarkImgUrl());
Configs.tempCattleResume.setPhotoPath(viewModel.getMarkImgUrl());
Glide.with(getActivity())
.load(viewModel.getMarkImgUrl())
.apply(
new RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(R.drawable.no_image)
.fallback(R.drawable.no_image)
)
.into(binding.ivCattlePhoto);
}
});
}
}
}
package com.phlx.anchorcollect.ui.labelchange;
import android.os.Bundle;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProviders;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bigkoo.pickerview.view.TimePickerView;
import com.phlx.anchorcollect.BR;
import com.phlx.anchorcollect.R;
import com.phlx.anchorcollect.data.VMFactory;
import com.phlx.anchorcollect.databinding.ActivityLabelChangeBinding;
import com.phlx.anchorcollect.ui.base.BaseActivity;
import com.phlx.anchorcollect.util.ImagePicker;
public class LabelChangeActivity extends BaseActivity<ActivityLabelChangeBinding, LabelChangeVM> {
private TimePickerView pvTime;
private ImagePicker markImagePicker;
private String epc, noticeNo;
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_label_change;
}
@Override
public int initVariableId() {
return BR.viewModel;
}
@Override
public void initParam() {
super.initParam();
Bundle _bundle = getIntent().getExtras();
if (_bundle != null) {
epc = _bundle.getString("epc");
noticeNo = _bundle.getString("noticeNo");
}
}
@Override
public LabelChangeVM initViewModel() {
VMFactory factory = VMFactory.getInstance(getApplication());
return ViewModelProviders.of(this, factory).get(LabelChangeVM.class);
}
@Override
public void initData() {
super.initData();
viewModel.initToolbar(epc, noticeNo);
}
@Override
public void initViewObservable() {
super.initViewObservable();
}
/**
* 监听Back键按下事件
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
new MaterialDialog.Builder(this).title("系统提示").content("数据尚未保存,是否退出?").positiveText("确定").negativeText("取消").onAny(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (which == DialogAction.POSITIVE) {
finish();
}
}
}).show();
return true;
} else if (keyCode == 782) {
// viewModel.photoOnClick.call();
}
return super.onKeyDown(keyCode, event);
}
}
package com.phlx.anchorcollect.ui.labelchange;
import android.annotation.SuppressLint;
import android.app.Application;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Handler;
import android.os.Message;
import android.util.SparseIntArray;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.databinding.ObservableField;
import com.phlx.anchorcollect.App;
import com.phlx.anchorcollect.Configs;
import com.phlx.anchorcollect.R;
import com.phlx.anchorcollect.data.Repository;
import com.phlx.anchorcollect.db.DbUtil;
import com.phlx.anchorcollect.db.interf.DbIDUCallBack;
import com.phlx.anchorcollect.db.interf.DbQueryCallBack;
import com.phlx.anchorcollect.entity.CattleResumeEntity;
import com.phlx.anchorcollect.ui.base.BackBarVM;
import com.phlx.anchorcollect.util.TextUtil;
import com.uhf.structures.InventoryData;
import com.uhf.structures.OnInventoryListener;
import org.greenrobot.greendao.query.WhereCondition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
import me.goldze.mvvmhabit.bus.event.SingleLiveEvent;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.StringUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
public class LabelChangeVM extends BackBarVM<Repository> implements OnInventoryListener {
public CattleResumeEntity entity = new CattleResumeEntity();
private List<CattleResumeEntity> uploadData;
public SingleLiveEvent<Boolean> initRFIDEvent = new SingleLiveEvent<>();
public SingleLiveEvent<Boolean> uploadDataEvent = new SingleLiveEvent<>();
private SimpleDateFormat dateFormat;
public ObservableField<String> epc = new ObservableField<>();
public ObservableField<String> noticeNo = new ObservableField<>();
private boolean isModify;
private SoundPool soundPool;//盘点到标签时的提示音
private SparseIntArray musicId;
private boolean isScan = false;//是否在扫描
private String tag = "";//扫描到的标记
public LabelChangeVM(@NonNull Application application, Repository model) {
super(application, model);
soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 5);
musicId = new SparseIntArray();
musicId.put(1, soundPool.load(getApplication(), R.raw.readcard, 1));
musicId.put(2, soundPool.load(getApplication(), R.raw.failure, 1));
}
//初始化ToolBar
public void initToolbar(String epc, String noticeNo) {
setBackTitleText(getApplication().getResources().getString(R.string.label_change));
setSettingVisibleObservable(View.GONE);
setBackRightTextVisible(View.VISIBLE);
setBackRightText(getApplication().getResources().getString(R.string.save));
this.epc.set(epc);
this.noticeNo.set(noticeNo);
getCattleResume();
}
@Override
public void onResume() {
super.onResume();
isScan = false;
tag = "";
App.getInstance().getLinkage().setOnInventoryListener(this);
}
private void initData() {
uploadData = new ArrayList<>();
epc.set(entity.getRegistrationNo());
noticeNo.set(entity.getIndividualNo());
// entity.notifyChange();
}
public BindingCommand onScanRfidClick = new BindingCommand(() -> startInventory());
@Override
protected void backRightTextOnClick() {
saveCattleResume();
}
private void saveCattleResume() {
if (StringUtils.isEmpty(epc.get()) && StringUtils.isEmpty(noticeNo.get())) {
ToastUtils.showShort("请至少填一个耳标号!");
return;
}
if (!StringUtils.isEmpty(epc.get()) && epc.get().length() > 50) {
ToastUtils.showShort("高频耳标长度非法,请重新扫描!");
return;
}
if (!StringUtils.isEmpty(noticeNo.get()) && noticeNo.get().length() > 25) {
ToastUtils.showShort("可视耳标超长,请填写在25位内!");
return;
}
int checkResult = checkCattleResume();
if (checkResult != 0) {
switch (checkResult) {
case 1:
ToastUtils.showShort("高频耳标已存在,请重新扫描!");
return;
case 3:
ToastUtils.showShort("可视耳标已存在,请重新填写!");
return;
}
}
if (!StringUtils.isEmpty(epc.get()))
entity.setRegistrationNo(epc.get());
if (!StringUtils.isEmpty(noticeNo.get()))
entity.setIndividualNo(noticeNo.get());
entity.setUploadStatus("0");
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
entity.setUpdateBy(model.getUserName());
entity.setUpdateTime(dateFormat.format(new Date(System.currentTimeMillis())));
entity.setDeptId(Long.parseLong(SPUtils.getInstance().getString(Configs.SP_DEPT_ID)));
uploadData.add(entity);
DbUtil.getInstance().setDbIDUCallBack(new DbIDUCallBack() {
@Override
public void onNotification(boolean result) {
if (result) {
ToastUtils.showShort("保存" + getApplication().getResources().getString(R.string.label_change) + "成功!");
finish();
} else {
ToastUtils.showShort("保存" + getApplication().getResources().getString(R.string.label_change) + "失败!");
}
}
}).insertAsyncBatch(CattleResumeEntity.class, uploadData);
}
private int checkCattleResume() {
List<CattleResumeEntity> cattleResumeEntityList = DbUtil.getInstance().queryAll(CattleResumeEntity.class);
if (cattleResumeEntityList != null && cattleResumeEntityList.size() > 0) {
for (CattleResumeEntity cattleResumeEntity : cattleResumeEntityList) {
if (cattleResumeEntity.getUnid().equals(entity.getUnid())) {
continue;
}
if (!StringUtils.isEmpty(epc.get()) && epc.get().equals(cattleResumeEntity.getRegistrationNo())) {
return 1;
}
if (!StringUtils.isEmpty(noticeNo.get()) && noticeNo.get().equals(cattleResumeEntity.getIndividualNo())) {
return 3;
}
}
return 0;
} else {
return 0;
}
}
@Override
public void getInventoryData(InventoryData inventoryData) {
if (inventoryData != null) {
Message messenger = handler.obtainMessage();
messenger.what = 0x333;
messenger.obj = inventoryData;
handler.sendMessage(messenger);
}
}
//开始盘点一次
public void startInventory() {
if (!isScan) {
App.getInstance().getLinkage().startInventory(1, 0);
tag = "";
isScan = true;
} else {
App.getInstance().getLinkage().stopInventory();
isScan = false;
}
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x333) {
InventoryData inventoryData = (InventoryData) msg.obj;
if (inventoryData.getDataLength() > 0 && inventoryData.getEpcLength() > 0) {
String epc = TextUtil.byteToHexString(inventoryData.getEPC_Data(), inventoryData.getEpcLength()).substring(1);
String tid = TextUtil.byteToHexString(inventoryData.getData(), inventoryData.getDataLength());
soundPool.play(musicId.get(1), 1, 1, 0, 0, 1);
App.getInstance().getLinkage().stopInventory();
if ("".equals(tag))
checkEpc(epc, tid);
}
}
}
};
private void checkEpc(String epc, String tid) {
tag = epc + tid;
ToastUtils.showShort(epc);
this.epc.set(epc);
isScan = false;
}
/**
* 查询基础信息
**/
private void getCattleResume() {
StringBuffer sbf = new StringBuffer();
if (!StringUtils.isEmpty(epc.get()))
sbf.append(" REGISTRATION_NO = '" + epc.get() + "'");
if (!StringUtils.isEmpty(noticeNo.get())) {
if (sbf.length() > 0)
sbf.append(" AND ");
sbf.append(" INDIVIDUAL_NO= '" + noticeNo.get() + "'");
}
String sql = sbf.toString();
WhereCondition.StringCondition stringCondition = new WhereCondition.StringCondition(sql);
DbUtil.getInstance().setDbQueryCallBack(new DbQueryCallBack<CattleResumeEntity>() {
@Override
public void onSuccess(List<CattleResumeEntity> result) {
if (result != null && result.size() > 0) {
entity.copyEntity(result.get(0));
initData();
} else {
ToastUtils.showShort("耳标不存在,请重新扫描!");
finish();
}
}
@Override
public void onFailed() {
ToastUtils.showShort("查询数据库失败");
finish();
}
}).queryAsync(CattleResumeEntity.class, stringCondition);
}
@Override
public void onPause() {
super.onPause();
App.getInstance().getLinkage().stopInventory();
App.getInstance().getLinkage().setOnInventoryListener(null);
}
}
......@@ -80,8 +80,8 @@ public class LoginVM extends BaseViewModel<Repository> {
userName.set(model.getUserName());
password.set(model.getPassword());
// userName.set("dzy");
// password.set("123456");
userName.set("15047917803");
password.set("Tpsq7803*");
// userName.set("ewei");
// password.set("123456");
}
......
......@@ -146,8 +146,7 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainVM> {
// ModuleManager.powerOff();
App.getInstance().getLinkage().setRFConnectMode(0);
App.getInstance().getLinkage().setRFModuleType(0);//R2000 0,R2000plus 3
if (ModuleManager.openCom() != 0 || ModuleManager.powerOn() != 0) {
if (!ModuleManager.initPower()) {
new MaterialDialog.Builder(this).title("系统提示").content("串口打开失败,无法工作,请检查设备").cancelable(false).canceledOnTouchOutside(false).positiveText("退出").onAny(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
......@@ -165,14 +164,14 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainVM> {
viewModel.setInventoryStatus();
ToastUtils.showShort(connectManger.getModuleVersion());
//设置盘点内容:Epc + Tid
// //设置盘点内容:Epc + Tid
InventoryParams inventoryParams = new InventoryParams();
inventoryParams.address = 0;
inventoryParams.inventoryArea = 2;
inventoryParams.len = 6;
App.getInstance().getLinkage().Radio_SetInventoryParams(inventoryParams);
setAlgorithm();
// setAlgorithm();
}
/**
......
......@@ -141,7 +141,7 @@ public class SettingVM extends BaseViewModel<Repository> implements DiscoveryLis
* 获取天线功率
*/
private void getAntennaPower() {
if (ModuleManager.powerOn() != 0) {
if (!ModuleManager.initPower()) {
me.goldze.mvvmhabit.utils.ToastUtils.showShort("模块连接失败");
ModuleManager.powerOff();
return;
......@@ -163,7 +163,7 @@ public class SettingVM extends BaseViewModel<Repository> implements DiscoveryLis
* 设置天线功率
*/
private void setAntennaPower() {
if (ModuleManager.powerOn() != 0) {
if (!ModuleManager.initPower()) {
me.goldze.mvvmhabit.utils.ToastUtils.showShort("模块连接失败");
ModuleManager.powerOff();
return;
......
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/tools"
xmlns:binding="http://schemas.android.com/apk/res-auto"
app:ignore="NamespaceTypo">
<data>
<import type="me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter" />
<import type="me.goldze.mvvmhabit.binding.viewadapter.recyclerview.LayoutManagers" />
<import type="me.goldze.mvvmhabit.binding.viewadapter.recyclerview.LineManagers" />
<variable
name="viewModel"
type="com.phlx.anchorcollect.ui.bind.BindVM" />
<variable
name="spinnerAdapter"
type="android.widget.ArrayAdapter" />
<variable
name="adapter"
type="BindingRecyclerViewAdapter" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_bg"
android:padding="5dp">
<include
android:id="@+id/include"
layout="@layout/layout_back_bar"
binding:backBarVM="@{viewModel.backBarVM}" />
<TextView
android:id="@+id/tv_rfid_text"
android:layout_width="0dp"
android:layout_height="@dimen/dp_45"
android:background="@drawable/bg_radius_stroke_white_5"
android:gravity="center"
android:layout_margin="@dimen/dp_20"
android:hint="未扫到电子耳标"
android:text="@{viewModel.registrationNo}"
android:textColor="@color/black"
binding:layout_constraintLeft_toLeftOf="parent"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/include"
onClickCommand="@{viewModel.onRegistrationNoClick}"
/>
<Spinner
android:id="@+id/colony_house_no_sp"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_5"
android:gravity="center_vertical"
android:minHeight="@dimen/dp_40"
android:layout_margin="@dimen/dp_20"
android:spinnerMode="dialog"
binding:valueReply="@{viewModel.individualNo}"
app:adapter="@{spinnerAdapter}"
binding:itemDatas="@{viewModel.tagItemData}"
binding:onItemSelectedCommand="@{viewModel.onTagSelectorCommand}"
binding:layout_constraintLeft_toLeftOf="parent"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/tv_rfid_text"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/tools"
xmlns:binding="http://schemas.android.com/apk/res-auto"
app:ignore="NamespaceTypo">
<data>
<import type="me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter" />
<import type="me.goldze.mvvmhabit.binding.viewadapter.recyclerview.LayoutManagers" />
<import type="me.goldze.mvvmhabit.binding.viewadapter.recyclerview.LineManagers" />
<variable
name="viewModel"
type="com.phlx.anchorcollect.ui.labelchange.LabelChangeVM" />
<variable
name="spinnerAdapter"
type="android.widget.ArrayAdapter" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/include"
layout="@layout/layout_back_bar"
binding:backBarVM="@{viewModel.backBarVM}" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
binding:layout_constraintBottom_toBottomOf="parent"
binding:layout_constraintEnd_toEndOf="parent"
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/include">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_30">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/marking_guideline_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
binding:layout_constraintGuide_begin="@dimen/dp_75" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_label"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:orientation="vertical"
binding:layout_constraintLeft_toLeftOf="parent"
binding:layout_constraintRight_toLeftOf="@+id/marking_guideline_vertical"
binding:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/high_no_desc"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_40"
android:gravity="center_vertical"
android:layout_marginTop="@dimen/dp_5"
android:text="高频耳标"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/notice_no_desc"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_40"
android:gravity="center_vertical"
android:layout_marginTop="@dimen/dp_5"
android:text="可视耳标"
android:textColor="@color/black"
android:textSize="@dimen/desc_text_size" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:orientation="vertical"
binding:layout_constraintHorizontal_bias="1.0"
binding:layout_constraintLeft_toRightOf="@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/high_no_edit"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:gravity="center_vertical"
android:layout_marginTop="@dimen/dp_5"
android:inputType="number"
android:background="@drawable/input_frame_bg"
android:text="@={viewModel.epc}"
android:textSize="@dimen/edit_size"
binding:onClickCommand="@{viewModel.onScanRfidClick}"/>
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/notice_no_edit"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:gravity="center_vertical"
android:layout_marginTop="@dimen/dp_5"
android:maxLength="20"
android:singleLine="true"
android:background="@drawable/input_frame_bg"
android:text="@={viewModel.noticeNo}"
android:textSize="@dimen/edit_size"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -139,8 +139,7 @@
binding:layout_constraintLeft_toLeftOf="parent"
binding:layout_constraintRight_toLeftOf="@+id/tv_unit"
binding:layout_constraintTop_toTopOf="parent"
binding:onClickCommand="@{viewModel.onWeightChangedClick}"
/>
binding:onClickCommand="@{viewModel.onWeightChangedClick}" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_unit"
......@@ -374,10 +373,9 @@
android:id="@+id/iv_cattle_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{() ->viewModel.click(100)}"
android:src="@{viewModel.drawableImg}"
binding:url="@{viewModel.imgUrl}"/>
<!-- android:onClick="@{() ->viewModel.click(100)}"-->
<!-- binding:url="@{viewModel.uiList.get(17).value}"-->
binding:url="@{viewModel.markImgUrl}" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
......@@ -472,7 +470,7 @@
android:maxLines="1"
android:singleLine="true"
android:text="@{viewModel.uiList.get(2).columnComment}"
android:textColor="@color/color_font_null"
android:textColor="@color/colorPrimary"
android:textSize="@dimen/sp_8" />
<androidx.appcompat.widget.AppCompatTextView
......@@ -508,7 +506,7 @@
android:maxLines="1"
android:singleLine="true"
android:text="@{viewModel.uiList.get(3).columnComment}"
android:textColor="@color/color_font_null"
android:textColor="@color/colorPrimary"
android:textSize="@dimen/sp_8" />
<androidx.appcompat.widget.AppCompatTextView
......@@ -545,13 +543,32 @@
android:paddingLeft="5dp"
binding:layout_constraintBottom_toBottomOf="parent"
binding:layout_constraintLeft_toRightOf="@+id/guideline_vertical"
binding:layout_constraintRight_toRightOf="parent"
>
binding:layout_constraintRight_toRightOf="parent">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/card_99"
android:id="@+id/card_label_change"
android:layout_width="100dp"
android:layout_height="37dp"
android:layout_marginLeft="5dp"
android:background="@drawable/bg_radius_white_5"
binding:onClickCommand="@{viewModel.onLabelChangeClick}">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_button_orange_gradient"
android:gravity="center"
android:text="换绑标签"
android:textColor="@color/white"
android:textSize="@dimen/sp_12" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/card_99"
android:layout_width="0dp"
android:layout_height="37dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/bg_radius_white_5"
android:onClick="@{() ->viewModel.click(99)}"
android:orientation="vertical"
......@@ -579,8 +596,8 @@
android:layout_width="100dp"
android:layout_height="37dp"
android:layout_marginLeft="5dp"
android:visibility="gone"
android:background="@drawable/bg_radius_white_5">
android:background="@drawable/bg_radius_white_5"
binding:onClickCommand="@{viewModel.onSaveClick}">
<!-- binding:onClickCommand="@{viewModel.onCardSaveClick}"-->
<androidx.appcompat.widget.AppCompatTextView
......
......@@ -44,6 +44,21 @@
binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_right_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?selectableItemBackground"
android:gravity="center"
android:padding="12dp"
android:text="@{backBarVM.backRightText}"
android:textColor="@color/white"
android:textSize="16sp"
android:visibility="@{backBarVM.backRightTextVisibleObservable}"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintBaseline_toBaselineOf="@+id/tv_title"
binding:onClickCommand="@{backBarVM.backRightTextOnClick}" />
<ImageView
android:id="@+id/iv_setting_icon"
......
......@@ -25,7 +25,7 @@
<string name="immun_record_detail">免疫详情</string>
<string name="breeding_record">配种记录</string>
<string name="breeding_record_detail">配种详情</string>
<string name="label_change">标签换绑</string>
<string name="error_data_upload">错误上报</string>
<string name="one_click_sync">一键同步</string>
......
......@@ -6,16 +6,18 @@ buildscript {
agp_version = '3.5.0'
}
repositories {
maven { url 'https://maven.aliyun.com/repository/google/' }
google()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
jcenter()
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
// maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
// maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
// maven { url 'https://maven.aliyun.com/repository/public/' }
// maven { url 'https://maven.aliyun.com/repository/central' }
//
// maven { url 'https://maven.aliyun.com/repository/google' }
// maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
// jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
......@@ -31,17 +33,20 @@ buildscript {
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/google/' }
google()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
// maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
// maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
// maven { url 'https://maven.aliyun.com/repository/public/' }
// maven { url 'https://maven.aliyun.com/repository/central' }
//
// maven { url 'https://maven.aliyun.com/repository/google' }
// maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
......
......@@ -16,6 +16,9 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
}
dependencies {
......
......@@ -3,6 +3,9 @@
package="me.goldze.mvvmhabit">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application>
<activity
android:name=".base.ContainerActivity"
......
package me.goldze.mvvmhabit;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
......@@ -10,8 +7,4 @@ import static org.junit.Assert.*;
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
......@@ -18,15 +18,18 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
api fileTree(include: ['*.jar'], dir: 'libs')
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:design:25.+'
compile 'com.android.support:appcompat-v7:25.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
implementation 'com.android.support:design:25.+'
implementation 'com.android.support:appcompat-v7:25.+'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
}
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