Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in
Toggle navigation
W
WoolTrace
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hywang
WoolTrace
Commits
ec787706
Commit
ec787706
authored
Oct 11, 2021
by
hywang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1.增加锡盟临时打标功能
parent
0cd584fb
Show whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
1753 additions
and
10 deletions
+1753
-10
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+16
-0
Configs.java
app/src/main/java/com/phlx/wool/Configs.java
+3
-0
Repository.java
app/src/main/java/com/phlx/wool/data/Repository.java
+6
-0
VMFactory.java
app/src/main/java/com/phlx/wool/data/VMFactory.java
+14
-0
ApiService.java
app/src/main/java/com/phlx/wool/data/http/ApiService.java
+10
-0
HttpDataSource.java
...src/main/java/com/phlx/wool/data/http/HttpDataSource.java
+6
-0
HttpDataSourceImpl.java
...main/java/com/phlx/wool/data/http/HttpDataSourceImpl.java
+6
-0
CattleLabelEntity.java
...src/main/java/com/phlx/wool/entity/CattleLabelEntity.java
+412
-0
RetrofitClient.java
app/src/main/java/com/phlx/wool/net/RetrofitClient.java
+5
-3
CattleMainActivity.java
.../com/phlx/wool/ui/cattle/activity/CattleMainActivity.java
+47
-0
CattleMarkActivity.java
.../com/phlx/wool/ui/cattle/activity/CattleMarkActivity.java
+210
-0
CattleUploadActivity.java
...om/phlx/wool/ui/cattle/activity/CattleUploadActivity.java
+56
-0
CattleMainVM.java
...rc/main/java/com/phlx/wool/ui/cattle/vm/CattleMainVM.java
+45
-0
CattleMarkVM.java
...rc/main/java/com/phlx/wool/ui/cattle/vm/CattleMarkVM.java
+214
-0
CattleUploadVM.java
.../main/java/com/phlx/wool/ui/cattle/vm/CattleUploadVM.java
+112
-0
LoginVM.java
app/src/main/java/com/phlx/wool/ui/login/LoginVM.java
+16
-6
BaseImageUtils.java
app/src/main/java/com/phlx/wool/util/BaseImageUtils.java
+52
-0
activity_cattle_main.xml
app/src/main/res/layout/activity_cattle_main.xml
+35
-0
activity_cattle_mark.xml
app/src/main/res/layout/activity_cattle_mark.xml
+344
-0
activity_cattle_upload.xml
app/src/main/res/layout/activity_cattle_upload.xml
+142
-0
strings.xml
app/src/main/res/values/strings.xml
+2
-1
No files found.
app/src/main/AndroidManifest.xml
View file @
ec787706
...
...
@@ -122,6 +122,22 @@
android:configChanges=
"keyboardHidden|orientation|screenSize"
android:screenOrientation=
"portrait"
android:windowSoftInputMode=
"stateHidden|adjustResize"
/>
<activity
android:name=
".ui.cattle.activity.CattleMainActivity"
android:configChanges=
"keyboardHidden|orientation|screenSize"
android:launchMode=
"singleTask"
android:screenOrientation=
"portrait"
android:windowSoftInputMode=
"stateHidden|adjustResize"
/>
<activity
android:name=
".ui.cattle.activity.CattleMarkActivity"
android:configChanges=
"keyboardHidden|orientation|screenSize"
android:screenOrientation=
"portrait"
android:windowSoftInputMode=
"stateHidden|adjustResize"
/>
<activity
android:name=
".ui.cattle.activity.CattleUploadActivity"
android:configChanges=
"keyboardHidden|orientation|screenSize"
android:screenOrientation=
"portrait"
android:windowSoftInputMode=
"stateHidden|adjustResize"
/>
</application>
</manifest>
\ No newline at end of file
app/src/main/java/com/phlx/wool/Configs.java
View file @
ec787706
...
...
@@ -69,6 +69,9 @@ public class Configs {
public
static
PrinterInstance
myPrinter
;
//是否是锡盟临时项目
public
static
boolean
isCattle
=
true
;
// public static boolean ISCONNECTED;
public
static
String
packageName
(
Context
context
)
{
...
...
app/src/main/java/com/phlx/wool/data/Repository.java
View file @
ec787706
...
...
@@ -7,6 +7,7 @@ import androidx.annotation.NonNull;
import
com.phlx.wool.data.http.HttpDataSource
;
import
com.phlx.wool.data.local.LocalDataSource
;
import
com.phlx.wool.db.DbUtil
;
import
com.phlx.wool.entity.CattleLabelEntity
;
import
com.phlx.wool.entity.DivisionEntity
;
import
com.phlx.wool.entity.DivisionEntityDao
;
import
com.phlx.wool.entity.EntryRegistrationEntity
;
...
...
@@ -140,6 +141,11 @@ public class Repository extends BaseModel implements HttpDataSource, LocalDataSo
return
mHttpDataSource
.
submitHarmless
(
body
);
}
@Override
public
Observable
<
CattleResponse
<
List
<
CattleLabelEntity
>>>
uploadCattleMark
(
RequestBody
body
)
{
return
mHttpDataSource
.
uploadCattleMark
(
body
);
}
@Override
public
void
saveUserName
(
String
userName
)
{
...
...
app/src/main/java/com/phlx/wool/data/VMFactory.java
View file @
ec787706
...
...
@@ -8,6 +8,9 @@ import androidx.annotation.VisibleForTesting;
import
androidx.lifecycle.ViewModel
;
import
androidx.lifecycle.ViewModelProvider
;
import
com.phlx.wool.ui.cattle.vm.CattleMainVM
;
import
com.phlx.wool.ui.cattle.vm.CattleMarkVM
;
import
com.phlx.wool.ui.cattle.vm.CattleUploadVM
;
import
com.phlx.wool.ui.inventory.InventoryVM
;
import
com.phlx.wool.ui.login.LoginVM
;
import
com.phlx.wool.ui.main.MainVM
;
...
...
@@ -94,6 +97,17 @@ public class VMFactory extends ViewModelProvider.NewInstanceFactory {
return
(
T
)
new
VillusGaugeVM
(
mApplication
,
repository
);
}
else
if
(
modelClass
.
isAssignableFrom
(
SlaughterEntryVM
.
class
))
{
return
(
T
)
new
SlaughterEntryVM
(
mApplication
,
repository
);
//锡盟临时项目
}
else
if
(
modelClass
.
isAssignableFrom
(
CattleMainVM
.
class
))
{
return
(
T
)
new
CattleMainVM
(
mApplication
,
repository
);
}
else
if
(
modelClass
.
isAssignableFrom
(
CattleMarkVM
.
class
))
{
return
(
T
)
new
CattleMarkVM
(
mApplication
,
repository
);
}
else
if
(
modelClass
.
isAssignableFrom
(
CattleUploadVM
.
class
))
{
return
(
T
)
new
CattleUploadVM
(
mApplication
,
repository
);
}
throw
new
IllegalArgumentException
(
"Unknown ViewModel class: "
+
modelClass
.
getName
());
}
...
...
app/src/main/java/com/phlx/wool/data/http/ApiService.java
View file @
ec787706
...
...
@@ -2,6 +2,7 @@ package com.phlx.wool.data.http;
import
com.phlx.wool.entity.CattleLabelEntity
;
import
com.phlx.wool.entity.DivisionEntity
;
import
com.phlx.wool.entity.EntryRegistrationEntity
;
import
com.phlx.wool.entity.Harmless
;
...
...
@@ -133,5 +134,14 @@ public interface ApiService {
@Headers
({
"Content-Type: application/json"
,
"Accept: application/json"
})
@POST
(
"/app/innocuitymanagerecord/saveList"
)
Observable
<
CattleResponse
<
List
<
Harmless
>>>
submitHarmless
(
@Body
RequestBody
body
);
/**
* 锡盟补打上传
*/
@Headers
({
"Content-Type: application/json"
,
"Accept: application/json"
})
@POST
(
"/dataServer/uploadCattleresume"
)
Observable
<
CattleResponse
<
List
<
CattleLabelEntity
>>>
uploadCattleMark
(
@Body
RequestBody
body
);
}
app/src/main/java/com/phlx/wool/data/http/HttpDataSource.java
View file @
ec787706
...
...
@@ -2,6 +2,7 @@ package com.phlx.wool.data.http;
import
com.phlx.wool.entity.CattleLabelEntity
;
import
com.phlx.wool.entity.DivisionEntity
;
import
com.phlx.wool.entity.EntryRegistrationEntity
;
import
com.phlx.wool.entity.Harmless
;
...
...
@@ -105,4 +106,9 @@ public interface HttpDataSource {
*/
Observable
<
CattleResponse
<
List
<
Harmless
>>>
submitHarmless
(
@Body
RequestBody
body
);
/**
* 锡盟补打上传
*/
Observable
<
CattleResponse
<
List
<
CattleLabelEntity
>>>
uploadCattleMark
(
@Body
RequestBody
body
);
}
app/src/main/java/com/phlx/wool/data/http/HttpDataSourceImpl.java
View file @
ec787706
...
...
@@ -2,6 +2,7 @@ package com.phlx.wool.data.http;
import
com.phlx.wool.entity.CattleLabelEntity
;
import
com.phlx.wool.entity.DivisionEntity
;
import
com.phlx.wool.entity.EntryRegistrationEntity
;
import
com.phlx.wool.entity.Harmless
;
...
...
@@ -122,5 +123,10 @@ public class HttpDataSourceImpl implements HttpDataSource {
return
apiService
.
submitHarmless
(
body
);
}
@Override
public
Observable
<
CattleResponse
<
List
<
CattleLabelEntity
>>>
uploadCattleMark
(
RequestBody
body
)
{
return
apiService
.
uploadCattleMark
(
body
);
}
}
app/src/main/java/com/phlx/wool/entity/CattleLabelEntity.java
0 → 100644
View file @
ec787706
package
com
.
phlx
.
wool
.
entity
;
import
android.os.Parcel
;
import
android.os.Parcelable
;
import
androidx.databinding.BaseObservable
;
import
org.greenrobot.greendao.annotation.Entity
;
import
org.greenrobot.greendao.annotation.Id
;
import
org.greenrobot.greendao.annotation.Generated
;
/**
* 锡盟临时录入数据bean
*/
@Entity
public
class
CattleLabelEntity
extends
BaseObservable
implements
Parcelable
{
/**
* 主键
*/
@Id
private
String
id
;
/**
* 耳标号
*/
private
String
registrationNo
;
/**
* 个体号
*/
private
String
individualNo
;
/**
* 出生日期
*/
private
String
birthdate
;
/**
* 血统
*/
private
String
ancestryId
;
/**
* 性别
*/
private
String
sex
;
/**
* 体重
*/
private
String
weight
;
/**
* 胸围
*/
private
String
bust
;
/**
* 管围
*/
private
String
tubeCircumference
;
/**
* 体高
*/
private
String
bodyHeight
;
/**
* 体斜长
*/
private
String
bodyObliqueLength
;
/**
* 照片路径
*/
private
String
markImgPath
;
/**
* 照片
*/
private
String
photo
;
/**
* 状态(育种,育成,成年,淘汰,出售)
*/
private
String
status
;
/**
* 时间戳
*/
private
String
inputTime
;
/**
* 备用
*/
private
String
spare1
;
/**
* 备用
*/
private
String
spare2
;
/**
* 备用
*/
private
String
spare3
;
/**
* 备用
*/
private
String
spare4
;
/** 创建者 */
private
String
createBy
;
/** 创建时间 */
private
String
createTime
;
public
CattleLabelEntity
()
{
}
protected
CattleLabelEntity
(
Parcel
in
)
{
id
=
in
.
readString
();
registrationNo
=
in
.
readString
();
individualNo
=
in
.
readString
();
birthdate
=
in
.
readString
();
ancestryId
=
in
.
readString
();
sex
=
in
.
readString
();
weight
=
in
.
readString
();
bust
=
in
.
readString
();
tubeCircumference
=
in
.
readString
();
bodyHeight
=
in
.
readString
();
bodyObliqueLength
=
in
.
readString
();
markImgPath
=
in
.
readString
();
photo
=
in
.
readString
();
status
=
in
.
readString
();
inputTime
=
in
.
readString
();
spare1
=
in
.
readString
();
spare2
=
in
.
readString
();
spare3
=
in
.
readString
();
spare4
=
in
.
readString
();
createBy
=
in
.
readString
();
createTime
=
in
.
readString
();
}
@Generated
(
hash
=
1246556714
)
public
CattleLabelEntity
(
String
id
,
String
registrationNo
,
String
individualNo
,
String
birthdate
,
String
ancestryId
,
String
sex
,
String
weight
,
String
bust
,
String
tubeCircumference
,
String
bodyHeight
,
String
bodyObliqueLength
,
String
markImgPath
,
String
photo
,
String
status
,
String
inputTime
,
String
spare1
,
String
spare2
,
String
spare3
,
String
spare4
,
String
createBy
,
String
createTime
)
{
this
.
id
=
id
;
this
.
registrationNo
=
registrationNo
;
this
.
individualNo
=
individualNo
;
this
.
birthdate
=
birthdate
;
this
.
ancestryId
=
ancestryId
;
this
.
sex
=
sex
;
this
.
weight
=
weight
;
this
.
bust
=
bust
;
this
.
tubeCircumference
=
tubeCircumference
;
this
.
bodyHeight
=
bodyHeight
;
this
.
bodyObliqueLength
=
bodyObliqueLength
;
this
.
markImgPath
=
markImgPath
;
this
.
photo
=
photo
;
this
.
status
=
status
;
this
.
inputTime
=
inputTime
;
this
.
spare1
=
spare1
;
this
.
spare2
=
spare2
;
this
.
spare3
=
spare3
;
this
.
spare4
=
spare4
;
this
.
createBy
=
createBy
;
this
.
createTime
=
createTime
;
}
@Override
public
void
writeToParcel
(
Parcel
dest
,
int
flags
)
{
dest
.
writeString
(
id
);
dest
.
writeString
(
registrationNo
);
dest
.
writeString
(
individualNo
);
dest
.
writeString
(
birthdate
);
dest
.
writeString
(
ancestryId
);
dest
.
writeString
(
sex
);
dest
.
writeString
(
weight
);
dest
.
writeString
(
bust
);
dest
.
writeString
(
tubeCircumference
);
dest
.
writeString
(
bodyHeight
);
dest
.
writeString
(
bodyObliqueLength
);
dest
.
writeString
(
markImgPath
);
dest
.
writeString
(
photo
);
dest
.
writeString
(
status
);
dest
.
writeString
(
inputTime
);
dest
.
writeString
(
spare1
);
dest
.
writeString
(
spare2
);
dest
.
writeString
(
spare3
);
dest
.
writeString
(
spare4
);
dest
.
writeString
(
createBy
);
dest
.
writeString
(
createTime
);
}
@Override
public
int
describeContents
()
{
return
0
;
}
public
static
final
Creator
<
CattleLabelEntity
>
CREATOR
=
new
Creator
<
CattleLabelEntity
>()
{
@Override
public
CattleLabelEntity
createFromParcel
(
Parcel
in
)
{
return
new
CattleLabelEntity
(
in
);
}
@Override
public
CattleLabelEntity
[]
newArray
(
int
size
)
{
return
new
CattleLabelEntity
[
size
];
}
};
public
String
getId
()
{
return
id
;
}
public
void
setId
(
String
id
)
{
this
.
id
=
id
;
}
public
String
getRegistrationNo
()
{
return
registrationNo
;
}
public
void
setRegistrationNo
(
String
registrationNo
)
{
this
.
registrationNo
=
registrationNo
;
}
public
String
getIndividualNo
()
{
return
individualNo
;
}
public
void
setIndividualNo
(
String
individualNo
)
{
this
.
individualNo
=
individualNo
;
}
public
String
getBirthdate
()
{
return
birthdate
;
}
public
void
setBirthdate
(
String
birthdate
)
{
this
.
birthdate
=
birthdate
;
}
public
String
getAncestryId
()
{
return
ancestryId
;
}
public
void
setAncestryId
(
String
ancestryId
)
{
this
.
ancestryId
=
ancestryId
;
}
public
String
getSex
()
{
return
sex
;
}
public
void
setSex
(
String
sex
)
{
this
.
sex
=
sex
;
}
public
String
getWeight
()
{
return
weight
;
}
public
void
setWeight
(
String
weight
)
{
this
.
weight
=
weight
;
}
public
String
getBust
()
{
return
bust
;
}
public
void
setBust
(
String
bust
)
{
this
.
bust
=
bust
;
}
public
String
getTubeCircumference
()
{
return
tubeCircumference
;
}
public
void
setTubeCircumference
(
String
tubeCircumference
)
{
this
.
tubeCircumference
=
tubeCircumference
;
}
public
String
getBodyHeight
()
{
return
bodyHeight
;
}
public
void
setBodyHeight
(
String
bodyHeight
)
{
this
.
bodyHeight
=
bodyHeight
;
}
public
String
getBodyObliqueLength
()
{
return
bodyObliqueLength
;
}
public
void
setBodyObliqueLength
(
String
bodyObliqueLength
)
{
this
.
bodyObliqueLength
=
bodyObliqueLength
;
}
public
String
getMarkImgPath
()
{
return
markImgPath
;
}
public
void
setMarkImgPath
(
String
markImgPath
)
{
this
.
markImgPath
=
markImgPath
;
}
public
String
getPhoto
()
{
return
photo
;
}
public
void
setPhoto
(
String
photo
)
{
this
.
photo
=
photo
;
}
public
String
getStatus
()
{
return
status
;
}
public
void
setStatus
(
String
status
)
{
this
.
status
=
status
;
}
public
String
getInputTime
()
{
return
inputTime
;
}
public
void
setInputTime
(
String
inputTime
)
{
this
.
inputTime
=
inputTime
;
}
public
String
getSpare1
()
{
return
spare1
;
}
public
void
setSpare1
(
String
spare1
)
{
this
.
spare1
=
spare1
;
}
public
String
getSpare2
()
{
return
spare2
;
}
public
void
setSpare2
(
String
spare2
)
{
this
.
spare2
=
spare2
;
}
public
String
getSpare3
()
{
return
spare3
;
}
public
void
setSpare3
(
String
spare3
)
{
this
.
spare3
=
spare3
;
}
public
String
getSpare4
()
{
return
spare4
;
}
public
void
setSpare4
(
String
spare4
)
{
this
.
spare4
=
spare4
;
}
public
String
getCreateBy
()
{
return
createBy
;
}
public
void
setCreateBy
(
String
createBy
)
{
this
.
createBy
=
createBy
;
}
public
String
getCreateTime
()
{
return
createTime
;
}
public
void
setCreateTime
(
String
createTime
)
{
this
.
createTime
=
createTime
;
}
@Override
public
String
toString
()
{
return
"CattleLabelEntity{"
+
"id='"
+
id
+
'\''
+
", registrationNo='"
+
registrationNo
+
'\''
+
", individualNo='"
+
individualNo
+
'\''
+
", birthdate='"
+
birthdate
+
'\''
+
", ancestryId='"
+
ancestryId
+
'\''
+
", sex='"
+
sex
+
'\''
+
", weight='"
+
weight
+
'\''
+
", bust='"
+
bust
+
'\''
+
", tubeCircumference='"
+
tubeCircumference
+
'\''
+
", bodyHeight='"
+
bodyHeight
+
'\''
+
", bodyObliqueLength='"
+
bodyObliqueLength
+
'\''
+
", markImgPath='"
+
markImgPath
+
'\''
+
", photo='"
+
photo
+
'\''
+
", status='"
+
status
+
'\''
+
", inputTime='"
+
inputTime
+
'\''
+
", spare1='"
+
spare1
+
'\''
+
", spare2='"
+
spare2
+
'\''
+
", spare3='"
+
spare3
+
'\''
+
", spare4='"
+
spare4
+
'\''
+
", createBy='"
+
createBy
+
'\''
+
", createTime='"
+
createTime
+
'\''
+
'}'
;
}
}
app/src/main/java/com/phlx/wool/net/RetrofitClient.java
View file @
ec787706
...
...
@@ -48,11 +48,13 @@ public class RetrofitClient {
private
static
final
int
CACHE_TIMEOUT
=
10
*
1024
*
1024
;
//服务端根路径
public
static
String
baseUrl
=
"58.18.92.126"
// "192.168.8.189"
// "58.18.92.126"//阿拉善正式
"39.101.170.186"
//锡盟正式
// "192.168.8.189"//张敏
;
public
static
String
port
=
"899"
// "899"//阿拉善正式
"8999"
//锡盟正式/ 张敏
// "80"
;
...
...
app/src/main/java/com/phlx/wool/ui/cattle/activity/CattleMainActivity.java
0 → 100644
View file @
ec787706
package
com
.
phlx
.
wool
.
ui
.
cattle
.
activity
;
import
android.os.Bundle
;
import
androidx.lifecycle.ViewModelProviders
;
import
com.phlx.wool.R
;
import
com.phlx.wool.data.VMFactory
;
import
com.phlx.wool.databinding.ActivityCattleMainBinding
;
import
com.phlx.wool.ui.base.BaseActivity
;
import
com.phlx.wool.ui.cattle.vm.CattleMainVM
;
import
com.phlx.wool.ui.inventory.InventoryVM
;
import
me.tatarka.bindingcollectionadapter2.BR
;
public
class
CattleMainActivity
extends
BaseActivity
<
ActivityCattleMainBinding
,
CattleMainVM
>
{
@Override
public
int
initContentView
(
Bundle
savedInstanceState
)
{
return
R
.
layout
.
activity_cattle_main
;
}
@Override
public
int
initVariableId
()
{
return
BR
.
viewModel
;
}
@Override
public
void
initParam
()
{
super
.
initParam
();
}
@Override
public
CattleMainVM
initViewModel
()
{
VMFactory
factory
=
VMFactory
.
getInstance
(
getApplication
());
return
ViewModelProviders
.
of
(
this
,
factory
).
get
(
CattleMainVM
.
class
);
}
@Override
public
void
initData
()
{
super
.
initData
();
}
@Override
public
void
initViewObservable
()
{
super
.
initViewObservable
();
}
}
app/src/main/java/com/phlx/wool/ui/cattle/activity/CattleMarkActivity.java
0 → 100644
View file @
ec787706
package
com
.
phlx
.
wool
.
ui
.
cattle
.
activity
;
import
android.Manifest
;
import
android.app.Dialog
;
import
android.graphics.Bitmap
;
import
android.os.Bundle
;
import
android.text.InputType
;
import
android.util.Log
;
import
android.view.Gravity
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.view.Window
;
import
android.widget.FrameLayout
;
import
androidx.annotation.NonNull
;
import
androidx.lifecycle.Observer
;
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.bumptech.glide.Glide
;
import
com.bumptech.glide.load.engine.DiskCacheStrategy
;
import
com.bumptech.glide.request.RequestOptions
;
import
com.phlx.wool.Configs
;
import
com.phlx.wool.R
;
import
com.phlx.wool.data.VMFactory
;
import
com.phlx.wool.databinding.ActivityCattleMarkBinding
;
import
com.phlx.wool.ui.base.BaseActivity
;
import
com.phlx.wool.ui.cattle.vm.CattleMarkVM
;
import
com.phlx.wool.ui.main.MainActivity
;
import
com.phlx.wool.ui.slaughter.SlaughterEntryActivity
;
import
com.phlx.wool.ui.slaughter.vm.SlaughterEntryVM
;
import
com.phlx.wool.util.BaseImageUtils
;
import
com.phlx.wool.util.ImagePicker
;
import
com.tbruyelle.rxpermissions2.RxPermissions
;
import
java.util.Date
;
import
io.reactivex.functions.Consumer
;
import
me.goldze.mvvmhabit.utils.ToastUtils
;
import
me.tatarka.bindingcollectionadapter2.BR
;
public
class
CattleMarkActivity
extends
BaseActivity
<
ActivityCattleMarkBinding
,
CattleMarkVM
>
{
private
ImagePicker
markImagePicker
;
private
TimePickerView
pvTime
;
@Override
public
int
initContentView
(
Bundle
savedInstanceState
)
{
return
R
.
layout
.
activity_cattle_mark
;
}
@Override
public
int
initVariableId
()
{
return
BR
.
viewModel
;
}
@Override
public
void
initParam
()
{
super
.
initParam
();
}
@Override
public
CattleMarkVM
initViewModel
()
{
VMFactory
factory
=
VMFactory
.
getInstance
(
getApplication
());
return
ViewModelProviders
.
of
(
this
,
factory
).
get
(
CattleMarkVM
.
class
);
}
@Override
public
void
initData
()
{
super
.
initData
();
viewModel
.
initToolbar
();
initTimePicker
();
if
(
markImagePicker
==
null
)
{
markImagePicker
=
new
ImagePicker
(
CattleMarkActivity
.
this
);
markImagePicker
.
setOnImagePickerListener
(
new
ImagePicker
.
OnImagePickerListener
()
{
@Override
public
void
onSuccess
(
String
path
)
{
Bitmap
bitmap
=
BaseImageUtils
.
decodeBitmap
(
path
,
CattleMarkActivity
.
this
);
// Bitmap bitmap2 = BaseImageUtils.rotateBitmapByDegree(bitmap, BaseImageUtils.getBitmapDegree(path));
BaseImageUtils
.
saveBitmapToSDCard
(
bitmap
,
viewModel
.
getMarkImgUrl
());
viewModel
.
entity
.
setMarkImgPath
(
viewModel
.
getMarkImgUrl
());
Glide
.
with
(
CattleMarkActivity
.
this
)
.
load
(
viewModel
.
getMarkImgUrl
())
.
apply
(
new
RequestOptions
()
.
skipMemoryCache
(
true
)
.
diskCacheStrategy
(
DiskCacheStrategy
.
NONE
)
.
error
(
R
.
drawable
.
no_image
)
.
fallback
(
R
.
drawable
.
no_image
)
)
.
into
(
binding
.
markPhotoView
);
}
});
}
}
@Override
public
void
initViewObservable
()
{
super
.
initViewObservable
();
viewModel
.
birthDay
.
observe
(
this
,
aBoolean
->
{
pvTime
.
show
(
binding
.
entryDayTv
);
});
viewModel
.
markPhotoOnClick
.
observe
(
this
,
aBoolean
->
{
RxPermissions
rxPermissions
=
new
RxPermissions
(
CattleMarkActivity
.
this
);
rxPermissions
.
request
(
Manifest
.
permission
.
CAMERA
,
Manifest
.
permission
.
READ_EXTERNAL_STORAGE
,
Manifest
.
permission
.
WRITE_EXTERNAL_STORAGE
)
.
subscribe
(
new
Consumer
<
Boolean
>()
{
@Override
public
void
accept
(
Boolean
aBoolean
)
throws
Exception
{
if
(
aBoolean
)
{
markImagePicker
.
show
(
CattleMarkActivity
.
this
);
}
else
{
ToastUtils
.
showShort
(
"权限被拒绝"
);
}
}
});
});
viewModel
.
scanLabelOnClick
.
observe
(
this
,
new
Observer
<
Boolean
>()
{
@Override
public
void
onChanged
(
Boolean
aBoolean
)
{
new
MaterialDialog
.
Builder
(
CattleMarkActivity
.
this
)
.
title
(
"耳标录入"
)
// .iconRes(R.drawable.ic_logo)
.
content
(
"通过拍子扫描低频耳标"
)
// .widgetColor(Color.BLUE)//输入框光标的颜色
.
inputType
(
InputType
.
TYPE_CLASS_NUMBER
)
//可以输入的类型
//前2个一个是hint一个是预输入的文字
.
input
(
""
,
""
,
new
MaterialDialog
.
InputCallback
()
{
@Override
public
void
onInput
(
@NonNull
MaterialDialog
dialog
,
CharSequence
input
)
{
Log
.
i
(
"scan"
,
"输入的是:"
+
input
);
}
})
.
onPositive
(
new
MaterialDialog
.
SingleButtonCallback
()
{
@Override
public
void
onClick
(
@NonNull
MaterialDialog
dialog
,
@NonNull
DialogAction
which
)
{
// dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
viewModel
.
setScanLabel
(
dialog
.
getInputEditText
().
getText
().
toString
());
}
})
.
show
();
}
});
}
private
void
initTimePicker
()
{
//Dialog 模式下,在底部弹出
pvTime
=
new
TimePickerBuilder
(
this
,
new
OnTimeSelectListener
()
{
@Override
public
void
onTimeSelect
(
Date
date
,
View
v
)
{
viewModel
.
setBirthDate
(
date
);
}
})
.
setTimeSelectChangeListener
(
new
OnTimeSelectChangeListener
()
{
@Override
public
void
onTimeSelectChanged
(
Date
date
)
{
}
})
.
setType
(
new
boolean
[]{
true
,
true
,
true
,
false
,
false
,
false
})
.
isDialog
(
true
)
//默认设置false ,内部实现将DecorView 作为它的父控件。
.
addOnCancelClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
view
)
{
Log
.
i
(
"pvTime"
,
"onCancelClickListener"
);
}
})
.
setItemVisibleCount
(
5
)
//若设置偶数,实际值会加1(比如设置6,则最大可见条目为7)
.
setLineSpacingMultiplier
(
2.0f
)
.
isAlphaGradient
(
true
)
.
build
();
Dialog
mDialog
=
pvTime
.
getDialog
();
if
(
mDialog
!=
null
)
{
FrameLayout
.
LayoutParams
params
=
new
FrameLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
,
Gravity
.
BOTTOM
);
params
.
leftMargin
=
0
;
params
.
rightMargin
=
0
;
pvTime
.
getDialogContainerLayout
().
setLayoutParams
(
params
);
Window
dialogWindow
=
mDialog
.
getWindow
();
if
(
dialogWindow
!=
null
)
{
dialogWindow
.
setWindowAnimations
(
com
.
bigkoo
.
pickerview
.
R
.
style
.
picker_view_slide_anim
);
//修改动画样式
dialogWindow
.
setGravity
(
Gravity
.
BOTTOM
);
//改成Bottom,底部显示
dialogWindow
.
setDimAmount
(
0.3f
);
}
}
}
}
app/src/main/java/com/phlx/wool/ui/cattle/activity/CattleUploadActivity.java
0 → 100644
View file @
ec787706
package
com
.
phlx
.
wool
.
ui
.
cattle
.
activity
;
import
android.os.Bundle
;
import
androidx.lifecycle.ViewModelProviders
;
import
com.phlx.wool.R
;
import
com.phlx.wool.data.VMFactory
;
import
com.phlx.wool.databinding.ActivityCattleUploadBinding
;
import
com.phlx.wool.ui.base.BaseActivity
;
import
com.phlx.wool.ui.cattle.vm.CattleUploadVM
;
import
me.tatarka.bindingcollectionadapter2.BR
;
public
class
CattleUploadActivity
extends
BaseActivity
<
ActivityCattleUploadBinding
,
CattleUploadVM
>
{
@Override
public
int
initContentView
(
Bundle
savedInstanceState
)
{
return
R
.
layout
.
activity_cattle_upload
;
}
@Override
public
int
initVariableId
()
{
return
BR
.
viewModel
;
}
@Override
public
void
initParam
()
{
super
.
initParam
();
}
@Override
public
CattleUploadVM
initViewModel
()
{
VMFactory
factory
=
VMFactory
.
getInstance
(
getApplication
());
return
ViewModelProviders
.
of
(
this
,
factory
).
get
(
CattleUploadVM
.
class
);
}
@Override
public
void
initData
()
{
super
.
initData
();
setSupportActionBar
(
binding
.
include
.
toolbar
);
viewModel
.
initToolbar
();
}
@Override
public
void
initViewObservable
()
{
super
.
initViewObservable
();
}
@Override
protected
void
onResume
()
{
super
.
onResume
();
viewModel
.
refreshUploadCount
();
}
}
app/src/main/java/com/phlx/wool/ui/cattle/vm/CattleMainVM.java
0 → 100644
View file @
ec787706
package
com
.
phlx
.
wool
.
ui
.
cattle
.
vm
;
import
android.app.Application
;
import
androidx.annotation.NonNull
;
import
androidx.databinding.ObservableField
;
import
com.phlx.wool.data.Repository
;
import
com.phlx.wool.entity.CattleLabelEntity
;
import
com.phlx.wool.ui.base.BackBarVM
;
import
com.phlx.wool.ui.cattle.activity.CattleMarkActivity
;
import
com.phlx.wool.ui.cattle.activity.CattleUploadActivity
;
import
java.util.Observable
;
import
me.goldze.mvvmhabit.binding.command.BindingAction
;
import
me.goldze.mvvmhabit.binding.command.BindingCommand
;
public
class
CattleMainVM
extends
BackBarVM
<
Repository
>
{
public
CattleMainVM
(
@NonNull
Application
application
,
Repository
model
)
{
super
(
application
,
model
);
}
/**
* 打标
*/
public
BindingCommand
onLabelClickCommand
=
new
BindingCommand
(
new
BindingAction
()
{
@Override
public
void
call
()
{
startActivity
(
CattleMarkActivity
.
class
);
}
});
/**
* 上传
*/
public
BindingCommand
onUploadClickCommand
=
new
BindingCommand
(
new
BindingAction
()
{
@Override
public
void
call
()
{
startActivity
(
CattleUploadActivity
.
class
);
}
});
}
app/src/main/java/com/phlx/wool/ui/cattle/vm/CattleMarkVM.java
0 → 100644
View file @
ec787706
package
com
.
phlx
.
wool
.
ui
.
cattle
.
vm
;
import
android.app.Application
;
import
android.graphics.drawable.Drawable
;
import
android.os.Environment
;
import
android.view.View
;
import
androidx.annotation.NonNull
;
import
androidx.core.content.ContextCompat
;
import
com.phlx.wool.Configs
;
import
com.phlx.wool.R
;
import
com.phlx.wool.data.Repository
;
import
com.phlx.wool.db.DbUtil
;
import
com.phlx.wool.db.interf.DbIDUCallBack
;
import
com.phlx.wool.entity.CattleLabelEntity
;
import
com.phlx.wool.entity.DivisionEntity
;
import
com.phlx.wool.entity.EntryRegistrationEntity
;
import
com.phlx.wool.ui.base.BackBarVM
;
import
com.phlx.wool.util.BaseImageUtils
;
import
com.phlx.wool.widget.ItemData
;
import
java.io.File
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
cn.hutool.core.util.IdUtil
;
import
me.goldze.mvvmhabit.binding.command.BindingAction
;
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.bus.event.SingleLiveEvent
;
import
me.goldze.mvvmhabit.utils.KLog
;
import
me.goldze.mvvmhabit.utils.SPUtils
;
import
me.goldze.mvvmhabit.utils.StringUtils
;
import
me.goldze.mvvmhabit.utils.ToastUtils
;
public
class
CattleMarkVM
extends
BackBarVM
<
Repository
>
{
public
CattleLabelEntity
entity
;
private
SimpleDateFormat
dateFormat
;
public
Drawable
drawableImg
;
//照片路径
private
String
markeImgUrl
;
private
File
markFile
;
public
SingleLiveEvent
<
Boolean
>
birthDay
=
new
SingleLiveEvent
<>();
public
SingleLiveEvent
<
Boolean
>
markPhotoOnClick
=
new
SingleLiveEvent
<>();
public
SingleLiveEvent
<
Boolean
>
scanLabelOnClick
=
new
SingleLiveEvent
<>();
private
List
<
CattleLabelEntity
>
uploadData
;
public
List
<
IKeyAndValue
>
ancestryItemData
,
sexItemData
;
public
CattleMarkVM
(
@NonNull
Application
application
,
Repository
model
)
{
super
(
application
,
model
);
}
//初始化ToolBar
public
void
initToolbar
()
{
setBackTitleText
(
"补打标签"
);
setSettingVisibleObservable
(
View
.
GONE
);
setBackRightTextVisible
(
View
.
VISIBLE
);
setBackRightText
(
"保存"
);
initData
();
}
private
void
initData
()
{
entity
=
new
CattleLabelEntity
();
long
idNo
=
IdUtil
.
createSnowflake
(
3
,
1
).
nextId
();
entity
.
setId
(
idNo
+
""
);
markeImgUrl
=
Environment
.
getExternalStorageDirectory
().
getAbsolutePath
()
+
"/tracing/picture/"
+
"markCiq"
+
idNo
+
".jpg"
;
markFile
=
new
File
(
markeImgUrl
);
//ImageView的占位图片,可以解决RecyclerView中图片错误问题
drawableImg
=
ContextCompat
.
getDrawable
(
getApplication
(),
R
.
drawable
.
no_image
);
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
//血统数据
ancestryItemData
=
new
ArrayList
<>();
ancestryItemData
.
add
(
new
ItemData
(
"苏尼特羊"
,
"10"
));
ancestryItemData
.
add
(
new
ItemData
(
"乌珠穆沁羊"
,
"20"
));
ancestryItemData
.
add
(
new
ItemData
(
"乌冉克羊"
,
"30"
));
ancestryItemData
.
add
(
new
ItemData
(
"察哈尔羊"
,
"40"
));
//性别
sexItemData
=
new
ArrayList
<>();
sexItemData
.
add
(
new
ItemData
(
"母"
,
"0"
));
sexItemData
.
add
(
new
ItemData
(
"公"
,
"1"
));
sexItemData
.
add
(
new
ItemData
(
"其他"
,
"2"
));
}
public
BindingCommand
<
IKeyAndValue
>
onAncestrySelectorCommand
=
new
BindingCommand
<>(
new
BindingConsumer
<
IKeyAndValue
>()
{
@Override
public
void
call
(
IKeyAndValue
iKeyAndValue
)
{
entity
.
setAncestryId
(
iKeyAndValue
.
getValue
());
}
});
public
BindingCommand
<
IKeyAndValue
>
onSexSelectorCommand
=
new
BindingCommand
<>(
new
BindingConsumer
<
IKeyAndValue
>()
{
@Override
public
void
call
(
IKeyAndValue
iKeyAndValue
)
{
entity
.
setSex
(
iKeyAndValue
.
getValue
());
}
});
//畜生日期
public
BindingCommand
onBirthDateClick
=
new
BindingCommand
(()
->
birthDay
.
call
());
public
void
setBirthDate
(
Date
date
)
{
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
entity
.
setBirthdate
(
dateFormat
.
format
(
date
));
entity
.
notifyChange
();
}
public
String
getMarkImgUrl
()
{
return
markeImgUrl
;
}
public
BindingCommand
markPhotoOnClickCommand
=
new
BindingCommand
(
new
BindingAction
()
{
@Override
public
void
call
()
{
markPhotoOnClick
.
call
();
}
});
public
BindingCommand
onScanLabelClick
=
new
BindingCommand
(
new
BindingAction
()
{
@Override
public
void
call
()
{
scanLabelOnClick
.
call
();
}
});
public
void
setScanLabel
(
String
scanLabel
)
{
if
(
scanLabel
.
length
()
==
15
)
{
ToastUtils
.
showShort
(
"scan:"
+
scanLabel
);
entity
.
setRegistrationNo
(
scanLabel
);
entity
.
notifyChange
();
}
else
{
ToastUtils
.
showShort
(
"非法扫描:"
+
scanLabel
);
}
}
/**
* 离线保存本地,在线先上传,后保存本地
*/
@Override
protected
void
backRightTextOnClick
()
{
if
(
StringUtils
.
isEmpty
(
entity
.
getRegistrationNo
()))
{
ToastUtils
.
showShort
(
"请扫描耳标"
);
return
;
}
if
(
StringUtils
.
isEmpty
(
entity
.
getIndividualNo
()))
{
ToastUtils
.
showShort
(
"请填写个体号"
);
return
;
}
if
(
StringUtils
.
isEmpty
(
entity
.
getBirthdate
()))
{
ToastUtils
.
showShort
(
"请选择出生日期"
);
return
;
}
if
(
StringUtils
.
isEmpty
(
entity
.
getWeight
()))
{
ToastUtils
.
showShort
(
"请填写体重"
);
return
;
}
if
(
StringUtils
.
isEmpty
(
entity
.
getMarkImgPath
()))
{
ToastUtils
.
showShort
(
"请上传打标图片"
);
return
;
}
entity
.
setCreateBy
(
SPUtils
.
getInstance
().
getString
(
Configs
.
SP_LOGIN_NAME
));
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
entity
.
setCreateTime
(
dateFormat
.
format
(
new
Date
()));
if
(
entity
.
getMarkImgPath
()
!=
null
&&
!
entity
.
getMarkImgPath
().
equals
(
""
))
entity
.
setPhoto
(
BaseImageUtils
.
bitmapToString
(
entity
.
getMarkImgPath
(),
getApplication
()));
uploadData
=
new
ArrayList
<>();
uploadData
.
add
(
entity
);
KLog
.
e
(
uploadData
.
size
()
+
uploadData
.
toString
());
/**
* 存储数据库
*/
showDialog
(
"正在保存本地..."
);
DbUtil
.
getInstance
().
setDbIDUCallBack
(
new
DbIDUCallBack
()
{
@Override
public
void
onNotification
(
boolean
result
)
{
dismissDialog
();
if
(
result
)
{
ToastUtils
.
showShort
(
"打标保存成功"
);
backMain
();
}
else
{
ToastUtils
.
showShort
(
"打标保存失败"
);
}
}
}).
insertAsyncBatch
(
CattleLabelEntity
.
class
,
uploadData
);
}
public
void
backMain
()
{
finish
();
}
}
app/src/main/java/com/phlx/wool/ui/cattle/vm/CattleUploadVM.java
0 → 100644
View file @
ec787706
package
com
.
phlx
.
wool
.
ui
.
cattle
.
vm
;
import
android.app.Application
;
import
androidx.annotation.NonNull
;
import
androidx.databinding.ObservableField
;
import
com.google.gson.GsonBuilder
;
import
com.phlx.wool.data.Repository
;
import
com.phlx.wool.db.DbUtil
;
import
com.phlx.wool.db.interf.DbIDUCallBack
;
import
com.phlx.wool.db.interf.DbQueryCallBack
;
import
com.phlx.wool.entity.CattleLabelEntity
;
import
com.phlx.wool.entity.Marking
;
import
com.phlx.wool.entity.MarkingDao
;
import
com.phlx.wool.params.CattleResponse
;
import
com.phlx.wool.params.UploadParams
;
import
com.phlx.wool.ui.base.BackBarVM
;
import
org.greenrobot.greendao.query.QueryBuilder
;
import
java.util.List
;
import
io.reactivex.functions.Consumer
;
import
me.goldze.mvvmhabit.binding.command.BindingCommand
;
import
me.goldze.mvvmhabit.http.ResponseThrowable
;
import
me.goldze.mvvmhabit.utils.KLog
;
import
me.goldze.mvvmhabit.utils.RxUtils
;
import
me.goldze.mvvmhabit.utils.ToastUtils
;
import
okhttp3.MediaType
;
import
okhttp3.RequestBody
;
public
class
CattleUploadVM
extends
BackBarVM
<
Repository
>
{
public
ObservableField
<
String
>
markingLabelNum
=
new
ObservableField
<>(
"补打记录"
);
public
CattleUploadVM
(
@NonNull
Application
application
,
Repository
model
)
{
super
(
application
,
model
);
refreshUploadCount
();
}
//初始化ToolBar
public
void
initToolbar
()
{
setBackTitleText
(
"上传"
);
}
public
BindingCommand
onUploadClickCommand
=
new
BindingCommand
(()
->
{
uploadMarking
();
});
//查询每项未上传记录数量
public
void
refreshUploadCount
()
{
markingLabelNum
.
set
(
"补打记录 "
+
"("
+
DbUtil
.
getInstance
().
count
(
CattleLabelEntity
.
class
)
+
")"
);
}
private
void
uploadMarking
()
{
QueryBuilder
<
CattleLabelEntity
>
builder
=
DbUtil
.
getInstance
().
getQueryBuilder
(
CattleLabelEntity
.
class
);
DbUtil
.
getInstance
().
setDbQueryCallBack
(
new
DbQueryCallBack
<
CattleLabelEntity
>()
{
@Override
public
void
onSuccess
(
List
<
CattleLabelEntity
>
result
)
{
if
(
result
!=
null
&&
result
.
size
()
>
0
)
{
String
postInfoStr
=
new
GsonBuilder
().
serializeNulls
()
// .excludeFieldsWithoutExposeAnnotation()
.
create
().
toJson
(
new
UploadParams
<
List
<
CattleLabelEntity
>>(
result
));
RequestBody
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
postInfoStr
);
KLog
.
e
(
postInfoStr
);
addSubscribe
(
model
.
uploadCattleMark
(
body
)
.
compose
(
RxUtils
.
bindToLifecycle
(
getLifecycleProvider
()))
.
compose
(
RxUtils
.
schedulersTransformer
())
.
compose
(
RxUtils
.
exceptionTransformer
())
.
doOnSubscribe
(
disposable
->
showDialog
(
"正在上传补打记录数据..."
))
.
subscribe
((
Consumer
<
CattleResponse
<
List
<
CattleLabelEntity
>>>)
response
->
{
KLog
.
e
(
response
.
getCode
()
+
response
.
getMsg
());
if
(
response
.
getCode
()
==
0
)
{
DbUtil
.
getInstance
().
setDbIDUCallBack
(
new
DbIDUCallBack
()
{
@Override
public
void
onNotification
(
boolean
result
)
{
if
(
result
)
{
dismissDialog
();
refreshUploadCount
();
}
else
{
ToastUtils
.
showShort
(
"删除补打记录失败"
);
}
}
}).
deleteAsyncAll
(
CattleLabelEntity
.
class
);
}
else
{
dismissDialog
();
ToastUtils
.
showShort
(
"补打记录上传失败"
);
}
},
(
Consumer
<
ResponseThrowable
>)
throwable
->
{
dismissDialog
();
ToastUtils
.
showShort
(
throwable
.
message
);
})
);
}
else
{
}
}
@Override
public
void
onFailed
()
{
ToastUtils
.
showShort
(
"补打记录数据库查询失败"
);
}
}).
queryAsyncAll
(
CattleLabelEntity
.
class
,
builder
);
}
}
app/src/main/java/com/phlx/wool/ui/login/LoginVM.java
View file @
ec787706
...
...
@@ -17,6 +17,7 @@ import com.phlx.wool.net.NetworkUtils;
import
com.phlx.wool.params.CattleResponse
;
import
com.phlx.wool.params.UserParams
;
import
com.phlx.wool.ui.base.BackBarVM
;
import
com.phlx.wool.ui.cattle.activity.CattleMainActivity
;
import
com.phlx.wool.ui.main.MainActivity
;
import
com.phlx.wool.ui.splash.SplashActivity
;
import
com.phlx.wool.util.StringUtil
;
...
...
@@ -144,6 +145,10 @@ public class LoginVM extends BackBarVM<Repository> {
SPUtils
.
getInstance
().
put
(
Configs
.
SP_FREQUENCY
,
response
.
getData
().
getUser
().
getFrequencyConfig
());
}
VMFactory
.
getInstance
(
getApplication
()).
refreshRepository
();
if
(
Configs
.
isCattle
){
startActivity
(
CattleMainActivity
.
class
);
finish
();
}
else
{
if
(
SPUtils
.
getInstance
().
getBoolean
(
"isFirst"
,
true
))
{
startActivity
(
SplashActivity
.
class
);
finish
();
...
...
@@ -151,6 +156,7 @@ public class LoginVM extends BackBarVM<Repository> {
startActivity
(
MainActivity
.
class
);
finish
();
}
}
}
else
{
ToastUtils
.
showShort
(
"服务器:"
+
response
.
getMsg
());
}
...
...
@@ -193,7 +199,11 @@ public class LoginVM extends BackBarVM<Repository> {
return
;
}
Configs
.
FREQUENCY_CONFIG
=
SPUtils
.
getInstance
().
getString
(
Configs
.
SP_FREQUENCY
);
if
(
Configs
.
isCattle
){
startActivity
(
CattleMainActivity
.
class
);
}
else
{
startActivity
(
MainActivity
.
class
);
}
finish
();
}
else
{
ToastUtils
.
showShort
(
"请先联机登录"
);
...
...
app/src/main/java/com/phlx/wool/util/BaseImageUtils.java
View file @
ec787706
...
...
@@ -3,6 +3,8 @@ package com.phlx.wool.util;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.graphics.Matrix
;
import
android.media.ExifInterface
;
import
android.os.Environment
;
import
android.util.Base64
;
import
android.util.Log
;
...
...
@@ -10,6 +12,7 @@ import android.util.Log;
import
java.io.ByteArrayOutputStream
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.OutputStream
;
/**
...
...
@@ -125,4 +128,53 @@ public class BaseImageUtils {
}
}
/**
* 获取图片的旋转角度
*
* @param path 图片绝对路径
* @return 图片的旋转角度
*/
public
static
int
getBitmapDegree
(
String
path
)
{
int
degree
=
0
;
try
{
// 从指定路径下读取图片,并获取其EXIF信息
ExifInterface
exifInterface
=
new
ExifInterface
(
path
);
// 获取图片的旋转信息
int
orientation
=
exifInterface
.
getAttributeInt
(
ExifInterface
.
TAG_ORIENTATION
,
ExifInterface
.
ORIENTATION_NORMAL
);
switch
(
orientation
)
{
case
ExifInterface
.
ORIENTATION_ROTATE_90
:
degree
=
90
;
break
;
case
ExifInterface
.
ORIENTATION_ROTATE_180
:
degree
=
180
;
break
;
case
ExifInterface
.
ORIENTATION_ROTATE_270
:
degree
=
270
;
break
;
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
degree
;
}
/**
* 将图片按照指定的角度进行旋转
*
* @param bitmap 需要旋转的图片
* @param degree 指定的旋转角度
* @return 旋转后的图片
*/
public
static
Bitmap
rotateBitmapByDegree
(
Bitmap
bitmap
,
int
degree
)
{
// 根据旋转角度,生成旋转矩阵
Matrix
matrix
=
new
Matrix
();
matrix
.
postRotate
(
degree
);
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
Bitmap
newBitmap
=
Bitmap
.
createBitmap
(
bitmap
,
0
,
0
,
bitmap
.
getWidth
(),
bitmap
.
getHeight
(),
matrix
,
true
);
if
(
bitmap
!=
null
&&
!
bitmap
.
isRecycled
())
{
bitmap
.
recycle
();
}
return
newBitmap
;
}
}
app/src/main/res/layout/activity_cattle_main.xml
0 → 100644
View file @
ec787706
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:binding=
"http://schemas.android.com/apk/res-auto"
>
<data>
<variable
name=
"viewModel"
type=
"com.phlx.wool.ui.cattle.vm.CattleMainVM"
/>
</data>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
android:gravity=
"center"
>
<Button
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"打标"
binding:onClickCommand=
"@{viewModel.onLabelClickCommand}"
/>
<Button
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"50dp"
android:text=
"上传"
binding:onClickCommand=
"@{viewModel.onUploadClickCommand}"
/>
</LinearLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/activity_cattle_mark.xml
0 → 100644
View file @
ec787706
<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>
<variable
name=
"viewModel"
type=
"com.phlx.wool.ui.cattle.vm.CattleMarkVM"
/>
<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=
"69dp"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/veterinary_selected_desc"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:text=
"耳标号"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/veterinary_edit"
binding:layout_constraintBottom_toTopOf=
"@+id/batch_selected_desc"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toTopOf=
"parent"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/veterinary_edit"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:gravity=
"center_vertical"
android:background=
"@drawable/input_frame_bg"
android:drawableEnd=
"@mipmap/ic_date_btn"
android:hint=
"请扫描标签"
android:text=
"@={viewModel.entity.registrationNo}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toTopOf=
"parent"
binding:onClickCommand=
"@{viewModel.onScanLabelClick}"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/batch_selected_desc"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:text=
"个体号"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/batch_edit"
binding:layout_constraintBottom_toTopOf=
"@+id/batch_day_desc"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/veterinary_selected_desc"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id=
"@+id/batch_edit"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:background=
"@drawable/input_frame_bg"
android:gravity=
"center_vertical"
android:hint=
"请输入个体号"
android:text=
"@={viewModel.entity.individualNo}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/veterinary_edit"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/entry_day_desc"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:text=
"出生日期"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/entry_day_tv"
binding:layout_constraintBottom_toTopOf=
"@+id/superior_division_sp"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/batch_selected_desc"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/entry_day_tv"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"match_parent"
android:layout_marginTop=
"@dimen/dp_5"
android:background=
"@drawable/input_frame_bg"
android:drawableEnd=
"@mipmap/ic_date_btn"
android:drawablePadding=
"@dimen/dp_3"
android:gravity=
"center_vertical"
android:hint=
"请选择进场日期"
android:text=
"@={viewModel.entity.birthdate}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintBottom_toTopOf=
"@+id/superior_division_sp"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/batch_edit"
binding:onClickCommand=
"@{viewModel.onBirthDateClick}"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/l_variety_selected_desc"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:text=
"血统"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintBottom_toBottomOf=
"@+id/superior_division_sp"
binding:layout_constraintTop_toTopOf=
"@+id/superior_division_sp"
/>
<Spinner
android:id=
"@+id/superior_division_sp"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:minHeight=
"@dimen/dp_40"
android:spinnerMode=
"dialog"
binding:itemDatas=
"@{viewModel.ancestryItemData}"
binding:layout_constraintBottom_toTopOf=
"@+id/division_sp"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/entry_day_tv"
binding:onItemSelectedCommand=
"@{viewModel.onAncestrySelectorCommand}"
binding:valueReply=
"@{viewModel.entity.ancestryId}"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/variety_selected_desc"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:text=
"性别"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBottom_toBottomOf=
"@+id/division_sp"
binding:layout_constraintTop_toTopOf=
"@+id/division_sp"
binding:layout_constraintStart_toStartOf=
"parent"
/>
<!-- app:items="@{viewModel.pertainItemData}"-->
<!-- binding:valueReply="@{viewModel.entity.revision}" -->
<androidx.appcompat.widget.AppCompatSpinner
android:id=
"@+id/division_sp"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:minHeight=
"@dimen/dp_40"
android:spinnerMode=
"dialog"
app:adapter=
"@{spinnerAdapter}"
binding:itemDatas=
"@{viewModel.sexItemData}"
binding:layout_constraintBottom_toTopOf=
"@+id/entry_count_edit"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/superior_division_sp"
binding:onItemSelectedCommand=
"@{viewModel.onSexSelectorCommand}"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/entry_count_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"体重"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/entry_count_edit"
binding:layout_constraintBottom_toTopOf=
"@+id/weight_selected_desc"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/variety_selected_desc"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id=
"@+id/entry_count_edit"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:background=
"@drawable/input_frame_bg"
android:hint=
"请输入体重"
android:inputType=
"numberDecimal"
android:maxLines=
"1"
android:text=
"@={viewModel.entity.weight}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintBottom_toTopOf=
"@+id/weight_edit"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/division_sp"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/weight_selected_desc"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:text=
"胸围"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/weight_edit"
binding:layout_constraintBottom_toTopOf=
"@+id/breed_sheep_desc"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/entry_count_desc"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id=
"@+id/weight_edit"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:background=
"@drawable/input_frame_bg"
android:hint=
"请输入胸围"
android:maxLines=
"1"
android:inputType=
"numberDecimal"
android:text=
"@={viewModel.entity.bust}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintBottom_toTopOf=
"@+id/breed_sheep_cb"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/entry_count_edit"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/certificate_name_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"管围"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/certificate_name_edit"
binding:layout_constraintBottom_toTopOf=
"@+id/twin_sheep_desc"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/weight_selected_desc"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id=
"@+id/certificate_name_edit"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:background=
"@drawable/input_frame_bg"
android:hint=
"请输入管维"
android:maxLines=
"1"
android:inputType=
"numberDecimal"
android:text=
"@={viewModel.entity.tubeCircumference}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintBottom_toTopOf=
"@+id/twin_sheep_cb"
binding:layout_constraintHorizontal_bias=
"0.0"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/weight_edit"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/certificate_idcard_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"体高"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/certificate_idcard_edit"
binding:layout_constraintBottom_toTopOf=
"@+id/twin_sheep_desc"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/certificate_name_desc"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id=
"@+id/certificate_idcard_edit"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:background=
"@drawable/input_frame_bg"
android:hint=
"请输入体高"
android:maxLines=
"1"
android:inputType=
"numberDecimal"
android:text=
"@={viewModel.entity.bodyHeight}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintBottom_toTopOf=
"@+id/twin_sheep_cb"
binding:layout_constraintHorizontal_bias=
"0.0"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/certificate_name_edit"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/body_oblique_length_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"体斜长"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintBaseline_toBaselineOf=
"@id/body_oblique_length_edit"
binding:layout_constraintBottom_toTopOf=
"@+id/twin_sheep_desc"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/body_oblique_length_edit"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id=
"@+id/body_oblique_length_edit"
android:layout_width=
"@dimen/dp_0"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_5"
android:background=
"@drawable/input_frame_bg"
android:hint=
"请输入体斜长"
android:maxLines=
"1"
android:inputType=
"numberDecimal"
android:text=
"@={viewModel.entity.bodyObliqueLength}"
android:textSize=
"@dimen/edit_size"
binding:layout_constraintBottom_toTopOf=
"@+id/twin_sheep_cb"
binding:layout_constraintHorizontal_bias=
"0.0"
binding:layout_constraintLeft_toLeftOf=
"@+id/marking_guideline_vertical"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/certificate_idcard_edit"
/>
<androidx.appcompat.widget.AppCompatImageView
android:id=
"@+id/mark_photo_view"
android:layout_width=
"match_parent"
android:layout_height=
"@dimen/dp_300"
android:src=
"@{viewModel.drawableImg}"
binding:layout_constraintLeft_toLeftOf=
"parent"
binding:layout_constraintRight_toRightOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/body_oblique_length_edit"
binding:onClickCommand=
"@{viewModel.markPhotoOnClickCommand}"
binding:url=
"@{viewModel.entity.markImgPath}"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/activity_cattle_upload.xml
0 → 100644
View file @
ec787706
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:binding=
"http://schemas.android.com/apk/res-auto"
>
<data>
<variable
name=
"viewModel"
type=
"com.phlx.wool.ui.cattle.vm.CattleUploadVM"
/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"@color/setting_bg"
>
<include
android:id=
"@+id/include"
layout=
"@layout/layout_back_bar"
binding:backBarVM=
"@{viewModel.backBarVM}"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"@dimen/dp_250"
android:layout_marginStart=
"@dimen/dp_15"
android:layout_marginTop=
"@dimen/dp_15"
android:layout_marginEnd=
"@dimen/dp_15"
android:background=
"@color/white"
binding:layout_constraintTop_toBottomOf=
"@+id/include"
>
<androidx.appcompat.widget.AppCompatCheckBox
android:id=
"@+id/marking_info_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"@dimen/dp_20"
android:layout_marginTop=
"@dimen/dp_20"
android:checked=
"true"
android:text=
"@{viewModel.markingLabelNum}"
android:textColor=
"@color/black"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toTopOf=
"parent"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id=
"@+id/harmless_info_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_20"
android:layout_marginEnd=
"@dimen/dp_20"
android:visibility=
"invisible"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintEnd_toEndOf=
"parent"
binding:layout_constraintTop_toTopOf=
"parent"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id=
"@+id/quarantine_info_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_20"
android:visibility=
"invisible"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf=
"@id/marking_info_desc"
binding:layout_constraintTop_toBottomOf=
"@+id/marking_info_desc"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id=
"@+id/villus_buy_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_20"
android:layout_marginEnd=
"@dimen/dp_20"
android:visibility=
"invisible"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf=
"@id/harmless_info_desc"
binding:layout_constraintTop_toBottomOf=
"@+id/harmless_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:visibility=
"invisible"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf=
"@id/marking_info_desc"
binding:layout_constraintTop_toBottomOf=
"@+id/quarantine_info_desc"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id=
"@+id/slaughter_entry_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_20"
android:layout_marginEnd=
"@dimen/dp_20"
android:visibility=
"invisible"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf=
"@id/villus_buy_desc"
binding:layout_constraintTop_toBottomOf=
"@+id/villus_buy_desc"
/>
<View
android:id=
"@+id/clear_line"
android:layout_width=
"match_parent"
android:layout_height=
"@dimen/dp_2"
android:layout_marginStart=
"@dimen/dp_10"
android:layout_marginTop=
"@dimen/dp_20"
android:layout_marginEnd=
"@dimen/dp_10"
android:background=
"@color/setting_bg"
binding:layout_constraintStart_toStartOf=
"parent"
binding:layout_constraintTop_toBottomOf=
"@+id/villus_gauge_desc"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id=
"@+id/all_selected_desc"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/dp_20"
android:visibility=
"invisible"
android:text=
"全选"
android:textColor=
"@color/black"
android:textSize=
"@dimen/desc_text_size"
binding:layout_constraintStart_toStartOf=
"@id/marking_info_desc"
binding:layout_constraintTop_toBottomOf=
"@+id/clear_line"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatButton
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginBottom=
"@dimen/dp_30"
android:background=
"@drawable/save_btn_bg"
android:text=
"上传"
android:textColor=
"@color/white"
android:textSize=
"@dimen/btn_size"
binding:layout_constraintBottom_toBottomOf=
"parent"
binding:layout_constraintEnd_toEndOf=
"parent"
binding:layout_constraintStart_toStartOf=
"parent"
binding:onClickCommand=
"@{viewModel.onUploadClickCommand}"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
ec787706
<resources>
<string
name=
"app_name"
>
追溯系统
</string>
<!-- <string name="app_name">追溯系统</string>-->
<string
name=
"app_name"
>
补打系统
</string>
<string
name=
"setting"
>
设置
</string>
<string
name=
"jobNum"
>
工号:
</string>
<string
name=
"pleaseInputUserName"
>
请输入用户名
</string>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment